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 5747a24..80dabce 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
@@ -35,7 +35,8 @@
  org.eclipse.jst.jsf.facesconfig.edit,
  org.eclipse.jem.util,
  org.eclipse.jst.jsf.facesconfig.common,
- org.eclipse.jst.jsf.facesconfig
+ org.eclipse.jst.jsf.facesconfig,
+ org.eclipse.ui.cheatsheets
 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/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.xml
index 1242583..44cefe8 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.xml
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.xml
@@ -40,7 +40,7 @@
 				text="%pageflow.editor.intro.start.text"
 				hyperlink="%pageflow.editor.intro.start.link"/>
 			<introductionelement
-				actionparameters="PageflowEditor.createCheatSheet"
+				actionparameters="FacesConfigEditor.CheatSheet"
 				icon="icons/FacesConfig_Tutorial.gif"
 				hyperlinkaction="org.eclipse.jst.jsf.facesconfig.common.actions.LoadCheatSheetAction"
 				text="%pageflow.editor.intro.cheatsheets.text"
@@ -72,4 +72,12 @@
 			<propertyCategory category="general"/>
 		</propertyContributor>
 	</extension>
+  <extension
+        point="org.eclipse.ui.cheatsheets.cheatSheetContent">
+     <cheatsheet
+           composite="false"
+           contentFile="cheatsheets/facesconfigeditor.xml"
+           id="FacesConfigEditor.CheatSheet"
+           name="FacesConfigEditor CheatSheet"/>
+  </extension>
 </plugin>
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 3472c6a..8113d58 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
@@ -425,13 +425,13 @@
 		try {
 			IntroductionPage page1 = new IntroductionPage(this);
 			addPage(page1, null);
-
+			
 			IFormPage overviewPage = new OverviewPage(this);
 			addPage(overviewPage, null);
-
+			
 			// Page flow
 			createAndAddPageflowPage();
-
+			
 			// pages
 			IFormPage managedBeanPage = new ManagedBeanPage(this);
 			managedBeanPageID = addPage(managedBeanPage, null);
@@ -452,7 +452,8 @@
 		} catch (PartInitException e) {
 			EditorPlugin.getDefault().getLog().log(
 					new Status(IStatus.ERROR, EditorPlugin.getPluginId(),
-							IStatus.OK, e.getMessage(), e));
+							IStatus.OK, e.getMessage() == null ? "" : e
+									.getMessage(), e));
 		}
 
 	}
@@ -474,8 +475,7 @@
 		FC2PFTransformer.getInstance().setPageflow(pageflowPage.getPageflow());
 		boolean fornew = getFacesConfigAdapter()
 				.updatePageflowFromFacesConfig();
-		pageflowPage.getGraphicalViewer().setContents(
-				pageflowPage.getPageflow());
+		pageflowPage.setGraphicalViewerContents(pageflowPage.getPageflow());
 		if (fornew) {
 			PageflowLayoutManager.getInstance().layoutPageflow(
 					pageflowPage.getPageflow());
@@ -601,7 +601,7 @@
 	// // getFacesConfigAdapter(), inputStreamOfFacesConfig);
 	// //
 	// // updateCommand.execute();
-	// }
+		// }
 	/**
 	 * This class listens for command stack changes of the pages contained in
 	 * this editor and decides if the editor is dirty or not.
@@ -855,8 +855,9 @@
 				} catch (Exception e) {
 					EditorPlugin.getDefault().getLog().log(
 							new Status(IStatus.ERROR, EditorPlugin
-									.getPluginId(), IStatus.OK, e.getMessage(),
-									e));
+									.getPluginId(), IStatus.OK,
+									e.getMessage() == null ? "" : e
+											.getMessage(), e));
 				}
 			}
 		};
@@ -969,20 +970,6 @@
 
 	}
 
-	// /**
-	// * Returns the <code>IContentOutlinePage</code> for this editor.
-	// *
-	// * @return - the <code>IContentOutlinePage</code>
-	// */
-	// protected IContentOutlinePage getOutlinePage() {
-	// // return (IContentOutlinePage)
-	// // _pageflowPage.getAdapter(IContentOutlinePage.class);
-	// if (null == outlinePage) {
-	// outlinePage = new MultiPageEditorOutlinePage();
-	// }
-	// return outlinePage;
-	// }
-
 	/** the delegating ZoomManager */
 	private DelegatingZoomManager delegatingZoomManager = null;
 
@@ -1249,8 +1236,6 @@
 		super.pageChange(newPageIndex);
 
 		// refresh content depending on current page
-
-		// ((MultiPageEditorPropertySheetPage)getPropertySheetPage()).pagechange(this.getActiveEditor());
 		currentPageChanged();
 	}
 
@@ -1305,16 +1290,16 @@
 	// }
 	public void dispose() {
 		FC2PFTransformer.getInstance().dispose();
-		// Iterator contents = getFacesConfig().getNavigationRule().iterator();
-		// while (contents.hasNext()) {
-		// EObject next = ((EObject) contents.next());
-		// TreeIterator children = next.eAllContents();
-		// while (children.hasNext()) {
-		// FC2PFTransformer.getInstance().unAdapt(
-		// (EObject) children.next());
-		// }
-		// FC2PFTransformer.getInstance().unAdapt((EObject) next);
-		// }
+//		Iterator contents = getFacesConfig().getNavigationRule().iterator();
+//		while (contents.hasNext()) {
+//			EObject next = ((EObject) contents.next());
+//			TreeIterator children = next.eAllContents();
+//			while (children.hasNext()) {
+//				FC2PFTransformer.getInstance().unAdapt(
+//						(EObject) children.next());
+//			}
+//			FC2PFTransformer.getInstance().unAdapt((EObject) next);
+//		}
 		// FC2PFTransformer.getInstance().unAdapt(getFacesConfig());
 
 		ResourcesPlugin.getWorkspace().removeResourceChangeListener(
@@ -1369,15 +1354,10 @@
 	 * @return - the <code>IContentOutlinePage</code>
 	 */
 	protected IContentOutlinePage getOutlinePage() {
-		// return (IContentOutlinePage)
-		// _pageflowPage.getAdapter(IContentOutlinePage.class);
 		if (null == outlinePage) {
 			outlinePage = new MultiPageEditorOutlinePage();
 		}
 		return outlinePage;
-		// use the source page's outline.
-		// return (IContentOutlinePage) this.getEditor(sourcePageId).getAdapter(
-		// IContentOutlinePage.class);
 	}
 
 	public void addSelectionChangedListener(ISelectionChangedListener listener) {
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditor.java
index 165897f..1d08b95 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditor.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditor.java
@@ -308,7 +308,7 @@
 		addEditPartAction(new ShowPropertyViewAction((IWorkbenchPart) this));
 
 		// Allows showing property view for the pageflow
-		addEditPartAction(new ShowPaletteViewAction((IWorkbenchPart) this));
+		// addEditPartAction(new ShowPaletteViewAction((IWorkbenchPart) this));
 
 		// register alignment actions
 		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
@@ -430,7 +430,7 @@
 				});
 
 		// apply Editor's preferences
-		propertyChange(null);
+//		propertyChange(null);
 		// add listener to Editor's preferences changing
 		EditorPlugin.getDefault().getPreferenceStore()
 				.addPropertyChangeListener(this);
@@ -809,6 +809,11 @@
 	public GraphicalViewer getGraphicalViewer() {
 		return viewer;
 	}
+	
+	public void setGraphicalViewerContents(Object contents){
+		viewer.setContents(contents);
+		propertyChange(null);
+	}
 
 	/*
 	 * (non-Javadoc)
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorContextMenuProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorContextMenuProvider.java
index 86ce278..4679a89 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorContextMenuProvider.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorContextMenuProvider.java
@@ -95,11 +95,11 @@
 			submenu.add(action);
 		}
 
-		action = getActionRegistry().getAction(
-				ShowPaletteViewAction.SHOW_PALETTE_VIEW);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
+//		action = getActionRegistry().getAction(
+//				ShowPaletteViewAction.SHOW_PALETTE_VIEW);
+//		if (null != action && action.isEnabled()) {
+//			submenu.add(action);
+//		}
 
 		if (!submenu.isEmpty()) {
 			menuManager.appendToGroup(GEFActionConstants.GROUP_REST, submenu);
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.properties
index bbb29d9..4e26800 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.properties
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.properties
@@ -95,6 +95,9 @@
 Pageflow.Model.Attributes.outcome = from-outcome
 Pageflow.Model.Attributes.redirect = redirect
 
+Pageflow.Model.Attributes.fromaction = from-action
+Pageflow.Model.Attributes.referenceLink = reference
+
 Pageflow.Model.Items.Pageflow = File
 Pageflow.Model.Items.PFBegin = Begin
 Pageflow.Model.Items.PFEnd = End
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java
index 2608900..2f755de 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java
@@ -398,25 +398,32 @@
 				switch (featureId) {
 				case PageflowPackage.PF_PAGE:
 					removePage(notification, element);
+					updateAndNotify(notification);
 					break;
 				case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
 					removeOutLink(notification, element);
+					updateAndNotify(notification);
 					break;
 				case PageflowPackage.PAGEFLOW_NODE__INLINKS:
 					removeInLink(notification, element);
+					updateAndNotify(notification);
 					break;
-				case PageflowPackage.PAGEFLOW:
-					break;
+				// case PageflowPackage.PAGEFLOW:
+				// updateAndNotify(notification);
+				// break;
 				}
 				break;
 			}
 			}
+			isInEvent = false;
+		}
+
+		private void updateAndNotify(Notification notification) {
 			pageflow.notifyModelChanged(new ENotificationImpl(
 					(InternalEObject) notification.getNotifier(),
 					Notification.SET, PageflowPackage.PAGEFLOW, null, null));
 			refreshPFAdapter(pageflow);
 			refreshFCAdapter(facesConfig);
-			isInEvent = false;
 		}
 
 		public void dispose() {
@@ -481,17 +488,25 @@
 				switch (type) {
 				case Notification.ADD: {
 					processAdd(notification);
+					updateAndNotify(notification);
 					break;
 				}
 				case Notification.SET: {
 					processSet(notification);
+					updateAndNotify(notification);
 					break;
 				}
 				case Notification.REMOVE:
 					processRemove(notification);
+					updateAndNotify(notification);
 					break;
 				}
 			}
+
+			isInEvent = false;
+		}
+
+		private void updateAndNotify(Notification notification) {
 			Assert
 					.isTrue(notification.getNotifier() instanceof InternalEObject);
 			refreshFCAdapter((EObject) notification.getNotifier());
@@ -499,8 +514,6 @@
 			pageflow.notifyModelChanged(new ENotificationImpl(
 					(InternalEObject) notification.getNotifier(),
 					Notification.SET, PageflowPackage.PAGEFLOW, null, null));
-
-			isInEvent = false;
 		}
 
 		/**
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/ConfigurationManager.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/ConfigurationManager.java
deleted file mode 100644
index a38c0f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/ConfigurationManager.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. 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:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-
-/**
- * Manages the files that comprise the Java Server Faces Configuration
- * 
- * @author Jane Cantz, Xiao-guang Zhang
- * @version 1.0
- */
-public class ConfigurationManager {
-
-	/** The current project reference */
-	private IProject currentProject = null;
-
-	/** Create the logger for this class */
-	// private static final Logger log = EditorPlugin
-	// .getLogger(ConfigurationManager.class);
-	/** List of all the Faces Configuration Types */
-	private List configs = null;
-
-	/** An array of the managed beans List from the configuration set */
-	private List[] managedBeans = null;
-
-	// private IFacesConfigManager facesConfigManagerAdapter;
-
-	/**
-	 * Manages the Faces Configuration set, which could be a single
-	 * <i>faces-config.xml</i> file or a set of config files defined in
-	 * <i>web.xml</i>.
-	 * 
-	 * @param project -
-	 *            the current project
-	 */
-	public ConfigurationManager(IProject project) {
-		super();
-		// log.setResourceBundle(EditorPlugin.getDefault().getResourceBundle());
-		currentProject = project;
-	}
-
-	/**
-	 * get the current project
-	 * 
-	 * @return
-	 */
-	public IProject getProject() {
-		return currentProject;
-	}
-
-	/**
-	 * @return List[] - a derived list of managed beans from the configuration
-	 *         set. The list is derived from reading the configuration files and
-	 *         extracting the bean references. Every element of the retruned
-	 *         list is a list, which contains
-	 *         <code>org.eclipse.jst.jsf.facesconfig.ui.model.xml.ManagedBean</code>.
-	 */
-//	public List[] deriveManagedBeans() {
-//		if (configs == null || configs.size() == 0) {
-//			return null;
-//		}
-//		managedBeans = new ArrayList[configs.size()];
-//
-//		// Loop thru all the configuration types
-//		for (int x = 0; x < configs.size(); x++) {
-//			IFile aConfigFile = (IFile) configs.get(x);
-//
-//			// List beans = ((FacesConfigType) configs.get(x)).getManagedBean();
-//
-//			managedBeans[x] = getManagedBeanListFromFile(aConfigFile);
-//		}
-//		return managedBeans;
-//	}
-
-	// private List getManagedBeanListFromFile(IFile facesConfigFile) {
-	//
-	// if (facesConfigFile == null || !facesConfigFile.exists()) {
-	// return null;
-	// }
-	// List managedBeanList = new ArrayList(0);
-	// IStructuredModel sModel = StructuredModelManager.getModelManager()
-	// .getExistingModelForRead(facesConfigFile);
-	// if (sModel != null) {
-	// IDOMDocument document = ((IDOMModel) sModel).getDocument();
-	// FacesConfigDocumentWrap facesConfigWrap = new FacesConfigDocumentWrap(
-	// document);
-	// if (facesConfigWrap.getFacesConfig() != null) {
-	// managedBeanList = facesConfigWrap.getFacesConfig()
-	// .getManagedBeanList();
-	// }
-	// sModel.releaseFromRead();
-	// }
-	// return managedBeanList;
-	// }
-
-	/**
-	 * @return String[] - An array of the configuration files
-	 */
-	// public Object[] getConfigs() {
-	// return configs.toArray();
-	// }
-	/**
-	 * @return List[] - a derived list of managed beans from the configuration
-	 *         set. The list is derived from reading the configuration files and
-	 *         extracting the bean references. Every element of the retruned
-	 *         list is a list, which contains
-	 *         <code>org.eclipse.jst.jsf.facesconfig.ui.model.xml.ManagedBean</code>.
-//	 */
-//	public List[] getManagedBeans() {
-//		deriveManagedBeans();
-//		return managedBeans;
-//	}
-
-	/**
-	 * Determine what files comprise the Java Server Faces configuration
-	 * 
-	 * @param project -
-	 *            the project to look for configuration files in
-	 */
-	public void loadConfiguration(IProject project) {
-		currentProject = project;
-
-		if (currentProject == null) {
-			return;
-		}
-
-		IFacesConfigManager facesConfigManager = getFacesConfigurationManager(project);
-
-		if (facesConfigManager == null) {
-			return;
-		}
-
-		IFile[] facesConfigFiles = facesConfigManager.getFacesConfigs();
-
-		if (facesConfigFiles != null && facesConfigFiles.length > 0) {
-			configs = new ArrayList();
-			for (int i = 0; i < facesConfigFiles.length; i++) {
-				configs.add(facesConfigFiles[i]);
-			}
-		}
-	}
-
-	private IFacesConfigManager getFacesConfigurationManager(IProject project) {
-		// facesConfigManagerAdapter = (IFacesConfigManager) Platform
-		// .getAdapterManager().getAdapter(project,
-		// IFacesConfigManager.class);
-		//
-		// return facesConfigManagerAdapter;
-		FacesConfigManager configManager = new FacesConfigManager(project);
-		configManager.loadConfiguration();
-		return configManager;
-	}
-
-	/**
-	 * Loads a single configuration file
-	 * 
-	 * @param config -
-	 *            the faces configuration file to load. Just the file name only.
-	 */
-	// public void loadConfiguration(String config) {
-	// if (currentProject == null) {
-	// return;
-	// }
-	//
-	// IFacesConfigManager facesConfigManager =
-	// getFacesConfigurationManager(currentProject);
-	//
-	// if (facesConfigManager == null) {
-	// return;
-	// }
-	//
-	// FacesConfigType[] facesConfigs = facesConfigManager.getFacesConfigs();
-	//
-	// if (facesConfigs != null) {
-	// IFile file = currentProject
-	// .getFile(IFileFolderConstants.PATH_SEPARATOR
-	// + WEBINF_FOLDER
-	// + IFileFolderConstants.PATH_SEPARATOR + config);
-	//
-	// for (int i = 0; i < facesConfigs.length; i++) {
-	// if (URIHelper.getPlatformURI(file).equalsIgnoreCase(
-	// facesConfigs[i].eResource().getURI().toString())) {
-	// configs = new ArrayList();
-	// configs.add(facesConfigs[i]);
-	// break;
-	// }
-	// }
-	// }
-	// }
-	/**
-	 * Saves all the configuration resources to the local file system
-	 */
-	// public void save() {
-	// IFacesConfigManager facesConfigManager =
-	// getFacesConfigurationManager(currentProject);
-	//
-	// if (facesConfigManager != null) {
-	// facesConfigManager.endModify();
-	// }
-	// }
-	/**
-	 * Update the managed bean type's scope value
-	 * 
-	 * @param mbt -
-	 *            the managed bean type
-	 * @param scopeValue -
-	 *            the scope value to set
-	 */
-	// public void updateBeanScope(ManagedBeanTypeImpl mbt, String scopeValue) {
-	// ManagedBeanScopeType mbst = mbt.getManagedBeanScope();
-	// mbst.setValue(scopeValue);
-	// Resource resource = mbt.eResource();
-	// resource.setModified(true);
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/FC2PFTransformer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/FC2PFTransformer.java
deleted file mode 100644
index ec603a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/FC2PFTransformer.java
+++ /dev/null
@@ -1 +0,0 @@
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/FacesConfigManager.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/FacesConfigManager.java
deleted file mode 100644
index 9133efd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/FacesConfigManager.java
+++ /dev/null
@@ -1,457 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. 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:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jface.util.ListenerList;
-import org.eclipse.jst.j2ee.common.ParamValue;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.jst.jsf.facesconfig.common.IFileFolderConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-
-/**
- * This class traces changes in the web.xml file, and then traces faces-config
- * files declared in the web.xml file (or the default faces config file).
- * Providing access method for all the faces-config files as a group.
- * 
- * @author Yang Liu
- * @version
- */
-// Part of this file is refactored from the old ConfigurationManager.
-public class FacesConfigManager implements IFacesConfigManager // , ILifecycle
-{
-	// private static final Logger _log =
-	// ModelsPlugin.getLogger(FacesConfigManager.class);
-
-	// private String WEBINF_FOLDER = IFileFolderConstants.FOLDER_WEBROOT
-	// + IFileFolderConstants.PATH_SEPARATOR
-	// + IFileFolderConstants.FOLDER_WEBINF;
-
-	private IProject currentProject;
-
-	/** The Adaptor Factory */
-	// protected ComposedAdapterFactory _adapterFactory;
-	ListenerList listenerList = new ListenerList(1);
-
-	// ------------------------------------------------------------------------
-	// _editingDomain need refresh each time re-read the configs.
-	/** The Faces Configuration Editing Domain */
-	// protected AdapterFactoryEditingDomain _editingDomain;
-	// ------------------------------------------------------------------------
-	// following are things need to re-read each refresh.
-	/** List of all the Faces Configuration Files */
-	// private List _configs = null;
-	//
-	// private FacesConfigType[] _facesConfigs = null;
-	private List facesConfigFileList;
-
-	// class ResourceTracker implements IResourceChangeListener,
-	// IResourceDeltaVisitor {
-	// boolean _configChanged;
-	//
-	// public void resourceChanged(IResourceChangeEvent event) {
-	// switch (event.getType()) {
-	// case IResourceChangeEvent.POST_CHANGE:
-	// try {
-	// _configChanged = false;
-	// event.getDelta().accept(this);
-	// } catch (CoreException exception) {
-	// _log.error("common.error", exception);
-	// } finally {
-	// if (_configChanged) {
-	// refresh();
-	// }
-	// }
-	// break;
-	// }
-	// }
-	//
-	// public boolean visit(IResourceDelta delta) {
-	// if (_configChanged) {
-	// return false; // we only need to set the flag, if it is
-	// // already set, then no need to process
-	// }
-	// IResource res = delta.getResource();
-	// if (res instanceof IProject && res != currentProject) {
-	// return false;
-	// }
-	//
-	// if (res instanceof IProject && res == currentProject) {
-	// if (delta.getKind() == IResourceDelta.REMOVED) {
-	// return false;
-	// } else if (delta.getKind() == IResourceDelta.CHANGED) {
-	// if ((delta.getFlags() & IResourceDelta.OPEN) != 0) {
-	// if (currentProject.isOpen()) {
-	// _configChanged = true;
-	// }
-	// return false;
-	// }
-	// }
-	// }
-	//
-	// if (!(res instanceof IFile)) {
-	// return true; // visit the children
-	// }
-	//
-	// if (_configs != null) {
-	// // See if the changed resource is a faces configuration file
-	// for (int x = 0, size = _configs.size(); x < size; x++) {
-	// IFile configFile = currentProject
-	// .getFile((String) _configs.get(x));
-	// if (configFile.equals(res)) {
-	// if (delta.getKind() == IResourceDelta.REMOVED
-	// || delta.getKind() == IResourceDelta.ADDED) {
-	// _configChanged = true;
-	// return false;
-	// }
-	//
-	// int flags = delta.getFlags();
-	// if (((flags & IResourceDelta.CONTENT) != 0)
-	// || ((flags & IResourceDelta.REPLACED) != 0)) {
-	// _configChanged = true;
-	// return false;
-	// }
-	// break;
-	// }
-	// }
-	// }
-	//
-	// if (res.getName().equalsIgnoreCase(
-	// IFileFolderConstants.FILE_WEB_XML)) {
-	// _configChanged = true;
-	// }
-	// return false;
-	// }
-	// }
-
-	// ResourceTracker _tracker = new ResourceTracker();
-
-	/**
-	 * 
-	 */
-	public FacesConfigManager(IProject project) {
-		this.currentProject = project;
-	}
-
-	// public EditingDomain getEditingDomain()
-	// {
-	// return _editingDomain;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.models.IFacesConfigManager#getProject()
-	 */
-	public IProject getProject() {
-		return currentProject;
-	}
-
-	// public void configurate()
-	// {
-	// List factories = new ArrayList();
-	// factories.add(new ResourceItemProviderAdapterFactory());
-	// factories.add(new FacesConfig10ItemProviderAdapterFactory());
-	// factories.add(new ReflectiveItemProviderAdapterFactory());
-	// _adapterFactory = new ComposedAdapterFactory(factories);
-	//
-	// BasicCommandStack commandStack = new BasicCommandStack();
-	// _editingDomain = new AdapterFactoryEditingDomain(_adapterFactory,
-	// commandStack);
-	//
-	// // read everything from scratch
-	// refresh();
-	//
-	// ResourcesPlugin.getWorkspace().addResourceChangeListener(_tracker);
-	// }
-
-	// public void deconfigurate()
-	// {
-	// ResourcesPlugin.getWorkspace().removeResourceChangeListener(_tracker);
-	// // XXX: do we need to do anything here?
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.models.IFacesConfigManager#getFacesConfigs()
-	 */
-	// public FacesConfigType[] getFacesConfigs() {
-	// if (this._facesConfigs == null) {
-	// this._facesConfigs = new FacesConfigType[0];
-	// }
-	// return this._facesConfigs;
-	// }
-	public IFile[] getFacesConfigs() {
-		if (facesConfigFileList == null || facesConfigFileList.size() == 0) {
-			loadConfiguration();
-		}
-		IFile[] files = new IFile[facesConfigFileList.size()];
-		facesConfigFileList.toArray(files);
-		return files;
-	}
-
-	public void refresh() {
-		if (currentProject == null) {
-			return;
-		}
-		// Clear the current resources from the set
-		// ResourceSet rset = _editingDomain.getResourceSet();
-		// rset.getResources().clear();
-		// _configs = null;
-		// _facesConfigs = null;
-
-		loadConfiguration();
-		// Loop thru all the configuration files
-		// for (int x = 0; x < _configs.size(); x++) {
-		// URI fileURI = null;
-		// Resource resource = null;
-		// if (currentProject.getFolder(WEBINF_FOLDER).exists()) {
-		// IFile file = currentProject.getFile((String) _configs.get(x));
-		// if (file != null && file.exists()) {
-		// fileURI = URI.createURI("platform:/resource/"
-		// + currentProject.getName() + _configs.get(x)); //$NON-NLS-1$
-		// resource = new FacesConfig10ResourceFactoryImpl()
-		// .createResource(fileURI);
-		// } else {
-		// // missing config file. skip this one
-		// // FIXME: log it.
-		// }
-		// }
-		//
-		// if (resource != null) {
-		// try {
-		// resource.unload();
-		// FacesConfig config = new FacesConfig(resource);
-		// config.load();
-		// } catch (Exception ex) {
-		// _log.error("common.error", ex);
-		// // String name = resource.getURI().path();
-		// // _log.error("DBView.LoadResourceError", name, ex);
-		// // //$NON-NLS-1$ //$NON-NLS-2$
-		// // DataBindingPlugin.getAlerts().detailError("DBView.ResourceTitle",
-		// // "DBView.LoadResourceError", name, ex); //$NON-NLS-1$
-		// // //$NON-NLS-2$
-		// // return null;
-		// }
-		//
-		// if (resource.isLoaded()) {
-		// rset.getResources().add(resource);
-		// } else {
-		// // FIXME: log
-		// }
-		// }
-		// }
-		//
-		// int count = rset.getResources().size();
-		// List configs = new ArrayList();
-		// for (int i = 0; i < count; i++) {
-		// Resource resource = (Resource) rset.getResources().get(i);
-		// if (resource.getContents() == null
-		// || resource.getContents().size() == 0) {
-		// continue;
-		// }
-		//
-		// try {
-		// DocumentRoot root = (DocumentRoot) resource.getContents()
-		// .get(0);
-		// FacesConfigType sts = root.getFacesConfig();
-		// if (sts != null) {
-		// configs.add(sts);
-		// }
-		// } catch (Exception ex) {
-		// _log.error("common.error", ex);
-		// }
-		// }
-		// this._facesConfigs = new FacesConfigType[configs.size()];
-		// configs.toArray(this._facesConfigs);
-
-		this.fireFacesConfigChanged();
-
-	}
-
-	/**
-	 * check whether the config file is existed in all registered config files
-	 * or not.
-	 * 
-	 * @param configFileName
-	 * @return
-	 */
-	// private boolean isDuplicateConfigFile(String configFileName) {
-	// boolean isDuplicated = false;
-	// // See if all the configuration files exist
-	// for (int x = 0; x < _configs.size(); x++) {
-	// if (configFileName.equalsIgnoreCase((String) _configs.get(x))) {
-	// isDuplicated = true;
-	// }
-	// }
-	// return isDuplicated;
-	// }
-	/**
-	 * check whether the config file is existed in all registered config files
-	 * or not.
-	 * 
-	 * @param facesConfigFile
-	 * @return
-	 */
-	private boolean isDuplicateConfigFile(IFile facesConfigFile) {
-
-		// See if all the configuration files exist
-		if (facesConfigFileList != null
-				&& facesConfigFileList.contains(facesConfigFile)) {
-			return true;
-		}
-		return false;
-	}
-
-	private void registerConfigFile(IFile facesConfigFile) {
-		if (facesConfigFile != null && !isDuplicateConfigFile(facesConfigFile)) {
-			facesConfigFileList.add(facesConfigFile);
-		}
-
-	}
-
-	/**
-	 * Determine what files comprise the Java Server Faces configuration
-	 * 
-	 * @param project -
-	 *            the project to look for configuration files in
-	 */
-	public void loadConfiguration() {
-
-		String paramValue = null;
-		WebArtifactEdit web = WebArtifactEdit
-				.getWebArtifactEditForRead(currentProject);
-		if (web != null) {
-			WebApp webApp = web.getWebApp();
-
-			EList contextParams = webApp.getContextParams();
-			for (int i = 0, n = contextParams.size(); i < n; i++) {
-				ParamValue aParam = (ParamValue) contextParams.get(i);
-				if (WebDotXMLTagConstants.CONFIG_FILES_CONTEXT_PARAM
-						.equals(aParam.getName())
-						|| WebDotXMLTagConstants.APPLICATION_CONFIG_FILES_CONTEXT_PARAM
-								.equals(aParam.getName())) {
-					paramValue = aParam.getValue();
-					break;
-				}
-			}
-			web.dispose();
-		}
-
-		// _configs = new ArrayList();
-
-		facesConfigFileList = new ArrayList();
-
-		IFolder webrootFolder = WebrootUtil
-				.getWebContentFolder(this.currentProject);
-		IFile defaultFacesConfigFile = webrootFolder
-				.getFile(IFileFolderConstants.FOLDER_WEBINF
-						+ IFileFolderConstants.PATH_SEPARATOR
-						+ IFileFolderConstants.FILE_FACES_CONFIG_XML);
-		registerConfigFile(defaultFacesConfigFile);
-
-		if (paramValue != null) {
-			// Parse the list to an array of files
-			StringTokenizer tokenizer = new StringTokenizer(paramValue, ","); //$NON-NLS-1$
-			while (tokenizer.hasMoreTokens()) {
-				IFile aConifgFile = webrootFolder.getFile(tokenizer.nextToken()
-						.trim());
-				registerConfigFile(aConifgFile);
-			}
-		}
-	}
-
-	// ---------------------------------------------------------------------------------------
-	// methods for change events.
-	protected void fireFacesConfigChanged() {
-		Object[] listeners = this.listenerList.getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			IFacesConfigChangeListener l = (IFacesConfigChangeListener) listeners[i];
-			if (l != null) {
-				l.facesConfigChanged();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.models.IFacesConfigManager#addFacesConfigChangeListener(com.sybase.stf.jmt.models.IFacesConfigChangeListener)
-	 */
-	public void addFacesConfigChangeListener(IFacesConfigChangeListener listener) {
-		listenerList.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.models.IFacesConfigManager#removeFacesConfigChangeListener(com.sybase.stf.jmt.models.IFacesConfigChangeListener)
-	 */
-	public void removeFacesConfigChangeListener(
-			IFacesConfigChangeListener listener) {
-		listenerList.remove(listener);
-	}
-
-	// ------------------------------------------------------------------------------------------------------
-	/**
-	 * Saves all the configuration resources to the local file system
-	 */
-	// public void save()
-	// {
-	// ResourceSet rset = _editingDomain.getResourceSet();
-	// EList resources = rset.getResources();
-	// for (int r = 0; r < resources.size(); r++)
-	// {
-	// Resource resource = (Resource)resources.get(r);
-	// if (resource.isModified())
-	// {
-	// FacesConfig config = new FacesConfig(resource);
-	// try
-	// {
-	// config.save();
-	// }
-	// catch (IOException e)
-	// {
-	// _log.error("FacesConfig.SaveError", e);
-	// }
-	// }
-	// }
-	// this.fireFacesConfigChanged();
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.models.IFacesConfigManager#beginModify()
-	 */
-	// public void beginModify()
-	// {
-	// // do nothing for now.
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.models.IFacesConfigManager#endModify()
-	 */
-	// public void endModify()
-	// {
-	// save();
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/FacesConfigUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/FacesConfigUtil.java
index a6d9c5e..1743a38 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/FacesConfigUtil.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/FacesConfigUtil.java
@@ -16,7 +16,6 @@
 import java.util.List;
 
 import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
@@ -30,7 +29,7 @@
  */
 public class FacesConfigUtil {
 	/** the singleton instance of face-config files manager */
-	private static ConfigurationManager facesConfigManager;
+//	private static ConfigurationManager facesConfigManager;
 
 	// private static final Logger log = EditorPlugin
 	// .getLogger(FacesConfigUtil.class);
@@ -194,16 +193,16 @@
 	 * 
 	 * @return - configuration manager.
 	 */
-	public static ConfigurationManager getConfigurationManager(IProject project) {
-		if (facesConfigManager == null) {
-			facesConfigManager = new ConfigurationManager(project);
-		}
-
-		facesConfigManager.loadConfiguration(project);
-		// facesConfigManager.deriveManagedBeans();
-
-		return facesConfigManager;
-	}
+//	public static ConfigurationManager getConfigurationManager(IProject project) {
+//		if (facesConfigManager == null) {
+//			facesConfigManager = new ConfigurationManager(project);
+//		}
+//
+//		facesConfigManager.loadConfiguration(project);
+//		// facesConfigManager.deriveManagedBeans();
+//
+//		return facesConfigManager;
+//	}
 
 	// public static void addXMLNavigationRuleFromEMFModel(IStructuredModel
 	// model,
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/IFacesConfigChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/IFacesConfigChangeEvent.java
deleted file mode 100644
index 0766fd7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/IFacesConfigChangeEvent.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-/**
- * @author xnjiang
- *
- */
-public interface IFacesConfigChangeEvent {
-
-	public boolean isManagedBeanChanged();
-	public boolean isNavigationRuleChanged();
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/IFacesConfigChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/IFacesConfigChangeListener.java
deleted file mode 100644
index 59ed20f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/IFacesConfigChangeListener.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. 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:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.EventListener;
-
-/**
- * @author Yang Liu
- * @version
- */
-public interface IFacesConfigChangeListener extends EventListener {
-	public void facesConfigChanged();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/IFacesConfigManager.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/IFacesConfigManager.java
deleted file mode 100644
index 922116f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/IFacesConfigManager.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. 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:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-
-/**
- * @author Yang Liu
- * @version
- */
-public interface IFacesConfigManager // extends ILifecycle
-{
-	public IProject getProject();
-
-	/**
-	 * 
-	 * @return the array of the faces config files, it will not return null
-	 */
-	public IFile[] getFacesConfigs();
-
-	public void addFacesConfigChangeListener(IFacesConfigChangeListener listener);
-
-	public void removeFacesConfigChangeListener(
-			IFacesConfigChangeListener listener);
-
-	/**
-	 * if the clients wants to change any of the faces-config file, should call
-	 * this method.
-	 * 
-	 */
-	// public void beginModify();
-	//
-	// /**
-	// * after the client finish modify should call this method. The config
-	// manager will save the
-	// * config files and fire out change event to other clients.
-	// *
-	// */
-	// public void endModify();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/LinkNavigationRule.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/LinkNavigationRule.java
deleted file mode 100644
index e1d75b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/LinkNavigationRule.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. 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:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-
-/**
- * This class stores the relationship between link and navigation rules.
- * 
- * @author Xiao-guang Zhang
- */
-public class LinkNavigationRule {
-	/** related the navigation rule and case */
-	private NavigationRuleType navigationRule = null;
-
-	private NavigationCaseType navigationCase = null;
-
-	/** the first pflink */
-	private PageflowLink firstLink = null;
-
-	/** the second pflink, maybe is null */
-	private PageflowLink secondLink = null;
-
-	/**
-	 * get the generated navigation rule for this link.
-	 * 
-	 * @return - the generated navigation rule for this link
-	 */
-	public NavigationRuleType getNavigationRule() {
-		return navigationRule;
-	}
-
-	/**
-	 * get the generated navigation case for this link.
-	 * 
-	 * @return - the generated navigation case for this link
-	 */
-	public NavigationCaseType getNavigationCase() {
-		return navigationCase;
-	}
-
-	/**
-	 * set the generated navigation rule and case for this link.
-	 * 
-	 * @param navigationRule
-	 * @param navigationCase
-	 */
-	public void setNavigationRule(NavigationRuleType navigationRule,
-			NavigationCaseType navigationCase) {
-		this.navigationRule = navigationRule;
-		this.navigationCase = navigationCase;
-	}
-
-	/**
-	 * set two links for the navigation rules
-	 * 
-	 * @param link
-	 * @param nextLink
-	 */
-	public void setLinks(PageflowLink firstlink, PageflowLink secondLink) {
-		this.firstLink = firstlink;
-		this.secondLink = secondLink;
-	}
-
-	/**
-	 * get the first link
-	 * 
-	 * @return - the first link
-	 */
-	public PageflowLink getFirstLink() {
-		return firstLink;
-	}
-
-	/**
-	 * get the second link
-	 * 
-	 * @return - the second link
-	 */
-	public PageflowLink getSecondLink() {
-		return secondLink;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanScopeTreeItem.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanScopeTreeItem.java
index 4537fd2..69f6016 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanScopeTreeItem.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanScopeTreeItem.java
@@ -66,9 +66,11 @@
 		for (Iterator it = managedBeans.iterator(); it.hasNext();) {
 			ManagedBeanType managedBean = (ManagedBeanType) it.next();
 
-			if (scope
-					.equals(managedBean.getManagedBeanScope().getTextContent())) {
-				result.add(managedBean);
+			if (managedBean.getManagedBeanScope() != null) {
+				if (scope.equals(managedBean.getManagedBeanScope()
+						.getTextContent())) {
+					result.add(managedBean);
+				}
 			}
 		}
 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/WebrootUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/WebrootUtil.java
index 590c3b7..a7a9f45 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/WebrootUtil.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/WebrootUtil.java
@@ -19,7 +19,6 @@
 import org.eclipse.core.runtime.Path;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
 
 /**
  * This utility class is used to make a bridge between the relative path from
