Applied patch for
https://bugs.eclipse.org/bugs/show_bug.cgi?id=187529
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
index 520277e..a98eafd 100644
--- 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
@@ -21,6 +21,21 @@
 public class Messages extends NLS {
 	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.core.internal.messages"; //$NON-NLS-1$
 
+	/**
+	 * see messages.properties
+	 */
+	public static String JSFFacetInstallDataModelProvider_ClientImplValidationMsg;
+
+	/**
+	 * see messages.properties
+	 */
+	public static String JSFFacetInstallDataModelProvider_DupeJarValidation;
+
+	/**
+	 * see messages.properties
+	 */
+	public static String JSFFacetInstallDataModelProvider_INITIAL_VALIDATION_IMPL_TYPE;
+
 
 	/**
 	 * see messages.properties
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java
index 36e3411..93086db 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java
@@ -13,6 +13,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
+import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
+
 /**
  * To construct implementation library and component libraries from sticky values 
  * in DialogSettings as saved libraries.  
@@ -30,9 +33,22 @@
 	private String[] savedCompLibs;
 	private JSFLibraryInternalReference selJSFLibImpl;	// lazy initialized	
 	private List selJSFLibComp;							// lazy initialized
+
+	private IMPLEMENTATION_TYPE implType;
+	
+	
+	/**
+	 * Constructor where implementation type was chosen to be CLIENT_SUPPLIED.  Created for backwards compatibilty when server supplied was not an option.
+	 * @param implLibDeployFlag
+	 * @param compLibs
+	 */
+	public JSFLibraryConfigDialogSettingData(boolean implLibDeployFlag, String[] compLibs) {
+		this(IMPLEMENTATION_TYPE.CLIENT_SUPPLIED, implLibDeployFlag, compLibs);		
+	}
 	
 	/**
 	 * Constructor
+	 * @param implType {@link IMPLEMENTATION_TYPE}
 	 * @param implLibDeployFlag String  valid options are "true" or "false"
 	 * @param compLibs String[]  saved component library settings in string array
 	 * 
@@ -45,10 +61,12 @@
 		verifySavedLibAvailability();
 	}
 	*/
-	public JSFLibraryConfigDialogSettingData(boolean implLibDeployFlag, String[] compLibs) {
+	public JSFLibraryConfigDialogSettingData(IMPLEMENTATION_TYPE implType, boolean implLibDeployFlag, String[] compLibs) {
+		
 		this.jsfLibReg = JSFLibraryRegistryUtil.getInstance();
 		this.dftImplLibDeployFlag = implLibDeployFlag;
 		this.savedCompLibs = compLibs;
+		this.implType = implType;
 		
 		// Verify and log a message if a saved component library no longer exists. 
 		verifySavedLibAvailability();
@@ -144,4 +162,10 @@
 
  	}
 	
+ 	/**
+ 	 * @return {@link IMPLEMENTATION_TYPE}
+ 	 */
+ 	public IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE getImplementationType(){
+ 		return implType;
+ 	}
 }
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigModel.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigModel.java
index 4e6bb2d..6321353 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigModel.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigModel.java
@@ -15,6 +15,7 @@
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.jst.jsf.core.internal.Messages;
+import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
 
 /**
  * Model for the custom control <b>JSFLibraryConfigControl</b>.
@@ -39,6 +40,12 @@
 	}
 		
 	/**
+	 * @return IMPLEMENTATION_TYPE
+	 */
+	public IMPLEMENTATION_TYPE getImplementationType() {
+		return data.getImplementationType();
+	}
+	/**
 	 * Return JSF implementation libraries.
 	 * 
 	 * This list is initialized from JSF library registry and updated with persistent configuration data.  
@@ -219,7 +226,7 @@
 		JSFLibraryConfigProjectData data_ = new JSFLibraryConfigProjectData(project);
 		List implLibs = new ArrayList();
 		implLibs.add(getCurrentJSFImplementationLibrarySelection());
-		data_.saveData(implLibs, getCurrentJSFComponentLibrarySelection());
+		data_.saveData(implLibs, getCurrentJSFComponentLibrarySelection(), getImplementationType());
 	}	
 	
 	/**
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigProjectData.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigProjectData.java
index 4d89be6..70d36dc 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigProjectData.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigProjectData.java
@@ -21,6 +21,7 @@
 import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
 import org.eclipse.jst.jsf.core.internal.Messages;
 import org.eclipse.jst.jsf.core.internal.project.facet.JSFUtils;
+import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
 import org.eclipse.osgi.util.NLS;
 
 /**
@@ -42,8 +43,8 @@
 	
 	final private IProject project;
 	final private JSFLibraryRegistryUtil jsfLibReg;
-	private JSFLibraryInternalReference selJSFLibImpl = null;	
-	private List selJSFLibComp = null;
+	private JSFLibraryInternalReference selJSFLibImpl;	
+	private List selJSFLibComp;
 
 	/**
 	 * Constructor
@@ -61,6 +62,16 @@
 		}		
 	}
 	 	
+	public IMPLEMENTATION_TYPE getImplementationType() {
+		try {
+			String type = ((IResource)project).getPersistentProperty(new QualifiedName(QUALIFIEDNAME, 
+					JSFUtils.PP_JSF_IMPLEMENTATION_TYPE));
+			return IMPLEMENTATION_TYPE.getValue(type);
+		} catch (CoreException e) {//
+		}
+		return IMPLEMENTATION_TYPE.UNKNOWN;
+	}	
+	
 	/**
 	 * Return the previously selected JSF implementation library from project persistent properties.
 	 * Return null if none exists.
@@ -128,10 +139,11 @@
 	 * @param implementation
 	 * @param component
 	 */
-	void saveData(final List implementation, final List component) {
+	void saveData(final List implementation, final List component, final IMPLEMENTATION_TYPE implType) {
 		try {
 			((IResource)project).setPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_IMPLEMENTATION_LIBRARIES), generatePersistString(implementation));
 			((IResource)project).setPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_COMPONENT_LIBRARIES), generatePersistString(component));
+			((IResource)project).setPersistentProperty(new QualifiedName(QUALIFIEDNAME, JSFUtils.PP_JSF_IMPLEMENTATION_TYPE), IMPLEMENTATION_TYPE.getStringValue(implType));
 			
 			/* Flush the selection so that they can be reconstructed from 
 			 * persistent properties when getSavedJSFImplLib and getSavedJSFCompLibs 
@@ -288,6 +300,6 @@
 		boolean needDeploy() {
 			return deploy;
 		}		
-	}	
+	}
 	
 }
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfiglModelSource.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfiglModelSource.java
index 7cda7a3..5575835 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfiglModelSource.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfiglModelSource.java
@@ -12,6 +12,8 @@
 
 import java.util.List;
 
+import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
+
 /**
  * Interface for data source to instanciate a <b>JSFLibraryConfigModel</b> object. 
  * 
@@ -35,5 +37,12 @@
 	 *  
  	 * @return List
  	 */
- 	public List getJSFComponentLibraries(); 	
+ 	public List getJSFComponentLibraries(); 
+ 	
+ 	/**
+	 * Return type of implementation
+	 *  
+ 	 * @return {@link IMPLEMENTATION_TYPE}
+ 	 */
+ 	public IMPLEMENTATION_TYPE getImplementationType(); 	
 }
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
index dfd88d3..4f8ac77 100644
--- 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
@@ -23,10 +23,13 @@
 JSFLibraryClasspathContainer_NON_IMPL_LIBRARY=[JSF Library]
 JSFLibrariesContainerInitializer_missing_library=[missing JSF Library]
 JSFFacetInstallDataModelProvider_ValidateJSFImpl=A JSF implementation library has not been chosen
+JSFFacetInstallDataModelProvider_DupeJarValidation=Duplicated jar on classpath: {0}
 JSFFacetInstallDataModelProvider_ValidateConfigFilePath=The configuration file path is not valid
 JSFFacetInstallDataModelProvider_ValidateConfigFileEmpty=Specify a valid name and location for JSF configuration file
+JSFFacetInstallDataModelProvider_ClientImplValidationMsg=JSF Implementation library must be specified.
 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_INITIAL_VALIDATION_IMPL_TYPE=Select an implementation library.   If a server supplied library is chosen , the chosen server adapter must be capable of providing the JSF Implementation jars, or the application will not validate or compile.
 JSFFacetInstallDataModelProvider_ValidateConfigFileXML=JSF configuration file must be an XML file
 JSFFacetInstallDataModelProvider_ValidateConfigFileSlashes=Configuration file path must not contain "\\"s.   Use "/" instead.
 JSFLibCfgDialogSettingData_Sticky_Component_Lib_Not_Exist=A sticky component library selection no longer exists.
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/AbstractJSFFacetInstallDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/AbstractJSFFacetInstallDelegate.java
index 2a7c38b..42523a2 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/AbstractJSFFacetInstallDelegate.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/AbstractJSFFacetInstallDelegate.java
@@ -105,15 +105,22 @@
 				cpEntries.add(javaProject.getRawClasspath()[i]);
 			}
 		} catch (JavaModelException e) {
-			JSFCorePlugin.log(e, "Unable to read classpath");
+			JSFCorePlugin.log(e, "Unable to read classpath"); //$NON-NLS-1$
 		}
 		
+		IPath path, cp = null;
+		IClasspathEntry entry = null;
+		JSFLibraryInternalReference libref = null;
+		
 		//Implementation
-		IPath cp = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID);		
-		JSFLibraryInternalReference libref = (JSFLibraryInternalReference)config.getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION);
-		IPath path = cp.append(new Path(libref.getID()));
-		IClasspathEntry entry = getNewCPEntry(path, libref);		
-		cpEntries.add(entry);
+		if (config.getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME) 
+				== IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE.CLIENT_SUPPLIED){
+			cp = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID);		
+			libref = (JSFLibraryInternalReference)config.getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION);
+			path = cp.append(new Path(libref.getID()));
+			entry = getNewCPEntry(path, libref);		
+			cpEntries.add(entry);
+		}
 
 		JSFLibraryInternalReference[] compLibs = (JSFLibraryInternalReference[])config.getProperty(IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES);
 		for (int i=0;i<compLibs.length;i++){
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
index 9d891d2..ad03d47 100644
--- 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
@@ -19,6 +19,12 @@
  */
 public interface IJSFFacetInstallDataModelProperties extends
         IFacetInstallDataModelProperties {
+	
+    /**
+     * TODO:
+     */
+	public static final String IMPLEMENTATION_TYPE_PROPERTY_NAME = "IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME"; //$NON-NLS-1$
+	
     /**
      * TODO:
      */
@@ -57,15 +63,62 @@
     /**
      * TODO:
      */
-    public static final String DEFAULT_IMPLEMENTATION_LIBRARY = "IJSFFacetInstallDataModelProperties.DEFAULT_IMPLEMENTATION_LIBRARY";
+    public static final String DEFAULT_IMPLEMENTATION_LIBRARY = "IJSFFacetInstallDataModelProperties.DEFAULT_IMPLEMENTATION_LIBRARY"; //$NON-NLS-1$
 
     /**
      * TODO:
      */
-    public static final String IMPLEMENTATION_LIBRARIES = "IJSFFacetInstallDataModelProperties.IMPLEMENTATION_LIBRARIES";
+    public static final String IMPLEMENTATION_LIBRARIES = "IJSFFacetInstallDataModelProperties.IMPLEMENTATION_LIBRARIES"; //$NON-NLS-1$
 
     /**
      * TODO:
      */
     public static final String COMPONENT_LIBRARIES = "IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES"; //$NON-NLS-1$	 
+    
+    /**
+     * Enumeration of implementation types
+     */
+    public enum IMPLEMENTATION_TYPE {
+    	
+    	/**
+    	 * Unknown
+    	 */
+    	UNKNOWN,
+    	/**
+    	 * Server supplied
+    	 */
+    	SERVER_SUPPLIED,
+    	/**
+    	 * Client supplied
+    	 */
+    	CLIENT_SUPPLIED;
+    	
+    	/**
+    	 * @param type
+    	 * @return String value
+    	 */
+    	public static String getStringValue(final IMPLEMENTATION_TYPE type){
+    		if (type == null)
+    			return "UNKNOWN"; //$NON-NLS-1$
+    		if (type ==  SERVER_SUPPLIED)
+    			return "SERVER_SUPPLIED";//$NON-NLS-1$
+    		if (type == CLIENT_SUPPLIED)
+    			return "CLIENT_SUPPLIED";//$NON-NLS-1$
+    		return "UNKNOWN"; //$NON-NLS-1$
+    	}
+    	
+    	/**
+    	 * @param type
+    	 * @return IMPLEMENTATION_TYPE
+    	 */
+    	public static IMPLEMENTATION_TYPE getValue(final String type){
+    		if (type == null)
+    			return UNKNOWN;
+    		if (type.equals("SERVER_SUPPLIED"))//$NON-NLS-1$
+    			return SERVER_SUPPLIED;
+    		if (type.equals("CLIENT_SUPPLIED"))//$NON-NLS-1$
+    			return CLIENT_SUPPLIED;
+    		return UNKNOWN; 
+    	}
+    }
 }
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
index c9ce379..1c7b7db 100644
--- 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
@@ -56,6 +56,7 @@
 	
 	public Set getPropertyNames() {
 		Set names = super.getPropertyNames();
+		names.add(IMPLEMENTATION_TYPE_PROPERTY_NAME);
 		names.add(IMPLEMENTATION);
 		names.add(DEPLOY_IMPLEMENTATION);
 		names.add(CONFIG_PATH);
@@ -72,7 +73,10 @@
 	}
 
 	public Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(IMPLEMENTATION)) {
+		if (propertyName.equals(IMPLEMENTATION_TYPE_PROPERTY_NAME)){
+			return IMPLEMENTATION_TYPE.UNKNOWN;
+		}
+		else if (propertyName.equals(IMPLEMENTATION)) {
 			if (JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry() == null)
 				return null;
 			return getDefaultImplementationLibrary();//JSFCorePlugin.getDefault().getJSFLibraryRegistry().getDefaultImplementation();
@@ -89,7 +93,7 @@
 		} else if (propertyName.equals(FACET_ID)) {
 			return IJSFCoreConstants.JSF_CORE_FACET_ID;
 		} else if (propertyName.equals(WEBCONTENT_DIR)){
-			return "WebContent";  //not sure I need this
+			return "WebContent";  //not sure I need this //$NON-NLS-1$
 		} else if (propertyName.equals(COMPONENT_LIBRARIES)) {
 			return new JSFLibraryInternalReference[0];
 		} else if (propertyName.equals(IMPLEMENTATION_LIBRARIES)) {
@@ -102,13 +106,20 @@
 	
 	public IStatus validate(String name) {
 		errorMessage = null;
-		if (name.equals(IMPLEMENTATION)) {
-			JSFLibraryInternalReference lib = (JSFLibraryInternalReference)getProperty(IMPLEMENTATION);
-			IStatus status = validateImpl(lib.getLibrary());
-			if (!OK_STATUS.equals(status))
-				return status;
-				
-            return validateClasspath();
+		if (name.equals(IMPLEMENTATION_TYPE_PROPERTY_NAME)) {
+			if (getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME) == IMPLEMENTATION_TYPE.UNKNOWN) {
+				return createErrorStatus(Messages.JSFFacetInstallDataModelProvider_INITIAL_VALIDATION_IMPL_TYPE);
+			}
+		}
+		else if (name.equals(IMPLEMENTATION)) {
+			if (getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME) == IMPLEMENTATION_TYPE.CLIENT_SUPPLIED) {
+				JSFLibraryInternalReference lib = (JSFLibraryInternalReference)getProperty(IMPLEMENTATION);
+				IStatus status = validateImpl(lib.getLibrary());
+				if (!OK_STATUS.equals(status))
+					return status;
+					
+	            return validateClasspath();
+			}
 		} else if (name.equals(CONFIG_PATH)) {
 			return validateConfigLocation(getStringProperty(CONFIG_PATH));
 		} else if (name.equals(SERVLET_NAME)) {			
@@ -123,7 +134,7 @@
 	private IStatus createErrorStatus(String msg) {		
 		return new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, msg);
 	}
-
+	
 	private IStatus validateServletName(String servletName) {
 		if (servletName == null || servletName.trim().length() == 0) {
 			errorMessage = Messages.JSFFacetInstallDataModelProvider_ValidateServletName;
@@ -208,22 +219,26 @@
 				}
 			} catch (JavaModelException e) {
 			    // FIXME: what should we do in this case?
-			    JSFCorePlugin.log(e, "Error searching class path");
+			    JSFCorePlugin.log(e, "Error searching class path"); //$NON-NLS-1$
 			}			
 		}
 		//else as we do not have a javaProject yet, all we can do is validate that there is no duplicate jars (absolute path)
 		
 		IStatus status = null;
-		JSFLibraryInternalReference ref =  ((JSFLibraryInternalReference)getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION));
-		if (ref != null){
-			status = checkForDupeArchiveFiles(jars, ((JSFLibraryInternalReference)getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION)).getLibrary());
-			if (!OK_STATUS.equals(status)){
-				return status;
-			}
-		} else {
-			return createErrorStatus("JSF Implementation library must be specified.");
-		}
 		
