Bug 361479 - [JSF2.0] There is no JSF 2.1 facet, preset, or downloadable library.
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties
index 4ecb50c..3bb2d58 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/plugin.properties
@@ -23,6 +23,9 @@
 
 JSFv20Project=JavaServer Faces v2.0 Project
 JSFv20PresetDesc=Configures a Dynamic Web application to use JSF v2.0
+
+JSFv21Project=JavaServer Faces v2.1 Project
+JSFv21PresetDesc=Configures a Dynamic Web application to use JSF v2.1
 # ====================================================================
 
 pluginName = Constraints Model
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml
index 329e3c4..9381d5d 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml
@@ -64,7 +64,15 @@
           <requires facet="jst.web" version="[2.5"/>
         </and>
       </constraint>
-    </project-facet-version> 
+    </project-facet-version>
+
+    <project-facet-version facet="jst.jsf" version="2.1">
+       <constraint>
+        <and>
+          <requires facet="jst.web" version="[2.5"/>
+        </and>
+      </constraint>
+    </project-facet-version>
 
     <action id="jst.jsf.v11.install" facet="jst.jsf" type="INSTALL" version="1.1">
       	<delegate class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDelegate"/>
@@ -94,7 +102,17 @@
     <action id="jst.jsf.v20.uninstall" facet="jst.jsf" version="2.0" type="UNINSTALL">
         <config-factory class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetUninstallConfig$Factory"/>
 	 	<delegate class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetUninstallDelegate"/>
- 	</action>  
+ 	</action>
+
+ 	<action id="jst.jsf.v21.install" facet="jst.jsf" type="INSTALL" version="2.1">
+      	<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 id="jst.jsf.v21.uninstall" facet="jst.jsf" version="2.1" type="UNINSTALL">
+        <config-factory class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetUninstallConfig$Factory"/>
+	 	<delegate class="org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetUninstallDelegate"/>
+ 	</action>
 	      	
   </extension> 
   
@@ -147,12 +165,33 @@
            %JSFv20PresetDesc
         </description>
      </static-preset>
+     <static-preset
+           id="preset.jst.jsf.v2_1" extends="default.configuration">
+        <label>
+           %JSFv21Project
+        </label>
+        <facet
+              id="jst.java"
+              version="1.6">
+        </facet>
+        <facet
+              id="jst.web"
+              version="3.0">
+        </facet>
+        <facet
+              id="jst.jsf"
+              version="2.1">
+        </facet>
+        <description>
+           %JSFv21PresetDesc
+        </description>
+     </static-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,2.0"/> 
+        	<facet id="jst.jsf" version="1.1,1.2,2.0,2.1"/> 
     </supported>
   </extension>
     
@@ -457,6 +496,17 @@
     <detector class="org.eclipse.jst.jsf.core.internal.project.facet.LegacyJSFLibraryProviderDetector"/>
   </extension>
 
+    <!-- JSF 2.1 Downloadable library provider -->
+    <extension point="org.eclipse.jst.common.project.facet.core.downloadableLibraries">
+        <import-definitions url="http://www.eclipse.org/webtools/jsf/jsf-library/jsf-2.1-downloadable-libraries.xml">
+            <enablement>
+                <with variable="requestingProjectFacet">
+                    <test property="org.eclipse.wst.common.project.facet.core.projectFacet" value="jst.jsf:2.1" forcePluginActivation="true"/>
+                </with>
+            </enablement>
+        </import-definitions>
+    </extension>
+
     <!-- JSF 2.0 Downloadable library provider -->
     <extension point="org.eclipse.jst.common.project.facet.core.downloadableLibraries">
         <import-definitions url="http://www.eclipse.org/webtools/jsf/jsf-library/jsf-2.0-downloadable-libraries.xml">
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/IJSFCoreConstants.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/IJSFCoreConstants.java
index 0e8ff1a..390ce6c 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/IJSFCoreConstants.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/IJSFCoreConstants.java
@@ -65,6 +65,15 @@
     public static final String JSF_VERSION_2_0 = FACET_VERSION_2_0;
     
     /**
+     * The facet version for a JSF 2.1 project
+     */
+    public static final String                  FACET_VERSION_2_1 = "2.1"; //$NON-NLS-1$
+    /**
+     * The version string for a JSF 2.1 project
+     */
+    public static final String JSF_VERSION_2_1 = FACET_VERSION_2_1;
+    
+    /**
      * @param facet
      * @return true if the facet is a jsf facet.
      * 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/JSFVersion.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/JSFVersion.java
index a76ab54..cb897ba 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/JSFVersion.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/JSFVersion.java
@@ -42,7 +42,11 @@
 	/**
 	 * Supports JSF Version 2.0
 	 */
-	V2_0;
+	V2_0,
+	/**
+	 * Supports JSF Version 2.1
+	 */
+	V2_1;
 	
 	// WARNING: you MUST add newer versions to the end; the ordinal value of
 	// of the version is used in compareTo.
@@ -58,6 +62,8 @@
                 return IJSFCoreConstants.JSF_VERSION_1_2;
             case V2_0:
                 return IJSFCoreConstants.JSF_VERSION_2_0;
+            case V2_1:
+            	return IJSFCoreConstants.JSF_VERSION_2_1;
             case UNKNOWN:
                 return "unknown"; //$NON-NLS-1$
             default:
@@ -83,10 +89,14 @@
         {
             return V1_2;
         }
-        else if (IJSFCoreConstants.FACET_VERSION_2_0.equals(valueAsString))
+        else if (IJSFCoreConstants.JSF_VERSION_2_0.equals(valueAsString))
         {
             return V2_0;
         }
+        else if (IJSFCoreConstants.JSF_VERSION_2_1.equals(valueAsString))
+        {
+        	return V2_1;
+        }
         else if ("unknown".equals(valueAsString)) //$NON-NLS-1$
         {
             return UNKNOWN;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtilFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtilFactory.java
index 7e9bcd2..ccd406d 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtilFactory.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtilFactory.java
@@ -61,6 +61,8 @@
             return new JSFUtils12(modelProvider);
         case V2_0:
             return new JSFUtils20(modelProvider);
+        case V2_1:
+        	return new JSFUtils21(modelProvider);
         default:
             throw new IllegalArgumentException("Unknown version: "+version); //$NON-NLS-1$
         }
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils20.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils20.java
index 28583ae..498ac01 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils20.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils20.java
@@ -21,6 +21,20 @@
         super(JSFVersion.V2_0, modelProvider);
     }
 
+    /**
+     * @param jsfVersion
+     * @param modelProvider 
+     */
+    protected JSFUtils20(final JSFVersion jsfVersion, final IModelProvider modelProvider)
+    {
+        super(jsfVersion, modelProvider);
+        if (jsfVersion.compareTo(JSFVersion.V2_0) < 0)
+        {
+            throw new IllegalArgumentException(
+                    "JSFVersion must be at least 2.0"); //$NON-NLS-1$
+        }
+    }
+
     @Override
     protected String getDefaultDefaultSuffix()
     {
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils21.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils21.java
new file mode 100644
index 0000000..618545c
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils21.java
@@ -0,0 +1,36 @@
+package org.eclipse.jst.jsf.core.internal.project.facet;
+
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.jsf.core.JSFVersion;
+
+/**
+ * JSF Utils instance for JSF 2.1.
+ * 
+ * @author ian.trimble@oracle.com
+ */
+/* package: use JSFUtilFactory */class JSFUtils21 extends JSFUtils20
+{
+
+    /**
+     * @param modelProvider
+     */
+    protected JSFUtils21(final IModelProvider modelProvider)
+    {
+        super(JSFVersion.V2_1, modelProvider);
+    }
+
+    /**
+     * @param jsfVersion
+     * @param modelProvider 
+     */
+    protected JSFUtils21(final JSFVersion jsfVersion, final IModelProvider modelProvider)
+    {
+        super(jsfVersion, modelProvider);
+        if (jsfVersion.compareTo(JSFVersion.V2_1) < 0)
+        {
+            throw new IllegalArgumentException(
+                    "JSFVersion must be at least 2.1"); //$NON-NLS-1$
+        }
+    }
+
+}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml
index 054e21a..de23051 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml
+++ b/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml
@@ -62,6 +62,12 @@
               class="org.eclipse.jst.jsf.ui.internal.project.facet.JSFFacetInstallPage">
         </page>
      </wizard-pages>
+     <wizard-pages
+           action="jst.jsf.v21.install">
+        <page
+              class="org.eclipse.jst.jsf.ui.internal.project.facet.JSFFacetInstallPage">
+        </page>
+     </wizard-pages>
   </extension>  
   
   <extension point="org.eclipse.wst.sse.ui.editorConfiguration">