diff --git a/assembly/plugins/org.eclipse.jsf.branding/.classpath b/assembly/plugins/org.eclipse.jsf.branding/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/assembly/plugins/org.eclipse.jsf.branding/.cvsignore b/assembly/plugins/org.eclipse.jsf.branding/.cvsignore
deleted file mode 100644
index 3bc67e4..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-@dot*
-temp.folder
-build.xml
diff --git a/assembly/plugins/org.eclipse.jsf.branding/.project b/assembly/plugins/org.eclipse.jsf.branding/.project
deleted file mode 100644
index bd50004..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jsf.branding</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/assembly/plugins/org.eclipse.jsf.branding/META-INF/MANIFEST.MF b/assembly/plugins/org.eclipse.jsf.branding/META-INF/MANIFEST.MF
deleted file mode 100644
index b24d7e8..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.Name
-Bundle-SymbolicName: org.eclipse.jsf
-Bundle-Version: 0.5.0.qualifier
-Bundle-Activator: org.eclipse.jsf.main.MainPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime
-Eclipse-AutoStart: true
-Bundle-Vendor: %plugin.Provider
diff --git a/assembly/plugins/org.eclipse.jsf.branding/about.html b/assembly/plugins/org.eclipse.jsf.branding/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>February 24, 2005</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/assembly/plugins/org.eclipse.jsf.branding/about.ini b/assembly/plugins/org.eclipse.jsf.branding/about.ini
deleted file mode 100644
index a21a3ec..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/about.ini
+++ /dev/null
@@ -1,29 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
diff --git a/assembly/plugins/org.eclipse.jsf.branding/about.mappings b/assembly/plugins/org.eclipse.jsf.branding/about.mappings
deleted file mode 100644
index bddaab4..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
\ No newline at end of file
diff --git a/assembly/plugins/org.eclipse.jsf.branding/about.properties b/assembly/plugins/org.eclipse.jsf.branding/about.properties
deleted file mode 100644
index c62b076..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/about.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle 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:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-blurb=JavaServer Faces Tools\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2005.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
diff --git a/assembly/plugins/org.eclipse.jsf.branding/build.properties b/assembly/plugins/org.eclipse.jsf.branding/build.properties
deleted file mode 100644
index bbae244..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               eclipse32.png,\
-               eclipse32.gif,\
-               about.properties,\
-               about.mappings,\
-               about.ini,\
-               about.html,\
-               plugin.properties,\
-               bin/
-src.includes = src/,\
-               eclipse32.png,\
-               eclipse32.gif,\
-               build.properties,\
-               about.properties,\
-               about.mappings,\
-               about.ini,\
-               about.html,\
-               META-INF/,\
-               plugin.properties
diff --git a/assembly/plugins/org.eclipse.jsf.branding/eclipse32.gif b/assembly/plugins/org.eclipse.jsf.branding/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/assembly/plugins/org.eclipse.jsf.branding/eclipse32.png b/assembly/plugins/org.eclipse.jsf.branding/eclipse32.png
deleted file mode 100644
index 568fac1..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/assembly/plugins/org.eclipse.jsf.branding/plugin.properties b/assembly/plugins/org.eclipse.jsf.branding/plugin.properties
deleted file mode 100644
index fe471d2..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/plugin.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-plugin.Name=JavaServer Faces Tools
-plugin.Provider=Eclipse.org
\ No newline at end of file
diff --git a/assembly/plugins/org.eclipse.jsf.branding/src/org/eclipse/jsf/main/MainPlugin.java b/assembly/plugins/org.eclipse.jsf.branding/src/org/eclipse/jsf/main/MainPlugin.java
deleted file mode 100644
index a8b13fe..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/src/org/eclipse/jsf/main/MainPlugin.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.eclipse.jsf.main;
-
-import org.eclipse.ui.plugin.*;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class MainPlugin extends AbstractUIPlugin {
-
-	//The shared instance.
-	private static MainPlugin plugin;
-	
-	/**
-	 * The constructor.
-	 */
-	public MainPlugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static MainPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.jsf.main", path);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.classpath b/jsf/plugins/org.eclipse.jst.jsf.core/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.core/.cvsignore
deleted file mode 100644
index 7033a79..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-@dot*
-temp.folder
-build.xml
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/.project b/jsf/plugins/org.eclipse.jst.jsf.core/.project
deleted file mode 100644
index 0cd3e27..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.core/META-INF/MANIFEST.MF
deleted file mode 100644
index 4c31f65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,35 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.core; singleton:=true
-Bundle-Version: 0.5.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.core.internal.JSFCorePlugin
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.wst.common.project.facet.core,
- org.eclipse.jst.j2ee.web,
- org.eclipse.jst.server.core,
- org.eclipse.wst.server.core,
- org.eclipse.wst.common.frameworks,
- org.eclipse.jst.common.frameworks,
- org.eclipse.jdt.core,
- org.eclipse.core.resources,
- org.eclipse.jst.j2ee,
- org.eclipse.emf.common,
- org.eclipse.emf.ecore,
- org.eclipse.emf.ecore.xmi,
- org.eclipse.jst.j2ee.core,
- org.eclipse.jem.util,
- org.eclipse.wst.xml.core,
- org.eclipse.jst.jsf.facesconfig,
- org.eclipse.wst.common.emf
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.jst.jsf.core.internal;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.jsflibraryregistry;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.jsflibraryregistry.adapter;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.project.facet;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.ui,org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig,
- org.eclipse.jst.jsf.core.jsflibraryregistry
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/build.properties b/jsf/plugins/org.eclipse.jst.jsf.core/build.properties
deleted file mode 100644
index 6f6a25d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/build.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# 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:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin.properties
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.ecore b/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.ecore
deleted file mode 100644
index c4ed268..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.ecore
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="jsflibraryregistry"
-    nsURI="http://www.eclipse.org/webtools/jsf/schema/jsflibraryregistry.xsd" nsPrefix="jsflibreg">
-  <eClassifiers xsi:type="ecore:EClass" name="JSFLibraryRegistry">
-    <eOperations name="getJSFLibraryByID" lowerBound="1" eType="#//JSFLibrary">
-      <eParameters name="ID" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getJSFLibrariesByName" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList">
-      <eParameters name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getImplJSFLibraries" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList"/>
-    <eOperations name="getNonImplJSFLibraries" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList"/>
-    <eOperations name="getAllJSFLibraries" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEList"/>
-    <eOperations name="addJSFLibrary" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="library" lowerBound="1" eType="#//JSFLibrary"/>
-    </eOperations>
-    <eOperations name="removeJSFLibrary" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="library" lowerBound="1" eType="#//JSFLibrary"/>
-    </eOperations>
-    <eOperations name="getDefaultImplementation" lowerBound="1" eType="#//JSFLibrary"/>
-    <eOperations name="setDefaultImplementation" lowerBound="1">
-      <eParameters name="implementation" lowerBound="1" eType="#//JSFLibrary"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="DefaultImplementationID"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="JSFLibraries" upperBound="-1"
-        eType="#//JSFLibrary" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="PluginProvidedJSFLibraries"
-        upperBound="-1" eType="#//PluginProvidedJSFLibrary" transient="true" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="JSFLibrary">
-    <eOperations name="containsArchiveFile" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="fullPath" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getWorkingCopy" lowerBound="1" eType="#//JSFLibrary"/>
-    <eOperations name="updateValues" lowerBound="1">
-      <eParameters name="otherLibrary" lowerBound="1" eType="#//JSFLibrary"/>
-    </eOperations>
-    <eOperations name="copyTo" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="baseDestLocation" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="ID" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        defaultValueLiteral="" iD="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="Name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="JSFVersion" lowerBound="1"
-        eType="#//JSFVersion" defaultValueLiteral="UNKNOWN"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="Deployed" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="Implementation" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ArchiveFiles" upperBound="-1"
-        eType="#//ArchiveFile" containment="true" eOpposite="#//ArchiveFile/JSFLibrary"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PluginProvidedJSFLibrary" eSuperTypes="#//JSFLibrary">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="pluginID" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ArchiveFile">
-    <eOperations name="getName" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eOperations name="getPath" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eOperations name="exists" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-    <eOperations name="equals" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="object" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
-    </eOperations>
-    <eOperations name="hashCode" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eOperations name="copyTo" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="baseDestLocation" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eOperations name="getResolvedSourceLocation" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="RelativeToWorkspace" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="SourceLocation" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="RelativeDestLocation" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="JSFLibrary" lowerBound="1"
-        eType="#//JSFLibrary" eOpposite="#//JSFLibrary/ArchiveFiles"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="JSFVersion">
-    <eLiterals name="UNKNOWN" value="-1"/>
-    <eLiterals name="v1_1" value="1"/>
-    <eLiterals name="v1_2" value="2"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.genmodel b/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.genmodel
deleted file mode 100644
index 0bde041..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/jsflibraryregistry.genmodel
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2005 Oracle Corporation"
-    modelDirectory="/org.eclipse.jst.jsf.core/src" editDirectory="/org.eclipse.jst.jsf.core.edit/src"
-    editorDirectory="/org.eclipse.jst.jsf.core.editor/src" modelPluginID="org.eclipse.jst.jsf.core"
-    templateDirectory="templates" dynamicTemplates="true" modelName="JSFLibraryRegistry"
-    importerID="org.eclipse.emf.importer.ecore">
-  <foreignModel>jsflibraryregistry.ecore</foreignModel>
-  <genPackages prefix="JSFLibraryRegistry" basePackage="org.eclipse.jst.jsf.core.internal"
-      resource="XML" disposableProviderFactory="true" ecorePackage="jsflibraryregistry.ecore#/">
-    <genEnums ecoreEnum="jsflibraryregistry.ecore#//JSFVersion">
-      <genEnumLiterals ecoreEnumLiteral="jsflibraryregistry.ecore#//JSFVersion/v1_1"/>
-      <genEnumLiterals ecoreEnumLiteral="jsflibraryregistry.ecore#//JSFVersion/v1_2"/>
-      <genEnumLiterals ecoreEnumLiteral="jsflibraryregistry.ecore#//JSFVersion/UNKNOWN"/>
-    </genEnums>
-    <genClasses ecoreClass="jsflibraryregistry.ecore#//JSFLibraryRegistry">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference jsflibraryregistry.ecore#//JSFLibraryRegistry/JSFLibraries"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference jsflibraryregistry.ecore#//JSFLibraryRegistry/DefaultImplementation"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getJSFLibrary">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibraryRegistry/getJSFLibrary/name"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getImplJSFLibraries"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibraryRegistry/getNonImplJSFLibraries"/>
-    </genClasses>
-    <genClasses ecoreClass="jsflibraryregistry.ecore#//JSFLibrary">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/Name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/JSFVersion"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/Deployed"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//JSFLibrary/Implementation"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference jsflibraryregistry.ecore#//JSFLibrary/ArchiveFiles"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference jsflibraryregistry.ecore#//JSFLibrary/JSFLibraryRegistry"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibrary/equals">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//JSFLibrary/equals/object"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//JSFLibrary/hashCode"/>
-    </genClasses>
-    <genClasses ecoreClass="jsflibraryregistry.ecore#//ArchiveFile">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute jsflibraryregistry.ecore#//ArchiveFile/FullPath"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference jsflibraryregistry.ecore#//ArchiveFile/JSFLibrary"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/getName"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/getPath"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/exists"/>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/equals">
-        <genParameters ecoreParameter="jsflibraryregistry.ecore#//ArchiveFile/equals/object"/>
-      </genOperations>
-      <genOperations ecoreOperation="jsflibraryregistry.ecore#//ArchiveFile/hashCode"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/model/templates/Header.javajetinc b/jsf/plugins/org.eclipse.jst.jsf.core/model/templates/Header.javajetinc
deleted file mode 100644
index aadfb40..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/model/templates/Header.javajetinc
+++ /dev/null
@@ -1,10 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties
deleted file mode 100644
index a3166c6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# 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:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-plugin.name=JavaServer Faces Core Plug-in
-plugin.provider=Eclipse.org
-plugin.facet.description=Enables the project to be deployed with JSF capabilities.
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml
deleted file mode 100644
index 4b82807..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="jsfLibraries" name="jsfLibraries" schema="schema/jsfLibraries.exsd"/>
-  <!-- JSF Project Facets -->
-	<extension
-       id="org.eclipse.jst.jsf.project.facet"
-       name="%plugin.facet.extension.name"
-       point="org.eclipse.wst.common.project.facet.core.facets">
-
-    <project-facet id="jst.jsf">
-      <label>JavaServer Faces</label>
-      <description>%plugin.facet.description</description>
-    </project-facet>
-
-    <project-facet-version facet="jst.jsf" version="1.1">
-       <constraint>
-        <and>
-          <requires facet="jst.web" version="[2.3"/>
-        </and>
-      </constraint>
-    </project-facet-version> 
-    
-    <project-facet-version facet="jst.jsf" version="1.2">
-     <constraint>
-        <and>
-          <requires facet="jst.web" version="[2.4"/>
-        </and>
-      </constraint>
-    </project-facet-version>    
-
-   	<action type="install" facet="jst.jsf" version="1.1,1.2">
-		<delegate
-        class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDelegate"/>
-		<config-factory class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider"/>
-	</action>
-    
-	<action type="uninstall" facet="jst.jsf" version="1.1,1.2">
-	 	<delegate
-         class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetUninstallDelegate"/>
- 	</action>
- 	
-	<preset id="preset.jst.jsf.v1_1">
-	    <label>JavaServer Faces v1.1 Project</label>
-	    <facet id="jst.java" version="1.4" />
-	    <facet id="jst.web" version="2.3"/>
-	    <facet id="jst.jsf" version="1.1" />
-	</preset>    
- 	
-  </extension> 
-  
-  <extension point="org.eclipse.wst.common.project.facet.core.runtimes">
-    <supported>
-		<runtime-component any="true"/>
-       	<facet id="jst.jsf" version="1.1,1.2"/>
-    </supported>
-  </extension>
-    
-  <extension
-     name="JSF JSP File URL"
-     point="org.eclipse.jst.j2ee.web.fileURL">
-     <fileURL run="org.eclipse.jst.jsf.core.internal.launch.JSFFileURL"/>
-  </extension>
-  <extension
-        point="org.eclipse.wst.xml.core.catalogContributions">
-     <catalogContribution>
-        <system
-              systemId="http://org.eclipse.jst.jsf.core/grammarAnnotationSchema"
-              uri="schema/grammar-annotations.xsd"/>
-     </catalogContribution>
-  </extension>
-  
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/grammar-annotations.xsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/grammar-annotations.xsd
deleted file mode 100644
index 8b4a47e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/grammar-annotations.xsd
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsd:schema
-	targetNamespace="http://org.eclipse.jst.jsf.core/grammarAnnotationSchema" 
-	version="1.0"
-	attributeFormDefault="unqualified"
-	elementFormDefault="unqualified" 
-	xmlns="http://org.eclipse.jst.jsf.core/grammarAnnotationSchema"
-	xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-	
-	<xsd:element name="grammar-annotations"
-		type="grammar-annotationType" />
-		
-	<xsd:complexType name="grammar-annotationType">
-		<xsd:sequence>
-			<xsd:element name="cm-element"
-				type="cm-elementType" minOccurs="1" maxOccurs="unbounded" />
-		</xsd:sequence>
-		<xsd:attribute name="caseSensitive" type="xsd:boolean" use="optional" default="true"/>
-	</xsd:complexType>
-	<xsd:complexType name="cm-elementType">
-		<xsd:sequence>
-			<xsd:element name="cm-attribute" type="cm-attributeType" minOccurs="0" maxOccurs="unbounded"/>
-			<xsd:element name="property" type="propertyType" minOccurs="0" maxOccurs="unbounded"/>
-		</xsd:sequence>
-		<xsd:attribute name="name" type="xsd:string" use="required"/>
-	</xsd:complexType>
-	<xsd:complexType name="cm-attributeType">
-		<xsd:sequence>
-			<xsd:element name="property"
-				type="propertyType" minOccurs="0" maxOccurs="unbounded"/>
-		</xsd:sequence>
-		<xsd:attribute name="name" type="xsd:string" use="required"/>
-	</xsd:complexType>
-	<xsd:complexType name="propertyType">
-		<xsd:sequence>
-			<xsd:element name="value" type="propertyValue" minOccurs="1" maxOccurs="unbounded"/>
-		</xsd:sequence>		
-		<xsd:attribute name="name" type="xsd:string" use="required"/>		
-	</xsd:complexType>
-	<xsd:complexType name="propertyValue">
-		<xsd:all></xsd:all>
-	</xsd:complexType>
-</xsd:schema>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfLibraries.exsd b/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfLibraries.exsd
deleted file mode 100644
index 36739b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/schema/jsfLibraries.exsd
+++ /dev/null
@@ -1,160 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.core" id="jsfLibraries" name="org.eclipse.jst.jsf.core.jsfLibraries"/>
-      </appInfo>
-      <documentation>
-         This extension point allows clients to create named sets of jars for use with JavaServer Faces Applications.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="jsfLibrary" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="jsfLibrary">
-      <annotation>
-         <documentation>
-            A named collection of jars that can be copied as a unit to WEB-INF/lib.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique name for the library that will be displayed to an end user.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="isImplementation" type="boolean" use="required">
-            <annotation>
-               <documentation>
-                  Flag indicating that this libary is declared to be a JSF implementation and not just a JSF component library.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="maxVersionSupported">
-            <annotation>
-               <documentation>
-                  Used to declare which JSF specification this library will support.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="v1_1">
-                  </enumeration>
-                  <enumeration value="v1_2">
-                  </enumeration>
-                  <enumeration value="UNKNOWN">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="archiveFilesDelegate" type="string" use="required">
-            <annotation>
-               <documentation>
-                  class that must extend org.eclipse.jst.jsf.core.jsflibraryregistry.JSFLibraryArchiveFilesDelegate to supply a collection of ArchiveFiles for the library
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         JSF M1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a jsfLibrary extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
-  &lt;extension point=&quot;org.eclipse.jst.jsf.core.jsfLibraries&quot;&gt;
-    &lt;jsfLibrary       
-       name=&quot;MyComponentLib1&quot;
-       isImplementation=&quot;false&quot;
-       maxVersionSupported=&quot;v1_1&quot;
-       archiveFilesDelegate=&quot;com.acme.jsf.libraries.MyComponentLibraryFiles&quot;/&gt;
-  &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Value of the attribute class must be a fully qualified name of a Java class that extends the abstract class &lt;code&gt;org.eclipse.jst.jsf.core.jsflibraryregistry.JSFLibraryArchiveFilesDelegate&lt;/code&gt; and has a public 0-arg constructor.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         none
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005 Oracle Corporation.
-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:
-Gerry Kessler - initial API and implementation
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCorePlugin.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCorePlugin.java
deleted file mode 100644
index bbb2755..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/JSFCorePlugin.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - JSFLibraryRegistry work
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.adapter.MaintainDefaultImplementationAdapter;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryResourceFactoryImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryResourceImpl;
-import org.eclipse.jst.jsf.core.jsflibraryregistry.PluginProvidedJSFLibraryCreationHelper;
-import org.eclipse.wst.common.frameworks.internal.WTPPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * JSF Core plugin.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class JSFCorePlugin extends WTPPlugin {
-	public static final String PLUGIN_ID = "org.eclipse.jst.jsf.core";//org.eclipse.jst.jsf.core.internal.JSFCorePlugin"; //$NON-NLS-1$
-
-	public static final String FACET_ID = "jst.jsf"; //$NON-NLS-1$
-	
-	// The shared instance.
-	private static JSFCorePlugin plugin;
-
-	// The workspace-relative part of the URL of the JSF Library Registry
-	// persistence store.
-	private static final String JSF_LIBRARY_REGISTRY_URL = ".metadata/.plugins/org.eclipse.jst.jsf.core/JSFLibraryRegistry.xml"; //$NON-NLS-1$
-
-	// The NS URI of the JSF Library Registry's Ecore package. (Must match
-	// setting on package in Ecore model.)
-	private static final String JSF_LIBRARY_REGISTRY_NSURI = "http://www.eclipse.org/webtools/jsf/schema/jsflibraryregistry.xsd"; //$NON-NLS-1$
-
-	public static final String LIB_EXT_PT = "jsfLibraries"; //$NON-NLS-1$
-
-	// The JSF Library Registry EMF resource instance.
-	private JSFLibraryRegistryResourceImpl jsfLibraryRegistryResource = null;
-
-	// The JSF Library Registry instance.
-	private JSFLibraryRegistry jsfLibraryRegistry = null;
-
-	/**
-	 * The constructor.
-	 */
-	public JSFCorePlugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		loadJSFLibraryRegistry();
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		saveJSFLibraryRegistry();
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static JSFCorePlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the JSFLibraryRegistry EMF object.
-	 * 
-	 * @return the JSFLibraryRegistry EMF object.
-	 */
-	public JSFLibraryRegistry getJSFLibraryRegistry() {
-		return jsfLibraryRegistry;
-	}
-
-	/**
-	 * Loads the JSFLibraryRegistry EMF object from plugin-specfic workspace
-	 * settings location. (Called from start(BundleContext).)
-	 */
-	public void loadJSFLibraryRegistry() {
-		try {
-			URL jsfLibRegURL = new URL(Platform.getInstanceLocation().getURL(), JSF_LIBRARY_REGISTRY_URL);
-			URI jsfLibRegURI = URI.createURI(jsfLibRegURL.toString());
-			EPackage.Registry.INSTANCE.put(JSF_LIBRARY_REGISTRY_NSURI, JSFLibraryRegistryPackageImpl.init());
-			JSFLibraryRegistryResourceFactoryImpl resourceFactory = new JSFLibraryRegistryResourceFactoryImpl();
-			jsfLibraryRegistryResource = (JSFLibraryRegistryResourceImpl)resourceFactory.createResource(jsfLibRegURI);
-			try {
-				Map options = new HashMap();
-				//disable notifications during load to avoid changing stored default implementation
-				options.put(XMLResource.OPTION_DISABLE_NOTIFY, Boolean.TRUE);
-				jsfLibraryRegistryResource.load(options);
-				jsfLibraryRegistry = (JSFLibraryRegistry)jsfLibraryRegistryResource.getContents().get(0);
-				loadJSFLibraryExtensions();
-			} catch(IOException ioe) {
-				log(IStatus.INFO, Messages.JSFLibraryRegistry_NoLoadCreatingNew, ioe);
-				jsfLibraryRegistry = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibraryRegistry();
-				jsfLibraryRegistryResource.getContents().add(jsfLibraryRegistry);
-				loadJSFLibraryExtensions();
-			}
-			//add adapter to maintain default implementation
-			if (jsfLibraryRegistry != null) {
-				jsfLibraryRegistry.eAdapters().add(MaintainDefaultImplementationAdapter.getInstance());
-			}
-		} catch(MalformedURLException mue) {
-			log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorCreatingURL, mue);
-		}
-	}
-
-	/**
-	 * Creates library registry items from extension points.
-	 */
-	private void loadJSFLibraryExtensions() {
-		try {
-			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(JSFCorePlugin.PLUGIN_ID, JSFCorePlugin.LIB_EXT_PT);
-			IExtension[] extensions = point.getExtensions();
-			for (int i=0;i < extensions.length;i++){
-				IExtension ext = extensions[i];
-				for (int j=0;j < ext.getConfigurationElements().length;j++){
-					PluginProvidedJSFLibraryCreationHelper newLibCreator = new PluginProvidedJSFLibraryCreationHelper(ext.getConfigurationElements()[j]);						
-					JSFLibrary newLib = newLibCreator.create();
-					if (newLib != null)
-						jsfLibraryRegistry.addJSFLibrary(newLib);
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorLoadingFromExtPt, e);
-		}
-	}
-
-	/**
-	 * Saves the JSFLibraryRegistry EMF object from plugin-specfic workspace
-	 * settings location. (Called from stop(BundleContext).)
-	 */
-	public boolean saveJSFLibraryRegistry() {
-		boolean saved = false;
-		if (jsfLibraryRegistryResource != null) {
-			try {
-				jsfLibraryRegistryResource.save(Collections.EMPTY_MAP);
-				saved = true;
-			} catch(IOException ioe) {
-				log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorSaving, ioe);
-			}
-		} else {
-			log(IStatus.ERROR, Messages.JSFLibraryRegistry_ErrorSaving);
-		}
-		return saved;
-	}
-
-	public static void log(final Exception e, final String msg) {
-		final ILog log = getDefault().getLog();
-
-		log.log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, msg, e));
-	}
-
-	/**
-	 * Logs using the default ILog implementation provided by getLog().
-	 * 
-	 * @param severity Severity (IStatus constant) of log entry
-	 * @param message Human-readable message describing log entry
-	 * @param ex Throwable instance (can be null)
-	 */
-	public static void log(int severity, String message, Throwable ex) {
-		getDefault().getLog().log(new Status(severity, PLUGIN_ID, IStatus.OK, message, ex));
-	}
-
-	/**
-	 * Logs using the default ILog implementation provided by getLog().
-	 * 
-	 * @param severity Severity (IStatus constant) of log entry
-	 * @param message Human-readable message describing log entry
-	 */
-	public static void log(int severity, String message) {
-		log(severity, message, null);
-	}
-
-	public String getPluginID() {
-		return PLUGIN_ID;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/Messages.java
deleted file mode 100644
index 6dd9bf8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/Messages.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - changed to work correctly with org.eclipse.osgi.util.NLS
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.core.internal.messages"; //$NON-NLS-1$
-
-	public static String JSFLibraryRegistry_ErrorCreatingURL;
-	public static String JSFLibraryRegistry_NoLoadCreatingNew;
-	public static String JSFLibraryRegistry_ErrorSaving;
-	public static String JSFLibraryRegistry_DEFAULT_IMPL_LABEL;
-	public static String JSFLibraryRegistry_ErrorLoadingFromExtPt;
-
-	public static String JSFFacetInstallDataModelProvider_ValidateServletName;
-	public static String JSFFacetInstallDataModelProvider_ValidateJSFImpl;
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileEmpty;
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFilePath;
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileRelative1;
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileRelative2;
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileXML;
-	public static String JSFFacetInstallDataModelProvider_ValidateConfigFileSlashes;
-
-	public static String ArchiveFileImpl_CannotCopyFile;
-	public static String ArchiveFileImpl_CannotCloseFile;
-	public static String ArchiveFileImpl_CannotLocatePluginRelativeFile;
-
-	public static String PluginProvidedJSFLibraryCreationHelper_ErrorCreating;
-	public static String PluginProvidedJSFLibraryCreationHelper_ErrorMultipleDefinition;
-
-	public static String JSFUtils_ErrorCreatingConfigFile;
-	public static String JSFUtils_ErrorClosingConfigFile;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/ArchiveFile.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/ArchiveFile.java
deleted file mode 100644
index bbe4c80..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/ArchiveFile.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Archive File</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#isRelativeToWorkspace <em>Relative To Workspace</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getSourceLocation <em>Source Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getRelativeDestLocation <em>Relative Dest Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary <em>JSF Library</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile()
- * @model
- * @generated
- */
-public interface ArchiveFile extends EObject{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Source Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Source Location</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Source Location</em>' attribute.
-	 * @see #setSourceLocation(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile_SourceLocation()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getSourceLocation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getSourceLocation <em>Source Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * If the value passed is found to be relative to the workspace, a
-	 * workspace-relative location is stored; to prevent this behaviour, call
-	 * isRelativeToWorkspace(false) before calling this method.
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source Location</em>' attribute.
-	 * @see #getSourceLocation()
-	 * @generated
-	 */
-	void setSourceLocation(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Relative To Workspace</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Relative To Workspace</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Relative To Workspace</em>' attribute.
-	 * @see #setRelativeToWorkspace(boolean)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile_RelativeToWorkspace()
-	 * @model default="true" required="true"
-	 * @generated
-	 */
-	boolean isRelativeToWorkspace();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#isRelativeToWorkspace <em>Relative To Workspace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Relative To Workspace</em>' attribute.
-	 * @see #isRelativeToWorkspace()
-	 * @generated
-	 */
-	void setRelativeToWorkspace(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Relative Dest Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Relative Dest Location</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Relative Dest Location</em>' attribute.
-	 * @see #setRelativeDestLocation(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile_RelativeDestLocation()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getRelativeDestLocation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getRelativeDestLocation <em>Relative Dest Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Relative Dest Location</em>' attribute.
-	 * @see #getRelativeDestLocation()
-	 * @generated
-	 */
-	void setRelativeDestLocation(String value);
-
-	/**
-	 * Returns the value of the '<em><b>JSF Library</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles <em>Archive Files</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>JSF Library</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>JSF Library</em>' container reference.
-	 * @see #setJSFLibrary(JSFLibrary)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getArchiveFile_JSFLibrary()
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles
-	 * @model opposite="ArchiveFiles" required="true"
-	 * @generated
-	 */
-	JSFLibrary getJSFLibrary();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary <em>JSF Library</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>JSF Library</em>' container reference.
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	void setJSFLibrary(JSFLibrary value);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Path</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	String getPath();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model required="true"
-	 * @generated
-	 */
-	boolean exists();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model required="true" objectRequired="true"
-	 * @generated
-	 */
-	boolean equals(Object object);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model required="true"
-	 * @generated
-	 */
-	int hashCode();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model required="true" baseDestLocationRequired="true"
-	 * @generated
-	 */
-	boolean copyTo(String baseDestLocation);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	String getResolvedSourceLocation();
-
-} // ArchiveFile
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibrary.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibrary.java
deleted file mode 100644
index b664d04..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibrary.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>JSF Library</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getID <em>ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getJSFVersion <em>JSF Version</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isDeployed <em>Deployed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isImplementation <em>Implementation</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles <em>Archive Files</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary()
- * @model
- * @generated
- */
-public interface JSFLibrary extends EObject{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>ID</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>ID</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>ID</em>' attribute.
-	 * @see #setID(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_ID()
-	 * @model default="" id="true" required="true"
-	 * @generated
-	 */
-	String getID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getID <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>ID</em>' attribute.
-	 * @see #getID()
-	 * @generated
-	 */
-	void setID(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_Name()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>JSF Version</b></em>' attribute.
-	 * The default value is <code>"UNKNOWN"</code>.
-	 * The literals are from the enumeration {@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>JSF Version</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>JSF Version</em>' attribute.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-	 * @see #setJSFVersion(JSFVersion)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_JSFVersion()
-	 * @model default="UNKNOWN" required="true"
-	 * @generated
-	 */
-	JSFVersion getJSFVersion();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getJSFVersion <em>JSF Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>JSF Version</em>' attribute.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-	 * @see #getJSFVersion()
-	 * @generated
-	 */
-	void setJSFVersion(JSFVersion value);
-
-	/**
-	 * Returns the value of the '<em><b>Deployed</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Deployed</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Deployed</em>' attribute.
-	 * @see #setDeployed(boolean)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_Deployed()
-	 * @model default="true" required="true"
-	 * @generated
-	 */
-	boolean isDeployed();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isDeployed <em>Deployed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Deployed</em>' attribute.
-	 * @see #isDeployed()
-	 * @generated
-	 */
-	void setDeployed(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Implementation</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Implementation</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Implementation</em>' attribute.
-	 * @see #setImplementation(boolean)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_Implementation()
-	 * @model default="false" required="true"
-	 * @generated
-	 */
-	boolean isImplementation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isImplementation <em>Implementation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Implementation</em>' attribute.
-	 * @see #isImplementation()
-	 * @generated
-	 */
-	void setImplementation(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Archive Files</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary <em>JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Archive Files</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Archive Files</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibrary_ArchiveFiles()
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary
-	 * @model type="org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile" opposite="JSFLibrary" containment="true"
-	 * @generated
-	 */
-	EList getArchiveFiles();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model required="true" fullPathRequired="true"
-	 * @generated
-	 */
-	boolean containsArchiveFile(String fullPath);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	JSFLibrary getWorkingCopy();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model otherLibraryRequired="true"
-	 * @generated
-	 */
-	void updateValues(JSFLibrary otherLibrary);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model required="true" baseDestLocationRequired="true"
-	 * @generated
-	 */
-	boolean copyTo(String baseDestLocation);
-
-} // JSFLibrary
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistry.java
deleted file mode 100644
index dc2912b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistry.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.core.internal.Messages;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>JSF Library Registry</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getDefaultImplementationID <em>Default Implementation ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getJSFLibraries <em>JSF Libraries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getPluginProvidedJSFLibraries <em>Plugin Provided JSF Libraries</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibraryRegistry()
- * @model
- * @generated
- */
-public interface JSFLibraryRegistry extends EObject{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Default Implementation ID</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Implementation ID</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Implementation ID</em>' attribute.
-	 * @see #setDefaultImplementationID(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibraryRegistry_DefaultImplementationID()
-	 * @model default=""
-	 * @generated
-	 */
-	String getDefaultImplementationID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getDefaultImplementationID <em>Default Implementation ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Implementation ID</em>' attribute.
-	 * @see #getDefaultImplementationID()
-	 * @generated
-	 */
-	void setDefaultImplementationID(String value);
-
-	public static final String DEFAULT_IMPL_LABEL = Messages.JSFLibraryRegistry_DEFAULT_IMPL_LABEL;
-
-	/**
-	 * Returns the value of the '<em><b>JSF Libraries</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>JSF Libraries</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>JSF Libraries</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibraryRegistry_JSFLibraries()
-	 * @model type="org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary" containment="true"
-	 * @generated
-	 */
-	EList getJSFLibraries();
-
-	/**
-	 * Returns the value of the '<em><b>Plugin Provided JSF Libraries</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Plugin Provided JSF Libraries</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Plugin Provided JSF Libraries</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFLibraryRegistry_PluginProvidedJSFLibraries()
-	 * @model type="org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary" containment="true" transient="true"
-	 * @generated
-	 */
-	EList getPluginProvidedJSFLibraries();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Implementation</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true"
-	 * @generated
-	 */
-	JSFLibrary getDefaultImplementation();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model implementationRequired="true"
-	 * @generated
-	 */
-	void setDefaultImplementation(JSFLibrary value);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model required="true" IDRequired="true"
-	 * @generated
-	 */
-	JSFLibrary getJSFLibraryByID(String ID);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model required="true" many="false" nameRequired="true"
-	 * @generated
-	 */
-	EList getJSFLibrariesByName(String name);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true" many="false"
-	 * @generated
-	 */
-	EList getImplJSFLibraries();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true" many="false"
-	 * @generated
-	 */
-	EList getNonImplJSFLibraries();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model kind="operation" required="true" many="false"
-	 * @generated
-	 */
-	EList getAllJSFLibraries();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model required="true" libraryRequired="true"
-	 * @generated
-	 */
-	boolean addJSFLibrary(JSFLibrary library);
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @model required="true" libraryRequired="true"
-	 * @generated
-	 */
-	boolean removeJSFLibrary(JSFLibrary library);
-
-} // JSFLibraryRegistry
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryFactory.java
deleted file mode 100644
index 0953c0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryFactory.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage
- * @generated
- */
-public interface JSFLibraryRegistryFactory extends EFactory{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	JSFLibraryRegistryFactory eINSTANCE = new org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryFactoryImpl();
-
-	/**
-	 * Returns a new object of class '<em>JSF Library Registry</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>JSF Library Registry</em>'.
-	 * @generated
-	 */
-	JSFLibraryRegistry createJSFLibraryRegistry();
-
-	/**
-	 * Returns a new object of class '<em>JSF Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>JSF Library</em>'.
-	 * @generated
-	 */
-	JSFLibrary createJSFLibrary();
-
-	/**
-	 * Returns a new object of class '<em>Archive File</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Archive File</em>'.
-	 * @generated
-	 */
-	ArchiveFile createArchiveFile();
-
-	/**
-	 * Returns a new object of class '<em>Plugin Provided JSF Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Plugin Provided JSF Library</em>'.
-	 * @generated
-	 */
-	PluginProvidedJSFLibrary createPluginProvidedJSFLibrary();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	JSFLibraryRegistryPackage getJSFLibraryRegistryPackage();
-
-} //JSFLibraryRegistryFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryPackage.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryPackage.java
deleted file mode 100644
index 3e00cb7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFLibraryRegistryPackage.java
+++ /dev/null
@@ -1,554 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory
- * @model kind="package"
- * @generated
- */
-public interface JSFLibraryRegistryPackage extends EPackage{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "jsflibraryregistry";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://www.eclipse.org/webtools/jsf/schema/jsflibraryregistry.xsd";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "jsflibreg";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	JSFLibraryRegistryPackage eINSTANCE = org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl <em>JSF Library Registry</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFLibraryRegistry()
-	 * @generated
-	 */
-	int JSF_LIBRARY_REGISTRY = 0;
-
-	/**
-	 * The feature id for the '<em><b>Default Implementation ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>JSF Libraries</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_REGISTRY__JSF_LIBRARIES = 1;
-
-	/**
-	 * The feature id for the '<em><b>Plugin Provided JSF Libraries</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES = 2;
-
-	/**
-	 * The number of structural features of the the '<em>JSF Library Registry</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_REGISTRY_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl <em>JSF Library</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFLibrary()
-	 * @generated
-	 */
-	int JSF_LIBRARY = 1;
-
-	/**
-	 * The feature id for the '<em><b>ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__NAME = 1;
-
-	/**
-	 * The feature id for the '<em><b>JSF Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__JSF_VERSION = 2;
-
-	/**
-	 * The feature id for the '<em><b>Deployed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__DEPLOYED = 3;
-
-	/**
-	 * The feature id for the '<em><b>Implementation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__IMPLEMENTATION = 4;
-
-	/**
-	 * The feature id for the '<em><b>Archive Files</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY__ARCHIVE_FILES = 5;
-
-	/**
-	 * The number of structural features of the the '<em>JSF Library</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int JSF_LIBRARY_FEATURE_COUNT = 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl <em>Archive File</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getArchiveFile()
-	 * @generated
-	 */
-	int ARCHIVE_FILE = 2;
-
-	/**
-	 * The feature id for the '<em><b>Relative To Workspace</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE__RELATIVE_TO_WORKSPACE = 0;
-
-	/**
-	 * The feature id for the '<em><b>Source Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE__SOURCE_LOCATION = 1;
-
-	/**
-	 * The feature id for the '<em><b>Relative Dest Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE__RELATIVE_DEST_LOCATION = 2;
-
-	/**
-	 * The feature id for the '<em><b>JSF Library</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE__JSF_LIBRARY = 3;
-
-	/**
-	 * The number of structural features of the the '<em>Archive File</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARCHIVE_FILE_FEATURE_COUNT = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl <em>Plugin Provided JSF Library</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getPluginProvidedJSFLibrary()
-	 * @generated
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY = 3;
-
-	/**
-	 * The feature id for the '<em><b>ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__ID = JSF_LIBRARY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__NAME = JSF_LIBRARY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>JSF Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__JSF_VERSION = JSF_LIBRARY__JSF_VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Deployed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__DEPLOYED = JSF_LIBRARY__DEPLOYED;
-
-	/**
-	 * The feature id for the '<em><b>Implementation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__IMPLEMENTATION = JSF_LIBRARY__IMPLEMENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Archive Files</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__ARCHIVE_FILES = JSF_LIBRARY__ARCHIVE_FILES;
-
-	/**
-	 * The feature id for the '<em><b>Plugin ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID = JSF_LIBRARY_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the the '<em>Plugin Provided JSF Library</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLUGIN_PROVIDED_JSF_LIBRARY_FEATURE_COUNT = JSF_LIBRARY_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion <em>JSF Version</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryPackageImpl#getJSFVersion()
-	 * @generated
-	 */
-	int JSF_VERSION = 4;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry <em>JSF Library Registry</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>JSF Library Registry</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry
-	 * @generated
-	 */
-	EClass getJSFLibraryRegistry();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getDefaultImplementationID <em>Default Implementation ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Default Implementation ID</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getDefaultImplementationID()
-	 * @see #getJSFLibraryRegistry()
-	 * @generated
-	 */
-	EAttribute getJSFLibraryRegistry_DefaultImplementationID();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getJSFLibraries <em>JSF Libraries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>JSF Libraries</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getJSFLibraries()
-	 * @see #getJSFLibraryRegistry()
-	 * @generated
-	 */
-	EReference getJSFLibraryRegistry_JSFLibraries();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getPluginProvidedJSFLibraries <em>Plugin Provided JSF Libraries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Plugin Provided JSF Libraries</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry#getPluginProvidedJSFLibraries()
-	 * @see #getJSFLibraryRegistry()
-	 * @generated
-	 */
-	EReference getJSFLibraryRegistry_PluginProvidedJSFLibraries();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary <em>JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>JSF Library</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary
-	 * @generated
-	 */
-	EClass getJSFLibrary();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getID <em>ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>ID</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getID()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_ID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getName()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_Name();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getJSFVersion <em>JSF Version</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>JSF Version</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getJSFVersion()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_JSFVersion();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isDeployed <em>Deployed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Deployed</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isDeployed()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_Deployed();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isImplementation <em>Implementation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Implementation</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#isImplementation()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getJSFLibrary_Implementation();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles <em>Archive Files</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Archive Files</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary#getArchiveFiles()
-	 * @see #getJSFLibrary()
-	 * @generated
-	 */
-	EReference getJSFLibrary_ArchiveFiles();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile <em>Archive File</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Archive File</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile
-	 * @generated
-	 */
-	EClass getArchiveFile();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getSourceLocation <em>Source Location</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Source Location</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getSourceLocation()
-	 * @see #getArchiveFile()
-	 * @generated
-	 */
-	EAttribute getArchiveFile_SourceLocation();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#isRelativeToWorkspace <em>Relative To Workspace</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Relative To Workspace</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#isRelativeToWorkspace()
-	 * @see #getArchiveFile()
-	 * @generated
-	 */
-	EAttribute getArchiveFile_RelativeToWorkspace();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getRelativeDestLocation <em>Relative Dest Location</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Relative Dest Location</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getRelativeDestLocation()
-	 * @see #getArchiveFile()
-	 * @generated
-	 */
-	EAttribute getArchiveFile_RelativeDestLocation();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary <em>JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>JSF Library</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile#getJSFLibrary()
-	 * @see #getArchiveFile()
-	 * @generated
-	 */
-	EReference getArchiveFile_JSFLibrary();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary <em>Plugin Provided JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Plugin Provided JSF Library</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary
-	 * @generated
-	 */
-	EClass getPluginProvidedJSFLibrary();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getPluginID <em>Plugin ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Plugin ID</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getPluginID()
-	 * @see #getPluginProvidedJSFLibrary()
-	 * @generated
-	 */
-	EAttribute getPluginProvidedJSFLibrary_PluginID();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion <em>JSF Version</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>JSF Version</em>'.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion
-	 * @generated
-	 */
-	EEnum getJSFVersion();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	JSFLibraryRegistryFactory getJSFLibraryRegistryFactory();
-
-} //JSFLibraryRegistryPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFVersion.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFVersion.java
deleted file mode 100644
index 1f77c4f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/JSFVersion.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>JSF Version</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getJSFVersion()
- * @model
- * @generated
- */
-public final class JSFVersion extends AbstractEnumerator {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The '<em><b>V1 1</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>V1 1</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #V1_1_LITERAL
-	 * @model name="v1_1"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int V1_1 = 1;
-
-	/**
-	 * The '<em><b>V1 2</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>V1 2</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #V1_2_LITERAL
-	 * @model name="v1_2"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int V1_2 = 2;
-
-	/**
-	 * The '<em><b>UNKNOWN</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>UNKNOWN</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #UNKNOWN_LITERAL
-	 * @model
-	 * @generated
-	 * @ordered
-	 */
-	public static final int UNKNOWN = -1;
-
-	/**
-	 * The '<em><b>V1 1</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #V1_1
-	 * @generated
-	 * @ordered
-	 */
-	public static final JSFVersion V1_1_LITERAL = new JSFVersion(V1_1, "v1_1");
-
-	/**
-	 * The '<em><b>V1 2</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #V1_2
-	 * @generated
-	 * @ordered
-	 */
-	public static final JSFVersion V1_2_LITERAL = new JSFVersion(V1_2, "v1_2");
-
-	/**
-	 * The '<em><b>UNKNOWN</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #UNKNOWN
-	 * @generated
-	 * @ordered
-	 */
-	public static final JSFVersion UNKNOWN_LITERAL = new JSFVersion(UNKNOWN, "UNKNOWN");
-
-	/**
-	 * An array of all the '<em><b>JSF Version</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final JSFVersion[] VALUES_ARRAY =
-		new JSFVersion[] {
-			V1_1_LITERAL,
-			V1_2_LITERAL,
-			UNKNOWN_LITERAL,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>JSF Version</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>JSF Version</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static JSFVersion get(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			JSFVersion result = VALUES_ARRAY[i];
-			if (result.toString().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>JSF Version</b></em>' literal with the specified value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static JSFVersion get(int value) {
-		switch (value) {
-			case V1_1: return V1_1_LITERAL;
-			case V1_2: return V1_2_LITERAL;
-			case UNKNOWN: return UNKNOWN_LITERAL;
-		}
-		return null;	
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private JSFVersion(int value, String name) {
-		super(value, name);
-	}
-
-	/**
-	 * Returns the '<em><b>JSF Version</b></em>' literal with the specified
-	 * name like the get(String) method does, but will return UNKNOWN instead
-	 * of null if the name is not recognized.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public static JSFVersion getJSFVersion(String name) {
-		JSFVersion version = get(name);
-		if (version == null) {
-			version = UNKNOWN_LITERAL;
-		}
-		return version;
-	}
-
-} //JSFVersion
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/PluginProvidedJSFLibrary.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/PluginProvidedJSFLibrary.java
deleted file mode 100644
index 5474d9d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/PluginProvidedJSFLibrary.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Plugin Provided JSF Library</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getPluginID <em>Plugin ID</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getPluginProvidedJSFLibrary()
- * @model
- * @generated
- */
-public interface PluginProvidedJSFLibrary extends JSFLibrary{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Plugin ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Plugin ID</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Plugin ID</em>' attribute.
-	 * @see #setPluginID(String)
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#getPluginProvidedJSFLibrary_PluginID()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getPluginID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary#getPluginID <em>Plugin ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Plugin ID</em>' attribute.
-	 * @see #getPluginID()
-	 * @generated
-	 */
-	void setPluginID(String value);
-
-} // PluginProvidedJSFLibrary
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java
deleted file mode 100644
index 0673b38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.adapter;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-
-/**
- * EMF adapter that attempts to always maintain a default implementation
- * JSFLibrary upon addition and removal of JSFLibrary instances and upon
- * changing of a JSFLibrary instance's implementation property.
- * 
- * @author Ian Trimble - Oracle
- */
-public class MaintainDefaultImplementationAdapter extends AdapterImpl {
-
-	private static MaintainDefaultImplementationAdapter INSTANCE =
-		new MaintainDefaultImplementationAdapter();
-
-	/**
-	 * Gets the single instance of this adapter.
-	 * 
-	 * @return The single instance of this adapter.
-	 */
-	public static MaintainDefaultImplementationAdapter getInstance() {
-		return INSTANCE;
-	}
-
-	/**
-	 * Called to notify this adapter that a change has occured.
-	 * 
-	 * @param notification EMF Notification instance
-	 */
-	public void notifyChanged(Notification notification) {
-		Object objNotifier = notification.getNotifier();
-		if (objNotifier instanceof JSFLibraryRegistry) {
-			int eventType = notification.getEventType();
-			switch (eventType) {
-				case Notification.ADD:
-					Object objNewValue = notification.getNewValue();
-					if (objNewValue instanceof JSFLibrary) {
-						libraryAdded((JSFLibrary)objNewValue);
-					}
-					break;
-				case Notification.REMOVE:
-					Object objOldValue = notification.getOldValue();
-					if (objOldValue instanceof JSFLibrary) {
-						libraryRemoved((JSFLibrary)objOldValue);
-					}
-					break;
-			}
-		} else if (objNotifier instanceof JSFLibrary) {
-			if (notification.getFeatureID(JSFLibrary.class) == JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION) {
-				implementationFlagSet((JSFLibrary)objNotifier);
-			}
-		}
-	}
-
-	/**
-	 * Checks if the library added is an implementation and, if so, makes it
-	 * the default implementation if it is the only implementation.
-	 * 
-	 * @param library JSFLibrary instance
-	 */
-	protected void libraryAdded(JSFLibrary library) {
-		if (library != null && library.isImplementation()) {
-			JSFLibraryRegistry jsfLibReg = JSFCorePlugin.getDefault().getJSFLibraryRegistry();
-			EList impls = jsfLibReg.getImplJSFLibraries();
-			if (impls.size() == 1) {
-				jsfLibReg.setDefaultImplementation(library);
-			}
-		}
-	}
-
-	/**
-	 * Checks if the library removed is the default implementation and, if so,
-	 * makes the first remaining implementation the new default or nulls out
-	 * the default implementation if no other implementation remains. 
-	 * 
-	 * @param library JSFLibrary instance
-	 */
-	protected void libraryRemoved(JSFLibrary library) {
-		if (library != null && library.isImplementation()) {
-			JSFLibraryRegistry jsfLibReg = JSFCorePlugin.getDefault().getJSFLibraryRegistry();
-			JSFLibrary defaultImpl = jsfLibReg.getDefaultImplementation(); 
-			if (defaultImpl == null || library.getID().equals(defaultImpl.getID())) { 
-				setNewDefaultImplementation();
-			}
-		}
-	}
-
-	/**
-	 * Checks if the implementation flag of the JSFLibrary has been changed
-	 * such that it is now eligible to become the default implementation or
-	 * such that it is no longer eligible as the default implementation and
-	 * sets the default implementation appropriately. Note that the passed
-	 * JSFLibrary instance must have been added to the model before calling
-	 * this method for it to have any effect.
-	 * 
-	 * @param library JSFLibrary instance
-	 */
-	protected void implementationFlagSet(JSFLibrary library) {
-		JSFLibraryRegistry jsfLibReg = JSFCorePlugin.getDefault().getJSFLibraryRegistry();
-		if (jsfLibReg != null) {
-			JSFLibrary defaultImpl = jsfLibReg.getDefaultImplementation();
-			if (
-					library.isImplementation() &&
-					defaultImpl == null
-			) {
-				jsfLibReg.setDefaultImplementation(library);
-			} else if (
-					!library.isImplementation() &&
-					(defaultImpl != null && library.getID() == defaultImpl.getID())
-			) {
-				setNewDefaultImplementation();
-			}
-		}
-	}
-
-	/**
-	 * Sets the first available JSFLibrary marked as an implementation as the
-	 * default implementation or sets the default implementation to null if no
-	 * JSFLibrary is marked as an implementation.
-	 */
-	protected void setNewDefaultImplementation() {
-		JSFLibraryRegistry jsfLibReg = JSFCorePlugin.getDefault().getJSFLibraryRegistry();
-		EList impls = jsfLibReg.getImplJSFLibraries();
-		if (impls.size() > 0) {
-			jsfLibReg.setDefaultImplementation((JSFLibrary)impls.get(0));
-		} else {
-			jsfLibReg.setDefaultImplementation(null);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/ArchiveFileImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/ArchiveFileImpl.java
deleted file mode 100644
index 279e86f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/ArchiveFileImpl.java
+++ /dev/null
@@ -1,659 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Archive File</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#isRelativeToWorkspace <em>Relative To Workspace</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#getSourceLocation <em>Source Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#getRelativeDestLocation <em>Relative Dest Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#getJSFLibrary <em>JSF Library</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ArchiveFileImpl extends EObjectImpl implements ArchiveFile {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #isRelativeToWorkspace() <em>Relative To Workspace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRelativeToWorkspace()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean RELATIVE_TO_WORKSPACE_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isRelativeToWorkspace() <em>Relative To Workspace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRelativeToWorkspace()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean relativeToWorkspace = RELATIVE_TO_WORKSPACE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSourceLocation() <em>Source Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SOURCE_LOCATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSourceLocation() <em>Source Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected String sourceLocation = SOURCE_LOCATION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRelativeDestLocation() <em>Relative Dest Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRelativeDestLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String RELATIVE_DEST_LOCATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRelativeDestLocation() <em>Relative Dest Location</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRelativeDestLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected String relativeDestLocation = RELATIVE_DEST_LOCATION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ArchiveFileImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return JSFLibraryRegistryPackage.eINSTANCE.getArchiveFile();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSourceLocation() {
-		return sourceLocation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Enhanced to not only set the location but also to attempt to determine
-	 * if the location passed is relative to the current workspace. If so, only
-	 * the relative location is stored. If not, the full location as passed is
-	 * stored and the relativeToWorkspace property is set to false. To override
-	 * this behaviour and set the absolute location as passed regardless, call
-	 * setRelativeToWorkspace(false) BEFORE calling this method.
-	 *  
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void setSourceLocation(String newSourceLocation) {
-		String oldSourceLocation = sourceLocation;
-		if (relativeToWorkspace) {
-			IWorkspaceRoot workspaceRoot = getWorkspaceRoot();
-			if (workspaceRoot != null) {
-				IPath wsRootPath = workspaceRoot.getLocation();
-				IPath srcPath = new Path(newSourceLocation);
-				if (workspaceRoot.findMember(srcPath) != null) {
-					sourceLocation = newSourceLocation;
-				} else if (wsRootPath.isPrefixOf(srcPath)) {
-					int segmentsMatched = wsRootPath.matchingFirstSegments(srcPath);
-					srcPath = srcPath.removeFirstSegments(segmentsMatched).setDevice(null);
-					sourceLocation = srcPath.toOSString();
-				} else {
-					sourceLocation = newSourceLocation;
-					relativeToWorkspace = false;
-				}
-			}
-		} else {
-			sourceLocation = newSourceLocation;
-		}
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION, oldSourceLocation, sourceLocation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isRelativeToWorkspace() {
-		return relativeToWorkspace;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * To override workspace-relative recognition behaviour, be sure to call
-	 * this method with a false value BEFORE calling setLocation(String).
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRelativeToWorkspace(boolean newRelativeToWorkspace) {
-		boolean oldRelativeToWorkspace = relativeToWorkspace;
-		relativeToWorkspace = newRelativeToWorkspace;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE, oldRelativeToWorkspace, relativeToWorkspace));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getRelativeDestLocation() {
-		return relativeDestLocation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRelativeDestLocation(String newRelativeDestLocation) {
-		String oldRelativeDestLocation = relativeDestLocation;
-		relativeDestLocation = newRelativeDestLocation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION, oldRelativeDestLocation, relativeDestLocation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibrary getJSFLibrary() {
-		if (eContainerFeatureID != JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY) return null;
-		return (JSFLibrary)eContainer;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setJSFLibrary(JSFLibrary newJSFLibrary) {
-		if (newJSFLibrary != eContainer || (eContainerFeatureID != JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY && newJSFLibrary != null)) {
-			if (EcoreUtil.isAncestor(this, newJSFLibrary))
-				throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
-			NotificationChain msgs = null;
-			if (eContainer != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newJSFLibrary != null)
-				msgs = ((InternalEObject)newJSFLibrary).eInverseAdd(this, JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES, JSFLibrary.class, msgs);
-			msgs = eBasicSetContainer((InternalEObject)newJSFLibrary, JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY, newJSFLibrary, newJSFLibrary));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getPath() {
-		String path = null;
-		String resolvedSourceLocation = getResolvedSourceLocation();
-		if (resolvedSourceLocation != null) {
-			int iPos = resolvedSourceLocation.lastIndexOf('/');
-			if (iPos < 0) {
-				iPos = resolvedSourceLocation.lastIndexOf('\\');
-			}
-			if (iPos < 1) {
-				path = ""; //$NON-NLS-1$
-			} else {
-				path = resolvedSourceLocation.substring(0, iPos);
-			}
-		}
-		return path;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getName() {
-		String name = null;
-		String resolvedSourceLocation = getResolvedSourceLocation();
-		if (resolvedSourceLocation != null) {
-			int iPos = resolvedSourceLocation.lastIndexOf('/');
-			if (iPos < 0) {
-				iPos = resolvedSourceLocation.lastIndexOf('\\');
-			}
-			if (iPos < 0 || iPos == resolvedSourceLocation.length() - 1) {
-				name = resolvedSourceLocation;
-			} else {
-				name = resolvedSourceLocation.substring(iPos + 1);
-			}
-		}
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean exists() {
-		boolean exists = false;
-		if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
-			Bundle bundle = getBundle();
-			if (bundle != null) {
-				exists = bundle.getEntry(sourceLocation) != null;
-			}
-		} else {
-			String resolvedSourceLocation = getResolvedSourceLocation();
-			if (resolvedSourceLocation != null) {
-				exists = new File(resolvedSourceLocation).exists();
-			}
-		}
-		return exists;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean equals(Object object) {
-		boolean equal = false;
-		if (object != null && object instanceof ArchiveFile) {
-			String resolvedSourceLocation = getResolvedSourceLocation();
-			String objResolvedSourceLocation = ((ArchiveFile)object).getResolvedSourceLocation();
-			if (resolvedSourceLocation == null && objResolvedSourceLocation == null) {
-				equal = true;
-			} else if (resolvedSourceLocation != null) {
-				equal = resolvedSourceLocation.equals(objResolvedSourceLocation);
-			}
-		}
-		return equal;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public int hashCode() {
-		return getResolvedSourceLocation() != null ? getResolvedSourceLocation().hashCode() : 0;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean copyTo(String baseDestLocation) {
-		boolean copied = false;
-		InputStream in = null;
-		OutputStream out = null;
-		IPath outPath = new Path(baseDestLocation);
-		if (relativeDestLocation != null) {
-			outPath = outPath.append(relativeDestLocation);
-		}
-		outPath = outPath.append(getName());
-		try {
-			if (!outPath.toFile().exists()) {
-				out = new FileOutputStream(outPath.toOSString());
-			} else {
-				return copied;
-			}
-			if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
-				Bundle bundle = getBundle();
-				URL inURL = bundle.getEntry(sourceLocation);
-				if (inURL != null) {
-					in = inURL.openStream();
-				} else {
-					JSFCorePlugin.log(
-							IStatus.ERROR,
-							NLS.bind(Messages.ArchiveFileImpl_CannotLocatePluginRelativeFile,
-									sourceLocation));
-					return copied;
-				}
-			} else {
-				in = new FileInputStream(getResolvedSourceLocation());
-			}
-			byte[] buf = new byte[1024];
-			int len = 0;
-			while ((len = in.read(buf)) > 0) {
-				out.write(buf, 0, len);
-			}
-			copied = true;
-		} catch(FileNotFoundException fnfe) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.ArchiveFileImpl_CannotCopyFile, fnfe);
-		} catch(IOException ioe) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.ArchiveFileImpl_CannotCopyFile, ioe);
-		} finally {
-			try {
-				if (in != null) {
-					in.close();
-				}
-				if (out != null) {
-					out.close();
-				}
-			} catch(IOException ioe) {
-				JSFCorePlugin.log(IStatus.WARNING, Messages.ArchiveFileImpl_CannotCloseFile, ioe);
-			}
-		}
-		return copied;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getResolvedSourceLocation() {
-		String resolvedSourceLocation = null;
-		if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
-			Bundle bundle = getBundle();
-			if (bundle != null) {
-				String bundleLocation= bundle.getLocation();
-				if (bundleLocation != null) {
-					resolvedSourceLocation = appendSeparator(bundleLocation) + sourceLocation; 
-				} else {
-					resolvedSourceLocation = sourceLocation;
-				}
-			} else {
-				resolvedSourceLocation = sourceLocation;
-			}
-		} else {
-			if (isRelativeToWorkspace()) {
-				IWorkspaceRoot workspaceRoot = getWorkspaceRoot();
-				if (workspaceRoot != null) {
-					String workspaceLocation = workspaceRoot.getLocation().toOSString();
-					if (workspaceLocation != null) {
-						resolvedSourceLocation = appendSeparator(workspaceLocation) + sourceLocation;
-					} else {
-						resolvedSourceLocation = sourceLocation;
-					}
-				} else {
-					resolvedSourceLocation = sourceLocation;
-				}
-			} else {
-				resolvedSourceLocation = sourceLocation;
-			}
-		}
-		return resolvedSourceLocation;
-	}
-
-	/**
-	 * Gets the Bundle instance by parent PluginProvidedJSFLibrary instance's
-	 * pluginID property, if and only if the parent JSFLibrary instance IS a
-	 * PluginProvidedJSFLibrary, else returns null.
-	 * @return Bundle instance, or null if not located or applicable
-	 */
-	protected Bundle getBundle() {
-		Bundle bundle = null;
-		if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
-			String pluginID = ((PluginProvidedJSFLibrary)getJSFLibrary()).getPluginID();
-			if (pluginID != null) {
-				bundle = Platform.getBundle(pluginID);
-			}
-		}
-		return bundle;
-	}
-
-	/**
-	 * Gets the IWorkspaceRoot instance. 
-	 * @return IWorkspaceRoot instance
-	 */
-	protected IWorkspaceRoot getWorkspaceRoot() {
-		IWorkspaceRoot workspaceRoot = null;
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		if (workspace != null) {
-			workspaceRoot = workspace.getRoot();
-		}
-		return workspaceRoot;
-	}
-
-	protected String appendSeparator(String path) {
-		String newPath = null;
-		if (!path.endsWith("\\") && !path.endsWith("/")) { //$NON-NLS-1$ //$NON-NLS-2$
-			newPath = path + System.getProperty("file.separator"); //$NON-NLS-1$
-		} else {
-			newPath = path;
-		}
-		return newPath;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-					if (eContainer != null)
-						msgs = eBasicRemoveFromContainer(msgs);
-					return eBasicSetContainer(otherEnd, JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY, msgs);
-				default:
-					return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-					return eBasicSetContainer(null, JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
-		if (eContainerFeatureID >= 0) {
-			switch (eContainerFeatureID) {
-				case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-					return eContainer.eInverseRemove(this, JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES, JSFLibrary.class, msgs);
-				default:
-					return eDynamicBasicRemoveFromContainer(msgs);
-			}
-		}
-		return eContainer.eInverseRemove(this, EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
-				return isRelativeToWorkspace() ? Boolean.TRUE : Boolean.FALSE;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
-				return getSourceLocation();
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
-				return getRelativeDestLocation();
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				return getJSFLibrary();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
-				setRelativeToWorkspace(((Boolean)newValue).booleanValue());
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
-				setSourceLocation((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
-				setRelativeDestLocation((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				setJSFLibrary((JSFLibrary)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
-				setRelativeToWorkspace(RELATIVE_TO_WORKSPACE_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
-				setSourceLocation(SOURCE_LOCATION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
-				setRelativeDestLocation(RELATIVE_DEST_LOCATION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				setJSFLibrary((JSFLibrary)null);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
-				return relativeToWorkspace != RELATIVE_TO_WORKSPACE_EDEFAULT;
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
-				return SOURCE_LOCATION_EDEFAULT == null ? sourceLocation != null : !SOURCE_LOCATION_EDEFAULT.equals(sourceLocation);
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
-				return RELATIVE_DEST_LOCATION_EDEFAULT == null ? relativeDestLocation != null : !RELATIVE_DEST_LOCATION_EDEFAULT.equals(relativeDestLocation);
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
-				return getJSFLibrary() != null;
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (RelativeToWorkspace: ");
-		result.append(relativeToWorkspace);
-		result.append(", SourceLocation: ");
-		result.append(sourceLocation);
-		result.append(", RelativeDestLocation: ");
-		result.append(relativeDestLocation);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ArchiveFileImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryImpl.java
deleted file mode 100644
index 2986563..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryImpl.java
+++ /dev/null
@@ -1,560 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.adapter.MaintainDefaultImplementationAdapter;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>JSF Library</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#getID <em>ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#getJSFVersion <em>JSF Version</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#isDeployed <em>Deployed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#isImplementation <em>Implementation</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryImpl#getArchiveFiles <em>Archive Files</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class JSFLibraryImpl extends EObjectImpl implements JSFLibrary {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getID() <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getID() <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getJSFVersion() <em>JSF Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getJSFVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final JSFVersion JSF_VERSION_EDEFAULT = JSFVersion.UNKNOWN_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getJSFVersion() <em>JSF Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getJSFVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected JSFVersion jsfVersion = JSF_VERSION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isDeployed() <em>Deployed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isDeployed()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean DEPLOYED_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isDeployed() <em>Deployed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isDeployed()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean deployed = DEPLOYED_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isImplementation() <em>Implementation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isImplementation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IMPLEMENTATION_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isImplementation() <em>Implementation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isImplementation()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean implementation = IMPLEMENTATION_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getArchiveFiles() <em>Archive Files</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getArchiveFiles()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList archiveFiles = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Enhanced to not only create an instance but also to set an initial ID
-	 * (which can be reset later) and to add the
-	 * MaintainDefaultImplementationAdapter to the list of adapters.
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected JSFLibraryImpl() {
-		super();
-		//set initial ID; will be overwritten from XML if already persisted
-		setID(String.valueOf(System.currentTimeMillis()));
-		//add adapter to maintain a default implementation
-		eAdapters().add(MaintainDefaultImplementationAdapter.getInstance());
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return JSFLibraryRegistryPackage.eINSTANCE.getJSFLibrary();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getID() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setID(String newID) {
-		String oldID = id;
-		id = newID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY__ID, oldID, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFVersion getJSFVersion() {
-		return jsfVersion;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setJSFVersion(JSFVersion newJSFVersion) {
-		JSFVersion oldJSFVersion = jsfVersion;
-		jsfVersion = newJSFVersion == null ? JSF_VERSION_EDEFAULT : newJSFVersion;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION, oldJSFVersion, jsfVersion));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isDeployed() {
-		return deployed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDeployed(boolean newDeployed) {
-		boolean oldDeployed = deployed;
-		deployed = newDeployed;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED, oldDeployed, deployed));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isImplementation() {
-		return implementation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setImplementation(boolean newImplementation) {
-		boolean oldImplementation = implementation;
-		implementation = newImplementation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION, oldImplementation, implementation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getArchiveFiles() {
-		if (archiveFiles == null) {
-			archiveFiles = new EObjectContainmentWithInverseEList(ArchiveFile.class, this, JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES, JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY);
-		}
-		return archiveFiles;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean containsArchiveFile(String fullPath) {
-		boolean contains = false;
-		if (fullPath != null) {
-			Iterator itArchiveFiles = getArchiveFiles().iterator();
-			while (itArchiveFiles.hasNext()) {
-				ArchiveFile archiveFile = (ArchiveFile)itArchiveFiles.next();
-				if (fullPath.equals(archiveFile.getResolvedSourceLocation())) {
-					contains = true;
-					break;
-				}
-			}
-		}
-		return contains;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public JSFLibrary getWorkingCopy() {
-		JSFLibrary workingCopyLib = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibrary();
-		workingCopyLib.setID(getID());
-		workingCopyLib.setName(getName());
-		workingCopyLib.setJSFVersion(getJSFVersion());
-		workingCopyLib.setDeployed(isDeployed());
-		workingCopyLib.setImplementation(isImplementation());
-		Iterator itArchiveFiles = getArchiveFiles().iterator();
-		while (itArchiveFiles.hasNext()) {
-			ArchiveFile srcArchiveFile = (ArchiveFile)itArchiveFiles.next();
-			ArchiveFile destArchiveFile = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-			destArchiveFile.setRelativeToWorkspace(srcArchiveFile.isRelativeToWorkspace());
-			destArchiveFile.setSourceLocation(srcArchiveFile.getSourceLocation());
-			destArchiveFile.setRelativeDestLocation(srcArchiveFile.getRelativeDestLocation());
-			workingCopyLib.getArchiveFiles().add(destArchiveFile);
-		}
-		return workingCopyLib;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void updateValues(JSFLibrary otherLibrary) {
-		if (otherLibrary != null) {
-			setID(otherLibrary.getID());
-			setName(otherLibrary.getName());
-			setJSFVersion(otherLibrary.getJSFVersion());
-			setDeployed(otherLibrary.isDeployed());
-			setImplementation(otherLibrary.isImplementation());
-			Iterator itArchiveFiles = otherLibrary.getArchiveFiles().iterator();
-			getArchiveFiles().clear();
-			while (itArchiveFiles.hasNext()) {
-				ArchiveFile srcArchiveFile = (ArchiveFile)itArchiveFiles.next();
-				ArchiveFile destArchiveFile = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-				destArchiveFile.setRelativeToWorkspace(srcArchiveFile.isRelativeToWorkspace());
-				destArchiveFile.setSourceLocation(srcArchiveFile.getSourceLocation());
-				destArchiveFile.setRelativeDestLocation(srcArchiveFile.getRelativeDestLocation());
-				getArchiveFiles().add(destArchiveFile);
-			}
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean copyTo(String baseDestLocation) {
-		boolean allCopied = true;
-		Iterator itFiles = getArchiveFiles().iterator();
-		while (itFiles.hasNext()) {
-			ArchiveFile archiveFile = (ArchiveFile)itFiles.next();
-			boolean copied = archiveFile.copyTo(baseDestLocation);
-			allCopied = allCopied && copied;
-		}
-		return allCopied;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-					return ((InternalEList)getArchiveFiles()).basicAdd(otherEnd, msgs);
-				default:
-					return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-					return ((InternalEList)getArchiveFiles()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ID:
-				return getID();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__NAME:
-				return getName();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION:
-				return getJSFVersion();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED:
-				return isDeployed() ? Boolean.TRUE : Boolean.FALSE;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION:
-				return isImplementation() ? Boolean.TRUE : Boolean.FALSE;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				return getArchiveFiles();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ID:
-				setID((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__NAME:
-				setName((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION:
-				setJSFVersion((JSFVersion)newValue);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED:
-				setDeployed(((Boolean)newValue).booleanValue());
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION:
-				setImplementation(((Boolean)newValue).booleanValue());
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				getArchiveFiles().clear();
-				getArchiveFiles().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ID:
-				setID(ID_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION:
-				setJSFVersion(JSF_VERSION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED:
-				setDeployed(DEPLOYED_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION:
-				setImplementation(IMPLEMENTATION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				getArchiveFiles().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__JSF_VERSION:
-				return jsfVersion != JSF_VERSION_EDEFAULT;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__DEPLOYED:
-				return deployed != DEPLOYED_EDEFAULT;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__IMPLEMENTATION:
-				return implementation != IMPLEMENTATION_EDEFAULT;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES:
-				return archiveFiles != null && !archiveFiles.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (ID: ");
-		result.append(id);
-		result.append(", Name: ");
-		result.append(name);
-		result.append(", JSFVersion: ");
-		result.append(jsfVersion);
-		result.append(", Deployed: ");
-		result.append(deployed);
-		result.append(", Implementation: ");
-		result.append(implementation);
-		result.append(')');
-		return result.toString();
-	}
-
-} //JSFLibraryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryFactoryImpl.java
deleted file mode 100644
index d7ce56e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryFactoryImpl.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class JSFLibraryRegistryFactoryImpl extends EFactoryImpl implements JSFLibraryRegistryFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY: return createJSFLibraryRegistry();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY: return createJSFLibrary();
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE: return createArchiveFile();
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY: return createPluginProvidedJSFLibrary();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object createFromString(EDataType eDataType, String initialValue) {
-		switch (eDataType.getClassifierID()) {
-			case JSFLibraryRegistryPackage.JSF_VERSION: {
-				JSFVersion result = JSFVersion.get(initialValue);
-				if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
-				return result;
-			}
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-		switch (eDataType.getClassifierID()) {
-			case JSFLibraryRegistryPackage.JSF_VERSION:
-				return instanceValue == null ? null : instanceValue.toString();
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistry createJSFLibraryRegistry() {
-		JSFLibraryRegistryImpl jsfLibraryRegistry = new JSFLibraryRegistryImpl();
-		return jsfLibraryRegistry;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibrary createJSFLibrary() {
-		JSFLibraryImpl jsfLibrary = new JSFLibraryImpl();
-		return jsfLibrary;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ArchiveFile createArchiveFile() {
-		ArchiveFileImpl archiveFile = new ArchiveFileImpl();
-		return archiveFile;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PluginProvidedJSFLibrary createPluginProvidedJSFLibrary() {
-		PluginProvidedJSFLibraryImpl pluginProvidedJSFLibrary = new PluginProvidedJSFLibraryImpl();
-		return pluginProvidedJSFLibrary;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryPackage getJSFLibraryRegistryPackage() {
-		return (JSFLibraryRegistryPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static JSFLibraryRegistryPackage getPackage() {
-		return JSFLibraryRegistryPackage.eINSTANCE;
-	}
-
-} //JSFLibraryRegistryFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryImpl.java
deleted file mode 100644
index f460618..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryImpl.java
+++ /dev/null
@@ -1,419 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>JSF Library Registry</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl#getDefaultImplementationID <em>Default Implementation ID</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl#getJSFLibraries <em>JSF Libraries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.JSFLibraryRegistryImpl#getPluginProvidedJSFLibraries <em>Plugin Provided JSF Libraries</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class JSFLibraryRegistryImpl extends EObjectImpl implements JSFLibraryRegistry {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getDefaultImplementationID() <em>Default Implementation ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultImplementationID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DEFAULT_IMPLEMENTATION_ID_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getDefaultImplementationID() <em>Default Implementation ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultImplementationID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String defaultImplementationID = DEFAULT_IMPLEMENTATION_ID_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getJSFLibraries() <em>JSF Libraries</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getJSFLibraries()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList jsfLibraries = null;
-
-	/**
-	 * The cached value of the '{@link #getPluginProvidedJSFLibraries() <em>Plugin Provided JSF Libraries</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPluginProvidedJSFLibraries()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList pluginProvidedJSFLibraries = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected JSFLibraryRegistryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return JSFLibraryRegistryPackage.eINSTANCE.getJSFLibraryRegistry();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getDefaultImplementationID() {
-		return defaultImplementationID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultImplementationID(String newDefaultImplementationID) {
-		String oldDefaultImplementationID = defaultImplementationID;
-		defaultImplementationID = newDefaultImplementationID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID, oldDefaultImplementationID, defaultImplementationID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getJSFLibraries() {
-		if (jsfLibraries == null) {
-			jsfLibraries = new EObjectContainmentEList(JSFLibrary.class, this, JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES);
-		}
-		return jsfLibraries;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPluginProvidedJSFLibraries() {
-		if (pluginProvidedJSFLibraries == null) {
-			pluginProvidedJSFLibraries = new EObjectContainmentEList(PluginProvidedJSFLibrary.class, this, JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES);
-		}
-		return pluginProvidedJSFLibraries;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public JSFLibrary getDefaultImplementation() {
-		return getJSFLibraryByID(getDefaultImplementationID());
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public void setDefaultImplementation(JSFLibrary implementation) {
-		if (implementation != null) {
-			setDefaultImplementationID(implementation.getID());
-		} else {
-			setDefaultImplementationID(null);
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public JSFLibrary getJSFLibraryByID(String ID) {
-		JSFLibrary library = null;
-		if (ID != null) {
-			Iterator itLibs = getAllJSFLibraries().iterator();
-			while (itLibs.hasNext()) {
-				JSFLibrary curLib = (JSFLibrary)itLibs.next();
-				if (ID.equals(curLib.getID())) {
-					library = curLib;
-					break;
-				}
-			}
-		}
-		return library;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getJSFLibrariesByName(String name) {
-		EList libraries = new BasicEList();
-		if (name != null) {
-			Iterator itLibs = getAllJSFLibraries().iterator();
-			while(itLibs.hasNext()) {
-				JSFLibrary curLib = (JSFLibrary)itLibs.next();
-				if (name.equals(curLib.getName())) {
-					libraries.add(curLib);
-				}
-			}
-		}
-		return libraries;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * This is a convenience method to return an EList of JSFLibrary instances
-	 * that are marked as JSF implementations; while all instances are valid
-	 * references, the returned EList should not be used for additions and/or
-	 * removals of instances (use the EList returned by getJSFLibraries()).
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getImplJSFLibraries() {
-		EList implementations = new BasicEList();
-		Iterator itLibs = getAllJSFLibraries().iterator();
-		while (itLibs.hasNext()) {
-			JSFLibrary lib = (JSFLibrary)itLibs.next();
-			if (lib.isImplementation()) {
-				implementations.add(lib);
-			}
-		}
-		return implementations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * This is a convenience method to return an EList of JSFLibrary instances
-	 * that are not marked as JSF implementations; while all instances are
-	 * valid references, the returned EList should not be used for additions
-	 * and/or removals of instances (use the EList returned by
-	 * getJSFLibraries()).
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getNonImplJSFLibraries() {
-		EList nonImplementations = new BasicEList();
-		Iterator itLibs = getAllJSFLibraries().iterator();
-		while (itLibs.hasNext()) {
-			JSFLibrary lib = (JSFLibrary)itLibs.next();
-			if (!lib.isImplementation()) {
-				nonImplementations.add(lib);
-			}
-		}
-		return nonImplementations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * This is a convenience method to return an EList of JSFLibrary instances
-	 * and PluginProvidedJSFLibrary instances; while all instances are valid
-	 * references, the returned EList should not be used for additions and/or
-	 * removals of instances (use the EList returned by getJSFLibraries()).
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public EList getAllJSFLibraries() {
-		EList allLibs = new BasicEList();
-		allLibs.addAll(getJSFLibraries());
-		allLibs.addAll(getPluginProvidedJSFLibraries());
-		return allLibs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean addJSFLibrary(JSFLibrary library) {
-		boolean added = false;
-		if (library instanceof PluginProvidedJSFLibrary) {
-			added = getPluginProvidedJSFLibraries().add(library);
-		} else {
-			added = getJSFLibraries().add(library);
-		}
-		return added;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public boolean removeJSFLibrary(JSFLibrary library) {
-		boolean removed = false;
-		if (library instanceof PluginProvidedJSFLibrary) {
-			removed = getPluginProvidedJSFLibraries().remove(library);
-		} else {
-			removed = getJSFLibraries().remove(library);
-		}
-		return removed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-					return ((InternalEList)getJSFLibraries()).basicRemove(otherEnd, msgs);
-				case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-					return ((InternalEList)getPluginProvidedJSFLibraries()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID:
-				return getDefaultImplementationID();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				return getJSFLibraries();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				return getPluginProvidedJSFLibraries();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID:
-				setDefaultImplementationID((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				getJSFLibraries().clear();
-				getJSFLibraries().addAll((Collection)newValue);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				getPluginProvidedJSFLibraries().clear();
-				getPluginProvidedJSFLibraries().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID:
-				setDefaultImplementationID(DEFAULT_IMPLEMENTATION_ID_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				getJSFLibraries().clear();
-				return;
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				getPluginProvidedJSFLibraries().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID:
-				return DEFAULT_IMPLEMENTATION_ID_EDEFAULT == null ? defaultImplementationID != null : !DEFAULT_IMPLEMENTATION_ID_EDEFAULT.equals(defaultImplementationID);
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__JSF_LIBRARIES:
-				return jsfLibraries != null && !jsfLibraries.isEmpty();
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES:
-				return pluginProvidedJSFLibraries != null && !pluginProvidedJSFLibraries.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (DefaultImplementationID: ");
-		result.append(defaultImplementationID);
-		result.append(')');
-		return result.toString();
-	}
-
-} //JSFLibraryRegistryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryPackageImpl.java
deleted file mode 100644
index 6d496c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/JSFLibraryRegistryPackageImpl.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EOperation;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class JSFLibraryRegistryPackageImpl extends EPackageImpl implements JSFLibraryRegistryPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass jsfLibraryRegistryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass jsfLibraryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass archiveFileEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass pluginProvidedJSFLibraryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum jsfVersionEEnum = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private JSFLibraryRegistryPackageImpl() {
-		super(eNS_URI, JSFLibraryRegistryFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static JSFLibraryRegistryPackage init() {
-		if (isInited) return (JSFLibraryRegistryPackage)EPackage.Registry.INSTANCE.getEPackage(JSFLibraryRegistryPackage.eNS_URI);
-
-		// Obtain or create and register package
-		JSFLibraryRegistryPackageImpl theJSFLibraryRegistryPackage = (JSFLibraryRegistryPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof JSFLibraryRegistryPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new JSFLibraryRegistryPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theJSFLibraryRegistryPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theJSFLibraryRegistryPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theJSFLibraryRegistryPackage.freeze();
-
-		return theJSFLibraryRegistryPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getJSFLibraryRegistry() {
-		return jsfLibraryRegistryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibraryRegistry_DefaultImplementationID() {
-		return (EAttribute)jsfLibraryRegistryEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getJSFLibraryRegistry_JSFLibraries() {
-		return (EReference)jsfLibraryRegistryEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getJSFLibraryRegistry_PluginProvidedJSFLibraries() {
-		return (EReference)jsfLibraryRegistryEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getJSFLibrary() {
-		return jsfLibraryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_ID() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_Name() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_JSFVersion() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_Deployed() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getJSFLibrary_Implementation() {
-		return (EAttribute)jsfLibraryEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getJSFLibrary_ArchiveFiles() {
-		return (EReference)jsfLibraryEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getArchiveFile() {
-		return archiveFileEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArchiveFile_SourceLocation() {
-		return (EAttribute)archiveFileEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArchiveFile_RelativeToWorkspace() {
-		return (EAttribute)archiveFileEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArchiveFile_RelativeDestLocation() {
-		return (EAttribute)archiveFileEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getArchiveFile_JSFLibrary() {
-		return (EReference)archiveFileEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPluginProvidedJSFLibrary() {
-		return pluginProvidedJSFLibraryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPluginProvidedJSFLibrary_PluginID() {
-		return (EAttribute)pluginProvidedJSFLibraryEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getJSFVersion() {
-		return jsfVersionEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryFactory getJSFLibraryRegistryFactory() {
-		return (JSFLibraryRegistryFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		jsfLibraryRegistryEClass = createEClass(JSF_LIBRARY_REGISTRY);
-		createEAttribute(jsfLibraryRegistryEClass, JSF_LIBRARY_REGISTRY__DEFAULT_IMPLEMENTATION_ID);
-		createEReference(jsfLibraryRegistryEClass, JSF_LIBRARY_REGISTRY__JSF_LIBRARIES);
-		createEReference(jsfLibraryRegistryEClass, JSF_LIBRARY_REGISTRY__PLUGIN_PROVIDED_JSF_LIBRARIES);
-
-		jsfLibraryEClass = createEClass(JSF_LIBRARY);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__ID);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__NAME);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__JSF_VERSION);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__DEPLOYED);
-		createEAttribute(jsfLibraryEClass, JSF_LIBRARY__IMPLEMENTATION);
-		createEReference(jsfLibraryEClass, JSF_LIBRARY__ARCHIVE_FILES);
-
-		archiveFileEClass = createEClass(ARCHIVE_FILE);
-		createEAttribute(archiveFileEClass, ARCHIVE_FILE__RELATIVE_TO_WORKSPACE);
-		createEAttribute(archiveFileEClass, ARCHIVE_FILE__SOURCE_LOCATION);
-		createEAttribute(archiveFileEClass, ARCHIVE_FILE__RELATIVE_DEST_LOCATION);
-		createEReference(archiveFileEClass, ARCHIVE_FILE__JSF_LIBRARY);
-
-		pluginProvidedJSFLibraryEClass = createEClass(PLUGIN_PROVIDED_JSF_LIBRARY);
-		createEAttribute(pluginProvidedJSFLibraryEClass, PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID);
-
-		// Create enums
-		jsfVersionEEnum = createEEnum(JSF_VERSION);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Add supertypes to classes
-		pluginProvidedJSFLibraryEClass.getESuperTypes().add(this.getJSFLibrary());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(jsfLibraryRegistryEClass, JSFLibraryRegistry.class, "JSFLibraryRegistry", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getJSFLibraryRegistry_DefaultImplementationID(), ecorePackage.getEString(), "DefaultImplementationID", "", 0, 1, JSFLibraryRegistry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getJSFLibraryRegistry_JSFLibraries(), this.getJSFLibrary(), null, "JSFLibraries", null, 0, -1, JSFLibraryRegistry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getJSFLibraryRegistry_PluginProvidedJSFLibraries(), this.getPluginProvidedJSFLibrary(), null, "PluginProvidedJSFLibraries", null, 0, -1, JSFLibraryRegistry.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getImplJSFLibraries");
-
-		addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getNonImplJSFLibraries");
-
-		EOperation op = addEOperation(jsfLibraryRegistryEClass, this.getJSFLibrary(), "getJSFLibraryByID");
-		addEParameter(op, ecorePackage.getEString(), "ID");
-
-		op = addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getJSFLibrariesByName");
-		addEParameter(op, ecorePackage.getEString(), "name");
-
-		addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEEList(), "getAllJSFLibraries");
-
-		op = addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEBoolean(), "addJSFLibrary");
-		addEParameter(op, this.getJSFLibrary(), "library");
-
-		op = addEOperation(jsfLibraryRegistryEClass, ecorePackage.getEBoolean(), "removeJSFLibrary");
-		addEParameter(op, this.getJSFLibrary(), "library");
-
-		addEOperation(jsfLibraryRegistryEClass, this.getJSFLibrary(), "getDefaultImplementation");
-
-		op = addEOperation(jsfLibraryRegistryEClass, null, "setDefaultImplementation");
-		addEParameter(op, this.getJSFLibrary(), "implementation");
-
-		initEClass(jsfLibraryEClass, JSFLibrary.class, "JSFLibrary", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getJSFLibrary_ID(), ecorePackage.getEString(), "ID", "", 1, 1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getJSFLibrary_Name(), ecorePackage.getEString(), "Name", null, 1, 1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getJSFLibrary_JSFVersion(), this.getJSFVersion(), "JSFVersion", "UNKNOWN", 1, 1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getJSFLibrary_Deployed(), ecorePackage.getEBoolean(), "Deployed", "true", 1, 1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getJSFLibrary_Implementation(), ecorePackage.getEBoolean(), "Implementation", "false", 1, 1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getJSFLibrary_ArchiveFiles(), this.getArchiveFile(), this.getArchiveFile_JSFLibrary(), "ArchiveFiles", null, 0, -1, JSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		op = addEOperation(jsfLibraryEClass, ecorePackage.getEBoolean(), "containsArchiveFile");
-		addEParameter(op, ecorePackage.getEString(), "fullPath");
-
-		addEOperation(jsfLibraryEClass, this.getJSFLibrary(), "getWorkingCopy");
-
-		op = addEOperation(jsfLibraryEClass, null, "updateValues");
-		addEParameter(op, this.getJSFLibrary(), "otherLibrary");
-
-		op = addEOperation(jsfLibraryEClass, ecorePackage.getEBoolean(), "copyTo");
-		addEParameter(op, ecorePackage.getEString(), "baseDestLocation");
-
-		initEClass(archiveFileEClass, ArchiveFile.class, "ArchiveFile", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getArchiveFile_RelativeToWorkspace(), ecorePackage.getEBoolean(), "RelativeToWorkspace", "true", 1, 1, ArchiveFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getArchiveFile_SourceLocation(), ecorePackage.getEString(), "SourceLocation", null, 1, 1, ArchiveFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getArchiveFile_RelativeDestLocation(), ecorePackage.getEString(), "RelativeDestLocation", null, 1, 1, ArchiveFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getArchiveFile_JSFLibrary(), this.getJSFLibrary(), this.getJSFLibrary_ArchiveFiles(), "JSFLibrary", null, 1, 1, ArchiveFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		addEOperation(archiveFileEClass, ecorePackage.getEString(), "getName");
-
-		addEOperation(archiveFileEClass, ecorePackage.getEString(), "getPath");
-
-		addEOperation(archiveFileEClass, ecorePackage.getEBoolean(), "exists");
-
-		op = addEOperation(archiveFileEClass, ecorePackage.getEBoolean(), "equals");
-		addEParameter(op, ecorePackage.getEJavaObject(), "object");
-
-		addEOperation(archiveFileEClass, ecorePackage.getEInt(), "hashCode");
-
-		op = addEOperation(archiveFileEClass, ecorePackage.getEBoolean(), "copyTo");
-		addEParameter(op, ecorePackage.getEString(), "baseDestLocation");
-
-		addEOperation(archiveFileEClass, ecorePackage.getEString(), "getResolvedSourceLocation");
-
-		initEClass(pluginProvidedJSFLibraryEClass, PluginProvidedJSFLibrary.class, "PluginProvidedJSFLibrary", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPluginProvidedJSFLibrary_PluginID(), ecorePackage.getEString(), "pluginID", null, 1, 1, PluginProvidedJSFLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Initialize enums and add enum literals
-		initEEnum(jsfVersionEEnum, JSFVersion.class, "JSFVersion");
-		addEEnumLiteral(jsfVersionEEnum, JSFVersion.V1_1_LITERAL);
-		addEEnumLiteral(jsfVersionEEnum, JSFVersion.V1_2_LITERAL);
-		addEEnumLiteral(jsfVersionEEnum, JSFVersion.UNKNOWN_LITERAL);
-
-		// Create resource
-		createResource(eNS_URI);
-	}
-
-} //JSFLibraryRegistryPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/PluginProvidedJSFLibraryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/PluginProvidedJSFLibraryImpl.java
deleted file mode 100644
index c474714..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/impl/PluginProvidedJSFLibraryImpl.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Plugin Provided JSF Library</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.PluginProvidedJSFLibraryImpl#getPluginID <em>Plugin ID</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PluginProvidedJSFLibraryImpl extends JSFLibraryImpl implements PluginProvidedJSFLibrary {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getPluginID() <em>Plugin ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPluginID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PLUGIN_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPluginID() <em>Plugin ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPluginID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String pluginID = PLUGIN_ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PluginProvidedJSFLibraryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return JSFLibraryRegistryPackage.eINSTANCE.getPluginProvidedJSFLibrary();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPluginID() {
-		return pluginID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPluginID(String newPluginID) {
-		String oldPluginID = pluginID;
-		pluginID = newPluginID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID, oldPluginID, pluginID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__ARCHIVE_FILES:
-					return ((InternalEList)getArchiveFiles()).basicAdd(otherEnd, msgs);
-				default:
-					return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__ARCHIVE_FILES:
-					return ((InternalEList)getArchiveFiles()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__ID:
-				return getID();
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__NAME:
-				return getName();
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__JSF_VERSION:
-				return getJSFVersion();
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__DEPLOYED:
-				return isDeployed() ? Boolean.TRUE : Boolean.FALSE;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__IMPLEMENTATION:
-				return isImplementation() ? Boolean.TRUE : Boolean.FALSE;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__ARCHIVE_FILES:
-				return getArchiveFiles();
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID:
-				return getPluginID();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__ID:
-				setID((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__NAME:
-				setName((String)newValue);
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__JSF_VERSION:
-				setJSFVersion((JSFVersion)newValue);
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__DEPLOYED:
-				setDeployed(((Boolean)newValue).booleanValue());
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__IMPLEMENTATION:
-				setImplementation(((Boolean)newValue).booleanValue());
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__ARCHIVE_FILES:
-				getArchiveFiles().clear();
-				getArchiveFiles().addAll((Collection)newValue);
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID:
-				setPluginID((String)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__ID:
-				setID(ID_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__JSF_VERSION:
-				setJSFVersion(JSF_VERSION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__DEPLOYED:
-				setDeployed(DEPLOYED_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__IMPLEMENTATION:
-				setImplementation(IMPLEMENTATION_EDEFAULT);
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__ARCHIVE_FILES:
-				getArchiveFiles().clear();
-				return;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID:
-				setPluginID(PLUGIN_ID_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__JSF_VERSION:
-				return jsfVersion != JSF_VERSION_EDEFAULT;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__DEPLOYED:
-				return deployed != DEPLOYED_EDEFAULT;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__IMPLEMENTATION:
-				return implementation != IMPLEMENTATION_EDEFAULT;
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__ARCHIVE_FILES:
-				return archiveFiles != null && !archiveFiles.isEmpty();
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY__PLUGIN_ID:
-				return PLUGIN_ID_EDEFAULT == null ? pluginID != null : !PLUGIN_ID_EDEFAULT.equals(pluginID);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (pluginID: ");
-		result.append(pluginID);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PluginProvidedJSFLibraryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryAdapterFactory.java
deleted file mode 100644
index 4002101..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryAdapterFactory.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage
- * @generated
- */
-public class JSFLibraryRegistryAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static JSFLibraryRegistryPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = JSFLibraryRegistryPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected JSFLibraryRegistrySwitch modelSwitch =
-		new JSFLibraryRegistrySwitch() {
-			public Object caseJSFLibraryRegistry(JSFLibraryRegistry object) {
-				return createJSFLibraryRegistryAdapter();
-			}
-			public Object caseJSFLibrary(JSFLibrary object) {
-				return createJSFLibraryAdapter();
-			}
-			public Object caseArchiveFile(ArchiveFile object) {
-				return createArchiveFileAdapter();
-			}
-			public Object casePluginProvidedJSFLibrary(PluginProvidedJSFLibrary object) {
-				return createPluginProvidedJSFLibraryAdapter();
-			}
-			public Object defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry <em>JSF Library Registry</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry
-	 * @generated
-	 */
-	public Adapter createJSFLibraryRegistryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary <em>JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary
-	 * @generated
-	 */
-	public Adapter createJSFLibraryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile <em>Archive File</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile
-	 * @generated
-	 */
-	public Adapter createArchiveFileAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary <em>Plugin Provided JSF Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary
-	 * @generated
-	 */
-	public Adapter createPluginProvidedJSFLibraryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //JSFLibraryRegistryAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceFactoryImpl.java
deleted file mode 100644
index e369138..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceFactoryImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.resource.Resource;
-
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource Factory</b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryResourceImpl
- * @generated
- */
-public class JSFLibraryRegistryResourceFactoryImpl extends ResourceFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Creates an instance of the resource factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistryResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Resource createResource(URI uri) {
-		Resource result = new JSFLibraryRegistryResourceImpl(uri);
-		return result;
-	}
-
-} //JSFLibraryRegistryResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceImpl.java
deleted file mode 100644
index 5d67dcf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistryResourceImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource </b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util.JSFLibraryRegistryResourceFactoryImpl
- * @generated
- */
-public class JSFLibraryRegistryResourceImpl extends XMLResourceImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param uri the URI of the new resource.
-	 * @generated
-	 */
-	public JSFLibraryRegistryResourceImpl(URI uri) {
-		super(uri);
-	}
-
-} //JSFLibraryRegistryResourceImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistrySwitch.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistrySwitch.java
deleted file mode 100644
index 58863bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/util/JSFLibraryRegistrySwitch.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage
- * @generated
- */
-public class JSFLibraryRegistrySwitch {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005 Oracle Corporation";
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static JSFLibraryRegistryPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public JSFLibraryRegistrySwitch() {
-		if (modelPackage == null) {
-			modelPackage = JSFLibraryRegistryPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-		else {
-			List eSuperTypes = theEClass.getESuperTypes();
-			return
-				eSuperTypes.isEmpty() ?
-					defaultCase(theEObject) :
-					doSwitch((EClass)eSuperTypes.get(0), theEObject);
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case JSFLibraryRegistryPackage.JSF_LIBRARY_REGISTRY: {
-				JSFLibraryRegistry jsfLibraryRegistry = (JSFLibraryRegistry)theEObject;
-				Object result = caseJSFLibraryRegistry(jsfLibraryRegistry);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case JSFLibraryRegistryPackage.JSF_LIBRARY: {
-				JSFLibrary jsfLibrary = (JSFLibrary)theEObject;
-				Object result = caseJSFLibrary(jsfLibrary);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case JSFLibraryRegistryPackage.ARCHIVE_FILE: {
-				ArchiveFile archiveFile = (ArchiveFile)theEObject;
-				Object result = caseArchiveFile(archiveFile);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case JSFLibraryRegistryPackage.PLUGIN_PROVIDED_JSF_LIBRARY: {
-				PluginProvidedJSFLibrary pluginProvidedJSFLibrary = (PluginProvidedJSFLibrary)theEObject;
-				Object result = casePluginProvidedJSFLibrary(pluginProvidedJSFLibrary);
-				if (result == null) result = caseJSFLibrary(pluginProvidedJSFLibrary);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>JSF Library Registry</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>JSF Library Registry</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseJSFLibraryRegistry(JSFLibraryRegistry object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>JSF Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>JSF Library</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseJSFLibrary(JSFLibrary object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Archive File</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Archive File</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseArchiveFile(ArchiveFile object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Plugin Provided JSF Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Plugin Provided JSF Library</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePluginProvidedJSFLibrary(PluginProvidedJSFLibrary object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //JSFLibraryRegistrySwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/launch/JSFFileURL.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/launch/JSFFileURL.java
deleted file mode 100644
index 31fae2e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/launch/JSFFileURL.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.launch;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.j2ee.internal.web.jfaces.extension.FileURL;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.j2ee.webapplication.Servlet;
-import org.eclipse.jst.j2ee.webapplication.ServletMapping;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.jst.jsf.core.internal.project.facet.JSFUtils;
-
-/**
- * Extends the FileURL extension-point so that a JSF JSP page
- * can have it's URL mapped to the Faces Servlet using the servlet-mapping 
- * specified in the web.xml file
- * 
- * @author Gerry Kessler - Oracle
- *
- */
-public class JSFFileURL implements FileURL {
-
-	/**
-	 * If this is a JSP page, this will return a URL using the first valid servlet-mapping to the Faces Servlet
-	 * if found.   If the faces servlet is not defined in the web.xml or there is no servlet-mapping, this will return null.
-	 * 
-	 * Currently (11/21/05) this will only work if file extension is .jsf 
-	 * 
-	 * @see org.eclipse.jst.j2ee.internal.web.jfaces.extension.FileURL#getFileURL(org.eclipse.core.resources.IResource, org.eclipse.core.runtime.IPath)
-	 */
-	public IPath getFileURL(IResource resource, IPath existingURL) {
-		WebArtifactEdit webAppEdit = null;
-
-		//temporarily, we will filter on jsp file extensions only.
-		if (!resource.getFileExtension().equalsIgnoreCase("jsp")) //$NON-NLS-1$
-			return null;
-		
-		try {
-			//is this is a Faces Project with a Faces Servlet?
-			//we will not check to see if facet is installed.  
-			// check to see if this resource is a JSF page (currently always true) and then,
-			//if servlet is present, we will change the url based on first mapping found 
-			webAppEdit = JSFUtils.getWebArtifactEditForRead(resource.getProject());
-			if (webAppEdit != null){
-				WebApp webApp = webAppEdit.getWebApp();
-				if (webApp != null){
-					Servlet servlet = JSFUtils.findJSFServlet(webAppEdit.getWebApp());
-					if (servlet == null)//if no faces servlet, do nothing
-						return null;
-					
-					//if not a JSF page, do nothing
-					if (!isJSFPage(resource))
-						return null;
-					
-					Iterator mappings = servlet.getMappings().iterator();
-					ServletMapping map = null;
-					while (mappings.hasNext()){
-						map = (ServletMapping)mappings.next();
-						
-						String foundFileExtension = getFileExtensionFromMap(map);
-						if (foundFileExtension != null)
-							return existingURL.removeFileExtension().addFileExtension(foundFileExtension);
-
-						String foundDirectoryMapping = getDirectoryMapping(map);
-						if (foundDirectoryMapping != null){						
-							return new Path(foundDirectoryMapping).append(existingURL); 
-						}
-					}					
-				}
-			}
-			return null;
-		} finally {
-			if (webAppEdit != null)
-				webAppEdit.dispose();
-		}
-	}
-	
-	private String getDirectoryMapping(ServletMapping map) {
-		IPath extPath = new Path(map.getUrlPattern());
-		if (extPath != null){
-			String ext = extPath.getFileExtension();
-			if (ext == null){
-				String lastSeg = extPath.lastSegment();
-				if (lastSeg.equals("*")) //$NON-NLS-1$
-					return extPath.removeLastSegments(1).toString();
-				else 
-					return extPath.toString();				
-			}
-		}
-		return null;
-	}
-	
-	private String getFileExtensionFromMap(ServletMapping map) {
-		IPath extPath = new Path(map.getUrlPattern());
-		if (extPath != null){
-			String ext = extPath.getFileExtension();
-			if (ext != null && !ext.equals("")) //$NON-NLS-1$
-				return ext;
-		}
-		return null;
-	}
-	
-	private boolean isJSFPage(IResource resource) {
-		// currently always return true.
-		// need to find quick way of determining whether this is a JSF JSP Page
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/messages.properties
deleted file mode 100644
index c5d6c71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/messages.properties
+++ /dev/null
@@ -1,35 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# 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:
-#    Gerry Kessler - initial API and implementation
-#    Ian Trimble - change key names for use with org.eclipse.osgi.util.NLS
-###############################################################################
-JSFLibraryRegistry_ErrorCreatingURL=Error creating URL for JSF Library Registry
-JSFLibraryRegistry_NoLoadCreatingNew=Could not load JSF Library Registry; creating new registry
-JSFLibraryRegistry_ErrorSaving=Error saving JSF Library Registry
-JSFLibraryRegistry_DEFAULT_IMPL_LABEL=<Default>
-JSFLibraryRegistry_ErrorLoadingFromExtPt=Error while loading JSF Libaries from extension points
-
-JSFFacetInstallDataModelProvider_ValidateServletName=Specify a servlet name to use
-JSFFacetInstallDataModelProvider_ValidateJSFImpl=A default JSF implementation has not been set. Please use 'Add...' to create a library or un-check deploy jars
-JSFFacetInstallDataModelProvider_ValidateConfigFilePath=The configuration file path is not valid
-JSFFacetInstallDataModelProvider_ValidateConfigFileEmpty=Specify a valid name and location for JSF configuration file
-JSFFacetInstallDataModelProvider_ValidateConfigFileRelative1=Configuration file must be specified relative to the project's {0} folder
-JSFFacetInstallDataModelProvider_ValidateConfigFileRelative2=Configuration file must be located in the project's {0} folder
-JSFFacetInstallDataModelProvider_ValidateConfigFileXML=JSF configuration file must be an XML file
-JSFFacetInstallDataModelProvider_ValidateConfigFileSlashes=Configuration file path must not contain "\\"s.   Use "/" instead.
-
-ArchiveFileImpl_CannotCopyFile=Cannot copy file
-ArchiveFileImpl_CannotCloseFile=Cannot close file
-ArchiveFileImpl_CannotLocatePluginRelativeFile=Cannot locate plugin-relative file "{0}"
-
-PluginProvidedJSFLibraryCreationHelper_ErrorCreating=Unable to create JSF Library: {0}
-PluginProvidedJSFLibraryCreationHelper_ErrorMultipleDefinition={0} defined multiple times in {1}
-
-JSFUtils_ErrorCreatingConfigFile=Error creating config file
-JSFUtils_ErrorClosingConfigFile=Error closing config file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.java
deleted file mode 100644
index 4b2b458..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.project.facet;
- 
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetInstallDataModelProperties;
-
-/**
- * Defines properties used by the JSF facet install data model.
- * 
- * @author Gerry Kessler - Oracle
- */
-public interface IJSFFacetInstallDataModelProperties extends IFacetInstallDataModelProperties {
-	 public static final String IMPLEMENTATION = "IJSFFacetInstallDataModelProperties.IMPLEMENTATION"; //$NON-NLS-1$
-	 public static final String DEPLOY_IMPLEMENTATION = "IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION"; //$NON-NLS-1$
-	 public static final String CONFIG_PATH = "IJSFFacetInstallDataModelProperties.CONFIG_PATH"; //$NON-NLS-1$
-	 public static final String SERVLET_NAME = "IJSFFacetInstallDataModelProperties.SERVLET_NAME"; //$NON-NLS-1$
-	 public static final String SERVLET_URL_PATTERNS = "IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS"; //$NON-NLS-1$
-	 public static final String WEBCONTENT_DIR = "IJSFFacetInstallDataModelProperties.WEBCONTENT_DIR"; //$NON-NLS-1$
-}
-
- 
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java
deleted file mode 100644
index 283f495..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.componentcore.datamodel.FacetInstallDataModelProvider;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationPropertiesNew;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-/**
- * Provides a data model used by the JSF facet install.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFFacetInstallDataModelProvider extends
-		FacetInstallDataModelProvider implements
-		IJSFFacetInstallDataModelProperties {
-
-	private String 	errorMessage;
-	private IPath 	webContentPath;
-	
-	public Set getPropertyNames() {
-		Set names = super.getPropertyNames();
-		names.add(IMPLEMENTATION);
-		names.add(DEPLOY_IMPLEMENTATION);
-		names.add(CONFIG_PATH);
-		names.add(SERVLET_NAME);
-		names.add(SERVLET_URL_PATTERNS);
-		names.add(WEBCONTENT_DIR);
-		return names;
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(IMPLEMENTATION)) {
-			if (JSFCorePlugin.getDefault().getJSFLibraryRegistry() == null)
-				return null;
-			return JSFCorePlugin.getDefault().getJSFLibraryRegistry().getDefaultImplementation();
-		} else if (propertyName.equals(DEPLOY_IMPLEMENTATION)) {
-			return Boolean.TRUE;
-		} else if (propertyName.equals(CONFIG_PATH)) {
-			return JSFUtils.JSF_DEFAULT_CONFIG_PATH; //$NON-NLS-1$;
-		} else if (propertyName.equals(SERVLET_NAME)) {
-			return "Faces Servlet"; //$NON-NLS-1$
-		} else if (propertyName.equals(SERVLET_URL_PATTERNS)) {
-			return new String[] { "*.faces" }; //$NON-NLS-1$
-		} else if (propertyName.equals(FACET_ID)) {
-			return JSFCorePlugin.FACET_ID;
-		} else if (propertyName.equals(WEBCONTENT_DIR)){
-			return "WebContent";  //not sure I need this
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-	public IStatus validate(String name) {
-		errorMessage = null;
-		if (name.equals(IMPLEMENTATION) && getBooleanProperty(DEPLOY_IMPLEMENTATION)) {
-			return validateImpl((JSFLibrary)getProperty(IMPLEMENTATION));
-		} else if (name.equals(CONFIG_PATH)) {
-			return validateConfigLocation(getStringProperty(CONFIG_PATH));
-		} else if (name.equals(SERVLET_NAME)) {			
-			return validateServletName(getStringProperty(SERVLET_NAME));
-		}
-		return super.validate(name);
-	}
-	
-	private IStatus validateServletName(String servletName) {
-		if (servletName == null || servletName.trim().length() == 0) {
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateServletName;
-			return WTPCommonPlugin.createErrorStatus(errorMessage);				
-		}
-		else 
-			return OK_STATUS;
-	}
-
-	private IStatus validateImpl(JSFLibrary impl) {
-		if (impl == null) {
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateJSFImpl; 
-		}
-		if (errorMessage != null)
-			return WTPCommonPlugin.createErrorStatus(errorMessage);
-		else
-			return OK_STATUS;
-	}
-	
-	private IStatus validateConfigLocation(String text) {
-		if (text == null || text.trim().equals("")) { //$NON-NLS-1$
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileEmpty;
-			return WTPCommonPlugin.createErrorStatus(errorMessage);
-		}
-		text = text.trim();
-		
-		if (getProjectPath() == null) //this circumstance occurs on page init
-			return OK_STATUS;
-		
-		IPath fullPath = getProjectPath().append(text);
-		IPath passedPath = new Path(text);
-		if (!fullPath.isValidPath(text)){
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateConfigFilePath;
-			return WTPCommonPlugin.createErrorStatus(errorMessage);
-		}
-		
-		//FIXME:  check for valid file path also [passedPath.toFile().isFile()] 
-		if (text.toLowerCase().lastIndexOf(".xml") != text.length() - 4) { //$NON-NLS-1$
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileXML;
-			return WTPCommonPlugin.createErrorStatus(errorMessage);
-		}
-		
-		if (text.lastIndexOf("\\") >= 0){ //$NON-NLS-1$
-			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileSlashes;
-			return WTPCommonPlugin.createErrorStatus(errorMessage);
-		} 
-//		if (1 == 1){
-//			//FIXME!!!!
-//			//until i can figure out how to get WebContent dir from the WebApp config,
-//			//skip validation here
-//			return OK_STATUS;
-//		}
-		
-		if (passedPath.getDevice() != null) {
-			errorMessage = NLS.bind(
-					Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileRelative1,
-					getWebContentFolder().removeFirstSegments(getWebContentFolder().segmentCount() - 1).toString());
-			return WTPCommonPlugin.createErrorStatus(errorMessage);
-		}
-
-		IPath setPath = getWebContentFolder().append(passedPath);
-		if (!getWebContentFolder().isPrefixOf(setPath)) {
-			errorMessage = NLS.bind(
-					Messages.JSFFacetInstallDataModelProvider_ValidateConfigFileRelative2,
-					getWebContentFolder().removeFirstSegments(getWebContentFolder().segmentCount() - 1).toString());
-			return WTPCommonPlugin.createErrorStatus(errorMessage);
-		}
-
-		return OK_STATUS;
-	}
-	
-	private IPath getProjectPath() {
-		String projName = (String)getProperty(FACET_PROJECT_NAME);
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
-		if (project.exists()){
-			return project.getLocation();
-		} else {
-			IDataModel projModel = (IDataModel)getProperty(MASTER_PROJECT_DM);
-			if (projModel.getBooleanProperty(IProjectCreationPropertiesNew.USE_DEFAULT_LOCATION)){
-				return new Path(projModel.getStringProperty(IProjectCreationPropertiesNew.PROJECT_LOCATION)).append(projName);
-			}
-			else {
-				return new Path(projModel.getStringProperty(IProjectCreationPropertiesNew.USER_DEFINED_LOCATION)).append(projName);
-			}	
-		}
-	}
-
-	private IPath getWebContentFolder() {
-		//One can get here 2 ways:
-		//if web app exists and user is adding a facet, or
-		// if creating a new web app.   
-		if (webContentPath != null)
-			return webContentPath;
-		
-		WebArtifactEdit webApp = null;
-		try {
-			String projName = model.getStringProperty(IFacetDataModelProperties.FACET_PROJECT_NAME);
-			IProject proj = ResourcesPlugin.getWorkspace().getRoot()
-					.getProject(projName);
-			webApp = JSFUtils.getWebArtifactEditForRead(proj);
-			if (webApp != null) {
-				webContentPath = JSFUtils.getWebArtifactEditForRead(proj)
-					.getDeploymentDescriptorPath().removeLastSegments(2);
-				return webContentPath;
-			} else {
-				webContentPath = new Path(getStringProperty(WEBCONTENT_DIR));
-				return webContentPath;
-			}
-				
-		} finally {
-			if (webApp != null) {
-				webApp.dispose();
-			}
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java
deleted file mode 100644
index e9374c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.j2ee.webapplication.Servlet;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * JSF Facet Install Delegate for WTP faceted web projects.
- * 
- * Uses <code>com.eclispe.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider<code> for model
- * 	 <li> TODO: creates JSF Application Model
- * 	 <li> creates JSF configuration file if not present
- * 	 <li> updates web.xml for: servlet, servlet-mapping and context-param
- * 	 <li> adds implementation jars to WEB-INF/lib if user requests
- * 
- * @see com.eclispe.jst.jsf.core.internal.project.facet.JSFFacetInstallConfig
- * @see com.eclispe.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider
- * @author Gerry Kessler - Oracle
- * @since M1
- */
-public class JSFFacetInstallDelegate implements IDelegate {
-
-	public void execute(final IProject project, final IProjectFacetVersion fv,
-			final Object cfg, final IProgressMonitor monitor)
-
-	throws CoreException
-
-	{
-
-		if (monitor != null) {
-			monitor.beginTask("", 1); //$NON-NLS-1$
-		}
-
-		try {
-			IDataModel config = null;
-
-			if (cfg != null) {
-				config = (IDataModel) cfg;
-			} else {
-				//FIXME: how would we hit this???
-//				config = new JSFFacetInstallConfig();
-//				config.setJsfImplID(jsfImplID);
-			}
-			// Create JSF App Model
-			// tbd
-
-			// Add JSF Impls to WEB-INF/lib
-			deployJSFLibraries(project, config, monitor);
-
-			// Create config file
-			createConfigFile(project, fv, config, monitor);
-
-			// Update web model
-			createServletAndModifyWebXML(project, config, monitor);
-
-			if (monitor != null) {
-				monitor.worked(1);
-			}
-
-		} finally {
-			if (monitor != null) {
-				monitor.done();
-			}
-		}
-	}
-
-	private void deployJSFLibraries(IProject project,
-			final IDataModel config, IProgressMonitor monitor) {
-		
-		if (config.getBooleanProperty(IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION)){
-			JSFLibrary impl = (JSFLibrary)config.getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION);
-			if (impl != null){
-				IPath destPath = project.getLocation().append(getWebContentPath(project));
-				impl.copyTo(destPath.toOSString());			
-			}
-		}
-	}
-
-	
-	private void createConfigFile(final IProject project,
-			final IProjectFacetVersion fv, final IDataModel config,
-			IProgressMonitor monitor) {
-		final IPath configPath = resolveConfigPath(project, config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH));
-
-		try {
-			// do not overwrite if the file exists
-			if (!configPath.toFile().exists()) {
-				IWorkspaceRunnable op = new IWorkspaceRunnable(){
-
-					public void run(IProgressMonitor monitor)
-							throws CoreException{ 
-						JSFUtils.createConfigFile(fv.getVersionString(),
-								configPath);
-						project.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-					}
-
-				};
-				op.run(monitor);
-			}
-		} catch (CoreException e) {
-			JSFCorePlugin.getDefault().getMsgLogger().log(e);
-			e.printStackTrace();
-		}
-
-	}
-
-	private void createServletAndModifyWebXML(IProject project,
-			final IDataModel config, IProgressMonitor monitor) {
-		WebApp webApp = null;
-		WebArtifactEdit artifactEdit = null;
-		try {
-			artifactEdit = JSFUtils.getWebArtifactEditForWrite(project);
-			webApp = artifactEdit.getWebApp();
-
-			// create or update servlet ref
-			Servlet servlet = JSFUtils.findJSFServlet(webApp);// check to see
-																// if already
-																// present
-			if (servlet != null) {
-				// remove old mappings
-				JSFUtils.removeURLMappings(webApp, servlet);
-			}
-			
-			servlet = JSFUtils
-					.createOrUpdateServletRef(webApp, config, servlet);
-
-			// init mappings
-			List listOfMappings = getServletMappings(config);
-			JSFUtils.setUpURLMappings(webApp, listOfMappings, servlet);
-
-			// setup context params
-			if (webApp.getVersionID() == J2EEVersionConstants.WEB_2_3_ID)//shouldn't have to do it this way, but that's the way it goes 119442
-				JSFUtils.setupConfigFileContextParamForV2_3(webApp, config);
-			else
-				JSFUtils.setupConfigFileContextParamForV2_4(webApp, config);
-			
-			
-
-		} finally {
-			if (artifactEdit != null) {
-				// save and dispose
-				artifactEdit.saveIfNecessary(monitor);
-				artifactEdit.dispose();
-			}
-		}
-	}
-
-	private List getServletMappings(IDataModel config) {
-		List mappings = new ArrayList();
-		String[] patterns = (String[])config.getProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS);
-		for (int i = 0; i < patterns.length; i++) {
-			String pattern = patterns[i];
-			mappings.add(pattern);
-		}
-
-		return mappings;
-	}
-	
-	private IPath getWebContentPath(IProject project) {
-		WebArtifactEdit web = null;
-		try {
-			web = WebArtifactEdit.getWebArtifactEditForRead(project);
-			IPath webxml = web.getDeploymentDescriptorPath();
-			//remove project name, WEB-INF an web.xml from path
-			IPath webContentPath = webxml.removeLastSegments(2).removeFirstSegments(1);
-			return webContentPath;
-		} finally {
-			if (web != null) {
-				web.dispose();
-			}
-		}
-	}
-	
-	private IPath resolveConfigPath(IProject project, String jsfConfigPath) {
-		// TODO: fix me
-		WebArtifactEdit web = null;
-		try {
-			web = WebArtifactEdit.getWebArtifactEditForRead(project);
-			IPath webxml = web.getDeploymentDescriptorPath();
-			IPath webcontent = webxml.removeLastSegments(2)
-					.removeFirstSegments(1);
-
-			return project.getLocation().append(
-					webcontent.append(new Path(jsfConfigPath)));
-		} finally {
-			if (web != null)
-				web.dispose();
-		}
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java
deleted file mode 100644
index e8371ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jst.j2ee.common.ParamValue;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.j2ee.webapplication.ContextParam;
-import org.eclipse.jst.j2ee.webapplication.Servlet;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * JSF Facet Uninstall Delegate for WTP faceted projects.
- *	
- *	<li> removes JSF servlet, servlet-mappings and context-params
- *	<li> leaves JSF configuration files on disk
- *  <li> removes JSF classpath containers
- *  
- * @author Gerry Kessler - Oracle
- * @since M1
- */
-public class JSFFacetUninstallDelegate implements IDelegate {
-
-	public void execute(IProject project, IProjectFacetVersion fv,
-			Object config, IProgressMonitor monitor) throws CoreException {
-		{
-
-			if (monitor != null) {
-				monitor.beginTask("", 1); //$NON-NLS-1$
-			}
-
-			try {
-
-				// Remove JSF App Model
-
-				// Rempoe JSF Impl Class Container
-				// Add JSF Impl Class Container
-				// final IJavaProject jproj = JavaCore.create(project);
-				// final IPath cont = new
-				// Path(JSFImplContainer.CONTAINER_ID).append(project.getName());
-				// removeClasspathContainer(jproj, cont);
-
-				// remove servlet stuff from web.xml
-				uninstallJSFReferencesFromWebApp(project, monitor);
-
-				if (monitor != null) {
-					monitor.worked(1);
-				}
-			} finally {
-				if (monitor != null) {
-					monitor.done();
-				}
-			}
-		}
-	}
-
-	private void uninstallJSFReferencesFromWebApp(IProject project,
-			IProgressMonitor monitor) {
-		WebArtifactEdit artifactEdit = JSFUtils
-				.getWebArtifactEditForWrite(project);
-		WebApp webApp = artifactEdit.getWebApp();
-
-		try {
-			Servlet servlet = JSFUtils.findJSFServlet(webApp);
-			if (servlet == null)
-				return;
-
-			// remove faces url mappings
-			removeJSFURLMappings(webApp, servlet);
-			// remove context params
-			removeJSFContextParams(webApp, servlet);
-			// remove servlet
-			removeJSFServlet(webApp, servlet);
-
-		} finally {
-			if (artifactEdit != null) {
-				artifactEdit.saveIfNecessary(monitor);
-				artifactEdit.dispose();
-			}
-		}
-
-	}
-
-	private void removeJSFURLMappings(WebApp webApp, Servlet servlet) {
-		while (webApp.getServletMapping(servlet) != null) {
-			webApp.getServletMappings().remove(
-					webApp.getServletMapping(servlet));
-		}
-	}
-
-	private void removeJSFContextParams(WebApp webApp, Servlet servlet) {
-		if (webApp.getVersionID() == J2EEVersionConstants.WEB_2_3_ID){
-			Iterator it = webApp.getContexts().iterator();
-			while (it.hasNext()) {
-				ContextParam cp = (ContextParam) it.next();
-				if (cp.getParamName().equals(JSFUtils.JSF_CONFIG_CONTEXT_PARAM)) {
-					webApp.getContexts().remove(cp);
-					break;
-				}
-			}
-		}
-		else {//could check for 2_4 version here.   
-			//hoping that the API gets fixed so I don't need to do any of this version checking
-			Iterator it = webApp.getContextParams().iterator();
-			while (it.hasNext()) {
-				ParamValue cp = (ParamValue) it.next();
-				if (cp.getName().equals(JSFUtils.JSF_CONFIG_CONTEXT_PARAM)) {
-					webApp.getContextParams().remove(cp);
-					break;
-				}
-			}
-		}
-	}
-
-	private void removeJSFServlet(WebApp webApp, Servlet servlet) {
-		webApp.getServlets().remove(servlet);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils.java
deleted file mode 100644
index 8b77ed3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-
-package org.eclipse.jst.jsf.core.internal.project.facet;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.j2ee.common.CommonFactory;
-import org.eclipse.jst.j2ee.common.ParamValue;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.j2ee.webapplication.ContextParam;
-import org.eclipse.jst.j2ee.webapplication.JSPType;
-import org.eclipse.jst.j2ee.webapplication.Servlet;
-import org.eclipse.jst.j2ee.webapplication.ServletMapping;
-import org.eclipse.jst.j2ee.webapplication.ServletType;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-/**
- * Utility file for JSF model
- * 
- * @author Gerry Kessler - Oracle
- * @since M1
- */
-public class JSFUtils {
-	public static final String JSF_SERVLET_CLASS = "javax.faces.webapp.FacesServlet"; //$NON-NLS-1$
-	public static final String JSF_CONFIG_CONTEXT_PARAM = "javax.faces.CONFIG_FILES"; //$NON-NLS-1$
-	public static final String JSF_DEFAULT_CONFIG_PATH = "/WEB-INF/faces-config.xml"; //$NON-NLS-1$
-
-	/**
-	 * Convenience method for getting writeable WebApp model
-	 * @param IProject
-	 * @return WebArtifactEdit
-	 */
-	public static WebArtifactEdit getWebArtifactEditForWrite(IProject project) {
-		return WebArtifactEdit.getWebArtifactEditForWrite(project);
-	}
-
-	/**
-	 * Convenience method for getting read-only WebApp model
-	 * @param IProject
-	 * @return WebArtifactEdit
-	 */
-	public static WebArtifactEdit getWebArtifactEditForRead(IProject project) {
-		return WebArtifactEdit.getWebArtifactEditForRead(project);
-	}
-
-	/**
-	 * @param webApp
-	 * @return Servlet - the JSF Servlet for the specified WebApp or null if not present
-	 */
-	public static Servlet findJSFServlet(WebApp webApp) {
-		Servlet servlet = null;
-		Iterator it = webApp.getServlets().iterator();
-		while (it.hasNext()) {
-			servlet = (Servlet) it.next();
-			if (servlet.getWebType().isServletType()) {
-				if (((ServletType) servlet.getWebType()).getClassName().equals(
-						JSF_SERVLET_CLASS)) {
-					break;
-				}
-			} else if (servlet.getWebType().isJspType()) {
-				if (((JSPType) servlet.getWebType()).getJspFile().equals(
-						JSF_SERVLET_CLASS)) {
-					break;
-				}
-			}
-		}
-		return servlet;
-	}
-
-	/**
-	 * Creates a stubbed JSF configuration file for specified JSF version and path
-	 * @param String jsfVersion
-	 * @param String configPath
-	 */
-	public static void createConfigFile(String jsfVersion, IPath configPath) {
-		FileOutputStream os = null;
-		PrintWriter pw = null;
-		final String QUOTE = new String(new char[] { '"' });
-		try {
-			IPath dirPath = configPath.removeLastSegments(1);
-			dirPath.toFile().mkdirs();
-			File file = configPath.toFile();
-			file.createNewFile();
-			os = new FileOutputStream(file);
-			pw = new PrintWriter(os);
-			pw.write("<?xml version=" + QUOTE + "1.0" + QUOTE + " encoding=" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					+ QUOTE + "UTF-8" + QUOTE + "?>\n\n"); //$NON-NLS-1$ //$NON-NLS-2$
-
-			if (jsfVersion.equals("1.1")) { //$NON-NLS-1$
-				pw.write("<!DOCTYPE faces-config PUBLIC\n"); //$NON-NLS-1$
-				pw
-						.write("    " //$NON-NLS-1$
-								+ QUOTE
-								+ "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" //$NON-NLS-1$
-								+ QUOTE + "\n"); //$NON-NLS-1$
-				pw.write("    " + QUOTE //$NON-NLS-1$
-						+ "http://java.sun.com/dtd/web-facesconfig_1_1.dtd" //$NON-NLS-1$
-						+ QUOTE + ">\n\n"); //$NON-NLS-1$
-
-				pw.write("<faces-config>\n\n"); //$NON-NLS-1$
-				pw.write("</faces-config>\n"); //$NON-NLS-1$
-			} else if (jsfVersion.equals("1.2")) { //$NON-NLS-1$
-				pw.write("<faces-config\n"); //$NON-NLS-1$
-				pw.write("    " + "xmlns=" + QUOTE //$NON-NLS-1$ //$NON-NLS-2$
-						+ "http://java.sun.com/xml/ns/j2ee" + QUOTE + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-				pw.write("    " + "xmlns:xsi=" + QUOTE //$NON-NLS-1$ //$NON-NLS-2$
-						+ "http://www.w3.org/2001/XMLSchema-instance" + QUOTE //$NON-NLS-1$
-						+ "\n"); //$NON-NLS-1$
-				pw
-						.write("    " //$NON-NLS-1$
-								+ "xsi:schemaLocation=" //$NON-NLS-1$
-								+ QUOTE
-								+ "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-facesconfig_1_2.xsd" //$NON-NLS-1$
-								+ QUOTE + "\n"); //$NON-NLS-1$
-				pw.write("    " + "version=" + QUOTE + "1.2" + QUOTE + ">\n\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				pw.write("</faces-config>\n"); //$NON-NLS-1$
-			}
-
-			pw.close();
-			pw = null;
-		} catch (FileNotFoundException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorCreatingConfigFile, e);
-		} catch (IOException e) {
-			JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorCreatingConfigFile, e);
-		} finally {
-			if (pw != null)
-				pw.close();
-			if (os != null) {
-				try {
-					os.close();
-				} catch (IOException e) {
-					JSFCorePlugin.log(IStatus.ERROR, Messages.JSFUtils_ErrorClosingConfigFile, e);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Creates servlet reference in WebApp if not present or updates servlet name if found
-	 * using the passed configuration.
-	 * 
-	 * @param WebApp webApp
-	 * @param IDataModel config
-	 * @param Servlet servlet
-	 * @return Servlet servlet - if passed servlet was null, will return created servlet
-	 */
-	public static Servlet createOrUpdateServletRef(WebApp webApp,
-			IDataModel config, Servlet servlet) {
-		String displayName = config.getStringProperty(IJSFFacetInstallDataModelProperties.SERVLET_NAME);
-
-		if (servlet == null) {
-			// Create the servlet instance and set up the parameters from data
-			// model
-			servlet = WebapplicationFactory.eINSTANCE.createServlet();
-			servlet.setServletName(displayName);
-
-			ServletType servletType = WebapplicationFactory.eINSTANCE
-					.createServletType();
-			servletType.setClassName(JSF_SERVLET_CLASS);
-			servlet.setWebType(servletType);
-			servlet.setLoadOnStartup(new Integer(1));
-			// Add the servlet to the web application model
-			webApp.getServlets().add(servlet);
-		} else {
-			// update
-			servlet.setServletName(displayName);
-			servlet.setLoadOnStartup(new Integer(1));
-		}
-		return servlet;
-	}
-
-	/**
-	 * Creates servlet-mappings for the servlet
-	 * 
-	 * @param WebApp webApp
-	 * @param List urlMappingList - list of string values to  be used in url-pattern for servlet-mapping
-	 * @param Servlet servlet
-	 */
-	public static void setUpURLMappings(WebApp webApp, List urlMappingList,
-			Servlet servlet) {
-		// Add mappings
-		Iterator it = urlMappingList.iterator();
-		while (it.hasNext()) {
-			String pattern = (String) it.next();
-			ServletMapping mapping = WebapplicationFactory.eINSTANCE
-					.createServletMapping();
-			mapping.setServlet(servlet);
-			mapping.setName(servlet.getServletName());
-			mapping.setUrlPattern(pattern);
-			webApp.getServletMappings().add(mapping);
-		}
-	}
-	
-	/**
-	 * Removes servlet-mappings for servlet using servlet-name.
-	 * @param WebApp webApp
-	 * @param Servlet servlet
-	 */
-	public static void removeURLMappings(WebApp webApp, Servlet servlet) {
-		String servletName = servlet.getServletName();
-		if (servletName != null) {
-			Iterator oldMappings = webApp.getServletMappings().iterator();
-			while (oldMappings.hasNext()) {
-				ServletMapping mapping = (ServletMapping) oldMappings.next();
-				if (mapping.getServlet().getServletName()
-						.equals(servletName)) {
-					webApp.getServletMappings().remove(mapping);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Creates or updates config file context-param in v 2.3 WebApp if non default configuration file is specified.
-	 * @param WebApp webApp
-	 * @param IDataModel config
-	 */
-	public static void setupConfigFileContextParamForV2_3(WebApp webApp,
-			IDataModel config) {
-		// if not default name and location, then add context param
-		ContextParam cp = null;
-		ContextParam foundCP = null;
-		boolean found = false;
-		if (!config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH).equals(JSF_DEFAULT_CONFIG_PATH)) {
-			// check to see if present
-			Iterator it = webApp.getContexts().iterator();
-			while (it.hasNext()) {
-				cp = (ContextParam) it.next();
-				if (cp.getParamName().equals(JSF_CONFIG_CONTEXT_PARAM)) {
-					foundCP = cp;
-					found = true;
-				}
-			}
-			if (!found) {
-				cp = WebapplicationFactory.eINSTANCE.createContextParam();
-				cp.setParamName(JSF_CONFIG_CONTEXT_PARAM);
-				cp.setParamValue(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH));
-				webApp.getContexts().add(cp);
-			} else {
-				cp = foundCP;
-				if (cp.getParamValue().indexOf(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH)) < 0) {
-					String curVal = cp.getParamValue();
-					String val = config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-					if (curVal != null || !curVal.trim().equals("")) { //$NON-NLS-1$
-						val = curVal + ",\n" + val; //$NON-NLS-1$
-					}
-					cp.setParamValue(val);
-				}
-			}
-		}
-	}
-	/**
-	 * Creates or updates config file context-param in v2.4 WebApp  if non default configuration file is specified.
-	 * @param WebApp webApp
-	 * @param IDataModel config
-	 */
-	public static void setupConfigFileContextParamForV2_4(WebApp webApp,
-			IDataModel config) {
-		// if not default name and location, then add context param
-		ParamValue foundCP = null;
-		ParamValue cp = null;
-		boolean found = false;
-		if (!config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH).equals(JSF_DEFAULT_CONFIG_PATH)) {
-			// check to see if present
-			Iterator it = webApp.getContextParams().iterator();
-			while (it.hasNext()) {
-				cp = (ParamValue) it.next();
-				if (cp.getName().equals(JSF_CONFIG_CONTEXT_PARAM)) {
-					foundCP = cp;
-					found = true;
-				}
-			}
-			if (!found) {
-				ParamValue pv = CommonFactory.eINSTANCE.createParamValue();
-				pv.setName(JSF_CONFIG_CONTEXT_PARAM);
-				pv.setValue(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH));
-				webApp.getContextParams().add(pv);
-			} else {
-				cp = foundCP;
-				if (cp.getValue().indexOf(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH)) < 0) {
-					String curVal = cp.getValue();
-					String val = config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-					if (curVal != null || !curVal.trim().equals("")) { //$NON-NLS-1$
-						val = curVal + ",\n" + val; //$NON-NLS-1$
-					}
-					cp.setValue(val);
-				}
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/AbstractJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/AbstractJSFAppConfigLocater.java
deleted file mode 100644
index 8954100..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/AbstractJSFAppConfigLocater.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-/**
- * Abstract implementation of {@link IJSFAppConfigLocater} that provides common
- * locater functionality. {@link IJSFAppConfigLocater} implementations should
- * extend this class or provide similar functionality.
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractJSFAppConfigLocater implements IJSFAppConfigLocater {
-
-	/**
-	 * {@link JSFAppConfigManager} instance to which this locater belongs.
-	 */
-	protected JSFAppConfigManager manager = null;
-
-	/**
-	 * Set of known {@link IJSFAppConfigProvider} instances.
-	 */
-	protected Set configProviders = new LinkedHashSet();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.IJSFAppConfigLocater#setJSFAppConfigManager(org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.JSFAppConfigManager)
-	 */
-	public void setJSFAppConfigManager(JSFAppConfigManager manager) {
-		this.manager = manager;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.IJSFAppConfigLocater#startLocating()
-	 */
-	public abstract void startLocating();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.IJSFAppConfigLocater#stopLocating()
-	 */
-	public abstract void stopLocating();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.IJSFAppConfigLocater#getJSFAppConfigProviders()
-	 */
-	public Set getJSFAppConfigProviders() {
-		return configProviders;
-	}
-
-	/**
-	 * Adds an {@link IJSFAppConfigProvider} instance to the set of known
-	 * instances and notifies {@link JSFAppConfigManager} instance of the
-	 * addition if successful.
-	 * 
-	 * @param configProvider {@link IJSFAppConfigProvider} instance to be
-	 * added.
-	 * @return true if instance was added, else false.
-	 */
-	protected boolean addConfigProvider(IJSFAppConfigProvider configProvider) {
-		boolean added = configProviders.add(configProvider);
-		if (added && manager != null) {
-			manager.notifyJSFAppConfigProvidersChangeListeners(
-					configProvider,
-					JSFAppConfigProvidersChangeEvent.ADDED);
-		}
-		return added;
-	}
-
-	/**
-	 * Removes an {@link IJSFAppConfigProvider} instance from the set of known
-	 * instances and notifies {@link JSFAppConfigManager} instance of the
-	 * removal if successful.
-	 * 
-	 * @param configProvider {@link IJSFAppConfigProvider} instance to be
-	 * removed.
-	 * @return true if instance was removed, else false.
-	 */
-	protected boolean removeConfigProvider(IJSFAppConfigProvider configProvider) {
-		if (configProvider != null) {
-			configProvider.releaseFacesConfigModel();
-		}
-		boolean removed = configProviders.remove(configProvider);
-		if (removed && manager != null) {
-			manager.notifyJSFAppConfigProvidersChangeListeners(
-					configProvider,
-					JSFAppConfigProvidersChangeEvent.REMOVED);
-		}
-		return removed;
-	}
-
-	/**
-	 * Updates known set of {@link IJSFAppConfigProvider} instances by removing
-	 * instances that are in the existing set but not in the passed set and
-	 * adding instances that are in the passed set but not in the existing set.
-	 * Instances that are in both the existing set and the passed set are left
-	 * unchanged. The {@link JSFAppConfigManager} is notified of removals and
-	 * additions, and no notification is sent for instances that are left
-	 * unchanged.
-	 * 
-	 * @param newConfigProviders New set of {@link IJSFAppConfigProvider}
-	 * instances. 
-	 */
-	protected void updateConfigProviders(Set newConfigProviders) {
-		if (newConfigProviders != null) {
-			LinkedHashSet oldConfigProviders = new LinkedHashSet();
-			//iterate over existing set
-			Iterator itConfigProviders = configProviders.iterator();
-			while (itConfigProviders.hasNext()) {
-				IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itConfigProviders.next();
-				//remove provider from new set if it is already in existing set
-				if (!newConfigProviders.remove(configProvider)) {
-					//stage removal of existing provider that is not in new set
-					oldConfigProviders.add(configProvider);
-				}
-			}
-			//remove providers that are not in new set from existing set
-			Iterator itOldConfigProviders = oldConfigProviders.iterator();
-			while (itOldConfigProviders.hasNext()) {
-				IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itOldConfigProviders.next();
-				//call removeConfigProvider(...) method so manager's listeners are notified
-				removeConfigProvider(configProvider);
-			}
-			//add providers that are still in new set to existing set
-			Iterator itNewConfigProviders = newConfigProviders.iterator();
-			while (itNewConfigProviders.hasNext()) {
-				IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itNewConfigProviders.next();
-				//call addConfigProvider(...) method so manager's listeners are notified
-				addConfigProvider(configProvider);
-			}
-		}
-	}
-
-	/**
-	 * Removes all {@link IJSFAppConfigProvider} instances from the known set,
-	 * sending notification of all removals to the {@link JSFAppConfigManager}
-	 * instance.
-	 */
-	protected void removeAllConfigProviders() {
-		updateConfigProviders(Collections.EMPTY_SET);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#finalize()
-	 */
-	protected void finalize() {
-		removeAllConfigProviders();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/ArtifactEditJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/ArtifactEditJSFAppConfigProvider.java
deleted file mode 100644
index 81d0f15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/ArtifactEditJSFAppConfigProvider.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigArtifactEdit;
-
-/**
- * ArtifactEditJSFAppConfigProvider uses FacesConfigArtifactEdit to provide
- * the root element of an application configuration model.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ArtifactEditJSFAppConfigProvider implements IJSFAppConfigProvider {
-
-	/**
-	 * IFile instance that represents an application configuration resource
-	 * file.
-	 */
-	protected IFile appConfigFile = null;
-
-	/**
-	 * FacesConfigArtifactEdit instance used to get the application
-	 * configuration model.
-	 */
-	protected FacesConfigArtifactEdit facesConfigArtifactEdit = null;
-
-	/**
-	 * Creates an instance, storing the passed IFile instance for subsequent
-	 * processing.
-	 * 
-	 * @param appConfigFile IFile instance that represents an application
-	 * configuration resource file
-	 */
-	public ArtifactEditJSFAppConfigProvider(IFile appConfigFile) {
-		this.appConfigFile = appConfigFile;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.IJSFAppConfigProvider#getFacesConfigModel()
-	 */
-	public FacesConfigType getFacesConfigModel() {
-		FacesConfigType facesConfig = null;
-		if (appConfigFile != null) {
-			IProject project = appConfigFile.getProject();
-			IPath appConfigFilePath = JSFAppConfigUtils.getWebContentFolderRelativePath(appConfigFile);
-			if (appConfigFilePath != null) {
-				facesConfigArtifactEdit = FacesConfigArtifactEdit.getFacesConfigArtifactEditForRead(project, appConfigFilePath.toString());
-				if (facesConfigArtifactEdit != null) {
-					facesConfig = facesConfigArtifactEdit.getFacesConfig();
-				}
-			}
-		}
-		return facesConfig;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.IJSFAppConfigProvider#releaseFacesConfigModel()
-	 */
-	public void releaseFacesConfigModel() {
-		if (facesConfigArtifactEdit != null) {
-			facesConfigArtifactEdit.dispose();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object otherObject) {
-		boolean equals = false;
-		if (otherObject != null && otherObject instanceof ArtifactEditJSFAppConfigProvider) {
-			IFile otherAppConfigFile = ((ArtifactEditJSFAppConfigProvider)otherObject).appConfigFile;
-			if (appConfigFile != null) {
-				equals = appConfigFile.equals(otherAppConfigFile);
-			} else {
-				equals = otherAppConfigFile == null;
-			}
-		}
-		return equals;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return appConfigFile != null ? appConfigFile.hashCode() : 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer("ArtifactEditJSFAppConfigProvider["); //$NON-NLS-1$
-		if (appConfigFile != null) {
-			sb.append(appConfigFile.toString());
-		} else {
-			sb.append("null"); //$NON-NLS-1$
-		}
-		sb.append("]"); //$NON-NLS-1$
-		return sb.toString();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#finalize()
-	 */
-	protected void finalize() {
-		releaseFacesConfigModel();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/ContextParamSpecifiedJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/ContextParamSpecifiedJSFAppConfigLocater.java
deleted file mode 100644
index fedc6c6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/ContextParamSpecifiedJSFAppConfigLocater.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig;
-
-import java.util.List;
-
-/**
- * ContextParamSpecifiedJSFAppConfigLocater attempts to locate application
- * configuration files specified by the JSF CONFIG_FILES context parameter.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ContextParamSpecifiedJSFAppConfigLocater extends WebContentRelativeJSFAppConfigLocater {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.AbstractJSFAppConfigLocater#startLocating()
-	 */
-	public void startLocating() {
-		locateProviders();
-		//TODO: add adapter
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.AbstractJSFAppConfigLocater#stopLocating()
-	 */
-	public void stopLocating() {
-		//TODO: remove adapter
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.WebContentRelativeJSFAppConfigLocater#getFilenames()
-	 */
-	protected List getFilenames() {
-		return JSFAppConfigUtils.getConfigFilesFromContextParam(manager.getProject());
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/DefaultJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/DefaultJSFAppConfigLocater.java
deleted file mode 100644
index fcc8fd0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/DefaultJSFAppConfigLocater.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * DefaultJSFAppConfigLocater attempts to locate the default application
- * configuration file, located at "/WEB-INF/faces-config.xml".
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultJSFAppConfigLocater extends WebContentRelativeJSFAppConfigLocater {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.AbstractJSFAppConfigLocater#startLocating()
-	 */
-	public void startLocating() {
-		locateProviders();
-		//TODO: add listener
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.AbstractJSFAppConfigLocater#stopLocating()
-	 */
-	public void stopLocating() {
-		//TODO: remove listener
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.WebContentRelativeJSFAppConfigLocater#getFilenames()
-	 */
-	protected List getFilenames() {
-		List filenames = new ArrayList();
-		filenames.add("WEB-INF/faces-config.xml"); //$NON-NLS-1$
-		return filenames;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/IJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/IJSFAppConfigLocater.java
deleted file mode 100644
index 1e1bbbb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/IJSFAppConfigLocater.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig;
-
-import java.util.Set;
-
-/**
- * IJSFAppConfigLocater is the interface that Objects capable of locating
- * and providing JSF application configuration resources must implement.
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IJSFAppConfigLocater {
-
-	/**
-	 * Sets the {@link JSFAppConfigManager} instance to which this locater
-	 * belongs.
-	 * 
-	 * @param manager {@link JSFAppConfigManager} instance to be set.
-	 */
-	public void setJSFAppConfigManager(JSFAppConfigManager manager);
-
-	/**
-	 * Starts locating JSF application configuration resources.
-	 */
-	public void startLocating();
-
-	/**
-	 * Stops locating JSF application configuration resources.
-	 */
-	public void stopLocating();
-
-	/**
-	 * Gets the set of {@link IJSFAppConfigProvider} instances that this
-	 * locater has located.
-	 * 
-	 * @return set of {@link IJSFAppConfigProvider} instances.
-	 */
-	public Set getJSFAppConfigProviders();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/IJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/IJSFAppConfigProvider.java
deleted file mode 100644
index 0403c84..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/IJSFAppConfigProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-
-/**
- * IJSFAppConfigProvider is the interface that Objects capable of providing
- * JSF application configuration models must implement.
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IJSFAppConfigProvider {
-
-	/**
-	 * Gets the root element of the application configuration model for read
-	 * access.
-	 * 
-	 * @return FacesConfigType instance, which is the root element of an
-	 * application configuration model.
-	 */
-	public FacesConfigType getFacesConfigModel();
-
-	/**
-	 * Releases resources associated with acquiring the application
-	 * configuration model (if any).
-	 */
-	public void releaseFacesConfigModel();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/IJSFAppConfigProvidersChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/IJSFAppConfigProvidersChangeListener.java
deleted file mode 100644
index 7bbf231..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/IJSFAppConfigProvidersChangeListener.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig;
-
-/**
- * Interface that an Object wishing to be notified about changes to the Set of
- * IJSFAppConfigProvider instances implements.
- * 
- * @author Ian Trimble - Oracle.
- */
-public interface IJSFAppConfigProvidersChangeListener {
-
-	/**
-	 * Callback method indicating a change in the Set of JSFAppConfigProvider
-	 * instances.
-	 * 
-	 * @param event JSFAppConfigProvidersChangeEvent instance.
-	 */
-	public void changedJSFAppConfigProviders(JSFAppConfigProvidersChangeEvent event);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/JARFileJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/JARFileJSFAppConfigProvider.java
deleted file mode 100644
index 205f465..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/JARFileJSFAppConfigProvider.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig;
-
-import java.io.IOException;
-import java.util.Collections;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigResourceFactory;
-import org.eclipse.wst.common.internal.emf.resource.EMF2SAXRendererFactory;
-
-/**
- * JARFileJSFAppConfigProvider provides the root element of an application
- * configuration model by loading the model from a /META-INF/faces-config.xml
- * entry in a JAR file.
- * 
- * @author Ian Trimble - Oracle
- */
-public class JARFileJSFAppConfigProvider implements IJSFAppConfigProvider {
-
-	/**
-	 * Prefix required to turn filename into a JAR URI.
-	 */
-	public static final String JARFILE_URI_PREFIX = "jar:file:///";
-
-	/**
-	 * Suffix required to turn filename into a JAR URI.
-	 */
-	public static final String FACES_CONFIG_IN_JAR_SUFFIX = "!/META-INF/faces-config.xml";
-
-	/**
-	 * Name of a JAR file that contains a /META-INF/faces-config.xml entry.
-	 */
-	protected String filename = null;
-
-	/**
-	 * Cached {@link FacesConfigType} instance.
-	 */
-	protected FacesConfigType facesConfig = null;
-
-	/**
-	 * Creates an instance, storing the passed IProject instance and file name
-	 * String to be used for subsequent processing.
-	 * 
-	 * @param project IProject instance who's classpath contains this JAR file.
-	 * @param filename Name of a JAR file that contains a
-	 * /META-INF/faces-config.xml entry.
-	 */
-	public JARFileJSFAppConfigProvider(String filename) {
-		this.filename = filename;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.IJSFAppConfigProvider#getFacesConfigModel()
-	 */
-	public FacesConfigType getFacesConfigModel() {
-		if (facesConfig == null) {
-			if (filename != null) {
-				StringBuffer sb = new StringBuffer();
-				sb.append(JARFILE_URI_PREFIX);
-				sb.append(filename);
-				sb.append(FACES_CONFIG_IN_JAR_SUFFIX);
-				URI jarFileURI = URI.createURI(sb.toString());
-				FacesConfigResourceFactory resourceFactory = new FacesConfigResourceFactory(EMF2SAXRendererFactory.INSTANCE);
-				Resource resource = resourceFactory.createResource(jarFileURI);
-				try {
-					resource.load(Collections.EMPTY_MAP);
-					if (resource != null) {
-						EList resourceContents = resource.getContents();
-						if (resourceContents != null && resourceContents.size() > 0) {
-							facesConfig = (FacesConfigType)resourceContents.get(0);
-						}
-					}
-				} catch(IOException ioe) {
-					//log error
-					JSFCorePlugin.log(IStatus.ERROR, ioe.getLocalizedMessage(), ioe);
-				}
-			}
-		}
-		return facesConfig;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.IJSFAppConfigProvider#releaseFacesConfigModel()
-	 */
-	public void releaseFacesConfigModel() {
-		facesConfig = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object otherObject) {
-		boolean equals = false;
-		if (otherObject != null && otherObject instanceof JARFileJSFAppConfigProvider) {
-			String otherFilename = ((JARFileJSFAppConfigProvider)otherObject).filename;
-			if (filename != null) {
-				equals = filename.equals(otherFilename);
-			} else {
-				equals = otherFilename == null;
-			}
-		}
-		return equals;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return filename != null ? filename.hashCode() : 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer("JARFileJSFAppConfigProvider["); //$NON-NLS-1$
-		if (filename != null) {
-			sb.append(filename);
-		} else {
-			sb.append("null"); //$NON-NLS-1$
-		}
-		sb.append("]"); //$NON-NLS-1$
-		return sb.toString();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/JSFAppConfigManager.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/JSFAppConfigManager.java
deleted file mode 100644
index 750180b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/JSFAppConfigManager.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-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;
-
-/**
- * JSFAppConfigManager provides an entry point to an entire JSF application
- * configuration, which is defined in one or more application configuration
- * resource files.
- * 
- * @author Ian Trimble - Oracle
- */
-public class JSFAppConfigManager {
-
-	/**
-	 * Key that is used for the IProject instance's session property that
-	 * holds a JSFAppConfigManager instance.
-	 */
-	public static final QualifiedName KEY_SESSIONPROPERTY =
-		new QualifiedName(JSFCorePlugin.PLUGIN_ID, "JSFAppConfigManager"); //$NON-NLS-1$
-
-	/**
-	 * IProject instance to which this JSFAppConfigManager instance is keyed.
-	 */
-	protected IProject project = null;
-
-	/**
-	 * Collection of {@link IJSFAppConfigLocater} instances.
-	 */
-	protected ArrayList configLocaters = null;
-
-	/**
-	 * Collection of {@link IJSFAppConfigProvidersChangeListener} instances.
-	 */
-	protected ArrayList configProvidersChangeListeners = null;
-
-	/**
-	 * Gets a JSFAppConfigManager instance that is keyed to the passed IProject
-	 * parameter. May return null if the project is not valid or if a
-	 * CoreException is thrown while attempting to get or set the instance as
-	 * a session property.
-	 * 
-	 * @param project IProject instance to which the returned
-	 * JSFAppConfigManager instance is keyed
-	 * @return JSFAppConfigManager instance, or null
-	 */
-	public static JSFAppConfigManager getInstance(IProject project) {
-		JSFAppConfigManager manager = null;
-		if (isValidProject(project)) {
-			manager = getFromSessionProperty(project);
-			if (manager == null) {
-				manager = new JSFAppConfigManager(project);
-			}
-		}
-		return manager;
-	}
-
-	/**
-	 * Tests if the passed IProject instance is valid in the following ways:
-	 * <ul>
-	 * <li>project is not null and is accessible</li>
-	 * <li>project has the "jst.jsf" facet set on it</li>
-	 * </ul>
-	 * 
-	 * @param project IProject instance to be tested
-	 * @return true if the IProject instance is valid, else false
-	 */
-	protected static boolean isValidProject(IProject project) {
-		boolean isValid = false;
-		//check for null or inaccessible project
-		if (project != null && project.isAccessible()) {
-			//check for "jst.jsf" facet on project
-			try {
-				IFacetedProject facetedProject = ProjectFacetsManager.create(project);
-				if (facetedProject != null) {
-					Set projectFacets = facetedProject.getProjectFacets();
-					Iterator itProjectFacets = projectFacets.iterator();
-					while (itProjectFacets.hasNext()) {
-						IProjectFacetVersion projectFacetVersion = (IProjectFacetVersion)itProjectFacets.next();
-						IProjectFacet projectFacet = projectFacetVersion.getProjectFacet();
-						if ("jst.jsf".equals(projectFacet.getId())) { //$NON-NLS-1$
-							isValid = true;
-							break;
-						}
-					}
-				}
-			} catch(CoreException ce) {
-				//log error
-				JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-			}
-		}
-		return isValid;
-	}
-
-	/**
-	 * Attempts to get a JSFAppConfigManager instance from a session property
-	 * of the passed IProject instance. Will return null if the session
-	 * property has not yet been set.
-	 * 
-	 * @param project IProject instance from which to retrieve the
-	 * JSFAppConfigManager instance
-	 * @return JSFAppConfigManager instance, or null
-	 */
-	protected static JSFAppConfigManager getFromSessionProperty(IProject project) {
-		JSFAppConfigManager manager = null;
-		try {
-			Object obj = project.getSessionProperty(KEY_SESSIONPROPERTY);
-			if (obj != null && obj instanceof JSFAppConfigManager) {
-				manager = (JSFAppConfigManager)obj;
-			}
-		} catch(CoreException ce) {
-			//log error
-			JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-		}
-		return manager;
-	}
-
-	/**
-	 * Sets this JSFAppConfigManager instance as a session property of its
-	 * IProject instance.
-	 */
-	protected void setAsSessionProperty() {
-		if (project != null && project.isAccessible()) {
-			try {
-				project.setSessionProperty(KEY_SESSIONPROPERTY, this);
-			} catch(CoreException ce) {
-				//log error
-				JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-			}
-		}
-	}
-
-	/**
-	 * Unsets this JSFAppConfigManager instance as a session property of its
-	 * IProject instance.
-	 */
-	protected void unsetAsSessionProperty() {
-		if (project != null && project.isAccessible()) {
-			try {
-				project.setSessionProperty(KEY_SESSIONPROPERTY, null);
-			} catch(CoreException ce) {
-				//log error
-				JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-			}
-		}
-	}
-
-	/**
-	 * Constructor is private to prevent direct instantiation; call
-	 * getInstance(IProject).
-	 * 
-	 * @param project IProject instance to which the new JSFAppConfigManager
-	 * instance is keyed.
-	 */
-	private JSFAppConfigManager(IProject project) {
-		this.project = project;
-		initialize();
-	}
-
-	/**
-	 * Gets this instance's IProject instance.
-	 * 
-	 * @return This instance's IProject instance.
-	 */
-	public IProject getProject() {
-		return project;
-	}
-
-	/**
-	 * Initializes instance by:
-	 * <ul>
-	 * 	<li>creating configProvidersChangeListeners collection</li>
-	 * 	<li>creating and populating configLocaters collection</li>
-	 * 	<li>invoking the startLocating() method on all configLocaters</li>
-	 * 	<li>setting instance as a session property of the IProject instance</li>
-	 * </ul>
-	 */
-	protected void initialize() {
-		//create collections
-		configProvidersChangeListeners = new ArrayList();
-		configLocaters = new ArrayList();
-		//populate initial set of locaters
-		populateConfigLocaters();
-		//instruct locaters to start locating
-		startConfigLocaters();
-		//set as session property of project
-		setAsSessionProperty();
-	}
-
-	/**
-	 * Populates configLocaters Set with "built-in" set of
-	 * {@link IJSFAppConfigLocater} implementations.
-	 */
-	protected void populateConfigLocaters() {
-		//default ("/WEB-INF/faces-config.xml") locater
-		IJSFAppConfigLocater defaultConfigLocater = new DefaultJSFAppConfigLocater();
-		defaultConfigLocater.setJSFAppConfigManager(this);
-		configLocaters.add(defaultConfigLocater);
-		//web.xml context-parameter specified locater
-		IJSFAppConfigLocater contextParamConfigLocater = new ContextParamSpecifiedJSFAppConfigLocater();
-		contextParamConfigLocater.setJSFAppConfigManager(this);
-		configLocaters.add(contextParamConfigLocater);
-		//runtime classpath locater
-		IJSFAppConfigLocater classpathConfigLocater = new RuntimeClasspathJSFAppConfigLocater();
-		classpathConfigLocater.setJSFAppConfigManager(this);
-		configLocaters.add(classpathConfigLocater);
-	}
-
-	/**
-	 * Instructs set of {@link IJSFAppConfigLocater} instances to start
-	 * locating JSF application configuration resources.
-	 */
-	protected void startConfigLocaters() {
-		Iterator itConfigLocaters = configLocaters.iterator();
-		while (itConfigLocaters.hasNext()) {
-			IJSFAppConfigLocater configLocater = (IJSFAppConfigLocater)itConfigLocaters.next();
-			configLocater.startLocating();
-		}
-	}
-
-	/**
-	 * Instructs set of {@link IJSFAppConfigLocater} instances to stop
-	 * locating JSF application configuration resources.
-	 */
-	protected void stopConfigLocaters() {
-		Iterator itConfigLocaters = configLocaters.iterator();
-		while (itConfigLocaters.hasNext()) {
-			IJSFAppConfigLocater configLocater = (IJSFAppConfigLocater)itConfigLocaters.next();
-			configLocater.stopLocating();
-		}
-	}
-
-	/**
-	 * Adds an instance of {@link IJSFAppConfigProvidersChangeListener}.
-	 * 
-	 * @param listener An instance of {@link IJSFAppConfigProvidersChangeListener}
-	 * @return true if added, else false
-	 */
-	public boolean addJSFAppConfigProvidersChangeListener(IJSFAppConfigProvidersChangeListener listener) {
-		return configProvidersChangeListeners.add(listener);
-	}
-
-	/**
-	 * Removes an instance of {@link IJSFAppConfigProvidersChangeListener}.
-	 * 
-	 * @param listener an instance of {@link IJSFAppConfigProvidersChangeListener}
-	 * @return true if removed, else false
-	 */
-	public boolean removeJSFAppConfigProvidersChangeListener(IJSFAppConfigProvidersChangeListener listener) {
-		return configProvidersChangeListeners.remove(listener);
-	}
-
-	/**
-	 * Notifies all {@link IJSFAppConfigProvidersChangeListener} instances of
-	 * a change in the Set of {@link IJSFAppConfigProvider} instances.
-	 * 
-	 * @param configProvider {@link IJSFAppConfigProvider} instance that has
-	 * changed
-	 * @param eventType Event type
-	 */
-	public void notifyJSFAppConfigProvidersChangeListeners(IJSFAppConfigProvider configProvider, int eventType) {
-		JSFAppConfigProvidersChangeEvent event = new JSFAppConfigProvidersChangeEvent(configProvider, eventType);
-		Iterator itListeners = configProvidersChangeListeners.iterator();
-		while (itListeners.hasNext()) {
-			IJSFAppConfigProvidersChangeListener listener =
-				(IJSFAppConfigProvidersChangeListener)itListeners.next();
-			listener.changedJSFAppConfigProviders(event);
-		}
-	}
-
-	/**
-	 * Gets all {@link IJSFAppConfigProvider} instances from all
-	 * {@link IJSFAppConfigLocater} instances.
-	 * 
-	 * @return Set of all {@link IJSFAppConfigProvider} instances.
-	 */
-	public Set getJSFAppConfigProviders() {
-		Set allConfigProviders = new LinkedHashSet();
-		Iterator itConfigLocaters = configLocaters.iterator();
-		while (itConfigLocaters.hasNext()) {
-			IJSFAppConfigLocater configLocater = (IJSFAppConfigLocater)itConfigLocaters.next();
-			allConfigProviders.addAll(configLocater.getJSFAppConfigProviders());
-		}
-		return allConfigProviders;
-	}
-
-	/**
-	 * Gets all {@link FacesConfigType} instances from all
-	 * {@link IJSFAppConfigProvider} instances.
-	 * 
-	 * @return List of all {@link FacesConfigType} instances.
-	 */
-	public List getFacesConfigModels() {
-		List facesConfigModels = new ArrayList();
-		Iterator itConfigProviders = getJSFAppConfigProviders().iterator();
-		while (itConfigProviders.hasNext()) {
-			IJSFAppConfigProvider configProvider = (IJSFAppConfigProvider)itConfigProviders.next();
-			FacesConfigType facesConfig = configProvider.getFacesConfigModel();
-			if (facesConfig != null) {
-				facesConfigModels.add(facesConfig);
-			}
-		}
-		return facesConfigModels;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see java.lang.Object#finalize()
-	 */
-	protected void finalize() {
-		//remove session property from project
-		unsetAsSessionProperty();
-		//instruct locaters to stop locating
-		stopConfigLocaters();
-		//clear collections
-		configLocaters.clear();
-		configProvidersChangeListeners.clear();
-	}
-
-	/**
-	 * Gets list of all ManagedBeanType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all ManagedBeanType instances from all known
-	 * faces-config models (list may be empty).
-	 */
-	public List getManagedBeans() {
-		List allManagedBeans = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList managedBeans = facesConfig.getManagedBean();
-			allManagedBeans.addAll(managedBeans);
-		}
-		return allManagedBeans;
-	}
-
-	/**
-	 * Gets list of all ValidatorType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all ValidatorType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List getValidators() {
-		List allValidators = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList validators = facesConfig.getValidator();
-			allValidators.addAll(validators);
-		}
-		return allValidators;
-	}
-
-	/**
-	 * Gets list of all ConverterType instances from all known faces-config
-	 * models; list may be empty.
-	 * 
-	 * @return List of all ConverterType instances from all known faces-config
-	 * models (list may be empty).
-	 */
-	public List getConverters() {
-		List allConverters = new ArrayList();
-		List facesConfigs = getFacesConfigModels();
-		Iterator itFacesConfigs = facesConfigs.iterator();
-		while (itFacesConfigs.hasNext()) {
-			FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
-			EList converters = facesConfig.getConverter();
-			allConverters.addAll(converters);
-		}
-		return allConverters;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/JSFAppConfigProvidersChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/JSFAppConfigProvidersChangeEvent.java
deleted file mode 100644
index 138b126..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/JSFAppConfigProvidersChangeEvent.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig;
-
-/**
- * JSFAppConfigProvidersChangeEvent provides change information to instances of
- * IJSFAppConfigProvidersChangeListener.
- * 
- * @author Ian Trimble - Oracle
- */
-public class JSFAppConfigProvidersChangeEvent {
-
-	/**
-	 * Event type; instance of IJSFAppConfigProvider was added (value == 1).
-	 */
-	public static final int ADDED = 1;
-
-	/**
-	 * Event type; instance of IJSFAppConfigProvider was removed (value == 2).
-	 */
-	public static final int REMOVED = 2;
-
-	/**
-	 * Instance of IJSFAppConfigProvider that was added or removed.
-	 */
-	protected IJSFAppConfigProvider configProvider = null;
-
-	/**
-	 * Event type.
-	 */
-	protected int eventType;
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param configProvider Instance of IJSFAppConfigProvider that was added
-	 * or removed
-	 * @param eventType Event type
-	 */
-	public JSFAppConfigProvidersChangeEvent(IJSFAppConfigProvider configProvider, int eventType) {
-		this.configProvider = configProvider;
-		this.eventType = eventType;
-	}
-
-	/**
-	 * Gets the instance of IJSFAppConfigProvider that was added or removed.
-	 * 
-	 * @return Instance of IJSFAppConfigProvider that was added or removed
-	 */
-	public IJSFAppConfigProvider getJSFAppConfigProvider() {
-		return configProvider;
-	}
-
-	/**
-	 * Gets the event type.
-	 * 
-	 * @return Event type
-	 */
-	public int getEventType() {
-		return eventType;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/JSFAppConfigUtils.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/JSFAppConfigUtils.java
deleted file mode 100644
index ec0f678..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/JSFAppConfigUtils.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jst.j2ee.common.ParamValue;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.j2ee.webapplication.ContextParam;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-
-/**
- * JSFAppConfigUtils provides utility methods useful in processing of a JSF
- * application configuration.
- * 
- * @author Ian Trimble - Oracle
- */
-public class JSFAppConfigUtils {
-
-	/**
-	 * Name of JSF CONFIG_FILES context parameter ("javax.faces.CONFIG_FILES").
-	 */
-	public static final String CONFIG_FILES_CONTEXT_PARAM_NAME = "javax.faces.CONFIG_FILES";
-
-	/**
-	 * Location in JAR file of application configuration resource file. 
-	 */
-	public static final String FACES_CONFIG_IN_JAR_PATH = "META-INF/faces-config.xml";
-
-	/**
-	 * Gets an IVirtualFolder instance which represents the root context's
-	 * web content folder.
-	 * 
-	 * @param project IProject instance for which to get the folder.
-	 * @return IVirtualFolder instance which represents the root context's
-	 * web content folder.
-	 */
-	public static IVirtualFolder getWebContentFolder(IProject project) {
-		IVirtualFolder folder = null;
-		IVirtualComponent component = ComponentCore.createComponent(project);
-		if (component != null) {
-			folder = component.getRootFolder();
-		}
-		return folder;
-	}
-
-	/**
-	 * Gets an IPath instance representing the path of the passed IFile
-	 * instance relative to the web content folder.
-	 * 
-	 * @param file IFile instance for which a path is required.
-	 * @return IPath instance representing the path relative to the web content
-	 * folder.
-	 */
-	public static IPath getWebContentFolderRelativePath(IFile file) {
-		IPath path = null;
-		IVirtualFolder webContentFolder = getWebContentFolder(file.getProject());
-		if (webContentFolder != null) {
-			IPath webContentPath = webContentFolder.getProjectRelativePath();
-			IPath filePath = file.getProjectRelativePath();
-			int matchingFirstSegments = webContentPath.matchingFirstSegments(filePath);
-			path = filePath.removeFirstSegments(matchingFirstSegments);
-		}
-		return path;
-	}
-
-	/**
-	 * Gets list of application configuration file names as listed in the JSF
-	 * CONFIG_FILES context parameter ("javax.faces.CONFIG_FILES"). Will return
-	 * an empty list if WebArtifactEdit is null, if WebApp is null, if context
-	 * parameter does not exist, or if trimmed context parameter's value is
-	 * an empty String.
-	 * 
-	 * @param project IProject instance for which to get the context
-	 * parameter's value.
-	 * @return List of application configuration file names as listed in the
-	 * JSF CONFIG_FILES context parameter ("javax.faces.CONFIG_FILES"); list
-	 * may be empty.
-	 */
-	public static List getConfigFilesFromContextParam(IProject project) {
-		ArrayList filesList = new ArrayList();
-		WebArtifactEdit webArtifactEdit = WebArtifactEdit.getWebArtifactEditForRead(project);
-		if (webArtifactEdit != null) {
-			WebApp webApp = webArtifactEdit.getWebApp();
-			if (webApp != null) {
-				String filesString = null;
-				//need to branch here due to model version differences (BugZilla #119442)
-				if (webApp.getVersionID() == J2EEVersionConstants.WEB_2_3_ID) {
-					EList contexts = webApp.getContexts();
-					Iterator itContexts = contexts.iterator();
-					while (itContexts.hasNext()) {
-						ContextParam contextParam = (ContextParam)itContexts.next();
-						if (contextParam.getParamName().equals(CONFIG_FILES_CONTEXT_PARAM_NAME)) {
-							filesString = contextParam.getParamValue();
-							break;
-						}
-					}
-				} else {
-					EList contextParams = webApp.getContextParams();
-					Iterator itContextParams = contextParams.iterator();
-					while (itContextParams.hasNext()) {
-						ParamValue paramValue = (ParamValue)itContextParams.next();
-						if (paramValue.getName().equals(CONFIG_FILES_CONTEXT_PARAM_NAME)) {
-							filesString = paramValue.getValue();
-							break;
-						}
-					}
-				}
-				if (filesString != null && filesString.trim().length() > 0) {
-					StringTokenizer stFilesString = new StringTokenizer(filesString, ",");
-					while (stFilesString.hasMoreTokens()) {
-						String configFile = stFilesString.nextToken().trim();
-						filesList.add(configFile);
-					}
-				}
-			}
-			webArtifactEdit.dispose();
-		}
-		return filesList;
-	}
-
-	/**
-	 * Gets list of JAR file names, where each file name represents a JAR on
-	 * the classpath that contains a /META-INF/faces-config.xml entry. Will
-	 * return an empty list if no such JAR files are located.
-	 * 
-	 * @param project IProject instance for which to scan the classpath.
-	 * @return List of JAR file names, where each file name represents a JAR
-	 * on the classpath that contains a ...META-INF/faces-config.xml entry;
-	 * list may be empty.
-	 * @throws CoreException Thrown when underlying calls into JavaCore fail.
-	 * @throws IOException Thrown when attempt to open JAR to determine if it
-	 * contains a /META-INF/faces-config.xml entry fails.
-	 */
-	public static List getConfigFileJARsFromClasspath(IProject project) throws CoreException, IOException {
-		ArrayList JARsList = new ArrayList();
-		if (project.hasNature(JavaCore.NATURE_ID)) {
-			IJavaProject javaProject = JavaCore.create(project);
-			if (javaProject != null) {
-				IClasspathEntry[] classpathEntries = javaProject.getResolvedClasspath(true);
-				if (classpathEntries != null && classpathEntries.length > 0) {
-					for (int i = 0; i < classpathEntries.length; i++) {
-						IClasspathEntry classpathEntry = classpathEntries[i];
-						if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
-							IPath libraryPath = classpathEntry.getPath();
-							if (libraryPath.getFileExtension() != null && libraryPath.getFileExtension().length() > 0) {
-								//TODO: find better way to determine if workspace must be prepended to path
-								if (libraryPath.getDevice() == null) {
-									IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-									IPath workspaceRootPath = workspaceRoot.getLocation();
-									libraryPath = workspaceRootPath.append(libraryPath);
-								}
-								String libraryPathString = libraryPath.toString();
-								JarFile jarFile = new JarFile(libraryPathString);
-								if (jarFile != null) {
-									JarEntry jarEntry = jarFile.getJarEntry(FACES_CONFIG_IN_JAR_PATH);
-									if (jarEntry != null) {
-										JARsList.add(libraryPathString);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return JARsList;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/RuntimeClasspathJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/RuntimeClasspathJSFAppConfigLocater.java
deleted file mode 100644
index fbec834..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/RuntimeClasspathJSFAppConfigLocater.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig;
-
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-
-/**
- * RuntimeClasspathJSFAppConfigLocater attempts to locate application
- * configuration files in JAR files on the runtime classpath. The runtime
- * classpath includes the server runtime classpath and the JAR files that will
- * be deployed to the web application's /WEB-INF/lib folder.
- * 
- * @author Ian Trimble - Oracle
- */
-public class RuntimeClasspathJSFAppConfigLocater extends AbstractJSFAppConfigLocater {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.AbstractJSFAppConfigLocater#startLocating()
-	 */
-	public void startLocating() {
-		locateProviders();
-		//TODO: add listener
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig.AbstractJSFAppConfigLocater#stopLocating()
-	 */
-	public void stopLocating() {
-		//TODO: remove listener
-	}
-
-	/**
-	 * Locates application configuration resources specified in JAR files on
-	 * the runtime classpath, and updates the set of
-	 * {@link IJSFAppConfigProvider} instances accordingly.
-	 */
-	public void locateProviders() {
-		try {
-			List JARs = JSFAppConfigUtils.getConfigFileJARsFromClasspath(manager.getProject());
-			Iterator itJARs = JARs.iterator();
-			Set newConfigProviders = new LinkedHashSet();
-			while (itJARs.hasNext()) {
-				String JARFilename = (String)itJARs.next();
-				JARFileJSFAppConfigProvider configProvider = new JARFileJSFAppConfigProvider(JARFilename);
-				newConfigProviders.add(configProvider);
-			}
-			updateConfigProviders(newConfigProviders);
-		} catch(CoreException ce) {
-			//log error
-			JSFCorePlugin.log(IStatus.ERROR, ce.getLocalizedMessage(), ce);
-		} catch(IOException ioe) {
-			//log error
-			JSFCorePlugin.log(IStatus.ERROR, ioe.getLocalizedMessage(), ioe);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java
deleted file mode 100644
index 380b7ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/provisional/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.internal.provisional.jsfappconfig;
-
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-/**
- * WebContentRelativeJSFAppConfigLocater is an abstract base class that
- * attempts to locate specified application configuration files relative to a
- * web content folder. Subclasses must override the getFilenames() method to
- * return a list of filenames that the locateProviders() method will attempt to
- * locate, and call locateProviders().
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class WebContentRelativeJSFAppConfigLocater extends AbstractJSFAppConfigLocater {
-
-	/**
-	 * Locates application configuration resources specified by the filenames
-	 * (relative to the web content folder) returned by getFilenames(), and
-	 * updates the set of {@link IJSFAppConfigProvider} instances accordingly.
-	 */
-	public void locateProviders() {
-		IProject project = manager.getProject();
-		IVirtualFolder webContentFolder = JSFAppConfigUtils.getWebContentFolder(project);
-		if (webContentFolder != null) {
-			List filenames = getFilenames();
-			Iterator itFilenames = filenames.iterator();
-			Set newConfigProviders = new LinkedHashSet();
-			while (itFilenames.hasNext()) {
-				String filename = (String)itFilenames.next();
-				IVirtualResource appConfigResource = webContentFolder.findMember(filename);
-				if (appConfigResource != null && appConfigResource.getType() == IVirtualResource.FILE) {
-					IFile file = (IFile)appConfigResource.getUnderlyingResource();
-					if (file != null && file.exists()) {
-						ArtifactEditJSFAppConfigProvider configProvider = new ArtifactEditJSFAppConfigProvider(file);
-						newConfigProviders.add(configProvider);
-					}
-				}
-			}
-			updateConfigProviders(newConfigProviders);
-		}
-	}
-
-	/**
-	 * Gets a list of Strings representing the filenames (relative to the web
-	 * content folder) that locateProviders() will attempt to locate.
-	 * 
-	 * @return A list of Strings representing the filenames (relative to the
-	 * web content folder) that locateProviders() will attempt to locate.
-	 */
-	protected abstract List getFilenames();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/InvalidArchiveFilesCreationException.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/InvalidArchiveFilesCreationException.java
deleted file mode 100644
index 65db247..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/InvalidArchiveFilesCreationException.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsflibraryregistry;
-
-/**
- * Exception class thrown by PluginProvidedJSFLibraryCreationHelper.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class InvalidArchiveFilesCreationException extends Exception {
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Creates an instance with the specified message.
-	 * @param msg This instance's message
-	 */
-	public InvalidArchiveFilesCreationException(String msg) {
-		super(msg);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/JSFLibraryArchiveFilesDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/JSFLibraryArchiveFilesDelegate.java
deleted file mode 100644
index bb1cd68..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/JSFLibraryArchiveFilesDelegate.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsflibraryregistry;
-
-import java.util.Collection;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.osgi.framework.Bundle;
-
-/**
- * Abstract delegate class used by jsfLibraries ext-pt to return collection of 
- * ArchiveFiles to PluginProvidedJSFLibraryCreationHelper.
- * 
- * Caller must first setConfigurationElement(IConfigurationElement element)
- * before a call to getArchiveFiles().
- * <br>
- * <em><b>NOTE: experimental and very likely to change.</b></em>
- * 
- * @author Gerry Kessler - Oracle
- */
-public abstract class JSFLibraryArchiveFilesDelegate {
-	
-	protected IConfigurationElement extPtElement;
-	private String libID = null;
-	private IPath pluginPath = null;
-	private String pluginID;
-	private String relativeDestLocation = "WEB-INF/lib"; //$NON-NLS-1$
-
-	/**
-	 * Returns a Collection of <code>org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile</code>
-	 * instances.
-	 * 
-	 * @return A Collection of <code>org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile</code>
-	 * instances
-	 */
-	public abstract Collection getArchiveFiles();
-
-	/**
-	 * Sets the IConfigurationElement instance to be subsequently used to get
-	 * the plugin ID and the name defined for the JSF Library.
-	 * 
-	 * @param extPtElement IConfigurationElement instance
-	 */
-	public final void setConfigurationElement(IConfigurationElement extPtElement){
-		this.extPtElement = extPtElement;
-	}
-
-	/**
-	 * Constructs an instance.
-	 */
-	public JSFLibraryArchiveFilesDelegate() {
-		super();
-	}
-
-	/**
-	 * Sets the relative destination location subsequently used to set the
-	 * corresponding property on each created ArchiveFile.
-	 * 
-	 * @param relPath Relative destination location for ArchiveFile instances
-	 */
-	protected void setRelativeDestinationLocation(String relPath){
-		relativeDestLocation = relPath;
-	}
-	
-	/**
-	 * Returns ArchiveFile where the location is set relative to the plugin.   
-	 * As long as the ArchiveFile is on the local machine somewhere, it should
-	 * be locatable.
-	 *  
-	 * @param relativePathFileName Relative location of the ArchiveFile
-	 * @return ArchiveFile instance.
-	 */
-	protected ArchiveFile createArchiveFile(String relativePathFileName){
-		ArchiveFile file = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-		file.setRelativeToWorkspace(false);
-		file.setSourceLocation(relativePathFileName);
-		file.setRelativeDestLocation(relativeDestLocation);
-		return file;
-	}
-	
-//	protected ArchiveFile createArchiveFileWithAbsolutePath(String fullPath){
-//		ArchiveFile file = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
-//		file.setRelativeToWorkspace(false);
-//		file.setSourceLocation(fullPath);
-//		file.setRelativeDestLocation(relativeDestLocation);
-//		return file;
-//	}
-
-	/**
-	 * Returns the JSFLibrary ID as set on the extension point.
-	 * 
-	 * @return JSFLibrary ID
-	 */
-	protected String getLibID(){
-		if (libID == null){
-			StringBuffer buf = new StringBuffer(getPluginID());
-			buf.append("/").append(extPtElement.getAttribute(PluginProvidedJSFLibraryCreationHelper.NAME)); //$NON-NLS-1$
-			libID = buf.toString();
-		}
-		return libID;
-	}
-
-	/**
-	 * Returns the plugin's path.
-	 * 
-	 * @return The plugin's path.
-	 */
-	protected IPath getPluginPath(){
-		if (pluginPath == null){
-			Bundle bundle = Platform.getBundle(getPluginID());
-			pluginPath = new Path(bundle.getLocation());
-		}
-		return pluginPath;
-	}
-
-	/**
-	 * Returns the plugin's ID.
-	 * 
-	 * @return The plugin's ID.
-	 */
-	private String getPluginID() {
-		if (pluginID == null){
-			pluginID = extPtElement.getDeclaringExtension().getNamespace();
-		}
-		return pluginID;
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryCreationHelper.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryCreationHelper.java
deleted file mode 100644
index 61650c8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryregistry/PluginProvidedJSFLibraryCreationHelper.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.core.jsflibraryregistry;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.Messages;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Helper class used to create JSF Libraries from the
- * <code>org.eclipse.jst.jsf.core.jsflibraries</code> extension-point.
- * <br>
- * <em><b>NOTE: experimental and very likely to change.</b></em>
- * 
- * @author Gerry Kessler - Oracle
- */
-public final class PluginProvidedJSFLibraryCreationHelper {
-	private IConfigurationElement config_element;
-
-	/**
-	 * Key of the 'name' attribute of the extension point.
-	 */
-	public final static String NAME 		= "name"; //$NON-NLS-1$
-	/**
-	 * Key of the 'isImplementation' attribute of the extension point.
-	 */
-	public final static String IS_IMPL 		= "isImplementation"; //$NON-NLS-1$
-	/**
-	 * Key of the 'maxVersionSupported' attribute of the extension point.
-	 */
-	public final static String VERSION 		= "maxVersionSupported"; //$NON-NLS-1$
-	/**
-	 * Key of the 'archiveFilesDelegate' attribute of the extension point.
-	 */
-	public final static String DELEGATE 	= "archiveFilesDelegate"; //$NON-NLS-1$
-
-	/**
-	 * Creates an instance with the specified IConfigurationElement instance.
-	 * 
-	 * @param jsfLibrary IConfigurationElement instance
-	 */
-	public PluginProvidedJSFLibraryCreationHelper (IConfigurationElement jsfLibrary){
-		this.config_element = jsfLibrary;
-	}
-
-	/**
-	 * Creates a new PluginProvidedJSFLibrary from the JSFLibrary extension point.
-	 * 
-	 * @return PluginProvidedJSFLibrary instance.
-	 */
-	public JSFLibrary create(){
-		PluginProvidedJSFLibrary newLib = JSFLibraryRegistryFactory.eINSTANCE.createPluginProvidedJSFLibrary();
-		newLib.setID(getLibID());
-		newLib.setPluginID(getPluginID());
-		newLib.setName(config_element.getAttribute(NAME));
-		newLib.setImplementation(config_element.getAttribute(IS_IMPL).equals("true") ? true : false); //$NON-NLS-1$		
-		newLib.setJSFVersion(JSFVersion.getJSFVersion(config_element.getAttribute(VERSION)));
-		
-		try {
-			addArchives(newLib);			
-			return newLib;
-		} catch (Exception e) {
-			JSFCorePlugin.log(
-					e,
-					NLS.bind(
-							Messages.PluginProvidedJSFLibraryCreationHelper_ErrorCreating,
-							newLib.getName()));
-		}
-		return null;
-	}
-
-	/**
-	 * Adds ArchiveFile instances to the specified JSFLibrary instance.
-	 * 
-	 * @param newLib JSFLibrary instance
-	 * @throws InvalidArchiveFilesCreationException on attempt to create
-	 * multiple instances at same location.
-	 * @throws CoreException on core failure.
-	 */
-	private void addArchives(JSFLibrary newLib) throws InvalidArchiveFilesCreationException, CoreException {
-		JSFLibraryArchiveFilesDelegate jarCol = null;
-		ArchiveFile jar = null;
-
-		jarCol = (JSFLibraryArchiveFilesDelegate)config_element.createExecutableExtension(DELEGATE);
-		if (jarCol != null){
-			jarCol.setConfigurationElement(config_element);
-			Collection jars = jarCol.getArchiveFiles();
-			if (jars == null)//TODO: better validation and error handling
-				return;
-			Iterator it = jars.iterator();
-			while (it.hasNext()){
-				Object aJar = it.next();
-				if (aJar instanceof ArchiveFile){//for now check to see ArchiveFiles were being returned
-					jar = (ArchiveFile)aJar;
-					if (!newLib.containsArchiveFile(jar.getSourceLocation()))
-						newLib.getArchiveFiles().add(jar);
-				}
-				else {
-					throw new InvalidArchiveFilesCreationException(
-							NLS.bind(
-									Messages.PluginProvidedJSFLibraryCreationHelper_ErrorMultipleDefinition,
-									jar.getSourceLocation(),
-									config_element.getName()));
-				}
-					
-			}
-		}
-	}
-
-	/**
-	 * Returns the JSFLibrary instance's ID as specified in the plugin.
-	 * 
-	 * @return The JSFLibrary instance's ID
-	 */
-	private String getLibID(){
-		StringBuffer buf = new StringBuffer(config_element.getDeclaringExtension().getUniqueIdentifier());
-		buf.append("/").append(config_element.getAttribute(NAME)); //$NON-NLS-1$
-		return buf.toString();
-	}
-
-	/**
-	 * Returns the plugin's ID.
-	 * 
-	 * @return The plugin's ID
-	 */
-	private String getPluginID() {
-		return config_element.getDeclaringExtension().getNamespace();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PFLinkEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PFLinkEditPart.java
new file mode 100644
index 0000000..f7d3e9e
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PFLinkEditPart.java
@@ -0,0 +1,523 @@
+/*******************************************************************************
+ * 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.editpart;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.RelativeBendpoint;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.editparts.AbstractConnectionEditPart;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
+import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
+import org.eclipse.jst.jsf.facesconfig.ui.IconResources;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkBendpointEditPolicy;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkEditPolicy;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkEndpointEditPolicy;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.PFLinkFigure;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowElementPropertySource;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
+import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
+import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.views.properties.IPropertySource;
+
+/**
+ * <code>PFLinkEditPart</code> is the EditPart for PFLink model elements. The
+ * figure for this EditPart is simply a PolylineConnection. Because both
+ * AbstractConnectionEditPart and the Adapter interface have a getTarget method,
+ * we use an inner class to implement the Adapter interface in order to work
+ * around the name collision.
+ * 
+ * 
+ */
+public class PFLinkEditPart extends AbstractConnectionEditPart implements
+		IConnectionPreference, IAnnotationEditPart {
+	/** adapter for notification */
+	private PFLinkAdapter adapter = new PFLinkAdapter();
+
+	private FCAdapter fcAdapter = new FCAdapter();
+
+	/** property source of the pflink */
+	private IPropertySource propertySource = null;
+
+	/** image description for different edit part */
+	public static final ImageDescriptor IMG_WARNING = EditorPlugin.getDefault()
+			.getImageDescriptor(
+					IconResources.getString("Pageflow.quickfixerrorobject"));
+
+	private int connectionStyle = -1;
+
+	private PFLinkBendpointEditPolicy bendpointEditPolicy;
+
+	/**
+	 * @param element
+	 */
+	public PFLinkEditPart(PFLink element) {
+		super();
+		// element.getPageflow()
+		setModel(element);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see AbstractGraphicalEditPart#createFigure()
+	 */
+	protected IFigure createFigure() {
+		IFigure figure = new PFLinkFigure();
+		return figure;
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see AbstractEditPart#createEditPolicies()
+	 */
+	protected void createEditPolicies() {
+		installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE,
+				new PFLinkEndpointEditPolicy());
+
+		if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
+			installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,
+					getBendpointEditPolicy());
+		}
+		PFLinkEditPolicy policy = new PFLinkEditPolicy();
+		// policy.setSseModel(model);
+		installEditPolicy(EditPolicy.CONNECTION_ROLE, new PFLinkEditPolicy());
+
+	}
+
+	private PFLinkBendpointEditPolicy getBendpointEditPolicy() {
+		if (bendpointEditPolicy == null) {
+			bendpointEditPolicy = new PFLinkBendpointEditPolicy();
+		}
+		return bendpointEditPolicy;
+	}
+
+	public PFLink getPFLink() {
+		return (PFLink) getModel();
+	}
+
+	private class FCAdapter implements Adapter {
+
+		public Notifier getTarget() {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		public boolean isAdapterForType(Object type) {
+			return getModel().getClass() == type;
+		}
+
+		public void notifyChanged(Notification notification) {
+			int type = notification.getEventType();
+			int featureId = notification.getFeatureID(PageflowPackage.class);
+			// FC2PFTransformer.getInstance().NotifyChanged(notification,
+			// getPFLink());
+			switch (type) {
+			case Notification.ADD:
+			case Notification.ADD_MANY:
+			case Notification.REMOVE:
+			case Notification.SET:
+				// FIXME: need the more detailed updation.
+				refreshVisuals();
+				break;
+			}
+		}
+
+		public void setTarget(Notifier newTarget) {
+			// TODO Auto-generated method stub
+
+		}
+
+	}
+
+	private class PFLinkAdapter implements Adapter {
+		private Notifier _newTarget = null;
+
+		// private IPropertySource _propertySource = null;
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.emf.common.notify.Adapter#getTarget()
+		 */
+		public Notifier getTarget() {
+			return _newTarget;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.emf.common.notify.Adapter#isAdapterForType(java.lang.Object)
+		 */
+		public boolean isAdapterForType(Object type) {
+			return getModel().getClass() == type;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
+		 */
+		public void notifyChanged(Notification notification) {
+			int type = notification.getEventType();
+			int featureId = notification.getFeatureID(PageflowPackage.class);
+			// FC2PFTransformer.getInstance().NotifyChanged(notification,
+			// getPFLink());
+			switch (type) {
+			case Notification.ADD:
+			case Notification.ADD_MANY:
+			case Notification.REMOVE:
+			case Notification.SET:
+				if (featureId == PageflowPackage.PF_LINK__OUTCOME
+						|| featureId == PageflowPackage.PF_LINK__SOURCE
+						|| featureId == PageflowPackage.PF_LINK__TARGET) {
+					PageflowAnnotationUtil.validateLink(PFLinkEditPart.this);
+				}
+
+				refreshVisuals();
+				break;
+			}
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.emf.common.notify.Adapter#setTarget(org.eclipse.emf.common.notify.Notifier)
+		 */
+		public void setTarget(Notifier newTarget) {
+			this._newTarget = newTarget;
+		}
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see EditPart#activate()
+	 */
+	public void activate() {
+		getPFLink().eAdapters().add(adapter);
+		PFLink element = (PFLink) getModel();
+		if (element.getFCElements().size() > 0) {
+			NavigationCaseType navCase = ((NavigationCaseType) element
+					.getFCElements().get(0));
+			if (!navCase.eAdapters().contains(fcAdapter)) {
+				navCase.eAdapters().add(fcAdapter);
+				TreeIterator iterator = navCase.eAllContents();
+				while (iterator.hasNext()) {
+					EObject next = (EObject) iterator.next();
+					if (!next.eAdapters().contains(fcAdapter)) {
+						next.eAdapters().add(fcAdapter);
+					}
+				}
+			}
+		}
+		super.activate();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see EditPart#deactivate()
+	 */
+	public void deactivate() {
+		getPFLink().eAdapters().remove(adapter);
+		PFLink element = (PFLink) getModel();
+		NavigationCaseType navCase = ((NavigationCaseType) element
+				.getFCElements().get(0));
+		navCase.eAdapters().remove(fcAdapter);
+		TreeIterator iterator = navCase.eAllContents();
+		while (iterator.hasNext()) {
+			((EObject) iterator.next()).eAdapters().remove(fcAdapter);
+		}
+
+		super.deactivate();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see IAdaptable#getAdapter(java.lang.Class)
+	 */
+	public Object getAdapter(Class key) {
+		/*
+		 * override the default behavior defined in AbstractEditPart which would
+		 * expect the model to be a property sourced. instead the editpart can
+		 * provide a property source
+		 */
+		if (key == IPropertySource.class) {
+			return getPropertySource();
+		}
+		return super.getAdapter(key);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see PageflowElementEditPart#getPropertySource()
+	 */
+	protected IPropertySource getPropertySource() {
+		if (propertySource == null) {
+			propertySource = new PageflowElementPropertySource(getPFLink());
+		}
+		return propertySource;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see AbstractEditPart#refreshVisuals()
+	 */
+	protected void refreshVisuals() {
+		super.refreshVisuals();
+		resetLabel();
+		if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
+			refreshBendpoints();
+		}
+	}
+
+	/**
+	 * set the bendpoint constraints of the pflink connection
+	 * 
+	 */
+	protected void refreshBendpoints() {
+		// bendpoints stored in pflink
+		List modelConstraint = getPFLink().getBendPoints();
+		// bendpoint constraint list
+		List figureConstraint = new ArrayList();
+		for (int i = 0; i < modelConstraint.size(); i++) {
+			PFLinkBendpoint wbp = (PFLinkBendpoint) modelConstraint.get(i);
+			RelativeBendpoint rbp = new RelativeBendpoint(getConnectionFigure());
+			rbp.setRelativeDimensions(wbp.getFirstRelativeDimension(), wbp
+					.getSecondRelativeDimension());
+			rbp.setWeight((i + 1) / ((float) modelConstraint.size() + 1));
+			figureConstraint.add(rbp);
+		}
+		// set the router constaints.
+		getConnectionFigure().setRoutingConstraint(figureConstraint);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLineWidth(int)
+	 */
+	public void setLineWidth(int w) {
+		((PFLinkFigure) getFigure()).setLineWidth(w);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelVisible(boolean)
+	 */
+	public void setLabelVisible(boolean b) {
+		((PFLinkFigure) getFigure()).setLabelVisible(b);
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
+	 */
+	public void setForegroundColor(Color c) {
+		((PFLinkFigure) getFigure()).setForegroundColor(c);
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
+	 */
+	public void setBackgroundColor(Color c) {
+		((PFLinkFigure) getFigure()).setBackgroundColor(c);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
+	 */
+	public void setFont(Font f) {
+		((PFLinkFigure) getFigure()).setFont(f);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelForeground(org.eclipse.swt.graphics.Color)
+	 */
+	public void setLabelForegroundColor(Color c) {
+		((PFLinkFigure) getFigure()).setLabelForegroundColor(c);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelBackground(org.eclipse.swt.graphics.Color)
+	 */
+	public void setLabelBackgroundColor(Color c) {
+		((PFLinkFigure) getFigure()).setLabelBackgroundColor(c);
+	}
+
+	private boolean needDrawingLabel() {
+		return (((PFLink) getModel()).getOutcome() != null && ((PFLink) getModel())
+				.getOutcome().trim().length() > 0);
+	}
+
+	private boolean needDrawingAction() {
+		return (((PFLink) getModel()).getFromaction() != null && ((PFLink) getModel())
+				.getFromaction().trim().length() > 0);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#decorateEditPart()
+	 */
+	public void addAnnotation(final Annotation annotation) {
+		getViewer().getControl().getDisplay().asyncExec(new Runnable() {
+			public void run() {
+				((PFLinkFigure) getFigure()).setImage(getImage(IMG_WARNING));
+				((PFLinkFigure) getFigure()).setToolTipText(annotation
+						.getText());
+			}
+		});
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#undecorateEditPart()
+	 */
+	public void removeAnnotation() {
+		getViewer().getControl().getDisplay().asyncExec(new Runnable() {
+			public void run() {
+				((PFLinkFigure) getFigure()).clearIcon();
+				resetLabel();
+			}
+		});
+	}
+
+	public void resetLabel() {
+		String tip = "";
+		if (needDrawingAction()) {
+			((PFLinkFigure) getFigure()).setActionImage();
+			tip = "fromAction:(" + ((PFLink) getModel()).getFromaction() + ") ";
+		} else if (((PFLinkFigure) getFigure()).getImage() != getImage(IMG_WARNING)) {
+			((PFLinkFigure) getFigure()).clearIcon();
+			tip = "";
+		}
+		if (needDrawingLabel()) {
+			((PFLinkFigure) getFigure()).setLabel(((PFLink) getModel())
+					.getOutcome());
+			tip += "fromOutcome:(";
+			tip += ((PFLink) getModel()).getOutcome() + ")";
+		} else {
+			((PFLinkFigure) getFigure()).clearOutcome();
+		}
+		((PFLinkFigure) getFigure()).setToolTipText(tip);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.sybase.stf.jmt.editors.pageflow.marker.IEditPartMarker#getMarkerResource()
+	 * 
+	 */
+	public IResource getMarkerResource() {
+		// IResource resource = null;
+		// if (getModel() instanceof PFLink)
+		// {
+		// resource =
+		// FacesConfigUtil.getFacesConfigResource(((PFLink)getModel()).getPageflow());
+		// }
+		// FIXME: it should be changed to link to faces-config file.
+		IResource resource = WebrootUtil.getResource((EObject) getModel());
+		return resource;
+	}
+
+	public static Image getImage(ImageDescriptor imageDescriptor) {
+		Image image = EditorPlugin.getDefault().getImageRegistry().get(
+				imageDescriptor.toString());
+		if (null == image) {
+			EditorPlugin.getDefault().getImageRegistry().put(
+					imageDescriptor.toString(), imageDescriptor);
+			image = EditorPlugin.getDefault().getImageRegistry().get(
+					imageDescriptor.toString());
+		}
+
+		return image;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setConnectionRouterStyle(int)
+	 */
+	public void setConnectionRouterStyle(int style) {
+		connectionStyle = style;
+		if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
+			installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,
+					getBendpointEditPolicy());
+			refreshVisuals();
+		} else {
+			removeEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE);
+			refreshVisuals();
+		}
+
+	}
+
+	/**
+	 * get the foreground color from preference
+	 * 
+	 */
+	public int getConnectionRouterStyle() {
+		if (this.connectionStyle == -1) {
+			IPreferenceStore store = EditorPlugin.getDefault()
+					.getPreferenceStore();
+			String connectionStyle = store
+					.getString(GEMPreferences.LINE_ROUTING);
+
+			if (GEMPreferences.LINE_ROUTING_MANHATTAN
+					.equals(connectionStyle)) {
+				this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANHATTAN;
+			} else {
+				this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANUAL;
+			}
+		}
+		return this.connectionStyle;
+	}
+
+}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PFLink.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PFLink.java
new file mode 100644
index 0000000..236ce51
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PFLink.java
@@ -0,0 +1,306 @@
+/*******************************************************************************
+ * 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.model;
+
+import java.util.Vector;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc --> A representation of the model object '<em><b>PF Link</b></em>'.
+ * <!-- end-user-doc -->
+ * 
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getPageflow <em>Pageflow</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getTarget <em>Target</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getSource <em>Source</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getSmallicon <em>Smallicon</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getLargeicon <em>Largeicon</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getFromaction <em>Fromaction</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getOutcome <em>Outcome</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#isRedirect <em>Redirect</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getBendPoints <em>Bend Points</em>}</li>
+ * </ul>
+ * </p>
+ * 
+ * @see org.eclipse.jst.jsf.facesconfig.ui.org.eclipse.jst.jsf.facesconfig.editor.pageflow.model.model.PageflowPackage#getPFLink()
+ * @model
+ * @generated
+ */
+public interface PFLink extends PageflowElement {
+	/**
+	 * Returns the value of the '<em><b>Pageflow</b></em>' container reference.
+	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks <em>Links</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Pageflow</em>' container reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Pageflow</em>' container reference.
+	 * @see #setPageflow(Pageflow)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Pageflow()
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks
+	 * @model opposite="links" required="true"
+	 * @generated
+	 */
+	Pageflow getPageflow();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getPageflow <em>Pageflow</em>}' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Pageflow</em>' container reference.
+	 * @see #getPageflow()
+	 * @generated
+	 */
+	void setPageflow(Pageflow value);
+
+	/**
+	 * Returns the value of the '<em><b>Target</b></em>' reference.
+	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks <em>Inlinks</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Target</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Target</em>' reference.
+	 * @see #setTarget(PageflowNode)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Target()
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks
+	 * @model opposite="inlinks" required="true"
+	 * @generated
+	 */
+	PageflowNode getTarget();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getTarget <em>Target</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Target</em>' reference.
+	 * @see #getTarget()
+	 * @generated
+	 */
+	void setTarget(PageflowNode value);
+
+	/**
+	 * Returns the value of the '<em><b>Source</b></em>' reference.
+	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks <em>Outlinks</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Source</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Source</em>' reference.
+	 * @see #setSource(PageflowNode)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Source()
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks
+	 * @model opposite="outlinks" required="true"
+	 * @generated
+	 */
+	PageflowNode getSource();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getSource <em>Source</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Source</em>' reference.
+	 * @see #getSource()
+	 * @generated
+	 */
+	void setSource(PageflowNode value);
+
+	/**
+	 * Returns the value of the '<em><b>Smallicon</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Smallicon</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Smallicon</em>' attribute.
+	 * @see #setSmallicon(String)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Smallicon()
+	 * @model
+	 * @generated
+	 */
+	String getSmallicon();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getSmallicon <em>Smallicon</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Smallicon</em>' attribute.
+	 * @see #getSmallicon()
+	 * @generated
+	 */
+	void setSmallicon(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Largeicon</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Largeicon</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Largeicon</em>' attribute.
+	 * @see #setLargeicon(String)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Largeicon()
+	 * @model
+	 * @generated
+	 */
+	String getLargeicon();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getLargeicon <em>Largeicon</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Largeicon</em>' attribute.
+	 * @see #getLargeicon()
+	 * @generated
+	 */
+	void setLargeicon(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Fromaction</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Fromaction</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Fromaction</em>' attribute.
+	 * @see #setFromaction(String)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Fromaction()
+	 * @model
+	 * @generated
+	 */
+	String getFromaction();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getFromaction <em>Fromaction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Fromaction</em>' attribute.
+	 * @see #getFromaction()
+	 * @generated
+	 */
+	void setFromaction(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Outcome</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Outcome</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Outcome</em>' attribute.
+	 * @see #setOutcome(String)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Outcome()
+	 * @model
+	 * @generated
+	 */
+	String getOutcome();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getOutcome <em>Outcome</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Outcome</em>' attribute.
+	 * @see #getOutcome()
+	 * @generated
+	 */
+	void setOutcome(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Redirect</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Redirect</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Redirect</em>' attribute.
+	 * @see #setRedirect(boolean)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Redirect()
+	 * @model
+	 * @generated
+	 */
+	boolean isRedirect();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#isRedirect <em>Redirect</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Redirect</em>' attribute.
+	 * @see #isRedirect()
+	 * @generated
+	 */
+	void setRedirect(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Bend Points</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint}.
+	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getLink <em>Link</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Bend Points</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Bend Points</em>' containment reference list.
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_BendPoints()
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getLink
+	 * @model type="org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint" opposite="link" containment="true"
+	 * @generated
+	 */
+	EList getBendPoints();
+
+	/**
+	 * <!-- begin-user-doc --> insert a new bendpoint to the link <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public void insertBendpoint(int index, PFLinkBendpoint point);
+
+	/**
+	 * <!-- begin-user-doc --> remove the current bendpoint <!-- end-user-doc
+	 * -->
+	 * 
+	 * @generated NOT
+	 */
+	public void removeBendpoint(int index);
+
+	/**
+	 * <!-- begin-user-doc --> Set the current bendpoint <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public void setBendpoint(int index, PFLinkBendpoint point);
+
+	/**
+	 * <!-- begin-user-doc --> Set a group of bendpoints to reconstruct the link
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public void setBendpoints(Vector points);
+
+}
+// PFLink
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PFLinkBendpoint.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PFLinkBendpoint.java
new file mode 100644
index 0000000..1334b88
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PFLinkBendpoint.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * 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.model;
+
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc --> A representation of the model object '<em><b>PF Link Bendpoint</b></em>'.
+ * <!-- end-user-doc -->
+ * 
+ * <p>
+ * The following features are supported:
+ * <ul>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getD1Width <em>D1 Width</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getD1Height <em>D1 Height</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getD2Width <em>D2 Width</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getD2Height <em>D2 Height</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getWeight <em>Weight</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getLink <em>Link</em>}</li>
+ * </ul>
+ * </p>
+ * 
+ * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint()
+ * @model
+ * @generated
+ */
+public interface PFLinkBendpoint extends EObject {
+	/**
+	 * Returns the value of the '<em><b>D1 Width</b></em>' attribute. <!--
+	 * begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>D1 Width</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * 
+	 * @return the value of the '<em>D1 Width</em>' attribute.
+	 * @see #setD1Width(int)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_D1Width()
+	 * @model
+	 * @generated
+	 */
+	int getD1Width();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getD1Width <em>D1 Width</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @param value
+	 *            the new value of the '<em>D1 Width</em>' attribute.
+	 * @see #getD1Width()
+	 * @generated
+	 */
+	void setD1Width(int value);
+
+	/**
+	 * Returns the value of the '<em><b>D1 Height</b></em>' attribute. <!--
+	 * begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>D1 Height</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * 
+	 * @return the value of the '<em>D1 Height</em>' attribute.
+	 * @see #setD1Height(int)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_D1Height()
+	 * @model
+	 * @generated
+	 */
+	int getD1Height();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getD1Height <em>D1 Height</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @param value
+	 *            the new value of the '<em>D1 Height</em>' attribute.
+	 * @see #getD1Height()
+	 * @generated
+	 */
+	void setD1Height(int value);
+
+	/**
+	 * Returns the value of the '<em><b>D2 Width</b></em>' attribute. <!--
+	 * begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>D2 Width</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * 
+	 * @return the value of the '<em>D2 Width</em>' attribute.
+	 * @see #setD2Width(int)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_D2Width()
+	 * @model
+	 * @generated
+	 */
+	int getD2Width();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getD2Width <em>D2 Width</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @param value
+	 *            the new value of the '<em>D2 Width</em>' attribute.
+	 * @see #getD2Width()
+	 * @generated
+	 */
+	void setD2Width(int value);
+
+	/**
+	 * Returns the value of the '<em><b>D2 Height</b></em>' attribute. <!--
+	 * begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>D2 Height</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * 
+	 * @return the value of the '<em>D2 Height</em>' attribute.
+	 * @see #setD2Height(int)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_D2Height()
+	 * @model
+	 * @generated
+	 */
+	int getD2Height();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getD2Height <em>D2 Height</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @param value
+	 *            the new value of the '<em>D2 Height</em>' attribute.
+	 * @see #getD2Height()
+	 * @generated
+	 */
+	void setD2Height(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Weight</b></em>' attribute. The
+	 * default value is <code>"0.5"</code>. <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Weight</em>' attribute isn't clear, there
+	 * really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * 
+	 * @return the value of the '<em>Weight</em>' attribute.
+	 * @see #setWeight(float)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_Weight()
+	 * @model default="0.5"
+	 * @generated
+	 */
+	float getWeight();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getWeight <em>Weight</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @param value
+	 *            the new value of the '<em>Weight</em>' attribute.
+	 * @see #getWeight()
+	 * @generated
+	 */
+	void setWeight(float value);
+
+	/**
+	 * Returns the value of the '<em><b>Link</b></em>' container reference.
+	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getBendPoints <em>Bend Points</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Link</em>' container reference isn't
+	 * clear, there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * 
+	 * @return the value of the '<em>Link</em>' container reference.
+	 * @see #setLink(PFLink)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_Link()
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink#getBendPoints
+	 * @model opposite="bendPoints" required="true"
+	 * @generated
+	 */
+	PFLink getLink();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint#getLink <em>Link</em>}'
+	 * container reference. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @param value
+	 *            the new value of the '<em>Link</em>' container reference.
+	 * @see #getLink()
+	 * @generated
+	 */
+	void setLink(PFLink value);
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public Dimension getFirstRelativeDimension();
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public Dimension getSecondRelativeDimension();
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public void setRelativeDimensions(Dimension dim1, Dimension dim2);
+
+}
+// PFLinkBendpoint
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PFPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PFPage.java
new file mode 100644
index 0000000..5ef9130
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PFPage.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * 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.model;
+
+/**
+ * <!-- begin-user-doc --> A representation of the model object '<em><b>PF Page</b></em>'.
+ * <!-- end-user-doc -->
+ * 
+ * <p>
+ * The following features are supported:
+ * <ul>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFPage#getPath <em>Path</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFPage#getSmallicon <em>Smallicon</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFPage#getLargeicon <em>Largeicon</em>}</li>
+ * </ul>
+ * </p>
+ * 
+ * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage()
+ * @model
+ * @generated
+ */
+public interface PFPage extends PageflowNode {
+	/**
+	 * Returns the value of the '<em><b>Path</b></em>' attribute. <!--
+	 * begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Path</em>' attribute isn't clear, there
+	 * really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * 
+	 * @return the value of the '<em>Path</em>' attribute.
+	 * @see #setPath(String)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage_Path()
+	 * @model
+	 * @generated
+	 */
+	String getPath();
+
+	void setInitPath(String path);
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFPage#getPath <em>Path</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @param value
+	 *            the new value of the '<em>Path</em>' attribute.
+	 * @see #getPath()
+	 * @generated
+	 */
+	void setPath(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Smallicon</b></em>' attribute. <!--
+	 * begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Smallicon</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * 
+	 * @return the value of the '<em>Smallicon</em>' attribute.
+	 * @see #setSmallicon(String)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage_Smallicon()
+	 * @model
+	 * @generated
+	 */
+	String getSmallicon();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFPage#getSmallicon <em>Smallicon</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @param value
+	 *            the new value of the '<em>Smallicon</em>' attribute.
+	 * @see #getSmallicon()
+	 * @generated
+	 */
+	void setSmallicon(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Largeicon</b></em>' attribute. <!--
+	 * begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Largeicon</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * 
+	 * @return the value of the '<em>Largeicon</em>' attribute.
+	 * @see #setLargeicon(String)
+	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage_Largeicon()
+	 * @model
+	 * @generated
+	 */
+	String getLargeicon();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFPage#getLargeicon <em>Largeicon</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @param value
+	 *            the new value of the '<em>Largeicon</em>' attribute.
+	 * @see #getLargeicon()
+	 * @generated
+	 */
+	void setLargeicon(String value);
+
+}
+// PFPage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PFLinkBendpointImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PFLinkBendpointImpl.java
new file mode 100644
index 0000000..abb62f2
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PFLinkBendpointImpl.java
@@ -0,0 +1,550 @@
+/*******************************************************************************
+ * 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.model.impl;
+
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
+
+/**
+ * <!-- begin-user-doc --> An implementation of the model object '<em><b>PF Link Bendpoint</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkBendpointImpl#getD1Width <em>D1 Width</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkBendpointImpl#getD1Height <em>D1 Height</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkBendpointImpl#getD2Width <em>D2 Width</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkBendpointImpl#getD2Height <em>D2 Height</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkBendpointImpl#getWeight <em>Weight</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkBendpointImpl#getLink <em>Link</em>}</li>
+ * </ul>
+ * </p>
+ * 
+ * @generated
+ */
+public class PFLinkBendpointImpl extends EObjectImpl implements PFLinkBendpoint {
+	/**
+	 * The default value of the '{@link #getD1Width() <em>D1 Width</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getD1Width()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int D1_WIDTH_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getD1Width() <em>D1 Width</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getD1Width()
+	 * @generated
+	 * @ordered
+	 */
+	protected int d1Width = D1_WIDTH_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getD1Height() <em>D1 Height</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getD1Height()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int D1_HEIGHT_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getD1Height() <em>D1 Height</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getD1Height()
+	 * @generated
+	 * @ordered
+	 */
+	protected int d1Height = D1_HEIGHT_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getD2Width() <em>D2 Width</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getD2Width()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int D2_WIDTH_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getD2Width() <em>D2 Width</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getD2Width()
+	 * @generated
+	 * @ordered
+	 */
+	protected int d2Width = D2_WIDTH_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getD2Height() <em>D2 Height</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getD2Height()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int D2_HEIGHT_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getD2Height() <em>D2 Height</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getD2Height()
+	 * @generated
+	 * @ordered
+	 */
+	protected int d2Height = D2_HEIGHT_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getWeight() <em>Weight</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getWeight()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final float WEIGHT_EDEFAULT = 0.5F;
+
+	/**
+	 * The cached value of the '{@link #getWeight() <em>Weight</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getWeight()
+	 * @generated
+	 * @ordered
+	 */
+	protected float weight = WEIGHT_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	private Dimension dimStart, dimEnd;
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected PFLinkBendpointImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected EClass eStaticClass() {
+		return PageflowPackage.eINSTANCE.getPFLinkBendpoint();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public int getD1Width() {
+		return d1Width;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setD1Width(int newD1Width) {
+		int oldD1Width = d1Width;
+		d1Width = newD1Width;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH, oldD1Width,
+					d1Width));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public int getD1Height() {
+		return d1Height;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setD1Height(int newD1Height) {
+		int oldD1Height = d1Height;
+		d1Height = newD1Height;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT, oldD1Height,
+					d1Height));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public int getD2Width() {
+		return d2Width;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setD2Width(int newD2Width) {
+		int oldD2Width = d2Width;
+		d2Width = newD2Width;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH, oldD2Width,
+					d2Width));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public int getD2Height() {
+		return d2Height;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setD2Height(int newD2Height) {
+		int oldD2Height = d2Height;
+		d2Height = newD2Height;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT, oldD2Height,
+					d2Height));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public float getWeight() {
+		return weight;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setWeight(float newWeight) {
+		float oldWeight = weight;
+		weight = newWeight;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK_BENDPOINT__WEIGHT, oldWeight,
+					weight));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public PFLink getLink() {
+		if (eContainerFeatureID != PageflowPackage.PF_LINK_BENDPOINT__LINK)
+			return null;
+		return (PFLink) eContainer;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setLink(PFLink newLink) {
+		if (newLink != eContainer
+				|| (eContainerFeatureID != PageflowPackage.PF_LINK_BENDPOINT__LINK && newLink != null)) {
+			if (EcoreUtil.isAncestor(this, newLink))
+				throw new IllegalArgumentException(
+						"Recursive containment not allowed for " + toString());
+			NotificationChain msgs = null;
+			if (eContainer != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			if (newLink != null)
+				msgs = ((InternalEObject) newLink).eInverseAdd(this,
+						PageflowPackage.PF_LINK__BEND_POINTS, PFLink.class,
+						msgs);
+			msgs = eBasicSetContainer((InternalEObject) newLink,
+					PageflowPackage.PF_LINK_BENDPOINT__LINK, msgs);
+			if (msgs != null)
+				msgs.dispatch();
+		} else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK_BENDPOINT__LINK, newLink, newLink));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain eInverseAdd(InternalEObject otherEnd,
+			int featureID, Class baseClass, NotificationChain msgs) {
+		if (featureID >= 0) {
+			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
+			case PageflowPackage.PF_LINK_BENDPOINT__LINK:
+				if (eContainer != null)
+					msgs = eBasicRemoveFromContainer(msgs);
+				return eBasicSetContainer(otherEnd,
+						PageflowPackage.PF_LINK_BENDPOINT__LINK, msgs);
+			default:
+				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
+			}
+		}
+		if (eContainer != null)
+			msgs = eBasicRemoveFromContainer(msgs);
+		return eBasicSetContainer(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain eInverseRemove(InternalEObject otherEnd,
+			int featureID, Class baseClass, NotificationChain msgs) {
+		if (featureID >= 0) {
+			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
+			case PageflowPackage.PF_LINK_BENDPOINT__LINK:
+				return eBasicSetContainer(null,
+						PageflowPackage.PF_LINK_BENDPOINT__LINK, msgs);
+			default:
+				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
+						msgs);
+			}
+		}
+		return eBasicSetContainer(null, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
+		if (eContainerFeatureID >= 0) {
+			switch (eContainerFeatureID) {
+			case PageflowPackage.PF_LINK_BENDPOINT__LINK:
+				return ((InternalEObject) eContainer).eInverseRemove(this,
+						PageflowPackage.PF_LINK__BEND_POINTS, PFLink.class,
+						msgs);
+			default:
+				return eDynamicBasicRemoveFromContainer(msgs);
+			}
+		}
+		return ((InternalEObject) eContainer).eInverseRemove(this,
+				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
+			return new Integer(getD1Width());
+		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
+			return new Integer(getD1Height());
+		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
+			return new Integer(getD2Width());
+		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
+			return new Integer(getD2Height());
+		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
+			return new Float(getWeight());
+		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
+			return getLink();
+		}
+		return eDynamicGet(eFeature, resolve);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void eSet(EStructuralFeature eFeature, Object newValue) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
+			setD1Width(((Integer) newValue).intValue());
+			return;
+		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
+			setD1Height(((Integer) newValue).intValue());
+			return;
+		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
+			setD2Width(((Integer) newValue).intValue());
+			return;
+		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
+			setD2Height(((Integer) newValue).intValue());
+			return;
+		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
+			setWeight(((Float) newValue).floatValue());
+			return;
+		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
+			setLink((PFLink) newValue);
+			return;
+		}
+		eDynamicSet(eFeature, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void eUnset(EStructuralFeature eFeature) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
+			setD1Width(D1_WIDTH_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
+			setD1Height(D1_HEIGHT_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
+			setD2Width(D2_WIDTH_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
+			setD2Height(D2_HEIGHT_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
+			setWeight(WEIGHT_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
+			setLink((PFLink) null);
+			return;
+		}
+		eDynamicUnset(eFeature);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public boolean eIsSet(EStructuralFeature eFeature) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
+			return d1Width != D1_WIDTH_EDEFAULT;
+		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
+			return d1Height != D1_HEIGHT_EDEFAULT;
+		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
+			return d2Width != D2_WIDTH_EDEFAULT;
+		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
+			return d2Height != D2_HEIGHT_EDEFAULT;
+		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
+			return weight != WEIGHT_EDEFAULT;
+		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
+			return getLink() != null;
+		}
+		return eDynamicIsSet(eFeature);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public String toString() {
+		if (eIsProxy())
+			return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (d1Width: ");
+		result.append(d1Width);
+		result.append(", d1Height: ");
+		result.append(d1Height);
+		result.append(", d2Width: ");
+		result.append(d2Width);
+		result.append(", d2Height: ");
+		result.append(d2Height);
+		result.append(", weight: ");
+		result.append(weight);
+		result.append(')');
+		return result.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public Dimension getFirstRelativeDimension() {
+		dimStart = new Dimension(getD1Width(), getD1Height());
+		return dimStart;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public Dimension getSecondRelativeDimension() {
+		dimEnd = new Dimension(getD2Width(), getD2Height());
+		return dimEnd;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public void setRelativeDimensions(Dimension dim1, Dimension dim2) {
+		dimStart = dim1;
+		dimEnd = dim2;
+		setD1Width(dimStart.width);
+		setD1Height(dimStart.height);
+
+		setD2Width(dimEnd.width);
+		setD2Height(dimEnd.height);
+	}
+
+}
+// PFLinkBendpointImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PFLinkImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PFLinkImpl.java
new file mode 100644
index 0000000..44b61c5
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PFLinkImpl.java
@@ -0,0 +1,995 @@
+/*******************************************************************************
+ * 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.model.impl;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
+import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
+import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
+import org.eclipse.jst.jsf.facesconfig.emf.IconType;
+import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
+import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
+import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
+import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
+
+/**
+ * <!-- begin-user-doc --> An implementation of the model object '<em><b>PF Link</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkImpl#getPageflow <em>Pageflow</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkImpl#getTarget <em>Target</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkImpl#getSource <em>Source</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkImpl#getOutcome <em>Outcome</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkImpl#isRedirect <em>Redirect</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkImpl#getBendPoints <em>Bend Points</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkImpl#getSmallicon <em>Smallicon</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFLinkImpl#getLargeicon <em>Largeicon</em>}</li>
+ * </ul>
+ * </p>
+ * 
+ * @generated
+ * 
+ */
+public class PFLinkImpl extends PageflowElementImpl implements PFLink {
+	/**
+	 * The cached value of the '{@link #getTarget() <em>Target</em>}'
+	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getTarget()
+	 * @generated
+	 * @ordered
+	 */
+	protected PageflowNode target = null;
+
+	/**
+	 * The cached value of the '{@link #getSource() <em>Source</em>}'
+	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getSource()
+	 * @generated
+	 * @ordered
+	 */
+	protected PageflowNode source = null;
+
+	/**
+	 * The default value of the '{@link #getOutcome() <em>Outcome</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getOutcome()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String OUTCOME_EDEFAULT = null;
+
+	/**
+	 * The default value of the '{@link #isRedirect() <em>Redirect</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #isRedirect()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean REDIRECT_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #getBendPoints() <em>Bend Points</em>}'
+	 * containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getBendPoints()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList bendPoints = null;
+
+	/**
+	 * The default value of the '{@link #getSmallicon() <em>Smallicon</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getSmallicon()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String SMALLICON_EDEFAULT = null;
+
+	/**
+	 * The default value of the '{@link #getLargeicon() <em>Largeicon</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getLargeicon()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String LARGEICON_EDEFAULT = null;
+
+	/**
+	 * The default value of the '{@link #getFromaction() <em>Fromaction</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getFromaction()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String FROMACTION_EDEFAULT = null;
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected PFLinkImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected EClass eStaticClass() {
+		return PageflowPackage.eINSTANCE.getPFLink();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public Pageflow getPageflow() {
+		if (eContainerFeatureID != PageflowPackage.PF_LINK__PAGEFLOW)
+			return null;
+		return (Pageflow) eContainer;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setPageflow(Pageflow newPageflow) {
+		if (newPageflow != eContainer
+				|| (eContainerFeatureID != PageflowPackage.PF_LINK__PAGEFLOW && newPageflow != null)) {
+			if (EcoreUtil.isAncestor(this, newPageflow))
+				throw new IllegalArgumentException(
+						"Recursive containment not allowed for " + toString());
+			NotificationChain msgs = null;
+			if (eContainer != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			if (newPageflow != null)
+				msgs = ((InternalEObject) newPageflow).eInverseAdd(this,
+						PageflowPackage.PAGEFLOW__LINKS, Pageflow.class, msgs);
+			msgs = eBasicSetContainer((InternalEObject) newPageflow,
+					PageflowPackage.PF_LINK__PAGEFLOW, msgs);
+			if (msgs != null)
+				msgs.dispatch();
+		} else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK__PAGEFLOW, newPageflow, newPageflow));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public PageflowNode getTarget() {
+		if (target != null && target.eIsProxy()) {
+			PageflowNode oldTarget = target;
+			target = (PageflowNode) eResolveProxy((InternalEObject) target);
+			if (target != oldTarget) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+							PageflowPackage.PF_LINK__TARGET, oldTarget, target));
+			}
+		}
+		return target;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public PageflowNode basicGetTarget() {
+		return target;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain basicSetTarget(PageflowNode newTarget,
+			NotificationChain msgs) {
+		PageflowNode oldTarget = target;
+		target = newTarget;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this,
+					Notification.SET, PageflowPackage.PF_LINK__TARGET,
+					oldTarget, newTarget);
+			if (msgs == null)
+				msgs = notification;
+			else
+				msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setTarget(PageflowNode newTarget) {
+		if (newTarget != target) {
+			NotificationChain msgs = null;
+			if (target != null)
+				msgs = ((InternalEObject) target).eInverseRemove(this,
+						PageflowPackage.PAGEFLOW_NODE__INLINKS,
+						PageflowNode.class, msgs);
+			if (newTarget != null)
+				msgs = ((InternalEObject) newTarget).eInverseAdd(this,
+						PageflowPackage.PAGEFLOW_NODE__INLINKS,
+						PageflowNode.class, msgs);
+			msgs = basicSetTarget(newTarget, msgs);
+			if (msgs != null)
+				msgs.dispatch();
+		} else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK__TARGET, newTarget, newTarget));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public PageflowNode getSource() {
+		if (source != null && source.eIsProxy()) {
+			PageflowNode oldSource = source;
+			source = (PageflowNode) eResolveProxy((InternalEObject) source);
+			if (source != oldSource) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+							PageflowPackage.PF_LINK__SOURCE, oldSource, source));
+			}
+		}
+		return source;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public PageflowNode basicGetSource() {
+		return source;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain basicSetSource(PageflowNode newSource,
+			NotificationChain msgs) {
+		// Assert.isTrue(newSource != null);
+		PageflowNode oldSource = source;
+		source = newSource;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this,
+					Notification.SET, PageflowPackage.PF_LINK__SOURCE,
+					oldSource, newSource);
+			if (msgs == null)
+				msgs = notification;
+			else
+				msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setSource(PageflowNode newSource) {
+		// Assert.isTrue(newSource != null);
+		if (newSource != source) {
+			NotificationChain msgs = null;
+			if (source != null)
+				msgs = ((InternalEObject) source).eInverseRemove(this,
+						PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
+						PageflowNode.class, msgs);
+			if (newSource != null)
+				msgs = ((InternalEObject) newSource).eInverseAdd(this,
+						PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
+						PageflowNode.class, msgs);
+			msgs = basicSetSource(newSource, msgs);
+			if (msgs != null)
+				msgs.dispatch();
+		} else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK__SOURCE, newSource, newSource));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public EList getBendPoints() {
+		if (bendPoints == null) {
+			bendPoints = new EObjectContainmentWithInverseEList(
+					PFLinkBendpoint.class, this,
+					PageflowPackage.PF_LINK__BEND_POINTS,
+					PageflowPackage.PF_LINK_BENDPOINT__LINK);
+		}
+		return bendPoints;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain eInverseAdd(InternalEObject otherEnd,
+			int featureID, Class baseClass, NotificationChain msgs) {
+		if (featureID >= 0) {
+			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
+			case PageflowPackage.PF_LINK__PAGEFLOW:
+				if (eContainer != null)
+					msgs = eBasicRemoveFromContainer(msgs);
+				return eBasicSetContainer(otherEnd,
+						PageflowPackage.PF_LINK__PAGEFLOW, msgs);
+			case PageflowPackage.PF_LINK__TARGET:
+				if (target != null)
+					msgs = ((InternalEObject) target).eInverseRemove(this,
+							PageflowPackage.PAGEFLOW_NODE__INLINKS,
+							PageflowNode.class, msgs);
+				return basicSetTarget((PageflowNode) otherEnd, msgs);
+			case PageflowPackage.PF_LINK__SOURCE:
+				if (source != null)
+					msgs = ((InternalEObject) source).eInverseRemove(this,
+							PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
+							PageflowNode.class, msgs);
+				return basicSetSource((PageflowNode) otherEnd, msgs);
+			case PageflowPackage.PF_LINK__BEND_POINTS:
+				return ((InternalEList) getBendPoints()).basicAdd(otherEnd,
+						msgs);
+			default:
+				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
+			}
+		}
+		if (eContainer != null)
+			msgs = eBasicRemoveFromContainer(msgs);
+		return eBasicSetContainer(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain eInverseRemove(InternalEObject otherEnd,
+			int featureID, Class baseClass, NotificationChain msgs) {
+		if (featureID >= 0) {
+			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
+			case PageflowPackage.PF_LINK__PAGEFLOW:
+				return eBasicSetContainer(null,
+						PageflowPackage.PF_LINK__PAGEFLOW, msgs);
+			case PageflowPackage.PF_LINK__TARGET:
+				return basicSetTarget(null, msgs);
+			case PageflowPackage.PF_LINK__SOURCE:
+				return basicSetSource(null, msgs);
+			case PageflowPackage.PF_LINK__BEND_POINTS:
+				return ((InternalEList) getBendPoints()).basicRemove(otherEnd,
+						msgs);
+			default:
+				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
+						msgs);
+			}
+		}
+		return eBasicSetContainer(null, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
+		if (eContainerFeatureID >= 0) {
+			switch (eContainerFeatureID) {
+			case PageflowPackage.PF_LINK__PAGEFLOW:
+				return ((InternalEObject) eContainer).eInverseRemove(this,
+						PageflowPackage.PAGEFLOW__LINKS, Pageflow.class, msgs);
+			default:
+				return eDynamicBasicRemoveFromContainer(msgs);
+			}
+		}
+		return ((InternalEObject) eContainer).eInverseRemove(this,
+				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case PageflowPackage.PF_LINK__NAME:
+			return getName();
+		case PageflowPackage.PF_LINK__COMMENT:
+			return getComment();
+		case PageflowPackage.PF_LINK__X:
+			return new Integer(getX());
+		case PageflowPackage.PF_LINK__Y:
+			return new Integer(getY());
+		case PageflowPackage.PF_LINK__WIDTH:
+			return new Integer(getWidth());
+		case PageflowPackage.PF_LINK__HEIGHT:
+			return new Integer(getHeight());
+		case PageflowPackage.PF_LINK__ID:
+			return getId();
+		case PageflowPackage.PF_LINK__PAGEFLOW:
+			return getPageflow();
+		case PageflowPackage.PF_LINK__TARGET:
+			if (resolve)
+				return getTarget();
+			return basicGetTarget();
+		case PageflowPackage.PF_LINK__SOURCE:
+			if (resolve)
+				return getSource();
+			return basicGetSource();
+		case PageflowPackage.PF_LINK__OUTCOME:
+			return getOutcome();
+		case PageflowPackage.PF_LINK__REDIRECT:
+			return isRedirect() ? Boolean.TRUE : Boolean.FALSE;
+		case PageflowPackage.PF_LINK__BEND_POINTS:
+			return getBendPoints();
+		case PageflowPackage.PF_LINK__SMALLICON:
+			return getSmallicon();
+		case PageflowPackage.PF_LINK__LARGEICON:
+			return getLargeicon();
+		case PageflowPackage.PF_LINK__FROMACTION:
+			return getFromaction();
+		}
+		return super.eGet(eFeature, resolve);// eDynamicGet(eFeature,
+		// resolve);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void eSet(EStructuralFeature eFeature, Object newValue) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case PageflowPackage.PF_LINK__NAME:
+			setName((String) newValue);
+			return;
+		case PageflowPackage.PF_LINK__COMMENT:
+			setComment((String) newValue);
+			return;
+		case PageflowPackage.PF_LINK__X:
+			setX(((Integer) newValue).intValue());
+			return;
+		case PageflowPackage.PF_LINK__Y:
+			setY(((Integer) newValue).intValue());
+			return;
+		case PageflowPackage.PF_LINK__WIDTH:
+			setWidth(((Integer) newValue).intValue());
+			return;
+		case PageflowPackage.PF_LINK__HEIGHT:
+			setHeight(((Integer) newValue).intValue());
+			return;
+		case PageflowPackage.PF_LINK__ID:
+			setId((String) newValue);
+			return;
+		case PageflowPackage.PF_LINK__PAGEFLOW:
+			setPageflow((Pageflow) newValue);
+			return;
+		case PageflowPackage.PF_LINK__TARGET:
+			setTarget((PageflowNode) newValue);
+			return;
+		case PageflowPackage.PF_LINK__SOURCE:
+			setSource((PageflowNode) newValue);
+			return;
+		case PageflowPackage.PF_LINK__OUTCOME:
+			setOutcome((String) newValue);
+			return;
+		case PageflowPackage.PF_LINK__REDIRECT:
+			setRedirect(((Boolean) newValue).booleanValue());
+			return;
+		case PageflowPackage.PF_LINK__BEND_POINTS:
+			getBendPoints().clear();
+			getBendPoints().addAll((Collection) newValue);
+			return;
+		case PageflowPackage.PF_LINK__SMALLICON:
+			setSmallicon((String) newValue);
+			return;
+		case PageflowPackage.PF_LINK__LARGEICON:
+			setLargeicon((String) newValue);
+			return;
+		case PageflowPackage.PF_LINK__FROMACTION:
+			setFromaction((String) newValue);
+			return;
+		}
+		super.eSet(eFeature, newValue);// eDynamicSet(eFeature, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void eUnset(EStructuralFeature eFeature) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case PageflowPackage.PF_LINK__NAME:
+			setName(NAME_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK__COMMENT:
+			setComment(COMMENT_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK__X:
+			setX(X_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK__Y:
+			setY(Y_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK__WIDTH:
+			setWidth(WIDTH_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK__HEIGHT:
+			setHeight(HEIGHT_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK__ID:
+			setId(ID_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK__PAGEFLOW:
+			setPageflow((Pageflow) null);
+			return;
+		case PageflowPackage.PF_LINK__TARGET:
+			setTarget((PageflowNode) null);
+			return;
+		case PageflowPackage.PF_LINK__SOURCE:
+			setSource((PageflowNode) null);
+			return;
+		case PageflowPackage.PF_LINK__OUTCOME:
+			setOutcome(OUTCOME_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK__REDIRECT:
+			setRedirect(REDIRECT_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK__BEND_POINTS:
+			getBendPoints().clear();
+			return;
+		case PageflowPackage.PF_LINK__SMALLICON:
+			setSmallicon(SMALLICON_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK__LARGEICON:
+			setLargeicon(LARGEICON_EDEFAULT);
+			return;
+		case PageflowPackage.PF_LINK__FROMACTION:
+			setFromaction(FROMACTION_EDEFAULT);
+			return;
+		}
+		super.eUnset(eFeature);// eDynamicUnset(eFeature);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public boolean eIsSet(EStructuralFeature eFeature) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case PageflowPackage.PF_LINK__NAME:
+			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
+					.equals(name);
+		case PageflowPackage.PF_LINK__COMMENT:
+			return COMMENT_EDEFAULT == null ? comment != null
+					: !COMMENT_EDEFAULT.equals(comment);
+		case PageflowPackage.PF_LINK__X:
+			return x != X_EDEFAULT;
+		case PageflowPackage.PF_LINK__Y:
+			return y != Y_EDEFAULT;
+		case PageflowPackage.PF_LINK__WIDTH:
+			return width != WIDTH_EDEFAULT;
+		case PageflowPackage.PF_LINK__HEIGHT:
+			return height != HEIGHT_EDEFAULT;
+		case PageflowPackage.PF_LINK__ID:
+			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
+					.equals(getId());
+		case PageflowPackage.PF_LINK__PAGEFLOW:
+			return getPageflow() != null;
+		case PageflowPackage.PF_LINK__TARGET:
+			return target != null;
+		case PageflowPackage.PF_LINK__SOURCE:
+			return source != null;
+		case PageflowPackage.PF_LINK__OUTCOME:
+			return OUTCOME_EDEFAULT == null ? getOutcome() != null
+					: !OUTCOME_EDEFAULT.equals(getOutcome());
+		case PageflowPackage.PF_LINK__REDIRECT:
+			return isRedirect() != REDIRECT_EDEFAULT;
+		case PageflowPackage.PF_LINK__BEND_POINTS:
+			return bendPoints != null && !bendPoints.isEmpty();
+		case PageflowPackage.PF_LINK__SMALLICON:
+			return SMALLICON_EDEFAULT == null ? getSmallicon() != null
+					: !SMALLICON_EDEFAULT.equals(getSmallicon());
+		case PageflowPackage.PF_LINK__LARGEICON:
+			return LARGEICON_EDEFAULT == null ? getLargeicon() != null
+					: !LARGEICON_EDEFAULT.equals(getLargeicon());
+		case PageflowPackage.PF_LINK__FROMACTION:
+			return FROMACTION_EDEFAULT == null ? getFromaction() != null
+					: !FROMACTION_EDEFAULT.equals(getFromaction());
+		}
+		return super.eIsSet(eFeature);// eDynamicIsSet(eFeature);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public String toString() {
+		if (eIsProxy())
+			return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (smallicon: ");
+		result.append(getSmallicon());
+		result.append(", largeicon: ");
+		result.append(getLargeicon());
+		result.append(", fromaction: ");
+		result.append(getFromaction());
+		result.append(", outcome: ");
+		result.append(getOutcome());
+		result.append(", redirect: ");
+		result.append(isRedirect());
+		result.append(')');
+		return result.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> insert a new bendpoint to the link <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public void insertBendpoint(int index, PFLinkBendpoint point) {
+		getBendPoints().add(index, point);
+
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.ADD,
+					PageflowPackage.PF_LINK__BEND_POINTS, null, point));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> remove the current bendpoint <!-- end-user-doc
+	 * -->
+	 * 
+	 * @generated NOT
+	 */
+	public void removeBendpoint(int index) {
+		getBendPoints().remove(index);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> Set the current bendpoint <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public void setBendpoint(int index, PFLinkBendpoint point) {
+		getBendPoints().set(index, point);
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK__BEND_POINTS, null, point));
+
+	}
+
+	/**
+	 * <!-- begin-user-doc --> Set a group of bendpoints to reconstruct the link
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public void setBendpoints(Vector points) {
+		bendPoints = (EList) points;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.ADD_MANY,
+					PageflowPackage.PF_LINK__BEND_POINTS, null, points));
+
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public boolean isRedirect() {
+		boolean result = false;
+		if (getFCElements().size() > 0) {
+			RedirectType outcome = ((NavigationCaseType) getFCElements().get(0))
+					.getRedirect();
+			if (outcome != null) {
+				result = true;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public void setRedirect(boolean newRedirect) {
+		RedirectType redirect = null;
+		RedirectType oldRedirect = null;
+		if (getFCElements().size() > 0) {
+			oldRedirect = ((NavigationCaseType) getFCElements().get(0))
+					.getRedirect();
+			if (!newRedirect) {
+				redirect = null;
+			} else {
+				if (oldRedirect == null) {
+					redirect = FacesConfigFactory.eINSTANCE
+							.createRedirectType();
+				}
+			}
+			((NavigationCaseType) getFCElements().get(0)).setRedirect(redirect);
+		}
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK__REDIRECT, oldRedirect,
+					new Boolean(newRedirect)));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public String getOutcome() {
+		String result = null;
+		if (getFCElements().size() > 0) {
+			FromOutcomeType outcome = ((NavigationCaseType) getFCElements()
+					.get(0)).getFromOutcome();
+			if (outcome != null) {
+				result = outcome.getTextContent();
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public void setOutcome(String newValue) {
+		FromOutcomeType oldOutcome = null;
+		if (getFCElements().size() > 0) {
+			oldOutcome = ((NavigationCaseType) getFCElements().get(0))
+					.getFromOutcome();
+			if (newValue == null || newValue.length() == 0) {
+				((NavigationCaseType) getFCElements().get(0))
+						.setFromOutcome(null);
+			} else {
+				if (oldOutcome == null) {
+					FromOutcomeType newOutcome = FacesConfigFactory.eINSTANCE
+							.createFromOutcomeType();
+					newOutcome.setTextContent(newValue);
+					((NavigationCaseType) getFCElements().get(0))
+							.setFromOutcome(newOutcome);
+				} else {
+					oldOutcome.setTextContent(newValue);
+				}
+			}
+		}
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK__OUTCOME, oldOutcome, newValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public String getSmallicon() {
+		SmallIconType result = null;
+		if (getFCElements().size() > 0) {
+			List icons = ((NavigationCaseType) getFCElements().get(0))
+					.getIcon();
+			if (icons.size() > 0) {
+				result = ((IconType) icons.get(0)).getSmallIcon();
+			}
+		}
+		return result != null ? result.getTextContent() : null;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public void setSmallicon(String newValue) {
+		SmallIconType oldSmallicon = null;
+		SmallIconType newSmallIconType = null;
+		IconType icon = null;
+		if (getFCElements().size() > 0) {
+			List icons = ((NavigationCaseType) getFCElements().get(0))
+					.getIcon();
+			if (newValue == null || newValue.length() == 0) {
+				if (icons.size() > 0) {
+					if (((IconType) icons.get(0)).getSmallIcon() != null) {
+						((IconType) icons.get(0)).setSmallIcon(null);
+					}
+				}
+			} else {
+				if (icons.size() == 0) {
+					icon = FacesConfigFactory.eINSTANCE.createIconType();
+					newSmallIconType = FacesConfigFactory.eINSTANCE
+							.createSmallIconType();
+					newSmallIconType.setTextContent(newValue);
+					icon.setSmallIcon(newSmallIconType);
+					icons.add(icon);
+				} else if (((IconType) icons.get(0)).getSmallIcon() == null) {
+					newSmallIconType = FacesConfigFactory.eINSTANCE
+							.createSmallIconType();
+					newSmallIconType.setTextContent(newValue);
+					icon = ((IconType) icons.get(0));
+					icon.setSmallIcon(newSmallIconType);
+				} else {
+					oldSmallicon = ((IconType) icons.get(0)).getSmallIcon();
+					oldSmallicon.setTextContent(newValue);
+				}
+			}
+		}
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK__SMALLICON, oldSmallicon, newValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public String getLargeicon() {
+		LargeIconType result = null;
+		if (getFCElements().size() > 0) {
+			List icons = ((NavigationCaseType) getFCElements().get(0))
+					.getIcon();
+			if (icons.size() > 0) {
+				result = ((IconType) icons.get(0)).getLargeIcon();
+			}
+		}
+		return result != null ? result.getTextContent() : null;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public void setLargeicon(String newValue) {
+		LargeIconType oldLargeIcon = null;
+		LargeIconType newLargeIconType = null;
+		IconType icon = null;
+		if (getFCElements().size() > 0) {
+			List icons = ((NavigationCaseType) getFCElements().get(0))
+					.getIcon();
+			if (newValue == null || newValue.length() == 0) {
+				if (icons.size() > 0) {
+					if (((IconType) icons.get(0)).getLargeIcon() != null) {
+						((IconType) icons.get(0)).setLargeIcon(null);
+					}
+				}
+			} else {
+				if (icons.size() == 0) {
+					icon = FacesConfigFactory.eINSTANCE.createIconType();
+					newLargeIconType = FacesConfigFactory.eINSTANCE
+							.createLargeIconType();
+					newLargeIconType.setTextContent(newValue);
+					icon.setLargeIcon(newLargeIconType);
+					icons.add(icon);
+				} else if (((IconType) icons.get(0)).getLargeIcon() == null) {
+					newLargeIconType = FacesConfigFactory.eINSTANCE
+							.createLargeIconType();
+					newLargeIconType.setTextContent(newValue);
+					icon = ((IconType) icons.get(0));
+					icon.setLargeIcon(newLargeIconType);
+				} else {
+					oldLargeIcon = ((IconType) icons.get(0)).getLargeIcon();
+					oldLargeIcon.setTextContent(newValue);
+				}
+			}
+		}
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK__LARGEICON, oldLargeIcon, newValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public String getFromaction() {
+		String result = null;
+		if (getFCElements().size() > 0) {
+			FromActionType fromActionType = ((NavigationCaseType) getFCElements()
+					.get(0)).getFromAction();
+			if (fromActionType != null) {
+				result = fromActionType.getTextContent();
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated NOT
+	 */
+	public void setFromaction(String newFromaction) {
+		FromActionType oldFromActionType = null;
+		if (getFCElements().size() > 0) {
+			oldFromActionType = ((NavigationCaseType) getFCElements().get(0))
+					.getFromAction();
+			if (newFromaction == null || newFromaction.length() == 0) {
+				((NavigationCaseType) getFCElements().get(0))
+						.setFromAction(null);
+			} else {
+				if (oldFromActionType == null) {
+					oldFromActionType = FacesConfigFactory.eINSTANCE
+							.createFromActionType();
+					oldFromActionType.setTextContent(newFromaction);
+					((NavigationCaseType) getFCElements().get(0))
+							.setFromAction(oldFromActionType);
+				} else {
+					oldFromActionType.setTextContent(newFromaction);
+				}
+			}
+		}
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_LINK__FROMACTION, oldFromActionType,
+					newFromaction));
+	}
+
+}
+// PFLinkImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PFPageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PFPageImpl.java
new file mode 100644
index 0000000..a71d208
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PFPageImpl.java
@@ -0,0 +1,665 @@
+/*******************************************************************************
+ * 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.model.impl;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
+import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
+import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
+import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
+import org.eclipse.jst.jsf.facesconfig.emf.IconType;
+import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
+import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
+import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
+import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFPage;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
+
+/**
+ * <!-- begin-user-doc --> An implementation of the model object '<em><b>PF Page</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFPageImpl#getPath <em>Path</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFPageImpl#getSmallicon <em>Smallicon</em>}</li>
+ * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PFPageImpl#getLargeicon <em>Largeicon</em>}</li>
+ * </ul>
+ * </p>
+ * 
+ * @generated
+ */
+public class PFPageImpl extends PageflowNodeImpl implements PFPage {
+	private String path;
+
+	/**
+	 * The default value of the '{@link #getPath() <em>Path</em>}' attribute.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getPath()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String PATH_EDEFAULT = null;
+
+	/**
+	 * The default value of the '{@link #getSmallicon() <em>Smallicon</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getSmallicon()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String SMALLICON_EDEFAULT = null;
+
+	/**
+	 * The default value of the '{@link #getLargeicon() <em>Largeicon</em>}'
+	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @see #getLargeicon()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String LARGEICON_EDEFAULT = null;
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected PFPageImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected EClass eStaticClass() {
+		return PageflowPackage.eINSTANCE.getPFPage();
+	}
+
+	public NavigationRuleType resolveRule(Object object) {
+		if (object instanceof FromViewIdType) {
+			return (NavigationRuleType) ((FromViewIdType) object).eContainer();
+		}
+		return null;
+	}
+
+	public void setInitPath(String path) {
+		this.path = path;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public String getPath() {
+		// String result = null;
+		// if (getFCElements().size() > 0) {
+		// for (int i = 0, n = getFCElements().size(); i < n; i++) {
+		// if (getFCElements().get(i) instanceof FromViewIdType) {
+		// result = ((FromViewIdType) getFCElements().get(i))
+		// .getTextContent();
+		// }
+		// }
+		// if (result == null) {
+		// result = ((ToViewIdType) getFCElements().get(0))
+		// .getTextContent();
+		// }
+		// }
+		// return result;
+		return path;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setPath(String newPath) {
+		String oldPath = path;
+		if (getFCElements().size() > 0) {
+			for (int i = 0, n = getFCElements().size(); i < n; i++) {
+				if (getFCElements().get(i) instanceof FromViewIdType) {
+					((FromViewIdType) getFCElements().get(i))
+							.setTextContent(newPath);
+				} else {
+					((ToViewIdType) getFCElements().get(i))
+							.setTextContent(newPath);
+				}
+			}
+		}
+		this.path = newPath;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_PAGE__PATH, oldPath, newPath));
+	}
+
+	public void setComment(String newComment) {
+		String oldComment = null;
+		if (getFCElements().size() > 0) {
+			for (int i = 0, n = getFCElements().size(); i < n; i++) {
+				NavigationRuleType rule = null;
+				if ((rule = resolveRule(getFCElements().get(i))) != null) {
+					rule.getDescription().clear();
+					DescriptionType description = FacesConfigFactory.eINSTANCE
+							.createDescriptionType();
+					description.setTextContent(newComment);
+					rule.getDescription().add(description);
+				}
+			}
+		}
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PAGEFLOW_ELEMENT__COMMENT, oldComment,
+					comment));
+
+	}
+
+	public String getComment() {
+		String result = null;
+		if (getFCElements().size() > 0) {
+			for (int i = 0, n = getFCElements().size(); i < n; i++) {
+				NavigationRuleType rule = null;
+				if ((rule = resolveRule(getFCElements().get(i))) != null) {
+					List descriptions = rule.getDescription();
+					if (descriptions.size() > 0) {
+						result = ((DescriptionType) descriptions.get(0))
+								.getTextContent();
+					}
+				}
+			}
+		}
+		return result;
+	}
+
+	public String getName() {
+		if (this.getOutlinks().size() == 0) {
+			return getPath();
+		} else {
+			String result = null;
+			if (getFCElements().size() > 0) {
+				for (int i = 0, n = getFCElements().size(); i < n; i++) {
+					NavigationRuleType rule = null;
+					if ((rule = resolveRule(getFCElements().get(i))) != null) {
+						List displaynames = rule.getDisplayName();
+						if (displaynames.size() > 0) {
+							result = ((DisplayNameType) displaynames.get(0))
+									.getTextContent();
+							break;
+						}
+					}
+				}
+			}
+			return result;
+		}
+	}
+
+	public void setName(String newName) {
+		String oldComment = null;
+		if (getOutlinks().size() == 0) {
+			super.setName(newName);
+		} else {
+			if (getFCElements().size() > 0) {
+				for (int i = 0, n = getFCElements().size(); i < n; i++) {
+					NavigationRuleType rule = null;
+					if ((rule = resolveRule(getFCElements().get(i))) != null) {
+						rule.getDisplayName().clear();
+						DisplayNameType dsiplayname = FacesConfigFactory.eINSTANCE
+								.createDisplayNameType();
+						dsiplayname.setTextContent(newName);
+						rule.getDisplayName().add(dsiplayname);
+					}
+				}
+			}
+			if (eNotificationRequired())
+				eNotify(new ENotificationImpl(this, Notification.SET,
+						PageflowPackage.PAGEFLOW_ELEMENT__COMMENT, oldComment,
+						comment));
+
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public String getSmallicon() {
+		SmallIconType result = null;
+		if (getFCElements().size() > 0) {
+			for (int i = 0, n = getFCElements().size(); i < n; i++) {
+				NavigationRuleType rule = null;
+				if ((rule = resolveRule(getFCElements().get(i))) != null) {
+					List icons = rule.getIcon();
+					if (icons.size() > 0) {
+						result = ((IconType) icons.get(0)).getSmallIcon();
+					}
+				}
+			}
+		}
+		return result == null ? null : result.getTextContent();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setSmallicon(String newValue) {
+		SmallIconType oldSmallicon = null;
+		SmallIconType newSmallIconType = null;
+		IconType icon = null;
+		if (getFCElements().size() > 0) {
+			for (int i = 0, n = getFCElements().size(); i < n; i++) {
+				NavigationRuleType rule = null;
+				if ((rule = resolveRule(getFCElements().get(i))) != null) {
+					List icons = rule.getIcon();
+					if (newValue == null || newValue.length() == 0) {
+						if (icons.size() > 0) {
+							if (((IconType) icons.get(0)).getSmallIcon() != null) {
+								((IconType) icons.get(0)).setSmallIcon(null);
+							}
+						}
+					} else {
+						if (icons.size() == 0) {
+							icon = FacesConfigFactory.eINSTANCE
+									.createIconType();
+							newSmallIconType = FacesConfigFactory.eINSTANCE
+									.createSmallIconType();
+							newSmallIconType.setTextContent(newValue);
+							icon.setSmallIcon(newSmallIconType);
+							icons.add(icon);
+						} else if (((IconType) icons.get(0)).getSmallIcon() == null) {
+							newSmallIconType = FacesConfigFactory.eINSTANCE
+									.createSmallIconType();
+							newSmallIconType.setTextContent(newValue);
+							icon = ((IconType) icons.get(0));
+							icon.setSmallIcon(newSmallIconType);
+						} else {
+							oldSmallicon = ((IconType) icons.get(0))
+									.getSmallIcon();
+							oldSmallicon.setTextContent(newValue);
+						}
+					}
+				}
+			}
+		}
+
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_PAGE__SMALLICON, oldSmallicon, newValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public String getLargeicon() {
+		LargeIconType result = null;
+		if (getFCElements().size() > 0) {
+			for (int i = 0, n = getFCElements().size(); i < n; i++) {
+				NavigationRuleType rule = null;
+				if ((rule = resolveRule(getFCElements().get(i))) != null) {
+					List icons = rule.getIcon();
+					if (icons.size() > 0) {
+						result = ((IconType) icons.get(0)).getLargeIcon();
+					}
+				}
+			}
+		}
+		return result == null ? null : result.getTextContent();
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void setLargeicon(String newValue) {
+		// String oldLargeicon = null;
+		// IconType icon = null;
+		LargeIconType oldLargeIcon = null;
+		LargeIconType newLargeIconType = null;
+		IconType icon = null;
+		if (getFCElements().size() > 0) {
+			for (int i = 0, n = getFCElements().size(); i < n; i++) {
+				NavigationRuleType rule = null;
+				if ((rule = resolveRule(getFCElements().get(i))) != null) {
+					List icons = rule.getIcon();
+					if (newValue == null || newValue.length() == 0) {
+						if (icons.size() > 0) {
+							if (((IconType) icons.get(0)).getLargeIcon() != null) {
+								((IconType) icons.get(0)).setLargeIcon(null);
+							}
+						}
+					} else {
+						if (icons.size() == 0) {
+							icon = FacesConfigFactory.eINSTANCE
+									.createIconType();
+							newLargeIconType = FacesConfigFactory.eINSTANCE
+									.createLargeIconType();
+							newLargeIconType.setTextContent(newValue);
+							icon.setLargeIcon(newLargeIconType);
+							icons.add(icon);
+						} else if (((IconType) icons.get(0)).getLargeIcon() == null) {
+							newLargeIconType = FacesConfigFactory.eINSTANCE
+									.createLargeIconType();
+							newLargeIconType.setTextContent(newValue);
+							icon = ((IconType) icons.get(0));
+							icon.setLargeIcon(newLargeIconType);
+						} else {
+							oldLargeIcon = ((IconType) icons.get(0))
+									.getLargeIcon();
+							oldLargeIcon.setTextContent(newValue);
+						}
+					}
+				}
+			}
+		}
+
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					PageflowPackage.PF_PAGE__LARGEICON, oldLargeIcon, newValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain eInverseAdd(InternalEObject otherEnd,
+			int featureID, Class baseClass, NotificationChain msgs) {
+		if (featureID >= 0) {
+			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
+			case PageflowPackage.PF_PAGE__PAGEFLOW:
+				if (eContainer != null)
+					msgs = eBasicRemoveFromContainer(msgs);
+				return eBasicSetContainer(otherEnd,
+						PageflowPackage.PF_PAGE__PAGEFLOW, msgs);
+			case PageflowPackage.PF_PAGE__OUTLINKS:
+				return ((InternalEList) getOutlinks()).basicAdd(otherEnd, msgs);
+			case PageflowPackage.PF_PAGE__INLINKS:
+				return ((InternalEList) getInlinks()).basicAdd(otherEnd, msgs);
+			default:
+				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
+			}
+		}
+		if (eContainer != null)
+			msgs = eBasicRemoveFromContainer(msgs);
+		return eBasicSetContainer(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain eInverseRemove(InternalEObject otherEnd,
+			int featureID, Class baseClass, NotificationChain msgs) {
+		if (featureID >= 0) {
+			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
+			case PageflowPackage.PF_PAGE__PAGEFLOW:
+				return eBasicSetContainer(null,
+						PageflowPackage.PF_PAGE__PAGEFLOW, msgs);
+			case PageflowPackage.PF_PAGE__OUTLINKS:
+				return ((InternalEList) getOutlinks()).basicRemove(otherEnd,
+						msgs);
+			case PageflowPackage.PF_PAGE__INLINKS:
+				return ((InternalEList) getInlinks()).basicRemove(otherEnd,
+						msgs);
+			default:
+				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
+						msgs);
+			}
+		}
+		return eBasicSetContainer(null, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
+		if (eContainerFeatureID >= 0) {
+			switch (eContainerFeatureID) {
+			case PageflowPackage.PF_PAGE__PAGEFLOW:
+				return ((InternalEObject) eContainer).eInverseRemove(this,
+						PageflowPackage.PAGEFLOW__NODES, Pageflow.class, msgs);
+			default:
+				return eDynamicBasicRemoveFromContainer(msgs);
+			}
+		}
+		return ((InternalEObject) eContainer).eInverseRemove(this,
+				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case PageflowPackage.PF_PAGE__NAME:
+			return getName();
+		case PageflowPackage.PF_PAGE__COMMENT:
+			return getComment();
+		case PageflowPackage.PF_PAGE__X:
+			return new Integer(getX());
+		case PageflowPackage.PF_PAGE__Y:
+			return new Integer(getY());
+		case PageflowPackage.PF_PAGE__WIDTH:
+			return new Integer(getWidth());
+		case PageflowPackage.PF_PAGE__HEIGHT:
+			return new Integer(getHeight());
+		case PageflowPackage.PF_PAGE__ID:
+			return getId();
+		case PageflowPackage.PF_PAGE__PAGEFLOW:
+			return getPageflow();
+		case PageflowPackage.PF_PAGE__OUTLINKS:
+			return getOutlinks();
+		case PageflowPackage.PF_PAGE__INLINKS:
+			return getInlinks();
+		case PageflowPackage.PF_PAGE__PATH:
+			return getPath();
+		case PageflowPackage.PF_PAGE__SMALLICON:
+			return getSmallicon();
+		case PageflowPackage.PF_PAGE__LARGEICON:
+			return getLargeicon();
+		}
+		return super.eGet(eFeature, resolve);// eDynamicGet(eFeature,
+		// resolve);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void eSet(EStructuralFeature eFeature, Object newValue) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case PageflowPackage.PF_PAGE__NAME:
+			setName((String) newValue);
+			return;
+		case PageflowPackage.PF_PAGE__COMMENT:
+			setComment((String) newValue);
+			return;
+		case PageflowPackage.PF_PAGE__X:
+			setX(((Integer) newValue).intValue());
+			return;
+		case PageflowPackage.PF_PAGE__Y:
+			setY(((Integer) newValue).intValue());
+			return;
+		case PageflowPackage.PF_PAGE__WIDTH:
+			setWidth(((Integer) newValue).intValue());
+			return;
+		case PageflowPackage.PF_PAGE__HEIGHT:
+			setHeight(((Integer) newValue).intValue());
+			return;
+		case PageflowPackage.PF_PAGE__ID:
+			setId((String) newValue);
+			return;
+		case PageflowPackage.PF_PAGE__PAGEFLOW:
+			setPageflow((Pageflow) newValue);
+			return;
+		case PageflowPackage.PF_PAGE__OUTLINKS:
+			getOutlinks().clear();
+			getOutlinks().addAll((Collection) newValue);
+			return;
+		case PageflowPackage.PF_PAGE__INLINKS:
+			getInlinks().clear();
+			getInlinks().addAll((Collection) newValue);
+			return;
+		case PageflowPackage.PF_PAGE__PATH:
+			setPath((String) newValue);
+			return;
+		case PageflowPackage.PF_PAGE__SMALLICON:
+			setSmallicon((String) newValue);
+			return;
+		case PageflowPackage.PF_PAGE__LARGEICON:
+			setLargeicon((String) newValue);
+			return;
+		}
+		super.eSet(eFeature, newValue);// eDynamicSet(eFeature, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void eUnset(EStructuralFeature eFeature) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case PageflowPackage.PF_PAGE__NAME:
+			setName(NAME_EDEFAULT);
+			return;
+		case PageflowPackage.PF_PAGE__COMMENT:
+			setComment(COMMENT_EDEFAULT);
+			return;
+		case PageflowPackage.PF_PAGE__X:
+			setX(X_EDEFAULT);
+			return;
+		case PageflowPackage.PF_PAGE__Y:
+			setY(Y_EDEFAULT);
+			return;
+		case PageflowPackage.PF_PAGE__WIDTH:
+			setWidth(WIDTH_EDEFAULT);
+			return;
+		case PageflowPackage.PF_PAGE__HEIGHT:
+			setHeight(HEIGHT_EDEFAULT);
+			return;
+		case PageflowPackage.PF_PAGE__ID:
+			setId(ID_EDEFAULT);
+			return;
+		case PageflowPackage.PF_PAGE__PAGEFLOW:
+			setPageflow((Pageflow) null);
+			return;
+		case PageflowPackage.PF_PAGE__OUTLINKS:
+			getOutlinks().clear();
+			return;
+		case PageflowPackage.PF_PAGE__INLINKS:
+			getInlinks().clear();
+			return;
+		case PageflowPackage.PF_PAGE__PATH:
+			setPath(PATH_EDEFAULT);
+			return;
+		case PageflowPackage.PF_PAGE__SMALLICON:
+			setSmallicon(SMALLICON_EDEFAULT);
+			return;
+		case PageflowPackage.PF_PAGE__LARGEICON:
+			setLargeicon(LARGEICON_EDEFAULT);
+			return;
+		}
+		super.eUnset(eFeature);// eDynamicUnset(eFeature);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public boolean eIsSet(EStructuralFeature eFeature) {
+		switch (eDerivedStructuralFeatureID(eFeature)) {
+		case PageflowPackage.PF_PAGE__NAME:
+			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
+					.equals(name);
+		case PageflowPackage.PF_PAGE__COMMENT:
+			return COMMENT_EDEFAULT == null ? comment != null
+					: !COMMENT_EDEFAULT.equals(comment);
+		case PageflowPackage.PF_PAGE__X:
+			return x != X_EDEFAULT;
+		case PageflowPackage.PF_PAGE__Y:
+			return y != Y_EDEFAULT;
+		case PageflowPackage.PF_PAGE__WIDTH:
+			return width != WIDTH_EDEFAULT;
+		case PageflowPackage.PF_PAGE__HEIGHT:
+			return height != HEIGHT_EDEFAULT;
+		case PageflowPackage.PF_PAGE__ID:
+			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
+					.equals(getId());
+		case PageflowPackage.PF_PAGE__PAGEFLOW:
+			return getPageflow() != null;
+		case PageflowPackage.PF_PAGE__OUTLINKS:
+			return outlinks != null && !outlinks.isEmpty();
+		case PageflowPackage.PF_PAGE__INLINKS:
+			return inlinks != null && !inlinks.isEmpty();
+		case PageflowPackage.PF_PAGE__PATH:
+			return PATH_EDEFAULT == null ? getPath() != null : !PATH_EDEFAULT
+					.equals(getPath());
+		case PageflowPackage.PF_PAGE__SMALLICON:
+			return SMALLICON_EDEFAULT == null ? getSmallicon() != null
+					: !SMALLICON_EDEFAULT.equals(getSmallicon());
+		case PageflowPackage.PF_PAGE__LARGEICON:
+			return LARGEICON_EDEFAULT == null ? getLargeicon() != null
+					: !LARGEICON_EDEFAULT.equals(getLargeicon());
+		}
+		return super.eIsSet(eFeature);// eDynamicIsSet(eFeature);
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public String toString() {
+		if (eIsProxy())
+			return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (path: ");
+		result.append(getPath());
+		result.append(", smallicon: ");
+		result.append(getSmallicon());
+		result.append(", largeicon: ");
+		result.append(getLargeicon());
+		result.append(')');
+		return result.toString();
+	}
+
+}
+// PFPageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFSynchronizer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFSynchronizer.java
new file mode 100644
index 0000000..8c97c01
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFSynchronizer.java
@@ -0,0 +1,95 @@
+/**
+ * Confidential Property of Sybase, Inc. 
+ * (c) Copyright Sybase, Inc. 2004-2006. 
+ * All rights reserved.
+ */
+package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
+
+/**
+ * The synchronizer which is used to synchronize modification in source view
+ * with pageflow view.
+ * 
+ * @author hmeng
+ * 
+ */
+public class FC2PFSynchronizer implements Adapter {
+
+	Pageflow pageflow;
+
+	FacesConfigType facesConfig;
+
+	public FC2PFSynchronizer(Pageflow pf, FacesConfigType fc) {
+		this.pageflow = pf;
+		this.facesConfig = fc;
+	}
+
+	public Notifier getTarget() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public boolean isAdapterForType(Object type) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	public void notifyChanged(Notification notification) {
+		if (!(notification.getNotifier() instanceof EObject)) {
+			return;
+		}
+		int type = notification.getEventType();
+		switch (type) {
+		case Notification.ADD: {
+			// PageflowTransform.getInstance().updatePageflowModelFromEMF(
+			// pageflow, facesConfig);
+			break;
+		}
+			// int featureId = notification.getFeatureID(PageflowPackage.class);
+			//
+			// EObject target = (EObject) this.getTarget();
+			// if (target instanceof NavigationCaseType) {
+			// PFLink link = (PFLink) FC2PFTransformer.getInstance()
+			// .getCases2LinksMap().get(target);
+			// } else if (target.eContainer() instanceof NavigationCaseType) {
+			// PFLink link = (PFLink) FC2PFTransformer.getInstance()
+			// .getCases2LinksMap().get(target.eContainer());
+			// if (link != null) {
+			// if (target instanceof DescriptionType) {
+			// link.setComment(((DescriptionType) target)
+			// .getTextContent());
+			// } else if (target instanceof DisplayNameType) {
+			// link.setName(((DisplayNameType) target)
+			// .getTextContent());
+			// PageflowLayoutManager.getInstance().layoutPageflow(
+			// link.getPageflow());
+			// }
+			// }
+			// }
+			// }
+		case Notification.SET:
+			if (notification.getNewValue() != null) {
+			}
+
+			break;
+		case Notification.REMOVE:
+			break;
+		}
+	}
+
+	public void dispose() {
+
+	}
+
+	public void setTarget(Notifier newTarget) {
+		// TODO Auto-generated method stub
+
+	}
+
+}
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 2f755de..2d4b15f 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
@@ -415,6 +415,8 @@
 				break;
 			}
 			}
+			refreshPFAdapter(pageflow);
+			refreshFCAdapter(facesConfig);
 			isInEvent = false;
 		}
 
@@ -422,8 +424,6 @@
 			pageflow.notifyModelChanged(new ENotificationImpl(
 					(InternalEObject) notification.getNotifier(),
 					Notification.SET, PageflowPackage.PAGEFLOW, null, null));
-			refreshPFAdapter(pageflow);
-			refreshFCAdapter(facesConfig);
 		}
 
 		public void dispose() {
@@ -502,6 +502,8 @@
 					break;
 				}
 			}
+			refreshFCAdapter((EObject) notification.getNotifier());
+			refreshPFAdapter(pageflow);
 
 			isInEvent = false;
 		}
@@ -509,8 +511,6 @@
 		private void updateAndNotify(Notification notification) {
 			Assert
 					.isTrue(notification.getNotifier() instanceof InternalEObject);
-			refreshFCAdapter((EObject) notification.getNotifier());
-			refreshPFAdapter(pageflow);
 			pageflow.notifyModelChanged(new ENotificationImpl(
 					(InternalEObject) notification.getNotifier(),
 					Notification.SET, PageflowPackage.PAGEFLOW, null, null));
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PF2FCSynchronizer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PF2FCSynchronizer.java
new file mode 100644
index 0000000..e694f81
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PF2FCSynchronizer.java
@@ -0,0 +1,960 @@
+/**
+ * Confidential Property of Sybase, Inc. 
+ * (c) Copyright Sybase, Inc. 2004-2006. 
+ * All rights reserved.
+ */
+package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
+import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
+import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
+import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
+import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
+import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
+import org.eclipse.jst.jsf.facesconfig.emf.IconType;
+import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
+import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
+import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
+import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
+import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
+import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFPage;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
+import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
+
+/**
+ * The class to synchronize modification in pageflow for faces config.
+ * 
+ * @author hmeng
+ * 
+ */
+public class PF2FCSynchronizer implements Adapter {
+
+	Pageflow pageflow;
+
+	FacesConfigType facesConfig;
+
+	public PF2FCSynchronizer(Pageflow pf, FacesConfigType fc) {
+		this.pageflow = pf;
+		this.facesConfig = fc;
+	}
+
+	public Notifier getTarget() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public boolean isAdapterForType(Object type) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	private void addPage(Notification notification, PageflowElement element) {
+		// ((EObject) notification.getNewValue()).eAdapters().add(this);
+	}
+
+	private String getFromViewID(NavigationRuleType rule) {
+		String result = "*";
+		if (rule.getFromViewId() != null) {
+			result = rule.getFromViewId().getTextContent();
+		}
+		return result;
+	}
+
+	private String getToViewID(NavigationCaseType navCase) {
+		String result = "*";
+		if (navCase.getToViewId() != null) {
+			result = navCase.getToViewId().getTextContent();
+		}
+		return result;
+	}
+
+	/**
+	 * All the fromViewID or toViewID
+	 * 
+	 * @param path
+	 * @return
+	 */
+	public List findFacesPages(String path) {
+		List rules = facesConfig.getNavigationRule();
+		List result = new ArrayList();
+		for (int i = 0; i < rules.size(); i++) {
+			NavigationRuleType rule = (NavigationRuleType) rules.get(i);
+			String fromViewID = getFromViewID(rule);
+			if (fromViewID.equals(path)) {
+				result.add(rule.getFromViewId());
+			}
+			List cases = rule.getNavigationCase();
+			for (int j = 0; j < cases.size(); j++) {
+				NavigationCaseType navCase = (NavigationCaseType) cases.get(j);
+				String toViewID = getToViewID(navCase);
+				if (toViewID.equals(path)) {
+					result.add(navCase.getToViewId());
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Find navigation rule with fromViewID.
+	 * 
+	 * @param fromID
+	 * @return
+	 */
+	// private List findFacesRules(String fromID) {
+	// List rules = facesConfig.getNavigationRule();
+	// List result = new ArrayList();
+	// for (int i = 0; i < rules.size(); i++) {
+	// NavigationRuleType rule = (NavigationRuleType) rules.get(i);
+	// String fromViewID = "*";
+	// if (rule.getFromViewId() != null) {
+	// fromViewID = rule.getFromViewId().getTextContent();
+	// }
+	// // FIXME: case sensitive?
+	// if (fromViewID.equalsIgnoreCase(fromID)) {
+	// result.add(rule);
+	// }
+	// }
+	// return result;
+	// }
+	// /**
+	// * Page to page case.
+	// *
+	// * @param rule
+	// * @param outCome
+	// * @param toViewID
+	// * @return
+	// */
+	// private List findFacesCase(NavigationRuleType rule, String outCome,
+	// String toViewID) {
+	// List cases = rule.getNavigationCase();
+	// List result = new ArrayList();
+	// for (int i = 0; i < cases.size(); i++) {
+	// NavigationCaseType navCase = (NavigationCaseType) cases.get(i);
+	// String fromOutcome = null;
+	// if (navCase.getFromOutcome() != null) {
+	// fromOutcome = navCase.getFromOutcome().getTextContent();
+	// }
+	// // FIXME: case sensitive? Don't consider other properties like icon,
+	// // description. etc.
+	// if (outCome == null && fromOutcome == null || outCome != null
+	// && fromOutcome != null
+	// && fromOutcome.equalsIgnoreCase(outCome)) {
+	// if (toViewID != null
+	// && navCase.getToViewId() != null
+	// && toViewID.equals(navCase.getToViewId()
+	// .getTextContent()))
+	// result.add(navCase);
+	// }
+	// }
+	// return result;
+	// }
+	/**
+	 * Page->action->page
+	 * 
+	 * @param rule
+	 * @param action
+	 * @param outCome
+	 * @param toViewID
+	 * @return
+	 */
+	// private List findFacesCase(NavigationRuleType rule, String action,
+	// String outCome, String toViewID) {
+	// List cases = rule.getNavigationCase();
+	// List result = new ArrayList();
+	// for (int i = 0; i < cases.size(); i++) {
+	// NavigationCaseType navCase = (NavigationCaseType) cases.get(i);
+	// String fromAction = null;
+	// if (navCase.getFromAction() != null) {
+	// fromAction = navCase.getFromAction().getTextContent();
+	// }
+	// String fromOutcome = null;
+	// if (navCase.getFromOutcome() != null) {
+	// fromOutcome = navCase.getFromOutcome().getTextContent();
+	// }
+	// // FIXME: case sensitive? Don't consider other properties like icon,
+	// // description. etc.
+	// if (outCome == null && fromOutcome == null || outCome != null
+	// && fromOutcome != null && fromOutcome.equals(outCome)) {
+	// if (toViewID != null
+	// && navCase.getToViewId() != null
+	// && toViewID.equals(navCase.getToViewId()
+	// .getTextContent()))
+	// if (fromAction != null && action != null
+	// && fromAction.equals(action)) {
+	// result.add(navCase);
+	// }
+	// }
+	// }
+	// return result;
+	// }
+	//
+	// private void createFacesCase(PFLink link, PFPage source, String
+	// actionStr,
+	// PFPage target) {
+	// NavigationRuleType rule = FacesConfigFactory.eINSTANCE
+	// .createNavigationRuleType();
+	// NavigationCaseType navCase = FacesConfigFactory.eINSTANCE
+	// .createNavigationCaseType();
+	// FromViewIdType from = FacesConfigFactory.eINSTANCE
+	// .createFromViewIdType();
+	// from.setTextContent(source.getPath());
+	// ToViewIdType toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
+	// toView.setTextContent(target.getPath());
+	// FromActionType action = FacesConfigFactory.eINSTANCE
+	// .createFromActionType();
+	// action.setTextContent(actionStr);
+	// updateFacesCase(link, navCase);
+	// navCase.setFromAction(action);
+	// navCase.setToViewId(toView);
+	// rule.getNavigationCase().add(navCase);
+	// rule.setFromViewId(from);
+	// facesConfig.getNavigationRule().add(rule);
+	// updateFacesRule(rule, source);
+	// FC2PFTransformer.getInstance().getMapCases2Links().put(navCase, link);
+	// FC2PFTransformer.getInstance().getMapLinks2Cases().put(link, navCase);
+	// }
+	// private void updateFacesCase(PFLink ref, NavigationCaseType navCase) {
+	// if (ref != null) {
+	// if (ref.getOutcome() != null) {
+	// FromOutcomeType outcome = FacesConfigFactory.eINSTANCE
+	// .createFromOutcomeType();
+	// outcome.setTextContent(ref.getOutcome());
+	// navCase.setFromOutcome(outcome);
+	// }
+	// if (ref.getName() != null) {
+	// DisplayNameType display = FacesConfigFactory.eINSTANCE
+	// .createDisplayNameType();
+	// display.setTextContent(ref.getName());
+	// navCase.getDisplayName().add(display);
+	// }
+	// if (ref.getComment() != null) {
+	// DescriptionType description = FacesConfigFactory.eINSTANCE
+	// .createDescriptionType();
+	// description.setTextContent(ref.getComment());
+	// navCase.getDescription().add(description);
+	// }
+	// }
+	// }
+	private void updateFacesRule(NavigationRuleType navigationRule,
+			PFPage pageSource) {
+		FacesConfigFactory factory = FacesConfigFactory.eINSTANCE;
+		if (pageSource.getComment() != null) {
+			DescriptionType description = factory.createDescriptionType();
+			description.setTextContent(pageSource.getComment());
+			navigationRule.getDescription().clear();
+			navigationRule.getDescription().add(description);
+		}
+		// set the navigation rule's icon
+		if (pageSource.getLargeicon() != null
+				|| pageSource.getSmallicon() != null) {
+			IconType icon = factory.createIconType();
+			if (pageSource.getLargeicon() != null) {
+				LargeIconType largeicon = factory.createLargeIconType();
+				largeicon.setTextContent(pageSource.getLargeicon());
+				icon.setLargeIcon(largeicon);
+			}
+
+			if (pageSource.getSmallicon() != null) {
+				SmallIconType smallicon = factory.createSmallIconType();
+				smallicon.setTextContent(pageSource.getSmallicon());
+				icon.setSmallIcon(smallicon);
+			}
+			navigationRule.getIcon().clear();
+			navigationRule.getIcon().add(icon);
+		}
+	}
+
+	private void createFacesCase(PFLink link, PFPage source, PFPage target) {
+		NavigationRuleType rule = FacesConfigFactory.eINSTANCE
+				.createNavigationRuleType();
+		FromViewIdType from = FacesConfigFactory.eINSTANCE
+				.createFromViewIdType();
+		from.setTextContent((source).getPath());
+		rule.setFromViewId(from);
+		NavigationCaseType navCase = FacesConfigFactory.eINSTANCE
+				.createNavigationCaseType();
+		ToViewIdType toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
+		toView.setTextContent((target).getPath());
+		navCase.setToViewId(toView);
+		// updateFacesCase(link, navCase);
+		link.getFCElements().add(navCase);
+		rule.getNavigationCase().add(navCase);
+		facesConfig.getNavigationRule().add(rule);
+		updateFacesRule(rule, source);
+		FC2PFTransformer.getInstance().getMapCases2Links().put(navCase, link);
+		FC2PFTransformer.getInstance().getMapLinks2Cases().put(link, navCase);
+	}
+
+	private void removePageToPageLink(PFPage start, PFLink link, PFPage target) {
+		if (FC2PFTransformer.getInstance().getMapLinks2Cases()
+				.containsKey(link)) {
+			link.eAdapters().remove(FC2PFTransformer.getInstance());
+			NavigationCaseType caseFC = (NavigationCaseType) FC2PFTransformer
+					.getInstance().getMapLinks2Cases().remove(link);
+			FC2PFTransformer.getInstance().getMapCases2Links().remove(caseFC);
+			removeCase(caseFC);
+		}
+	}
+
+	private void removeCase(NavigationCaseType navCase) {
+		NavigationRuleType rule = (NavigationRuleType) navCase.eContainer();
+		(rule).getNavigationCase().remove(navCase);
+		if (rule.getNavigationCase().size() == 0) {
+			facesConfig.getNavigationRule().remove(rule);
+		}
+	}
+
+	// private void removePageToActionLink(PFPage page, PFAction action) {
+	// if (action.getOutlinks().size() > 0 && page != null) {
+	// String pagePath = page.getPath();
+	// List list = findFacesRules(pagePath);
+	// for (int i = 0; i < list.size(); i++) {
+	// NavigationRuleType rule = (NavigationRuleType) list.get(i);
+	// List actionOutlinks = action.getOutlinks();
+	// for (int j = 0; j < actionOutlinks.size(); j++) {
+	// PFLink actionOutlink = (PFLink) actionOutlinks.get(j);
+	// String outcome = actionOutlink.getOutcome();
+	// List cases = findFacesCase(rule, action.getName(), outcome,
+	// ((PFPage) actionOutlink.getTarget()).getPath());
+	// removeCases(rule, cases);
+	// if (rule.getNavigationCase().size() == 0) {
+	// FacesConfigType facesConfig = (FacesConfigType) rule
+	// .eContainer();
+	// facesConfig.getNavigationRule().remove(rule);
+	// break;
+	// }
+	// }
+	// }
+	// }
+	// }
+
+	// private void removeActionToPageLink(PFAction element, PFPage page,
+	// PFLink value) {
+	// if (element != null && value != null && page != null) {
+	// if (hasDuplicatedLinks(element, page, value)) {
+	// return;
+	// }
+	// PFLink link = (PFLink) value;
+	// PageflowNode source = link.getSource();
+	// PageflowNode target = link.getTarget();
+	// link.setTarget(page);
+	// link.setSource(element);
+	// List cases = getCasesInCache(link);
+	// link.setTarget(source);
+	// link.setSource(target);
+	// for (int i = 0, n = cases.size(); i < n; i++) {
+	// removeCase((NavigationCaseType) cases.get(i));
+	// }
+	// // List inLinks = ((PFAction) element).getInlinks();
+	// // for (int i = 0; i < inLinks.size(); i++) {
+	// // PFLink inLink = (PFLink) inLinks.get(i);
+	// // PFPage start = (PFPage) inLink.getSource();
+	// // if (start instanceof PFPage) {
+	// // String path = ((PFPage) start).getPath();
+	// // List list = findFacesRules(path);
+	// // for (int j = 0; j < list.size(); j++) {
+	// // NavigationRuleType rule = (NavigationRuleType) list
+	// // .get(j);
+	// // String outcome = link.getOutcome();
+	// // String fromAction = ((PFAction) element).getAction();
+	// // List cases = findFacesCase(rule, fromAction, outcome,
+	// // page.getPath());
+	// // removeCases(rule, cases);
+	// // if (rule.getNavigationCase().size() == 0) {
+	// // FacesConfigType facesConfig = (FacesConfigType) rule
+	// // .eContainer();
+	// // facesConfig.getNavigationRule().remove(rule);
+	// // }
+	// // }
+	// // }
+	// // }
+	// }
+	// }
+
+	// private boolean hasDuplicatedLinks(PFPage start, PFPage end,
+	// PFLink link) {
+	// List links = start.getOutlinks();
+	// int c = 0;
+	// for (int i = 0, n = links.size(); i < n; i++) {
+	// PFLink theLink = ((PFLink) links.get(i));
+	// if (theLink.getTarget() == end) {
+	// if (theLink.getOutcome() == null && link.getOutcome() == null
+	// || theLink.getOutcome() != null
+	// && link.getOutcome() != null
+	// && theLink.getOutcome().equals(link.getOutcome())) {
+	// c++;
+	// break;
+	// }
+	// }
+	// }
+	// return c > 0;
+	// }
+
+	// private boolean hasDuplicatedLinks(PFLink link) {
+	// PageflowNode source = link.getSource();
+	// List links = source.getOutlinks();
+	// int c = 0;
+	// for (int i = 0, n = links.size(); i < n; i++) {
+	// PFLink theLink = ((PFLink) links.get(i));
+	// if (theLink.getOutcome() == null && link.getOutcome() == null
+	// || theLink.getOutcome() != null
+	// && link.getOutcome() != null
+	// && theLink.getOutcome().equals(link.getOutcome())) {
+	// c++;
+	// break;
+	// }
+	// }
+	// return c > 0;
+	// }
+
+	private void propertyChanged(Notification notification,
+			PageflowElement element) {
+		if (notification.getNewValue() != null) {
+			int value = notification.getFeatureID(PageflowPackage.class);
+			if (element instanceof PFPage) {
+				setPageProperties(notification, element, value);
+			} else if (element instanceof PFLink) {
+				// System.out.println("The link property is changed");
+				// setLinkProperties(notification, element, value);
+			}
+		}
+	}
+
+	// private void setActionProperties(Notification notification,
+	// PageflowElement element, int value) {
+	// String actionID = ((PFAction) element).getAction();
+	// if (value == PageflowPackage.PF_ACTION__ACTION) {
+	// actionID = notification.getOldStringValue();
+	// List cases = getCases((PFAction) element, actionID);
+	// for (int i = 0; i < cases.size(); i++) {
+	// // switch (value) {
+	// // case PageflowPackage.PF_ACTION__ACTION:
+	// FromActionType action = ((NavigationCaseType) cases.get(i))
+	// .getFromAction();
+	// if (action == null) {
+	// action = FacesConfigFactory.eINSTANCE
+	// .createFromActionType();
+	// action.setTextContent(notification.getNewStringValue());
+	// ((NavigationCaseType) cases.get(i)).setFromAction(action);
+	// } else {
+	// action.setTextContent(notification.getNewStringValue());
+	// }
+	// }
+	// }
+	// }
+
+	private List getCasesInCache(PFLink link) {
+		List result = new ArrayList();
+		Iterator iterator = FC2PFTransformer.getInstance().getMapLinks2Cases()
+				.keySet().iterator();
+		while (iterator.hasNext()) {
+			PFLink theLink = (PFLink) iterator.next();
+			if (theLink.equals(link)) {
+				result.add(FC2PFTransformer.getInstance().getMapLinks2Cases()
+						.get(theLink));
+			}
+		}
+		return result;
+	}
+
+	private void setLinkProperties(Notification notification,
+			PageflowElement element, int value) {
+		// String outcome = ((PFLink) element).getOutcome();
+		// if (value == PageflowPackage.PF_LINK__OUTCOME) {
+		// outcome = notification.getOldStringValue();
+		// }
+		List cases = getCasesInCache((PFLink) element);
+		// NavigationCaseType caseFC = null;
+		// if (FC2PFTransformer.getInstance().getMapLinks2Cases().get(element)
+		// != null) {
+		// caseFC = (NavigationCaseType) FC2PFTransformer.getInstance()
+		// .getMapLinks2Cases().get(element);
+		// }
+		// if (cases.size()>0 != null) {
+		// List cases = getCases((PFLink) element, outcome);
+		for (int i = 0; i < cases.size(); i++) {
+			NavigationCaseType caseFC = (NavigationCaseType) cases.get(i);
+			switch (value) {
+			case PageflowPackage.PF_LINK__REDIRECT:
+				if (notification.getNewBooleanValue()) {
+					RedirectType redirect = FacesConfigFactory.eINSTANCE
+							.createRedirectType();
+					caseFC.setRedirect(redirect);
+				} else {
+					if (caseFC != null) {
+						caseFC.setRedirect(null);
+					}
+				}
+				break;
+			case PageflowPackage.PF_LINK__COMMENT:
+				caseFC.getDescription().clear();
+				caseFC.getDescription().add(notification.getNewStringValue());
+				break;
+			case PageflowPackage.PF_LINK__NAME:
+				caseFC.getDisplayName().clear();
+				caseFC.getDisplayName().add(notification.getNewStringValue());
+				break;
+			case PageflowPackage.PF_LINK__OUTCOME:
+				FromOutcomeType caseOutcome = caseFC.getFromOutcome();
+				if (caseOutcome != null) {
+					caseOutcome
+							.setTextContent(notification.getNewStringValue());
+				} else {
+					FromOutcomeType newoutcome = FacesConfigFactory.eINSTANCE
+							.createFromOutcomeType();
+					newoutcome.setTextContent(notification.getNewStringValue());
+					caseFC.setFromOutcome(newoutcome);
+				}
+				break;
+
+			case PageflowPackage.PF_LINK__FROMACTION:
+				// FromActionType fromAction = caseFC.getFromAction();
+				// if (fromAction != null) {
+				// if (notification.getNewStringValue() != null
+				// && notification.getNewStringValue().trim().length() != 0) {
+				// fromAction.setTextContent(notification
+				// .getNewStringValue());
+				// } else {
+				// caseFC.setFromAction(null);
+				// }
+				// } else if (notification.getNewStringValue() != null
+				// && notification.getNewStringValue().trim().length() != 0) {
+				// FromActionType fromaction = FacesConfigFactory.eINSTANCE
+				// .createFromActionType();
+				// fromaction.setTextContent(notification.getNewStringValue());
+				// caseFC.setFromAction(fromaction);
+				// }
+				break;
+			}
+		}
+	}
+
+	// private List getCases(PFAction action, String actionStr) {
+	// List result = new ArrayList();
+	// List InLinks = action.getInlinks();
+	// List outLinks = action.getOutlinks();
+	// for (int i = 0, n = InLinks.size(); i < n; i++) {
+	// PageflowNode start = ((PFLink) InLinks.get(i)).getSource();
+	// List rules = findFacesRules(((PFPage) start).getPath());
+	// for (int j = 0, nn = rules.size(); j < nn; j++) {
+	// for (int jj = 0, nnn = outLinks.size(); jj < nnn; jj++) {
+	// PFLink link = (PFLink) outLinks.get(jj);
+	// String outcome = link.getOutcome();
+	// String toID = ((PFPage) (link.getTarget())).getPath();
+	// List cases = findFacesCase((NavigationRuleType) rules
+	// .get(j), actionStr, outcome, toID);
+	// result.addAll(cases);
+	// }
+	// }
+	// }
+	// return result;
+	// }
+
+	// private List getCases(PFLink link, String outcome) {
+	// List result = new ArrayList();
+	// if (link != null && link.getTarget() instanceof PFPage) {
+	// if (link.getSource() instanceof PFAction) {
+	// // Page source:
+	// List links = ((PFAction) link.getSource()).getInlinks();
+	// for (int i = 0; i < links.size(); i++) {
+	// PageflowNode source = ((PFLink) links.get(i)).getSource();
+	// List rules = findFacesRules(((PFPage) source).getPath());
+	// for (int j = 0; j < rules.size(); j++) {
+	// NavigationRuleType rule = (NavigationRuleType) rules
+	// .get(j);
+	// // Compare cases:
+	// List cases = rule.getNavigationCase();
+	// for (int k = 0; k < cases.size(); k++) {
+	// NavigationCaseType navCase = (NavigationCaseType) cases
+	// .get(k);
+	// String action = ((PFAction) link.getSource())
+	// .getAction();
+	// String targetPath = ((PFPage) link.getTarget())
+	// .getPath();
+	// if (navCase.getFromAction() != null
+	// && action.equals(navCase.getFromAction()
+	// .getTextContent())
+	// && navCase.getToViewId() != null
+	// && navCase.getToViewId().getTextContent()
+	// .equals(targetPath)) {
+	// FromOutcomeType fromOutCome = navCase
+	// .getFromOutcome();
+	// if ((fromOutCome == null && outcome == null)
+	// || (fromOutCome != null
+	// && outcome != null && fromOutCome
+	// .getTextContent().equals(
+	// outcome)))
+	// result.add(navCase);
+	// }
+	// }
+	// }
+	// }
+	// } else if (link.getSource() instanceof PFPage) {
+	// List rules = findFacesRules(((PFPage) link.getSource())
+	// .getPath());
+	// for (int j = 0; j < rules.size(); j++) {
+	// NavigationRuleType rule = (NavigationRuleType) rules.get(j);
+	// List cases = rule.getNavigationCase();
+	// for (int k = 0; k < cases.size(); k++) {
+	// NavigationCaseType navCase = (NavigationCaseType) cases
+	// .get(k);
+	// PFPage target = (PFPage) link.getTarget();
+	// // FIXME: Can getToViewId() return null?
+	// if (target.getPath().equals(
+	// navCase.getToViewId().getTextContent())) {
+	// FromOutcomeType fromOutCome = navCase
+	// .getFromOutcome();
+	// if ((fromOutCome == null && outcome == null)
+	// || (fromOutCome != null && outcome != null && fromOutCome
+	// .getTextContent().equals(outcome)))
+	// result.add(navCase);
+	// }
+	// }
+	// }
+	// }
+	// }
+	// return result;
+	// }
+
+	private void setPageProperties(Notification notification,
+			PageflowElement element, int value) {
+		String path = ((PFPage) element).getPath();
+		List list = findFacesPages(path);
+		for (int i = 0; i < list.size(); i++) {
+			if (list.get(i) instanceof FromViewIdType) {
+				FromViewIdType fromViewID = ((FromViewIdType) list.get(i));
+				NavigationRuleType rule = (NavigationRuleType) fromViewID
+						.eContainer();
+				switch (value) {
+				case PageflowPackage.PF_PAGE__NAME:
+					rule.getDisplayName().clear();
+					DisplayNameType displayname = FacesConfigFactory.eINSTANCE
+							.createDisplayNameType();
+					displayname.setTextContent((String) notification
+							.getNewValue());
+					rule.getDisplayName().add(displayname);
+					break;
+				case PageflowPackage.PF_PAGE__COMMENT:
+					rule.getDescription().clear();
+					DescriptionType description = FacesConfigFactory.eINSTANCE
+							.createDescriptionType();
+					description.setTextContent((String) notification
+							.getNewValue());
+					rule.getDescription().add(description);
+					break;
+				case PageflowPackage.PF_PAGE__LARGEICON: {
+					List icons = rule.getIcon();
+					boolean did = false;
+					for (int index = 0; index < icons.size(); index++) {
+						IconType icon = (IconType) icons.get(index);
+						if (icon.getLargeIcon() != null) {
+							icon.getLargeIcon().setTextContent(
+									(String) notification.getNewValue());
+							did = true;
+						}
+					}
+					if (!did) {
+						IconType icon = FacesConfigFactory.eINSTANCE
+								.createIconType();
+						LargeIconType largeIconType = FacesConfigFactory.eINSTANCE
+								.createLargeIconType();
+						largeIconType.setTextContent((String) notification
+								.getNewValue());
+						icon.setLargeIcon(largeIconType);
+						icons.add(icon);
+					}
+					break;
+				}
+				case PageflowPackage.PF_PAGE__SMALLICON: {
+					List icons = rule.getIcon();
+					boolean did = false;
+					for (int index = 0; index < icons.size(); index++) {
+						IconType icon = (IconType) icons.get(index);
+						if (icon.getSmallIcon() != null) {
+							icon.getSmallIcon().setTextContent(
+									(String) notification.getNewValue());
+							did = true;
+						}
+					}
+					if (!did) {
+						IconType icon = FacesConfigFactory.eINSTANCE
+								.createIconType();
+						SmallIconType smallIconType = FacesConfigFactory.eINSTANCE
+								.createSmallIconType();
+						smallIconType.setTextContent((String) notification
+								.getNewValue());
+						icon.setSmallIcon(smallIconType);
+						icons.add(icon);
+					}
+					break;
+				}
+				}
+			}
+		}
+	}
+
+	private void addPageToPageLink(PFPage source, PFPage target, PFLink value) {
+		if (source != null && target != null && value != null) {
+			if (!((PFLink) value).eAdapters().contains(
+					FC2PFTransformer.getInstance())) {
+				((PFLink) value).eAdapters()
+						.add(FC2PFTransformer.getInstance());
+			}
+			// List list = ((PageflowNode) source).getOutlinks();
+			// for (int i = 0; i < list.size(); i++) {
+			// PFLink link = (PFLink) list.get(i);
+			// if (link == value) {
+			// continue;
+			// }
+			// if (link.getTarget() instanceof PFPage) {
+			// PFPage page = (PFPage) link.getTarget();
+			// // there is an existing link.
+			// if (page.getPath().equals(((PFPage) target).getPath())) {
+			// return;
+			// }
+			// }
+			// }
+			createFacesCase(value, (PFPage) source, (PFPage) target);
+		}
+	}
+
+	// private void addPageToActionLink(PFPage source, PFAction target,
+	// Object value) {
+	// if (source != null && target != null && value != null) {
+	// List list = ((PageflowNode) source).getOutlinks();
+	// for (int i = 0; i < list.size(); i++) {
+	// // there is an existing link.
+	// PFLink link = (PFLink) list.get(i);
+	// if (link == value) {
+	// continue;
+	// }
+	// if (link.getTarget() instanceof PFPage) {
+	// PFPage page = (PFPage) link.getTarget();
+	// if (page.getPath().equals(((PFPage) target).getPath())) {
+	// return;
+	// }
+	// }
+	// }
+	// // find next link.
+	// if (target.getOutlinks().size() > 0) {
+	// list = ((PageflowNode) target).getOutlinks();
+	// for (int i = 0; i < list.size(); i++) {
+	// PFLink secondLink = (PFLink) list.get(i);
+	// if (secondLink.getTarget() instanceof PFPage) {
+	// PFPage page = (PFPage) secondLink.getTarget();
+	// PFPage target1 = page;
+	// createFacesCase((PFLink) value, secondLink, source,
+	// target, target1);
+	// }
+	// }
+	// }
+	// }
+	// }
+	//
+	// private void addActionToPageLink(PFAction action, PFPage target,
+	// PFLink value) {
+	// if (action != null && target != null && value != null) {
+	// // List list = ((PageflowNode) action).getOutlinks();
+	// // for (int i = 0; i < list.size(); i++) {
+	// // // there is an existing link.
+	// // PFLink link = (PFLink) list.get(i);
+	// // if (link == value) {
+	// // continue;
+	// // }
+	// // if (link.getTarget() instanceof PFPage) {
+	// // PFPage page = (PFPage) link.getTarget();
+	// // if (page.getPath().equals(((PFPage) target).getPath())) {
+	// // return;
+	// // }
+	// // }
+	// // }
+	// List list;
+	// // find previous link.
+	// if (action.getInlinks().size() > 0) {
+	// list = ((PageflowNode) action).getInlinks();
+	// for (int i = 0; i < list.size(); i++) {
+	// // there is an existing link.
+	// PFLink link = (PFLink) list.get(i);
+	// if (link.getSource() instanceof PFPage) {
+	// createFacesCase(link, value, (PFPage) link.getSource(),
+	// action, target);
+	// }
+	// }
+	// }
+	// }
+	// }
+
+	// private void addedNewElement(Object value) {
+	// // Object value = notification.getNewValue();
+	// if (value instanceof PFLink) {
+	// PageflowNode source = ((PFLink) value).getSource();
+	// PageflowNode target = ((PFLink) value).getTarget();
+	// // page -> page
+	// if (source instanceof PFPage) {
+	// if (target instanceof PFPage) {
+	// }
+	// }
+	// // // page->action->page.
+	// // else if (source instanceof PFAction) {
+	// // if (target instanceof PFPage) {
+	// // }
+	// // }
+	// }
+	// }
+
+	private void addInLink(Notification notification, PageflowElement element) {
+		Object value = notification.getNewValue();
+		PFLink link = (PFLink) value;
+		// for outLink remove, only source is referenced.
+		// if (element instanceof PFAction) {
+		// addPageToActionLink((PFPage) link.getSource(), (PFAction) element,
+		// link);
+		// } else
+		if (element instanceof PFPage) {
+			PageflowNode source = link.getSource();
+			if (source instanceof PFPage) {
+				addPageToPageLink((PFPage) source, (PFPage) element, link);
+			}
+
+			// else if (source instanceof PFAction) {
+			// addActionToPageLink((PFAction) source, (PFPage) element, link);
+			// }
+		}
+
+	}
+
+	private void addOutLink(Notification notification, PageflowElement element) {
+		Object value = notification.getNewValue();
+		// for outLink remove, only target is referenced.
+		PFLink link = (PFLink) value;
+		if (element instanceof PFPage) {
+			PageflowNode target = link.getTarget();
+			// page->page
+			if (target instanceof PFPage) {
+				addPageToPageLink((PFPage) element, (PFPage) target, link);
+			}
+			// else if (target instanceof PFAction)
+			// addPageToActionLink((PFPage) element, (PFAction) target, link);
+			// } else if (element instanceof PFAction)
+			// addActionToPageLink((PFAction) element, (PFPage)
+			// link.getTarget(),
+			// link);
+		}
+	}
+
+	private void removePage(Notification notification, PageflowElement element) {
+
+	}
+
+	private void removeInLink(Notification notification, PageflowElement element) {
+		Object value = notification.getOldValue();
+		PFLink link = (PFLink) value;
+		// for outLink remove, only source is referenced.
+		// if (element instanceof PFAction) {
+		// removePageToActionLink((PFPage) link.getSource(),
+		// (PFAction) element);
+		// } else
+		if (element instanceof PFPage) {
+			PageflowNode source = link.getSource();
+			if (source instanceof PFPage) {
+				removePageToPageLink((PFPage) source, link, (PFPage) element);
+			}
+			// else if (source instanceof PFAction) {
+			// removeActionToPageLink((PFAction) source, (PFPage) element,
+			// link);
+			// }
+		}
+	}
+
+	private void removeOutLink(Notification notification,
+			PageflowElement element) {
+		// the link that is removed.
+		Object value = notification.getOldValue();
+		PFLink link = (PFLink) value;
+		// for outLink remove, only target is referenced.
+		if (element instanceof PFPage) {
+			PageflowNode target = link.getTarget();
+			// page->page
+			if (target instanceof PFPage) {
+				removePageToPageLink((PFPage) element, link, (PFPage) target);
+			}
+			// else if (target instanceof PFAction)
+			// removePageToActionLink((PFPage) element, (PFAction) target);
+			// } else if (element instanceof PFAction)
+			// removeActionToPageLink((PFAction) element, (PFPage) link
+			// .getTarget(), link);
+		}
+	}
+
+	public void notifyChanged(Notification notification) {
+		PageflowElement element;
+		if (!(notification.getNotifier() instanceof PageflowElement)) {
+			return;
+		}
+		element = (PageflowElement) notification.getNotifier();
+		int type = notification.getEventType();
+		switch (type) {
+		case Notification.ADD: {
+			int featureId = notification.getFeatureID(PageflowPackage.class);
+			switch (featureId) {
+			case PageflowPackage.PAGEFLOW__NODES:
+				addPage(notification, element);
+				break;
+			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
+				addOutLink(notification, element);
+				break;
+			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
+				addInLink(notification, element);
+				break;
+			case PageflowPackage.PAGEFLOW:
+				break;
+			}
+			break;
+		}
+		case Notification.SET:
+			if (notification.getNewValue() != null) {
+				propertyChanged(notification, element);
+			}
+			break;
+		case Notification.REMOVE: {
+			int featureId = notification.getFeatureID(PageflowPackage.class);
+			switch (featureId) {
+			case PageflowPackage.PF_PAGE:
+				removePage(notification, element);
+				break;
+			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
+				removeOutLink(notification, element);
+				break;
+			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
+				removeInLink(notification, element);
+				break;
+			case PageflowPackage.PAGEFLOW:
+				break;
+			}
+			break;
+		}
+		}
+	}
+
+	public void dispose() {
+
+	}
+
+	public void setTarget(Notifier newTarget) {
+		// TODO Auto-generated method stub
+
+	}
+
+}
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
new file mode 100644
index 0000000..a38c0f6
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/ConfigurationManager.java
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * 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
new file mode 100644
index 0000000..ec603a5
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/FC2PFTransformer.java
@@ -0,0 +1 @@
+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
new file mode 100644
index 0000000..9133efd
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/FacesConfigManager.java
@@ -0,0 +1,457 @@
+/*******************************************************************************
+ * 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/IFacesConfigChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/IFacesConfigChangeEvent.java
new file mode 100644
index 0000000..0766fd7
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/IFacesConfigChangeEvent.java
@@ -0,0 +1,22 @@
+/***************************************************************************************************
+ * 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
new file mode 100644
index 0000000..59ed20f
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/IFacesConfigChangeListener.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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
new file mode 100644
index 0000000..922116f
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/IFacesConfigManager.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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/LinkHelper.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/LinkHelper.java
new file mode 100644
index 0000000..2485fc2
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/LinkHelper.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * 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.jst.jsf.facesconfig.ui.pageflow.model.PFLink;
+
+/**
+ * Helper link class, store the information of link, its' previous and
+ * subsequent links.
+ * 
+ * @author Xiao-guang Zhang
+ */
+public class LinkHelper {
+	/** the pflink is visited or not */
+	private boolean bVisited = false;
+
+	/** subsequent links */
+	private List subsequentLinks = null;
+
+	/* previous links */
+	private List previousLinks = null;
+
+	/** the pflink */
+	private PFLink element = null;
+
+	/**
+	 * constructor
+	 * 
+	 * @param element -
+	 *            pflink
+	 */
+	public LinkHelper(PFLink element) {
+		this.element = element;
+	}
+
+	/**
+	 * get the encapsulated pflink
+	 * 
+	 * @return - the encapsulated pflink
+	 */
+	public Object getModel() {
+		return element;
+	}
+
+	/**
+	 * check the pflink is visited or not.
+	 * 
+	 * @return - the pflink is visited or not.
+	 */
+	public boolean isVisited() {
+		return bVisited;
+	}
+
+	/**
+	 * get the subsequent links
+	 * 
+	 * @return - the subsequent links
+	 */
+	public List getSubsequentLinks() {
+		return subsequentLinks;
+	}
+
+	/**
+	 * add the subsequent link
+	 * 
+	 * @param link -
+	 *            one subsequent link
+	 */
+	public void addSubsequentLink(LinkHelper link) {
+		if (subsequentLinks == null) {
+			subsequentLinks = new ArrayList();
+		}
+		subsequentLinks.add(link);
+	}
+
+	/**
+	 * add a previous link
+	 * 
+	 * @return - a previous link
+	 */
+	public void addPreviousLink(LinkHelper link) {
+		if (previousLinks == null) {
+			previousLinks = new ArrayList();
+		}
+		previousLinks.add(link);
+	}
+
+	/**
+	 * get previous links
+	 * 
+	 * @return - previous links
+	 */
+	public List getPreviousLink() {
+		return previousLinks;
+	}
+
+	/**
+	 * set the visit status
+	 * 
+	 */
+	public void setVisit(boolean bVisited) {
+		this.bVisited = bVisited;
+	}
+
+}
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
new file mode 100644
index 0000000..a860c31
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/LinkNavigationRule.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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.PFLink;
+
+/**
+ * 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 PFLink firstLink = null;
+
+	/** the second pflink, maybe is null */
+	private PFLink 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(PFLink firstlink, PFLink secondLink) {
+		this.firstLink = firstlink;
+		this.secondLink = secondLink;
+	}
+
+	/**
+	 * get the first link
+	 * 
+	 * @return - the first link
+	 */
+	public PFLink getFirstLink() {
+		return firstLink;
+	}
+
+	/**
+	 * get the second link
+	 * 
+	 * @return - the second link
+	 */
+	public PFLink 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 69f6016..4537fd2 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,11 +66,9 @@
 		for (Iterator it = managedBeans.iterator(); it.hasNext();) {
 			ManagedBeanType managedBean = (ManagedBeanType) it.next();
 
-			if (managedBean.getManagedBeanScope() != null) {
-				if (scope.equals(managedBean.getManagedBeanScope()
-						.getTextContent())) {
-					result.add(managedBean);
-				}
+			if (scope
+					.equals(managedBean.getManagedBeanScope().getTextContent())) {
+				result.add(managedBean);
 			}
 		}
 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.classpath b/jsf/plugins/org.eclipse.jst.jsf.ui/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.ui/.cvsignore
deleted file mode 100644
index 7033a79..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-@dot*
-temp.folder
-build.xml
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.project b/jsf/plugins/org.eclipse.jst.jsf.ui/.project
deleted file mode 100644
index 45f845d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 943c5d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Apr 24 18:04:28 PDT 2006
-eclipse.preferences.version=1
-encoding//src/org/eclipse/jst/jsf/ui/internal/messages.properties=8859_1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index cf13353..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,32 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.ui; singleton:=true
-Bundle-Version: 0.5.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.ui.internal.JSFUiPlugin
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.jst.jsf.core,
- org.eclipse.wst.common.project.facet.core,
- org.eclipse.wst.common.project.facet.ui,
- org.eclipse.jst.j2ee.web,
- org.eclipse.jst.server.core,
- org.eclipse.wst.server.core,
- org.eclipse.wst.common.frameworks,
- org.eclipse.jst.common.frameworks,
- org.eclipse.jdt.core,
- org.eclipse.jdt.ui,
- org.eclipse.core.resources,
- org.eclipse.jst.j2ee,
- org.eclipse.emf.common,
- org.eclipse.wst.common.frameworks.ui,
- org.eclipse.ui.ide,
- org.eclipse.jst.j2ee.core,
- org.eclipse.emf.ecore,
- org.eclipse.jem.util
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.jst.jsf.ui.internal;x-friends:="org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.ui.internal.classpath;x-friends:="org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.ui.internal.project.facet;x-friends:="org.eclipse.jst.jsf.ui.tests"
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/build.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/build.properties
deleted file mode 100644
index c32d52b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# 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:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               icons/,\
-               plugin.properties
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/full/wizban/addlibrary_wiz.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/full/wizban/addlibrary_wiz.gif
deleted file mode 100644
index 128c9d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/full/wizban/addlibrary_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_l_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_l_obj.gif
deleted file mode 100644
index 6cb185c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_l_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_obj.gif
deleted file mode 100644
index 2fa1d77..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/library_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/library_obj.gif
deleted file mode 100644
index cb55e33..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/library_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.properties
deleted file mode 100644
index df0d28e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# 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:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-plugin.name=JavaServer Faces UI Plug-in
-plugin.provider=Eclipse.org
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml
deleted file mode 100644
index f9a0d86..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-  <!-- JSF Project Facet --> 
-  <extension point="org.eclipse.wst.common.project.facet.ui.wizard">
-  
-    <wizard-pages facet="jst.jsf" version="1.1">
-      <install>
-        <config class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallConfig"/>
-        <page   class="org.eclipse.jst.jsf.ui.internal.project.facet.JSFFacetInstallPage"/>
-      </install>
-    </wizard-pages>
-
-    <wizard-pages facet="jst.jsf" version="1.2">
-      <install>
-        <config class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallConfig"/>
-        <page   class="org.eclipse.jst.jsf.ui.internal.project.facet.JSFFacetInstallPage"/>
-      </install>
-    </wizard-pages>
-  </extension>
-  <extension
-        point="org.eclipse.ui.preferencePages">
-     <page
-           category="org.eclipse.wst.sse.ui.internal.provisional.preferences"
-           class="org.eclipse.jst.jsf.ui.internal.classpath.JSFLibrariesPreferencePage"
-           id="org.eclipse.jst.jsf.ui.jsfLibraryPage"
-           name="JSF Libraries"/>
-  </extension>
-  <extension
-        point="org.eclipse.ui.newWizards">
-     <category
-           id="org.eclipse.jst.jsf.ui.jsfcategory"
-           name="JavaServer Faces"/>
-     <wizard
-           canFinishEarly="false"
-           category="org.eclipse.jst.jsf.ui.jsfcategory"
-           class="org.eclipse.jst.jsf.ui.internal.classpath.JSFLibraryWizard"
-           hasPages="true"
-           icon="icons/obj16/library_obj.gif"
-           id="org.eclipse.jst.jsf.ui.jsfLibraryWizard"
-           name="New JSF Library"
-           preferredPerspectives="org.eclipse.jst.j2ee.J2EEPerspective"/>
-  </extension>
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUiPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUiPlugin.java
deleted file mode 100644
index 88ab4e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUiPlugin.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - added logging methods
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * JSF UI plugin.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class JSFUiPlugin extends AbstractUIPlugin {
-
-	public static final String PLUGIN_ID = "org.eclipse.jst.jsf.ui.internal.JSFUiPlugin"; //$NON-NLS-1$
-	//The shared instance.
-	private static JSFUiPlugin plugin;
-
-	/**
-	 * The constructor.
-	 */
-	public JSFUiPlugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static JSFUiPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		path = "icons/" + path; //$NON-NLS-1$
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.jst.jsf.ui", path); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.WTPPlugin#getPluginID()
-	 */
-	public String getPluginID() {
-		return PLUGIN_ID;
-	}
-
-	/**
-	 * Logs using the default ILog implementation provided by getLog().
-	 * 
-	 * @param severity Severity (IStatus constant) of log entry
-	 * @param message Human-readable message describing log entry
-	 * @param ex Throwable instance (can be null)
-	 */
-	public static void log(int severity, String message, Throwable ex) {
-		getDefault().getLog().log(new Status(severity, PLUGIN_ID, IStatus.OK, message, ex));
-	}
-
-	/**
-	 * Logs using the default ILog implementation provided by getLog().
-	 * 
-	 * @param severity Severity (IStatus constant) of log entry
-	 * @param message Human-readable message describing log entry
-	 */
-	public static void log(int severity, String message) {
-		log(severity, message, null);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/Messages.java
deleted file mode 100644
index 452cfdf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/Messages.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - changed to work correctly with org.eclipse.osgi.util.NLS
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.ui.internal.messages"; //$NON-NLS-1$
-
-	public static String JSFFacetInstallPage_title;
-	public static String JSFFacetInstallPage_description;
-	public static String JSFFacetInstallPage_JSFImplLabel;
-	public static String JSFFacetInstallPage_Add1;
-	public static String JSFFacetInstallPage_Add2;
-	public static String JSFFacetInstallPage_DeployJarsLabel;
-	public static String JSFFacetInstallPage_JSFConfigLabel;
-	public static String JSFFacetInstallPage_JSFServletNameLabel;
-	public static String JSFFacetInstallPage_JSFURLMappingLabel;
-	public static String JSFFacetInstallPage_PatternDialogTitle;
-	public static String JSFFacetInstallPage_PatternDialogDesc;
-	public static String JSFFacetInstallPage_Remove;
-	public static String JSFFacetInstallPage_PatternEmptyMsg;
-	public static String JSFFacetInstallPage_PatternSpecifiedMsg;
-	public static String JSFFacetInstallPage_ErrorNoWebAppDataModel;
-
-	public static String JSFLibrariesPreferencePage_DefinedJSFLibraries;
-	public static String JSFLibrariesPreferencePage_New;
-	public static String JSFLibrariesPreferencePage_Edit;
-	public static String JSFLibrariesPreferencePage_Remove;
-	public static String JSFLibrariesPreferencePage_CannotRemovePluginProvidedTitle;
-	public static String JSFLibrariesPreferencePage_CannotRemovePluginProvidedMessage;
-	public static String JSFLibrariesPreferencePage_MakeDefault;
-	public static String JSFLibrariesPreferencePage_Description;
-	public static String JSFLibrariesPreferencePage_CannotModifyPluginProvidedTitle;
-	public static String JSFLibrariesPreferencePage_CannotModifyPluginProvidedMessage;
-
-	public static String JSFLibraryContainerWizardPage_PageName;
-	public static String JSFLibraryContainerWizardPage_Title;
-	public static String JSFLibraryContainerWizardPage_Description;
-	public static String JSFLibraryContainerWizardPage_WarningNoJSFFacet;
-	public static String JSFLibraryContainerWizardPage_JSFLibraries;
-	public static String JSFLibraryContainerWizardPage_Add;
-	public static String JSFLibraryContainerWizardPage_ErrorInitializing;
-
-	public static String JSFLibraryWizard_DESCRIPTION;
-	public static String JSFLibraryWizard_IMPLS_ONLY_DESC;
-	public static String JSFLibraryWizard_CreateImplementation;
-	public static String JSFLibraryWizard_CreateJSFLibrary;
-	public static String JSFLibraryWizard_EditJSFLibrary;
-	public static String JSFLibraryWizard_JSFLibrary;
-	public static String JSFLibraryWizard_LibraryName;
-	public static String JSFLibraryWizard_VersionSupported;
-	public static String JSFLibraryWizard_LibraryJars;
-	public static String JSFLibraryWizard_IsJSFImplementation;
-	public static String JSFLibraryWizard_DeployJars;
-	public static String JSFLibraryWizard_Add;
-	public static String JSFLibraryWizard_Remove;
-	public static String JSFLibraryWizard_ExtJarFileDialogTitle;
-	public static String JSFLibraryWizard_ValidateNoJars;
-	public static String JSFLibraryWizard_ValidateNoLibraryName;
-	public static String JSFLibraryWizard_ValidateExistingLibraryName;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibrariesPreferencePage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibrariesPreferencePage.java
deleted file mode 100644
index f9821a8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibrariesPreferencePage.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.IWorkbenchWizard;
-
-/**
- * Provides a preference page for JSF Libraries.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFLibrariesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage{
-	private IWorkbench wb;
-
-	private TreeViewer tv;
-	private TreeViewerAdapter tvAdapter;
-	private TreeLabelProvider tvLabelProvider;
-	
-	private Composite btnComp;
-
-	private Button btnNew;
-	private Button btnEdit;
-	private Button btnDelete;
-	private Button btnMakeDefaultImpl;
-	
-	protected Control createContents(Composite parent) {
-		Composite c = new Composite(parent, SWT.NONE);
-		c.setLayout(new GridLayout(2, false)); 
-		c.setLayoutData(new GridData(GridData.FILL_BOTH));				
-		
-		Label lblLibs = new Label(c, SWT.NONE);
-		lblLibs.setText(Messages.JSFLibrariesPreferencePage_DefinedJSFLibraries);
-		GridData gd1 = new GridData();
-		gd1.horizontalSpan = 2;
-		lblLibs.setLayoutData(gd1);
-		
-		tv = new TreeViewer(c, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
-		tvAdapter = new TreeViewerAdapter();
-		tvLabelProvider = new TreeLabelProvider();
-		tv.setContentProvider(tvAdapter);
-		tv.setLabelProvider(tvLabelProvider);
-		tv.addSelectionChangedListener(tvAdapter);
-		tv.addDoubleClickListener(tvAdapter);
-		tv.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-		tv.setInput(getJSFLibraries());
-		
-		createButtons(c);
-		
-		return c;
-	}
-
-	private void createButtons(Composite c){		
-		btnComp = new Composite(c, SWT.NONE);
-		GridLayout gl1 = new GridLayout(1, false);
-		gl1.marginHeight = 0;
-		gl1.marginWidth = 0;
-		btnComp.setLayout(gl1);
-		btnComp.setLayoutData(new GridData(GridData.END | GridData.VERTICAL_ALIGN_FILL));
-		
-		btnNew = new Button(btnComp, SWT.NONE);
-		btnNew.setText(Messages.JSFLibrariesPreferencePage_New);
-		btnNew.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
-		btnNew.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				openJSFLibraryEditDialog(null);
-			}
-		});
-		
-		btnEdit = new Button(btnComp, SWT.NONE);
-		btnEdit.setText(Messages.JSFLibrariesPreferencePage_Edit);
-		btnEdit.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
-		btnEdit.setEnabled(false);
-		btnEdit.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				TreeItem[] element = (TreeItem[]) tv.getTree().getSelection();
-				if (element != null){
-					openJSFLibraryEditDialog(element[0]);
-				}
-
-			}
-		});
-		
-		btnDelete = new Button(btnComp, SWT.NONE);
-		btnDelete.setText(Messages.JSFLibrariesPreferencePage_Remove);
-		btnDelete.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
-		btnDelete.setEnabled(false);
-		btnDelete.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				boolean modified = false;
-				if (tv.getSelection() instanceof StructuredSelection){
-					StructuredSelection objs = (StructuredSelection)tv.getSelection();
-					if (objs != null){
-						Iterator it = objs.iterator();
-						while (it.hasNext()){
-							JSFLibrary lib = (JSFLibrary)it.next();
-							if (lib instanceof PluginProvidedJSFLibrary)
-								MessageDialog.openInformation(
-										getShell(),
-										Messages.JSFLibrariesPreferencePage_CannotRemovePluginProvidedTitle,
-										Messages.JSFLibrariesPreferencePage_CannotRemovePluginProvidedMessage);
-	
-							else {
-								JSFCorePlugin.getDefault().getJSFLibraryRegistry().removeJSFLibrary(lib);
-								modified = true;
-							}
-						}
-						if (modified){
-							JSFCorePlugin.getDefault().saveJSFLibraryRegistry();
-							tv.refresh();
-						}
-					}
-				}
-			}
-		});
-		
-		btnMakeDefaultImpl = new Button(btnComp, SWT.NONE);
-		btnMakeDefaultImpl.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_END));
-		btnMakeDefaultImpl.setText(Messages.JSFLibrariesPreferencePage_MakeDefault);
-		btnMakeDefaultImpl.setVisible(false);
-		btnMakeDefaultImpl.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (tv.getSelection() instanceof StructuredSelection){
-					StructuredSelection objs = (StructuredSelection)tv.getSelection();
-					if (objs != null){
-						if (objs.getFirstElement() instanceof JSFLibrary){
-							 JSFLibrary lib = (JSFLibrary)objs.getFirstElement();
-							 JSFCorePlugin.getDefault().getJSFLibraryRegistry().setDefaultImplementation(lib);							 							
-						 }
-						 JSFCorePlugin.getDefault().saveJSFLibraryRegistry();
-						 tv.refresh();
-					}
-				}
-			}
-		});
-		
-	}
-	private Object getJSFLibraries() {
-		return JSFCorePlugin.getDefault().getJSFLibraryRegistry().getAllJSFLibraries();
-	}
-
-	public void init(IWorkbench workbench) {
-		wb = workbench;
-		setDescription(Messages.JSFLibrariesPreferencePage_Description);
-		noDefaultAndApplyButton();
-	}
-	
-	/**
-	 * Getter created only for JUnit tests.  Should not be used otherwise.
-	 * @return the TreeViewer of JSF Libraries
-	 */
-	public Viewer getLibraryViewer(){
-		return tv;
-	}
-	
-	private class TreeViewerAdapter implements ITreeContentProvider, ISelectionChangedListener, IDoubleClickListener {
-		private final Object[] NO_ELEMENTS= new Object[0];
-
-		// ------- ITreeContentProvider Interface ------------
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			// will never happen
-		}
-
-		public boolean isDeleted(Object element) {
-			return false;
-		}
-
-		public void dispose() {
-		}
-
-		public Object[] getElements(Object obj) {
-			return ((List)getJSFLibraries()).toArray();
-		}
-		
-		public Object[] getChildren(Object element) {
-			if (element instanceof JSFLibrary) {
-				return ((JSFLibrary)element).getArchiveFiles().toArray();
-			}
-			return NO_ELEMENTS;
-		}
-
-		public Object getParent(Object element) {
-//			if (elements instanceof JSFLibrary) {
-//				return tvAdapter.getParent(tv.getTree().class, element);
-//			}
-			return null;//fParentElement;
-		}
-
-		public boolean hasChildren(Object element) {
-			if (element instanceof JSFLibrary) {
-				return true;
-			}
-			return false;
-		}		
-
-		// ------- ISelectionChangedListener Interface ------------
-
-		public void selectionChanged(SelectionChangedEvent event) {
-			doListSelected(event);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
-		 */
-		public void doubleClick(DoubleClickEvent event) {
-			doDoubleClick(event);
-		}		
-	}
-
-	protected void doListSelected(SelectionChangedEvent event) {
-		updateButtonState();
-	}
-
-	protected void doDoubleClick(DoubleClickEvent event) {
-		openJSFLibraryEditDialog(tv.getTree().getSelection()[0]);
-	}
-	
-	private void updateButtonState() {
-		btnEdit.setEnabled(tv.getTree().getSelectionCount() == 1);	
-		if (tv.getTree().getSelectionCount() == 1 && tv.getTree().getSelection()[0].getData() instanceof JSFLibrary){	
-			btnDelete.setEnabled(true);
-			btnMakeDefaultImpl.setVisible(false);
-			JSFLibrary lib = (JSFLibrary)tv.getTree().getSelection()[0].getData();
-			btnMakeDefaultImpl.setVisible(lib.isImplementation());
-		} else {
-			btnDelete.setEnabled(false);
-			btnMakeDefaultImpl.setVisible(false);
-		}
-	}
-	
-	private void openJSFLibraryEditDialog(Object element) {
-		if (isPluginProvidedJSFLibrary(element)){
-			MessageDialog.openInformation(
-					getShell(),
-					Messages.JSFLibrariesPreferencePage_CannotModifyPluginProvidedTitle,
-					Messages.JSFLibrariesPreferencePage_CannotModifyPluginProvidedMessage);
-			return;
-		}
-		IWorkbenchWizard wizard = new JSFLibraryWizard();
-		wizard.init(wb, getStructuredElement(element));
-		WizardDialog dialog = new WizardDialog(wb.getActiveWorkbenchWindow().getShell(), wizard);
-		int ret = dialog.open();
-		if (ret == Window.OK){
-			tv.refresh();
-		}
-	}
-	
-	private IStructuredSelection getStructuredElement(Object element) {
-		if (element instanceof TreeItem){
-			Object item = ((TreeItem)element).getData();
-			if (item instanceof ArchiveFile){
-				JSFLibrary parent = ((ArchiveFile)item).getJSFLibrary();
-				return new StructuredSelection(parent);
-			} else if (item instanceof JSFLibrary) {
-				return new StructuredSelection(item);
-			}
-		}
-		return null;
-	}
-
-	private boolean isPluginProvidedJSFLibrary(Object treeElement){
-		if (treeElement instanceof TreeItem){
-			Object item = ((TreeItem)treeElement).getData();
-			if (item instanceof PluginProvidedJSFLibrary){
-				return true;
-			} else if (item instanceof ArchiveFile) {
-				return (((ArchiveFile)item).getJSFLibrary() instanceof PluginProvidedJSFLibrary);
-			}
-		}
-		return false;
-	}
-
-	private class TreeLabelProvider implements ILabelProvider {
-		Image libImg;
-		Image jarImg;
-
-		TreeLabelProvider(){
-			if (jarImg == null){
-				ImageDescriptor jarImgDesc = JSFUiPlugin.getImageDescriptor("obj16/jar_obj.gif"); //$NON-NLS-1$
-				jarImg = jarImgDesc.createImage();
-			}
-			if (libImg == null){
-				ImageDescriptor libImgDesc = JSFUiPlugin.getImageDescriptor("obj16/library_obj.gif"); //$NON-NLS-1$
-				libImg = libImgDesc.createImage();
-			}
-		}
-		
-		public Image getImage(Object element) {
-			if (element instanceof JSFLibrary)
-				return libImg;
-			else
-				return jarImg;
-		}
-
-		public String getText(Object element) {
-			StringBuffer labelBuf = new StringBuffer();
-			if (element instanceof JSFLibrary) {
-				JSFLibrary lib = (JSFLibrary)element;
-				labelBuf.append(lib.getName());
-				if (lib.isImplementation()) {
-					labelBuf.append(" [implementation"); //$NON-NLS-1$
-					if (lib == JSFCorePlugin.getDefault().getJSFLibraryRegistry().getDefaultImplementation()) {
-						labelBuf.append(" - default"); //$NON-NLS-1$
-					}
-					labelBuf.append("]"); //$NON-NLS-1$
-				}
-			}
-			if (element instanceof ArchiveFile) {
-				ArchiveFile jar = (ArchiveFile)element;
-				labelBuf.append(jar.getName());
-				if (!jar.exists())
-					labelBuf.append("[missing]"); //$NON-NLS-1$
-				labelBuf.append(" - ").append(((ArchiveFile)element).getSourceLocation()); //$NON-NLS-1$
-			}
-			return labelBuf.toString();
-		}
-
-		public void addListener(ILabelProviderListener listener) {
-		}
-
-		public void dispose() {
-			if (libImg != null){
-				libImg.dispose();
-			}			
-			if (jarImg != null){
-				jarImg.dispose();
-			}		
-		}
-
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		public void removeListener(ILabelProviderListener listener) {
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryContainerWizardPage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryContainerWizardPage.java
deleted file mode 100644
index 3ba4844..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryContainerWizardPage.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWizard;
-import org.eclipse.ui.PlatformUI;
-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.project.facet.core.internal.FacetedProjectNature;
-
-/**
- * Provides a classpath container wizard page for JSF Libraries.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFLibraryContainerWizardPage extends WizardPage implements
-		IClasspathContainerPage, IClasspathContainerPageExtension{
-
-	private TableViewer lv;
-	private JSFLibrariesTableViewerAdapter lvAdapter;
-	private JSFLibrariesListLabelProvider lvLabelProvider;
-	private ArrayList elements;
-	private boolean isJSFProject = false;		
-
-	public JSFLibraryContainerWizardPage(){
-        super(Messages.JSFLibraryContainerWizardPage_PageName);        
-        setTitle(Messages.JSFLibraryContainerWizardPage_Title);
-        setDescription(Messages.JSFLibraryContainerWizardPage_Description);
-        // TODO: Replace with a custom image.
-        setImageDescriptor( JSFUiPlugin.getImageDescriptor("full/wizban/addlibrary_wiz.gif")); //$NON-NLS-1$
-	}
-
-	public void initialize(IJavaProject project, IClasspathEntry[] currentEntries) {		
-		isJSFProject = false;
-		try {
-			//check for faceted nature
-			//NOTE: use of following constant produces warnings; this was known
-			//but at time of writing no public API was available
-			if (project.getProject().hasNature(FacetedProjectNature.NATURE_ID)){
-				//check for jsf facet
-				IFacetedProject fproj = ProjectFacetsManager.create(project.getProject());
-				Iterator it = fproj.getProjectFacets().iterator();
-				while (it.hasNext()){
-					IProjectFacetVersion facetVersion = (IProjectFacetVersion)it.next();
-					IProjectFacet facet = facetVersion.getProjectFacet();
-					if (facet.getId().equals(JSFCorePlugin.FACET_ID)){
-						isJSFProject = true;
-						return;
-					}
-				}				
-			}
-		} catch (CoreException e) {
-			JSFUiPlugin.log(
-					IStatus.ERROR,
-					Messages.JSFLibraryContainerWizardPage_ErrorInitializing,
-					e);
-		}
-	}
-
-	public boolean finish() {
-		// TODO Create lib containers and verify single implementation selected
-		return true;
-	}
-
-	public boolean isPageComplete() {
-		if (!isJSFProject) {
-			return false;
-		}
-		return isValid();
-	}
-
-	private boolean isValid() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#getSelection()
-	 */
-	public IClasspathEntry getSelection() {
-		if (lv.getSelection()!= null){
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#setSelection(org.eclipse.jdt.core.IClasspathEntry)
-	 */
-	public void setSelection(IClasspathEntry containerEntry) {
-	}
-
-	public void createControl(Composite parent) {
-		//Build UI to display JSF Lib components from registry
-		Composite c = new Composite(parent, SWT.NONE);
-		c.setLayout(new GridLayout(2, false));
-		c.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		//disable wizard if this is not a valid JSF project
-		if (!isJSFProject){
-			Label warning = new Label(c , SWT.NONE);
-			warning.setText(Messages.JSFLibraryContainerWizardPage_WarningNoJSFFacet);
-			setControl(c);			
-			return;
-		}
-
-		Label lblViewer = new Label(c, SWT.NONE);
-		lblViewer.setText(Messages.JSFLibraryContainerWizardPage_JSFLibraries);
-		GridData gd1 = new GridData(GridData.BEGINNING);
-		gd1.horizontalSpan = 2;
-		lblViewer.setLayoutData(gd1);
-
-		lv = createTableViewer(c);
-		lv.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		lvAdapter = new JSFLibrariesTableViewerAdapter();
-		lvLabelProvider = new JSFLibrariesListLabelProvider();
-		lv.setContentProvider(lvAdapter);
-		lv.setLabelProvider(lvLabelProvider);
-		lv.addSelectionChangedListener(lvAdapter);
-		lv.addDoubleClickListener(lvAdapter);
-
-		lv.setInput(getJSFLibraries());
-
-//		Composite btnBar = new Composite(c, SWT.NONE);
-//		GridLayout gl = new GridLayout(1, false);
-//		gl.marginHeight = 0;
-//		gl.marginWidth = 0;
-
-		Button addButton = new Button(c, SWT.NONE);
-		addButton.setText(Messages.JSFLibraryContainerWizardPage_Add);
-		addButton.setLayoutData(new GridData(GridData.END | GridData.VERTICAL_ALIGN_BEGINNING));
-		addButton.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e){
-				openJSFLibraryWizard(null);
-			}
-		});
-
-		setControl(c);
-	}
-
-	private void openJSFLibraryWizard(Object element){
-		IWorkbenchWizard wizard = new JSFLibraryWizard();
-		IWorkbench wb = PlatformUI.getWorkbench();
-		wizard.init(wb, getStructuredElement(element));
-		WizardDialog dialog = new WizardDialog(wb.getActiveWorkbenchWindow().getShell(), wizard);
-		int ret = dialog.open();
-		if (ret == Window.OK){
-			//FIXME: select returned object
-			lv.refresh();
-		}
-	}
-	
-	private IStructuredSelection getStructuredElement(Object element) {
-		if (element != null  && element instanceof IStructuredSelection){
-			//FIXME:
-//			IStructuredSelection firstelement = (IStructuredSelection)((IStructuredSelection)element).getFirstElement();
-//			return new StructuredSelection(firstelement);
-		}
-		return null;
-	}
-
-	private TableViewer createTableViewer(Composite parent) {
-		Table table= new Table(parent, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		table.setFont(parent.getFont());
-		CheckboxTableViewer tableViewer= new CheckboxTableViewer(table);
-		tableViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent e) {
-				validate();
-			}
-		});
-		return tableViewer;
-	}
-
-	private Object getJSFLibraries() {
-		elements = new ArrayList(10);
-		elements.addAll(JSFCorePlugin.getDefault().getJSFLibraryRegistry().getAllJSFLibraries());
-		return elements;
-	}
-
-	private class JSFLibrariesTableViewerAdapter implements IStructuredContentProvider, ISelectionChangedListener, IDoubleClickListener {
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			//should never happen
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return elements.toArray();
-		}		
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-		 */
-		public void selectionChanged(SelectionChangedEvent event) {
-			doListSelected(event);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
-		 */
-		public void doubleClick(DoubleClickEvent event) {
-			doDoubleClick(event);
-		}
-	}
-	
-	private class JSFLibrariesListLabelProvider implements ILabelProvider{		
-		Image libImg;
-		public Image getImage(Object element) {
-			if (libImg == null){
-				ImageDescriptor libImgDesc = JSFUiPlugin.getImageDescriptor("obj16/library_obj.gif"); //$NON-NLS-1$
-				libImg = libImgDesc.createImage();
-			}
-			return libImg;
-		}
-
-		public String getText(Object element) {
-			if (element instanceof JSFLibrary) {
-				JSFLibrary lib = (JSFLibrary)element;
-				if (lib.isImplementation()) {
-					return lib.getName() + " [implementation]"; //$NON-NLS-1$
-				} else {
-					return lib.getName();
-				}
-			}
-			return null;
-		}
-
-		public void dispose() {
-			if (libImg != null)
-				libImg.dispose();
-		}
-
-		public void addListener(ILabelProviderListener listener) {			
-		}
-
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		public void removeListener(ILabelProviderListener listener) {
-		}
-	}
-	
-	private void validate() {
-	}
-
-	private void doListSelected(SelectionChangedEvent event) {
-	}
-
-	private void doDoubleClick(DoubleClickEvent event) {
-		openJSFLibraryWizard(lv.getSelection());
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizard.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizard.java
deleted file mode 100644
index f61e73b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizard.java
+++ /dev/null
@@ -1,471 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * Dialog for creating or editing a JSF Library or Implementation.
- * <br>
- * If the selection passed in init is not null then the item will be edit mode.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFLibraryWizard extends Wizard implements INewWizard {
-	private Text txtName;
-	private Label lblName;
-	private CCombo cboVersions;
-	private Label lblVersions;
-	private Button chkDeploy;
-	private Button chkImpl;
-	private Composite btnBar;
-	private Button btnAdd;
-	private Button btnRemove;
-	private TableViewer jars;
-
-	private boolean isNew = false;
-	private boolean modified = false;
-	private boolean implsOnly = false;
-
-	private JSFLibrary curLibrary;
-	private JSFLibrary workingCopyLibrary;
-
-	private JSFLibraryWizardPage page;
-
-	private static final String DESCRIPTION = Messages.JSFLibraryWizard_DESCRIPTION;
-	private static final String IMPLS_ONLY_DESC = Messages.JSFLibraryWizard_IMPLS_ONLY_DESC;
-
-	public JSFLibraryWizard(boolean b) {
-		super();
-		implsOnly = b;
-	}
-
-	public JSFLibraryWizard() {
-		super();
-	}
-
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		if (selection != null
-				&& selection.getFirstElement() instanceof JSFLibrary) {
-			curLibrary = (JSFLibrary) selection.getFirstElement();
-			workingCopyLibrary = curLibrary.getWorkingCopy();
-		} else {
-			isNew = true;
-			workingCopyLibrary = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibrary();
-		}
-		if (implsOnly) {
-			setWindowTitle(Messages.JSFLibraryWizard_CreateImplementation);
-		} else {
-			setWindowTitle(isNew ? Messages.JSFLibraryWizard_CreateJSFLibrary : Messages.JSFLibraryWizard_EditJSFLibrary);
-		}
-	}
-
-	public boolean performFinish() {
-		final String name = txtName.getText().trim();
-		final boolean isDeployed = chkDeploy.getSelection();
-		final boolean isImplementation = chkImpl.getSelection();
-
-		workingCopyLibrary.setName(name);
-		if (cboVersions.getSelectionIndex() >= 0) {
-			JSFVersion ver = (JSFVersion) JSFVersion.VALUES.get(cboVersions
-					.getSelectionIndex());
-			workingCopyLibrary.setJSFVersion(ver);
-		}
-		workingCopyLibrary.setDeployed(isDeployed);
-		workingCopyLibrary.setImplementation(isImplementation);
-		if (isNew){
-			JSFCorePlugin.getDefault().getJSFLibraryRegistry().addJSFLibrary(workingCopyLibrary);
-		}
-		else {
-			curLibrary.updateValues(workingCopyLibrary);
-		}
-		JSFCorePlugin.getDefault().saveJSFLibraryRegistry();
-		return true;
-	}
-
-	public void addPages() {
-		page = new JSFLibraryWizardPage(Messages.JSFLibraryWizard_JSFLibrary);
-		super.addPage(page);
-		page.setWizard(this);
-	}
-
-	public JSFLibrary getJSFLibrary() {
-		return workingCopyLibrary;
-	}
-
-	private class JSFLibraryWizardPage extends WizardPage implements
-			ModifyListener, SelectionListener {
-
-		private boolean initing;
-
-		protected JSFLibraryWizardPage(String pageName) {
-			super(pageName);
-			setDescription(implsOnly ? IMPLS_ONLY_DESC : DESCRIPTION);
-			setTitle(Messages.JSFLibraryWizard_JSFLibrary);
-		}
-
-		public boolean isPageComplete() {
-			if (modified == false) {
-				return false;
-			}
-			return super.isPageComplete();
-		}
-
-		public void createControl(Composite parent) {
-			initing = true;
-			initializeDialogUnits(parent);
-
-			Composite c = new Composite(parent, SWT.NONE);
-			c.setLayout(new GridLayout(2, false));
-			c.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-			lblName = new Label(c, SWT.NONE);
-			lblName.setText(Messages.JSFLibraryWizard_LibraryName);
-			lblName.setLayoutData(new GridData(GridData.BEGINNING));
-
-			txtName = new Text(c, SWT.BORDER);
-			txtName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			txtName.addModifyListener(this);
-
-			lblVersions = new Label(c, SWT.NONE);
-			lblVersions.setText(Messages.JSFLibraryWizard_VersionSupported);
-
-			cboVersions = new CCombo(c, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
-			cboVersions.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			cboVersions.addModifyListener(this);
-
-			Group jarsComp = new Group(c, SWT.NONE);
-			jarsComp.setText(Messages.JSFLibraryWizard_LibraryJars);
-			GridLayout gl1 = new GridLayout(2, false);
-			jarsComp.setLayout(gl1);
-			GridData gd2 = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.FILL_VERTICAL);
-			gd2.horizontalSpan = 2;
-			jarsComp.setLayoutData(gd2);
-
-			createJarsViewer(jarsComp);
-
-			createButtons(jarsComp);
-
-			chkImpl = new Button(c, SWT.CHECK);
-			chkImpl.setText(Messages.JSFLibraryWizard_IsJSFImplementation);
-			GridData gd3 = new GridData();
-			gd3.horizontalSpan = 2;
-			chkImpl.setLayoutData(gd3);
-			chkImpl.addSelectionListener(this);
-
-			chkDeploy = new Button(c, SWT.CHECK);
-			chkDeploy.setText(Messages.JSFLibraryWizard_DeployJars);
-			GridData gd4 = new GridData();
-			gd4.horizontalSpan = 2;
-			chkDeploy.setLayoutData(gd4);
-			chkDeploy.addSelectionListener(this);
-			chkDeploy.setVisible(false);
-
-			loadVersions();
-
-			if (!isNew) {
-				txtName.setText(workingCopyLibrary.getName());
-				cboVersions.setText(workingCopyLibrary.getJSFVersion().getName());
-				chkDeploy.setSelection(workingCopyLibrary.isDeployed());
-				chkImpl.setSelection(workingCopyLibrary.isImplementation());
-			}
-
-			if (implsOnly) {
-				chkImpl.setSelection(true);
-				chkImpl.setEnabled(false);
-			}
-
-			jars.setInput(workingCopyLibrary);
-
-			initing = false;
-			setControl(c);
-
-			txtName.setFocus();
-			setPageComplete(false);
-		}
-
-		private void createJarsViewer(Group jarsComp) {
-			jars = new TableViewer(jarsComp, SWT.BORDER | SWT.MULTI);
-			jars.setContentProvider(new IStructuredContentProvider() {
-				public Object[] getElements(Object inputElement) {
-					if (inputElement instanceof JSFLibrary)
-						return ((JSFLibrary) inputElement).getArchiveFiles()
-								.toArray();
-					return new Object[0];
-				}
-
-				public void dispose() {
-				}
-
-				public void inputChanged(Viewer viewer, Object oldInput,
-						Object newInput) {
-					// won't happen
-				}
-			});
-			jars.setLabelProvider(new ILabelProvider() {
-				private Image jarImg = null;
-				public Image getImage(Object element) {
-					if (jarImg == null){
-						ImageDescriptor desc = JSFUiPlugin.getImageDescriptor("obj16/jar_obj.gif"); //$NON-NLS-1$
-						jarImg = desc.createImage();
-					}
-					return jarImg;
-				}
-
-				public String getText(Object element) {
-					StringBuffer labelBuf = new StringBuffer();
-					if (element instanceof ArchiveFile) {
-						ArchiveFile archive = (ArchiveFile) element;
-						labelBuf.append(archive.getName());	
-						if (!archive.exists())
-							labelBuf.append("[missing]"); //$NON-NLS-1$
-						labelBuf.append(" - ").append(archive.getPath()); //$NON-NLS-1$
-					}
-					return labelBuf.toString();
-				}
-
-				public void addListener(ILabelProviderListener listener) {
-				}
-
-				public void dispose() {
-					if (jarImg != null)
-						jarImg.dispose();
-				}
-
-				public boolean isLabelProperty(Object element, String property) {
-					return false;
-				}
-
-				public void removeListener(ILabelProviderListener listener) {
-				}
-			});
-
-			GridData gd = new GridData(GridData.FILL_BOTH);
-			gd.widthHint = convertWidthInCharsToPixels(30);
-			gd.heightHint = convertHeightInCharsToPixels(10);
-			jars.getControl().setLayoutData(gd);
-		}
-
-		private void updateButtons() {
-			btnRemove.setEnabled(jars.getSelection() != null);
-			// getButton(IDialogConstants.OK_ID).setEnabled(modified);
-		}
-
-		private void createButtons(Composite c) {
-			btnBar = new Composite(c, SWT.NONE);
-			GridLayout gl = new GridLayout(1, false);
-			gl.marginHeight = 0;
-			gl.marginTop = 0;
-			gl.marginWidth = 0;
-			btnBar.setLayout(gl);
-			btnBar.setLayoutData(new GridData(GridData.END));
-
-			btnAdd = new Button(btnBar, SWT.NONE);
-			btnAdd.setText(Messages.JSFLibraryWizard_Add);
-			btnAdd.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-					| GridData.VERTICAL_ALIGN_BEGINNING));
-			btnAdd.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					String cur = null;
-					String[] chosenJars = openExtJarFileDialog(cur);
-					if (chosenJars != null) {
-						for (int i = 0; i < chosenJars.length; i++) {
-							String jar = chosenJars[i];
-							if (!workingCopyLibrary.containsArchiveFile(jar)) {
-								ArchiveFile archive = JSFLibraryRegistryFactory.eINSTANCE
-									.createArchiveFile();
-								archive.setSourceLocation(jar);
-								archive.setRelativeDestLocation("WEB-INF/lib"); //$NON-NLS-1$
-								workingCopyLibrary.getArchiveFiles().add(archive);
-								modified = true;
-							}
-						}
-						jars.refresh();
-						validate();
-					}
-				}
-			});
-
-			btnRemove = new Button(btnBar, SWT.NONE);
-			btnRemove.setText(Messages.JSFLibraryWizard_Remove);
-			btnRemove.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-					| GridData.VERTICAL_ALIGN_BEGINNING));
-			btnRemove.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					if (jars.getSelection() instanceof StructuredSelection){
-						StructuredSelection objs = (StructuredSelection)jars.getSelection();
-						if (objs != null){
-							Iterator it = objs.iterator();
-							 while (it.hasNext()){
-								 Object obj = it.next();
-								 ArchiveFile jar = (ArchiveFile)obj;
-								 workingCopyLibrary.getArchiveFiles().remove(jar);
-								 modified = true;
-							 }
-						}
-						jars.refresh();
-						validate();
-					}
-				}
-			});
-		}
-
-		private void loadVersions() {
-			cboVersions.removeAll();
-			Iterator it = JSFVersion.VALUES.iterator();
-			while (it.hasNext()) {
-				JSFVersion ver = (JSFVersion) it.next();
-				cboVersions.add(ver.getName());
-			}
-		}
-
-		private String[] openExtJarFileDialog(String existing) {
-			String title = Messages.JSFLibraryWizard_ExtJarFileDialogTitle;
-
-			FileDialog dialog = new FileDialog(getShell(),
-					existing == null ? SWT.MULTI : SWT.SINGLE);
-			dialog.setText(title);
-			dialog.setFilterExtensions(new String[] { "*.jar;*.zip" }); //$NON-NLS-1$
-			// FIXME: remember and use last path chosen??
-			String filterPath = ResourcesPlugin.getWorkspace().getRoot()
-					.getFullPath().toString();
-			dialog.setFilterPath(filterPath);
-			// if (existing != null) {
-			// dialog.setFileName(existing.getPath().lastSegment());
-			// }
-
-			String res = dialog.open();
-			if (res == null) {
-				return null;
-			}
-			String[] fileNames = dialog.getFileNames();
-			String[] elems = new String[fileNames.length];
-			IPath file = new Path(res);
-			IPath apath = file.removeLastSegments(1);
-			for (int i = 0; i < fileNames.length; i++) {
-				elems[i] = apath.append(fileNames[i]).toString();
-			}
-			return elems;
-		}	
-
-		public void modifyText(ModifyEvent e) {
-			modified = true;
-			validate();
-			updateButtons();
-		}
-
-		public void widgetSelected(SelectionEvent e) {
-			modified = true;
-			validate();
-			updateButtons();
-		}
-
-		public void widgetDefaultSelected(SelectionEvent e) {
-		}
-
-		private void validate() {
-			if (initing)
-				return;
-			setErrorMessage(null);
-			setPageComplete(true);
-			if (!validateName() || !validateJars() || !validateVersion()) {
-				setPageComplete(false);
-			}
-		}
-
-		private boolean validateJars() {
-			if (getJSFLibrary().getArchiveFiles().isEmpty()) {
-				setErrorMessage(Messages.JSFLibraryWizard_ValidateNoJars);
-				return false;
-			}
-			return true;
-		}
-
-		private boolean validateVersion() {
-			//FIXME: why isn't selection indesx correct???
-//			if (cboVersions.getSelectionIndex() < 0) {
-//				setErrorMessage("Choose the maximum JSF version supported if known.");
-//				return false;
-//			}
-			return true;
-		}
-
-		private boolean validateName() {
-			if (txtName.getText() == null
-					|| txtName.getText().trim().equals("")) { //$NON-NLS-1$
-				setErrorMessage(Messages.JSFLibraryWizard_ValidateNoLibraryName);
-				return false;
-			}
-			String aName = txtName.getText().trim();
-			if (isNew || (!isNew && !curLibrary.getName().equals(aName))) {
-				if (isNameInRegistry(JSFCorePlugin.getDefault()
-						.getJSFLibraryRegistry().getAllJSFLibraries(), aName)) {
-					setErrorMessage(Messages.JSFLibraryWizard_ValidateExistingLibraryName);
-					return false;
-				}
-			}
-			return true;
-		}
-
-		private boolean isNameInRegistry(Collection c, String name) {
-			Iterator it = c.iterator();
-			while (it.hasNext()) {
-				JSFLibrary lib = (JSFLibrary) it.next();
-				if (lib.getName().equals(name)) {
-					return true;
-				}
-			}
-			return false;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/messages.properties
deleted file mode 100644
index 235cf5b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/messages.properties
+++ /dev/null
@@ -1,63 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# 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:
-#    Gerry Kessler - initial API and implementation
-#    Ian Trimble - change key names for use with org.eclipse.osgi.util.NLS
-###############################################################################
-JSFFacetInstallPage_title=JSF Capabilities
-JSFFacetInstallPage_description=Add JSF capabilities to this Web Project
-JSFFacetInstallPage_JSFImplLabel=JSF &Implementation:
-JSFFacetInstallPage_Add1=A&dd...
-JSFFacetInstallPage_Add2=&Add...
-JSFFacetInstallPage_DeployJarsLabel=&Deploy jars to WEB-INF/lib
-JSFFacetInstallPage_JSFConfigLabel=JSF &Configuration File:
-JSFFacetInstallPage_JSFServletNameLabel=JSF &Servlet Name:
-JSFFacetInstallPage_JSFURLMappingLabel=&URL Mapping Patterns:
-JSFFacetInstallPage_PatternDialogTitle=Specify URL Pattern
-JSFFacetInstallPage_PatternDialogDesc=URL Pattern
-JSFFacetInstallPage_Remove=&Remove
-JSFFacetInstallPage_PatternEmptyMsg=Pattern must not be empty
-JSFFacetInstallPage_PatternSpecifiedMsg=Pattern is already specified
-JSFFacetInstallPage_ErrorNoWebAppDataModel=Unable to locate WebApp datamodel
-
-JSFLibrariesPreferencePage_DefinedJSFLibraries=Defined JSF Libraries:
-JSFLibrariesPreferencePage_New=New...
-JSFLibrariesPreferencePage_Edit=Edit...
-JSFLibrariesPreferencePage_Remove=Remove
-JSFLibrariesPreferencePage_CannotRemovePluginProvidedTitle=Cannot Remove
-JSFLibrariesPreferencePage_CannotRemovePluginProvidedMessage=Plugin provided libraries cannot be removed from the registry
-JSFLibrariesPreferencePage_MakeDefault=Make Default
-JSFLibrariesPreferencePage_Description=JSF Libraries contain jars with JSF components and tag libraries.   Some JSF Libaries can be specially marked as implementations so that the WebApp can be executed.
-JSFLibrariesPreferencePage_CannotModifyPluginProvidedTitle=Cannot Modify
-JSFLibrariesPreferencePage_CannotModifyPluginProvidedMessage=Plugin provided libraries cannot be edited
-
-JSFLibraryContainerWizardPage_PageName=Add JSF Library
-JSFLibraryContainerWizardPage_Title=JSF Library
-JSFLibraryContainerWizardPage_Description=Select JavaServer Face Library to add to the classpath
-JSFLibraryContainerWizardPage_WarningNoJSFFacet=JavaServer Face Libraries can only be configured for Dynamic Web projects with the JSF facet installed.
-JSFLibraryContainerWizardPage_JSFLibraries=JSF Libaries:
-JSFLibraryContainerWizardPage_Add=Add...
-JSFLibraryContainerWizardPage_ErrorInitializing=Error during initialization
-
-JSFLibraryWizard_DESCRIPTION=Create a library of jars that make up a JSF component library.
-JSFLibraryWizard_IMPLS_ONLY_DESC=Create a library of jars that make up a JSF implementation library.
-JSFLibraryWizard_CreateImplementation=Create JSF Implementation Library
-JSFLibraryWizard_CreateJSFLibrary=Create JSF Library
-JSFLibraryWizard_EditJSFLibrary=Edit JSF Library
-JSFLibraryWizard_JSFLibrary=JSF Library
-JSFLibraryWizard_LibraryName=Library &Name:
-JSFLibraryWizard_VersionSupported=&Version Supported:
-JSFLibraryWizard_LibraryJars=Library &Jars
-JSFLibraryWizard_IsJSFImplementation=Is JSF &Implementation
-JSFLibraryWizard_DeployJars=&Deploy Jars
-JSFLibraryWizard_Add=&Add...
-JSFLibraryWizard_Remove=&Remove
-JSFLibraryWizard_ExtJarFileDialogTitle=Browse for Jars/Zips
-JSFLibraryWizard_ValidateNoJars=The library must contain at least one jar.
-JSFLibraryWizard_ValidateNoLibraryName=A library name must be supplied.
-JSFLibraryWizard_ValidateExistingLibraryName=A library or implementation by this name already exists.
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFFacetInstallPage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFFacetInstallPage.java
deleted file mode 100644
index 43be62d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFFacetInstallPage.java
+++ /dev/null
@@ -1,508 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.project.facet;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jface.dialogs.DialogSettings;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.jst.jsf.ui.internal.classpath.JSFLibraryWizard;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.ui.IFacetWizardPage;
-import org.eclipse.wst.common.project.facet.ui.IWizardContext;
-
-/**
- * JSF Facet installation wizard page.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFFacetInstallPage extends DataModelWizardPage implements IJSFFacetInstallDataModelProperties, IFacetWizardPage {
-	// UI
-	private Label lblJSFImpl;
-	private ComboViewer cboJSFImplViewer;
-	private Button chkDeployImpl;
-	private Button btnAddJSFImpl;
-	private Label lblJSFConfig;
-	private Text txtJSFConfig;
-	private Label lblJSFServletName;
-	private Text txtJSFServletName;
-	private Label lblJSFServletURLPatterns;
-	private List lstJSFServletURLPatterns;
-	private Button btnAddPattern;
-	private Button btnRemovePattern;
-
-	private IDialogSettings dialogSettings;
-	private IDataModel webAppDataModel;
-	private static final String SETTINGS_ROOT = JSFUiPlugin.PLUGIN_ID
-			+ ".jsfFacetInstall"; //$NON-NLS-1$
-	private static final String SETTINGS_CONFIG = "configPath"; //$NON-NLS-1$
-	private static final String SETTINGS_SERVLET = "servletName"; //$NON-NLS-1$
-	private static final String SETTINGS_URL_MAPPINGS = "urlMappings"; //$NON-NLS-1$
-	private static final String SETTINGS_URL_PATTERN = "pattern"; //$NON-NLS-1$
-	private static final String SETTINGS_DEPLOY_IMPL = "deployImplementation"; //$NON-NLS-1$
-
-	/**
-	 * Zero argument constructor
-	 */
-	public JSFFacetInstallPage() {
-		//FIXME: following WebFacetInstallPage pattern which will be fixed at somepoint
-    	super(DataModelFactory.createDataModel(new AbstractDataModelProvider(){}), "jsf.facet.install.page"); //$NON-NLS-1$
-		setTitle(Messages.JSFFacetInstallPage_title);
-		setDescription(Messages.JSFFacetInstallPage_description);
-		dialogSettings = JSFUiPlugin.getDefault().getDialogSettings();
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#createTopLevelComposite(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Composite createTopLevelComposite (final Composite parent) {
-		initializeDialogUnits(parent);
-		final Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout(3, false));
-
-		lblJSFImpl = new Label(composite, SWT.None);
-		lblJSFImpl.setText(Messages.JSFFacetInstallPage_JSFImplLabel);
-		lblJSFImpl.setLayoutData(new GridData(GridData.BEGINNING));
-
-		cboJSFImplViewer = new ComboViewer(composite, SWT.BORDER | SWT.READ_ONLY);
-		cboJSFImplViewer.getCombo().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		cboJSFImplViewer.setContentProvider(new IStructuredContentProvider(){
-			private java.util.List jsfImpls = new ArrayList(Collections.EMPTY_LIST);
-
-			public void dispose() {
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-				if (newInput == null)
-					jsfImpls = Collections.EMPTY_LIST;
-				else {
-					jsfImpls.clear();
-					jsfImpls.addAll((EList)newInput);
-				}
-			}			
-			public Object[] getElements(Object inputElement) {				
-				return jsfImpls.toArray(); 
-			}			
-		});
-		cboJSFImplViewer.setLabelProvider(new ILabelProvider(){
-			private JSFLibrary defaultImpl = null;
-
-			public String getText(Object element) {
-				if (element instanceof JSFLibrary){
-					StringBuffer nameBuf = new StringBuffer(((JSFLibrary)element).getName());
-					if (((JSFLibrary)element) == getDefaultImpl())
-						nameBuf.append(" ").append(JSFLibraryRegistry.DEFAULT_IMPL_LABEL); //$NON-NLS-1$
-					return nameBuf.toString() ;
-				}
-				return null;
-			}
-
-			private JSFLibrary getDefaultImpl() {
-				if (defaultImpl == null){
-					defaultImpl = JSFCorePlugin.getDefault().getJSFLibraryRegistry().getDefaultImplementation();
-				}
-				return defaultImpl;
-			}
-
-			public Image getImage(Object element) {return null;}
-			public void addListener(ILabelProviderListener listener) {}
-			public void dispose() {}
-			public boolean isLabelProperty(Object element, String property) {return false;}
-			public void removeListener(ILabelProviderListener listener) {}			
-		});
-
-		btnAddJSFImpl = new Button(composite, SWT.COMMAND);
-		btnAddJSFImpl.setText(Messages.JSFFacetInstallPage_Add1);
-		btnAddJSFImpl.setLayoutData(new GridData(GridData.END));
-		btnAddJSFImpl.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				JSFLibraryWizard wizard = new JSFLibraryWizard(true);
-				IWorkbench wb = PlatformUI.getWorkbench();
-				wizard.init(wb, null);
-				WizardDialog dialog = new WizardDialog(wb
-						.getActiveWorkbenchWindow().getShell(), wizard);
-				int ret = dialog.open();
-				if (ret == Window.OK) {
-					loadJSFImplList();
-					//select the new item
-					cboJSFImplViewer.setSelection(new StructuredSelection(wizard.getJSFLibrary()), true);
-//					addItemToList(wizard.getJSFLibrary().getName(), true);
-					validatePage();
-				}
-			}
-		});
-
-		Label lblSpacer = new Label(composite, SWT.NONE);
-		lblSpacer.setLayoutData(new GridData(GridData.BEGINNING));
-
-		chkDeployImpl = new Button(composite, SWT.CHECK);
-		chkDeployImpl.setText(Messages.JSFFacetInstallPage_DeployJarsLabel);
-		GridData gdd = new GridData(GridData.FILL_HORIZONTAL);
-		gdd.horizontalSpan = 2;
-		chkDeployImpl.setLayoutData(gdd);
-
-		lblJSFConfig = new Label(composite, SWT.NONE);
-		lblJSFConfig.setText(Messages.JSFFacetInstallPage_JSFConfigLabel);
-		lblJSFConfig.setLayoutData(new GridData(GridData.BEGINNING));
-
-		txtJSFConfig = new Text(composite, SWT.BORDER);
-		// txtJSFConfig.setText(config.getDefaultJSFConfigPath());
-		GridData gd1 = new GridData(GridData.FILL_HORIZONTAL);
-		gd1.horizontalSpan = 2;
-		txtJSFConfig.setLayoutData(gd1);
-
-		lblJSFServletName = new Label(composite, SWT.NONE);
-		lblJSFServletName.setText(Messages.JSFFacetInstallPage_JSFServletNameLabel);
-		lblJSFServletName.setLayoutData(new GridData(GridData.BEGINNING));
-
-		txtJSFServletName = new Text(composite, SWT.BORDER);
-		// txtJSFServletName.setText(config.getDefaultJSFServletName());
-		GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
-		gd2.horizontalSpan = 2;
-		txtJSFServletName.setLayoutData(gd2);
-
-		lblJSFServletURLPatterns = new Label(composite, SWT.NULL);
-		lblJSFServletURLPatterns.setText(Messages.JSFFacetInstallPage_JSFURLMappingLabel);
-		lblJSFServletURLPatterns.setLayoutData(new GridData(GridData.BEGINNING
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		lstJSFServletURLPatterns = new List(composite, SWT.BORDER);
-		GridData gd3 = new GridData(GridData.FILL_HORIZONTAL);
-		gd3.heightHint = convertHeightInCharsToPixels(10);
-		lstJSFServletURLPatterns.setLayoutData(gd3);
-		lstJSFServletURLPatterns.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				btnRemovePattern.setEnabled(lstJSFServletURLPatterns
-						.getSelectionCount() > 0);
-			}
-		});
-
-		Composite btnComposite = new Composite(composite, SWT.NONE);
-		GridLayout gl = new GridLayout(1, false);
-		// gl.marginBottom = 0;
-		// gl.marginTop = 0;
-		// gl.marginRight = 0;
-		gl.marginLeft = 0;
-		btnComposite.setLayout(gl);
-		btnComposite.setLayoutData(new GridData(GridData.END
-				| GridData.VERTICAL_ALIGN_FILL));
-
-		btnAddPattern = new Button(btnComposite, SWT.NONE);
-		btnAddPattern.setText(Messages.JSFFacetInstallPage_Add2);
-		btnAddPattern.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		btnAddPattern.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				InputDialog dialog = new InputDialog(
-						getShell(),
-						Messages.JSFFacetInstallPage_PatternDialogTitle,
-						Messages.JSFFacetInstallPage_PatternDialogDesc,
-						null, new IInputValidator() {
-
-							public String isValid(String newText) {
-								return isValidPattern(newText);
-							}
-
-						});
-				dialog.open();
-				if (dialog.getReturnCode() == Window.OK) {
-					addItemToList(dialog.getValue(), true);
-				}
-			}
-		});
-
-		btnRemovePattern = new Button(btnComposite, SWT.NONE);
-		btnRemovePattern.setText(Messages.JSFFacetInstallPage_Remove);
-		btnRemovePattern.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		btnRemovePattern.setEnabled(false);
-		btnRemovePattern.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				removeItemFromList(lstJSFServletURLPatterns.getSelection());
-				btnRemovePattern.setEnabled(false);
-			}
-		});
-
-		loadJSFImplList();
-		addModificationListeners();
-
-		return composite;
-	}
-
-	private void initializeValues() {
-		IDialogSettings root = dialogSettings.getSection(SETTINGS_ROOT);
-
-		JSFLibrary impl = (JSFLibrary)model.getDefaultProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION);
-		if (impl != null){
-			cboJSFImplViewer.setSelection(new StructuredSelection(impl), true);
-		} else {
-			cboJSFImplViewer.setSelection(StructuredSelection.EMPTY);
-		}
-
-		boolean deploy = ((Boolean)model.getDefaultProperty(IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION)).booleanValue();
-		String deployStr = null;
-		if (root != null)
-			deployStr = root.get(SETTINGS_DEPLOY_IMPL);
-		if (deployStr != null && !deployStr.equals("")) { //$NON-NLS-1$
-			deploy = Boolean.valueOf(deployStr).booleanValue();
-		}
-		chkDeployImpl.setSelection(deploy);
-
-		String conf = null;
-		if (root != null)
-			conf = root.get(SETTINGS_CONFIG);
-		if (conf == null || conf.equals("")) { //$NON-NLS-1$
-			conf = (String)model.getDefaultProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-		}
-		txtJSFConfig.setText(conf);
-
-		String servletName = null;
-		if (root != null)
-			servletName = root.get(SETTINGS_SERVLET);
-		if (servletName == null || servletName.equals("")) { //$NON-NLS-1$
-			servletName = (String)model.getDefaultProperty(IJSFFacetInstallDataModelProperties.SERVLET_NAME);
-		}
-		txtJSFServletName.setText(servletName);
-
-		loadURLMappingPatterns(root);
-	}
-
-	private void saveSettings() {
-		DialogSettings root = new DialogSettings(SETTINGS_ROOT);
-		dialogSettings.addSection(root);
-
-		root.put(SETTINGS_DEPLOY_IMPL, String.valueOf(getDeployJSFImpl()));
-		root.put(SETTINGS_CONFIG, getJSFConfig());
-		root.put(SETTINGS_SERVLET, getJSFServletName());
-		DialogSettings mappings = new DialogSettings(SETTINGS_URL_MAPPINGS);
-		root.addSection(mappings);
-		mappings.put(SETTINGS_URL_PATTERN, getJSFPatterns());
-	}
-
-	private boolean getDeployJSFImpl() {
-		return chkDeployImpl.getSelection();
-	}
-
-	private String getJSFConfig() {
-		return txtJSFConfig.getText().trim();
-	}
-
-	private String getJSFServletName() {
-		return txtJSFServletName.getText().trim();
-	}
-
-	private String[] getJSFPatterns() {
-		return lstJSFServletURLPatterns.getItems();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.project.facet.ui.IFacetWizardPage#setConfig(java.lang.Object)
-	 */
-	public void setConfig(Object config) {
-    	model.removeListener(this);
-    	synchHelper.dispose();
-    	
-        model = (IDataModel) config;
-        model.addListener(this);
-		synchHelper = initializeSynchHelper(model);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.project.facet.ui.IFacetWizardPage#transferStateToConfig()
-	 */
-	public void transferStateToConfig() {
-		saveSettings(); //convenient place for this.  don't want to save if user cancelled.
-		//do nothing else now.  being handled by synchHelper
-//		config.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION, getJSFImpl());
-//		config.setStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH, getJSFConfig());
-//		config.setStringProperty(IJSFFacetInstallDataModelProperties.SERVLET_NAME, getJSFServletName());
-//		config.setProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS, getJSFPatterns());
-	}
-
-	private void addModificationListeners() {
-//		119330 - enhancement request for ComboViewer support.  Manually update model for now
-		addJSFImplComboListeners();
-//		synchHelper.synchComboViewer(cboJSFImplViewer, IMPLEMENTATION, null);
-		synchHelper.synchText(txtJSFConfig, CONFIG_PATH, null);
-		synchHelper.synchText(txtJSFServletName, SERVLET_NAME, null);
-		synchHelper.synchCheckbox(chkDeployImpl, DEPLOY_IMPLEMENTATION, null);
-//		Until 119321 is fixed, need to comment out below and handle model updates 'manually'.  
-//		This is being done on Add and Remove, currently
-//		synchHelper.synchList(lstJSFServletURLPatterns, SERVLET_URL_PATTERNS, null);
-	}
-
-	private void addJSFImplComboListeners() {
-		cboJSFImplViewer.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event) {
-				if (cboJSFImplViewer.getSelection() != null  && cboJSFImplViewer.getSelection() instanceof StructuredSelection){
-					StructuredSelection sel = (StructuredSelection)cboJSFImplViewer.getSelection();
-					if (sel.getFirstElement() != null){
-						JSFLibrary lib = (JSFLibrary)sel.getFirstElement();
-						model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION, lib);
-						return;
-					}
-				}
-				model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION, null );
-			}			
-		});
-	}
-
-	private String isValidPattern(String value) {
-		if (value == null || value.trim().equals(""))  //$NON-NLS-1$
-			return Messages.JSFFacetInstallPage_PatternEmptyMsg;
-		if (lstJSFServletURLPatterns.indexOf(value) >= 0)
-			return Messages.JSFFacetInstallPage_PatternSpecifiedMsg;
-
-		return null;
-	}
-
-	private void loadURLMappingPatterns(IDialogSettings root) {
-		lstJSFServletURLPatterns.removeAll();
-		IDialogSettings mappings = null;
-		if (root != null)
-			mappings = root.getSection(SETTINGS_URL_MAPPINGS);
-		String[] patterns = null;
-		if (mappings != null)
-			patterns = mappings.getArray(SETTINGS_URL_PATTERN);
-
-		if (patterns == null || patterns.length == 0) {
-			patterns = (String[])model.getDefaultProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS);
-		}
-		for (int i = 0; i < patterns.length; i++) {
-			addItemToList(patterns[i], false);
-		}
-	}
-
-	private void addItemToList(String pattern, boolean selectMe) {
-		lstJSFServletURLPatterns.add(pattern == null ? "" : pattern); //$NON-NLS-1$
-		if (pattern == null && selectMe)
-			lstJSFServletURLPatterns.setSelection(lstJSFServletURLPatterns
-					.getItemCount() - 1);
-//		When 119321 is fixed - remove code below
-		updateModelForURLPattern();
-	}
-
-	private void removeItemFromList(String[] selection) {
-		for (int i = 0; i < selection.length; i++) {
-			String sel = selection[i];
-			lstJSFServletURLPatterns.remove(sel);
-		}
-//		When 119321 is fixed - remove code below 
-		updateModelForURLPattern();
-	}
-
-	private void updateModelForURLPattern() {
-		model.setProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS, lstJSFServletURLPatterns.getItems());
-	}
-
-	private void loadJSFImplList() {
-		cboJSFImplViewer.setInput(JSFCorePlugin.getDefault().getJSFLibraryRegistry()
-			.getImplJSFLibraries());		
-	}
-
-	protected String[] getValidationPropertyNames() {
-		return new String[]{IMPLEMENTATION, DEPLOY_IMPLEMENTATION, CONFIG_PATH, SERVLET_NAME};
-	}
-
-	public void setWizardContext(IWizardContext context) {
-		//hook into web datamodel if new project wizard.
-		Iterator it = context.getSelectedProjectFacets().iterator();
-		IProjectFacetVersion webFacetVersion = null;
-		while (it.hasNext()){
-			//find Web facet
-			IProjectFacetVersion pfv = (IProjectFacetVersion)it.next();
-			if (pfv.getProjectFacet().getId().equals("jst.web")){ //$NON-NLS-1$
-				webFacetVersion = pfv;
-				break;
-			}
-		}
-		if (webFacetVersion != null){
-			try {
-				webAppDataModel = (IDataModel)context.getConfig(webFacetVersion, IFacetedProject.Action.Type.INSTALL, 
-						context.getProjectName());
-				if (webAppDataModel != null){
-					webAppDataModel.addListener(this);
-				}
-			} catch (CoreException e) {
-				JSFUiPlugin.log(
-						IStatus.ERROR,
-						Messages.JSFFacetInstallPage_ErrorNoWebAppDataModel,
-						e);
-			}
-		}
-	}
-
-	public void propertyChanged(DataModelEvent event) {
-		if (webAppDataModel != null){
-			String propertyName = event.getPropertyName();
-			if (propertyName.equals(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER)){
-				model.setStringProperty(WEBCONTENT_DIR, event.getProperty().toString());
-			}
-		}
-		super.propertyChanged(event);
-	}
-
-	public void dispose() {
-		if (webAppDataModel != null)
-			webAppDataModel.removeListener(this);
-		super.dispose();
-	}
-	protected void restoreDefaultSettings() {
-		initializeValues();
-	}
-}