+		JSFLibraryInternalReference ref = null;
+		if (getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME) == IMPLEMENTATION_TYPE.CLIENT_SUPPLIED) {
+			ref = ((JSFLibraryInternalReference)getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION));
+			if (ref != null){
+				status = checkForDupeArchiveFiles(jars, ((JSFLibraryInternalReference)getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION)).getLibrary());
+				if (!OK_STATUS.equals(status)){
+					return status;
+				}
+			} else {
+				return createErrorStatus(Messages.JSFFacetInstallDataModelProvider_ClientImplValidationMsg);
+			}
+		}
+
 		JSFLibraryInternalReference[] compLibs = (JSFLibraryInternalReference[]) getProperty(IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES);
 		if (compLibs != null){
 			for (int i=0;i<compLibs.length;i++){
@@ -263,7 +278,7 @@
 		for (Iterator it=aJSFLib.getArchiveFiles().iterator();it.hasNext();){
 			ArchiveFile jar = (ArchiveFile)it.next();
 			if (jars.contains(jar.getResolvedSourceLocation())){
-				return createErrorStatus("Duplicated jar on classpath: "+jar.getResolvedSourceLocation());				
+				return createErrorStatus(NLS.bind(Messages.JSFFacetInstallDataModelProvider_DupeJarValidation,jar.getResolvedSourceLocation()));				
 			}
             jars.add(jar.getResolvedSourceLocation());
 		}
@@ -325,7 +340,7 @@
 		
 		IDataModel projModel = (IDataModel)getProperty(MASTER_PROJECT_DM);
 		FacetDataModelMap dmMap = (FacetDataModelMap)projModel.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
-		IDataModel webFacet = dmMap.getFacetDataModel("jst.web");
+		IDataModel webFacet = dmMap.getFacetDataModel("jst.web"); //$NON-NLS-1$
 		return webFacet.getStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER );
 	}
 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFJ2EEFacetInstallDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFJ2EEFacetInstallDelegate.java
index 44c0d94..a24f561 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFJ2EEFacetInstallDelegate.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFJ2EEFacetInstallDelegate.java
@@ -64,7 +64,7 @@
 				op.run(monitor);
 			}
 		} catch (CoreException e) {
-			JSFCorePlugin.log(e, "Exception occured while creating faces-config.xml");
+			JSFCorePlugin.log(e, "Exception occured while creating faces-config.xml"); //$NON-NLS-1$
 		}
 
 	}
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
index 8d520ee..9d8df2b 100644
--- 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
@@ -50,7 +50,7 @@
 	/**
 	 * The path to the default application configuration file
 	 */
-	public static final String JSF_DEFAULT_CONFIG_PATH = "/WEB-INF/faces-config.xml"; 
+	public static final String JSF_DEFAULT_CONFIG_PATH = "/WEB-INF/faces-config.xml";  //$NON-NLS-1$
 
 	/**
 	 * Default URL mapping to faces servlet
@@ -67,7 +67,11 @@
      * TODO: should encapsulate the property somewhere and hide the constant
 	 */
 	public static final String PP_JSF_COMPONENT_LIBRARIES = "jsf.component.libraries"; //$NON-NLS-1$
-	
+	/**
+	 * the key for implementation type in persistent properties
+     * TODO: should encapsulate the property somewhere and hide the constant
+	 */
+	public static final String PP_JSF_IMPLEMENTATION_TYPE = "jsf.implementation.type"; //$NON-NLS-1$
 	/**
 	 * Construct an array that hold paths for all JARs in a JSF library. 
 	 * However, archive files that no longer exist are filtered out.  
@@ -145,7 +149,7 @@
 	 */
 	protected static String getDisplayName(IDataModel config) {
 		String displayName = config.getStringProperty(IJSFFacetInstallDataModelProperties.SERVLET_NAME);
-		if (displayName.equals(""))
+		if (displayName.equals("")) //$NON-NLS-1$
 			displayName = JSF_DEFAULT_SERVLET_NAME;
 		return displayName;
 	}
@@ -156,7 +160,7 @@
 	 */
 	protected static String getServletClassname(IDataModel config) {
 		String className = config.getStringProperty(IJSFFacetInstallDataModelProperties.SERVLET_CLASSNAME);
-		if (className.equals(""))
+		if (className.equals("")) //$NON-NLS-1$
 			className = JSF_SERVLET_CLASS;
 		return className;
 	}
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
index 5bc3932..e1245ba 100644
--- 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
@@ -157,6 +157,10 @@
     /**
      * see messages.properties
      */
+	public static String JSFLibraryConfigControl_DeployButtonLabel;
+    /**
+     * see messages.properties
+     */
 	public static String JSFLibraryConfigControl_DeployJAR;
     /**
      * see messages.properties
@@ -169,6 +173,10 @@
     /**
      * see messages.properties
      */
+	public static String JSFLibraryConfigControl_NewImplButtonTooltip;
+    /**
+     * see messages.properties
+     */
 	public static String JSFLibraryConfigControl_NewImplementationLibrary;
     /**
      * see messages.properties
@@ -185,6 +193,14 @@
     /**
      * see messages.properties
      */
+	public static String JSFLibraryConfigControl_ServerSuppliedButtonLabel;
+    /**
+     * see messages.properties
+     */
+	public static String JSFLibraryConfigControl_ServerSuppliedButtonTooltip;
+    /**
+     * see messages.properties
+     */
 	public static String JSFLibraryConfigControl_TH_Deploy;
     /**
      * see messages.properties
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java
index 17d095a..26386cd 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java
@@ -52,10 +52,13 @@
 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.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
 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.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Image;
@@ -88,6 +91,8 @@
 
 	private JSFLibraryConfigModel workingCopyModel = null;
 	
+	private Button btnServerSupplied;
+	private Button btnUserSupplied;
 	private ComboViewer cvImplLib;
 	private CheckboxTableViewer ctvSelCompLib;
 	private Button btnDeployJars;
@@ -255,9 +260,27 @@
 		}
 
 		setCompListModelProperty();
+		
+		initializeImplementationType();
+		
 		redraw();
 	}
 	
+	private void initializeImplementationType() {
+		IMPLEMENTATION_TYPE implType = workingCopyModel.getImplementationType();
+		if (implType == IMPLEMENTATION_TYPE.SERVER_SUPPLIED) {
+			btnServerSupplied.setSelection(true);
+			btnUserSupplied.setSelection(false);
+			enableUserSupplied(false);
+		} else if (implType == IMPLEMENTATION_TYPE.CLIENT_SUPPLIED) {
+			btnServerSupplied.setSelection(false);
+			btnUserSupplied.setSelection(true);
+			enableUserSupplied(true);
+		} else {
+			enableUserSupplied(false);
+		}	
+		model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME, implType);
+	}
 	private void loadJSFImplList() {
 		cvImplLib.setInput(workingCopyModel.getJSFImplementationLibraries());
 	}
@@ -278,53 +301,75 @@
 		return selJSFImpl;		
 	}
 
-	private void createControls() {
-		setRedraw(true);
-		final GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 4;
-		gridLayout.marginLeft = 0;
-		gridLayout.marginRight = 0;
-		gridLayout.marginWidth = 0;
-		setLayout(gridLayout);
+	private void createImplLibControls(Composite parent) {
+		final Composite cmpImpls = new Composite(parent, SWT.NONE);
+		final GridLayout gridLayoutImpls = new GridLayout();
+		gridLayoutImpls.numColumns = 4;
+		gridLayoutImpls.marginLeft = 0;
+		gridLayoutImpls.marginTop = 0;
+		gridLayoutImpls.marginBottom = 0;
 		
-		final Label lblImplLib = new Label(this, SWT.NONE);
-		final GridData gd_lbl_impl = new GridData(GridData.BEGINNING, GridData.CENTER, false, false, 2, 1);
-		lblImplLib.setLayoutData(gd_lbl_impl);
-		lblImplLib.setText(Messages.JSFLibraryConfigControl_ImplementationLibrary);
+		cmpImpls.setLayout(gridLayoutImpls);
+		GridData gdCmpImpls = new GridData();
+		gdCmpImpls.horizontalAlignment = SWT.FILL;
+		gdCmpImpls.grabExcessHorizontalSpace = true;
+		cmpImpls.setLayoutData(gdCmpImpls);
 
-		btnDeployJars = new Button(this, SWT.CHECK);
-		btnDeployJars.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false, 2, 1));
-		btnDeployJars.setText(Messages.JSFLibraryConfigControl_DeployJAR);
-		btnDeployJars.addSelectionListener(new SelectionAdapter() {
+		btnServerSupplied = new Button(cmpImpls, SWT.RADIO);
+		btnServerSupplied.setToolTipText(Messages.JSFLibraryConfigControl_ServerSuppliedButtonTooltip);
+		GridData gdSS = new GridData();
+		gdSS.horizontalAlignment = SWT.BEGINNING;
+		btnServerSupplied.setLayoutData(gdSS);
+		
+		btnServerSupplied.addSelectionListener(new SelectionAdapter(){
 			public void widgetSelected(SelectionEvent e) {
-				if (! _initing){
-					JSFLibraryInternalReference jsflib = getCurrentSelectedJSFImplLib();
-					if (jsflib != null)
-						jsflib.setToBeDeployed(btnDeployJars.getSelection());
-					workingCopyModel.setCurrentJSFImplementationLibrarySelection(jsflib);//why r we doing this here???
-	//				model.setProperty(IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION, btnDeployJars.getSelection());
-					fireChangedEvent(e);
-				}
-			}
-		}
-		);
+				setServerSuppliedLibrarySelection(e);
+			}			
+		});
 		
-		final Composite compTest = new Composite(this, SWT.None);
-		final GridLayout compgl = new GridLayout();
-		compgl.numColumns = 2;
-		compgl.marginLeft = 0;
-		compgl.marginRight = 0;		
-		compgl.marginWidth = 0;
-		GridData gdCompTest = new GridData(SWT.FILL, SWT.FILL, true, false);		
-		gdCompTest.horizontalSpan = 4;		
-		compTest.setLayoutData(gdCompTest);
-		compTest.setLayout(compgl);
+		Label lblServerSupplied = new Label(cmpImpls, SWT.NONE);
+		lblServerSupplied.setText(Messages.JSFLibraryConfigControl_ServerSuppliedButtonLabel);
+		GridData lblSS = new GridData();
+		lblSS.grabExcessHorizontalSpace = true;
+		lblServerSupplied.setLayoutData(lblSS);
+		lblServerSupplied.addMouseListener(new MouseAdapter(){
+			public void mouseUp(MouseEvent e) {
+				btnServerSupplied.setSelection(true);
+				setServerSuppliedLibrarySelection(e);				
+			}			
+		});
 		
-		cvImplLib = new ComboViewer(compTest, SWT.READ_ONLY);
+		
+		Label lblSpacer1 = new Label(cmpImpls, SWT.NONE);
+		GridData gdSpc1 = new GridData();
+		gdSpc1.horizontalAlignment = SWT.END;
+		gdSpc1.horizontalSpan = 2;
+		lblSpacer1.setLayoutData(gdSpc1);
+		
+		btnUserSupplied = new Button(cmpImpls, SWT.RADIO);
+		btnUserSupplied.setLayoutData(new GridData());
+		btnUserSupplied.addSelectionListener(new SelectionAdapter(){
+			public void widgetSelected(SelectionEvent e) {
+				setUserSuppliedLibrarySelection(e);
+			}			
+		});
+		
+		this.addOkClickedListener(new IJSFImplLibraryCreationListener() {
+			public void okClicked(JSFImplLibraryCreationEvent event) {				
+				if (! btnUserSupplied.getSelection()  && event.isLibraryCreated()) {
+					btnServerSupplied.setSelection(false);
+					setUserSuppliedLibrarySelection(event);
+				}				
+			}			
+		});
+			
+		cvImplLib = new ComboViewer(cmpImpls, SWT.READ_ONLY);
 		cvImplLib.setLabelProvider(new ImplLibCVListLabelProvider());
 		cvImplLib.setContentProvider(new ImplLibCVContentProvider());
 		comboImplLib = cvImplLib.getCombo();
-		final GridData gd_cvImplLib = new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1);
+		GridData gd_cvImplLib = new GridData();
+		gd_cvImplLib.horizontalAlignment = SWT.FILL;
+		gd_cvImplLib.grabExcessHorizontalSpace = true;
 		comboImplLib.setLayoutData(gd_cvImplLib);
 		cvImplLib.addSelectionChangedListener(
 			new ISelectionChangedListener() {
@@ -339,10 +384,32 @@
 				}
 			}
 		);
-				
-		final Button btnNewImpl = new Button(compTest, SWT.NONE);
-		btnNewImpl.setLayoutData(new GridData(GridData.CENTER, GridData.CENTER, false, false));
+			
+		btnDeployJars = new Button(cmpImpls, SWT.CHECK);
+		GridData gdDeploy = new GridData();
+		btnDeployJars.setLayoutData(gdDeploy);
+		btnDeployJars.setText(Messages.JSFLibraryConfigControl_DeployButtonLabel);
+		btnDeployJars.setToolTipText(Messages.JSFLibraryConfigControl_DeployJAR);
+		btnDeployJars.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (! _initing){
+					JSFLibraryInternalReference jsflib = getCurrentSelectedJSFImplLib();
+					if (jsflib != null)
+						jsflib.setToBeDeployed(btnDeployJars.getSelection());
+					workingCopyModel.setCurrentJSFImplementationLibrarySelection(jsflib);//why r we doing this here???
+	//				model.setProperty(IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION, btnDeployJars.getSelection());
+					fireChangedEvent(e);
+				}
+			}
+		}
+		);
+		
+		final Button btnNewImpl = new Button(cmpImpls, SWT.NONE); //compTest,
+		GridData gdNew = new GridData();
+		gdNew.horizontalAlignment = SWT.END;
+		btnNewImpl.setLayoutData(gdNew);
 		btnNewImpl.setText(Messages.JSFLibraryConfigControl_NewImplementationLibrary);	
+		btnNewImpl.setToolTipText(Messages.JSFLibraryConfigControl_NewImplButtonTooltip);
 		btnNewImpl.addSelectionListener(new SelectionAdapter() {
 			public void widgetSelected(SelectionEvent e) {
 				JSFLibraryWizard wizard = new JSFLibraryWizard(JSFLibraryWizard.IMPLS);
@@ -360,6 +427,7 @@
 					loadJSFImplList();
 					btnDeployJars.setSelection(true);
 					cvImplLib.setSelection(new StructuredSelection(lib), true);
+					
 				}
 				// notify listeners that a JSF implementation is created.
 				JSFImplLibraryCreationEvent event = new JSFImplLibraryCreationEvent(this, (ret == Window.OK));
@@ -371,18 +439,48 @@
 				}
 			}
 		});		
-
-		final Label lblSeparator = new Label(this, SWT.SEPARATOR | SWT.HORIZONTAL);
-		GridData gd_lbl_spacer = new GridData(GridData.FILL, GridData.CENTER, true, false, 4, 1);
-		lblSeparator.setLayoutData(gd_lbl_spacer);
-		lblSeparator.setAlignment(SWT.CENTER);
-
-		final Label lblCompLib = new Label(this, SWT.NONE);
+	}
+	
+	private void setServerSuppliedLibrarySelection(final EventObject e) {
+		btnUserSupplied.setSelection(false);
+		model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME, IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE.SERVER_SUPPLIED);
+		enableUserSupplied(false);
+		fireChangedEvent(e);
+		
+	}
+	
+	private void setUserSuppliedLibrarySelection(final EventObject e) {
+		btnUserSupplied.setSelection(true);
+		model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME, IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE.CLIENT_SUPPLIED);
+		enableUserSupplied(true);	
+		fireChangedEvent(e);
+	}
+	
+	private void enableUserSupplied(boolean enabled) {
+		cvImplLib.getCombo().setEnabled(enabled);
+		btnDeployJars.setEnabled(enabled);		
+	}
+	
+	private void createCompLibControls(Composite parent) {
+		final Composite cmpCompLibs = new Composite(parent, SWT.NONE);
+		final GridLayout gridLayoutCompLibs = new GridLayout();
+		gridLayoutCompLibs.numColumns = 4;
+		gridLayoutCompLibs.marginLeft = 0;
+		gridLayoutCompLibs.marginRight = 0;
+		gridLayoutCompLibs.marginWidth = 0;
+		cmpCompLibs.setLayout(gridLayoutCompLibs);
+		GridData gdComp = new GridData();
+		gdComp.horizontalAlignment = SWT.FILL;
+		gdComp.grabExcessHorizontalSpace = true;
+		cmpCompLibs.setLayoutData(gdComp);
+		
+		
+		final Label lblCompLib = new Label(cmpCompLibs, SWT.NONE);
 		final GridData gd_lbl_complib = new GridData(GridData.FILL, GridData.CENTER, false, false, 4, 1);
 		lblCompLib.setLayoutData(gd_lbl_complib);
 		lblCompLib.setText(Messages.JSFLibraryConfigControl_ComponentLibrary);
 				
-		tvCompLib = new TreeViewer(this, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
+		tvCompLib = new TreeViewer(cmpCompLibs, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
 		tvAdapter = new TreeViewerAdapter();
 		tvLabelProvider = new TreeLabelProvider();
 		tvCompLib.setContentProvider(tvAdapter);
@@ -399,7 +497,7 @@
 		tvCompLib.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
 		tvCompLib.addFilter(new TreeViewerFilter());		
 		
-		final Composite composite_buttons = new Composite(this, SWT.NONE);
+		final Composite composite_buttons = new Composite(cmpCompLibs, SWT.NONE);
 		composite_buttons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
 		composite_buttons.setLayout(new GridLayout());
 
@@ -465,7 +563,7 @@
 			}
 		});	
 
-		ctvSelCompLib = CheckboxTableViewer.newCheckList(this, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
+		ctvSelCompLib = CheckboxTableViewer.newCheckList(cmpCompLibs, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
 		ctvSelCompLib.addFilter(new CheckedTableViewerFilter());
 		final Table table = ctvSelCompLib.getTable();
 		table.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));		
@@ -473,6 +571,7 @@
 		final TableColumn tcDeploy = new TableColumn(table, SWT.LEFT);
 		tcDeploy.setWidth(50);
 		tcDeploy.setText(Messages.JSFLibraryConfigControl_TH_Deploy);
+		tcDeploy.setToolTipText(Messages.JSFLibraryConfigControl_DeployJAR);
 		final TableColumn tcLibName = new TableColumn(table, SWT.LEFT);
 		tcLibName.setWidth(150);
 		tcLibName.setText(Messages.JSFLibraryConfigControl_TH_LibraryName);
@@ -557,8 +656,35 @@
 				btnRemoveAll.setEnabled(ctvSelCompLib.getTable().getItemCount() > 0);
 			}			
 		});
+		
+	}
+	private void createControls() {
+		setRedraw(true);
+		final GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 1;
+		gridLayout.marginLeft = 0;
+		gridLayout.marginRight = 0;
+		gridLayout.marginWidth = 0;
+		gridLayout.marginTop = 0;
+		this.setLayout(gridLayout);
+		
+		createImplLibControls(this);
+		createSeparator(this);
+		createCompLibControls(this);
+		
+
+
+
 	}
 
+	private void createSeparator(Composite parent) {
+		final Label lblSeparator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL );
+		GridData gd_lbl_spacer = new GridData();
+		gd_lbl_spacer.horizontalAlignment = SWT.FILL;
+		lblSeparator.setLayoutData(gd_lbl_spacer);
+		lblSeparator.setAlignment(SWT.CENTER);
+	}
+	
 	/*
 	 * Event handling helper methods
 	 */	
@@ -643,6 +769,7 @@
 		model = synchHelper.getDataModel();
 		synchHelper.synchCombo(cvImplLib.getCombo(), IJSFFacetInstallDataModelProperties.IMPLEMENTATION_LIBRARIES, null);
 		synchHelper.synchCheckbox(btnDeployJars, IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION, null);
+		//not using synch helper for IMPLEMENTATION_TYPE
 //		synchHelper.synchCheckBoxTableViewer(ctvSelCompLib, IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES, new Control[]{hiddenList});
 	}
 
@@ -830,7 +957,7 @@
 				JSFLibrary lib = libWrapper.getLibrary();
 				labelBuf.append(lib.getLabel());
 				if (lib.isImplementation()) {
-					labelBuf.append(" ");
+					labelBuf.append(" "); //$NON-NLS-1$
 					if (lib == JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getDefaultImplementation()) {
 						labelBuf.append(DEFAULT_IMPL_DESC); 
 					} else {
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
index cd1b665..27f02cd 100644
--- 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
@@ -85,8 +85,12 @@
 JSFLibraryConfigControl_ImplementationLibrary=Implementation Library
 JSFLibraryPropertyPage_No_JSF_Facet_Installed=JSF Facet not installed.
 JSFLibraryConfigControl_NewImplementationLibrary=New...
+JSFLibraryConfigControl_ServerSuppliedButtonTooltip=Chosen server adapter must supply the JSF Implementation jars.
+JSFLibraryConfigControl_ServerSuppliedButtonLabel=Server Supplied JSF Implementation
+JSFLibraryConfigControl_NewImplButtonTooltip=Create new user supplied implementation library
 JSFLibraryConfigControl_DeployJAR=Deploy jars to WEB-INF/lib
 JSFLibraryConfigControl_ComponentLibrary=Component Libraries
+JSFLibraryConfigControl_DeployButtonLabel=Deploy
 JSFLibraryConfigControl_Add=\ \ >  
 JSFLibraryConfigControl_Remove=\ \ <  
 JSFLibraryConfigControl_AddAll=\ \ >>  
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
index e39ef2f..eabb6d3 100644
--- 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
@@ -82,6 +82,7 @@
 	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$
+	private static final String SETTINGS_IMPL_TYPE = "deployImplType";//$NON-NLS-1$
 	private static final String SETTINGS_COMPLIB = "selectedComponent"; //$NON-NLS-1$
 	private static final String SETTINGS_COMPLIB_SELECT_DEPLOY = "selectdeploycomplib"; //$NON-NLS-1$
 
@@ -117,16 +118,19 @@
 		initializeDialogUnits(parent);
 		composite = new Composite(parent, SWT.NONE);
 		final GridLayout jsfCompositeLayout = new GridLayout(3, false);
+		jsfCompositeLayout.marginTop = 0;
+		jsfCompositeLayout.marginBottom = 0;
+		jsfCompositeLayout.marginRight = 0;
 		jsfCompositeLayout.marginLeft = 0;
 		composite.setLayout(jsfCompositeLayout);
 
 		lblJSFImpl = new Label(composite, SWT.None);
-		lblJSFImpl.setLayoutData(new GridData(GridData.BEGINNING,
-				GridData.BEGINNING, false, false));
+		GridData gdLbl = new GridData();
+		gdLbl.verticalIndent = 5;
+		gdLbl.verticalAlignment = SWT.BEGINNING;
+		lblJSFImpl.setLayoutData(gdLbl);
 		lblJSFImpl.setText(Messages.JSFFacetInstallPage_JSFLibraryLabel0);
-
-		((GridLayout) composite.getLayout()).marginLeft = 0;
-
+		
 		jsfLibCfgComp = new JSFLibraryConfigControl(composite, SWT.NONE);
 		jsfLibCfgComp
 				.addOkClickedListener(new IJSFImplLibraryCreationListener() {
@@ -136,7 +140,7 @@
 						}
 					}
 				});
-
+		
 		jsfLibCfgComp.addChangeListener( new JSFLibraryConfigControlChangeListener(){
 
 			public void changed(JSFLibraryConfigControlChangeEvent e) {
@@ -144,10 +148,11 @@
 			}
 			
 		});
-		GridData gd_comp = new GridData(GridData.FILL, GridData.FILL, true,
-				true);
+		GridData gd_comp = new GridData();
 		gd_comp.horizontalSpan = 2;
-		((GridLayout) jsfLibCfgComp.getLayout()).marginLeft = 0;
+		gd_comp.grabExcessHorizontalSpace = true;
+		gd_comp.grabExcessVerticalSpace = true;
+		gd_comp.horizontalAlignment = SWT.FILL;
 		jsfLibCfgComp.setLayoutData(gd_comp);
 
 		lblJSFConfig = new Label(composite, SWT.NONE);
@@ -283,10 +288,15 @@
 	}
 
 	private void initJSFCfgCtrlValues(IDialogSettings root) {
+		IMPLEMENTATION_TYPE implType = IMPLEMENTATION_TYPE.UNKNOWN;
 		String deployImpl = null;
+		
 		if (root != null) {
+			implType = IMPLEMENTATION_TYPE.getValue(root.get(SETTINGS_IMPL_TYPE));
 			deployImpl = root.get(SETTINGS_DEPLOY_IMPL);
+			
 		}
+
 		if (deployImpl == null || deployImpl.equals("")) { //$NON-NLS-1$
 			deployImpl = ((Boolean) model
 					.getDefaultProperty(IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION))
@@ -303,7 +313,7 @@
 			selection = complibs.getArray(SETTINGS_COMPLIB_SELECT_DEPLOY);
 		}
 
-		JSFLibraryConfiglModelSource source = new JSFLibraryConfigDialogSettingData(
+		JSFLibraryConfiglModelSource source = new JSFLibraryConfigDialogSettingData(implType,
 				Boolean.valueOf(deployImpl).booleanValue(), selection);
 		jsfLibCfgComp.loadControlValuesFromModel(source);
 	}
@@ -313,6 +323,7 @@
 		DialogSettings root = new DialogSettings(SETTINGS_ROOT);
 		dialogSettings.addSection(root);
 
+		root.put(SETTINGS_IMPL_TYPE, getJSFImplType());
 		root.put(SETTINGS_DEPLOY_IMPL, String.valueOf(getDeployJSFImpl()));
 		root.put(SETTINGS_CONFIG, getJSFConfig());
 		root.put(SETTINGS_SERVLET, getJSFServletName());
@@ -326,6 +337,10 @@
 		complibs.put(SETTINGS_COMPLIB_SELECT_DEPLOY, getCompLibSelections());
 	}
 
+	private String getJSFImplType() {
+		return IMPLEMENTATION_TYPE.getStringValue((IMPLEMENTATION_TYPE)model.getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME));
+	}
+
 	private boolean getDeployJSFImpl() {
 		if (jsfLibCfgComp.getSelectedJSFLibImplementation() == null) {
 			return false;
@@ -482,7 +497,7 @@
 	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#getValidationPropertyNames()
 	 */
 	protected String[] getValidationPropertyNames() {
-		return new String[] { IMPLEMENTATION, DEPLOY_IMPLEMENTATION,
+		return new String[] { IMPLEMENTATION_TYPE_PROPERTY_NAME, IMPLEMENTATION, DEPLOY_IMPLEMENTATION,
 				CONFIG_PATH, SERVLET_NAME, SERVLET_CLASSNAME, COMPONENT_LIBRARIES };
 	}
 
@@ -557,9 +572,13 @@
 	 */
 	private void checkToCompletePage(Composite control) {
 		boolean enableFinish = false;
-		if (control != null && control instanceof JSFLibraryConfigControl) {
+		IMPLEMENTATION_TYPE implType = (IMPLEMENTATION_TYPE)model.getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME);
+		if (implType == IMPLEMENTATION_TYPE.SERVER_SUPPLIED)
+			enableFinish = true;
+		else if (implType == IMPLEMENTATION_TYPE.CLIENT_SUPPLIED && 
+				control != null && control instanceof JSFLibraryConfigControl) {
 			enableFinish = (((JSFLibraryConfigControl)control).getSelectedJSFLibImplementation() != null);
-		} 
+		} //else must be unknown type and requires user interaction
 		setPageComplete(enableFinish);
 	}