You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ma...@apache.org on 2023/07/16 13:13:44 UTC

[netbeans] branch master updated: Feature: Added support for JSF 4.0 namespaces

This is an automated email from the ASF dual-hosted git repository.

matthiasblaesing pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 14fee1762c Feature: Added support for JSF 4.0 namespaces
     new e609c44856 Merge pull request #6160 from asbachb/add-support-for-faces4-urn-v3
14fee1762c is described below

commit 14fee1762cf78ebfe19438d3751cc3cd092c61e6
Author: Benjamin Asbach <as...@impl.it>
AuthorDate: Sun Jul 16 13:48:20 2023 +0800

    Feature: Added support for JSF 4.0 namespaces
    
    Previously NetBeans bundles the JSF reference implementation Mojarra in order to provide several functionality
    (like namespaces) based on the parsed taglib xml files from that jar. This is somehow problematic as:
    1) The dependency needs to be updated on every new JSF release
    2) NetBeans needs to fulfil the expectations of Mojarra
    
    This leads to the problem that we currently cannot update and bundle the latest Mojarra version as
    Java 11 is required.
    
    This change wants to get less dependant on that bundled JSF implementation by resolving the reference implementation
    using maven. Instead of reading the taglib xml files from that bundled jar NetBeans now gets in from the local maven
    repository or downloads it from maven central. If this is not possible we fallback to the bundled version.
    
    This change also improves the situation when autosuggestion is invoked in the namespace part of JSF xhtml documents
    by ordering the suggested namespace with the one on top which is most likely to be used.
    
    This should fix #6069 #5470 #5470 #4338
---
 .github/workflows/main.yml                         |    9 +
 .gitignore                                         |    1 +
 enterprise/maven.j2ee/nbproject/project.xml        |    4 +-
 .../MavenJsfReferenceImplementationProvider.java   |   93 ++
 .../modules/maven/j2ee/web/WebModuleImpl.java      |   34 +-
 ...venJsfReferenceImplementationProviderTest.java} |   31 +-
 .../modules/maven/j2ee/web/WebModuleImplTest.java  |    2 -
 enterprise/web.bootsfaces/nbproject/project.xml    |    4 +-
 .../netbeans/modules/web/wizards/PageIterator.java |    9 +-
 enterprise/web.freeform/nbproject/project.xml      |    4 +-
 enterprise/web.jsf.editor/manifest.mf              |    2 +-
 enterprise/web.jsf.editor/nbproject/project.xml    |    8 +-
 .../web/jsf/editor/InjectCompositeComponent.java   |    7 +-
 .../modules/web/jsf/editor/JsfHtmlExtension.java   |    9 +-
 .../web/jsf/editor/JsfNavigationHelper.java        |    2 +-
 .../modules/web/jsf/editor/JsfSupportImpl.java     |   43 +-
 .../netbeans/modules/web/jsf/editor/JsfUtils.java  |   12 +-
 .../jsf/editor/actions/FixNamespacesPerformer.java |    2 +-
 .../modules/web/jsf/editor/actions/ImportData.java |    1 -
 .../web/jsf/editor/actions/NamespaceProcessor.java |   68 +-
 .../completion/JsfAttributesCompletionHelper.java  |   65 +-
 .../jsf/editor/completion/JsfCompletionItem.java   |    7 +-
 .../web/jsf/editor/el/JsfELVariableResolver.java   |   18 +-
 .../web/jsf/editor/el/JsfVariablesModel.java       |    3 +-
 .../jsf/editor/el/WebBeansELVariableResolver.java  |    3 +-
 .../editor/facelets/AbstractFaceletsLibrary.java   |    1 -
 .../editor/facelets/CompositeComponentLibrary.java |    6 +-
 .../editor/facelets/DefaultFaceletLibraries.java   |   45 +-
 .../web/jsf/editor/facelets/FaceletsLibrary.java   |   23 +-
 .../editor/facelets/FaceletsLibrarySupport.java    |  148 ++-
 .../editor/facelets/JsfNamespaceComparator.java    |   59 +
 .../facelets/PureCompositeComponentLibrary.java    |   10 +-
 .../jsf/editor/facelets/mojarra/ConfigManager.java |  348 ++++--
 .../mojarra/FaceletsTaglibConfigProcessor.java     |   40 +-
 .../web/jsf/editor/hints/FixLibDeclaration.java    |   13 +-
 .../editor/hints/LibraryDeclarationChecker.java    |   96 +-
 .../jsf/editor/index/CompositeComponentModel.java  |   49 +-
 .../modules/web/jsf/editor/index/JsfIndex.java     |    3 +-
 .../jsf/editor/index/ResourcesMappingModel.java    |    8 +-
 .../facelets/FaceletsLibrarySupportTest.java       |    8 +-
 enterprise/web.jsf.icefaces/nbproject/project.xml  |    8 +-
 .../web/jsf/icefaces/Icefaces2Implementation.java  |    6 +-
 enterprise/web.jsf.kit/nbproject/project.xml       |    4 +-
 .../web.jsf.navigation/nbproject/project.xml       |    4 +-
 enterprise/web.jsf.richfaces/nbproject/project.xml |    8 +-
 .../jsf/richfaces/Richfaces4Implementation.java    |    6 +-
 enterprise/web.jsf/manifest.mf                     |    2 +-
 .../nbproject/org-netbeans-modules-web-jsf.sig     |   43 +-
 enterprise/web.jsf/nbproject/project.properties    |    9 +-
 enterprise/web.jsf/nbproject/project.xml           |    4 +-
 .../org/netbeans/modules/web/jsf/JSFCatalog.java   |   25 +-
 .../modules/web/jsf/JSFFrameworkProvider.java      |   43 +-
 .../src/org/netbeans/modules/web/jsf/JSFUtils.java |   17 +-
 .../jsf/api/editor/JsfFacesComponentsProvider.java |    5 +-
 .../web/jsf/api/facesmodel/JSFConfigModel.java     |    3 +-
 .../{JSFVersion.java => JsfVersionUtils.java}      |   99 +-
 .../resources/templates/simpleFacelets.template    |    7 +-
 .../modules/web/jsf/hints/JsfHintsContext.java     |   10 +-
 .../rules/JavaxFacesBeanIsGonnaBeDeprecated.java   |    4 +-
 .../jsf/impl/facesmodel/JSFConfigModelImpl.java    |   21 +-
 .../web/jsf/impl/facesmodel/JSFConfigQNames.java   | 1259 ++++++++++----------
 .../web/jsf/palette/items/FromEntityBase.java      |    2 +-
 .../web/jsf/palette/items/JsfLibrariesSupport.java |   39 +-
 .../jsf/palette/items/ManagedBeanCustomizer.java   |    9 +-
 .../web/jsf/palette/items/PrefixResolver.java      |    2 +-
 .../spi/components/JsfComponentImplementation.java |    9 +-
 .../wizards/CompositeComponentWizardIterator.java  |    9 +-
 .../web/jsf/wizards/FacesComponentPanel.java       |    7 +-
 .../web/jsf/wizards/FacesConfigIterator.java       |   27 +-
 .../jsf/wizards/JSFConfigurationPanelVisual.java   |   41 +-
 .../web/jsf/wizards/ManagedBeanPanelVisual.java    |    9 +-
 .../web/jsf/wizards/PersistenceClientIterator.java |    8 +-
 .../web/jsf/wizards/ResourceLibraryIterator.java   |    6 +-
 .../web/jsf/wizards/TemplateClientIterator.java    |    8 +-
 .../web/jsf/wizards/TemplateClientPanelVisual.java |   36 +-
 .../modules/web/jsf/wizards/TemplateIterator.java  |   29 +-
 .../web/jsf/xdm/model/JSFConfigModelTest.java      |    7 +-
 enterprise/web.jsf20/nbproject/project.xml         |    4 +-
 enterprise/web.jsfapi/manifest.mf                  |    5 +-
 .../nbproject/org-netbeans-modules-web-jsfapi.sig  |   67 +-
 .../modules/web/jsfapi/api/DefaultLibraryInfo.java |  139 ++-
 .../modules/web/jsfapi/api/JsfNamespaces.java      |   69 ++
 .../modules/web/jsfapi/api/JsfSupport.java         |    4 +-
 .../api/{LibraryInfo.java => JsfVersion.java}      |   36 +-
 .../modules/web/jsfapi/api/LibraryInfo.java        |   11 +-
 .../modules/web/jsfapi/api/NamespaceUtils.java     |   68 +-
 .../JsfReferenceImplementationProvider.java}       |   25 +-
 .../modules/web/jsfapi/spi/LibraryUtils.java       |   50 +-
 .../web/jsfapi/api/DefaultLibraryInfoTest.java     |   69 ++
 .../modules/web/jsfapi/api/JsfVersionTest.java     |  184 +++
 enterprise/web.primefaces/nbproject/project.xml    |    8 +-
 .../web/primefaces/PrimefacesImplementation.java   |    6 +-
 .../editor/api/completion/HtmlCompletionItem.java  |   20 +-
 93 files changed, 2331 insertions(+), 1567 deletions(-)

diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 3fdd0ed0f9..94b5a331ef 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -1988,6 +1988,9 @@ jobs:
       - name: enterprise/javaee.wildfly
         run: .github/retry.sh ant $OPTS -f enterprise/javaee.wildfly test
 
+      - name: enterprise/maven.j2ee
+        run: ant $OPTS -f enterprise/maven.j2ee test
+
       - name: enterprise/micronaut
         run: .github/retry.sh ant $OPTS -f enterprise/micronaut test
 
@@ -1997,6 +2000,12 @@ jobs:
       - name: tomcat5
         run: ant $OPTS -f enterprise/tomcat5 test
 
+      - name: enterprise/web.jsf
+        run: .github/retry.sh ant $OPTS -f enterprise/web.jsf test
+
+      - name: enterprise/web.jsfapi
+        run: ant $OPTS -f enterprise/web.jsfapi test
+
       - name: websvc.editor.hints
         run: ant $OPTS -f enterprise/websvc.editor.hints test
 
diff --git a/.gitignore b/.gitignore
index 947a17a673..5d00df860b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -94,6 +94,7 @@ derby.log
 ##################################
 /extide/gradle/netbeans-gradle-tooling/.gradle/
 /extide/gradle/netbeans-gradle-tooling/gradle/wrapper/gradle-wrapper.jar
+/extide/gradle/netbeans-gradle-tooling/bin/
 /extide/gradle/release/modules/gradle/daemon-loader/.gradle/
 /nbbuild/misc/prepare-bundles/target/
 
diff --git a/enterprise/maven.j2ee/nbproject/project.xml b/enterprise/maven.j2ee/nbproject/project.xml
index 9fde5ea0bf..abc3f913c3 100644
--- a/enterprise/maven.j2ee/nbproject/project.xml
+++ b/enterprise/maven.j2ee/nbproject/project.xml
@@ -376,8 +376,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>0-1</release-version>
-                        <specification-version>1.13</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/MavenJsfReferenceImplementationProvider.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/MavenJsfReferenceImplementationProvider.java
new file mode 100644
index 0000000000..78ab7755f8
--- /dev/null
+++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/MavenJsfReferenceImplementationProvider.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.maven.j2ee;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.Map;
+import java.util.Optional;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import static org.apache.maven.repository.RepositorySystem.DEFAULT_REMOTE_REPO_ID;
+import static org.apache.maven.repository.RepositorySystem.DEFAULT_REMOTE_REPO_URL;
+import org.netbeans.modules.maven.embedder.EmbedderFactory;
+import org.netbeans.modules.maven.embedder.MavenEmbedder;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
+import org.netbeans.modules.web.jsfapi.spi.JsfReferenceImplementationProvider;
+import org.openide.util.Exceptions;
+import org.openide.util.lookup.ServiceProvider;
+
+/**
+ *
+ * @author Benjamin Asbach
+ */
+@ServiceProvider(service = JsfReferenceImplementationProvider.class)
+public class MavenJsfReferenceImplementationProvider implements JsfReferenceImplementationProvider {
+
+    static final Map<JsfVersion, String> JSF_VERSION_MAVEN_COORDINATES_MAPPING;
+    static {
+        EnumMap<JsfVersion, String> map = new EnumMap<>(JsfVersion.class);
+        map.put(JsfVersion.JSF_1_0, "javax.faces:jsf-impl:1.1_02"); //seems to be not available in maven central
+        map.put(JsfVersion.JSF_1_1, "javax.faces:jsf-impl:1.1_02");
+        map.put(JsfVersion.JSF_1_2, "javax.faces:jsf-impl:1.2");
+        map.put(JsfVersion.JSF_2_0, "com.sun.faces:jsf-impl:2.0.11");
+        map.put(JsfVersion.JSF_2_1, "com.sun.faces:jsf-impl:2.1.29");
+        map.put(JsfVersion.JSF_2_2, "com.sun.faces:jsf-impl:2.2.20");
+        map.put(JsfVersion.JSF_2_3, "org.glassfish:jakarta.faces:2.3.19");
+        map.put(JsfVersion.JSF_3_0, "org.glassfish:jakarta.faces:3.0.4");
+        map.put(JsfVersion.JSF_4_0, "org.glassfish:jakarta.faces:4.0.2");
+        JSF_VERSION_MAVEN_COORDINATES_MAPPING = Collections.unmodifiableMap(map);
+    }
+
+    @Override
+    public Path artifactPathFor(JsfVersion jsfVersion) {
+        String[] mavenCoordinates = JSF_VERSION_MAVEN_COORDINATES_MAPPING.get(jsfVersion).split(":");
+        if (mavenCoordinates.length != 3) {
+            return null;
+        }
+        String groupId = mavenCoordinates[0];
+        String artifactId = mavenCoordinates[1];
+        String version = mavenCoordinates[2];
+
+        MavenEmbedder mavenEmbedder = EmbedderFactory.getOnlineEmbedder();
+
+        ArtifactRepository localRepository = mavenEmbedder.getLocalRepository();
+        ArtifactRepository remoteRepository = mavenEmbedder.createRemoteRepository(DEFAULT_REMOTE_REPO_URL, DEFAULT_REMOTE_REPO_ID);
+        Artifact jsfRIArtifact = mavenEmbedder.createArtifact(groupId, artifactId, version, "jar");
+
+        try {
+            mavenEmbedder.resolve(jsfRIArtifact, Collections.singletonList(remoteRepository), localRepository);
+        } catch (ArtifactResolutionException | ArtifactNotFoundException ex) {
+            Exceptions.printStackTrace(ex);
+
+            return null;
+        }
+
+        return Optional.ofNullable(jsfRIArtifact)
+                .map(Artifact::getFile)
+                .map(File::toPath)
+                .filter(Files::exists)
+                .orElse(null);
+    }
+}
diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleImpl.java
index e3f9619b34..d9afd9f396 100644
--- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleImpl.java
+++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleImpl.java
@@ -24,8 +24,10 @@ import java.io.IOException;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.TreeMap;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.project.MavenProject;
 import org.netbeans.api.j2ee.core.Profile;
@@ -221,7 +223,7 @@ public class WebModuleImpl extends BaseEEModuleImpl implements WebModuleImplemen
      * </ul>
      * </p>
      */
-    private static Map<Profile, List<DependencyDesc>> javaEEMap = new HashMap<>();
+    private static Map<Profile, List<DependencyDesc>> javaEEMap = new LinkedHashMap<>();
     static {
         List<DependencyDesc> javaEE5 = new ArrayList<>();
         List<DependencyDesc> javaEE6Web = new ArrayList<>();
@@ -262,6 +264,8 @@ public class WebModuleImpl extends BaseEEModuleImpl implements WebModuleImplemen
         javaEE5.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "2"));
         javaEE6Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "3"));
         javaEE6Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "3"));
+        javaEE7Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "4.0"));
+        javaEE7Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "4.0.1"));
         javaEE7Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "4.1.2"));
         javaEE7Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "4.1.2"));
         javaEE8Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "5.1.0"));
@@ -296,21 +300,21 @@ public class WebModuleImpl extends BaseEEModuleImpl implements WebModuleImplemen
         jakartaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-all-8.0", null));
         jakartaEE8Web.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-web-8.0", null));
 
-        javaEEMap.put(Profile.JAVA_EE_5, javaEE5);
-        javaEEMap.put(Profile.JAVA_EE_6_WEB, javaEE6Web);
-        javaEEMap.put(Profile.JAVA_EE_6_FULL, javaEE6Full);
-        javaEEMap.put(Profile.JAVA_EE_7_WEB, javaEE7Web);
-        javaEEMap.put(Profile.JAVA_EE_7_FULL, javaEE7Full);
-        javaEEMap.put(Profile.JAVA_EE_8_WEB, javaEE8Web);
-        javaEEMap.put(Profile.JAVA_EE_8_FULL, javaEE8Full);
-        javaEEMap.put(Profile.JAKARTA_EE_8_WEB, jakartaEE8Web);
-        javaEEMap.put(Profile.JAKARTA_EE_8_FULL, jakartaEE8Full);
-        javaEEMap.put(Profile.JAKARTA_EE_9_WEB, jakartaEE9Web);
-        javaEEMap.put(Profile.JAKARTA_EE_9_FULL, jakartaEE9Full);
-        javaEEMap.put(Profile.JAKARTA_EE_9_1_WEB, jakartaEE91Web);
-        javaEEMap.put(Profile.JAKARTA_EE_9_1_FULL, jakartaEE91Full);
-        javaEEMap.put(Profile.JAKARTA_EE_10_WEB, jakartaEE10Web);
         javaEEMap.put(Profile.JAKARTA_EE_10_FULL, jakartaEE10Full);
+        javaEEMap.put(Profile.JAKARTA_EE_10_WEB, jakartaEE10Web);
+        javaEEMap.put(Profile.JAKARTA_EE_9_1_FULL, jakartaEE91Full);
+        javaEEMap.put(Profile.JAKARTA_EE_9_1_WEB, jakartaEE91Web);
+        javaEEMap.put(Profile.JAKARTA_EE_9_FULL, jakartaEE9Full);
+        javaEEMap.put(Profile.JAKARTA_EE_9_WEB, jakartaEE9Web);
+        javaEEMap.put(Profile.JAKARTA_EE_8_FULL, jakartaEE8Full);
+        javaEEMap.put(Profile.JAKARTA_EE_8_WEB, jakartaEE8Web);
+        javaEEMap.put(Profile.JAVA_EE_8_FULL, javaEE8Full);
+        javaEEMap.put(Profile.JAVA_EE_8_WEB, javaEE8Web);
+        javaEEMap.put(Profile.JAVA_EE_7_FULL, javaEE7Full);
+        javaEEMap.put(Profile.JAVA_EE_7_WEB, javaEE7Web);
+        javaEEMap.put(Profile.JAVA_EE_6_FULL, javaEE6Full);
+        javaEEMap.put(Profile.JAVA_EE_6_WEB, javaEE6Web);
+        javaEEMap.put(Profile.JAVA_EE_5, javaEE5);
     }
 
     private static class DependencyDesc {
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/PrefixResolver.java b/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/MavenJsfReferenceImplementationProviderTest.java
similarity index 50%
copy from enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/PrefixResolver.java
copy to enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/MavenJsfReferenceImplementationProviderTest.java
index 6932325ad3..ca309d0b2f 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/PrefixResolver.java
+++ b/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/MavenJsfReferenceImplementationProviderTest.java
@@ -16,29 +16,30 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.netbeans.modules.web.jsf.palette.items;
+package org.netbeans.modules.maven.j2ee;
 
-import org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo;
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertTrue;
+import org.junit.Test;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 
 /**
  *
- * @author Martin Fousek <ma...@netbeans.org>
+ * @author Benjamin Asbach
  */
-public class PrefixResolver {
+public class MavenJsfReferenceImplementationProviderTest {
 
-    private final JsfLibrariesSupport jls;
-
-    public PrefixResolver(JsfLibrariesSupport jls) {
-        this.jls = jls;
+    @Test
+    public void testAllJsfVersionsAreMapped() {
+        for (JsfVersion jsfVersion : JsfVersion.values()) {
+            assertTrue(MavenJsfReferenceImplementationProvider.JSF_VERSION_MAVEN_COORDINATES_MAPPING.containsKey(jsfVersion));
+        }
     }
 
-    public String getPrefixForNS(String namespace, String fallbackPrefix) {
-        for (DefaultLibraryInfo dli : DefaultLibraryInfo.values()) {
-            if (dli.getNamespace().equals(namespace) || (dli.getLegacyNamespace() != null && dli.getLegacyNamespace().equals(namespace))) {
-                return jls.getLibraryPrefix(dli);
-            }
+    @Test
+    public void testAllMavenCoordinatesAreWellFormatted() {
+        for (String mavenCoordinates : MavenJsfReferenceImplementationProvider.JSF_VERSION_MAVEN_COORDINATES_MAPPING.values()) {
+            assertEquals(3, mavenCoordinates.split(":").length);
         }
-        return fallbackPrefix;
     }
-
 }
diff --git a/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/web/WebModuleImplTest.java b/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/web/WebModuleImplTest.java
index 138f2ac43d..44c3f6a5d6 100644
--- a/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/web/WebModuleImplTest.java
+++ b/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/web/WebModuleImplTest.java
@@ -20,11 +20,9 @@ package org.netbeans.modules.maven.j2ee.web;
 
 import java.io.IOException;
 import org.netbeans.api.j2ee.core.Profile;
-import org.netbeans.modules.javaee.project.api.JavaEEProjectSettings;
 import org.netbeans.modules.maven.j2ee.JavaEEMavenTestBase;
 import org.netbeans.modules.maven.j2ee.PomBuilder;
 import org.netbeans.modules.maven.j2ee.PomBuilder.PomPlugin;
-import org.netbeans.modules.maven.j2ee.utils.MavenProjectSupport;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
 
diff --git a/enterprise/web.bootsfaces/nbproject/project.xml b/enterprise/web.bootsfaces/nbproject/project.xml
index ea09ca779a..078bea05b4 100644
--- a/enterprise/web.bootsfaces/nbproject/project.xml
+++ b/enterprise/web.bootsfaces/nbproject/project.xml
@@ -83,8 +83,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.14</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/enterprise/web.core/src/org/netbeans/modules/web/wizards/PageIterator.java b/enterprise/web.core/src/org/netbeans/modules/web/wizards/PageIterator.java
index d79dccc8f5..6136e3f848 100644
--- a/enterprise/web.core/src/org/netbeans/modules/web/wizards/PageIterator.java
+++ b/enterprise/web.core/src/org/netbeans/modules/web/wizards/PageIterator.java
@@ -198,6 +198,11 @@ public class PageIterator implements TemplateWizard.Iterator {
         return classpath != null && classpath.findResource("jakarta/faces/flow/Flow.class") != null; //NOI18N
     }
 
+    private static boolean isJSF40(WebModule wm) {
+        ClassPath classpath = ClassPath.getClassPath(wm.getDocumentBase(), ClassPath.COMPILE);
+        return classpath != null && classpath.findResource("jakarta/faces/lifecycle/ClientWindowScoped.class") != null; //NOI18N
+    }
+
     public Set<DataObject> instantiate(TemplateWizard wiz) throws IOException {
         // Here is the default plain behavior. Simply takes the selected
         // template (you need to have included the standard second panel
@@ -231,7 +236,9 @@ public class PageIterator implements TemplateWizard.Iterator {
                     template = templateParent.getFileObject("JSP", "xhtml"); //NOI18N
                     WebModule wm = WebModule.getWebModule(df.getPrimaryFile());
                     if (wm != null) {
-                        if (isJSF30(wm)) {
+                        if (isJSF40(wm)) {
+                            wizardProps.put("isJSF40", Boolean.TRUE);
+                        } else if (isJSF30(wm)) {
                             wizardProps.put("isJSF30", Boolean.TRUE);
                         } else if (isJSF22(wm)) {
                             wizardProps.put("isJSF22", Boolean.TRUE);
diff --git a/enterprise/web.freeform/nbproject/project.xml b/enterprise/web.freeform/nbproject/project.xml
index 0ab6e42660..e6f9498675 100644
--- a/enterprise/web.freeform/nbproject/project.xml
+++ b/enterprise/web.freeform/nbproject/project.xml
@@ -177,8 +177,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>0-1</release-version>
-                        <specification-version>1.0</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/enterprise/web.jsf.editor/manifest.mf b/enterprise/web.jsf.editor/manifest.mf
index c484f2268e..5e0c1c4d89 100644
--- a/enterprise/web.jsf.editor/manifest.mf
+++ b/enterprise/web.jsf.editor/manifest.mf
@@ -2,5 +2,5 @@ Manifest-Version: 1.0
 OpenIDE-Module: org.netbeans.modules.web.jsf.editor
 OpenIDE-Module-Layer: org/netbeans/modules/web/jsf/editor/resources/layer.xml
 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/web/jsf/editor/resources/Bundle.properties
-OpenIDE-Module-Specification-Version: 1.72
+OpenIDE-Module-Specification-Version: 2.0
 AutoUpdate-Show-In-Client: false
diff --git a/enterprise/web.jsf.editor/nbproject/project.xml b/enterprise/web.jsf.editor/nbproject/project.xml
index e3832f3a33..792af88df0 100644
--- a/enterprise/web.jsf.editor/nbproject/project.xml
+++ b/enterprise/web.jsf.editor/nbproject/project.xml
@@ -386,8 +386,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.51</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
@@ -404,8 +404,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.34</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/InjectCompositeComponent.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/InjectCompositeComponent.java
index ddd6f29f73..92c7869186 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/InjectCompositeComponent.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/InjectCompositeComponent.java
@@ -52,6 +52,7 @@ import org.netbeans.modules.parsing.api.indexing.IndexingManager;
 import org.netbeans.modules.parsing.spi.ParseException;
 import org.netbeans.modules.web.api.webmodule.WebModule;
 import org.netbeans.modules.web.common.api.WebUtils;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.jsfapi.api.Library;
 import org.netbeans.modules.web.jsfapi.spi.LibraryUtils;
 import org.netbeans.spi.editor.codegen.CodeGenerator;
@@ -208,14 +209,14 @@ public class InjectCompositeComponent {
             //but since the library has just been created by adding an xhtml file
             //to the resources/xxx/ folder we need to wait until the files
             //get indexed and the library is created
-            final String compositeLibURL = LibraryUtils.getCompositeLibraryURL(compFolder, jsfs.isJsf22Plus());
+            final String compositeLibURL = LibraryUtils.getCompositeLibraryURL(compFolder, jsfs.getJsfVersion());
             Source documentSource = Source.create(document);
             ParserManager.parseWhenScanFinished(Collections.singletonList(documentSource), new UserTask() { //NOI18N
                 @Override
                 public void run(ResultIterator resultIterator) throws Exception {
                     Library lib = jsfs.getLibrary(compositeLibURL);
                     if (lib != null) {
-                        if (!LibraryUtils.importLibrary(document, lib, prefix, jsfs.isJsf22Plus())) { //XXX: fix the damned static prefix !!!
+                        if (!LibraryUtils.importLibrary(document, lib, prefix)) { //XXX: fix the damned static prefix !!!
                             logger.log(Level.WARNING, "Cannot import composite components library {0}", compositeLibURL); //NOI18N
                         }
                     } else {
@@ -248,7 +249,7 @@ public class InjectCompositeComponent {
                             ((BaseDocument) templateInstanceDoc).runAtomic(new Runnable() {
                                 @Override
                                 public void run() {
-                                    LibraryUtils.importLibrary(templateInstanceDoc, importsMap, jsfs.isJsf22Plus());
+                                    LibraryUtils.importLibrary(templateInstanceDoc, importsMap);
                                 }
                             });
                             try {
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfHtmlExtension.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfHtmlExtension.java
index 88dd089056..3fdf2b6ba9 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfHtmlExtension.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfHtmlExtension.java
@@ -45,6 +45,7 @@ import org.netbeans.modules.web.jsf.editor.facelets.AbstractFaceletsLibrary;
 import org.netbeans.modules.web.jsf.editor.facelets.CompositeComponentLibrary;
 import org.netbeans.modules.web.jsf.editor.hints.HintsRegistry;
 import org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.jsfapi.api.Library;
 import org.netbeans.modules.web.jsfapi.api.LibraryComponent;
 import org.netbeans.modules.web.jsfapi.api.NamespaceUtils;
@@ -199,10 +200,10 @@ public class JsfHtmlExtension extends HtmlExtension {
                 if (declaredPrefix == null) {
                     //undeclared prefix, try to match with default library prefix
                     if (lib.getDefaultPrefix() != null && lib.getDefaultPrefix().startsWith(context.getPrefix())) {
-                        items.addAll(queryLibrary(context, lib, lib.getDefaultPrefix(), true, jsfs.isJsf22Plus()));
+                        items.addAll(queryLibrary(context, lib, lib.getDefaultPrefix(), true, jsfs.getJsfVersion().isAtLeast(JsfVersion.JSF_2_2)));
                     }
                 } else {
-                    items.addAll(queryLibrary(context, lib, declaredPrefix, false, jsfs.isJsf22Plus()));
+                    items.addAll(queryLibrary(context, lib, declaredPrefix, false, jsfs.getJsfVersion().isAtLeast(JsfVersion.JSF_2_2)));
                 }
             }
         } else {
@@ -215,7 +216,7 @@ public class JsfHtmlExtension extends HtmlExtension {
                 for (Library lib : librariesSet) {
                     if (lib.getDefaultPrefix() != null && lib.getDefaultPrefix().equals(tagNamePrefix)) {
                         //match
-                        items.addAll(queryLibrary(context, lib, tagNamePrefix, true, jsfs.isJsf22Plus()));
+                        items.addAll(queryLibrary(context, lib, tagNamePrefix, true, jsfs.getJsfVersion().isAtLeast(JsfVersion.JSF_2_2)));
                     }
                 }
 
@@ -227,7 +228,7 @@ public class JsfHtmlExtension extends HtmlExtension {
                     return Collections.emptyList();
                 } else {
                     //query the library
-                    items.addAll(queryLibrary(context, lib, tagNamePrefix, false, jsfs.isJsf22Plus()));
+                    items.addAll(queryLibrary(context, lib, tagNamePrefix, false, jsfs.getJsfVersion().isAtLeast(JsfVersion.JSF_2_2)));
                 }
             }
         }
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfNavigationHelper.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfNavigationHelper.java
index 25a0cba21a..592b7740c6 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfNavigationHelper.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfNavigationHelper.java
@@ -127,7 +127,7 @@ public class JsfNavigationHelper {
                             Parser.Result result = resultIterator.getParserResult(caretOffset);
                             if (result instanceof HtmlParserResult) {
                                 HtmlParserResult hresult = (HtmlParserResult) result;
-                                Element root = hresult.root(LibraryUtils.COMPOSITE_LIBRARY_NS);
+                                Element root = hresult.root(LibraryUtils.COMPOSITE_LIBRARY_JCP_NS);
                                 ElementUtils.visitChildren(root, new ElementVisitor() {
                                     @Override
                                     public void visit(Element node) {
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfSupportImpl.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfSupportImpl.java
index 9c229e85ec..297685a699 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfSupportImpl.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfSupportImpl.java
@@ -36,10 +36,11 @@ import org.netbeans.api.project.Sources;
 import org.netbeans.modules.j2ee.metadata.model.api.MetadataModel;
 import org.netbeans.modules.parsing.api.Source;
 import org.netbeans.modules.web.api.webmodule.WebModule;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
 import org.netbeans.modules.web.jsf.editor.facelets.FaceletsLibrarySupport;
 import org.netbeans.modules.web.jsf.editor.index.JsfIndex;
 import org.netbeans.modules.web.jsfapi.api.JsfSupport;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.jsfapi.api.Library;
 import org.netbeans.modules.web.jsfapi.api.NamespaceUtils;
 import org.netbeans.modules.web.jsfapi.spi.JsfSupportProvider;
@@ -171,22 +172,20 @@ public class JsfSupportImpl implements JsfSupport {
             }
         });
 
-        if(isJsf30Plus()){
-            webBeansModelJakarta = new org.netbeans.modules.jakarta.web.beans.MetaModelSupport(project).getMetaModel();
-        } else {
-            webBeansModel = new org.netbeans.modules.web.beans.MetaModelSupport(project).getMetaModel();
-        }
+        JsfVersion jsfVersion = getJsfVersion();
         
-        //init lookup
         //TODO do it lazy so it creates the web beans model lazily once looked up
         InstanceContent ic = new InstanceContent();
-        if(isJsf30Plus()){
+        if(jsfVersion.isAtLeast(JsfVersion.JSF_3_0)){
+            webBeansModelJakarta = new org.netbeans.modules.jakarta.web.beans.MetaModelSupport(project).getMetaModel();
             ic.add(webBeansModelJakarta);
         } else {
+            webBeansModel = new org.netbeans.modules.web.beans.MetaModelSupport(project).getMetaModel();
             ic.add(webBeansModel);
         }
+        
+        //init lookup
         this.lookup = new AbstractLookup(ic);
-
     }
 
     @Override
@@ -222,7 +221,7 @@ public class JsfSupportImpl implements JsfSupport {
 
     @Override
     public Library getLibrary(String namespace) {
-        return NamespaceUtils.getForNs(faceletsLibrarySupport.getLibraries(), namespace);
+        return NamespaceUtils.getForNs(faceletsLibrarySupport.getNamespaceLibraryMapping(), namespace);
     }
 
     /** Library's uri to library map
@@ -231,7 +230,7 @@ public class JsfSupportImpl implements JsfSupport {
      */
     @Override
     public Map<String, Library> getLibraries() {
-        return faceletsLibrarySupport.getLibraries();
+        return faceletsLibrarySupport.getNamespaceLibraryMapping();
     }
 
     public boolean isFileOnClasspath(FileObject file) {
@@ -268,25 +267,15 @@ public class JsfSupportImpl implements JsfSupport {
     }
 
     @Override
-    public boolean isJsf22Plus() {
+    public JsfVersion getJsfVersion() {
         if (wm != null) {
-            JSFVersion version = JSFVersion.forWebModule(wm);
-            // caching is done inside the method
-            return version != null && version.isAtLeast(JSFVersion.JSF_2_2);
+            JsfVersion jsfVersion = JsfVersionUtils.forWebModule(wm);
+            if (jsfVersion != null) {
+                return jsfVersion;
+            }
         }
-        // return the latest supported one until somebody will complain about that
-        return true;
-    }
 
-		@Override
-    public boolean isJsf30Plus() {
-        if (wm != null) {
-            JSFVersion version = JSFVersion.forWebModule(wm);
-            // caching is done inside the method
-            return version != null && version.isAtLeast(JSFVersion.JSF_3_0);
-        }
-        // return the latest supported one until somebody will complain about that
-        return true;
+        return JsfVersion.latest();
     }
 
     @Override
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfUtils.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfUtils.java
index eb6443ed47..b24183f2c8 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfUtils.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/JsfUtils.java
@@ -100,11 +100,13 @@ public class JsfUtils {
     }
 
     public static Node getRoot(HtmlParserResult parserResult, LibraryInfo library) {
-        Node rootNode = parserResult.root(library.getNamespace());
-        if ((rootNode == null || rootNode.children().isEmpty()) && library.getLegacyNamespace() != null) {
-            rootNode = parserResult.root(library.getLegacyNamespace());
+        for (String namespace : library.getValidNamespaces()) {
+            Node rootNode = parserResult.root(namespace);
+            if (rootNode != null && !rootNode.children().isEmpty()) {
+                return rootNode;
+            }
         }
-        return rootNode;
+
+        return null;
     }
-    
 }
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/actions/FixNamespacesPerformer.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/actions/FixNamespacesPerformer.java
index 9131efa0a7..690e3a87bd 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/actions/FixNamespacesPerformer.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/actions/FixNamespacesPerformer.java
@@ -96,7 +96,7 @@ class FixNamespacesPerformer {
 
     private void includeMissingNamespaces() {
         for (VariantItem variant : selections) {
-            LibraryUtils.importLibrary(baseDocument, variant.getLibrary(), variant.getPrefix(), importData.isJsf22);
+            LibraryUtils.importLibrary(baseDocument, variant.getLibrary(), variant.getPrefix());
         }
     }
 }
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/actions/ImportData.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/actions/ImportData.java
index 2cd7e363d2..516d42833a 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/actions/ImportData.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/actions/ImportData.java
@@ -31,7 +31,6 @@ import org.netbeans.modules.web.jsfapi.api.Library;
 public class ImportData {
 
     public volatile boolean shouldShowNamespacesPanel;
-    public volatile boolean isJsf22;
 
     private final List<DataItem> dataItems = new ArrayList<>();
     private final List<DataItem> dataItemsToReplace = new ArrayList<>();
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/actions/NamespaceProcessor.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/actions/NamespaceProcessor.java
index 326477547a..297e35dcdb 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/actions/NamespaceProcessor.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/actions/NamespaceProcessor.java
@@ -26,7 +26,9 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
+import static java.util.function.Predicate.not;
 import org.netbeans.lib.editor.util.CharSequenceUtilities;
 import org.netbeans.modules.html.editor.api.gsf.HtmlParserResult;
 import org.netbeans.modules.html.editor.lib.api.elements.Attribute;
@@ -43,8 +45,10 @@ import org.netbeans.modules.web.common.api.LexerUtils;
 import org.netbeans.modules.web.jsf.editor.JsfSupportImpl;
 import org.netbeans.modules.web.jsf.editor.JsfUtils;
 import org.netbeans.modules.web.jsf.editor.actions.ImportData.VariantItem;
+import org.netbeans.modules.web.jsf.editor.facelets.JsfNamespaceComparator;
 import org.netbeans.modules.web.jsf.editor.hints.LibraryDeclarationChecker;
-import org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo;
+import org.netbeans.modules.web.jsfapi.api.JsfSupport;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.jsfapi.api.Library;
 import org.netbeans.modules.web.jsfapi.api.NamespaceUtils;
 
@@ -57,7 +61,7 @@ class NamespaceProcessor {
 
     private final HtmlParserResult parserResult;
     private final Snapshot snapshot;
-    private final JsfSupportImpl jsfSupport;
+    private final JsfSupport jsfSupport;
     private final ResultCollector resultCollector;
     private final Map<String, Library> supportedLibraries = new HashMap<>();
     private final List<Library> declaredLibraries;
@@ -77,9 +81,6 @@ class NamespaceProcessor {
     ImportData computeImportData() {
         final ImportData importData = new ImportData();
 
-        // use JSF 2.2 namespaces?
-        importData.isJsf22 = jsfSupport == null ? false : jsfSupport.isJsf22Plus();
-
         // unused declarations
         for (Attribute namespaceAttribute : resultCollector.getUnusedNamespaces()) {
             importData.addToRemove(namespaceAttribute);
@@ -97,19 +98,6 @@ class NamespaceProcessor {
         return importData;
     }
 
-    private static Node getTopRoot(HtmlParserResult parserResult) {
-        Node root = parserResult.root();
-        if (root.children().isEmpty()) {
-            Node faceletsRoot = parserResult.root(DefaultLibraryInfo.FACELETS.getLegacyNamespace());
-            if (!faceletsRoot.children().isEmpty()) {
-                return faceletsRoot;
-            } else {
-                return parserResult.root(DefaultLibraryInfo.FACELETS.getNamespace());
-            }
-        }
-        return root;
-    }
-
     private List<Library> getDeclaredLibraries() {
         List<Library> result = new ArrayList<>();
         for (String namespace : parserResult.getNamespaces().keySet()) {
@@ -122,33 +110,29 @@ class NamespaceProcessor {
     }
 
     private List<VariantItem> getSortedVariants(String prefix) {
-        List<VariantItem> result = new ArrayList<>();
-        List<String> sortedList = new ArrayList<>(supportedLibraries.keySet());
-        Collections.sort(sortedList);
-
-        // add namespaces of the same default prefix
-        for (Iterator<String> it = sortedList.iterator(); it.hasNext();) {
-            String ns = it.next();
-            Library library = supportedLibraries.get(ns);
-            if (prefix.equals(library.getDefaultPrefix())) {
-                if (jsfSupport != null && jsfSupport.isJsf22Plus()) {
-                    ns = library.getNamespace();
-                }
-                result.add(new VariantItem(prefix, ns, library));
-                it.remove();
-            }
+        List<VariantItem> items = new ArrayList<>();
+
+        // Add variant matching the used prefix
+        Set<String> namespacesForPrefix = Collections.emptySet();
+        Optional<Library> libraryForPrefix = supportedLibraries.values().stream()
+                .filter(entry -> entry.getDefaultPrefix().equals(prefix))
+                .findFirst();
+        if (libraryForPrefix.isPresent()) {
+            Library library = libraryForPrefix.get();
+            namespacesForPrefix = library.getValidNamespaces();
+            
+            namespacesForPrefix.forEach(namespace -> items.add(new VariantItem(prefix, namespace, library)));
         }
 
-        // complete the remaining items
-        for (String remainingNs : sortedList) {
-            Library library = supportedLibraries.get(remainingNs);
-            if (jsfSupport != null && jsfSupport.isJsf22Plus()) {
-                    remainingNs = library.getNamespace();
-                }
-            result.add(new VariantItem(prefix, remainingNs, library));
-        }
+        // Add all other variants
+        List<String> sortedList = new ArrayList<>(supportedLibraries.keySet());
+        Collections.sort(sortedList, JsfNamespaceComparator.getInstance());
 
-        return result;
+        sortedList.stream()
+                .filter(not(namespacesForPrefix::contains))
+                .forEach(additionalNamespaces -> items.add(new VariantItem(prefix, additionalNamespaces, supportedLibraries.get(additionalNamespaces))));
+
+        return items;
     }
 
     private class ResultCollector {
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/completion/JsfAttributesCompletionHelper.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/completion/JsfAttributesCompletionHelper.java
index a1cc337408..1c36248248 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/completion/JsfAttributesCompletionHelper.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/completion/JsfAttributesCompletionHelper.java
@@ -31,7 +31,10 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
+import static java.util.function.Predicate.not;
 import javax.lang.model.element.NestingKind;
 import javax.lang.model.element.PackageElement;
 import javax.lang.model.element.TypeElement;
@@ -74,10 +77,12 @@ import org.netbeans.modules.web.jsf.editor.JsfSupportImpl;
 import org.netbeans.modules.web.jsf.editor.JsfUtils;
 import org.netbeans.modules.web.jsf.editor.facelets.CompositeComponentLibrary;
 import org.netbeans.modules.web.jsf.editor.facelets.FaceletsLibraryMetadata;
+import org.netbeans.modules.web.jsf.editor.facelets.JsfNamespaceComparator;
 import org.netbeans.modules.web.jsf.editor.index.CompositeComponentModel;
 import org.netbeans.modules.web.jsf.editor.index.JsfPageModelFactory;
 import org.netbeans.modules.web.jsfapi.api.Attribute;
 import org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo;
+import org.netbeans.modules.web.jsfapi.api.JsfSupport;
 import org.netbeans.modules.web.jsfapi.api.Library;
 import org.netbeans.modules.web.jsfapi.api.LibraryComponent;
 import org.netbeans.modules.web.jsfapi.api.NamespaceUtils;
@@ -306,12 +311,11 @@ public class JsfAttributesCompletionHelper {
     }
 
     private static String getPrefixForFaceletsNs(HtmlParserResult result) {
-        String prefix = result.getNamespaces().get(DefaultLibraryInfo.FACELETS.getNamespace());
-        if (prefix != null) {
-            return prefix;
-        }
-
-        return result.getNamespaces().get(DefaultLibraryInfo.FACELETS.getLegacyNamespace());
+        return DefaultLibraryInfo.FACELETS.getValidNamespaces().stream()
+                .map(result.getNamespaces()::get)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .orElse(null);
     }
 
     private static List<OpenTag> findValue(Collection<OpenTag> nodes, String tagName, List<OpenTag> foundNodes) {
@@ -372,7 +376,11 @@ public class JsfAttributesCompletionHelper {
     //</cc:implementation>
     //offsers facet declarations only from within this document
     public static void completeFacetsInCCImpl(CompletionContext context, List<CompletionItem> items, String ns, OpenTag openTag, JsfSupportImpl jsfs) {
-        if ("http://java.sun.com/jsf/composite".equalsIgnoreCase(ns) || "http://xmlns.jcp.org/jsf/composite".equalsIgnoreCase(ns)) {
+        if (ns == null) {
+            return;
+        }
+
+        if (DefaultLibraryInfo.COMPOSITE.getValidNamespaces().contains(ns.toLowerCase())) {
             String tagName = openTag.unqualifiedName().toString();
             if ("renderFacet".equalsIgnoreCase(tagName) || "insertFacet".equalsIgnoreCase(tagName)) { //NOI18N
                 if ("name".equalsIgnoreCase(context.getAttributeName())) { //NOI18N
@@ -391,7 +399,11 @@ public class JsfAttributesCompletionHelper {
     //2.<f:facet name="|">
     //offsers all facetes
     public static void completeFacets(CompletionContext context, List<CompletionItem> items, String ns, OpenTag openTag, JsfSupportImpl jsfs) {
-        if ("http://java.sun.com/jsf/core".equalsIgnoreCase(ns) || "http://xmlns.jcp.org/jsf/core".equalsIgnoreCase(ns)) {
+        if (ns == null) {
+            return;
+        }
+
+        if (DefaultLibraryInfo.COMPOSITE.getValidNamespaces().contains(ns.toLowerCase())) {
             String tagName = openTag.unqualifiedName().toString();
             if ("facet".equalsIgnoreCase(tagName)) { //NOI18N
                 if ("name".equalsIgnoreCase(context.getAttributeName())) { //NOI18N
@@ -458,18 +470,39 @@ public class JsfAttributesCompletionHelper {
         }
     }
 
-    public static void completeXMLNSAttribute(CompletionContext context, List<CompletionItem> items, JsfSupportImpl jsfs) {
-        if (context.getAttributeName().toLowerCase(Locale.ENGLISH).startsWith("xmlns")) { //NOI18N
+    public static void completeXMLNSAttribute(CompletionContext context, List<CompletionItem> items, JsfSupport jsfs) {
+        String xmlns = context.getAttributeName().toLowerCase(Locale.ENGLISH);
+
+        if (xmlns.startsWith("xmlns:")) { //NOI18N
+            Set<String> preferredNamespaces = Collections.emptySet();
+
+            int preferredNamespaceSortPriority = 10;
+
+            String xmlnsPrefix = xmlns.substring(6);
+            if (!"".equals(xmlnsPrefix)) {
+                Optional<? extends Library> preferedLibrary = jsfs.getLibraries().values().stream().filter(lib -> lib.getDefaultPrefix().equals(xmlnsPrefix)).findFirst();
+                if (preferedLibrary.isPresent()) {
+                    preferredNamespaces = preferedLibrary.get().getValidNamespaces();
+                    for (String preferredNamespace : preferredNamespaces) {
+                        items.add(HtmlCompletionItem.createAttributeValue(preferredNamespace, context.getCCItemStartOffset(), !context.isValueQuoted(), preferredNamespaceSortPriority++));
+                    }
+                }
+            }
+
             //xml namespace completion for facelets namespaces
-            Set<String> nss = NamespaceUtils.getAvailableNss(jsfs.getLibraries(), jsfs.isJsf22Plus());
+            List<String> otherNamespaces = new ArrayList<>(jsfs.getLibraries().keySet());
+            Collections.sort(otherNamespaces, JsfNamespaceComparator.getInstance());
 
-            //add also xhtml ns to the completion
-            nss.add(LibraryUtils.XHTML_NS);
-            for (String namespace : nss) {
-                if (namespace.startsWith(context.getPrefix())) {
-                    items.add(HtmlCompletionItem.createAttributeValue(namespace, context.getCCItemStartOffset(), !context.isValueQuoted()));
+            int otherNamespaceSortPriority = 20;
+            for (String namespace : otherNamespaces) {
+                if (preferredNamespaces.contains(namespace)) {
+                    continue;
                 }
+
+                items.add(HtmlCompletionItem.createAttributeValue(namespace, context.getCCItemStartOffset(), !context.isValueQuoted(), otherNamespaceSortPriority++));
             }
+        } else if (xmlns.startsWith("xmlns")) { //NOI18N
+            items.add(HtmlCompletionItem.createAttributeValue(LibraryUtils.XHTML_NS, context.getCCItemStartOffset(), !context.isValueQuoted()));
         }
     }
 
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/completion/JsfCompletionItem.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/completion/JsfCompletionItem.java
index bb151e689e..5917d37eb2 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/completion/JsfCompletionItem.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/completion/JsfCompletionItem.java
@@ -139,7 +139,7 @@ public class JsfCompletionItem {
         private void autoimportLibrary(JTextComponent component) {
             final BaseDocument doc = (BaseDocument) component.getDocument();
             Library lib = JsfTag.this.component.getLibrary();
-            LibraryUtils.importLibrary(doc, lib, null, isJsf22Plus);
+            LibraryUtils.importLibrary(doc, lib, null);
         }
 
         //use bold font
@@ -317,10 +317,7 @@ public class JsfCompletionItem {
         sb.append("<div><b>"); //NOI18N
         sb.append(NbBundle.getMessage(JsfCompletionItem.class, "MSG_Library"));
         sb.append(":</b> "); //NOI18N
-        sb.append(library.getNamespace());
-        if (library.getLegacyNamespace() != null) {
-            sb.append(", ").append(library.getLegacyNamespace()); //NOI18N
-        }
+        sb.append(String.join(", ", library.getValidNamespaces()));
         if (library.getDisplayName() != null && !library.getDisplayName().equals(library.getNamespace())) {
             sb.append(" ("); //NOI18N
             sb.append(library.getDisplayName());
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/el/JsfELVariableResolver.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/el/JsfELVariableResolver.java
index 0ed7e1357f..108e5e541b 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/el/JsfELVariableResolver.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/el/JsfELVariableResolver.java
@@ -24,6 +24,8 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.atomic.AtomicReference;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.Modifier;
@@ -266,10 +268,11 @@ public final class JsfELVariableResolver implements ELVariableResolver {
                             if (parserResult == null) {
                                 continue;
                             }
-                            Node root = parserResult.root(DefaultLibraryInfo.FACELETS.getNamespace());
-                            if (root == null || root.children().isEmpty()) {
-                                root = parserResult.root(DefaultLibraryInfo.FACELETS.getLegacyNamespace());
-                            }
+                            Node root = DefaultLibraryInfo.FACELETS.getValidNamespaces().stream()
+                                    .map(parserResult::root)
+                                    .filter(Objects::nonNull)
+                                    .findFirst()
+                                    .orElse(null);
                             ElementUtils.visitChildren(root, new ElementVisitor() {
                                 @Override
                                 public void visit(Element node) {
@@ -313,8 +316,11 @@ public final class JsfELVariableResolver implements ELVariableResolver {
                     Result parseResult = JsfUtils.getEmbeddedParserResult(resultIterator, "text/html"); //NOI18N
                     if (parseResult instanceof HtmlParserResult) {
                         HtmlParserResult result = (HtmlParserResult) parseResult;
-                        Node root = result.root(DefaultLibraryInfo.COMPOSITE.getNamespace());
-                        if (root.children().isEmpty()) root = result.root(DefaultLibraryInfo.COMPOSITE.getLegacyNamespace());
+                        Node root = DefaultLibraryInfo.COMPOSITE.getValidNamespaces().stream()
+                                    .map(result::root)
+                                    .filter(Objects::nonNull)
+                                    .findFirst()
+                                    .orElse(null);
                         Collection<Element> children = root.children(ElementType.OPEN_TAG);
                         for (Element child : children) {
                             OpenTag ot = (OpenTag) child;
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/el/JsfVariablesModel.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/el/JsfVariablesModel.java
index d74e7346f3..47589c52ce 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/el/JsfVariablesModel.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/el/JsfVariablesModel.java
@@ -32,6 +32,7 @@ import org.netbeans.modules.html.editor.api.gsf.HtmlParserResult;
 import org.netbeans.modules.html.editor.lib.api.elements.*;
 import org.netbeans.modules.parsing.api.Snapshot;
 import org.netbeans.modules.web.jsf.editor.JsfSupportImpl;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.jsfapi.api.Library;
 import org.netbeans.modules.web.jsfapi.api.LibraryComponent;
 import org.netbeans.modules.web.jsfapi.api.NamespaceUtils;
@@ -93,7 +94,7 @@ public class JsfVariablesModel {
         if(sup == null) {
             return ;
         }
-        Set<String> faceletsLibsNamespaces = NamespaceUtils.getAvailableNss(sup.getLibraries(), sup.isJsf22Plus());
+        Set<String> faceletsLibsNamespaces = sup.getLibraries().keySet();
         Collection<String> declaredNamespaces = result.getNamespaces().keySet();
 
         for (String namespace : declaredNamespaces) {
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/el/WebBeansELVariableResolver.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/el/WebBeansELVariableResolver.java
index 2681086d29..75e475491c 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/el/WebBeansELVariableResolver.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/el/WebBeansELVariableResolver.java
@@ -33,6 +33,7 @@ import org.netbeans.modules.web.beans.api.model.WebBeansModel;
 import org.netbeans.modules.web.el.spi.ELVariableResolver;
 import org.netbeans.modules.web.el.spi.ResolverContext;
 import org.netbeans.modules.web.jsf.editor.JsfSupportImpl;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.openide.filesystems.FileObject;
 import org.openide.util.Exceptions;
 import org.openide.util.lookup.ServiceProvider;
@@ -101,7 +102,7 @@ public final class WebBeansELVariableResolver implements ELVariableResolver {
             return Collections.<WebBean>emptyList();
         } else {
             if (context.getContent(CONTENT_NAME) == null) {
-                if(jsfSupport.isJsf30Plus()){
+                if(jsfSupport.getJsfVersion().isAtLeast(JsfVersion.JSF_3_0)){
                     context.setContent(CONTENT_NAME, getJakartaNamedBeans(jsfSupport.getJakartaWebBeansModel()));
                 } else {
                     context.setContent(CONTENT_NAME, getNamedBeans(jsfSupport.getWebBeansModel()));
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/AbstractFaceletsLibrary.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/AbstractFaceletsLibrary.java
index c44f32181e..cd0d62e35a 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/AbstractFaceletsLibrary.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/AbstractFaceletsLibrary.java
@@ -23,7 +23,6 @@ import java.lang.reflect.Method;
 import java.net.URL;
 import java.util.Collection;
 import java.util.Map;
-import java.util.Objects;
 import org.netbeans.modules.web.jsfapi.api.Library;
 import org.netbeans.modules.web.jsfapi.api.LibraryComponent;
 import org.netbeans.modules.web.jsfapi.api.Tag;
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/CompositeComponentLibrary.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/CompositeComponentLibrary.java
index a055584d4a..06e6c0f86a 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/CompositeComponentLibrary.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/CompositeComponentLibrary.java
@@ -25,6 +25,7 @@ import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.StringTokenizer;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
@@ -33,7 +34,6 @@ import org.netbeans.modules.web.jsf.editor.index.JsfIndex;
 import org.netbeans.modules.web.jsfapi.api.Attribute;
 import org.netbeans.modules.web.jsfapi.api.LibraryType;
 import org.netbeans.modules.web.jsfapi.api.Tag;
-import org.netbeans.modules.web.jsfapi.spi.LibraryUtils;
 import org.openide.util.NbBundle;
 import org.openide.util.WeakListeners;
 
@@ -56,7 +56,7 @@ public class CompositeComponentLibrary extends FaceletsLibrary {
     private Map<String, CompositeComponent> compositeComponentsMap;
 
     //for cc libraries with facelets library descriptor, the constructor is called by Mojarra
-    public CompositeComponentLibrary(FaceletsLibrarySupport support, String compositeLibraryName, String namespace, URL libraryDescriptorURL) {
+    public CompositeComponentLibrary(FaceletsLibrarySupport support, String compositeLibraryName, Set<String> namespace, URL libraryDescriptorURL) {
         super(support, namespace, libraryDescriptorURL);
 
         this.compositeLibraryResourceFolderName = compositeLibraryName;
@@ -89,7 +89,7 @@ public class CompositeComponentLibrary extends FaceletsLibrary {
 
     @Override
     public String getDefaultNamespace() {
-        return LibraryUtils.getCompositeLibraryURL(getLibraryName(), support.getJsfSupport().isJsf22Plus());
+        return getNamespace();
     }
 
     @Override
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/DefaultFaceletLibraries.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/DefaultFaceletLibraries.java
index 3f81e85dc0..de16181ea0 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/DefaultFaceletLibraries.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/DefaultFaceletLibraries.java
@@ -26,6 +26,7 @@ import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo;
@@ -48,6 +49,7 @@ import org.openide.modules.InstalledFileLocator;
 public class DefaultFaceletLibraries {
 
     private static DefaultFaceletLibraries INSTANCE;
+    private File jsfImplJar;
     private Collection<FileObject> libraryDescriptorsFiles;
     private Map<String, FaceletsLibraryDescriptor> librariesDescriptors;
     private static Map<String, Library> jsf22FaceletPseudoLibraries;
@@ -59,14 +61,20 @@ public class DefaultFaceletLibraries {
         return INSTANCE;
     }
 
-    public DefaultFaceletLibraries() {
-        init();
+    public DefaultFaceletLibraries(File jsfImplJar) {
+        this.jsfImplJar = jsfImplJar;
+
+        init(jsfImplJar);
     }
 
-    private void init() {
-        File jsfImplJar = InstalledFileLocator.getDefault().locate(
+    public DefaultFaceletLibraries() {
+        this(InstalledFileLocator.getDefault().locate(
                 "modules/ext/jsf-2_2/javax.faces.jar", //NOI18N
-                "org.netbeans.modules.web.jsf20", false); //NOI18N
+                "org.netbeans.modules.web.jsf20", false) //NOI18N
+        );
+    }
+
+    private void init(File jsfImplJar) {
         assert jsfImplJar != null;
 
         FileObject jsfImplJarFo = FileUtil.getArchiveRoot(FileUtil.toFileObject(jsfImplJar));
@@ -74,6 +82,10 @@ public class DefaultFaceletLibraries {
 
     }
 
+    public File getJsfImplJar() {
+        return jsfImplJar;
+    }
+
     public Collection<FileObject> getLibrariesDescriptorsFiles() {
         return this.libraryDescriptorsFiles;
     }
@@ -128,21 +140,27 @@ public class DefaultFaceletLibraries {
 
     protected static synchronized Map<String, Library> getJsf22FaceletPseudoLibraries(FaceletsLibrarySupport support) {
         if (jsf22FaceletPseudoLibraries == null) {
-            jsf22FaceletPseudoLibraries = new HashMap<>(2);
-            jsf22FaceletPseudoLibraries.put(DefaultLibraryInfo.JSF.getLegacyNamespace(), new JsfFaceletPseudoLibrary(support, DefaultLibraryInfo.JSF));
-            jsf22FaceletPseudoLibraries.put(DefaultLibraryInfo.PASSTHROUGH.getLegacyNamespace(), new JsfFaceletPseudoLibrary(support, DefaultLibraryInfo.PASSTHROUGH));
+            Map<String, Library> map = new HashMap<>(2);
+            DefaultLibraryInfo.JSF.getValidNamespaces().stream()
+                    .filter(namespace -> namespace.startsWith(NamespaceUtils.JCP_ORG_LOCATION))
+                    .forEach(namespace -> map.put(namespace, new JsfFaceletPseudoLibrary(support, DefaultLibraryInfo.JSF)));
+            DefaultLibraryInfo.PASSTHROUGH.getValidNamespaces().stream()
+                    .filter(namespace -> namespace.startsWith(NamespaceUtils.JCP_ORG_LOCATION))
+                    .forEach(namespace -> map.put(namespace, new JsfFaceletPseudoLibrary(support, DefaultLibraryInfo.PASSTHROUGH)));
+
+            jsf22FaceletPseudoLibraries = Collections.unmodifiableMap(map);
         }
         return jsf22FaceletPseudoLibraries;
     }
 
     private static class JsfFaceletPseudoLibrary implements Library {
 
-        private final String namespace;
+        private final Set<String> validNamespaces;
         private final String prefix;
         private final String displayName;
 
         public JsfFaceletPseudoLibrary(FaceletsLibrarySupport support, DefaultLibraryInfo defaultLibraryInfo) {
-            this.namespace = defaultLibraryInfo.getNamespace();
+            this.validNamespaces = defaultLibraryInfo.getValidNamespaces();
             this.prefix = defaultLibraryInfo.getDefaultPrefix();
             this.displayName = defaultLibraryInfo.getDisplayName();
         }
@@ -164,7 +182,7 @@ public class DefaultFaceletLibraries {
 
         @Override
         public String getNamespace() {
-            return namespace;
+            return validNamespaces.iterator().next();
         }
 
         @Override
@@ -183,9 +201,8 @@ public class DefaultFaceletLibraries {
         }
 
         @Override
-        public String getLegacyNamespace() {
-            return NamespaceUtils.NS_MAPPING.get(namespace);
+        public Set<String> getValidNamespaces() {
+            return validNamespaces;
         }
-
     }
 }
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrary.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrary.java
index fdc9b4695a..f16b5234a3 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrary.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrary.java
@@ -22,8 +22,8 @@ import java.lang.reflect.Method;
 import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 import org.netbeans.modules.web.jsfapi.api.LibraryType;
-import org.netbeans.modules.web.jsfapi.api.NamespaceUtils;
 import org.netbeans.modules.web.jsfapi.spi.LibraryUtils;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.URLMapper;
@@ -42,17 +42,18 @@ public class FaceletsLibrary extends AbstractFaceletsLibrary {
     /** 
      * The namespace declared in the facelets library descriptor
      */
-    private final String declaredNamespace;
+    private final Set<String> validNamespaces;
     
-    private final Map<String, NamedComponent> components = new HashMap<String, NamedComponent>();
+    private final Map<String, NamedComponent> components = new HashMap<>();
     private LibraryDescriptor libraryDescriptor, faceletsLibraryDescriptor;
     private String defaultPrefix;
     private final URL libraryDescriptorSource;
 
-    public FaceletsLibrary(FaceletsLibrarySupport support, String namespace, URL libraryDescriptorSourceURL) {
-        super(support, namespace);
-        declaredNamespace = namespace;
-        libraryDescriptorSource = libraryDescriptorSourceURL;
+    public FaceletsLibrary(FaceletsLibrarySupport support, Set<String> allValidNamespaces, URL libraryDescriptorSourceURL) {
+        super(support, allValidNamespaces.iterator().next());
+
+        this.validNamespaces = allValidNamespaces;
+        this.libraryDescriptorSource = libraryDescriptorSourceURL;
     }
     
     protected synchronized LibraryDescriptor getFaceletsLibraryDescriptor() throws LibraryDescriptorException {
@@ -70,7 +71,7 @@ public class FaceletsLibrary extends AbstractFaceletsLibrary {
 
     @Override
     public String getNamespace() {
-        return declaredNamespace;
+        return validNamespaces.iterator().next();
     }
 
     @Override
@@ -201,9 +202,7 @@ public class FaceletsLibrary extends AbstractFaceletsLibrary {
     }
 
     @Override
-    public String getLegacyNamespace() {
-        return NamespaceUtils.NS_MAPPING.get(declaredNamespace);
+    public Set<String> getValidNamespaces() {
+        return validNamespaces;
     }
-
-
 }
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrarySupport.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrarySupport.java
index 1efb1709dd..031675008f 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrarySupport.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrarySupport.java
@@ -18,16 +18,18 @@
  */
 package org.netbeans.modules.web.jsf.editor.facelets;
 
+import com.sun.faces.config.DocumentInfo;
+import com.sun.faces.spi.ConfigurationResourceProvider;
 import java.io.IOException;
+import java.net.MalformedURLException;
 import java.util.Enumeration;
 import org.netbeans.modules.web.api.webmodule.WebModule;
 import org.netbeans.modules.web.jsf.editor.facelets.mojarra.FaceletsTaglibConfigProcessor;
-import com.sun.faces.config.DocumentInfo;
-import com.sun.faces.spi.ConfigurationResourceProvider;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLClassLoader;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -38,16 +40,18 @@ import java.util.List;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import java.util.stream.Collectors;
 import javax.servlet.ServletContext;
 import org.netbeans.api.progress.ProgressHandle;
 import org.netbeans.api.progress.ProgressHandleFactory;
 import org.netbeans.modules.web.jsf.api.editor.JsfFacesComponentsProvider;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
 import org.netbeans.modules.web.jsf.editor.JsfSupportImpl;
 import org.netbeans.modules.web.jsf.editor.facelets.mojarra.ConfigManager;
 import org.netbeans.modules.web.jsf.editor.index.IndexedFile;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.jsfapi.api.Library;
 import org.netbeans.modules.web.jsfapi.api.LibraryType;
+import org.netbeans.modules.web.jsfapi.spi.JsfReferenceImplementationProvider;
 import org.openide.filesystems.FileChangeAdapter;
 import org.openide.filesystems.FileChangeListener;
 import org.openide.filesystems.FileEvent;
@@ -55,6 +59,7 @@ import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileStateInvalidException;
 import org.openide.filesystems.URLMapper;
 import org.openide.util.Exceptions;
+import org.openide.util.Lookup;
 import org.openide.util.NbBundle;
 import org.openide.util.RequestProcessor;
 
@@ -76,12 +81,10 @@ public class FaceletsLibrarySupport {
      * the default and the declared one when
      * there is a tag library descriptor for the composite library
      */
-    private Map<String, Library> faceletsLibraries;
+    private Map<String, Library> namespaceLibraryMapping;
 
     private long libraries_hash;
     
-    private boolean checkLibrariesUpToDate;
-
     private static final Logger LOGGER = Logger.getLogger(FaceletsLibrarySupport.class.getSimpleName());
 
     private RequestProcessor.Task facesComponentsRefreshTask;
@@ -145,7 +148,7 @@ public class FaceletsLibrarySupport {
     }
 
     private synchronized void invalidateLibrariesCache() {
-        faceletsLibraries = null;
+        namespaceLibraryMapping = null;
         
         // !!! Can't be used here - leads to issues like issue #230198 !!!
         // IndexingManager.getDefault().refreshAllIndices(getJsfSupport().getClassPathRoots());
@@ -154,31 +157,31 @@ public class FaceletsLibrarySupport {
     /*
      * Called via the JsfSupport from the JSF indexers when their source roots have been rescanned.
      * that can mean the files related to the JSF libraries might have changed so we need to re-check
-     * the libraries up-to-date status next time when one calls getLibraries().
+     * the libraries up-to-date status next time when one calls getNamespaceLibraryMapping().
      */
     public void indexedContentPossiblyChanged() {
         checkLibraryDescriptorsUpToDate();
     }
 
     /** @return URI -> library map */
-    public synchronized Map<String, Library> getLibraries() {
-        if (faceletsLibraries == null) {
+    public synchronized Map<String, Library> getNamespaceLibraryMapping() {
+        if (namespaceLibraryMapping == null) {
             // preload FacesComponents
             refreshFacesComponentsCache(0);
 
             //not initialized yet, or invalidated by checkLibraryDescriptorsUpToDate()
-            faceletsLibraries = findLibraries();
+            namespaceLibraryMapping = findLibraries();
 
-            if (faceletsLibraries == null) {
+            if (namespaceLibraryMapping == null) {
                 //an error when scanning libraries, return no libraries, but give it a next try
                 return Collections.emptyMap();
             }
             
-            updateCompositeLibraries(faceletsLibraries);
+            updateCompositeLibraries(namespaceLibraryMapping);
         }
-        updateFacesComponentLibraries(faceletsLibraries);
+        updateFacesComponentLibraries(namespaceLibraryMapping);
 
-        return faceletsLibraries;
+        return namespaceLibraryMapping;
     }
 
     private void checkLibraryDescriptorsUpToDate() {
@@ -218,8 +221,7 @@ public class FaceletsLibrarySupport {
         for (Library lib : faceletsLibraries.values()) {
             if (lib instanceof CompositeComponentLibrary) {
                 CompositeComponentLibrary cclib = (CompositeComponentLibrary)lib;
-                //add default namespace to the map
-                cclibsMap.put(cclib.getDefaultNamespace(), cclib);
+                cclib.getValidNamespaces().forEach(namespace -> cclibsMap.put(namespace, cclib));
 
                 String libraryName = cclib.getLibraryName();
                 libraryNames.remove(libraryName);
@@ -232,7 +234,7 @@ public class FaceletsLibrarySupport {
         for (String libraryName : libraryNames) {
             CompositeComponentLibrary ccl = new PureCompositeComponentLibrary(this, libraryName);
             //map the library only to the default namespace, it has no declaration
-            faceletsLibraries.put(ccl.getDefaultNamespace(), ccl);
+            ccl.getValidNamespaces().forEach(namespace -> faceletsLibraries.put(namespace, ccl));
         }
 
     }
@@ -350,46 +352,58 @@ public class FaceletsLibrarySupport {
                 LOGGER.log(Level.INFO, null, ex);
             }
         }
-        faceletTaglibProviders.add(new ConfigurationResourceProvider() {
+        faceletTaglibProviders.add(sc -> uris);
 
-            @Override
-            public Collection<URI> getResources(ServletContext sc) {
-                return uris;
-            }
-        });
-
-        //3. last add a provider for default jsf libs
-        //
-        //Add a facelet taglib provider which provides the libraries from
-        //netbeans jsf2.0 library
-        //
-        //This is needed for the standart JSF 2.0 libraries since it may
-        //happen that there is no javax-faces.jar with the .taglib.xml files
-        //on the compile classpath and we still want the features like code
-        //completion work. This happens for example in Maven web projects.
-        //
-        //The provider is last in the list so the provided libraries will
-        //be overridden if the descriptors are found in any of the jars
-        //on compile classpath.
-        Collection<FileObject> libraryDescriptorFiles = DefaultFaceletLibraries.getInstance().getLibrariesDescriptorsFiles();
-        final Collection<URI> libraryURIs = new ArrayList<>();
-        for(FileObject fo : libraryDescriptorFiles) {
-            try {
-                libraryURIs.add(fo.toURL().toURI());
-            } catch (URISyntaxException ex) {
-                LOGGER.log(Level.INFO, null, ex);
+
+        // try to find reference implementation based on jsf version
+        JsfVersion jsfVersion = getJsfSupport().getJsfVersion();
+        JsfReferenceImplementationProvider jsfRIProvider = Lookup.getDefault().lookup(JsfReferenceImplementationProvider.class);
+        Path jsfReferenceImplementation = jsfRIProvider.artifactPathFor(jsfVersion);
+
+        List<URL> jsfRIJars = new ArrayList<>();
+        try {
+            if (jsfReferenceImplementation != null) {
+                DefaultFaceletLibraries jsfRIFaceletLibraries = new DefaultFaceletLibraries(jsfReferenceImplementation.toFile());
+                List<URI> jsfRIDescriptors = jsfRIFaceletLibraries.getLibrariesDescriptorsFiles().stream()
+                        .map(FileObject::toURI)
+                        .collect(Collectors.toList());
+                faceletTaglibProviders.add(sc -> jsfRIDescriptors);
+
+                jsfRIJars.add(jsfReferenceImplementation.toUri().toURL());
+            } else {
+                // if no reference implementation could be found fallback to bundled one
+
+                //Add a facelet taglib provider which provides the libraries from
+                //netbeans jsf2.0 library
+                //
+                //This is needed for the standart JSF 2.0 libraries since it may
+                //happen that there is no javax-faces.jar with the .taglib.xml files
+                //on the compile classpath and we still want the features like code
+                //completion work. This happens for example in Maven web projects.
+
+                DefaultFaceletLibraries defaultFaceletLibraries = DefaultFaceletLibraries.getInstance();
+                Collection<FileObject> libraryDescriptorFiles = defaultFaceletLibraries.getLibrariesDescriptorsFiles();
+                final Collection<URI> libraryURIs = new ArrayList<>();
+                for (FileObject fo : libraryDescriptorFiles) {
+                    try {
+                        libraryURIs.add(fo.toURL().toURI());
+                    } catch (URISyntaxException ex) {
+                        LOGGER.log(Level.INFO, null, ex);
+                    }
+                }
+                faceletTaglibProviders.add(sc -> libraryURIs);
+
+                jsfRIJars.add(defaultFaceletLibraries.getJsfImplJar().toURI().toURL());
             }
+        } catch (MalformedURLException ex) {
+            Exceptions.printStackTrace(ex);
         }
-        faceletTaglibProviders.add(new ConfigurationResourceProvider() {
-            @Override
-            public Collection<URI> getResources(ServletContext sc) {
-                return libraryURIs;
-            }
-        });
+
+        URLClassLoader jsfRIClassLoader = new URLClassLoader(jsfRIJars.toArray(new URL[]{}));
 
         //parse the libraries
         ServletContext sc = new EmptyServletContext();
-        DocumentInfo[] documents = ConfigManager.getConfigDocuments(sc, faceletTaglibProviders, null, true);
+        DocumentInfo[] documents = ConfigManager.getConfigDocuments(jsfRIClassLoader, sc, faceletTaglibProviders, null, true);
         if (documents == null) {
             return null; //error????
         }
@@ -400,24 +414,16 @@ public class FaceletsLibrarySupport {
         
         Map<String, Library> libsMap = new HashMap<>();
         for (Library lib : processor.compiler.libraries) {
-            if (lib.getLegacyNamespace() != null) {
-                libsMap.put(lib.getLegacyNamespace(), lib);
-            } else {
-                libsMap.put(lib.getNamespace(), lib);
-            }
+            lib.getValidNamespaces().forEach(namespace -> libsMap.put(namespace, lib));
         }
 
         //4. in case of JSF2.2 include pseudo-libraries (http://java.sun.com/jsf/passthrough, http://java.sun.com/jsf)
-        // right now, we have no idea whether such libraries will be included into the JSF bundle or not
-        if (webModule != null) {
-            JSFVersion jsfVersion = JSFVersion.forWebModule(webModule);
-            if (jsfVersion != null && jsfVersion.isAtLeast(JSFVersion.JSF_2_2)) {
-                libsMap.putAll(DefaultFaceletLibraries.getJsf22FaceletPseudoLibraries(this));
-            }
+        //This is only needed for JSF 2.2. as following versions contain the taglib xml descriptions
+        if (webModule != null && jsfVersion != null && jsfVersion == JsfVersion.JSF_2_2) {
+            libsMap.putAll(DefaultFaceletLibraries.getJsf22FaceletPseudoLibraries(this));
         }
 
         return libsMap;
-
     }
 
     private synchronized void refreshFacesComponentsCache(int timeToWait) {
@@ -426,20 +432,6 @@ public class FaceletsLibrarySupport {
         }
     }
 
-
-//    private void debugLibraries() {
-//        System.out.println("Facelets Libraries:");  //NOI18N
-//        System.out.println("====================");  //NOI18N
-//        for (FaceletsLibrary lib : faceletsLibraries.values()) {
-//            System.out.println("Library: " + lib.getNamespace());  //NOI18N
-//            System.out.println("----------------------------------------------------");  //NOI18N
-//            for (FaceletsLibrary.NamedComponent comp : lib.getComponents()) {
-//                System.out.println(comp.getName() + "(" + comp.getClass().getSimpleName() + ")");  //NOI18N
-//            }
-//            System.out.println();
-//        }
-//    }
-
     public static class Compiler {
 
         private Collection<Library> libraries = new HashSet<>();
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/JsfNamespaceComparator.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/JsfNamespaceComparator.java
new file mode 100644
index 0000000000..0e5e64cb40
--- /dev/null
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/JsfNamespaceComparator.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.web.jsf.editor.facelets;
+
+import java.util.Comparator;
+
+/**
+ *
+ * @author Benjamin Asbach
+ */
+public class JsfNamespaceComparator implements Comparator<String> {
+
+    private static final JsfNamespaceComparator INSTANCE = new JsfNamespaceComparator();
+
+    private JsfNamespaceComparator() {
+    }
+
+    public static JsfNamespaceComparator getInstance() {
+        return INSTANCE;
+    }
+
+    @Override
+    public int compare(String namespace1, String namespace2) {
+        int prefixRating = rate(namespace1).compareTo(rate(namespace2));
+        if (prefixRating != 0) {
+            return prefixRating;
+        }
+
+        return namespace1.compareTo(namespace2);
+    }
+
+    private Integer rate(String namespace) {
+        if (namespace.startsWith("jakarta")) {
+            return 1;
+        } else if (namespace.startsWith("http://xmlns.jcp.org")) {
+            return 2;
+        } else if (namespace.startsWith("http://java.sun.com")) {
+            return 3;
+        } else {
+            return 4;
+        }
+    }
+}
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/PureCompositeComponentLibrary.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/PureCompositeComponentLibrary.java
index e58893d743..d0311b00d7 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/PureCompositeComponentLibrary.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/PureCompositeComponentLibrary.java
@@ -18,6 +18,8 @@
  */
 package org.netbeans.modules.web.jsf.editor.facelets;
 
+import org.netbeans.modules.web.jsfapi.spi.LibraryUtils;
+
 /**
  * Represents a composite components library w/o the facelets descriptor
  *
@@ -26,17 +28,11 @@ package org.netbeans.modules.web.jsf.editor.facelets;
 public class PureCompositeComponentLibrary extends CompositeComponentLibrary {
     
     public PureCompositeComponentLibrary(FaceletsLibrarySupport support, String libraryName) {
-        super(support, libraryName, null, null);
+        super(support, libraryName, LibraryUtils.getAllCompositeLibraryNamespaces(libraryName, support.getJsfSupport().getJsfVersion()), null);
     }
 
     @Override
     protected LibraryDescriptor getFaceletsLibraryDescriptor() throws LibraryDescriptorException {
         return new CCVirtualLibraryDescriptor();
     }
-
-    @Override
-    public String getNamespace() {
-        return getDefaultNamespace();
-    }
-    
 }
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/mojarra/ConfigManager.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/mojarra/ConfigManager.java
index 9995607e2a..3edc81ca88 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/mojarra/ConfigManager.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/mojarra/ConfigManager.java
@@ -65,17 +65,24 @@ import com.sun.faces.util.FacesLogger;
 import com.sun.faces.util.Timer;
 import com.sun.faces.util.Util;
 import java.io.BufferedInputStream;
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringWriter;
 import java.lang.annotation.Annotation;
+import java.lang.ref.WeakReference;
+import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
+import java.net.URLClassLoader;
 import java.net.URLConnection;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -93,6 +100,8 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import javax.el.ELContext;
 import javax.el.ELContextEvent;
 import javax.el.ELContextListener;
@@ -112,8 +121,16 @@ import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamSource;
 import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import org.netbeans.api.xml.services.UserCatalog;
+import org.netbeans.modules.web.jsf.editor.facelets.DefaultFaceletLibraries;
+import org.netbeans.modules.web.jsfapi.api.JsfNamespaces;
+import org.openide.util.Exceptions;
 import org.w3c.dom.*;
+import org.w3c.dom.ls.LSInput;
+import org.w3c.dom.ls.LSResourceResolver;
 import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
 
 /**
@@ -672,6 +689,39 @@ public class ConfigManager {
 
     }
 
+        /**
+     * <p>
+     * Obtains an array of <code>Document</code>s to be processed by
+     * {@link ConfigManager#FACES_CONFIG_PROCESSOR_CHAIN}.
+     * </p>
+     *
+     * @param sc the <code>ServletContext</code> for the application to be
+     * processed
+     * @param providers <code>List</code> of
+     * <code>ConfigurationResourceProvider</code> instances that provide the URL
+     * of the documents to parse.
+     * @param executor the <code>ExecutorService</code> used to dispatch parse
+     * request to
+     * @param validating flag indicating whether or not the documents should be
+     * validated
+     * @return an array of <code>DocumentInfo</code>s
+     */
+    public static DocumentInfo[] getConfigDocuments(ServletContext sc,
+            List<ConfigurationResourceProvider> providers,
+            ExecutorService executor,
+            boolean validating) {
+        DefaultFaceletLibraries defaultFaceletLibraries = DefaultFaceletLibraries.getInstance();
+        File jsfImplJar = defaultFaceletLibraries.getJsfImplJar();
+
+        URLClassLoader jsfImplJarClassLoader = null;
+        try {
+            jsfImplJarClassLoader = new URLClassLoader(new URL[]{jsfImplJar.toURI().toURL()});
+        } catch (MalformedURLException ex) {
+            // should only happen when bundleling a broken JSF implementation, so ignore
+        }
+
+        return getConfigDocuments(jsfImplJarClassLoader, sc, providers, executor, validating);
+    }
 
     /**
      * <p>
@@ -689,7 +739,7 @@ public class ConfigManager {
      *  should be validated
      * @return an array of <code>DocumentInfo</code>s
      */
-    public static DocumentInfo[] getConfigDocuments(ServletContext sc,
+    public static DocumentInfo[] getConfigDocuments(URLClassLoader jsfRIClassLoader, ServletContext sc,
                                                  List<ConfigurationResourceProvider> providers,
                                                  ExecutorService executor,
                                                  boolean validating) {
@@ -715,7 +765,7 @@ public class ConfigManager {
                 Collection<URI> l = t.get();
                 for (URI u : l) {
                     FutureTask<DocumentInfo> d =
-                         new FutureTask<DocumentInfo>(new ParseTask(sc, validating, u));
+                         new FutureTask<DocumentInfo>(new ParseTask(jsfRIClassLoader, sc, validating, u));
                     docTasks.add(d);
                     if (executor != null) {
                         executor.execute(d);
@@ -765,25 +815,6 @@ public class ConfigManager {
 
     }
 
-
-//    /**
-//     * @param throwable Throwable
-//     * @return the root cause of this error
-//     */
-//    private Throwable unwind(Throwable throwable) {
-//
-//          Throwable t = null;
-//          if (throwable != null) {
-//              t =  unwind(throwable.getCause());
-//              if (t == null) {
-//                  t = throwable;
-//              }
-//          }
-//          return t;
-//
-//    }
-
-
     /**
      * Calls through to {@link javax.faces.FactoryFinder#releaseFactories()}
      * ignoring any exceptions.
@@ -936,12 +967,37 @@ public class ConfigManager {
      * </p>
      */
     private static class ParseTask implements Callable<DocumentInfo> {
-        private static final String JAVAEE_SCHEMA_LEGACY_DEFAULT_NS =
-            "http://java.sun.com/xml/ns/javaee";
-        private static final String JAVAEE_SCHEMA_DEFAULT_NS =
-            "http://xmlns.jcp.org/xml/ns/javaee";
-        private static final String EMPTY_FACES_CONFIG =
-                "com/sun/faces/empty-faces-config.xml";
+
+        private static final String EMPTY_FACES_CONFIG = "com/sun/faces/empty-faces-config.xml";
+
+        private static final Map<String, String> VERSION_FACES_SCHEMA_FACES_MAPPING;
+        static {
+            Map<String, String> map = new HashMap<>();
+            map.put("4.0", "com/sun/faces/web-facesconfig_4_0.xsd");
+            map.put("3.0", "com/sun/faces/web-facesconfig_3_0.xsd");
+            map.put("2.3", "com/sun/faces/web-facesconfig_2_3.xsd");
+            map.put("2.2", "com/sun/faces/web-facesconfig_2_2.xsd");
+            map.put("2.1", "com/sun/faces/web-facesconfig_2_1.xsd");
+            map.put("2.0", "com/sun/faces/web-facesconfig_2_0.xsd");
+            map.put("1.2", "com/sun/faces/web-facesconfig_1_2.xsd");
+            VERSION_FACES_SCHEMA_FACES_MAPPING = Collections.unmodifiableMap(map);
+        }
+
+        private static final Map<String, String> VERSION_FACES_SCHEMA_FACELET_TAGLIB_MAPPING;
+        static {
+            Map<String, String> map = new HashMap<>();
+            map.put("4.0", "com/sun/faces/web-facelettaglibrary_4_0.xsd");
+            map.put("3.0", "com/sun/faces/web-facelettaglibrary_3_0.xsd");
+            map.put("2.3", "com/sun/faces/web-facelettaglibrary_2_3.xsd");
+            map.put("2.2", "com/sun/faces/web-facelettaglibrary_2_2.xsd");
+            map.put("2.1", "com/sun/faces/web-facelettaglibrary_2_0.xsd");
+            map.put("2.0", "com/sun/faces/web-facelettaglibrary_2_0.xsd");
+            VERSION_FACES_SCHEMA_FACELET_TAGLIB_MAPPING = Collections.unmodifiableMap(map);
+        }
+
+        private static final Map<String, WeakReference<Schema>> SCHEMA_CACHE = new HashMap<>();
+
+        private URLClassLoader jsfRIClassLoader;
         private ServletContext servletContext;
         private URI documentURI;
         private DocumentBuilderFactory factory;
@@ -960,12 +1016,12 @@ public class ConfigManager {
          * @param documentURI a URL to the configuration resource to be parsed
          * @throws Exception general error
          */
-        public ParseTask(ServletContext servletContext, boolean validating, URI documentURI)
+        public ParseTask(URLClassLoader jsfRIClassLoader, ServletContext servletContext, boolean validating, URI documentURI)
         throws Exception {
+            this.jsfRIClassLoader = jsfRIClassLoader;
             this.servletContext = servletContext;
             this.documentURI = documentURI;
             this.validating = validating;
-
         }
 
 
@@ -1059,72 +1115,27 @@ public class ConfigManager {
                  * we need to transform it to reference a special 1.1 schema before validating.
                  */
                 Node documentElement = ((Document) domSource.getNode()).getDocumentElement();
-                if (JAVAEE_SCHEMA_DEFAULT_NS.equals(documentNS)) {
-                    Attr version = (Attr)
-                            documentElement.getAttributes().getNamedItem("version");
-                    Schema schema;
-                    if (version != null) {
-                        String versionStr = version.getValue();
-                        if ("2.3".equals(versionStr)) {
-                            if ("facelet-taglib".equals(documentElement.getLocalName())) {
-                                schema = DbfFactory.getSchema(servletContext, DbfFactory.FacesSchema.FACELET_TAGLIB_22);
-                            } else {
-                                schema = DbfFactory.getSchema(servletContext, DbfFactory.FacesSchema.FACES_23);
-                            }
-                        } else if ("2.2".equals(versionStr)) {
-                            if ("facelet-taglib".equals(documentElement.getLocalName())) {
-                                schema = DbfFactory.getSchema(servletContext, DbfFactory.FacesSchema.FACELET_TAGLIB_22);
-                            } else {
-                                schema = DbfFactory.getSchema(servletContext, DbfFactory.FacesSchema.FACES_22);
-                            }
-                        } else {
-                            throw new ConfigurationException("Unknown Schema version: " + versionStr);
-                        }
-                        DocumentBuilder builder = getBuilderForSchema(schema);
-                        if (builder.isValidating()) {
-                            builder.getSchema().newValidator().validate(domSource);
-                            returnDoc = ((Document) domSource.getNode());
-                        } else {
-                            returnDoc = ((Document) domSource.getNode());
-                        }
-                    } else {
+                Schema schema = null;
+                
+                if (isKnownNamespace(documentNS)) {
+                    Attr versionAttr = (Attr) documentElement.getAttributes().getNamedItem("version");
+                    if (versionAttr == null) {
                         // this shouldn't happen, but...
                         throw new ConfigurationException("No document version available.");
                     }
-                } else if (JAVAEE_SCHEMA_LEGACY_DEFAULT_NS.equals(documentNS)) {
-                    Attr version = (Attr)
-                            documentElement.getAttributes().getNamedItem("version");
-                    Schema schema;
-                    if (version != null) {
-                        String versionStr = version.getValue();
-                        if ("2.0".equals(versionStr)) {
-                            if ("facelet-taglib".equals(documentElement.getLocalName())) {
-                                schema = DbfFactory.getSchema(servletContext, DbfFactory.FacesSchema.FACELET_TAGLIB_20);
-                            } else {
-                                schema = DbfFactory.getSchema(servletContext, DbfFactory.FacesSchema.FACES_20);
-                            }
-                        } else if ("2.1".equals(versionStr)) {
-                            if ("facelet-taglib".equals(documentElement.getLocalName())) {
-                                schema = DbfFactory.getSchema(servletContext, DbfFactory.FacesSchema.FACELET_TAGLIB_20);
-                            } else {
-                                schema = DbfFactory.getSchema(servletContext, DbfFactory.FacesSchema.FACES_21);
-                            }
-                        } else if ("1.2".equals(versionStr)) {
-                            schema = DbfFactory.getSchema(servletContext, DbfFactory.FacesSchema.FACES_12);
-                        } else {
-                            throw new ConfigurationException("Unknown Schema version: " + versionStr);
-                        }
-                        DocumentBuilder builder = getBuilderForSchema(schema);
-                        if (builder.isValidating()) {
-                            builder.getSchema().newValidator().validate(domSource);
-                            returnDoc = ((Document) domSource.getNode());
-                        } else {
-                            returnDoc = ((Document) domSource.getNode());
-                        }
+                    String version = versionAttr.getValue();
+
+                    String schemaResourceName;
+                    if ("facelet-taglib".equals(documentElement.getLocalName())) {
+                        schemaResourceName = VERSION_FACES_SCHEMA_FACELET_TAGLIB_MAPPING.get(version);
                     } else {
-                        // this shouldn't happen, but...
-                        throw new ConfigurationException("No document version available.");
+                        schemaResourceName = VERSION_FACES_SCHEMA_FACES_MAPPING.get(version);
+                    }
+                    if (schemaResourceName == null) {
+                        throw new ConfigurationException("Unknown Schema version: " + version);
                     }
+                    
+                    schema = getSchema(schemaResourceName);
                 } else {
                     DOMResult domResult = new DOMResult();
                     Transformer transformer = getTransformer(documentNS);
@@ -1135,22 +1146,21 @@ public class ConfigManager {
                     ((Document) domResult.getNode())
                           .setDocumentURI(((Document) domSource
                                 .getNode()).getDocumentURI());
-                    Schema schemaToApply;
                     if (FACES_CONFIG_1_X_DEFAULT_NS.equals(documentNS)) {
-                        schemaToApply = DbfFactory.getSchema(servletContext, DbfFactory.FacesSchema.FACES_11);
+                        schema = DbfFactory.getSchema(servletContext, DbfFactory.FacesSchema.FACES_11);
                     } else if (FACELETS_1_0_DEFAULT_NS.equals(documentNS)) {
-                        schemaToApply = DbfFactory.getSchema(servletContext, DbfFactory.FacesSchema.FACELET_TAGLIB_20);
+                        schema = DbfFactory.getSchema(servletContext, DbfFactory.FacesSchema.FACELET_TAGLIB_20);
                     } else {
                         throw new IllegalStateException();
                     }
-                    DocumentBuilder builder = getBuilderForSchema(schemaToApply);
-                    if (builder.isValidating()) {
-                        builder.getSchema().newValidator().validate(new DOMSource(domResult.getNode()));
-                        returnDoc = (Document) domResult.getNode();
-                    } else {
-                        returnDoc = (Document) domResult.getNode();
-                    }
                 }
+
+                DocumentBuilder builder = getBuilderForSchema(schema);
+                if (builder.isValidating()) {
+                    builder.getSchema().newValidator().validate(domSource);
+                }
+
+                returnDoc = ((Document) domSource.getNode());
             } else {
                 returnDoc = doc;
             }
@@ -1164,7 +1174,53 @@ public class ConfigManager {
                 returnDoc.getDocumentElement().getAttributes().setNamedItem(webInf);
             }
             return returnDoc;
+        }
+
+        private Schema getSchema(String schemaResourceName) throws SAXException {
+            URL[] schemaResourceSource = jsfRIClassLoader.getURLs();
+            if (schemaResourceSource.length == 0) {
+                throw new IllegalArgumentException("Expected URLClassLoader to have only one entry");
+            }
+
+            String id = Stream.of(schemaResourceSource).map(URL::toString).collect(Collectors.joining("+"));
+            WeakReference<Schema> schema = SCHEMA_CACHE.get(id);
+            if (schema == null || schema.get() == null) {
+                SchemaFactory schemaFactory = SchemaFactory.newDefaultInstance();
+                schemaFactory.setResourceResolver(new LSResourceResolver() {
+                    @Override
+                    public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) {
+                        try {
+                            InputSource is = UserCatalog.getDefault().
+                                    getEntityResolver().
+                                    resolveEntity(publicId, systemId);
+                            if (is != null) {
+                                return new LSInputFromInputSource(is);
+                            }
+                        } catch (SAXException | IOException ex) {
+                            LOGGER.log(
+                                    Level.FINE,
+                                    "Failed to resolve namespaceURI: {}, publicId: {}, systemId: {}, baseURI: {}",
+                                    new Object[] {
+                                        namespaceURI,
+                                        publicId,
+                                        systemId,
+                                        baseURI
+                                    }
+                            );
+                        }
+                        return null;
+                    }
+                });
+                schema = new WeakReference<>(schemaFactory.newSchema(jsfRIClassLoader.getResource(schemaResourceName)));
+
+                SCHEMA_CACHE.put(id, schema);
+            }
 
+            return schema.get();
+        }
+
+        private boolean isKnownNamespace(String namespace) {
+            return Stream.of(JsfNamespaces.values()).map(value -> value.getNamespace(JsfNamespaces.Type.TAGLIB)).anyMatch(namespace::equals);
         }
 
         private boolean streamIsZeroLengthOrEmpty(InputStream is) throws IOException {
@@ -1320,4 +1376,96 @@ public class ConfigManager {
     } // END URITask
 
 
+    /**
+     * Helperclass to supply the SchemaFactory with XSDs from the NB catalog
+     */
+    private static class LSInputFromInputSource implements LSInput {
+
+        private final InputSource is;
+
+        public LSInputFromInputSource(InputSource is) {
+            this.is = is;
+        }
+
+        @Override
+        public Reader getCharacterStream() {
+            return is.getCharacterStream();
+        }
+
+        @Override
+        public void setCharacterStream(Reader characterStream) {
+        }
+
+        @Override
+        public InputStream getByteStream() {
+            return is.getByteStream();
+        }
+
+        @Override
+        public void setByteStream(InputStream byteStream) {
+        }
+
+        @Override
+        public String getStringData() {
+            try (Reader r = getCharacterStream()) {
+                if (r == null) {
+                    return null;
+                }
+                StringWriter sw = new StringWriter();
+                getCharacterStream().transferTo(sw);
+                return sw.toString();
+            } catch (IOException ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+
+        @Override
+        public void setStringData(String stringData) {
+        }
+
+        @Override
+        public String getSystemId() {
+            return is.getSystemId();
+        }
+
+        @Override
+        public void setSystemId(String systemId) {
+        }
+
+        @Override
+        public String getPublicId() {
+            return is.getPublicId();
+        }
+
+        @Override
+        public void setPublicId(String publicId) {
+        }
+
+        @Override
+        public String getBaseURI() {
+            return "";
+        }
+
+        @Override
+        public void setBaseURI(String baseURI) {
+        }
+
+        @Override
+        public String getEncoding() {
+            return is.getEncoding();
+        }
+
+        @Override
+        public void setEncoding(String encoding) {
+        }
+
+        @Override
+        public boolean getCertifiedText() {
+            return false;
+        }
+
+        @Override
+        public void setCertifiedText(boolean certifiedText) {
+        }
+    }
 }
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/mojarra/FaceletsTaglibConfigProcessor.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/mojarra/FaceletsTaglibConfigProcessor.java
index a919bd98b8..bf41a28cff 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/mojarra/FaceletsTaglibConfigProcessor.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/facelets/mojarra/FaceletsTaglibConfigProcessor.java
@@ -18,12 +18,10 @@
  */
 package org.netbeans.modules.web.jsf.editor.facelets.mojarra;
 
-import com.sun.faces.config.ConfigurationException;
 import org.netbeans.modules.web.jsf.editor.facelets.*;
 import com.sun.faces.config.DocumentInfo;
 import com.sun.faces.config.processor.AbstractConfigProcessor;
 import com.sun.faces.facelets.tag.TagLibraryImpl;
-import com.sun.faces.facelets.tag.jsf.CompositeComponentTagLibrary;
 import com.sun.faces.util.FacesLogger;
 import com.sun.faces.facelets.util.ReflectionUtil;
 import org.netbeans.modules.web.jsf.editor.facelets.FaceletsLibrarySupport.Compiler;
@@ -37,9 +35,13 @@ import java.text.MessageFormat;
 import java.net.URL;
 import java.net.MalformedURLException;
 import java.lang.reflect.Method;
+import java.util.LinkedHashSet;
+import java.util.Set;
 
 import javax.faces.FacesException;
 import javax.servlet.ServletContext;
+import org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo;
+import org.netbeans.modules.web.jsfapi.api.LibraryInfo;
 import org.w3c.dom.Document;
 
 /**
@@ -232,12 +234,6 @@ public class FaceletsTaglibConfigProcessor extends AbstractConfigProcessor {
                 processTagLibrary(sc, documentInfos[i], documentElement, namespace, compiler);
             }
         }
-
-//        try {
-//            invokeNext(sc, documentInfos);
-//        } catch (Exception e) {
-//            //ignore
-//        }
     }
 
     // --------------------------------------------------------- Private Methods
@@ -272,6 +268,11 @@ public class FaceletsTaglibConfigProcessor extends AbstractConfigProcessor {
                 }
             }
 
+            if (taglibNamespace == null && compositeLibraryName == null) {
+                LOGGER.log(Level.WARNING, "Could not find a valid namespace or composite library name! Skipping {0}", info.getSourceURI().toString()); //NOI18N
+                return;
+            }
+
             URL sourceUrl;
             try {
                 sourceUrl = info.getSourceURI().toURL();
@@ -282,9 +283,28 @@ public class FaceletsTaglibConfigProcessor extends AbstractConfigProcessor {
 
             NodeList tags = documentElement.getElementsByTagNameNS(namespace, TAG);
             NodeList functions = documentElement.getElementsByTagNameNS(namespace, FUNCTION);
+
+            Set<String> taglibNamespaces = new LinkedHashSet<>();
+            taglibNamespaces.add(taglibNamespace);
+
+            // Try to find all prior valid namespaces. This only works since namespaces are stored as
+            LibraryInfo libraryInfo = DefaultLibraryInfo.forNamespace(taglibNamespace);
+            if (libraryInfo != null) {
+                boolean found = false;
+                for (String validNamespace : libraryInfo.getValidNamespaces()) {
+                    if (validNamespace.equals(taglibNamespace)) {
+                        found = true;
+                        continue;
+                    }
+                    if (found) {
+                        taglibNamespaces.add(validNamespace);
+                    }
+                }
+            }
+
             FaceletsLibrary taglibrary = compositeLibraryName != null
-                    ? new CompositeComponentLibrary(support, compositeLibraryName, taglibNamespace, sourceUrl)
-                    : new FaceletsLibrary(support, taglibNamespace, sourceUrl);
+                    ? new CompositeComponentLibrary(support, compositeLibraryName, taglibNamespaces, sourceUrl)
+                    : new FaceletsLibrary(support, taglibNamespaces, sourceUrl);
 
             processTags(sc, documentElement, tags, taglibrary);
             processFunctions(sc, functions, taglibrary);
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/hints/FixLibDeclaration.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/hints/FixLibDeclaration.java
index 99b5dd75b3..f28c70ba63 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/hints/FixLibDeclaration.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/hints/FixLibDeclaration.java
@@ -34,29 +34,22 @@ public class FixLibDeclaration implements HintFix{
     private final String nsPrefix;
     private final Library lib;
     private final Document doc;
-    private final boolean isJsf22Plus;
 
-    public FixLibDeclaration(Document doc, String nsPrefix, Library lib, boolean isJsf22Plus) {
+    public FixLibDeclaration(Document doc, String nsPrefix, Library lib) {
         this.doc = doc;
         this.nsPrefix = nsPrefix;
         this.lib = lib;
-        this.isJsf22Plus = isJsf22Plus;
     }
 
     @Override
     public String getDescription() {
-        String namespace;
-        if (isJsf22Plus || lib.getLegacyNamespace() == null) {
-            namespace = lib.getNamespace();
-        } else {
-            namespace = lib.getLegacyNamespace();
-        }
+        String namespace = lib.getNamespace();
         return NbBundle.getMessage(FixLibDeclaration.class, "MSG_FixLibDeclaration", nsPrefix, namespace); //NOI18N
     }
 
     @Override
     public void implement() throws Exception {
-        LibraryUtils.importLibrary(doc, lib, nsPrefix, isJsf22Plus);
+        LibraryUtils.importLibrary(doc, lib, nsPrefix);
     }
 
     @Override
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/hints/LibraryDeclarationChecker.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/hints/LibraryDeclarationChecker.java
index d3a18e26a7..011d7ac5cc 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/hints/LibraryDeclarationChecker.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/hints/LibraryDeclarationChecker.java
@@ -26,9 +26,12 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
+import static java.util.function.Predicate.not;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import java.util.stream.Collectors;
 import javax.swing.text.BadLocationException;
 import org.netbeans.api.lexer.Language;
 import org.netbeans.api.lexer.TokenHierarchy;
@@ -114,8 +117,13 @@ public class LibraryDeclarationChecker extends HintsProvider {
         final Map<String, Attribute> namespace2Attribute = new HashMap<>();
         Node root = result.root();
         if (root.children().isEmpty()) {
-            Node faceletsRoot = result.root(DefaultLibraryInfo.FACELETS.getLegacyNamespace());
-            root = !faceletsRoot.children().isEmpty() ? faceletsRoot : result.root(DefaultLibraryInfo.FACELETS.getNamespace());
+            root = DefaultLibraryInfo.FACELETS.getValidNamespaces().stream()
+                    .filter(not(DefaultLibraryInfo.FACELETS.getNamespace()::equals))
+                    .map(result::root)
+                    .filter(Objects::nonNull)
+                    .filter(node -> node.children().isEmpty())
+                    .findFirst()
+                    .orElse(result.root(DefaultLibraryInfo.FACELETS.getNamespace()));
         }
         final CharSequence docText = getSourceText(snapshot.getSource());
         final String jsfNsPrefix = NamespaceUtils.getForNs(result.getNamespaces(), DefaultLibraryInfo.JSF.getNamespace());
@@ -129,21 +137,17 @@ public class LibraryDeclarationChecker extends HintsProvider {
             public void visit(Element node) {
                 OpenTag openTag = (OpenTag)node;
                 //put all NS attributes to the namespace2Attribute map for #1 and check usage of jsf: prefixes.
-                Collection<Attribute> nsAttrs = openTag.attributes(new AttributeFilter() {
-
-                    @Override
-                    public boolean accepts(Attribute attribute) {
-                        if(attribute.unquotedValue() == null) {
-                            return false;
-                        }
-                        CharSequence nsPrefix = attribute.namespacePrefix();
-                        if(nsPrefix == null) {
-                            return false;
-                        }
-                        
-                        return LexerUtils.equals("xmlns", nsPrefix, true, true) //NOI18N
-                                || jsfNsPrefix != null && LexerUtils.equals(jsfNsPrefix, nsPrefix, true, true);
+                Collection<Attribute> nsAttrs = openTag.attributes(attribute ->  {
+                    if(attribute.unquotedValue() == null) {
+                        return false;
                     }
+                    CharSequence nsPrefix = attribute.namespacePrefix();
+                    if(nsPrefix == null) {
+                        return false;
+                    }
+
+                    return LexerUtils.equals("xmlns", nsPrefix, true, true) //NOI18N
+                            || jsfNsPrefix != null && LexerUtils.equals(jsfNsPrefix, nsPrefix, true, true);
                 });
                 
                 for (Attribute attr : nsAttrs) {
@@ -175,7 +179,7 @@ public class LibraryDeclarationChecker extends HintsProvider {
                     List<HintFix> fixes = new ArrayList<>();
                     Set<Library> libs = getLibsByPrefixes(context, getUndeclaredNamespaces(undeclaredNodes));
                     for (Library lib : libs) {
-                        FixLibDeclaration fix = new FixLibDeclaration(context.doc, lib.getDefaultPrefix(), lib, jsfSupport.isJsf22Plus());
+                        FixLibDeclaration fix = new FixLibDeclaration(context.doc, lib.getDefaultPrefix(), lib);
                         fixes.add(fix);
                     }
 
@@ -213,7 +217,7 @@ public class LibraryDeclarationChecker extends HintsProvider {
             if (lib != null) {
                 // http://java.sun.com/jsf/passthrough usage needs to be resolved on base of all declared libraries
                 if (!(DefaultLibraryInfo.PASSTHROUGH.getNamespace().equals(lib.getNamespace())
-                        || DefaultLibraryInfo.PASSTHROUGH.getLegacyNamespace().equals(lib.getNamespace()))) {
+                        || DefaultLibraryInfo.PASSTHROUGH.getValidNamespaces().contains(lib.getNamespace()))) {
                     declaredLibraries.add(lib);
                 }
             } else {
@@ -238,43 +242,45 @@ public class LibraryDeclarationChecker extends HintsProvider {
             final boolean[] passthroughUsage = new boolean[1];
             final Collection<OffsetRange> ranges = new ArrayList<>();
             for (Library lib : declaredLibraries) {
-                Node rootNode = result.root(lib.getNamespace());
-                if (lib.getLegacyNamespace() != null && (rootNode == null || rootNode.children().isEmpty())) {
-                    rootNode = result.root(lib.getLegacyNamespace());
-                }
-                if (rootNode == null) {
+                List<Node> nodes = lib.getValidNamespaces().stream()
+                        .map(result::root)
+                        .filter(Objects::nonNull)
+                        .collect(Collectors.toList());
+                if (nodes.isEmpty()) {
                     continue; //no parse result for this namespace, the namespace is not declared
                 }
                 final int[] usages = new int[1];
-                ElementUtils.visitChildren(rootNode, new ElementVisitor() {
-                    @Override
-                    public void visit(Element node) {
-                        usages[0]++;
-                        if (declaredPassthroughOrJsf) {
-                            OpenTag ot = (OpenTag) node;
-                            for (Attribute attribute : ot.attributes(new AttributeFilter() {
-                                @Override
-                                public boolean accepts(Attribute attribute) {
-                                    return attribute.namespacePrefix() != null;
-                                }
-                            })) {
-                                if (passthroughNsPrefix != null && LexerUtils.equals(passthroughNsPrefix, attribute.namespacePrefix(), true, true)) {
-                                    // http://java.sun.com/jsf/passthrough or http://xmlns.jcp.org/jsf/passthrough used
-                                    passthroughUsage[0] = true;
-                                } else if (jsfNsPrefix != null && ot.namespacePrefix() != null
-                                        && LexerUtils.equals(jsfNsPrefix, attribute.namespacePrefix(), true, true)) {
-                                    // http://java.sun.com/jsf used at JSF-aware tag
-                                    wrongJsfNsUsages.add(attribute);
+                for (Node rootNode : nodes) {
+                    ElementUtils.visitChildren(rootNode, new ElementVisitor() {
+                        @Override
+                        public void visit(Element node) {
+                            usages[0]++;
+                            if (declaredPassthroughOrJsf) {
+                                OpenTag ot = (OpenTag) node;
+                                for (Attribute attribute : ot.attributes(new AttributeFilter() {
+                                    @Override
+                                    public boolean accepts(Attribute attribute) {
+                                        return attribute.namespacePrefix() != null;
+                                    }
+                                })) {
+                                    if (passthroughNsPrefix != null && LexerUtils.equals(passthroughNsPrefix, attribute.namespacePrefix(), true, true)) {
+                                        // http://java.sun.com/jsf/passthrough or http://xmlns.jcp.org/jsf/passthrough used
+                                        passthroughUsage[0] = true;
+                                    } else if (jsfNsPrefix != null && ot.namespacePrefix() != null
+                                            && LexerUtils.equals(jsfNsPrefix, attribute.namespacePrefix(), true, true)) {
+                                        // http://java.sun.com/jsf used at JSF-aware tag
+                                        wrongJsfNsUsages.add(attribute);
+                                    }
                                 }
                             }
                         }
-                    }
-                }, ElementType.OPEN_TAG);
+                    }, ElementType.OPEN_TAG);
+                }
 
                 usages[0] += isFunctionLibraryPrefixUsedInEL(context, lib, docText) ? 1 : 0;
 
                 // http://java.sun.com/jsf namespace handling
-                usages[0] += (DefaultLibraryInfo.JSF.getNamespace().equals(lib.getNamespace()) || DefaultLibraryInfo.JSF.getLegacyNamespace().equals(lib.getNamespace())) && jsfUsage[0] ? 1 : 0;
+                usages[0] += DefaultLibraryInfo.JSF.getValidNamespaces().contains(lib.getNamespace()) && jsfUsage[0] ? 1 : 0;
 
                 if (usages[0] == 0) {
                     //unused declaration
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/index/CompositeComponentModel.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/index/CompositeComponentModel.java
index c1962c7756..8844e03211 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/index/CompositeComponentModel.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/index/CompositeComponentModel.java
@@ -26,6 +26,8 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.StringTokenizer;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.logging.Level;
@@ -40,6 +42,8 @@ import org.netbeans.modules.parsing.spi.indexing.support.IndexDocument;
 import org.netbeans.modules.parsing.spi.indexing.support.IndexResult;
 import org.netbeans.modules.web.api.webmodule.WebModule;
 import org.netbeans.modules.web.common.api.LexerUtils;
+import org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.jsfapi.spi.LibraryUtils;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
@@ -50,24 +54,6 @@ import org.openide.filesystems.FileUtil;
  */
 public class CompositeComponentModel extends JsfPageModel {
 
-//    private static enum MavenProjectStandartDirectories {
-//        
-//        SOURCES("src/main/java"), //NOI18N
-//        RESOURCES("src/main/resources"), //NOI18N
-//        CONFIG("src/main/config"), //NOI18N
-//        WEBAPP("src/main/webapp"); //NOI18N
-//        
-//        private String path;
-//
-//        private MavenProjectStandartDirectories(String path) {
-//            this.path = path;
-//        }
-//        
-//        public String getPath() {
-//            return path;
-//        }
-//        
-//    }
     private static final Logger LOGGER = Logger.getLogger(CompositeComponentModel.class.getSimpleName());
     
     //index keys
@@ -205,7 +191,7 @@ public class CompositeComponentModel extends JsfPageModel {
         dsb.append(encode(interfaceShortDescription != null ? interfaceShortDescription : NOT_AVAILABLE_VALUE));
         document.addPair(INTERFACE_DESCRIPTION_KEY, dsb.toString(), false, true);
 
-        return LibraryUtils.getCompositeLibraryURL(libraryName, true); // the return value looks to be used nowhere
+        return LibraryUtils.getCompositeLibraryURL(libraryName, JsfVersion.JSF_4_0); // the return value looks to be used nowhere
     }
 
     private String getLibraryPath() {
@@ -278,18 +264,6 @@ public class CompositeComponentModel extends JsfPageModel {
             folder = folder.getParent();
         } while (folder != null);
 
-
-//        //look into the standart maven project locations
-//        //src/main/webapp is covered by the 
-//        Project project = FileOwnerQuery.getOwner(file);
-//        if(project != null) {
-//            FileObject projectRoot = project.getProjectDirectory();
-//            FileObject resources = projectRoot.getFileObject("src/main/resources");
-//            if(FileUtil.isParentOf(resources, file)) {
-//                return resources;
-//            }
-//        }
-//        
         return null;
     }
 
@@ -302,13 +276,16 @@ public class CompositeComponentModel extends JsfPageModel {
 
         @Override
         public JsfPageModel getModel(HtmlParserResult result) {
-            Node node = result.root(LibraryUtils.COMPOSITE_LIBRARY_NS);
-            if (node == null || node.children().isEmpty()) {
-                node = result.root(LibraryUtils.COMPOSITE_LIBRARY_LEGACY_NS);
-            }
-            if (node == null) {
+            Optional<Node> compositeLibraryNode = DefaultLibraryInfo.COMPOSITE.getValidNamespaces().stream()
+                    .map(result::root)
+                    .filter(Objects::nonNull)
+                    .filter(node -> !node.children().isEmpty())
+                    .findFirst();
+
+            if (compositeLibraryNode.isEmpty()) {
                 return null; //no composite library declaration
             }
+            Node node = compositeLibraryNode.get();
             FileObject file = result.getSnapshot().getSource().getFileObject();
 
             //check whether the file lies in appropriate library folder
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/index/JsfIndex.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/index/JsfIndex.java
index c542d87ebe..9d91786539 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/index/JsfIndex.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/index/JsfIndex.java
@@ -25,6 +25,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import javax.swing.event.ChangeListener;
 import org.netbeans.api.java.classpath.ClassPath;
@@ -117,7 +118,7 @@ public class JsfIndex {
 
     // --------------- BOTH EMBEDDING && BINARY INDEXES ------------------
     public Collection<String> getAllCompositeLibraryNames() {
-        Collection<String> col = new ArrayList<>();
+        Collection<String> col = new LinkedHashSet<>();
         try {
             //aggregate data from both indexes
             col.addAll(getAllCompositeLibraryNames(createBinaryIndex()));
diff --git a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/index/ResourcesMappingModel.java b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/index/ResourcesMappingModel.java
index 50dcd98627..05cd10e075 100644
--- a/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/index/ResourcesMappingModel.java
+++ b/enterprise/web.jsf.editor/src/org/netbeans/modules/web/jsf/editor/index/ResourcesMappingModel.java
@@ -174,10 +174,10 @@ public class ResourcesMappingModel extends JsfPageModel {
 
         private Collection<Resource> getResourcesDefinedByJsfComponents(HtmlParserResult result) {
             final List<Resource> resources = new ArrayList<>();
-            Node node = result.root(DefaultLibraryInfo.HTML.getNamespace());
-            if (node == null || node.children().isEmpty()) {
-                node = result.root(DefaultLibraryInfo.HTML.getLegacyNamespace());
-            }
+            Node node = DefaultLibraryInfo.HTML.getValidNamespaces().stream()
+                    .map(result::root)
+                    .findFirst()
+                    .orElse(null);
             if (node == null || node.children().isEmpty()) {
                 return resources; //no HTML Basic component in the page
             }
diff --git a/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrarySupportTest.java b/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrarySupportTest.java
index 13f92d8653..d030f5e4f0 100644
--- a/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrarySupportTest.java
+++ b/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrarySupportTest.java
@@ -66,7 +66,7 @@ public class FaceletsLibrarySupportTest extends TestBaseForTestProject {
     public void testCompositeComponentLibraryWithoutDescriptor() {
         JsfSupportImpl instance = getJsfSupportImpl();
 
-        String ezCompLibraryNS = LibraryUtils.getCompositeLibraryURL("ezcomp", instance.isJsf22Plus());
+        String ezCompLibraryNS = LibraryUtils.getCompositeLibraryURL("ezcomp", instance.getJsfVersion());
 
         Library ezcompLib = instance.getLibrary(ezCompLibraryNS);
         assertNotNull(String.format("Library %s not found!", ezCompLibraryNS), ezcompLib);
@@ -115,7 +115,7 @@ public class FaceletsLibrarySupportTest extends TestBaseForTestProject {
         assertEquals("ezcomp2", ezcompLib.getDefaultPrefix());
         assertSame(LibraryType.COMPOSITE, ezcompLib.getType());
 
-        String ezCompLibraryDefaultNS = LibraryUtils.getCompositeLibraryURL("ezcomp2", instance.isJsf22Plus());
+        String ezCompLibraryDefaultNS = LibraryUtils.getCompositeLibraryURL("ezcomp2", instance.getJsfVersion());
         assertEquals(ezCompLibraryDefaultNS, ezcompLib.getDefaultNamespace());
         assertEquals(ezCompLibraryNS, ezcompLib.getNamespace());
         Tag t = cclib.getLibraryDescriptor().getTags().get("test");
@@ -201,7 +201,7 @@ public class FaceletsLibrarySupportTest extends TestBaseForTestProject {
 
 //        debugLibraries(instance);
 
-        String libNs = LibraryUtils.getCompositeLibraryURL("cclib", instance.isJsf22Plus());
+        String libNs = LibraryUtils.getCompositeLibraryURL("cclib", instance.getJsfVersion());
 
         Library lib = instance.getLibrary(libNs);
         assertNotNull(String.format("Library %s not found!", libNs), lib);
@@ -240,7 +240,7 @@ public class FaceletsLibrarySupportTest extends TestBaseForTestProject {
         assertEquals("cclib2", lib.getDefaultPrefix());
         assertSame(LibraryType.COMPOSITE, lib.getType());
 
-        String ezCompLibraryDefaultNS = LibraryUtils.getCompositeLibraryURL("cclib2", instance.isJsf22Plus());
+        String ezCompLibraryDefaultNS = LibraryUtils.getCompositeLibraryURL("cclib2", instance.getJsfVersion());
         assertEquals(ezCompLibraryDefaultNS, lib.getDefaultNamespace());
         assertEquals(libNs, lib.getNamespace());
         Tag t = cclib.getLibraryDescriptor().getTags().get("cc2");
diff --git a/enterprise/web.jsf.icefaces/nbproject/project.xml b/enterprise/web.jsf.icefaces/nbproject/project.xml
index af3ac4c3c8..fd6a131b99 100644
--- a/enterprise/web.jsf.icefaces/nbproject/project.xml
+++ b/enterprise/web.jsf.icefaces/nbproject/project.xml
@@ -110,8 +110,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.44</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
@@ -119,8 +119,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.17</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/enterprise/web.jsf.icefaces/src/org/netbeans/modules/web/jsf/icefaces/Icefaces2Implementation.java b/enterprise/web.jsf.icefaces/src/org/netbeans/modules/web/jsf/icefaces/Icefaces2Implementation.java
index d8383b81b8..605a820cd4 100644
--- a/enterprise/web.jsf.icefaces/src/org/netbeans/modules/web/jsf/icefaces/Icefaces2Implementation.java
+++ b/enterprise/web.jsf.icefaces/src/org/netbeans/modules/web/jsf/icefaces/Icefaces2Implementation.java
@@ -32,10 +32,10 @@ import org.netbeans.modules.j2ee.dd.api.web.DDProvider;
 import org.netbeans.modules.j2ee.dd.api.web.WebApp;
 import org.netbeans.modules.web.api.webmodule.WebModule;
 import org.netbeans.modules.web.jsf.api.JsfComponentUtils;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
 import org.netbeans.modules.web.jsf.icefaces.ui.Icefaces2CustomizerPanelVisual;
 import org.netbeans.modules.web.jsf.spi.components.JsfComponentCustomizer;
 import org.netbeans.modules.web.jsf.spi.components.JsfComponentImplementation;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
 import org.openide.loaders.DataFolder;
@@ -213,8 +213,8 @@ public class Icefaces2Implementation implements JsfComponentImplementation {
     }
 
     @Override
-    public Set<JSFVersion> getJsfVersion() {
-        return EnumSet.of(JSFVersion.JSF_2_0, JSFVersion.JSF_2_1, JSFVersion.JSF_2_2);
+    public Set<JsfVersion> getJsfVersion() {
+        return EnumSet.of(JsfVersion.JSF_2_0, JsfVersion.JSF_2_1, JsfVersion.JSF_2_2);
     }
 
     @Override
diff --git a/enterprise/web.jsf.kit/nbproject/project.xml b/enterprise/web.jsf.kit/nbproject/project.xml
index 6b903f3c0e..83b6f2d9cd 100644
--- a/enterprise/web.jsf.kit/nbproject/project.xml
+++ b/enterprise/web.jsf.kit/nbproject/project.xml
@@ -34,8 +34,8 @@
                 <dependency>
                     <code-name-base>org.netbeans.modules.web.jsf</code-name-base>
                     <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.51</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/enterprise/web.jsf.navigation/nbproject/project.xml b/enterprise/web.jsf.navigation/nbproject/project.xml
index b9b624ab24..53d4a70c3d 100644
--- a/enterprise/web.jsf.navigation/nbproject/project.xml
+++ b/enterprise/web.jsf.navigation/nbproject/project.xml
@@ -108,8 +108,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.6.0.1.1</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/enterprise/web.jsf.richfaces/nbproject/project.xml b/enterprise/web.jsf.richfaces/nbproject/project.xml
index 3c3cb60f22..34d323be5a 100644
--- a/enterprise/web.jsf.richfaces/nbproject/project.xml
+++ b/enterprise/web.jsf.richfaces/nbproject/project.xml
@@ -101,8 +101,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.44</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
@@ -110,8 +110,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.14</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/enterprise/web.jsf.richfaces/src/org/netbeans/modules/web/jsf/richfaces/Richfaces4Implementation.java b/enterprise/web.jsf.richfaces/src/org/netbeans/modules/web/jsf/richfaces/Richfaces4Implementation.java
index 714d67cfdc..ecf9bc95a7 100644
--- a/enterprise/web.jsf.richfaces/src/org/netbeans/modules/web/jsf/richfaces/Richfaces4Implementation.java
+++ b/enterprise/web.jsf.richfaces/src/org/netbeans/modules/web/jsf/richfaces/Richfaces4Implementation.java
@@ -29,10 +29,10 @@ import org.netbeans.api.project.libraries.Library;
 import org.netbeans.api.project.libraries.LibraryManager;
 import org.netbeans.modules.web.api.webmodule.WebModule;
 import org.netbeans.modules.web.jsf.api.JsfComponentUtils;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
 import org.netbeans.modules.web.jsf.richfaces.ui.Richfaces4CustomizerPanelVisual;
 import org.netbeans.modules.web.jsf.spi.components.JsfComponentCustomizer;
 import org.netbeans.modules.web.jsf.spi.components.JsfComponentImplementation;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
 import org.openide.loaders.DataFolder;
@@ -208,8 +208,8 @@ public class Richfaces4Implementation implements JsfComponentImplementation {
     }
 
     @Override
-    public Set<JSFVersion> getJsfVersion() {
-        return EnumSet.of(JSFVersion.JSF_2_0, JSFVersion.JSF_2_1, JSFVersion.JSF_2_2);
+    public Set<JsfVersion> getJsfVersion() {
+        return EnumSet.of(JsfVersion.JSF_2_0, JsfVersion.JSF_2_1, JsfVersion.JSF_2_2);
     }
 
     @Override
diff --git a/enterprise/web.jsf/manifest.mf b/enterprise/web.jsf/manifest.mf
index 1a1da359e2..b06f43dc0e 100644
--- a/enterprise/web.jsf/manifest.mf
+++ b/enterprise/web.jsf/manifest.mf
@@ -1,5 +1,5 @@
 Manifest-Version: 1.0
-OpenIDE-Module: org.netbeans.modules.web.jsf/1
+OpenIDE-Module: org.netbeans.modules.web.jsf/2
 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/web/jsf/resources/Bundle.properties
 OpenIDE-Module-Layer: org/netbeans/modules/web/jsf/resources/layer.xml
 OpenIDE-Module-Implementation-Version: 3
diff --git a/enterprise/web.jsf/nbproject/org-netbeans-modules-web-jsf.sig b/enterprise/web.jsf/nbproject/org-netbeans-modules-web-jsf.sig
index 343237987c..6805d13ad7 100644
--- a/enterprise/web.jsf/nbproject/org-netbeans-modules-web-jsf.sig
+++ b/enterprise/web.jsf/nbproject/org-netbeans-modules-web-jsf.sig
@@ -1,5 +1,5 @@
 #Signature file v4.1
-#Version 1.89.0
+#Version 2.0
 
 CLSS public abstract interface java.beans.PropertyChangeListener
 intf java.util.EventListener
@@ -122,9 +122,9 @@ intf org.netbeans.modules.web.jsfapi.api.Library
 meth public java.lang.String getDefaultNamespace()
 meth public java.lang.String getDefaultPrefix()
 meth public java.lang.String getDisplayName()
-meth public java.lang.String getLegacyNamespace()
 meth public java.lang.String getNamespace()
 meth public java.util.Collection<? extends org.netbeans.modules.web.jsfapi.api.LibraryComponent> getComponents()
+meth public java.util.Set<java.lang.String> getValidNamespaces()
 meth public org.netbeans.modules.web.jsfapi.api.LibraryComponent getComponent(java.lang.String)
 meth public org.netbeans.modules.web.jsfapi.api.LibraryType getType()
 meth public void addComponent(org.netbeans.modules.web.jsfapi.api.LibraryComponent)
@@ -917,7 +917,7 @@ CLSS public abstract interface org.netbeans.modules.web.jsf.api.facesmodel.JSFCo
 intf org.netbeans.modules.xml.xam.dom.DocumentModel<org.netbeans.modules.web.jsf.api.facesmodel.JSFConfigComponent>
 meth public abstract org.netbeans.modules.web.jsf.api.facesmodel.FacesConfig getRootComponent()
 meth public abstract org.netbeans.modules.web.jsf.api.facesmodel.JSFConfigComponentFactory getFactory()
-meth public abstract org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion getVersion()
+meth public abstract org.netbeans.modules.web.jsfapi.api.JsfVersion getVersion()
 
 CLSS public org.netbeans.modules.web.jsf.api.facesmodel.JSFConfigModelFactory
 meth protected org.netbeans.modules.web.jsf.api.facesmodel.JSFConfigModel createModel(org.netbeans.modules.xml.xam.ModelSource)
@@ -1119,41 +1119,27 @@ meth public void visit(org.netbeans.modules.web.jsf.api.facesmodel.ViewParam)
 meth public void visit(org.netbeans.modules.web.jsf.api.facesmodel.VisitContextFactory)
 supr java.lang.Object
 
-CLSS public final !enum org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion
-fld public final static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion JSF_1_0
-fld public final static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion JSF_1_1
-fld public final static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion JSF_1_2
-fld public final static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion JSF_2_0
-fld public final static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion JSF_2_1
-fld public final static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion JSF_2_2
-fld public final static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion JSF_2_3
-fld public final static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion JSF_3_0
-fld public final static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion JSF_4_0
-meth public boolean isAtLeast(org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion)
- anno 1 org.netbeans.api.annotations.common.NonNull()
-meth public java.lang.String getShortName()
-meth public static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion forClasspath(java.util.Collection<java.io.File>)
+CLSS public final org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils
+meth public static org.netbeans.modules.web.jsfapi.api.JsfVersion forClasspath(java.util.Collection<java.io.File>)
  anno 0 org.netbeans.api.annotations.common.CheckForNull()
  anno 1 org.netbeans.api.annotations.common.NonNull()
-meth public static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion forClasspath(java.util.List<java.net.URL>)
+meth public static org.netbeans.modules.web.jsfapi.api.JsfVersion forClasspath(java.util.List<java.net.URL>)
  anno 0 org.netbeans.api.annotations.common.CheckForNull()
  anno 1 org.netbeans.api.annotations.common.NonNull()
-meth public static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion forProject(org.netbeans.api.project.Project)
+meth public static org.netbeans.modules.web.jsfapi.api.JsfVersion forProject(org.netbeans.api.project.Project)
  anno 0 org.netbeans.api.annotations.common.CheckForNull()
  anno 1 org.netbeans.api.annotations.common.NonNull()
-meth public static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion forServerLibrary(org.netbeans.modules.j2ee.deployment.plugins.api.ServerLibrary)
+meth public static org.netbeans.modules.web.jsfapi.api.JsfVersion forServerLibrary(org.netbeans.modules.j2ee.deployment.plugins.api.ServerLibrary)
  anno 0 org.netbeans.api.annotations.common.CheckForNull()
  anno 1 org.netbeans.api.annotations.common.NonNull()
-meth public static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion forWebModule(org.netbeans.modules.web.api.webmodule.WebModule)
+meth public static org.netbeans.modules.web.jsfapi.api.JsfVersion forWebModule(org.netbeans.modules.web.api.webmodule.WebModule)
  anno 0 org.netbeans.api.annotations.common.CheckForNull()
  anno 1 org.netbeans.api.annotations.common.NonNull()
-meth public static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion get(org.netbeans.modules.web.api.webmodule.WebModule,boolean)
+meth public static org.netbeans.modules.web.jsfapi.api.JsfVersion get(org.netbeans.modules.web.api.webmodule.WebModule,boolean)
  anno 0 org.netbeans.api.annotations.common.CheckForNull()
  anno 1 org.netbeans.api.annotations.common.NonNull()
-meth public static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion valueOf(java.lang.String)
-meth public static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion[] values()
-supr java.lang.Enum<org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion>
-hfds LOG,RP,SPECIFIC_CLASS_NAMES,projectListenerCache,projectVersionCache,shortName
+supr java.lang.Object
+hfds LOG,SPECIFIC_CLASS_NAMES,projectListenerCache,projectVersionCache
 
 CLSS public abstract interface org.netbeans.modules.web.jsf.api.facesmodel.LangAttribute
 fld public final static java.lang.String LANG_ATTRIBUTE
@@ -1656,7 +1642,7 @@ meth public abstract java.lang.String getDisplayName()
  anno 0 org.netbeans.api.annotations.common.NonNull()
 meth public abstract java.lang.String getName()
  anno 0 org.netbeans.api.annotations.common.NonNull()
-meth public abstract java.util.Set<org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion> getJsfVersion()
+meth public abstract java.util.Set<org.netbeans.modules.web.jsfapi.api.JsfVersion> getJsfVersion()
  anno 0 org.netbeans.api.annotations.common.NonNull()
 meth public abstract java.util.Set<org.openide.filesystems.FileObject> extend(org.netbeans.modules.web.api.webmodule.WebModule,org.netbeans.modules.web.jsf.spi.components.JsfComponentCustomizer)
  anno 0 org.netbeans.api.annotations.common.NonNull()
@@ -1697,9 +1683,8 @@ meth public abstract org.netbeans.modules.web.jsfapi.api.Tag getTag()
 CLSS public abstract interface org.netbeans.modules.web.jsfapi.api.LibraryInfo
 meth public abstract java.lang.String getDefaultPrefix()
 meth public abstract java.lang.String getDisplayName()
-meth public abstract java.lang.String getLegacyNamespace()
- anno 0 org.netbeans.api.annotations.common.CheckForNull()
 meth public abstract java.lang.String getNamespace()
+meth public abstract java.util.Set<java.lang.String> getValidNamespaces()
 
 CLSS public abstract org.netbeans.modules.xml.xam.AbstractModelFactory<%0 extends org.netbeans.modules.xml.xam.Model>
 cons public init()
diff --git a/enterprise/web.jsf/nbproject/project.properties b/enterprise/web.jsf/nbproject/project.properties
index bee0dcbbc0..6485977d0d 100644
--- a/enterprise/web.jsf/nbproject/project.properties
+++ b/enterprise/web.jsf/nbproject/project.properties
@@ -17,10 +17,17 @@
 
 javac.compilerargs=-Xlint -Xlint:-serial
 javac.source=1.8
-spec.version.base=1.90.0
+spec.version.base=2.0
+
+test.config.default.excludes=\
+**/JSFEditorUtilitiesTest.class,\
+**/AnnotationsTest.class,\
+**/JarXmlModelTest.class,\
+**/SeveralXmlModelTest.class
 
 test.config.stable.includes=\
 **/JSFSupportSuite.class
+
 test.config.stableBTD.includes=**/*Test.class
 test.config.stableBTD.excludes=\
     org/netbeans/test/**/*,\
diff --git a/enterprise/web.jsf/nbproject/project.xml b/enterprise/web.jsf/nbproject/project.xml
index f7dcc46e22..8d2386c677 100644
--- a/enterprise/web.jsf/nbproject/project.xml
+++ b/enterprise/web.jsf/nbproject/project.xml
@@ -482,8 +482,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.27</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFCatalog.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFCatalog.java
index 30637b5809..83cb1278b9 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFCatalog.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFCatalog.java
@@ -23,9 +23,8 @@ package org.netbeans.modules.web.jsf;
 import java.util.List;
 import java.util.ArrayList;
 
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.xml.catalog.spi.*;
-import org.openide.util.ImageUtilities;
 import org.openide.util.NbBundle;
 import org.w3c.dom.Document;
 import org.w3c.dom.DocumentType;
@@ -311,30 +310,30 @@ public class JSFCatalog implements CatalogReader, CatalogDescriptor2, org.xml.sa
         return null;
     }
 
-    public static JSFVersion extractVersion(Document document) {
+    public static JsfVersion extractVersion(Document document) {
         // first check the doc type to see if there is one
         DocumentType dt = document.getDoctype();
-        JSFVersion value = JSFVersion.JSF_1_0;
+        JsfVersion value = JsfVersion.JSF_1_0;
         // This is the default version
         if (dt != null) {
             if (JSF_ID_1_0.equals(dt.getPublicId())) {
-                value = JSFVersion.JSF_1_0;
+                value = JsfVersion.JSF_1_0;
             } else if (JSF_ID_1_1.equals(dt.getPublicId())) {
-                value = JSFVersion.JSF_1_1;
+                value = JsfVersion.JSF_1_1;
             } else if (JSF_ID_1_2.equals(dt.getPublicId())) {
-                value = JSFVersion.JSF_1_2;
+                value = JsfVersion.JSF_1_2;
             } else if (JSF_ID_2_0.equals(dt.getPublicId())) {
-                value = JSFVersion.JSF_2_0;
+                value = JsfVersion.JSF_2_0;
             } else if (JSF_ID_2_1.equals(dt.getPublicId())) {
-                value = JSFVersion.JSF_2_1;
+                value = JsfVersion.JSF_2_1;
             } else if (JSF_ID_2_2.equals(dt.getPublicId())) {
-                value = JSFVersion.JSF_2_2;
+                value = JsfVersion.JSF_2_2;
             } else if (JSF_ID_2_3.equals(dt.getPublicId())) {
-                value = JSFVersion.JSF_2_3;
+                value = JsfVersion.JSF_2_3;
             } else if (JSF_ID_3_0.equals(dt.getPublicId())) {
-                value = JSFVersion.JSF_3_0;
+                value = JsfVersion.JSF_3_0;
             }else if (JSF_ID_4_0.equals(dt.getPublicId())) {
-                value = JSFVersion.JSF_4_0;
+                value = JsfVersion.JSF_4_0;
             }
         }
         return value;
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFFrameworkProvider.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFFrameworkProvider.java
index 299bc584e2..3f90ced55d 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFFrameworkProvider.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFFrameworkProvider.java
@@ -67,13 +67,14 @@ import org.netbeans.modules.web.jsf.api.JsfComponentUtils;
 import org.netbeans.modules.web.jsf.api.facesmodel.Application;
 import org.netbeans.modules.web.jsf.api.facesmodel.FacesConfig;
 import org.netbeans.modules.web.jsf.api.facesmodel.JSFConfigModel;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
 import org.netbeans.modules.web.jsf.api.facesmodel.ViewHandler;
 import org.netbeans.modules.web.jsf.palette.JSFPaletteUtilities;
 import org.netbeans.modules.web.jsf.spi.components.JsfComponentCustomizer;
 import org.netbeans.modules.web.jsf.spi.components.JsfComponentImplementation;
 import org.netbeans.modules.web.jsf.wizards.JSFConfigurationPanel;
 import org.netbeans.modules.web.jsf.wizards.JSFConfigurationPanel.PreferredLanguage;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.project.api.WebPropertyEvaluator;
 import org.netbeans.modules.web.spi.webmodule.WebFrameworkProvider;
 import org.netbeans.modules.web.spi.webmodule.WebModuleExtender;
@@ -420,15 +421,15 @@ public class JSFFrameworkProvider extends WebFrameworkProvider {
                 jsfLibrary = LibraryManager.getDefault().getLibrary(panel.getNewLibraryName());
             }
 
-            JSFVersion jsfVersion;
+            JsfVersion jsfVersion;
             if (jsfLibrary != null) {
                 List<URL> content = jsfLibrary.getContent("classpath"); //NOI18N
-                jsfVersion = JSFVersion.forClasspath(content);
+                jsfVersion = JsfVersionUtils.forClasspath(content);
             } else {
                 if (panel.getLibraryType() == JSFConfigurationPanel.LibraryType.SERVER && panel.getServerLibrary() != null) {
-                    jsfVersion = JSFVersion.forServerLibrary(panel.getServerLibrary());
+                    jsfVersion = JsfVersionUtils.forServerLibrary(panel.getServerLibrary());
                 } else {
-                    jsfVersion = JSFVersion.forWebModule(webModule);
+                    jsfVersion = JsfVersionUtils.forWebModule(webModule);
                 }
             }
 
@@ -454,7 +455,7 @@ public class JSFFrameworkProvider extends WebFrameworkProvider {
                             servlet = (Servlet)ddRoot.createBean("Servlet"); //NOI18N
                             String servletName = (panel == null) ? FACES_SERVLET_NAME : panel.getServletName();
                             servlet.setServletName(servletName);
-                            if (jsfVersion.isAtLeast(JSFVersion.JSF_3_0)) {
+                            if (jsfVersion.isAtLeast(JsfVersion.JSF_3_0)) {
                                 servlet.setServletClass(FACES_SERVLET_CLASS_JAKARTAEE);
                             } else {
                                 servlet.setServletClass(FACES_SERVLET_CLASS);
@@ -471,9 +472,9 @@ public class JSFFrameworkProvider extends WebFrameworkProvider {
                     }
                     boolean faceletsEnabled = panel.isEnableFacelets();
 
-                    if (jsfVersion != null && jsfVersion.isAtLeast(JSFVersion.JSF_2_0)) {
+                    if (jsfVersion != null && jsfVersion.isAtLeast(JsfVersion.JSF_2_0)) {
                         InitParam contextParam = (InitParam) ddRoot.createBean("InitParam");    //NOI18N
-                        if (jsfVersion.isAtLeast(JSFVersion.JSF_3_0)) {
+                        if (jsfVersion.isAtLeast(JsfVersion.JSF_3_0)) {
                             contextParam.setParamName(JSFUtils.FACES_PROJECT_STAGE_JAKARTAEE);
                         } else {
                             contextParam.setParamName(JSFUtils.FACES_PROJECT_STAGE);
@@ -576,24 +577,24 @@ public class JSFFrameworkProvider extends WebFrameworkProvider {
                 if (ddRoot != null) {
                     Profile profile = webModule.getJ2eeProfile();
                     if (profile != null && profile.isAtLeast(Profile.JAVA_EE_5) && jsfVersion != null) {
-                        if (jsfVersion.isAtLeast(JSFVersion.JSF_4_0)) {
+                        if (jsfVersion.isAtLeast(JsfVersion.JSF_4_0)) {
                             facesConfigTemplate = JSFCatalog.RES_FACES_CONFIG_4_0;
-                        } else if (jsfVersion.isAtLeast(JSFVersion.JSF_3_0)) {
+                        } else if (jsfVersion.isAtLeast(JsfVersion.JSF_3_0)) {
                             facesConfigTemplate = JSFCatalog.RES_FACES_CONFIG_3_0;
-                        } else if (jsfVersion.isAtLeast(JSFVersion.JSF_2_3)) {
+                        } else if (jsfVersion.isAtLeast(JsfVersion.JSF_2_3)) {
                             facesConfigTemplate = JSFCatalog.RES_FACES_CONFIG_2_3;
-                        } else if (jsfVersion.isAtLeast(JSFVersion.JSF_2_2)) {
+                        } else if (jsfVersion.isAtLeast(JsfVersion.JSF_2_2)) {
                             facesConfigTemplate = JSFCatalog.RES_FACES_CONFIG_2_2;
-                        } else if (jsfVersion.isAtLeast(JSFVersion.JSF_2_1)) {
+                        } else if (jsfVersion.isAtLeast(JsfVersion.JSF_2_1)) {
                             facesConfigTemplate = JSFCatalog.RES_FACES_CONFIG_2_1;
-                        } else if (jsfVersion.isAtLeast(JSFVersion.JSF_2_0)) {
+                        } else if (jsfVersion.isAtLeast(JsfVersion.JSF_2_0)) {
                             facesConfigTemplate = JSFCatalog.RES_FACES_CONFIG_2_0;
                         } else {
                             facesConfigTemplate = JSFCatalog.RES_FACES_CONFIG_1_2;
                         }
                     }
                     if (profile != null && !profile.isAtLeast(Profile.JAVA_EE_6_WEB)
-                            && (jsfVersion == null || !jsfVersion.isAtLeast(JSFVersion.JSF_2_0))) {
+                            && (jsfVersion == null || !jsfVersion.isAtLeast(JsfVersion.JSF_2_0))) {
                         createFacesConfig = true;
                     }
                 }
@@ -639,7 +640,7 @@ public class JSFFrameworkProvider extends WebFrameworkProvider {
                                 jsfConfig.addApplication(application);
                             }
                             //In JSF2.0 no need to add HANDLER need to change version of faces-config instead
-                            if (jsfVersion != null && !jsfVersion.isAtLeast(JSFVersion.JSF_2_0) && !isMyFaces) {
+                            if (jsfVersion != null && !jsfVersion.isAtLeast(JsfVersion.JSF_2_0) && !isMyFaces) {
                                 ViewHandler viewHandler = model.getFactory().createViewHandler();
                                 viewHandler.setFullyQualifiedClassType(HANDLER);
                                 application.addViewHandler(viewHandler);
@@ -697,11 +698,11 @@ public class JSFFrameworkProvider extends WebFrameworkProvider {
                     FileObject template = FileUtil.getConfigRoot().getFileObject(WELCOME_XHTML_TEMPLATE);
                     HashMap<String, Object> params = new HashMap<>();
                     if (jsfVersion != null) {
-                        if (jsfVersion.isAtLeast(JSFVersion.JSF_3_0)) {
+                        if (jsfVersion.isAtLeast(JsfVersion.JSF_3_0)) {
                             params.put("isJSF30", Boolean.TRUE);    //NOI18N
-                        } else if (jsfVersion.isAtLeast(JSFVersion.JSF_2_2)) {
+                        } else if (jsfVersion.isAtLeast(JsfVersion.JSF_2_2)) {
                             params.put("isJSF22", Boolean.TRUE);    //NOI18N
-                        } else if (jsfVersion.isAtLeast(JSFVersion.JSF_2_0)) {
+                        } else if (jsfVersion.isAtLeast(JsfVersion.JSF_2_0)) {
                             params.put("isJSF20", Boolean.TRUE);    //NOI18N
                         }
                     }
@@ -724,14 +725,14 @@ public class JSFFrameworkProvider extends WebFrameworkProvider {
         }
         private boolean shouldAddMappings(WebModule webModule) {
             assert webModule != null;
-            JSFVersion jsfVersion = JSFVersion.forWebModule(webModule);
+            JsfVersion jsfVersion = JsfVersionUtils.forWebModule(webModule);
             FileObject projectFO = JSFUtils.getFileObject(webModule);
             if (jsfVersion != null && projectFO != null) {
                 Project project = FileOwnerQuery.getOwner(projectFO);
                 WebPropertyEvaluator evaluator = project.getLookup().lookup(WebPropertyEvaluator.class);
                 if (evaluator != null) {
                     String serverInstanceID = evaluator.evaluator().getProperty(J2EE_SERVER_INSTANCE);
-                    if (jsfVersion.isAtLeast(JSFVersion.JSF_2_0)
+                    if (jsfVersion.isAtLeast(JsfVersion.JSF_2_0)
                             && isGlassFishv3(serverInstanceID)
                             && JSFConfigUtilities.hasJsfFramework(webModule.getDocumentBase())) {
                         return false;
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFUtils.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFUtils.java
index 065ebcf367..0f5ccd5bb6 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFUtils.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/JSFUtils.java
@@ -40,9 +40,10 @@ import org.netbeans.modules.j2ee.dd.api.web.WebApp;
 import org.netbeans.modules.j2ee.metadata.model.api.MetadataModel;
 import org.netbeans.modules.web.api.webmodule.WebModule;
 import org.netbeans.modules.web.jsf.api.ConfigurationUtils;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
 import org.netbeans.modules.web.jsf.api.metamodel.JsfModel;
 import org.netbeans.modules.web.jsf.api.metamodel.JsfModelProvider;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.jsfapi.api.NamespaceUtils;
 import org.netbeans.spi.project.ui.templates.support.Templates;
 import org.openide.ErrorManager;
@@ -247,7 +248,7 @@ public class JSFUtils {
     }
 
     /**
-     * Use {@link JSFVersion#get(org.netbeans.modules.web.api.webmodule.WebModule, boolean) } instead.
+     * Use {@link JsfVersionUtils#get(org.netbeans.modules.web.api.webmodule.WebModule, boolean) } instead.
      */
     @Deprecated
     public static boolean isJSF12Plus(WebModule webModule, boolean includingPlatformCP) {
@@ -255,7 +256,7 @@ public class JSFUtils {
     }
 
     /**
-     * Use {@link JSFVersion#get(org.netbeans.modules.web.api.webmodule.WebModule, boolean) } instead.
+     * Use {@link JsfVersionUtils#get(org.netbeans.modules.web.api.webmodule.WebModule, boolean) } instead.
      */
     @Deprecated
     public static boolean isJSF20Plus(WebModule webModule, boolean includingPlatformCP) {
@@ -263,7 +264,7 @@ public class JSFUtils {
     }
 
     /**
-     * Use {@link JSFVersion#get(org.netbeans.modules.web.api.webmodule.WebModule, boolean) } instead.
+     * Use {@link JsfVersionUtils#get(org.netbeans.modules.web.api.webmodule.WebModule, boolean) } instead.
      */
     @Deprecated
     public static boolean isJSF21Plus(WebModule webModule, boolean includingPlatformCP) {
@@ -271,7 +272,7 @@ public class JSFUtils {
     }
 
     /**
-     * Use {@link JSFVersion#get(org.netbeans.modules.web.api.webmodule.WebModule, boolean) } instead.
+     * Use {@link JsfVersionUtils#get(org.netbeans.modules.web.api.webmodule.WebModule, boolean) } instead.
      */
     @Deprecated
     public static boolean isJSF22Plus(WebModule webModule, boolean includingPlatformCP) {
@@ -279,7 +280,7 @@ public class JSFUtils {
     }
 
     /**
-     * Use {@link JSFVersion#get(org.netbeans.modules.web.api.webmodule.WebModule, boolean) } instead.
+     * Use {@link JsfVersionUtils#get(org.netbeans.modules.web.api.webmodule.WebModule, boolean) } instead.
      */
     @Deprecated
     private static boolean isJSFPlus(WebModule webModule, boolean includingPlatformCP, String versionSpecificClass) {
@@ -429,9 +430,9 @@ public class JSFUtils {
      *         {@link NamespaceUtils#JCP_ORG_LOCATION} otherwise
      */
     public static String getNamespaceDomain(WebModule webModule) {
-        JSFVersion version = webModule != null ? JSFVersion.forWebModule(webModule) : null;
+        JsfVersion version = webModule != null ? JsfVersionUtils.forWebModule(webModule) : null;
         String nsLocation = NamespaceUtils.SUN_COM_LOCATION;
-        if (version != null && version.isAtLeast(JSFVersion.JSF_2_2)) {
+        if (version != null && version.isAtLeast(JsfVersion.JSF_2_2)) {
             nsLocation = NamespaceUtils.JCP_ORG_LOCATION;
         }
         return nsLocation;
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/editor/JsfFacesComponentsProvider.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/editor/JsfFacesComponentsProvider.java
index 0131767d0c..46dbbb6a4b 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/editor/JsfFacesComponentsProvider.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/editor/JsfFacesComponentsProvider.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.netbeans.api.java.classpath.ClassPath;
@@ -168,8 +169,8 @@ public class JsfFacesComponentsProvider {
         }
 
         @Override
-        public String getLegacyNamespace() {
-            return null;
+        public Set<String> getValidNamespaces() {
+            return Collections.emptySortedSet();
         }
     }
 
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/facesmodel/JSFConfigModel.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/facesmodel/JSFConfigModel.java
index 5c01094c24..607914d20b 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/facesmodel/JSFConfigModel.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/facesmodel/JSFConfigModel.java
@@ -19,6 +19,7 @@
 
 package org.netbeans.modules.web.jsf.api.facesmodel;
 
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.xml.xam.dom.DocumentModel;
 
 /**
@@ -32,6 +33,6 @@ public interface JSFConfigModel extends DocumentModel <JSFConfigComponent>{
     
     JSFConfigComponentFactory getFactory();
     
-    JSFVersion getVersion();
+    JsfVersion getVersion();
     
 }
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/facesmodel/JSFVersion.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/facesmodel/JsfVersionUtils.java
similarity index 79%
rename from enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/facesmodel/JSFVersion.java
rename to enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/facesmodel/JsfVersionUtils.java
index 8e4785d183..05ce5c463d 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/facesmodel/JSFVersion.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/api/facesmodel/JsfVersionUtils.java
@@ -46,6 +46,7 @@ import org.netbeans.modules.j2ee.deployment.common.api.Version;
 import org.netbeans.modules.j2ee.deployment.plugins.api.ServerLibrary;
 import org.netbeans.modules.web.api.webmodule.WebModule;
 import org.netbeans.modules.web.jsf.JSFUtils;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.spi.java.classpath.ClassPathProvider;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
@@ -58,48 +59,30 @@ import org.openide.util.WeakListeners;
  *
  * @author Petr Pisl, ads, Martin Fousek
  */
-public enum JSFVersion {
-    JSF_1_0("JSF 1.0"),
-    JSF_1_1("JSF 1.1"),
-    JSF_1_2("JSF 1.2"),
-    JSF_2_0("JSF 2.0"),
-    JSF_2_1("JSF 2.1"),
-    JSF_2_2("JSF 2.2"),
-    JSF_2_3("JSF 2.3"),
-    JSF_3_0("JSF 3.0"),
-    JSF_4_0("JSF 4.0");
+public final class JsfVersionUtils {
 
-    private static final LinkedHashMap<JSFVersion, String> SPECIFIC_CLASS_NAMES = new LinkedHashMap<>();
+    private static final LinkedHashMap<JsfVersion, String> SPECIFIC_CLASS_NAMES = new LinkedHashMap<>();
 
     static {
-        SPECIFIC_CLASS_NAMES.put(JSFVersion.JSF_4_0, JSFUtils.JSF_4_0__API_SPECIFIC_CLASS);
-        SPECIFIC_CLASS_NAMES.put(JSFVersion.JSF_3_0, JSFUtils.JSF_3_0__API_SPECIFIC_CLASS);
-        SPECIFIC_CLASS_NAMES.put(JSFVersion.JSF_2_3, JSFUtils.JSF_2_3__API_SPECIFIC_CLASS);
-        SPECIFIC_CLASS_NAMES.put(JSFVersion.JSF_2_2, JSFUtils.JSF_2_2__API_SPECIFIC_CLASS);
-        SPECIFIC_CLASS_NAMES.put(JSFVersion.JSF_2_1, JSFUtils.JSF_2_1__API_SPECIFIC_CLASS);
-        SPECIFIC_CLASS_NAMES.put(JSFVersion.JSF_2_0, JSFUtils.JSF_2_0__API_SPECIFIC_CLASS);
-        SPECIFIC_CLASS_NAMES.put(JSFVersion.JSF_1_2, JSFUtils.JSF_1_2__API_SPECIFIC_CLASS);
-        SPECIFIC_CLASS_NAMES.put(JSFVersion.JSF_1_1, JSFUtils.FACES_EXCEPTION);
+        SPECIFIC_CLASS_NAMES.put(JsfVersion.JSF_4_0, JSFUtils.JSF_4_0__API_SPECIFIC_CLASS);
+        SPECIFIC_CLASS_NAMES.put(JsfVersion.JSF_3_0, JSFUtils.JSF_3_0__API_SPECIFIC_CLASS);
+        SPECIFIC_CLASS_NAMES.put(JsfVersion.JSF_2_3, JSFUtils.JSF_2_3__API_SPECIFIC_CLASS);
+        SPECIFIC_CLASS_NAMES.put(JsfVersion.JSF_2_2, JSFUtils.JSF_2_2__API_SPECIFIC_CLASS);
+        SPECIFIC_CLASS_NAMES.put(JsfVersion.JSF_2_1, JSFUtils.JSF_2_1__API_SPECIFIC_CLASS);
+        SPECIFIC_CLASS_NAMES.put(JsfVersion.JSF_2_0, JSFUtils.JSF_2_0__API_SPECIFIC_CLASS);
+        SPECIFIC_CLASS_NAMES.put(JsfVersion.JSF_1_2, JSFUtils.JSF_1_2__API_SPECIFIC_CLASS);
+        SPECIFIC_CLASS_NAMES.put(JsfVersion.JSF_1_1, JSFUtils.FACES_EXCEPTION);
     }
 
-    private final String shortName;
-
-
-    private JSFVersion(String shortName) {
-        this.shortName = shortName;
-    }
-
-    public String getShortName() {
-        return shortName;
-    }
-
-    private static final RequestProcessor RP = new RequestProcessor(JSFVersion.class);
-    private static final Logger LOG = Logger.getLogger(JSFVersion.class.getName());
+    private static final Logger LOG = Logger.getLogger(JsfVersion.class.getName());
 
     // caches for holding JSF version and the project CP listeners
-    private static final Map<WebModule, JSFVersion> projectVersionCache = new WeakHashMap<>();
+    private static final Map<WebModule, JsfVersion> projectVersionCache = new WeakHashMap<>();
     private static final Map<WebModule, PropertyChangeListener> projectListenerCache = new WeakHashMap<>();
 
+    private JsfVersionUtils() {
+    }
+
     /**
      * Gets the JSF version supported by the WebModule. It seeks for the JSF only on the classpath including the
      * platform classpath.
@@ -108,9 +91,9 @@ public enum JSFVersion {
      * @return JSF version if any found on the WebModule compile classpath, {@code null} otherwise
      */
     @CheckForNull
-    public static synchronized JSFVersion forWebModule(@NonNull final WebModule webModule) {
+    public static synchronized JsfVersion forWebModule(@NonNull final WebModule webModule) {
         Parameters.notNull("webModule", webModule); //NOI18N
-        JSFVersion version = projectVersionCache.get(webModule);
+        JsfVersion version = projectVersionCache.get(webModule);
         if (version == null) {
             version = get(webModule, true);
             ClassPath compileCP = getCompileClasspath(webModule);
@@ -140,7 +123,7 @@ public enum JSFVersion {
      * @since 1.65
      */
     @CheckForNull
-    public static synchronized JSFVersion forProject(@NonNull final Project project) {
+    public static synchronized JsfVersion forProject(@NonNull final Project project) {
         Parameters.notNull("project", project); //NOI18N
         WebModule webModule = WebModule.getWebModule(project.getProjectDirectory());
         if (webModule != null) {
@@ -158,7 +141,7 @@ public enum JSFVersion {
                 for (ClassPath.Entry entry : compileClasspath.entries()) {
                     cpUrls.add(entry.getURL());
                 }
-                return JSFVersion.forClasspath(cpUrls);
+                return forClasspath(cpUrls);
             } else {
                 return null;
             }
@@ -174,7 +157,7 @@ public enum JSFVersion {
      * @since 1.46
      */
     @CheckForNull
-    public static synchronized JSFVersion forClasspath(@NonNull Collection<File> classpath) {
+    public static synchronized JsfVersion forClasspath(@NonNull Collection<File> classpath) {
         Parameters.notNull("classpath", classpath); //NOI18N
         try {
             return ClasspathUtil.containsClass(classpath, SPECIFIC_CLASS_NAMES);
@@ -193,7 +176,7 @@ public enum JSFVersion {
      * @since 1.46
      */
     @CheckForNull
-    public static JSFVersion forClasspath(@NonNull List<URL> classpath) {
+    public static JsfVersion forClasspath(@NonNull List<URL> classpath) {
         Parameters.notNull("classpath", classpath); //NOI18N
         try {
             return ClasspathUtil.containsClass(classpath, SPECIFIC_CLASS_NAMES);
@@ -211,25 +194,25 @@ public enum JSFVersion {
      * @since 1.46
      */
     @CheckForNull
-    public static JSFVersion forServerLibrary(@NonNull ServerLibrary lib) {
+    public static JsfVersion forServerLibrary(@NonNull ServerLibrary lib) {
         Parameters.notNull("serverLibrary", lib); //NOI18N
         if ("JavaServer Faces".equals(lib.getSpecificationTitle())) { // NOI18N
             if (Version.fromJsr277NotationWithFallback("4.0").equals(lib.getSpecificationVersion())) { //NOI18N
-                return JSFVersion.JSF_4_0;
+                return JsfVersion.JSF_4_0;
             } else if (Version.fromJsr277NotationWithFallback("3.0").equals(lib.getSpecificationVersion())) { //NOI18N
-                return JSFVersion.JSF_3_0;
+                return JsfVersion.JSF_3_0;
             } else if (Version.fromJsr277NotationWithFallback("2.3").equals(lib.getSpecificationVersion())) { //NOI18N
-                return JSFVersion.JSF_2_3;
+                return JsfVersion.JSF_2_3;
             } else if (Version.fromJsr277NotationWithFallback("2.2").equals(lib.getSpecificationVersion())) { //NOI18N
-                return JSFVersion.JSF_2_2;
+                return JsfVersion.JSF_2_2;
             } else if (Version.fromJsr277NotationWithFallback("2.1").equals(lib.getSpecificationVersion())) { //NOI18N
-                return JSFVersion.JSF_2_1;
+                return JsfVersion.JSF_2_1;
             } else if (Version.fromJsr277NotationWithFallback("2.0").equals(lib.getSpecificationVersion())) { // NOI18N
-                return JSFVersion.JSF_2_0;
+                return JsfVersion.JSF_2_0;
             } else if (Version.fromJsr277NotationWithFallback("1.2").equals(lib.getSpecificationVersion())) { // NOI18N
-                return JSFVersion.JSF_1_2;
+                return JsfVersion.JSF_1_2;
             } else if (Version.fromJsr277NotationWithFallback("1.1").equals(lib.getSpecificationVersion())) { // NOI18N
-                return JSFVersion.JSF_1_1;
+                return JsfVersion.JSF_1_1;
             } else {
                 LOG.log(Level.INFO, "Unknown JSF version {0}", lib.getSpecificationVersion());
             }
@@ -237,22 +220,6 @@ public enum JSFVersion {
         return null;
     }
 
-    /**
-     * Says whether the current instance is at least of the same JSF version.
-     *
-     * @param version version to compare
-     * @return {@code true} if the current instance is at least of the given version, {@code false} otherwise
-     */
-    public boolean isAtLeast(@NonNull JSFVersion version) {
-        Parameters.notNull("version", version); //NOI18N
-        int thisMajorVersion = Integer.parseInt(this.name().substring(4, 5));
-        int thisMinorVersion = Integer.parseInt(this.name().substring(6, 7));
-        int compMajorVersion = Integer.parseInt(version.name().substring(4, 5));
-        int compMinorVersion = Integer.parseInt(version.name().substring(6, 7));
-        return thisMajorVersion > compMajorVersion
-                || thisMajorVersion == compMajorVersion && thisMinorVersion >= compMinorVersion;
-    }
-
     /**
      * Gets version of the JSF on the project classpath. You can specify whether the classpath should include
      * platform's classpath too. If you don't need to exclude platform classpath use the
@@ -263,7 +230,7 @@ public enum JSFVersion {
      * @return JSF version
      */
     @CheckForNull
-    public static JSFVersion get(@NonNull WebModule webModule, boolean includingPlatformCP) {
+    public static JsfVersion get(@NonNull WebModule webModule, boolean includingPlatformCP) {
         Parameters.notNull("webModule", webModule); //NOI18N
         if (webModule.getDocumentBase() == null) {
             return null;
@@ -275,7 +242,7 @@ public enum JSFVersion {
         }
 
         if (includingPlatformCP) {
-            for (Map.Entry<JSFVersion, String> entry : SPECIFIC_CLASS_NAMES.entrySet()) {
+            for (Map.Entry<JsfVersion, String> entry : SPECIFIC_CLASS_NAMES.entrySet()) {
                 String className = entry.getValue();
                 if (compileCP.findResource(className.replace('.', '/') + ".class") != null) { //NOI18N
                     return entry.getKey();
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/facelets/resources/templates/simpleFacelets.template b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/facelets/resources/templates/simpleFacelets.template
index 3d890c2267..756b9bbfd8 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/facelets/resources/templates/simpleFacelets.template
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/facelets/resources/templates/simpleFacelets.template
@@ -1,6 +1,9 @@
 <?xml version='1.0' encoding='UTF-8' ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<#if isJSF22?? || isJSF30??>
+<#if isJSF40??>
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:h="jakarta.faces.html">
+<#elseif isJSF22?? || isJSF30??>
 <html xmlns="http://www.w3.org/1999/xhtml"
       xmlns:h="http://xmlns.jcp.org/jsf/html">
 <#elseif isJSF20??>
@@ -9,7 +12,7 @@
 <#else>
 <html xmlns="http://www.w3.org/1999/xhtml">
 </#if>
-<#if isJSF20?? || isJSF22?? || isJSF30??>
+<#if isJSF20?? || isJSF22?? || isJSF30?? || isJSF40??>
     <h:head>
         <title>Facelet Title</title>
     </h:head>
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/hints/JsfHintsContext.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/hints/JsfHintsContext.java
index f525e47fdd..461ffefb25 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/hints/JsfHintsContext.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/hints/JsfHintsContext.java
@@ -18,11 +18,11 @@
  */
 package org.netbeans.modules.web.jsf.hints;
 
-import org.netbeans.api.java.source.CompilationInfo;
 import org.netbeans.api.project.FileOwnerQuery;
 import org.netbeans.api.project.Project;
 import org.netbeans.modules.web.api.webmodule.WebModule;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.openide.filesystems.FileObject;
 
 /**
@@ -33,13 +33,13 @@ public final class JsfHintsContext {
 
     private final FileObject fileObject;
     private final Project project;
-    private final JSFVersion jsfVersion;
+    private final JsfVersion jsfVersion;
 
     JsfHintsContext(FileObject fileObject) {
         this.fileObject = fileObject;
         this.project = FileOwnerQuery.getOwner(fileObject);
         WebModule webModule = project != null ? WebModule.getWebModule(project.getProjectDirectory()) : null;
-        this.jsfVersion = webModule != null ? JSFVersion.forWebModule(webModule) : null;
+        this.jsfVersion = webModule != null ? JsfVersionUtils.forWebModule(webModule) : null;
     }
 
     public FileObject getFileObject() {
@@ -50,7 +50,7 @@ public final class JsfHintsContext {
         return project;
     }
 
-    public JSFVersion getJsfVersion() {
+    public JsfVersion getJsfVersion() {
         return jsfVersion;
     }
 }
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/hints/rules/JavaxFacesBeanIsGonnaBeDeprecated.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/hints/rules/JavaxFacesBeanIsGonnaBeDeprecated.java
index 3dd94a83dc..b94230a458 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/hints/rules/JavaxFacesBeanIsGonnaBeDeprecated.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/hints/rules/JavaxFacesBeanIsGonnaBeDeprecated.java
@@ -40,9 +40,9 @@ import org.netbeans.api.java.source.JavaSource;
 import org.netbeans.api.java.source.TreeMaker;
 import org.netbeans.api.java.source.WorkingCopy;
 import org.netbeans.modules.j2ee.core.api.support.java.GenerationUtils;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
 import org.netbeans.modules.web.jsf.hints.JsfHintsContext;
 import org.netbeans.modules.web.jsf.hints.JsfHintsUtils;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.spi.editor.hints.ErrorDescription;
 import org.netbeans.spi.editor.hints.Fix;
 import org.netbeans.spi.editor.hints.Severity;
@@ -91,7 +91,7 @@ public class JavaxFacesBeanIsGonnaBeDeprecated {
         List<ErrorDescription> problems = new ArrayList<>();
         final JsfHintsContext ctx = JsfHintsUtils.getOrCacheContext(hintContext);
 
-        if (ctx.getJsfVersion() == null || !ctx.getJsfVersion().isAtLeast(JSFVersion.JSF_2_2)) {
+        if (ctx.getJsfVersion() == null || !ctx.getJsfVersion().isAtLeast(JsfVersion.JSF_2_2)) {
             return problems;
         }
 
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/impl/facesmodel/JSFConfigModelImpl.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/impl/facesmodel/JSFConfigModelImpl.java
index 2c6ce50f7d..9a188ef394 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/impl/facesmodel/JSFConfigModelImpl.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/impl/facesmodel/JSFConfigModelImpl.java
@@ -28,8 +28,9 @@ import org.netbeans.modules.web.jsf.api.facesmodel.FacesConfig;
 import org.netbeans.modules.web.jsf.api.facesmodel.JSFConfigComponent;
 import org.netbeans.modules.web.jsf.api.facesmodel.JSFConfigComponentFactory;
 import org.netbeans.modules.web.jsf.api.facesmodel.JSFConfigModel;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
 import org.netbeans.modules.web.jsf.api.metamodel.JsfModel;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.xml.xam.ComponentUpdater;
 import org.netbeans.modules.xml.xam.ModelSource;
 import org.netbeans.modules.xml.xam.dom.AbstractDocumentModel;
@@ -87,47 +88,47 @@ public class JSFConfigModelImpl extends AbstractDocumentModel<JSFConfigComponent
         return componentFactory;
     }
 
-    public JSFVersion getVersion() {
+    public JsfVersion getVersion() {
         String namespaceURI = getRootComponent().getPeer().getNamespaceURI();
-        JSFVersion version = JSFVersion.JSF_1_1;
+        JsfVersion version = JsfVersion.JSF_1_1;
         if (JSFConfigQNames.JSF_4_0_NS.equals(namespaceURI)
                 && (getRootComponent().getVersion().equals("4.0") //NOI18N
                 || checkSchemaLocation(
                     getRootComponent().getPeer(),
                     "https://jakarta.ee/xml/ns/jakartaee/web-facesconfig_4_0.xsd"))) { //NOI18N
-            version = JSFVersion.JSF_4_0;
+            version = JsfVersion.JSF_4_0;
         } else if (JSFConfigQNames.JSF_3_0_NS.equals(namespaceURI)
                 && (getRootComponent().getVersion().equals("3.0") //NOI18N
                 || checkSchemaLocation(
                     getRootComponent().getPeer(),
                     "https://jakarta.ee/xml/ns/jakartaee/web-facesconfig_3_0.xsd"))) { //NOI18N
-            version = JSFVersion.JSF_3_0;
+            version = JsfVersion.JSF_3_0;
         } else if (JSFConfigQNames.JSF_2_3_NS.equals(namespaceURI)
                 && (getRootComponent().getVersion().equals("2.3") //NOI18N
                 || checkSchemaLocation(
                     getRootComponent().getPeer(),
                     "http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd"))) { //NOI18N
-            version = JSFVersion.JSF_2_3;
+            version = JsfVersion.JSF_2_3;
         } else if (JSFConfigQNames.JSF_2_2_NS.equals(namespaceURI)
                 && (getRootComponent().getVersion().equals("2.2") //NOI18N
                 || checkSchemaLocation(
                     getRootComponent().getPeer(),
                     "http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"))) { //NOI18N
-            version = JSFVersion.JSF_2_2;
+            version = JsfVersion.JSF_2_2;
         } else if (JSFConfigQNames.JSF_2_1_NS.equals(namespaceURI)
                 && (getRootComponent().getVersion().equals("2.1") //NOI18N
                 || checkSchemaLocation(
                     getRootComponent().getPeer(),
                     "http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"))) { //NOI18N
-            version = JSFVersion.JSF_2_1;
+            version = JsfVersion.JSF_2_1;
         } else if (JSFConfigQNames.JSF_2_0_NS.equals(namespaceURI)
                 && (getRootComponent().getVersion().equals("2.0") //NOI18N
                 || checkSchemaLocation(
                     getRootComponent().getPeer(),
                     "http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"))) { //NOI18N
-            version = JSFVersion.JSF_2_0;
+            version = JsfVersion.JSF_2_0;
         } else if (JSFConfigQNames.JSF_1_2_NS.equals(namespaceURI)) {
-            version = JSFVersion.JSF_1_2;
+            version = JsfVersion.JSF_1_2;
         }
         return version;
     }
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/impl/facesmodel/JSFConfigQNames.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/impl/facesmodel/JSFConfigQNames.java
index 14a72a7729..0bdd41978a 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/impl/facesmodel/JSFConfigQNames.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/impl/facesmodel/JSFConfigQNames.java
@@ -25,7 +25,8 @@ import java.util.Set;
 
 import javax.xml.namespace.QName;
 
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.xml.xam.dom.AbstractDocumentComponent;
 import org.w3c.dom.Element;
 
@@ -229,21 +230,21 @@ public enum JSFConfigQNames {
         qname_4_0 = new QName(JSF_4_0_NS, localName, JSFCONFIG_PREFIX);
     }
 
-    public QName getQName(JSFVersion version) {
+    public QName getQName(JsfVersion version) {
         QName value = qname_1_1;
-        if (version.equals(JSFVersion.JSF_1_2)) {
+        if (version.equals(JsfVersion.JSF_1_2)) {
             value = qname_1_2;
-        } else if (version.equals(JSFVersion.JSF_2_0)) {
+        } else if (version.equals(JsfVersion.JSF_2_0)) {
             value = qname_2_0;
-        } else if (version.equals(JSFVersion.JSF_2_1)) {
+        } else if (version.equals(JsfVersion.JSF_2_1)) {
             value = qname_2_1;
-        } else if (version.equals(JSFVersion.JSF_2_2)) {
+        } else if (version.equals(JsfVersion.JSF_2_2)) {
             value = qname_2_2;
-        } else if (version.equals(JSFVersion.JSF_2_3)) {
+        } else if (version.equals(JsfVersion.JSF_2_3)) {
             value = qname_2_3;
-        } else if (version.equals(JSFVersion.JSF_3_0)) {
+        } else if (version.equals(JsfVersion.JSF_3_0)) {
             value = qname_3_0;
-        } else if (version.equals(JSFVersion.JSF_4_0)) {
+        } else if (version.equals(JsfVersion.JSF_4_0)) {
             value = qname_4_0;
         }
         return value;
@@ -257,9 +258,9 @@ public enum JSFConfigQNames {
         return qname_1_2.getLocalPart();
     }
 
-    public String getQualifiedName(JSFVersion version) {
+    public String getQualifiedName(JsfVersion version) {
         String value = qname_1_1.getPrefix() + ":" + qname_1_1.getLocalPart();
-        if (version.equals(JSFVersion.JSF_1_2)) {
+        if (version.equals(JsfVersion.JSF_1_2)) {
             value = qname_1_2.getPrefix() + ":" + qname_1_2.getLocalPart();
         }
         return value;
@@ -268,17 +269,17 @@ public enum JSFConfigQNames {
     public static boolean areSameQName(JSFConfigQNames jsfqname, Element element) {
         QName qname = AbstractDocumentComponent.getQName(element);
         if (JSFConfigQNames.JSF_1_2_NS.equals(element.getNamespaceURI())) {
-            return jsfqname.getQName(JSFVersion.JSF_1_2).equals(qname);
+            return jsfqname.getQName(JsfVersion.JSF_1_2).equals(qname);
         } else if (JSFConfigQNames.JSF_2_0_NS.equals(element.getNamespaceURI())) {
-            return jsfqname.getQName(JSFVersion.JSF_2_0).equals(qname);
+            return jsfqname.getQName(JsfVersion.JSF_2_0).equals(qname);
         } else if (JSFConfigQNames.JSF_2_1_NS.equals(element.getNamespaceURI())) {
-            return jsfqname.getQName(JSFVersion.JSF_2_1).equals(qname);
+            return jsfqname.getQName(JsfVersion.JSF_2_1).equals(qname);
         } else if (JSFConfigQNames.JSF_2_2_NS.equals(element.getNamespaceURI())) {
-            return jsfqname.getQName(JSFVersion.JSF_2_2).equals(qname);
+            return jsfqname.getQName(JsfVersion.JSF_2_2).equals(qname);
         } else if (JSFConfigQNames.JSF_2_3_NS.equals(element.getNamespaceURI())) {
-            return jsfqname.getQName(JSFVersion.JSF_2_3).equals(qname);
+            return jsfqname.getQName(JsfVersion.JSF_2_3).equals(qname);
         } else if (JSFConfigQNames.JSF_3_0_NS.equals(element.getNamespaceURI())) {
-            return jsfqname.getQName(JSFVersion.JSF_3_0).equals(qname);
+            return jsfqname.getQName(JsfVersion.JSF_3_0).equals(qname);
         }
         return jsfqname.getLocalName().equals(qname.getLocalPart());
     }
@@ -293,629 +294,629 @@ public enum JSFConfigQNames {
     private static final Set<QName> mappedQNames_4_0 = new HashSet<QName>();
 
     static {
-        mappedQNames_1_1.add(FACES_CONFIG.getQName(JSFVersion.JSF_1_1));
-        mappedQNames_1_1.add(MANAGED_BEAN.getQName(JSFVersion.JSF_1_1));
-        mappedQNames_1_1.add(CONVERTER.getQName(JSFVersion.JSF_1_1));
-        mappedQNames_1_1.add(NAVIGATION_RULE.getQName(JSFVersion.JSF_1_1));
-        mappedQNames_1_1.add(NAVIGATION_CASE.getQName(JSFVersion.JSF_1_1));
-        mappedQNames_1_1.add(DESCRIPTION.getQName(JSFVersion.JSF_1_1));
-        mappedQNames_1_1.add(DISPLAY_NAME.getQName(JSFVersion.JSF_1_1));
-        mappedQNames_1_1.add(ICON.getQName(JSFVersion.JSF_1_1));
-        mappedQNames_1_1.add(APPLICATION.getQName(JSFVersion.JSF_1_1));
-        mappedQNames_1_1.add(VIEW_HANDLER.getQName(JSFVersion.JSF_1_1));
-        mappedQNames_1_1.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_1_1));
-        mappedQNames_1_2.add(FACES_CONFIG.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(MANAGED_BEAN.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(CONVERTER.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(NAVIGATION_RULE.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(NAVIGATION_CASE.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(DESCRIPTION.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(DISPLAY_NAME.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(ICON.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(APPLICATION.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(VIEW_HANDLER.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(FACTORY.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(COMPONENT.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(REFERENCED_BEAN.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(RENDER_KIT.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(LIFECYCLE.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(VALIDATOR.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(ACTION_LISTENER.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(DEFAULT_RENDER_KIT_ID.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(MESSAGE_BUNDLE.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(NAVIGATION_HANDLER.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(STATE_MANAGER.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(EL_RESOLVER.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(PROPERTY_RESOLVER.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(VARIABLE_RESOLVER.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(LOCALE_CONFIG.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(APPLICATION_EXTENSION.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(DEFAULT_LOCALE.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(SUPPORTED_LOCALE.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(APPLICATION_FACTORY.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(FACES_CONTEXT_FACTORY.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(LIFECYCLE_FACTORY.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(RENDER_KIT_FACTORY.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(FACTORY_EXTENSION.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(FACET.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(ATTRIBUTE.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(PROPERTY.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(COMPONENT_EXTENSION.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(CONVERTER_EXTENSION.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(MANAGED_PROPERTY.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(MAP_ENTRIES.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(LIST_ENTRIES.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(MANAGED_BEAN_EXTENSION.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(NAVIGATION_RULE_EXTENSION.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(RENDER_KIT_EXTENSION.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(PHASE_LISTENER.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(LIFECYCLE_EXTENSION.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(VALIDATOR_EXTENSION.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_1_2.add(RENDERER.getQName(JSFVersion.JSF_1_2));
-        mappedQNames_2_0.add(FACES_CONFIG.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(MANAGED_BEAN.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(CONVERTER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(NAVIGATION_RULE.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(NAVIGATION_CASE.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(DESCRIPTION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(DISPLAY_NAME.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(ICON.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(APPLICATION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(VIEW_HANDLER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(FACTORY.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(COMPONENT.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(REFERENCED_BEAN.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(RENDER_KIT.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(LIFECYCLE.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(VALIDATOR.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(ACTION_LISTENER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(DEFAULT_RENDER_KIT_ID.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(MESSAGE_BUNDLE.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(NAVIGATION_HANDLER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(STATE_MANAGER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(EL_RESOLVER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(PROPERTY_RESOLVER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(VARIABLE_RESOLVER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(LOCALE_CONFIG.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(APPLICATION_EXTENSION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(DEFAULT_LOCALE.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(SUPPORTED_LOCALE.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(APPLICATION_FACTORY.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(FACES_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(LIFECYCLE_FACTORY.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(RENDER_KIT_FACTORY.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(FACTORY_EXTENSION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(FACET.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(ATTRIBUTE.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(PROPERTY.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(COMPONENT_EXTENSION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(CONVERTER_EXTENSION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(MANAGED_PROPERTY.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(MAP_ENTRIES.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(LIST_ENTRIES.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(MANAGED_BEAN_EXTENSION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(NAVIGATION_RULE_EXTENSION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(RENDER_KIT_EXTENSION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(PHASE_LISTENER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(LIFECYCLE_EXTENSION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(VALIDATOR_EXTENSION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(IF.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(REDIRECT.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(VIEW_PARAM.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(PARTIAL_TRAVERSAL.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(SYSTEM_EVENT_LISTENER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(RESOURCE_HANDLER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(DEFAULT_VALIDATORS.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(ORDERING.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(AFTER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(BEFORE.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(ABSOLUTE_ORDERING.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(OTHERS.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(EXCEPTION_HANDLER_FACTORY.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(EXTERNAL_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(PARTIAL_VIEW_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(VIEW_DECLARATION_LANGUAGE_FACTORY.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(TAG_HANDLER_DELEGATE_FACTORY.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(VISIT_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(NAME.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(RENDERER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(CLIENT_BEHAVIOR_RENDERER.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(BEHAVIOR.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_0.add(BEHAVIOR_EXTENSION.getQName(JSFVersion.JSF_2_0));
-        mappedQNames_2_1.add(FACES_CONFIG.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(MANAGED_BEAN.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(CONVERTER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(NAVIGATION_RULE.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(NAVIGATION_CASE.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(DESCRIPTION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(DISPLAY_NAME.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(ICON.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(APPLICATION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(VIEW_HANDLER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(FACTORY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(COMPONENT.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(REFERENCED_BEAN.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(RENDER_KIT.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(LIFECYCLE.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(VALIDATOR.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(ACTION_LISTENER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(DEFAULT_RENDER_KIT_ID.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(MESSAGE_BUNDLE.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(NAVIGATION_HANDLER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(STATE_MANAGER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(EL_RESOLVER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(PROPERTY_RESOLVER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(VARIABLE_RESOLVER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(LOCALE_CONFIG.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(APPLICATION_EXTENSION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(DEFAULT_LOCALE.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(SUPPORTED_LOCALE.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(APPLICATION_FACTORY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(FACES_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(FACELET_CACHE_FACTORY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(LIFECYCLE_FACTORY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(RENDER_KIT_FACTORY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(FACTORY_EXTENSION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(FACET.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(ATTRIBUTE.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(PROPERTY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(COMPONENT_EXTENSION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(CONVERTER_EXTENSION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(MANAGED_PROPERTY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(MAP_ENTRIES.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(LIST_ENTRIES.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(MANAGED_BEAN_EXTENSION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(NAVIGATION_RULE_EXTENSION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(RENDER_KIT_EXTENSION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(PHASE_LISTENER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(LIFECYCLE_EXTENSION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(VALIDATOR_EXTENSION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(IF.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(REDIRECT.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(VIEW_PARAM.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(PARTIAL_TRAVERSAL.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(SYSTEM_EVENT_LISTENER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(RESOURCE_HANDLER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(DEFAULT_VALIDATORS.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(ORDERING.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(AFTER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(BEFORE.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(ABSOLUTE_ORDERING.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(OTHERS.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(EXCEPTION_HANDLER_FACTORY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(EXTERNAL_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(PARTIAL_VIEW_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(VIEW_DECLARATION_LANGUAGE_FACTORY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(TAG_HANDLER_DELEGATE_FACTORY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(VISIT_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(NAME.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(RENDERER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(CLIENT_BEHAVIOR_RENDERER.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(BEHAVIOR.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_1.add(BEHAVIOR_EXTENSION.getQName(JSFVersion.JSF_2_1));
-        mappedQNames_2_2.add(FACES_CONFIG.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(MANAGED_BEAN.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(CONVERTER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(NAVIGATION_RULE.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(NAVIGATION_CASE.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(DESCRIPTION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(DISPLAY_NAME.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(ICON.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(APPLICATION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(VIEW_HANDLER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(COMPONENT.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(REFERENCED_BEAN.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(RENDER_KIT.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(LIFECYCLE.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(VALIDATOR.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(ACTION_LISTENER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(DEFAULT_RENDER_KIT_ID.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(MESSAGE_BUNDLE.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(NAVIGATION_HANDLER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(STATE_MANAGER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(EL_RESOLVER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(PROPERTY_RESOLVER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(VARIABLE_RESOLVER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(LOCALE_CONFIG.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(APPLICATION_EXTENSION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(DEFAULT_LOCALE.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(SUPPORTED_LOCALE.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(APPLICATION_FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FACES_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FACELET_CACHE_FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(LIFECYCLE_FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(RENDER_KIT_FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FACTORY_EXTENSION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FACET.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(ATTRIBUTE.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(PROPERTY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(COMPONENT_EXTENSION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(CONVERTER_EXTENSION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(MANAGED_PROPERTY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(MAP_ENTRIES.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(LIST_ENTRIES.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(MANAGED_BEAN_EXTENSION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(NAVIGATION_RULE_EXTENSION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(RENDER_KIT_EXTENSION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(PHASE_LISTENER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(LIFECYCLE_EXTENSION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(VALIDATOR_EXTENSION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(IF.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(REDIRECT.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(VIEW_PARAM.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(PARTIAL_TRAVERSAL.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(SYSTEM_EVENT_LISTENER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(RESOURCE_HANDLER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(DEFAULT_VALIDATORS.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(ORDERING.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(AFTER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(BEFORE.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(ABSOLUTE_ORDERING.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(OTHERS.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(EXCEPTION_HANDLER_FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(EXTERNAL_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(PARTIAL_VIEW_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(VIEW_DECLARATION_LANGUAGE_FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(TAG_HANDLER_DELEGATE_FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(VISIT_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(NAME.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(RENDERER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(CLIENT_BEHAVIOR_RENDERER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(BEHAVIOR.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(BEHAVIOR_EXTENSION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(RESOURCE_LIBRARY_CONTRACTS.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(RESOURCE_HANDLER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(URL_PATTERN.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FLOW_HANDLER_FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FLASH_FACTORY.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(START_NODE.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(VIEW.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(VDL_DOCUMENT.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(DEFAULT_OUTCOME.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(SWITCH.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(METHOD_CALL.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FLOW_RETURN.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(INITIALIZER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FINALIZER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FLOW_CALL.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(INBOUND_PARAMETER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(OUTBOUND_PARAMETER.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FLOW_REFERENCE.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FLOW_ID.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(METHOD.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(FLOW_DEFINITION.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_2.add(PROTECTED_VIEWS.getQName(JSFVersion.JSF_2_2));
-        mappedQNames_2_3.add(FACES_CONFIG.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(MANAGED_BEAN.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(CONVERTER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(NAVIGATION_RULE.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(NAVIGATION_CASE.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(DESCRIPTION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(DISPLAY_NAME.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(ICON.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(APPLICATION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(VIEW_HANDLER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(COMPONENT.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(REFERENCED_BEAN.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(RENDER_KIT.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(LIFECYCLE.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(VALIDATOR.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(ACTION_LISTENER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(DEFAULT_RENDER_KIT_ID.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(MESSAGE_BUNDLE.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(NAVIGATION_HANDLER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(STATE_MANAGER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(EL_RESOLVER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(PROPERTY_RESOLVER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(VARIABLE_RESOLVER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(LOCALE_CONFIG.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(APPLICATION_EXTENSION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(DEFAULT_LOCALE.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(SUPPORTED_LOCALE.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(APPLICATION_FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FACES_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FACELET_CACHE_FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(LIFECYCLE_FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(RENDER_KIT_FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FACTORY_EXTENSION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FACET.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(ATTRIBUTE.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(PROPERTY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(COMPONENT_EXTENSION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(CONVERTER_EXTENSION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(MANAGED_PROPERTY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(MAP_ENTRIES.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(LIST_ENTRIES.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(MANAGED_BEAN_EXTENSION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(NAVIGATION_RULE_EXTENSION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(RENDER_KIT_EXTENSION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(PHASE_LISTENER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(LIFECYCLE_EXTENSION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(VALIDATOR_EXTENSION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(IF.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(REDIRECT.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(VIEW_PARAM.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(PARTIAL_TRAVERSAL.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(SYSTEM_EVENT_LISTENER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(RESOURCE_HANDLER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(DEFAULT_VALIDATORS.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(ORDERING.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(AFTER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(BEFORE.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(ABSOLUTE_ORDERING.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(OTHERS.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(EXCEPTION_HANDLER_FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(EXTERNAL_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(PARTIAL_VIEW_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(VIEW_DECLARATION_LANGUAGE_FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(TAG_HANDLER_DELEGATE_FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(VISIT_CONTEXT_FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(NAME.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(RENDERER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(CLIENT_BEHAVIOR_RENDERER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(BEHAVIOR.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(BEHAVIOR_EXTENSION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(RESOURCE_LIBRARY_CONTRACTS.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(RESOURCE_HANDLER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(URL_PATTERN.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FLOW_HANDLER_FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FLASH_FACTORY.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(START_NODE.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(VIEW.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(VDL_DOCUMENT.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(DEFAULT_OUTCOME.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(SWITCH.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(METHOD_CALL.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FLOW_RETURN.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(INITIALIZER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FINALIZER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FLOW_CALL.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(INBOUND_PARAMETER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(OUTBOUND_PARAMETER.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FLOW_REFERENCE.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FLOW_ID.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(METHOD.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(FLOW_DEFINITION.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_2_3.add(PROTECTED_VIEWS.getQName(JSFVersion.JSF_2_3));
-        mappedQNames_3_0.add(FACES_CONFIG.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(MANAGED_BEAN.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(CONVERTER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(NAVIGATION_RULE.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(NAVIGATION_CASE.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(DESCRIPTION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(DISPLAY_NAME.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(ICON.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(APPLICATION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(VIEW_HANDLER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(COMPONENT.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(REFERENCED_BEAN.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(RENDER_KIT.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(LIFECYCLE.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(VALIDATOR.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(ACTION_LISTENER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(DEFAULT_RENDER_KIT_ID.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(MESSAGE_BUNDLE.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(NAVIGATION_HANDLER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(STATE_MANAGER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(EL_RESOLVER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(PROPERTY_RESOLVER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(VARIABLE_RESOLVER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(LOCALE_CONFIG.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(APPLICATION_EXTENSION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(DEFAULT_LOCALE.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(SUPPORTED_LOCALE.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(APPLICATION_FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FACES_CONTEXT_FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FACELET_CACHE_FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(LIFECYCLE_FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(RENDER_KIT_FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FACTORY_EXTENSION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FACET.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(ATTRIBUTE.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(PROPERTY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(COMPONENT_EXTENSION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(CONVERTER_EXTENSION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(MANAGED_PROPERTY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(MAP_ENTRIES.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(LIST_ENTRIES.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(MANAGED_BEAN_EXTENSION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(NAVIGATION_RULE_EXTENSION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(RENDER_KIT_EXTENSION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(PHASE_LISTENER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(LIFECYCLE_EXTENSION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(VALIDATOR_EXTENSION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(IF.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(REDIRECT.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(VIEW_PARAM.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(PARTIAL_TRAVERSAL.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(SYSTEM_EVENT_LISTENER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(RESOURCE_HANDLER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(DEFAULT_VALIDATORS.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(ORDERING.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(AFTER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(BEFORE.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(ABSOLUTE_ORDERING.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(OTHERS.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(EXCEPTION_HANDLER_FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(EXTERNAL_CONTEXT_FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(PARTIAL_VIEW_CONTEXT_FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(VIEW_DECLARATION_LANGUAGE_FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(TAG_HANDLER_DELEGATE_FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(VISIT_CONTEXT_FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(NAME.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(RENDERER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(CLIENT_BEHAVIOR_RENDERER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(BEHAVIOR.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(BEHAVIOR_EXTENSION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(RESOURCE_LIBRARY_CONTRACTS.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(RESOURCE_HANDLER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(URL_PATTERN.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FLOW_HANDLER_FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FLASH_FACTORY.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(START_NODE.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(VIEW.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(VDL_DOCUMENT.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(DEFAULT_OUTCOME.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(SWITCH.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(METHOD_CALL.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FLOW_RETURN.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(INITIALIZER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FINALIZER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FLOW_CALL.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(INBOUND_PARAMETER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(OUTBOUND_PARAMETER.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FLOW_REFERENCE.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FLOW_ID.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(METHOD.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(FLOW_DEFINITION.getQName(JSFVersion.JSF_3_0));
-        mappedQNames_3_0.add(PROTECTED_VIEWS.getQName(JSFVersion.JSF_3_0));
+        mappedQNames_1_1.add(FACES_CONFIG.getQName(JsfVersion.JSF_1_1));
+        mappedQNames_1_1.add(MANAGED_BEAN.getQName(JsfVersion.JSF_1_1));
+        mappedQNames_1_1.add(CONVERTER.getQName(JsfVersion.JSF_1_1));
+        mappedQNames_1_1.add(NAVIGATION_RULE.getQName(JsfVersion.JSF_1_1));
+        mappedQNames_1_1.add(NAVIGATION_CASE.getQName(JsfVersion.JSF_1_1));
+        mappedQNames_1_1.add(DESCRIPTION.getQName(JsfVersion.JSF_1_1));
+        mappedQNames_1_1.add(DISPLAY_NAME.getQName(JsfVersion.JSF_1_1));
+        mappedQNames_1_1.add(ICON.getQName(JsfVersion.JSF_1_1));
+        mappedQNames_1_1.add(APPLICATION.getQName(JsfVersion.JSF_1_1));
+        mappedQNames_1_1.add(VIEW_HANDLER.getQName(JsfVersion.JSF_1_1));
+        mappedQNames_1_1.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_1_1));
+        mappedQNames_1_2.add(FACES_CONFIG.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(MANAGED_BEAN.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(CONVERTER.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(NAVIGATION_RULE.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(NAVIGATION_CASE.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(DESCRIPTION.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(DISPLAY_NAME.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(ICON.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(APPLICATION.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(VIEW_HANDLER.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(FACTORY.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(COMPONENT.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(REFERENCED_BEAN.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(RENDER_KIT.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(LIFECYCLE.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(VALIDATOR.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(ACTION_LISTENER.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(DEFAULT_RENDER_KIT_ID.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(MESSAGE_BUNDLE.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(NAVIGATION_HANDLER.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(STATE_MANAGER.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(EL_RESOLVER.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(PROPERTY_RESOLVER.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(VARIABLE_RESOLVER.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(LOCALE_CONFIG.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(APPLICATION_EXTENSION.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(DEFAULT_LOCALE.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(SUPPORTED_LOCALE.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(APPLICATION_FACTORY.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(FACES_CONTEXT_FACTORY.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(LIFECYCLE_FACTORY.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(RENDER_KIT_FACTORY.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(FACTORY_EXTENSION.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(FACET.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(ATTRIBUTE.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(PROPERTY.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(COMPONENT_EXTENSION.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(CONVERTER_EXTENSION.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(MANAGED_PROPERTY.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(MAP_ENTRIES.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(LIST_ENTRIES.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(MANAGED_BEAN_EXTENSION.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(NAVIGATION_RULE_EXTENSION.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(RENDER_KIT_EXTENSION.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(PHASE_LISTENER.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(LIFECYCLE_EXTENSION.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(VALIDATOR_EXTENSION.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_1_2.add(RENDERER.getQName(JsfVersion.JSF_1_2));
+        mappedQNames_2_0.add(FACES_CONFIG.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(MANAGED_BEAN.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(CONVERTER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(NAVIGATION_RULE.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(NAVIGATION_CASE.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(DESCRIPTION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(DISPLAY_NAME.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(ICON.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(APPLICATION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(VIEW_HANDLER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(FACTORY.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(COMPONENT.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(REFERENCED_BEAN.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(RENDER_KIT.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(LIFECYCLE.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(VALIDATOR.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(ACTION_LISTENER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(DEFAULT_RENDER_KIT_ID.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(MESSAGE_BUNDLE.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(NAVIGATION_HANDLER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(STATE_MANAGER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(EL_RESOLVER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(PROPERTY_RESOLVER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(VARIABLE_RESOLVER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(LOCALE_CONFIG.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(APPLICATION_EXTENSION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(DEFAULT_LOCALE.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(SUPPORTED_LOCALE.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(APPLICATION_FACTORY.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(FACES_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(LIFECYCLE_FACTORY.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(RENDER_KIT_FACTORY.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(FACTORY_EXTENSION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(FACET.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(ATTRIBUTE.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(PROPERTY.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(COMPONENT_EXTENSION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(CONVERTER_EXTENSION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(MANAGED_PROPERTY.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(MAP_ENTRIES.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(LIST_ENTRIES.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(MANAGED_BEAN_EXTENSION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(NAVIGATION_RULE_EXTENSION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(RENDER_KIT_EXTENSION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(PHASE_LISTENER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(LIFECYCLE_EXTENSION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(VALIDATOR_EXTENSION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(IF.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(REDIRECT.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(VIEW_PARAM.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(PARTIAL_TRAVERSAL.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(SYSTEM_EVENT_LISTENER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(RESOURCE_HANDLER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(DEFAULT_VALIDATORS.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(ORDERING.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(AFTER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(BEFORE.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(ABSOLUTE_ORDERING.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(OTHERS.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(EXCEPTION_HANDLER_FACTORY.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(EXTERNAL_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(PARTIAL_VIEW_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(VIEW_DECLARATION_LANGUAGE_FACTORY.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(TAG_HANDLER_DELEGATE_FACTORY.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(VISIT_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(NAME.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(RENDERER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(CLIENT_BEHAVIOR_RENDERER.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(BEHAVIOR.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_0.add(BEHAVIOR_EXTENSION.getQName(JsfVersion.JSF_2_0));
+        mappedQNames_2_1.add(FACES_CONFIG.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(MANAGED_BEAN.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(CONVERTER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(NAVIGATION_RULE.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(NAVIGATION_CASE.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(DESCRIPTION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(DISPLAY_NAME.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(ICON.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(APPLICATION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(VIEW_HANDLER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(FACTORY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(COMPONENT.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(REFERENCED_BEAN.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(RENDER_KIT.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(LIFECYCLE.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(VALIDATOR.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(ACTION_LISTENER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(DEFAULT_RENDER_KIT_ID.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(MESSAGE_BUNDLE.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(NAVIGATION_HANDLER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(STATE_MANAGER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(EL_RESOLVER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(PROPERTY_RESOLVER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(VARIABLE_RESOLVER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(LOCALE_CONFIG.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(APPLICATION_EXTENSION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(DEFAULT_LOCALE.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(SUPPORTED_LOCALE.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(APPLICATION_FACTORY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(FACES_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(FACELET_CACHE_FACTORY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(LIFECYCLE_FACTORY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(RENDER_KIT_FACTORY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(FACTORY_EXTENSION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(FACET.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(ATTRIBUTE.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(PROPERTY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(COMPONENT_EXTENSION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(CONVERTER_EXTENSION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(MANAGED_PROPERTY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(MAP_ENTRIES.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(LIST_ENTRIES.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(MANAGED_BEAN_EXTENSION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(NAVIGATION_RULE_EXTENSION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(RENDER_KIT_EXTENSION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(PHASE_LISTENER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(LIFECYCLE_EXTENSION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(VALIDATOR_EXTENSION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(IF.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(REDIRECT.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(VIEW_PARAM.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(PARTIAL_TRAVERSAL.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(SYSTEM_EVENT_LISTENER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(RESOURCE_HANDLER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(DEFAULT_VALIDATORS.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(ORDERING.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(AFTER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(BEFORE.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(ABSOLUTE_ORDERING.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(OTHERS.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(EXCEPTION_HANDLER_FACTORY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(EXTERNAL_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(PARTIAL_VIEW_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(VIEW_DECLARATION_LANGUAGE_FACTORY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(TAG_HANDLER_DELEGATE_FACTORY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(VISIT_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(NAME.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(RENDERER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(CLIENT_BEHAVIOR_RENDERER.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(BEHAVIOR.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_1.add(BEHAVIOR_EXTENSION.getQName(JsfVersion.JSF_2_1));
+        mappedQNames_2_2.add(FACES_CONFIG.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(MANAGED_BEAN.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(CONVERTER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(NAVIGATION_RULE.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(NAVIGATION_CASE.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(DESCRIPTION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(DISPLAY_NAME.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(ICON.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(APPLICATION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(VIEW_HANDLER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(COMPONENT.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(REFERENCED_BEAN.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(RENDER_KIT.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(LIFECYCLE.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(VALIDATOR.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(ACTION_LISTENER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(DEFAULT_RENDER_KIT_ID.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(MESSAGE_BUNDLE.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(NAVIGATION_HANDLER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(STATE_MANAGER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(EL_RESOLVER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(PROPERTY_RESOLVER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(VARIABLE_RESOLVER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(LOCALE_CONFIG.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(APPLICATION_EXTENSION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(DEFAULT_LOCALE.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(SUPPORTED_LOCALE.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(APPLICATION_FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FACES_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FACELET_CACHE_FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(LIFECYCLE_FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(RENDER_KIT_FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FACTORY_EXTENSION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FACET.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(ATTRIBUTE.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(PROPERTY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(COMPONENT_EXTENSION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(CONVERTER_EXTENSION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(MANAGED_PROPERTY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(MAP_ENTRIES.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(LIST_ENTRIES.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(MANAGED_BEAN_EXTENSION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(NAVIGATION_RULE_EXTENSION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(RENDER_KIT_EXTENSION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(PHASE_LISTENER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(LIFECYCLE_EXTENSION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(VALIDATOR_EXTENSION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(IF.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(REDIRECT.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(VIEW_PARAM.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(PARTIAL_TRAVERSAL.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(SYSTEM_EVENT_LISTENER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(RESOURCE_HANDLER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(DEFAULT_VALIDATORS.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(ORDERING.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(AFTER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(BEFORE.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(ABSOLUTE_ORDERING.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(OTHERS.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(EXCEPTION_HANDLER_FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(EXTERNAL_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(PARTIAL_VIEW_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(VIEW_DECLARATION_LANGUAGE_FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(TAG_HANDLER_DELEGATE_FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(VISIT_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(NAME.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(RENDERER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(CLIENT_BEHAVIOR_RENDERER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(BEHAVIOR.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(BEHAVIOR_EXTENSION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(RESOURCE_LIBRARY_CONTRACTS.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(RESOURCE_HANDLER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(URL_PATTERN.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FLOW_HANDLER_FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FLASH_FACTORY.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(START_NODE.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(VIEW.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(VDL_DOCUMENT.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(DEFAULT_OUTCOME.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(SWITCH.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(METHOD_CALL.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FLOW_RETURN.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(INITIALIZER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FINALIZER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FLOW_CALL.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(INBOUND_PARAMETER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(OUTBOUND_PARAMETER.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FLOW_REFERENCE.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FLOW_ID.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(METHOD.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(FLOW_DEFINITION.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_2.add(PROTECTED_VIEWS.getQName(JsfVersion.JSF_2_2));
+        mappedQNames_2_3.add(FACES_CONFIG.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(MANAGED_BEAN.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(CONVERTER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(NAVIGATION_RULE.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(NAVIGATION_CASE.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(DESCRIPTION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(DISPLAY_NAME.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(ICON.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(APPLICATION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(VIEW_HANDLER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(COMPONENT.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(REFERENCED_BEAN.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(RENDER_KIT.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(LIFECYCLE.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(VALIDATOR.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(ACTION_LISTENER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(DEFAULT_RENDER_KIT_ID.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(MESSAGE_BUNDLE.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(NAVIGATION_HANDLER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(STATE_MANAGER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(EL_RESOLVER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(PROPERTY_RESOLVER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(VARIABLE_RESOLVER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(LOCALE_CONFIG.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(APPLICATION_EXTENSION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(DEFAULT_LOCALE.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(SUPPORTED_LOCALE.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(APPLICATION_FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FACES_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FACELET_CACHE_FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(LIFECYCLE_FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(RENDER_KIT_FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FACTORY_EXTENSION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FACET.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(ATTRIBUTE.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(PROPERTY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(COMPONENT_EXTENSION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(CONVERTER_EXTENSION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(MANAGED_PROPERTY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(MAP_ENTRIES.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(LIST_ENTRIES.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(MANAGED_BEAN_EXTENSION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(NAVIGATION_RULE_EXTENSION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(RENDER_KIT_EXTENSION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(PHASE_LISTENER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(LIFECYCLE_EXTENSION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(VALIDATOR_EXTENSION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(IF.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(REDIRECT.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(VIEW_PARAM.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(PARTIAL_TRAVERSAL.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(SYSTEM_EVENT_LISTENER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(RESOURCE_HANDLER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(DEFAULT_VALIDATORS.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(ORDERING.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(AFTER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(BEFORE.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(ABSOLUTE_ORDERING.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(OTHERS.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(EXCEPTION_HANDLER_FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(EXTERNAL_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(PARTIAL_VIEW_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(VIEW_DECLARATION_LANGUAGE_FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(TAG_HANDLER_DELEGATE_FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(VISIT_CONTEXT_FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(NAME.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(RENDERER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(CLIENT_BEHAVIOR_RENDERER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(BEHAVIOR.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(BEHAVIOR_EXTENSION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(RESOURCE_LIBRARY_CONTRACTS.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(RESOURCE_HANDLER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(URL_PATTERN.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FLOW_HANDLER_FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FLASH_FACTORY.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(START_NODE.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(VIEW.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(VDL_DOCUMENT.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(DEFAULT_OUTCOME.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(SWITCH.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(METHOD_CALL.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FLOW_RETURN.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(INITIALIZER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FINALIZER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FLOW_CALL.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(INBOUND_PARAMETER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(OUTBOUND_PARAMETER.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FLOW_REFERENCE.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FLOW_ID.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(METHOD.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(FLOW_DEFINITION.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_2_3.add(PROTECTED_VIEWS.getQName(JsfVersion.JSF_2_3));
+        mappedQNames_3_0.add(FACES_CONFIG.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(MANAGED_BEAN.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(CONVERTER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(NAVIGATION_RULE.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(NAVIGATION_CASE.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(DESCRIPTION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(DISPLAY_NAME.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(ICON.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(APPLICATION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(VIEW_HANDLER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(COMPONENT.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(REFERENCED_BEAN.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(RENDER_KIT.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(LIFECYCLE.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(VALIDATOR.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(ACTION_LISTENER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(DEFAULT_RENDER_KIT_ID.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(MESSAGE_BUNDLE.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(NAVIGATION_HANDLER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(STATE_MANAGER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(EL_RESOLVER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(PROPERTY_RESOLVER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(VARIABLE_RESOLVER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(LOCALE_CONFIG.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(APPLICATION_EXTENSION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(DEFAULT_LOCALE.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(SUPPORTED_LOCALE.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(APPLICATION_FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FACES_CONTEXT_FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FACELET_CACHE_FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(LIFECYCLE_FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(RENDER_KIT_FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FACTORY_EXTENSION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FACET.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(ATTRIBUTE.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(PROPERTY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(COMPONENT_EXTENSION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(CONVERTER_EXTENSION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(MANAGED_PROPERTY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(MAP_ENTRIES.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(LIST_ENTRIES.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(MANAGED_BEAN_EXTENSION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(NAVIGATION_RULE_EXTENSION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(RENDER_KIT_EXTENSION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(PHASE_LISTENER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(LIFECYCLE_EXTENSION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(VALIDATOR_EXTENSION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(IF.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(REDIRECT.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(VIEW_PARAM.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(PARTIAL_TRAVERSAL.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(SYSTEM_EVENT_LISTENER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(RESOURCE_HANDLER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(DEFAULT_VALIDATORS.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(ORDERING.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(AFTER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(BEFORE.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(ABSOLUTE_ORDERING.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(OTHERS.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(EXCEPTION_HANDLER_FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(EXTERNAL_CONTEXT_FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(PARTIAL_VIEW_CONTEXT_FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(VIEW_DECLARATION_LANGUAGE_FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(TAG_HANDLER_DELEGATE_FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(VISIT_CONTEXT_FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(NAME.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(RENDERER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(CLIENT_BEHAVIOR_RENDERER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(BEHAVIOR.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(BEHAVIOR_EXTENSION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(RESOURCE_LIBRARY_CONTRACTS.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(RESOURCE_HANDLER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(URL_PATTERN.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FLOW_HANDLER_FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FLASH_FACTORY.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(START_NODE.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(VIEW.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(VDL_DOCUMENT.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(DEFAULT_OUTCOME.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(SWITCH.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(METHOD_CALL.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FLOW_RETURN.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(INITIALIZER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FINALIZER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FLOW_CALL.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(INBOUND_PARAMETER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(OUTBOUND_PARAMETER.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FLOW_REFERENCE.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FLOW_ID.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(METHOD.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(FLOW_DEFINITION.getQName(JsfVersion.JSF_3_0));
+        mappedQNames_3_0.add(PROTECTED_VIEWS.getQName(JsfVersion.JSF_3_0));
         
-        mappedQNames_4_0.add(FACES_CONFIG.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(MANAGED_BEAN.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(CONVERTER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(NAVIGATION_RULE.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(NAVIGATION_CASE.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(DESCRIPTION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(DISPLAY_NAME.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(ICON.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(APPLICATION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(VIEW_HANDLER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(COMPONENT.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(REFERENCED_BEAN.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(RENDER_KIT.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(LIFECYCLE.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(VALIDATOR.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(ACTION_LISTENER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(DEFAULT_RENDER_KIT_ID.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(MESSAGE_BUNDLE.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(NAVIGATION_HANDLER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(STATE_MANAGER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(EL_RESOLVER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(PROPERTY_RESOLVER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(VARIABLE_RESOLVER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(LOCALE_CONFIG.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(APPLICATION_EXTENSION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(DEFAULT_LOCALE.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(SUPPORTED_LOCALE.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(APPLICATION_FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FACES_CONTEXT_FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FACELET_CACHE_FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(LIFECYCLE_FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(RENDER_KIT_FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FACTORY_EXTENSION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FACET.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(ATTRIBUTE.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(PROPERTY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(COMPONENT_EXTENSION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(CONVERTER_EXTENSION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(MANAGED_PROPERTY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(MAP_ENTRIES.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(LIST_ENTRIES.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(MANAGED_BEAN_EXTENSION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(NAVIGATION_RULE_EXTENSION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(RENDER_KIT_EXTENSION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(PHASE_LISTENER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(LIFECYCLE_EXTENSION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(VALIDATOR_EXTENSION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FACES_CONFIG_EXTENSION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(IF.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(REDIRECT.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(VIEW_PARAM.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(PARTIAL_TRAVERSAL.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(SYSTEM_EVENT_LISTENER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(RESOURCE_HANDLER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(DEFAULT_VALIDATORS.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(ORDERING.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(AFTER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(BEFORE.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(ABSOLUTE_ORDERING.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(OTHERS.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(EXCEPTION_HANDLER_FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(EXTERNAL_CONTEXT_FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(PARTIAL_VIEW_CONTEXT_FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(VIEW_DECLARATION_LANGUAGE_FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(TAG_HANDLER_DELEGATE_FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(VISIT_CONTEXT_FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(NAME.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(RENDERER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(CLIENT_BEHAVIOR_RENDERER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(BEHAVIOR.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(BEHAVIOR_EXTENSION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(RESOURCE_LIBRARY_CONTRACTS.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(RESOURCE_BUNDLE.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(RESOURCE_HANDLER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(URL_PATTERN.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FLOW_HANDLER_FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FLASH_FACTORY.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(START_NODE.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(VIEW.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(VDL_DOCUMENT.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(DEFAULT_OUTCOME.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(SWITCH.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(METHOD_CALL.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FLOW_RETURN.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(INITIALIZER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FINALIZER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FLOW_CALL.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(INBOUND_PARAMETER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(OUTBOUND_PARAMETER.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FLOW_REFERENCE.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FLOW_ID.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(METHOD.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(FLOW_DEFINITION.getQName(JSFVersion.JSF_4_0));
-        mappedQNames_4_0.add(PROTECTED_VIEWS.getQName(JSFVersion.JSF_4_0));
+        mappedQNames_4_0.add(FACES_CONFIG.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(MANAGED_BEAN.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(CONVERTER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(NAVIGATION_RULE.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(NAVIGATION_CASE.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(DESCRIPTION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(DISPLAY_NAME.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(ICON.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(APPLICATION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(VIEW_HANDLER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(COMPONENT.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(REFERENCED_BEAN.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(RENDER_KIT.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(LIFECYCLE.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(VALIDATOR.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(ACTION_LISTENER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(DEFAULT_RENDER_KIT_ID.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(MESSAGE_BUNDLE.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(NAVIGATION_HANDLER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(STATE_MANAGER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(EL_RESOLVER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(PROPERTY_RESOLVER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(VARIABLE_RESOLVER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(LOCALE_CONFIG.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(APPLICATION_EXTENSION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(DEFAULT_LOCALE.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(SUPPORTED_LOCALE.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(APPLICATION_FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FACES_CONTEXT_FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FACELET_CACHE_FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(LIFECYCLE_FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(RENDER_KIT_FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FACTORY_EXTENSION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FACET.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(ATTRIBUTE.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(PROPERTY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(COMPONENT_EXTENSION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(CONVERTER_EXTENSION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(MANAGED_PROPERTY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(MAP_ENTRIES.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(LIST_ENTRIES.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(MANAGED_BEAN_EXTENSION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(NAVIGATION_RULE_EXTENSION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(RENDER_KIT_EXTENSION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(PHASE_LISTENER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(LIFECYCLE_EXTENSION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(VALIDATOR_EXTENSION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FACES_CONFIG_EXTENSION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(IF.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(REDIRECT.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(VIEW_PARAM.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(PARTIAL_TRAVERSAL.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(SYSTEM_EVENT_LISTENER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(RESOURCE_HANDLER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(DEFAULT_VALIDATORS.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(ORDERING.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(AFTER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(BEFORE.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(ABSOLUTE_ORDERING.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(OTHERS.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(EXCEPTION_HANDLER_FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(EXTERNAL_CONTEXT_FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(PARTIAL_VIEW_CONTEXT_FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(VIEW_DECLARATION_LANGUAGE_FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(TAG_HANDLER_DELEGATE_FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(VISIT_CONTEXT_FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(NAME.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(RENDERER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(CLIENT_BEHAVIOR_RENDERER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(BEHAVIOR.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(BEHAVIOR_EXTENSION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(RESOURCE_LIBRARY_CONTRACTS.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(RESOURCE_BUNDLE.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(RESOURCE_HANDLER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(URL_PATTERN.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FLOW_HANDLER_FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FLASH_FACTORY.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(START_NODE.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(VIEW.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(VDL_DOCUMENT.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(DEFAULT_OUTCOME.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(SWITCH.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(METHOD_CALL.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FLOW_RETURN.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(INITIALIZER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FINALIZER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FLOW_CALL.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(INBOUND_PARAMETER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(OUTBOUND_PARAMETER.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FLOW_REFERENCE.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FLOW_ID.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(METHOD.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(FLOW_DEFINITION.getQName(JsfVersion.JSF_4_0));
+        mappedQNames_4_0.add(PROTECTED_VIEWS.getQName(JsfVersion.JSF_4_0));
         
     }
 
-    public static Set<QName> getMappedQNames(JSFVersion version) {
+    public static Set<QName> getMappedQNames(JsfVersion version) {
         Set<QName> mappedQNames = mappedQNames_1_1;
-        if (version.equals(JSFVersion.JSF_1_2)) {
+        if (version.equals(JsfVersion.JSF_1_2)) {
             mappedQNames = mappedQNames_1_2;
-        } else if (version.equals(JSFVersion.JSF_2_0)) {
+        } else if (version.equals(JsfVersion.JSF_2_0)) {
             mappedQNames = mappedQNames_2_0;
-        } else if (version.equals(JSFVersion.JSF_2_1)) {
+        } else if (version.equals(JsfVersion.JSF_2_1)) {
             mappedQNames = mappedQNames_2_1;
-        } else if (version.equals(JSFVersion.JSF_2_2)) {
+        } else if (version.equals(JsfVersion.JSF_2_2)) {
             mappedQNames = mappedQNames_2_2;
-        } else if (version.equals(JSFVersion.JSF_2_3)) {
+        } else if (version.equals(JsfVersion.JSF_2_3)) {
             mappedQNames = mappedQNames_2_3;
-        } else if (version.equals(JSFVersion.JSF_3_0)) {
+        } else if (version.equals(JsfVersion.JSF_3_0)) {
             mappedQNames = mappedQNames_3_0;
-        } else if (version.equals(JSFVersion.JSF_4_0)) {
+        } else if (version.equals(JsfVersion.JSF_4_0)) {
             mappedQNames = mappedQNames_4_0;
         }
         return Collections.unmodifiableSet(mappedQNames);
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/FromEntityBase.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/FromEntityBase.java
index 16dfb2912d..d7263296ff 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/FromEntityBase.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/FromEntityBase.java
@@ -48,7 +48,7 @@ import org.netbeans.api.queries.FileEncodingQuery;
 import org.netbeans.modules.j2ee.persistence.wizard.jpacontroller.JpaControllerUtil;
 import org.netbeans.modules.web.api.webmodule.WebModule;
 import org.netbeans.modules.web.jsf.JSFUtils;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
 import org.netbeans.modules.web.jsf.palette.JSFPaletteUtilities;
 import org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo;
 import org.netbeans.modules.web.jsfapi.api.NamespaceUtils;
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/JsfLibrariesSupport.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/JsfLibrariesSupport.java
index 235e1f9adf..f1a6c314b1 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/JsfLibrariesSupport.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/JsfLibrariesSupport.java
@@ -23,7 +23,9 @@ import java.util.Collections;
 import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Predicate;
 import javax.swing.text.Document;
 import javax.swing.text.JTextComponent;
 import org.netbeans.modules.csl.api.DataLoadersBridge;
@@ -37,6 +39,7 @@ import org.netbeans.modules.parsing.spi.Parser;
 import org.netbeans.modules.web.common.api.WebUtils;
 import org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo;
 import org.netbeans.modules.web.jsfapi.api.JsfSupport;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.jsfapi.api.Library;
 import org.netbeans.modules.web.jsfapi.spi.JsfSupportProvider;
 import org.netbeans.modules.web.jsfapi.spi.LibraryUtils;
@@ -105,14 +108,13 @@ public class JsfLibrariesSupport {
             Library lib = jsfs.getLibrary(libraryInfo.getNamespace());
             libraryimport.lib = lib;
 
-            Collection<String> prefixes = ns2prefixes.get(libraryInfo.getNamespace());
-            if (prefixes == null && libraryInfo.getLegacyNamespace() != null) {
-                prefixes = ns2prefixes.get(libraryInfo.getLegacyNamespace());
-            }
-            if (libraryInfo.getLegacyNamespace() != null && ns2prefixes.get(libraryInfo.getLegacyNamespace()) != null) {
-                prefixes.addAll(ns2prefixes.get(libraryInfo.getLegacyNamespace()));
-            }
-            libraryimport.declaredPrefix = prefixes != null && !prefixes.isEmpty() ? prefixes.iterator().next() : null;
+            libraryimport.declaredPrefix = libraryInfo.getValidNamespaces().stream()
+                    .map(ns2prefixes::get)
+                    .filter(Objects::nonNull)
+                    .filter(not(Collection::isEmpty))
+                    .map(c -> c.iterator().next())
+                    .findFirst()
+                    .orElse(null);
 
             map.put(libraryInfo, libraryimport);
         }
@@ -121,7 +123,7 @@ public class JsfLibrariesSupport {
     }
 
     public void importLibraries(DefaultLibraryInfo... linfos) {
-        Map<Library, String> toimport = new HashMap<Library, String>();
+        Map<Library, String> toimport = new HashMap<>();
         for (DefaultLibraryInfo li : linfos) {
             LibraryImport limport = map.get(li);
             assert limport != null;
@@ -130,7 +132,7 @@ public class JsfLibrariesSupport {
                 toimport.put(limport.lib, null); //lets use the default prefix
             }
         }
-        LibraryUtils.importLibrary(tc.getDocument(), toimport, jsfs.isJsf22Plus());
+        LibraryUtils.importLibrary(tc.getDocument(), toimport);
     }
 
     /** @return the library default prefix in the case it hasn't been declared yet or the declared prefix */
@@ -142,12 +144,8 @@ public class JsfLibrariesSupport {
         return limport.declaredPrefix != null ? limport.declaredPrefix : limport.lib.getDefaultPrefix();
     }
 
-    public boolean isJsf22Plus() {
-        return jsfs.isJsf22Plus();
-    }
-
-    public boolean isJsf30Plus() {
-        return jsfs.isJsf30Plus();
+    public JsfVersion getJsfVersion() {
+        return jsfs.getJsfVersion();
     }
 
     private static class LibraryImport {
@@ -155,4 +153,13 @@ public class JsfLibrariesSupport {
         public String declaredPrefix;
     }
 
+    /**
+     * Can be removed when switching enterprise module to Java 11.
+     * @param <T>
+     * @param t
+     * @return 
+     */
+    private static <T> Predicate<T> not(Predicate<T> t) {
+        return t.negate();
+    }
 }
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/ManagedBeanCustomizer.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/ManagedBeanCustomizer.java
index 54bf10e68b..b0aa1998fa 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/ManagedBeanCustomizer.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/ManagedBeanCustomizer.java
@@ -63,8 +63,9 @@ import org.netbeans.modules.web.jsf.JsfTemplateUtils;
 import org.netbeans.modules.web.jsf.JsfTemplateUtils.OpenTemplateAction;
 import org.netbeans.modules.web.jsf.JsfTemplateUtils.TemplateType;
 import org.netbeans.modules.web.jsf.api.editor.JSFBeanCache;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
 import org.netbeans.modules.web.jsf.api.metamodel.FacesManagedBean;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.spi.java.classpath.support.ClassPathSupport;
 import org.openide.DialogDescriptor;
 import org.openide.filesystems.FileObject;
@@ -113,8 +114,8 @@ public class ManagedBeanCustomizer extends javax.swing.JPanel implements Cancell
             }
         });
         this.project = project;
-        JSFVersion projectJsfVersion = JSFVersion.forProject(project);
-        if(projectJsfVersion != null && projectJsfVersion.isAtLeast(JSFVersion.JSF_4_0)){
+        JsfVersion projectJsfVersion = JsfVersionUtils.forProject(project);
+        if(projectJsfVersion != null && projectJsfVersion.isAtLeast(JsfVersion.JSF_4_0)){
             this.jakartaMetaModelSupport = new org.netbeans.modules.jakarta.web.beans.MetaModelSupport(project);
         } else {
             this.metaModelSupport = new org.netbeans.modules.web.beans.MetaModelSupport(project);
@@ -373,7 +374,7 @@ public class ManagedBeanCustomizer extends javax.swing.JPanel implements Cancell
         }
         try {
             //check web beans
-            if(JSFVersion.forProject(project) == JSFVersion.JSF_4_0){
+            if(JsfVersionUtils.forProject(project) == JsfVersion.JSF_4_0){
                jakartaMetaModelSupport.getMetaModel().runReadAction(new MetadataModelAction<org.netbeans.modules.jakarta.web.beans.api.model.WebBeansModel, Void>() {
                 @Override
                 public Void run(org.netbeans.modules.jakarta.web.beans.api.model.WebBeansModel metadata) throws Exception {
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/PrefixResolver.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/PrefixResolver.java
index 6932325ad3..e836d489a0 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/PrefixResolver.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/palette/items/PrefixResolver.java
@@ -34,7 +34,7 @@ public class PrefixResolver {
 
     public String getPrefixForNS(String namespace, String fallbackPrefix) {
         for (DefaultLibraryInfo dli : DefaultLibraryInfo.values()) {
-            if (dli.getNamespace().equals(namespace) || (dli.getLegacyNamespace() != null && dli.getLegacyNamespace().equals(namespace))) {
+            if (dli.getValidNamespaces().contains(namespace)) {
                 return jls.getLibraryPrefix(dli);
             }
         }
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/spi/components/JsfComponentImplementation.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/spi/components/JsfComponentImplementation.java
index eb52422184..028ca5e49c 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/spi/components/JsfComponentImplementation.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/spi/components/JsfComponentImplementation.java
@@ -23,7 +23,8 @@ import java.util.Set;
 import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.annotations.common.NullAllowed;
 import org.netbeans.modules.web.api.webmodule.WebModule;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.openide.filesystems.FileObject;
 
 /**
@@ -89,12 +90,12 @@ public interface JsfComponentImplementation {
      * Returns for which versions is the JSF component library designed.
      * <p>
      * By creating new project and choosing JSF framework are JSF suites filtered
-     * out according to their {@link JSFVersion}s.
+     * out according to their {@link JsfVersionUtils}s.
      *
-     * @return set of {@link JSFVersion} suitable for this JSF component library
+     * @return set of {@link JsfVersionUtils} suitable for this JSF component library
      */
     @NonNull
-    Set<JSFVersion> getJsfVersion();
+    Set<JsfVersion> getJsfVersion();
 
     /**
      * Finds out if a given web module has already been extended with this JSF component library.
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/CompositeComponentWizardIterator.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/CompositeComponentWizardIterator.java
index e4e9cc3e6c..afc4f8a256 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/CompositeComponentWizardIterator.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/CompositeComponentWizardIterator.java
@@ -30,7 +30,8 @@ import org.netbeans.api.project.SourceGroup;
 import org.netbeans.api.project.Sources;
 import org.netbeans.modules.web.api.webmodule.WebModule;
 import org.netbeans.modules.web.api.webmodule.WebProjectConstants;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.wizards.Utilities;
 import org.netbeans.spi.project.ui.templates.support.Templates;
 import org.openide.WizardDescriptor;
@@ -70,10 +71,10 @@ public final class CompositeComponentWizardIterator implements TemplateWizard.It
         Project project = Templates.getProject(wizard);
         WebModule webModule = WebModule.getWebModule(project.getProjectDirectory());
         if (webModule != null) {
-            JSFVersion version = JSFVersion.forWebModule(webModule);
-            if (version != null && version.isAtLeast(JSFVersion.JSF_3_0)) {
+            JsfVersion version = JsfVersionUtils.forWebModule(webModule);
+            if (version != null && version.isAtLeast(JsfVersion.JSF_3_0)) {
                 templateProperties.put("isJSF30", Boolean.TRUE); //NOI18N
-            } else if (version != null && version.isAtLeast(JSFVersion.JSF_2_2)) {
+            } else if (version != null && version.isAtLeast(JsfVersion.JSF_2_2)) {
                 templateProperties.put("isJSF22", Boolean.TRUE); //NOI18N
             }
         }
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/FacesComponentPanel.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/FacesComponentPanel.java
index 299c88d0cf..adf15692ad 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/FacesComponentPanel.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/FacesComponentPanel.java
@@ -22,7 +22,8 @@ import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 import org.netbeans.api.project.Project;
 import org.netbeans.modules.web.api.webmodule.WebModule;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.spi.project.ui.templates.support.Templates;
 import org.openide.WizardDescriptor;
 import org.openide.util.ChangeSupport;
@@ -88,8 +89,8 @@ class FacesComponentPanel implements WizardDescriptor.Panel<WizardDescriptor>, C
         Project project = Templates.getProject(descriptor);
         WebModule webModule = WebModule.getWebModule(project.getProjectDirectory());
         if (webModule != null) {
-            JSFVersion jsfVersion = JSFVersion.forWebModule(webModule);
-            if (jsfVersion != null && !jsfVersion.isAtLeast(JSFVersion.JSF_2_2)) {
+            JsfVersion jsfVersion = JsfVersionUtils.forWebModule(webModule);
+            if (jsfVersion != null && !jsfVersion.isAtLeast(JsfVersion.JSF_2_2)) {
                 descriptor.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, Bundle.FacesComponentPanel_err_jsf_version_not_suficient());
                 return false;
             }
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/FacesConfigIterator.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/FacesConfigIterator.java
index ad63cef824..a094e2730d 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/FacesConfigIterator.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/FacesConfigIterator.java
@@ -46,14 +46,17 @@ import org.netbeans.modules.web.api.webmodule.WebProjectConstants;
 import org.netbeans.modules.web.jsf.JSFCatalog;
 import org.netbeans.modules.web.jsf.JSFConfigUtilities;
 import org.netbeans.modules.web.jsf.JSFUtils;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
-import static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion.JSF_1_0;
-import static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion.JSF_1_1;
-import static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion.JSF_1_2;
-import static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion.JSF_2_0;
-import static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion.JSF_2_1;
-import static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion.JSF_2_2;
-import static org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion.JSF_3_0;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
+import static org.netbeans.modules.web.jsfapi.api.JsfVersion.JSF_1_0;
+import static org.netbeans.modules.web.jsfapi.api.JsfVersion.JSF_1_1;
+import static org.netbeans.modules.web.jsfapi.api.JsfVersion.JSF_1_2;
+import static org.netbeans.modules.web.jsfapi.api.JsfVersion.JSF_2_0;
+import static org.netbeans.modules.web.jsfapi.api.JsfVersion.JSF_2_1;
+import static org.netbeans.modules.web.jsfapi.api.JsfVersion.JSF_2_2;
+import static org.netbeans.modules.web.jsfapi.api.JsfVersion.JSF_2_3;
+import static org.netbeans.modules.web.jsfapi.api.JsfVersion.JSF_3_0;
+import static org.netbeans.modules.web.jsfapi.api.JsfVersion.JSF_4_0;
 import org.netbeans.modules.web.wizards.Utilities;
 import org.netbeans.spi.java.classpath.ClassPathProvider;
 import org.netbeans.spi.project.ui.templates.support.Templates;
@@ -183,7 +186,7 @@ public class FacesConfigIterator implements TemplateWizard.Iterator {
     }
 
     private static String findFacesConfigTemplate(WebModule wm) {
-        JSFVersion jsfVersion = JSFVersion.get(wm, false);
+        JsfVersion jsfVersion = JsfVersionUtils.get(wm, false);
         // not found on project classpath (case of Maven project with JSF in deps)
         if (jsfVersion == null) {
             Profile profile = wm.getJ2eeProfile();
@@ -209,8 +212,8 @@ public class FacesConfigIterator implements TemplateWizard.Iterator {
                     for (ClassPath.Entry entry : compileClasspath.entries()) {
                         cpUrls.add(entry.getURL());
                     }
-                    jsfVersion = JSFVersion.forClasspath(cpUrls);
-                    jsfVersion = jsfVersion == null ? JSFVersion.JSF_2_3 : jsfVersion;
+                    jsfVersion = JsfVersionUtils.forClasspath(cpUrls);
+                    jsfVersion = jsfVersion == null ? JsfVersion.JSF_2_3 : jsfVersion;
                     return facesConfigForVersion(jsfVersion);
                 }
             }
@@ -219,7 +222,7 @@ public class FacesConfigIterator implements TemplateWizard.Iterator {
         return facesConfigForVersion(jsfVersion);
     }
 
-    private static String facesConfigForVersion(JSFVersion jsfVersion) {
+    private static String facesConfigForVersion(JsfVersion jsfVersion) {
         switch (jsfVersion) {
             case JSF_4_0:
                 return JSFCatalog.RES_FACES_CONFIG_4_0;
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/JSFConfigurationPanelVisual.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/JSFConfigurationPanelVisual.java
index ff85ec7650..664665783c 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/JSFConfigurationPanelVisual.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/JSFConfigurationPanelVisual.java
@@ -90,12 +90,13 @@ import org.netbeans.modules.j2ee.deployment.plugins.api.ServerLibraryDependency;
 import org.netbeans.modules.web.api.webmodule.ExtenderController;
 import org.netbeans.modules.web.api.webmodule.ExtenderController.Properties;
 import org.netbeans.modules.web.jsf.JSFUtils;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
 import org.netbeans.modules.web.jsf.spi.components.JsfComponentCustomizer;
 import org.netbeans.modules.web.jsf.spi.components.JsfComponentImplementation;
 import org.netbeans.modules.web.jsf.spi.components.JsfComponentProvider;
 import org.netbeans.modules.web.jsf.wizards.JSFConfigurationPanel.LibraryType;
 import org.netbeans.modules.web.jsf.wizards.JSFConfigurationPanel.PreferredLanguage;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.spi.java.classpath.ClassPathProvider;
 import org.openide.DialogDescriptor;
 import org.openide.DialogDisplayer;
@@ -122,11 +123,11 @@ public class JSFConfigurationPanelVisual extends javax.swing.JPanel implements H
 
     private final List<LibraryItem> jsfLibraries = new ArrayList<LibraryItem>();
     //    private final List<JsfComponentDescriptor> componentsLibraries = new ArrayList<JsfComponentDescriptor>();
-    private final Map<JSFVersion, List<JsfComponentImplementation>> componentsMap = new HashMap<JSFVersion, List<JsfComponentImplementation>>();
+    private final Map<JsfVersion, List<JsfComponentImplementation>> componentsMap = new HashMap<>();
     /**
      * Do not modify it directly, use setJsfVersion method
      */
-    private JSFVersion currentJSFVersion = null;
+    private JsfVersion currentJSFVersion = null;
     private final Set<ServerLibraryItem> serverJsfLibraries = new TreeSet<ServerLibraryItem>();
     private volatile boolean libsInitialized;
     private volatile boolean jsfComponentsInitialized;
@@ -339,7 +340,7 @@ public class JSFConfigurationPanelVisual extends javax.swing.JPanel implements H
             jsfComponentDescriptors.addAll(provider.getJsfComponents());
         }
 
-        for (JSFVersion jsfVersion : JSFVersion.values()) {
+        for (JsfVersion jsfVersion : JsfVersion.values()) {
             List<JsfComponentImplementation> list = componentsMap.get(jsfVersion);
             if (list == null) {
                 list = new ArrayList<JsfComponentImplementation>();
@@ -450,13 +451,13 @@ public class JSFConfigurationPanelVisual extends javax.swing.JPanel implements H
         } else if (libraryType == LibraryType.SERVER) {
             if (serverLibraries.getSelectedItem() instanceof ServerLibraryItem) {
                 ServerLibraryItem item = (ServerLibraryItem) serverLibraries.getSelectedItem();
-                if (item != null && item.getVersion().isAtLeast(JSFVersion.JSF_2_0)) {
+                if (item != null && item.getVersion().isAtLeast(JsfVersion.JSF_2_0)) {
                     faceletsPresent = true;
                 }
             }
         }
         if (jsfLibrary != null) {
-            if (jsfLibraries.get(cbLibraries.getSelectedIndex()).getVersion().isAtLeast(JSFVersion.JSF_2_0)) {
+            if (jsfLibraries.get(cbLibraries.getSelectedIndex()).getVersion().isAtLeast(JsfVersion.JSF_2_0)) {
                 faceletsPresent = true;
             } else {
                 List<URL> content = jsfLibrary.getContent("classpath"); //NOI18N
@@ -1090,7 +1091,7 @@ private void serverLibrariesActionPerformed(java.awt.event.ActionEvent evt) {//G
         }
     }
 
-    void setJsfVersion(JSFVersion version) {
+    void setJsfVersion(JsfVersion version) {
         if (version != currentJSFVersion) {
             currentJSFVersion = version;
             updateJsfComponentsModel(version);
@@ -1232,7 +1233,7 @@ private void serverLibrariesActionPerformed(java.awt.event.ActionEvent evt) {//G
         }
         updatePreferredLanguages();
     }
-    private void updateJsfComponentsModel(JSFVersion version) {
+    private void updateJsfComponentsModel(JsfVersion version) {
         List<JsfComponentImplementation> descriptors = componentsMap.get(version);
         jsfComponentsTableModel.removeAllItems();
         if (descriptors != null) {
@@ -1308,9 +1309,9 @@ private void serverLibrariesActionPerformed(java.awt.event.ActionEvent evt) {//G
     private static class LibraryItem {
 
         private Library library;
-        private JSFVersion version;
+        private JsfVersion version;
 
-        public LibraryItem(Library library, JSFVersion version) {
+        public LibraryItem(Library library, JsfVersion version) {
             this.library = library;
             this.version = version;
         }
@@ -1319,7 +1320,7 @@ private void serverLibrariesActionPerformed(java.awt.event.ActionEvent evt) {//G
             return library;
         }
 
-        public JSFVersion getVersion() {
+        public JsfVersion getVersion() {
             return version;
         }
 
@@ -1332,11 +1333,11 @@ private void serverLibrariesActionPerformed(java.awt.event.ActionEvent evt) {//G
 
         private final ServerLibrary library;
 
-        private final JSFVersion version;
+        private final JsfVersion version;
 
         private String name;
 
-        public ServerLibraryItem(ServerLibrary library, JSFVersion version) {
+        public ServerLibraryItem(ServerLibrary library, JsfVersion version) {
             this.library = library;
             this.version = version;
         }
@@ -1345,7 +1346,7 @@ private void serverLibrariesActionPerformed(java.awt.event.ActionEvent evt) {//G
             return library;
         }
 
-        public JSFVersion getVersion() {
+        public JsfVersion getVersion() {
             return version;
         }
 
@@ -1408,7 +1409,7 @@ private void serverLibrariesActionPerformed(java.awt.event.ActionEvent evt) {//G
 
     }
 
-    private void initJsfComponentLibraries(JSFVersion version) {
+    private void initJsfComponentLibraries(JsfVersion version) {
         List<JsfComponentImplementation> descriptors = componentsMap.get(version);
         if (descriptors == null) {
             return;
@@ -1757,7 +1758,7 @@ private void serverLibrariesActionPerformed(java.awt.event.ActionEvent evt) {//G
         @Override
         public void run() {
             long time = System.currentTimeMillis();
-            Set<JSFVersion> found = EnumSet.noneOf(JSFVersion.class);
+            Set<JsfVersion> found = EnumSet.noneOf(JsfVersion.class);
             if (isServerRegistered(serverInstanceID)) {
                 try {
                     ServerInstance.LibraryManager libManager = Deployment.getDefault().getServerInstance(serverInstanceID).getLibraryManager();
@@ -1766,7 +1767,7 @@ private void serverLibrariesActionPerformed(java.awt.event.ActionEvent evt) {//G
                         libs.addAll(libManager.getDeployedLibraries());
                         libs.addAll(libManager.getDeployableLibraries());
                         for (ServerLibrary lib : libs) {
-                            JSFVersion jsfVersion = JSFVersion.forServerLibrary(lib);
+                            JsfVersion jsfVersion = JsfVersionUtils.forServerLibrary(lib);
                             if (jsfVersion != null) {
                                 serverJsfLibraries.add(new JSFConfigurationPanelVisual.ServerLibraryItem(lib, jsfVersion));
                                 found.add(jsfVersion);
@@ -1796,7 +1797,7 @@ private void serverLibrariesActionPerformed(java.awt.event.ActionEvent evt) {//G
                 cp = new File[0];
             }
 
-            JSFVersion jsfVersion = JSFVersion.forClasspath(Arrays.asList(cp));
+            JsfVersion jsfVersion = JsfVersionUtils.forClasspath(Arrays.asList(cp));
             if (jsfVersion != null && !found.contains(jsfVersion)) {
                 serverJsfLibraries.add(new JSFConfigurationPanelVisual.ServerLibraryItem(null, jsfVersion));
             }
@@ -1858,8 +1859,8 @@ private void serverLibrariesActionPerformed(java.awt.event.ActionEvent evt) {//G
                 long time = System.currentTimeMillis();
                 for (Library library : getOrCacheJsfLibraries()) {
                     List<URL> content = library.getContent("classpath"); //NOI18N
-                    JSFVersion jsfVersion = JSFVersion.forClasspath(content);
-                    LibraryItem item = jsfVersion != null ? new LibraryItem(library, jsfVersion) : new LibraryItem(library, JSFVersion.JSF_1_1);
+                    JsfVersion jsfVersion = JsfVersionUtils.forClasspath(content);
+                    LibraryItem item = jsfVersion != null ? new LibraryItem(library, jsfVersion) : new LibraryItem(library, JsfVersion.JSF_1_1);
                     jsfLibraries.add(item);
                     Collections.sort(jsfLibraries, new Comparator<LibraryItem>() {
                         @Override
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/ManagedBeanPanelVisual.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/ManagedBeanPanelVisual.java
index 3080e732f2..7b0896e164 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/ManagedBeanPanelVisual.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/ManagedBeanPanelVisual.java
@@ -34,15 +34,14 @@ import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectUtils;
 import org.netbeans.api.project.SourceGroup;
 import org.netbeans.modules.web.api.webmodule.WebModule;
-import org.netbeans.modules.web.beans.CdiUtil;
 import org.netbeans.modules.web.jsf.JSFConfigUtilities;
 import org.netbeans.modules.web.jsf.JSFUtils;
 import org.netbeans.modules.web.jsf.api.ConfigurationUtils;
 import org.netbeans.modules.web.jsf.api.facesmodel.FacesConfig;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
 import org.netbeans.modules.web.jsf.api.facesmodel.ManagedBean;
-import org.netbeans.modules.web.jsf.palette.items.JsfLibrariesSupport;
 import org.netbeans.modules.web.jsf.wizards.ManagedBeanIterator.NamedScope;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.wizards.Utilities;
 import org.netbeans.spi.project.ui.templates.support.Templates;
 import org.openide.WizardDescriptor;
@@ -308,8 +307,8 @@ public class ManagedBeanPanelVisual extends javax.swing.JPanel implements HelpCt
 
         Object scope = jComboBoxScope.getSelectedItem();
         if (scope instanceof NamedScope && scope == NamedScope.FLOW) {
-            JSFVersion jsfVersion = JSFVersion.forWebModule(wm);
-            if (jsfVersion != null && !jsfVersion.isAtLeast(JSFVersion.JSF_2_2)) {
+            JsfVersion jsfVersion = JsfVersionUtils.forWebModule(wm);
+            if (jsfVersion != null && !jsfVersion.isAtLeast(JsfVersion.JSF_2_2)) {
                 wizardDescriptor.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE,
                         Bundle.ManagedBeanPanelVisual_warn_flowScoped_low_version());
                 return false;
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/PersistenceClientIterator.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/PersistenceClientIterator.java
index eac925477d..aa03448492 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/PersistenceClientIterator.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/PersistenceClientIterator.java
@@ -77,7 +77,6 @@ import org.netbeans.modules.j2ee.persistence.wizard.unit.PersistenceUnitWizardPa
 import org.netbeans.modules.web.api.webmodule.ExtenderController;
 import org.netbeans.modules.web.api.webmodule.WebModule;
 import org.netbeans.modules.web.api.webmodule.WebProjectConstants;
-import org.netbeans.modules.web.beans.CdiUtil;
 import org.netbeans.modules.web.jsf.JSFFrameworkProvider;
 import org.netbeans.modules.web.jsf.JSFUtils;
 import org.netbeans.modules.web.jsf.JsfPreferences;
@@ -85,12 +84,13 @@ import org.netbeans.modules.web.jsf.JsfTemplateUtils;
 import org.netbeans.modules.web.jsf.api.ConfigurationUtils;
 import org.netbeans.modules.web.jsf.api.facesmodel.Application;
 import org.netbeans.modules.web.jsf.api.facesmodel.JSFConfigModel;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
 import org.netbeans.modules.web.jsf.api.facesmodel.ResourceBundle;
 import org.netbeans.modules.web.jsf.impl.facesmodel.JSFConfigModelUtilities;
 import org.netbeans.modules.web.jsf.palette.JSFPaletteUtilities;
 import org.netbeans.modules.web.jsf.palette.items.FromEntityBase;
 import org.netbeans.modules.web.jsf.wizards.JSFConfigurationPanel.PreferredLanguage;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.spi.webmodule.WebModuleExtender;
 import org.openide.DialogDisplayer;
 import org.openide.NotifyDescriptor;
@@ -771,10 +771,10 @@ public class PersistenceClientIterator implements TemplateWizard.Iterator {
         HelpCtx helpCtx;
 
         WebModule wm = WebModule.getWebModule(project.getProjectDirectory());
-        JSFVersion jsfVersion = JSFVersion.forWebModule(wm);
+        JsfVersion jsfVersion = JsfVersionUtils.forWebModule(wm);
 
         if (wm.getJ2eeProfile() != null && wm.getJ2eeProfile().isAtLeast(Profile.JAVA_EE_6_WEB)
-                || (jsfVersion != null && jsfVersion.isAtLeast(JSFVersion.JSF_2_0))) {
+                || (jsfVersion != null && jsfVersion.isAtLeast(JsfVersion.JSF_2_0))) {
             wizard.putProperty(JSF2_GENERATOR_PROPERTY, "true");
             helpCtx = new HelpCtx("persistence_entity_selection_javaee6");  //NOI18N
         } else {
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/ResourceLibraryIterator.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/ResourceLibraryIterator.java
index 9f54e80ce9..fb54710081 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/ResourceLibraryIterator.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/ResourceLibraryIterator.java
@@ -23,7 +23,6 @@ import java.io.IOException;
 import java.util.HashSet;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import java.util.logging.Logger;
 import javax.swing.JComponent;
 import javax.swing.event.ChangeListener;
 import org.netbeans.api.java.project.JavaProjectConstants;
@@ -32,14 +31,13 @@ import org.netbeans.api.project.ProjectUtils;
 import org.netbeans.api.project.SourceGroup;
 import org.netbeans.api.project.Sources;
 import org.netbeans.modules.web.api.webmodule.WebModule;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.spi.project.ui.templates.support.Templates;
 import org.openide.WizardDescriptor;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
 import org.openide.loaders.DataObject;
 import org.openide.loaders.TemplateWizard;
-import org.openide.util.Exceptions;
 import org.openide.util.NbBundle;
 
 /**
@@ -94,7 +92,7 @@ public class ResourceLibraryIterator implements TemplateWizard.Iterator {
                     (String) wiz.getProperty(ResourceLibraryIteratorPanel.PROP_TEMPLATE_NAME),
                     contractFolder,
                     cssFolder,
-                    JSFVersion.JSF_2_2);
+                    JsfVersion.JSF_2_2);
             contractsParent.getFileSystem().runAtomicAction(templateAction);
             result.add(DataObject.find(templateAction.getResult()));
         }
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/TemplateClientIterator.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/TemplateClientIterator.java
index a54a6d273a..12217f2d6d 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/TemplateClientIterator.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/TemplateClientIterator.java
@@ -34,13 +34,13 @@ import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectUtils;
 import org.netbeans.api.project.SourceGroup;
 import org.netbeans.api.project.Sources;
-import org.netbeans.modules.web.api.webmodule.WebModule;
 import org.netbeans.modules.web.api.webmodule.WebProjectConstants;
 import org.netbeans.modules.web.jsf.JSFFrameworkProvider;
 import org.netbeans.modules.web.jsf.JSFUtils;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
 import org.netbeans.modules.web.jsf.palette.JSFPaletteUtilities;
 import org.netbeans.modules.web.jsf.wizards.TemplateClientPanel.TemplateEntry;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.jsfapi.api.NamespaceUtils;
 import org.netbeans.spi.project.ui.templates.support.Templates;
 import org.openide.WizardDescriptor;
@@ -92,8 +92,8 @@ public class TemplateClientIterator implements TemplateWizard.Iterator {
                         ((content.indexOf("<html") == -1)?1:3));    //NOI18N
 
                 Project project = Templates.getProject(wiz);
-                final JSFVersion jsfVersion = JSFVersion.forProject(project);
-                String namespaceLocation = (jsfVersion != null && jsfVersion.isAtLeast(JSFVersion.JSF_2_2))
+                final JsfVersion jsfVersion = JsfVersionUtils.forProject(project);
+                String namespaceLocation = (jsfVersion != null && jsfVersion.isAtLeast(JsfVersion.JSF_2_2))
                         ? NamespaceUtils.JCP_ORG_LOCATION : NamespaceUtils.SUN_COM_LOCATION;
                 HashMap args = new HashMap();
                 args.put("TEMPLATE", relativePath); //NOI18N
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/TemplateClientPanelVisual.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/TemplateClientPanelVisual.java
index f9b4341a96..3abe35ebf0 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/TemplateClientPanelVisual.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/TemplateClientPanelVisual.java
@@ -28,6 +28,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
@@ -395,26 +396,23 @@ public class TemplateClientPanelVisual extends javax.swing.JPanel implements Hel
                     Result result = resultIterator.getParserResult(0);
                     if (result.getSnapshot().getMimeType().equals("text/html")) {
                         HtmlParserResult htmlResult = (HtmlParserResult)result;
-                        String ns = null;
-                        if (htmlResult.getNamespaces().containsKey(DefaultLibraryInfo.FACELETS.getNamespace())) {
-                            ns = DefaultLibraryInfo.FACELETS.getNamespace();
-                        } else if (htmlResult.getNamespaces().containsKey(DefaultLibraryInfo.FACELETS.getLegacyNamespace())) {
-                            ns = DefaultLibraryInfo.FACELETS.getLegacyNamespace();
-                        }
-                        if (ns != null) {
-                            String faceletsPrefix = htmlResult.getNamespaces().get(ns);
-                            List<OpenTag> foundNodes = findValue(htmlResult.root(ns).children(OpenTag.class), faceletsPrefix + ":insert", new ArrayList<OpenTag>()); // NOI18N
-
-                            for (OpenTag node : foundNodes) {
-                                Attribute attr = node.getAttribute(VALUE_NAME);
-                                if (attr !=null) {
-                                     String value = attr.unquotedValue().toString();
-                                    if (value != null && !"".equals(value)) {   //NOI18N
-                                        templateData.add(value);
-                                    }
-                                }
-                            }
+                        String ns = DefaultLibraryInfo.FACELETS.getValidNamespaces().stream()
+                                .filter(htmlResult.getNamespaces()::containsKey)
+                                .findFirst()
+                                .orElse(null);
+                        if (ns == null) {
+                            return;
                         }
+                        String faceletsPrefix = htmlResult.getNamespaces().get(ns);
+                        List<OpenTag> foundNodes = findValue(htmlResult.root(ns).children(OpenTag.class), faceletsPrefix + ":insert", new ArrayList<OpenTag>()); // NOI18N
+
+                        foundNodes.stream()
+                                .map(node -> node.getAttribute(VALUE_NAME))
+                                .filter(Objects::nonNull)
+                                .map(Attribute::unquotedValue)
+                                .filter(value -> value != null && !"".equals(value))
+                                .map(CharSequence::toString)
+                                .forEach(templateData::add);
                     }
                 }
             });
diff --git a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/TemplateIterator.java b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/TemplateIterator.java
index 27e8def3fa..10fc4c20de 100644
--- a/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/TemplateIterator.java
+++ b/enterprise/web.jsf/src/org/netbeans/modules/web/jsf/wizards/TemplateIterator.java
@@ -38,8 +38,9 @@ import org.netbeans.modules.web.api.webmodule.WebProjectConstants;
 import org.netbeans.modules.web.jsf.JSFConfigUtilities;
 import org.netbeans.modules.web.jsf.JSFFrameworkProvider;
 import org.netbeans.modules.web.jsf.JSFUtils;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
+import org.netbeans.modules.web.jsf.api.facesmodel.JsfVersionUtils;
 import org.netbeans.modules.web.jsf.palette.JSFPaletteUtilities;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.jsfapi.api.NamespaceUtils;
 import org.netbeans.spi.project.ui.templates.support.Templates;
 import org.openide.WizardDescriptor;
@@ -90,9 +91,9 @@ public class TemplateIterator implements TemplateWizard.Iterator {
                 JSFConfigUtilities.extendJsfFramework(dir, false);
             }
 
-            JSFVersion version = JSFVersion.forWebModule(wm);
+            JsfVersion version = JsfVersionUtils.forWebModule(wm);
             String templateFile = TEMPLATE_XHTML2;
-            if (version != null && version.isAtLeast(JSFVersion.JSF_2_2)) {
+            if (version != null && version.isAtLeast(JsfVersion.JSF_2_2)) {
                 templateFile = TEMPLATE_XHTML22;
             }
             String content = JSFFrameworkProvider.readResource(Thread.currentThread().getContextClassLoader().getResourceAsStream(FL_RESOURCE_FOLDER + templateFile), ENCODING);
@@ -118,16 +119,16 @@ public class TemplateIterator implements TemplateWizard.Iterator {
                 if (!JSFConfigUtilities.hasJsfFramework(docBase)) {
                     JSFConfigUtilities.extendJsfFramework(dir, false);
                 }
-                final JSFVersion jsfVersion = JSFVersion.forWebModule(wm) != null ? JSFVersion.forWebModule(wm) : JSFVersion.JSF_2_2;
+                final JsfVersion jsfVersion = JsfVersionUtils.forWebModule(wm) != null ? JsfVersionUtils.forWebModule(wm) : JsfVersion.JSF_2_2;
                 FileObject cssFolder = handleCssFolderCreation(jsfVersion, docBase);
                 return createTemplate(wiz, df, targetName, cssFolder, jsfVersion);
             } else {
                 // get the JSF version
                 Project project = Templates.getProject(wiz);
-                JSFVersion jsfVersion = JSFVersion.forProject(project);
-                jsfVersion = jsfVersion == null ? JSFVersion.JSF_2_2 : jsfVersion;
+                JsfVersion jsfVersion = JsfVersionUtils.forProject(project);
+                jsfVersion = jsfVersion == null ? JsfVersion.JSF_2_2 : jsfVersion;
 
-                String folderName = (jsfVersion == null || jsfVersion.isAtLeast(JSFVersion.JSF_2_0)) ? CSS_FOLDER2 : CSS_FOLDER;
+                String folderName = (jsfVersion == null || jsfVersion.isAtLeast(JsfVersion.JSF_2_0)) ? CSS_FOLDER2 : CSS_FOLDER;
                 Sources sources = ProjectUtils.getSources(project);
                 SourceGroup[] sourceGroups = sources.getSourceGroups("java"); //NOII18N
                 if (sourceGroups.length > 0) {
@@ -274,8 +275,8 @@ public class TemplateIterator implements TemplateWizard.Iterator {
         return res;
     }
 
-    private FileObject handleCssFolderCreation(JSFVersion jsfVersion, FileObject rootDir) throws IOException {
-        String folderName = (jsfVersion == null || jsfVersion.isAtLeast(JSFVersion.JSF_2_0)) ? CSS_FOLDER2 : CSS_FOLDER;
+    private FileObject handleCssFolderCreation(JsfVersion jsfVersion, FileObject rootDir) throws IOException {
+        String folderName = (jsfVersion == null || jsfVersion.isAtLeast(JsfVersion.JSF_2_0)) ? CSS_FOLDER2 : CSS_FOLDER;
         FileObject cssFolder = rootDir.getFileObject(folderName);
         if (cssFolder == null) {
             cssFolder = FileUtil.createFolder(rootDir, folderName);
@@ -283,7 +284,7 @@ public class TemplateIterator implements TemplateWizard.Iterator {
         return cssFolder;
     }
 
-    private Set<DataObject> createTemplate(TemplateWizard wiz, DataFolder df, String targetName, FileObject cssFolder, JSFVersion jsfVersion) throws IOException {
+    private Set<DataObject> createTemplate(TemplateWizard wiz, DataFolder df, String targetName, FileObject cssFolder, JsfVersion jsfVersion) throws IOException {
         CreateTemplateAction createTemplateAction = new CreateTemplateAction(
                 templatePanel.getComponent(),
                 Templates.getTargetName(wiz),
@@ -304,11 +305,11 @@ public class TemplateIterator implements TemplateWizard.Iterator {
         private final String templateName;
         private final FileObject targetFolder;
         private final FileObject cssTargetFolder;
-        private final JSFVersion jsfVersion;
+        private final JsfVersion jsfVersion;
         private FileObject result;
 
         public CreateTemplateAction(TemplatePanelVisual templatePanel, String templateName, FileObject targetFolder,
-                FileObject cssTargetFolder, JSFVersion jsfVersion) {
+                FileObject cssTargetFolder, JsfVersion jsfVersion) {
             this.templatePanel = templatePanel;
             this.templateName = templateName;
             this.targetFolder = targetFolder;
@@ -340,10 +341,10 @@ public class TemplateIterator implements TemplateWizard.Iterator {
 
             is = templatePanel.getTemplate();
             String content = JSFFrameworkProvider.readResource(is, ENCODING);
-            if (!jsfVersion.isAtLeast(JSFVersion.JSF_2_0)) {
+            if (!jsfVersion.isAtLeast(JsfVersion.JSF_2_0)) {
                 content = content.replace("h:head", "head").replace("h:body", "body"); //NOI18N
             }
-            String namespaceLocation = jsfVersion.isAtLeast(JSFVersion.JSF_2_2) ? NamespaceUtils.JCP_ORG_LOCATION : NamespaceUtils.SUN_COM_LOCATION;
+            String namespaceLocation = jsfVersion.isAtLeast(JsfVersion.JSF_2_2) ? NamespaceUtils.JCP_ORG_LOCATION : NamespaceUtils.SUN_COM_LOCATION;
 
             HashMap args = new HashMap();
             args.put("LAYOUT_CSS_PATH", layoutPath);    //NOI18N
diff --git a/enterprise/web.jsf/test/unit/src/org/netbeans/modules/web/jsf/xdm/model/JSFConfigModelTest.java b/enterprise/web.jsf/test/unit/src/org/netbeans/modules/web/jsf/xdm/model/JSFConfigModelTest.java
index 7697aba399..34bceff635 100644
--- a/enterprise/web.jsf/test/unit/src/org/netbeans/modules/web/jsf/xdm/model/JSFConfigModelTest.java
+++ b/enterprise/web.jsf/test/unit/src/org/netbeans/modules/web/jsf/xdm/model/JSFConfigModelTest.java
@@ -36,6 +36,7 @@ import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.web.jsf.api.facesmodel.*;
 import org.netbeans.modules.web.jsf.impl.facesmodel.FacesAttributes;
 import org.netbeans.modules.web.jsf.impl.facesmodel.JSFConfigModelImpl;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.xml.xam.Model;
 import org.netbeans.modules.xml.xam.ModelSource;
 import org.openide.filesystems.FileObject;
@@ -112,7 +113,7 @@ public class JSFConfigModelTest extends NbTestCase {
     public void testReadJSFVersion2_2() throws Exception {
         // TODO finish with JSF2.2 update
         JSFConfigModel model = Util.loadRegistryModel("faces-config_2_2.xml");
-        assertEquals(JSFVersion.JSF_2_2, model.getVersion());
+        assertEquals(JsfVersion.JSF_2_2, model.getVersion());
         FacesConfig facesConfig = model.getRootComponent();
         assertNotNull(facesConfig);
         System.out.println("facesConfig: " + facesConfig);
@@ -329,9 +330,9 @@ public class JSFConfigModelTest extends NbTestCase {
 
     public void testJSFVersion() throws Exception{
         JSFConfigModel model = Util.loadRegistryModel("faces-config-jsfjpa-example.xml");
-        assertEquals(JSFVersion.JSF_1_2, model.getVersion());
+        assertEquals(JsfVersion.JSF_1_2, model.getVersion());
         model = Util.loadRegistryModel("faces-config-01.xml");
-        assertEquals(JSFVersion.JSF_1_1, model.getVersion());
+        assertEquals(JsfVersion.JSF_1_1, model.getVersion());
     }
 
     public void testComments() throws Exception {
diff --git a/enterprise/web.jsf20/nbproject/project.xml b/enterprise/web.jsf20/nbproject/project.xml
index 3acf2fdb84..f34a3cebca 100644
--- a/enterprise/web.jsf20/nbproject/project.xml
+++ b/enterprise/web.jsf20/nbproject/project.xml
@@ -39,8 +39,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.21</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/enterprise/web.jsfapi/manifest.mf b/enterprise/web.jsfapi/manifest.mf
index 36ea78a83c..2e0b8ae0ec 100644
--- a/enterprise/web.jsfapi/manifest.mf
+++ b/enterprise/web.jsfapi/manifest.mf
@@ -1,6 +1,5 @@
 Manifest-Version: 1.0
 AutoUpdate-Show-In-Client: false
-OpenIDE-Module: org.netbeans.modules.web.jsfapi/1
+OpenIDE-Module: org.netbeans.modules.web.jsfapi/2
 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/web/jsfapi/Bundle.properties
-OpenIDE-Module-Specification-Version: 1.55
-
+OpenIDE-Module-Specification-Version: 2.0.0
diff --git a/enterprise/web.jsfapi/nbproject/org-netbeans-modules-web-jsfapi.sig b/enterprise/web.jsfapi/nbproject/org-netbeans-modules-web-jsfapi.sig
index a1e49b1ab9..8043f363aa 100644
--- a/enterprise/web.jsfapi/nbproject/org-netbeans-modules-web-jsfapi.sig
+++ b/enterprise/web.jsfapi/nbproject/org-netbeans-modules-web-jsfapi.sig
@@ -1,5 +1,5 @@
 #Signature file v4.1
-#Version 1.54
+#Version 2.0.0
 
 CLSS public abstract interface java.io.Serializable
 
@@ -109,26 +109,43 @@ fld public final static org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo P
 intf org.netbeans.modules.web.jsfapi.api.LibraryInfo
 meth public java.lang.String getDefaultPrefix()
 meth public java.lang.String getDisplayName()
-meth public java.lang.String getLegacyNamespace()
 meth public java.lang.String getNamespace()
+meth public java.util.Set<java.lang.String> getValidNamespaces()
 meth public static org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo valueOf(java.lang.String)
 meth public static org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo[] values()
 meth public static org.netbeans.modules.web.jsfapi.api.LibraryInfo forNamespace(java.lang.String)
 supr java.lang.Enum<org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo>
-hfds ALL_INFOS,defaultPrefix,displayName,namespace
+hfds allValidNamespaces,defaultPrefix,displayName
 
 CLSS public abstract interface org.netbeans.modules.web.jsfapi.api.Function
 meth public abstract java.lang.String getDescription()
 meth public abstract java.lang.String getName()
 meth public abstract java.lang.String getSignature()
 
+CLSS public final !enum org.netbeans.modules.web.jsfapi.api.JsfNamespaces
+fld public final static org.netbeans.modules.web.jsfapi.api.JsfNamespaces JAKARTA_EE_NS
+fld public final static org.netbeans.modules.web.jsfapi.api.JsfNamespaces JAVA_SUN_COM_NS
+fld public final static org.netbeans.modules.web.jsfapi.api.JsfNamespaces XMLNS_JCP_ORG_NS
+innr public final static !enum Type
+meth public java.lang.String getNamespace(org.netbeans.modules.web.jsfapi.api.JsfNamespaces$Type)
+meth public static org.netbeans.modules.web.jsfapi.api.JsfNamespaces valueOf(java.lang.String)
+meth public static org.netbeans.modules.web.jsfapi.api.JsfNamespaces[] values()
+supr java.lang.Enum<org.netbeans.modules.web.jsfapi.api.JsfNamespaces>
+hfds namespaces
+
+CLSS public final static !enum org.netbeans.modules.web.jsfapi.api.JsfNamespaces$Type
+ outer org.netbeans.modules.web.jsfapi.api.JsfNamespaces
+fld public final static org.netbeans.modules.web.jsfapi.api.JsfNamespaces$Type TAGLIB
+meth public static org.netbeans.modules.web.jsfapi.api.JsfNamespaces$Type valueOf(java.lang.String)
+meth public static org.netbeans.modules.web.jsfapi.api.JsfNamespaces$Type[] values()
+supr java.lang.Enum<org.netbeans.modules.web.jsfapi.api.JsfNamespaces$Type>
+
 CLSS public abstract interface org.netbeans.modules.web.jsfapi.api.JsfSupport
-meth public abstract boolean isJsf22Plus()
-meth public abstract boolean isJsf30Plus()
 meth public abstract java.util.Map<java.lang.String,? extends org.netbeans.modules.web.jsfapi.api.Library> getLibraries()
 meth public abstract org.netbeans.api.java.classpath.ClassPath getClassPath()
 meth public abstract org.netbeans.api.project.Project getProject()
 meth public abstract org.netbeans.modules.web.api.webmodule.WebModule getWebModule()
+meth public abstract org.netbeans.modules.web.jsfapi.api.JsfVersion getJsfVersion()
 meth public abstract org.netbeans.modules.web.jsfapi.api.Library getLibrary(java.lang.String)
 meth public abstract org.openide.util.Lookup getLookup()
 
@@ -138,6 +155,25 @@ fld public final static java.lang.String JSF_XHTML_FILE_MIMETYPE = "text/facelet
 meth public static boolean isFaceletsFile(org.openide.filesystems.FileObject)
 supr java.lang.Object
 
+CLSS public final !enum org.netbeans.modules.web.jsfapi.api.JsfVersion
+fld public final static org.netbeans.modules.web.jsfapi.api.JsfVersion JSF_1_0
+fld public final static org.netbeans.modules.web.jsfapi.api.JsfVersion JSF_1_1
+fld public final static org.netbeans.modules.web.jsfapi.api.JsfVersion JSF_1_2
+fld public final static org.netbeans.modules.web.jsfapi.api.JsfVersion JSF_2_0
+fld public final static org.netbeans.modules.web.jsfapi.api.JsfVersion JSF_2_1
+fld public final static org.netbeans.modules.web.jsfapi.api.JsfVersion JSF_2_2
+fld public final static org.netbeans.modules.web.jsfapi.api.JsfVersion JSF_2_3
+fld public final static org.netbeans.modules.web.jsfapi.api.JsfVersion JSF_3_0
+fld public final static org.netbeans.modules.web.jsfapi.api.JsfVersion JSF_4_0
+meth public boolean isAtLeast(org.netbeans.modules.web.jsfapi.api.JsfVersion)
+ anno 1 org.netbeans.api.annotations.common.NonNull()
+meth public java.lang.String getShortName()
+meth public static org.netbeans.modules.web.jsfapi.api.JsfVersion latest()
+meth public static org.netbeans.modules.web.jsfapi.api.JsfVersion valueOf(java.lang.String)
+meth public static org.netbeans.modules.web.jsfapi.api.JsfVersion[] values()
+supr java.lang.Enum<org.netbeans.modules.web.jsfapi.api.JsfVersion>
+hfds version
+
 CLSS public abstract interface org.netbeans.modules.web.jsfapi.api.Library
 intf org.netbeans.modules.web.jsfapi.api.LibraryInfo
 meth public abstract java.lang.String getDefaultNamespace()
@@ -163,9 +199,8 @@ meth public abstract org.netbeans.modules.web.jsfapi.api.Tag getTag()
 CLSS public abstract interface org.netbeans.modules.web.jsfapi.api.LibraryInfo
 meth public abstract java.lang.String getDefaultPrefix()
 meth public abstract java.lang.String getDisplayName()
-meth public abstract java.lang.String getLegacyNamespace()
- anno 0 org.netbeans.api.annotations.common.CheckForNull()
 meth public abstract java.lang.String getNamespace()
+meth public abstract java.util.Set<java.lang.String> getValidNamespaces()
 
 CLSS public final !enum org.netbeans.modules.web.jsfapi.api.LibraryType
  anno 0 java.lang.Deprecated()
@@ -184,7 +219,6 @@ fld public final static java.util.Map<java.lang.String,java.lang.String> NS_MAPP
 meth public static <%0 extends java.lang.Object> {%%0} getForNs(java.util.Map<java.lang.String,{%%0}>,java.lang.String)
  anno 0 org.netbeans.api.annotations.common.CheckForNull()
 meth public static boolean containsNsOf(java.util.Collection<java.lang.String>,org.netbeans.modules.web.jsfapi.api.DefaultLibraryInfo)
-meth public static java.util.Set<java.lang.String> getAvailableNss(java.util.Map<java.lang.String,? extends org.netbeans.modules.web.jsfapi.api.Library>,boolean)
 supr java.lang.Object
 
 CLSS public abstract interface org.netbeans.modules.web.jsfapi.api.Tag
@@ -213,6 +247,9 @@ cons public init()
 meth public static java.util.Map<java.lang.String,java.lang.String> getInputTextValuesMap(org.openide.filesystems.FileObject)
 supr java.lang.Object
 
+CLSS public abstract interface org.netbeans.modules.web.jsfapi.spi.JsfReferenceImplementationProvider
+meth public abstract java.nio.file.Path artifactPathFor(org.netbeans.modules.web.jsfapi.api.JsfVersion)
+
 CLSS public org.netbeans.modules.web.jsfapi.spi.JsfSupportHandle
  anno 0 java.lang.Deprecated()
 cons public init()
@@ -231,18 +268,18 @@ hfds CACHE,LOGGER
 
 CLSS public org.netbeans.modules.web.jsfapi.spi.LibraryUtils
 cons public init()
-fld public final static java.lang.String COMPOSITE_LIBRARY_LEGACY_NS = "http://java.sun.com/jsf/composite"
-fld public final static java.lang.String COMPOSITE_LIBRARY_NS = "http://xmlns.jcp.org/jsf/composite"
+fld public final static java.lang.String COMPOSITE_LIBRARY_JAKARTA_NS = "jakarta.faces.composite"
+fld public final static java.lang.String COMPOSITE_LIBRARY_JCP_NS = "http://xmlns.jcp.org/jsf/composite"
+fld public final static java.lang.String COMPOSITE_LIBRARY_SUN_NS = "http://java.sun.com/jsf/composite"
 fld public final static java.lang.String XHTML_NS = "http://www.w3.org/1999/xhtml"
-meth public static boolean importLibrary(javax.swing.text.Document,org.netbeans.modules.web.jsfapi.api.Library,java.lang.String,boolean)
-meth public static boolean isCompositeComponentLibrary(org.netbeans.modules.web.jsfapi.api.Library)
- anno 0 java.lang.Deprecated()
+meth public static boolean importLibrary(javax.swing.text.Document,org.netbeans.modules.web.jsfapi.api.Library,java.lang.String)
 meth public static java.lang.String generateDefaultPrefix(java.lang.String)
  anno 0 org.netbeans.api.annotations.common.NonNull()
  anno 1 org.netbeans.api.annotations.common.NonNull()
-meth public static java.lang.String getCompositeLibraryURL(java.lang.String,boolean)
+meth public static java.lang.String getCompositeLibraryURL(java.lang.String,org.netbeans.modules.web.jsfapi.api.JsfVersion)
 meth public static java.util.Map<java.lang.String,org.netbeans.modules.web.jsfapi.api.Library> getDeclaredLibraries(org.netbeans.modules.html.editor.lib.api.HtmlParsingResult)
-meth public static java.util.Map<org.netbeans.modules.web.jsfapi.api.Library,java.lang.String> importLibrary(javax.swing.text.Document,java.util.Map<org.netbeans.modules.web.jsfapi.api.Library,java.lang.String>,boolean)
+meth public static java.util.Map<org.netbeans.modules.web.jsfapi.api.Library,java.lang.String> importLibrary(javax.swing.text.Document,java.util.Map<org.netbeans.modules.web.jsfapi.api.Library,java.lang.String>)
+meth public static java.util.Set<java.lang.String> getAllCompositeLibraryNamespaces(java.lang.String,org.netbeans.modules.web.jsfapi.api.JsfVersion)
 meth public static org.netbeans.api.project.Project[] getOpenedJSFProjects()
 supr java.lang.Object
 
diff --git a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/DefaultLibraryInfo.java b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/DefaultLibraryInfo.java
index 70452edbc2..31dabed636 100644
--- a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/DefaultLibraryInfo.java
+++ b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/DefaultLibraryInfo.java
@@ -18,49 +18,121 @@
  */
 package org.netbeans.modules.web.jsfapi.api;
 
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.stream.Stream;
+
 public enum DefaultLibraryInfo implements LibraryInfo {
 
     // JSF 2.0, JSF 2.1
-    HTML("http://xmlns.jcp.org/jsf/html", "Html Basic", "h"), //NOI18N
-    JSF_CORE("http://xmlns.jcp.org/jsf/core", "Jsf Core", "f"), //NOI18N
-    JSTL_CORE("http://xmlns.jcp.org/jsp/jstl/core", "Jstl Core", "c"), //NOI18N
-    JSTL_CORE_FUNCTIONS("http://xmlns.jcp.org/jsp/jstl/functions", "Jstl Core Functions", "fn"), //NOI18N
-    FACELETS("http://xmlns.jcp.org/jsf/facelets", "Facelets", "ui"), //NOI18N
-    COMPOSITE("http://xmlns.jcp.org/jsf/composite", "Composite Components", "cc"), //NOI18N
+    HTML(
+            sortedSet(
+                    "jakarta.faces.html",
+                    "http://xmlns.jcp.org/jsf/html",
+                    "http://java.sun.com/jsf/html"
+            ),
+            "Html Basic",
+            "h"
+    ), //NOI18N
+    JSF_CORE(
+            sortedSet(
+                    "jakarta.faces.core",
+                    "http://xmlns.jcp.org/jsf/core",
+                    "http://java.sun.com/jsf/core"
+            ),
+            "Jsf Core",
+            "f"
+    ), //NOI18N
+    JSTL_CORE(
+            sortedSet(
+                    "jakarta.tags.core",
+                    "http://xmlns.jcp.org/jsp/jstl/core",
+                    "http://java.sun.com/jsp/jstl/core"
+            ),
+            "Jstl Core",
+            "c"
+    ), //NOI18N
+    JSTL_CORE_FUNCTIONS(
+            sortedSet(
+                    "jakarta.tags.functions",
+                    "http://xmlns.jcp.org/jsp/jstl/functions",
+                    "http://java.sun.com/jsp/jstl/functions"
+            ),
+            "Jstl Core Functions",
+            "fn"
+    ), //NOI18N
+    FACELETS(
+            sortedSet(
+                    "jakarta.faces.facelets",
+                    "http://xmlns.jcp.org/jsf/facelets",
+                    "http://java.sun.com/jsf/facelets"
+            ),
+            "Facelets",
+            "ui"
+    ), //NOI18N
+    COMPOSITE(
+            sortedSet(
+                    "jakarta.faces.composite",
+                    "http://xmlns.jcp.org/jsf/composite",
+                    "http://java.sun.com/jsf/composite"
+            ),
+            "Composite Components",
+            "cc"
+    ), //NOI18N
 
     // PrimeFaces
-    PRIMEFACES("http://primefaces.org/ui", "PrimeFaces", "p"), //NOI18N
-    PRIMEFACES_MOBILE("http://primefaces.org/mobile", "PrimeFaces Mobile", "pm"), //NOI18N
+    PRIMEFACES(
+            sortedSet(
+                    "http://primefaces.org/ui"
+            ),
+            "PrimeFaces",
+            "p"
+    ), //NOI18N
+    PRIMEFACES_MOBILE(
+            sortedSet(
+                    "http://primefaces.org/mobile"
+            ),
+            "PrimeFaces Mobile",
+            "pm"
+    ), //NOI18N
 
     // JSF 2.2+
-    JSF("http://xmlns.jcp.org/jsf", "Jsf", "jsf"), //NOI18N
-    PASSTHROUGH("http://xmlns.jcp.org/jsf/passthrough", "Passthrough", "p"); //NOI18N
-
-    private static final DefaultLibraryInfo[] ALL_INFOS = values();
+    JSF(
+            sortedSet(
+                    "jakarta.faces",
+                    "http://xmlns.jcp.org/jsf"
+            ),
+            "Jsf",
+            "jsf"
+    ), //NOI18N
+    PASSTHROUGH(
+            sortedSet(
+                    "jakarta.faces.passthrough",
+                    "http://xmlns.jcp.org/jsf/passthrough"
+            ),
+            "Passthrough",
+            "p"
+    ); //NOI18N
 
-    private String namespace;
-    private String displayName;
-    private String defaultPrefix;
+    private final Set<String> allValidNamespaces;
+    private final String displayName;
+    private final String defaultPrefix;
 
-
-    private DefaultLibraryInfo(String namespace, String displayName, String defaultPrefix) {
-        this.namespace = namespace;
+    private DefaultLibraryInfo(Set<String> allValidNamespaces, String displayName, String defaultPrefix) {
+        this.allValidNamespaces = allValidNamespaces;
         this.displayName = displayName;
         this.defaultPrefix = defaultPrefix;
     }
 
     @Override
     public String getNamespace() {
-        return namespace;
+        return allValidNamespaces.iterator().next();
     }
 
-    /**
-     * Second supported namespace by the library.
-     * @return legacy namespace if any or {@code null}
-     */
     @Override
-    public String getLegacyNamespace() {
-        return NamespaceUtils.NS_MAPPING.get(namespace);
+    public Set<String> getValidNamespaces() {
+        return allValidNamespaces;
     }
 
     @Override
@@ -74,15 +146,16 @@ public enum DefaultLibraryInfo implements LibraryInfo {
     }
 
     public static LibraryInfo forNamespace(String namespace) {
-        for (int i = 0; i < ALL_INFOS.length; i++) {
-            LibraryInfo li = ALL_INFOS[i];
-            if (li.getNamespace().equals(namespace)
-                    || (li.getLegacyNamespace() != null && li.getLegacyNamespace().equals(namespace))) {
-                return li;
-            }
-        }
-        return null;
+        return Stream.of(values())
+                .filter(lib -> lib.getValidNamespaces().contains(namespace))
+                .findFirst()
+                .orElse(null);
     }
 
+    private static Set<String> sortedSet(String... entries) {
+        Set<String> sortedSet = new LinkedHashSet<>();
+        Stream.of(entries).forEach(sortedSet::add);
 
+        return Collections.unmodifiableSet(sortedSet);
+    }
 }
diff --git a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/JsfNamespaces.java b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/JsfNamespaces.java
new file mode 100644
index 0000000000..15dde78dac
--- /dev/null
+++ b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/JsfNamespaces.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.web.jsfapi.api;
+
+import java.util.AbstractMap;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import static org.netbeans.modules.web.jsfapi.api.JsfNamespaces.Type.TAGLIB;
+
+/**
+ *
+ * @author Benjamin Asbach
+ */
+public enum JsfNamespaces {
+
+    JAVA_SUN_COM_NS(
+            entry(TAGLIB, "http://java.sun.com/xml/ns/javaee")
+    ),
+    XMLNS_JCP_ORG_NS(
+            entry(TAGLIB, "http://xmlns.jcp.org/xml/ns/javaee")
+    ),
+    JAKARTA_EE_NS(
+            entry(TAGLIB, "https://jakarta.ee/xml/ns/jakartaee")
+    );
+
+    public enum Type {
+        TAGLIB;
+    }
+
+    private final Map<Type, String> namespaces;
+
+    private JsfNamespaces(Entry<Type, String>... entries) {
+        this.namespaces = Collections.unmodifiableMap(new EnumMap<>(ofEntries(entries)));
+    }
+
+    public String getNamespace(Type type) {
+        return namespaces.get(type);
+    }
+
+    /* This method can be replaced with a static import to Map.entry() when enterprise module release target is Java 11+ */
+    private static Entry<Type, String> entry(Type type, String value) {
+        return new AbstractMap.SimpleEntry<>(type, value);
+    }
+
+    /* This method can be replaced with a static import to Map.entry() when enterprise module release target is Java 11+ */
+    private static Map<Type, String> ofEntries(Entry<Type, String>... additional) {
+        return Stream.of(additional).collect(Collectors.toMap(Entry::getKey, Entry::getValue));
+    }
+}
diff --git a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/JsfSupport.java b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/JsfSupport.java
index 34572bc3e1..12d62b9dc4 100644
--- a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/JsfSupport.java
+++ b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/JsfSupport.java
@@ -46,7 +46,5 @@ public interface JsfSupport {
 
     public Lookup getLookup();
 
-    public boolean isJsf22Plus();
-
-    public boolean isJsf30Plus();
+    public JsfVersion getJsfVersion();
 }
diff --git a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/LibraryInfo.java b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/JsfVersion.java
similarity index 56%
copy from enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/LibraryInfo.java
copy to enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/JsfVersion.java
index ce2e1cabe4..be16c5265d 100644
--- a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/LibraryInfo.java
+++ b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/JsfVersion.java
@@ -18,21 +18,39 @@
  */
 package org.netbeans.modules.web.jsfapi.api;
 
-import org.netbeans.api.annotations.common.CheckForNull;
+import org.netbeans.api.annotations.common.NonNull;
 
 /**
  *
- * @author marekfukala
+ * @author Benjamin Asbach
  */
-public interface LibraryInfo {
+public enum JsfVersion {
+    
+    JSF_1_0("1.0"),
+    JSF_1_1("1.1"),
+    JSF_1_2("1.2"),
+    JSF_2_0("2.0"),
+    JSF_2_1("2.1"),
+    JSF_2_2("2.2"),
+    JSF_2_3("2.3"),
+    JSF_3_0("3.0"),
+    JSF_4_0("4.0");
 
-    public String getNamespace();
+    private final String version;
 
-    @CheckForNull
-    public String getLegacyNamespace();
+    private JsfVersion(String version) {
+        this.version = version;
+    }
 
-    public String getDefaultPrefix();
+    public String getShortName() {
+        return "JSF " + version;
+    }
 
-    public String getDisplayName();
-    
+    public boolean isAtLeast(@NonNull JsfVersion jsfVersion) {
+        return this.ordinal() >= jsfVersion.ordinal();
+    }
+
+    public static JsfVersion latest() {
+        return values()[values().length - 1];
+    }
 }
diff --git a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/LibraryInfo.java b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/LibraryInfo.java
index ce2e1cabe4..e4f8ac324d 100644
--- a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/LibraryInfo.java
+++ b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/LibraryInfo.java
@@ -18,7 +18,7 @@
  */
 package org.netbeans.modules.web.jsfapi.api;
 
-import org.netbeans.api.annotations.common.CheckForNull;
+import java.util.Set;
 
 /**
  *
@@ -28,8 +28,13 @@ public interface LibraryInfo {
 
     public String getNamespace();
 
-    @CheckForNull
-    public String getLegacyNamespace();
+    /**
+     *
+     * @return all compatible namespaces for that library. 
+     * First namespace is default one.
+     * The last one is the oldest supported namespace
+     */
+    public Set<String> getValidNamespaces();
 
     public String getDefaultPrefix();
 
diff --git a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/NamespaceUtils.java b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/NamespaceUtils.java
index 900679a4ef..d46602b136 100644
--- a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/NamespaceUtils.java
+++ b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/NamespaceUtils.java
@@ -20,9 +20,8 @@ package org.netbeans.modules.web.jsfapi.api;
 
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
+import java.util.Objects;
 import org.netbeans.api.annotations.common.CheckForNull;
 
 /**
@@ -39,7 +38,7 @@ public final class NamespaceUtils {
     public static final String SUN_COM_LOCATION = "http://java.sun.com";  //NOI18N
 
     /** Mapping of the new namespace to the legacy one. */
-    public static final Map<String, String> NS_MAPPING = new HashMap<String, String>(8);
+    public static final Map<String, String> NS_MAPPING = new HashMap<>(8);
 
     static {
         NS_MAPPING.put("http://xmlns.jcp.org/jsf/html", "http://java.sun.com/jsf/html");                     //NOI18N
@@ -60,29 +59,27 @@ public final class NamespaceUtils {
      */
     @CheckForNull
     public static <T> T getForNs(Map<String, T> map, String ns) {
-        T result = checkMapForNs(map, ns);
-
-        // try out shortened URL without ending slash if available - issue #226002
-        if (result == null) {
-            if (ns.endsWith("/")) { //NOI18N
-                ns = ns.substring(0, ns.length() - 1);
-                return checkMapForNs(map, ns);
-            }
+        if (map.containsKey(ns)) {
+            return map.get(ns);
         }
 
-        return result;
-    }
-
-    private static <T> T checkMapForNs(Map<String, T> map, String ns) {
-        T result = map.get(ns);
-        if (result == null) {
-            if (NS_MAPPING.containsKey(ns)) {
-                result = map.get(NS_MAPPING.get(ns));
-            } else if (ns.startsWith(DefaultLibraryInfo.COMPOSITE.getLegacyNamespace())) {
-                result = map.get(ns.replace(DefaultLibraryInfo.COMPOSITE.getLegacyNamespace(), DefaultLibraryInfo.COMPOSITE.getNamespace()));
+        LibraryInfo libraryInfo = DefaultLibraryInfo.forNamespace(ns);
+        if (libraryInfo == null) {
+            ns = DefaultLibraryInfo.COMPOSITE.getValidNamespaces().stream()
+                    .filter(ns::startsWith)
+                    .findFirst()
+                    .orElse(null);
+            if (ns == null) {
+                return null;
             }
+            libraryInfo = DefaultLibraryInfo.forNamespace(ns);
         }
-        return result;
+
+        return libraryInfo.getValidNamespaces().stream()
+                .map(map::get)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .orElse(null);
     }
 
     /**
@@ -92,31 +89,6 @@ public final class NamespaceUtils {
      * @return {@code true} if the collection contains new or legacy library namespace, {@code false} otherwise
      */
     public static boolean containsNsOf(Collection<String> collection, DefaultLibraryInfo library) {
-        if (collection.contains(library.getNamespace())) {
-            return true;
-        }
-        if (library.getLegacyNamespace() != null) {
-            return collection.contains(library.getLegacyNamespace());
-        }
-        return false;
+        return library.getValidNamespaces().stream().anyMatch(collection::contains);
     }
-
-    public static Set<String> getAvailableNss(Map<String, ? extends Library> libraries, boolean jsf22plus) {
-        Set<String> nss = new HashSet<String>();
-        for (Map.Entry<String, ? extends Library> entry : libraries.entrySet()) {
-            // library well known namespace
-            nss.add(entry.getKey());
-
-            // in case of JSF 2.2 add also its legacy namespaces
-            if (jsf22plus) {
-                Library library = entry.getValue();
-                nss.add(library.getNamespace());
-                if (NS_MAPPING.containsKey(library.getNamespace())) {
-                    nss.add(NS_MAPPING.get(library.getNamespace()));
-                }
-            }
-        }
-        return nss;
-    }
-
 }
diff --git a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/LibraryInfo.java b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/spi/JsfReferenceImplementationProvider.java
similarity index 65%
copy from enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/LibraryInfo.java
copy to enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/spi/JsfReferenceImplementationProvider.java
index ce2e1cabe4..1be134b10a 100644
--- a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/api/LibraryInfo.java
+++ b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/spi/JsfReferenceImplementationProvider.java
@@ -16,23 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.netbeans.modules.web.jsfapi.api;
+package org.netbeans.modules.web.jsfapi.spi;
 
-import org.netbeans.api.annotations.common.CheckForNull;
+import java.nio.file.Path;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 
 /**
  *
- * @author marekfukala
+ * @author Benjamin Asbach
  */
-public interface LibraryInfo {
+public interface JsfReferenceImplementationProvider {
 
-    public String getNamespace();
-
-    @CheckForNull
-    public String getLegacyNamespace();
-
-    public String getDefaultPrefix();
-
-    public String getDisplayName();
-    
+    /**
+     * Determine the path to the JSF reference implementation JAR.
+     *
+     * @param jsfVersion
+     * @return path to the JAR or {@code null} if not found
+     */
+    Path artifactPathFor(JsfVersion jsfVersion);
 }
diff --git a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/spi/LibraryUtils.java b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/spi/LibraryUtils.java
index 1eecffcf4f..09076d130f 100644
--- a/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/spi/LibraryUtils.java
+++ b/enterprise/web.jsfapi/src/org/netbeans/modules/web/jsfapi/spi/LibraryUtils.java
@@ -24,8 +24,10 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.swing.text.BadLocationException;
@@ -44,8 +46,8 @@ import org.netbeans.modules.parsing.spi.ParseException;
 import org.netbeans.modules.parsing.spi.Parser;
 import org.netbeans.modules.web.common.api.WebUtils;
 import org.netbeans.modules.web.jsfapi.api.JsfSupport;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.jsfapi.api.Library;
-import org.netbeans.modules.web.jsfapi.api.LibraryType;
 import org.netbeans.modules.web.jsfapi.api.NamespaceUtils;
 
 /**
@@ -54,25 +56,36 @@ import org.netbeans.modules.web.jsfapi.api.NamespaceUtils;
  */
 public class LibraryUtils {
 
-    public static final String COMPOSITE_LIBRARY_NS = "http://xmlns.jcp.org/jsf/composite"; //NOI18N
-    public static final String COMPOSITE_LIBRARY_LEGACY_NS = "http://java.sun.com/jsf/composite"; //NOI18N
+    public static final String COMPOSITE_LIBRARY_JAKARTA_NS = "jakarta.faces.composite"; //NOI18N
+    public static final String COMPOSITE_LIBRARY_JCP_NS = "http://xmlns.jcp.org/jsf/composite"; //NOI18N
+    public static final String COMPOSITE_LIBRARY_SUN_NS = "http://java.sun.com/jsf/composite"; //NOI18N
     public static final String XHTML_NS = "http://www.w3.org/1999/xhtml"; //NOI18N
 
-    public static String getCompositeLibraryURL(String libraryFolderPath, boolean jsf22Plus) {
-        if (jsf22Plus) {
-            return COMPOSITE_LIBRARY_NS + "/" + libraryFolderPath; //NOI18N
+    public static String getCompositeLibraryURL(String libraryFolderPath, JsfVersion jsfVersion) {
+        if (jsfVersion.isAtLeast(JsfVersion.JSF_4_0)) {
+            return COMPOSITE_LIBRARY_JAKARTA_NS + "/" + libraryFolderPath;
+        } else if (jsfVersion.isAtLeast(JsfVersion.JSF_2_2)) {
+            return COMPOSITE_LIBRARY_JCP_NS + "/" + libraryFolderPath;
         } else {
-            return COMPOSITE_LIBRARY_LEGACY_NS + "/" + libraryFolderPath; //NOI18N
+            return COMPOSITE_LIBRARY_SUN_NS + "/" + libraryFolderPath;
         }
     }
 
-    @Deprecated
-    public static boolean isCompositeComponentLibrary(Library library) {
-        return library.getType() == LibraryType.COMPOSITE;
+    public static Set<String> getAllCompositeLibraryNamespaces(String libraryName, JsfVersion jsfVersion) {
+        Set<String> namespaces = new LinkedHashSet<>();
+        if (jsfVersion.isAtLeast(JsfVersion.JSF_4_0)) {
+            namespaces.add(COMPOSITE_LIBRARY_JAKARTA_NS + "/" + libraryName);
+        }
+        if (jsfVersion.isAtLeast(JsfVersion.JSF_2_2)) {
+            namespaces.add(COMPOSITE_LIBRARY_JCP_NS + "/" + libraryName);
+        }
+
+        namespaces.add(COMPOSITE_LIBRARY_SUN_NS + "/" + libraryName);
+        return namespaces;
     }
 
-    public static boolean importLibrary(Document document, Library library, String prefix, boolean isJsf22Plus) {
-        return !importLibrary(document, Collections.singletonMap(library, prefix), isJsf22Plus).isEmpty();
+    public static boolean importLibrary(Document document, Library library, String prefix) {
+        return !importLibrary(document, Collections.singletonMap(library, prefix)).isEmpty();
     }
 
     /**
@@ -84,10 +97,10 @@ public class LibraryUtils {
      *
      * @return a map of library2declared prefixes which contains just the imported pairs
      */
-    public static Map<Library, String> importLibrary(Document document, Map<Library, String> libraries2prefixes, final boolean isJsf22Plus) {
+    public static Map<Library, String> importLibrary(Document document, Map<Library, String> libraries2prefixes) {
         assert document instanceof BaseDocument;
 
-        final Map<Library, String> imports = new LinkedHashMap<Library, String>(libraries2prefixes);
+        final Map<Library, String> imports = new LinkedHashMap<>(libraries2prefixes);
 
         //verify and update the imports map
         Iterator<Library> libsIterator = imports.keySet().iterator();
@@ -131,7 +144,7 @@ public class LibraryUtils {
             Element root = null;
             //no html root node, we need to find a root node of some other ast tree
             //belonging to some namespace
-            Collection<Node> roots = new ArrayList<Node>();
+            Collection<Node> roots = new ArrayList<>();
             roots.addAll(result.roots().values());
             roots.add(result.rootOfUndeclaredTagsParseTree());
 
@@ -151,7 +164,7 @@ public class LibraryUtils {
                     }
                 });
 
-                List<Element> chsList = new ArrayList<Element>(chs);
+                List<Element> chsList = new ArrayList<>(chs);
                 
                 if (!chsList.isEmpty()) {
                     Element top = chsList.get(0);
@@ -226,8 +239,7 @@ public class LibraryUtils {
                                 String prefixToDeclare = imports.get(library);
                                 int insertPosition = originalInsertPosition + offset_shift;
 
-                                String namespace = isJsf22Plus || library.getLegacyNamespace() == null ?
-                                        library.getNamespace() : library.getLegacyNamespace();
+                                String namespace = library.getNamespace();
                                 String text = (!noAttributes ? "\n" : "") + " xmlns:" + prefixToDeclare + //NOI18N
                                         "=\"" + namespace + "\""; //NOI18N
 
@@ -262,7 +274,7 @@ public class LibraryUtils {
     public static Map<String, Library> getDeclaredLibraries(HtmlParsingResult result) {
         //find all usages of composite components tags for this page
         Collection<String> declaredNamespaces = result.getNamespaces().keySet();
-        Map<String, Library> declaredLibraries = new HashMap<String, Library>();
+        Map<String, Library> declaredLibraries = new HashMap<>();
         JsfSupport jsfSupport = JsfSupportProvider.get(result.getSyntaxAnalyzerResult().getSource().getSourceFileObject());
         if (jsfSupport != null) {
             Map<String, ? extends Library> libs = jsfSupport.getLibraries();
diff --git a/enterprise/web.jsfapi/test/unit/src/org/netbeans/modules/web/jsfapi/api/DefaultLibraryInfoTest.java b/enterprise/web.jsfapi/test/unit/src/org/netbeans/modules/web/jsfapi/api/DefaultLibraryInfoTest.java
new file mode 100644
index 0000000000..6adf356794
--- /dev/null
+++ b/enterprise/web.jsfapi/test/unit/src/org/netbeans/modules/web/jsfapi/api/DefaultLibraryInfoTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.web.jsfapi.api;
+
+import java.util.Iterator;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+/**
+ * As the order is essential for jsf module to function properly this tests
+ * verifies that order.
+ *
+ * @author Benjamin Asbach
+ */
+public class DefaultLibraryInfoTest {
+
+    public DefaultLibraryInfoTest() {
+    }
+
+    @Test
+    public void testNamespaceOrderForStandardTaglibs() {
+        DefaultLibraryInfo[] standardTaglibs = new DefaultLibraryInfo[]{
+            DefaultLibraryInfo.HTML,
+            DefaultLibraryInfo.JSF_CORE,
+            DefaultLibraryInfo.JSTL_CORE,
+            DefaultLibraryInfo.JSTL_CORE_FUNCTIONS,
+            DefaultLibraryInfo.FACELETS,
+            DefaultLibraryInfo.COMPOSITE
+        };
+
+        for (DefaultLibraryInfo standardTaglib : standardTaglibs) {
+            Iterator<String> validNamespacesIterator = standardTaglib.getValidNamespaces().iterator();
+            assertTrue(validNamespacesIterator.next().startsWith("jakarta."));
+            assertTrue(validNamespacesIterator.next().startsWith("http://xmlns.jcp.org/"));
+            assertTrue(validNamespacesIterator.next().startsWith("http://java.sun.com/"));
+        }
+    }
+
+    @Test
+    public void testNamespaceOrderFor_JSF() {
+        Iterator<String> validNamespacesIterator = DefaultLibraryInfo.JSF.getValidNamespaces().iterator();
+        assertEquals("jakarta.faces", validNamespacesIterator.next());
+        assertEquals("http://xmlns.jcp.org/jsf", validNamespacesIterator.next());
+    }
+
+    @Test
+    public void testNamespaceOrderFor_PASSTHROUGH() {
+        Iterator<String> validNamespacesIterator = DefaultLibraryInfo.PASSTHROUGH.getValidNamespaces().iterator();
+        assertEquals("jakarta.faces.passthrough", validNamespacesIterator.next());
+        assertEquals("http://xmlns.jcp.org/jsf/passthrough", validNamespacesIterator.next());
+    }
+}
diff --git a/enterprise/web.jsfapi/test/unit/src/org/netbeans/modules/web/jsfapi/api/JsfVersionTest.java b/enterprise/web.jsfapi/test/unit/src/org/netbeans/modules/web/jsfapi/api/JsfVersionTest.java
new file mode 100644
index 0000000000..79d51b412e
--- /dev/null
+++ b/enterprise/web.jsfapi/test/unit/src/org/netbeans/modules/web/jsfapi/api/JsfVersionTest.java
@@ -0,0 +1,184 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.web.jsfapi.api;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+/**
+ *
+ * @author Benjamin Asbach
+ */
+public class JsfVersionTest {
+
+    @Test
+    public void testVersionComparison_JSF_1_0() {
+        JsfVersion jsfVersion = JsfVersion.JSF_1_0;
+
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_0));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_1_1));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_1_2));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_0));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_1));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_2));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_3));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_3_0));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_4_0));
+    }
+
+    @Test
+    public void testVersionComparison_JSF_1_1() {
+        JsfVersion jsfVersion = JsfVersion.JSF_1_1;
+
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_1));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_1_2));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_0));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_1));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_2));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_3));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_3_0));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_4_0));
+    }
+
+    @Test
+    public void testVersionComparison_JSF_1_2() {
+        JsfVersion jsfVersion = JsfVersion.JSF_1_2;
+
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_1));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_2));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_0));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_1));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_2));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_3));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_3_0));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_4_0));
+    }
+
+    @Test
+    public void testVersionComparison_JSF_2_0() {
+        JsfVersion jsfVersion = JsfVersion.JSF_2_0;
+
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_1));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_2));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_0));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_1));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_2));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_3));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_3_0));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_4_0));
+    }
+
+    @Test
+    public void testVersionComparison_JSF_2_1() {
+        JsfVersion jsfVersion = JsfVersion.JSF_2_1;
+
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_1));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_2));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_1));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_2));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_3));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_3_0));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_4_0));
+    }
+
+    @Test
+    public void testVersionComparison_JSF_2_2() {
+        JsfVersion jsfVersion = JsfVersion.JSF_2_2;
+
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_1));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_2));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_1));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_2));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_2_3));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_3_0));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_4_0));
+    }
+
+    @Test
+    public void testVersionComparison_JSF_2_3() {
+        JsfVersion jsfVersion = JsfVersion.JSF_2_3;
+
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_1));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_2));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_1));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_2));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_3));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_3_0));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_4_0));
+    }
+
+    @Test
+    public void testVersionComparison_JSF_3_0() {
+        JsfVersion jsfVersion = JsfVersion.JSF_3_0;
+
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_1));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_2));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_1));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_2));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_3));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_3_0));
+        assertFalse(jsfVersion.isAtLeast(JsfVersion.JSF_4_0));
+    }
+
+    @Test
+    public void testVersionComparison_JSF_4_0() {
+        JsfVersion jsfVersion = JsfVersion.JSF_4_0;
+
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_1));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_1_2));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_1));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_2));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_2_3));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_3_0));
+        assertTrue(jsfVersion.isAtLeast(JsfVersion.JSF_4_0));
+    }
+
+    @Test
+    public void testShortName() {
+        assertEquals("JSF 1.0", JsfVersion.JSF_1_0.getShortName());
+        assertEquals("JSF 1.1", JsfVersion.JSF_1_1.getShortName());
+        assertEquals("JSF 1.2", JsfVersion.JSF_1_2.getShortName());
+        assertEquals("JSF 2.0", JsfVersion.JSF_2_0.getShortName());
+        assertEquals("JSF 2.1", JsfVersion.JSF_2_1.getShortName());
+        assertEquals("JSF 2.2", JsfVersion.JSF_2_2.getShortName());
+        assertEquals("JSF 2.3", JsfVersion.JSF_2_3.getShortName());
+        assertEquals("JSF 3.0", JsfVersion.JSF_3_0.getShortName());
+        assertEquals("JSF 4.0", JsfVersion.JSF_4_0.getShortName());
+    }
+
+    @Test
+    public void testLatest() {
+        assertEquals(JsfVersion.JSF_4_0, JsfVersion.latest());
+    }
+}
diff --git a/enterprise/web.primefaces/nbproject/project.xml b/enterprise/web.primefaces/nbproject/project.xml
index ba083ef95f..d0246bef92 100644
--- a/enterprise/web.primefaces/nbproject/project.xml
+++ b/enterprise/web.primefaces/nbproject/project.xml
@@ -92,8 +92,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.44</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
@@ -107,8 +107,8 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <release-version>1</release-version>
-                        <specification-version>1.14</specification-version>
+                        <release-version>2</release-version>
+                        <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/enterprise/web.primefaces/src/org/netbeans/modules/web/primefaces/PrimefacesImplementation.java b/enterprise/web.primefaces/src/org/netbeans/modules/web/primefaces/PrimefacesImplementation.java
index 7986b40b41..dc1dbe1a2d 100644
--- a/enterprise/web.primefaces/src/org/netbeans/modules/web/primefaces/PrimefacesImplementation.java
+++ b/enterprise/web.primefaces/src/org/netbeans/modules/web/primefaces/PrimefacesImplementation.java
@@ -34,9 +34,9 @@ import org.netbeans.api.project.libraries.LibraryManager;
 import org.netbeans.modules.j2ee.common.ClasspathUtil;
 import org.netbeans.modules.web.api.webmodule.WebModule;
 import org.netbeans.modules.web.jsf.api.JsfComponentUtils;
-import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
 import org.netbeans.modules.web.jsf.spi.components.JsfComponentCustomizer;
 import org.netbeans.modules.web.jsf.spi.components.JsfComponentImplementation;
+import org.netbeans.modules.web.jsfapi.api.JsfVersion;
 import org.netbeans.modules.web.primefaces.ui.PrimefacesCustomizerPanel;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
@@ -110,8 +110,8 @@ public class PrimefacesImplementation implements JsfComponentImplementation {
     }
 
     @Override
-    public Set<JSFVersion> getJsfVersion() {
-        return EnumSet.of(JSFVersion.JSF_2_0, JSFVersion.JSF_2_1, JSFVersion.JSF_2_2);
+    public Set<JsfVersion> getJsfVersion() {
+        return EnumSet.of(JsfVersion.JSF_2_0, JsfVersion.JSF_2_1, JsfVersion.JSF_2_2);
     }
 
     @Override
diff --git a/ide/html.editor/src/org/netbeans/modules/html/editor/api/completion/HtmlCompletionItem.java b/ide/html.editor/src/org/netbeans/modules/html/editor/api/completion/HtmlCompletionItem.java
index c00358c606..d763ee0fff 100644
--- a/ide/html.editor/src/org/netbeans/modules/html/editor/api/completion/HtmlCompletionItem.java
+++ b/ide/html.editor/src/org/netbeans/modules/html/editor/api/completion/HtmlCompletionItem.java
@@ -93,6 +93,10 @@ public class HtmlCompletionItem implements CompletionItem {
         return new AttributeValue(name, substitutionOffset, addQuotation);
     }
 
+    public static HtmlCompletionItem createAttributeValue(String name, int substitutionOffset, boolean addQuotation, int sortPrioritiy) {
+        return new AttributeValue(name, substitutionOffset, addQuotation, sortPrioritiy);
+    }
+
     public static HtmlCompletionItem createAttributeValue(String name, int substitutionOffset) {
         return createAttributeValue(name, substitutionOffset, false);
     }
@@ -654,11 +658,23 @@ public class HtmlCompletionItem implements CompletionItem {
      */
     public static class AttributeValue extends HtmlCompletionItem {
 
-        private boolean addQuotation;
+        private final boolean addQuotation;
+        
+        private final int sortPriority;
 
-        public AttributeValue(String value, int offset, boolean addQuotation) {
+        public AttributeValue(String value, int offset, boolean addQuotation, int sortPriority) {
             super(value, offset);
             this.addQuotation = addQuotation;
+            this.sortPriority = sortPriority;
+        }
+
+        public AttributeValue(String value, int offset, boolean addQuotation) {
+            this(value, offset, addQuotation, DEFAULT_SORT_PRIORITY);
+        }
+
+        @Override
+        public int getSortPriority() {
+            return sortPriority;
         }
 
         @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists