Repository: primefaces/primefaces
Pull request #8588 (2022-03-20 12:45:32)

MenuBar IT

melloware: Nice!  

Patch:
diff --git a/.github/ISSUE_TEMPLATE/defect_report.md b/.github/ISSUE_TEMPLATE/defect_report.md
index c477ddc5e0..b7a713d06e 100644
--- a/.github/ISSUE_TEMPLATE/defect_report.md
+++ b/.github/ISSUE_TEMPLATE/defect_report.md
@@ -6,7 +6,11 @@ labels: defect
 
 ---
 
-**Before creating a issue, please try the newest version! Older versions are not supported by the community!**
+----------------------------------------------------
+----------------------------------------------------
+# Before creating a issue, please carefully read: https://github.com/primefaces/primefaces/blob/master/README.md#community--elite--pro
+----------------------------------------------------
+----------------------------------------------------
 
 **Describe the defect**
 A clear and concise description of what the defect is.
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index a514b53708..d0806bb1d4 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -9,7 +9,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        java: [8, 11, 17]
+        java: [8, 11, 17, 18]
         jsfimpl: [ 'mojarra-2.3', 'myfaces-2.3']
 
     steps:
diff --git a/.github/workflows/nightly-file.upload.yml b/.github/workflows/nightly-file.upload.yml
index 65b84b56c5..704d4f4b49 100644
--- a/.github/workflows/nightly-file.upload.yml
+++ b/.github/workflows/nightly-file.upload.yml
@@ -28,7 +28,7 @@ jobs:
           distribution: 'adopt'
           java-version: ${{ matrix.java }}
       - name: Cache Maven packages
-        uses: actions/cache@v2
+        uses: actions/cache@v3
         with:
           path: ~/.m2
           key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
diff --git a/.github/workflows/nightly-safari.yml b/.github/workflows/nightly-safari.yml
index 09199a45dc..f1ce73e94f 100644
--- a/.github/workflows/nightly-safari.yml
+++ b/.github/workflows/nightly-safari.yml
@@ -22,7 +22,7 @@ jobs:
           distribution: 'adopt'
           java-version: ${{ matrix.java }}
       - name: Cache Maven packages
-        uses: actions/cache@v2
+        uses: actions/cache@v3
         with:
           path: ~/.m2
           key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index 902de066ce..38e7239282 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -12,7 +12,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        java: [8, 11, 17]
+        java: [8, 11, 17, 18]
         profile: [ 'firefox,theme-saga,myfaces-2.3', 'firefox,csp,theme-saga,myfaces-2.3', 'chrome,theme-saga,myfaces-2.3', 'chrome,theme-saga,myfaces-next-2.3','chrome,csp,theme-nova,myfaces-2.3', 'chrome,csp,theme-nova,mojarra-2.3', 'chrome,client-state-saving,theme-nova,mojarra-2.3' ]
 
     steps:
diff --git a/README.md b/README.md
index 48ed91d790..fe55054f9f 100644
--- a/README.md
+++ b/README.md
@@ -19,18 +19,34 @@ This is an overview page, please visit [PrimeFaces.org](https://www.primefaces.o
 
 [PrimeFaces](https://www.primefaces.org/) is one of the most popular UI libraries in Java EE Ecosystem and widely used by software companies, world renowned brands, banks, financial institutions, insurance companies, universities and more. Here are [some of the users](https://www.primefaces.org/whouses) who notified us or subscribed to a [PrimeFaces Support Service](https://www.primefaces.org/support).
 
-### Getting Started
+### Community <> Elite <> Pro
 ***
 
-**PrimeFaces** can be downloaded manually or via maven.
+This is the open source code and issue tracker of the PrimeFaces master (a.k.a. community version).  
+Please check the following link for informations about Elite and Pro: [PrimeFaces Support](https://www.primefaces.org/support/)  
 
-##### Latest Downloads
+What does that mean?
+- PrimeFaces is developed by PrimeTek and the open source community
+- The most contributers here on GitHub are working on PrimeFaces in their spare time
+- PrimeTek pushes fixes and new features from their closed source Elite and Pro repositories to the community edition
+- We, the community on GitHub, only provide support for issues, which are reproducable with the current SNAPSHOT (scroll down for more informations how to use it!)
+- We are NOT able to port bugfixes to elite releases, this is up to PrimeTek and can e.g. be triggered with PrimeFaces PRO
+
+### Versions
+***
 
 Version | Binary | Source | JSF version | Java version | Documentation
 ------------ | -------------  | ------------- | ------------- | ------------- | ------------- |
 11.0.0| [primefaces-11.0.0.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/11.0.0/primefaces-11.0.0.jar)  | [primefaces-11.0.0-sources.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/11.0.0/primefaces-11.0.0-sources.jar) | 2.0 - 4.0 | 1.8 - ? | [11.0.0 Documentation](https://primefaces.github.io/primefaces/11_0_0/#/)
 10.0.0| [primefaces-10.0.0.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/10.0.0/primefaces-10.0.0.jar)  | [primefaces-10.0.0-sources.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/10.0.0/primefaces-10.0.0-sources.jar) | 2.0 - 3.0 | 1.8 - ? | [10.0.0 Documentation](https://primefaces.github.io/primefaces/10_0_0/#/)
 8.0| [primefaces-8.0.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/8.0/primefaces-8.0.jar)  | [primefaces-8.0-sources.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/8.0/primefaces-8.0-sources.jar) | 2.0 - 2.3 | 1.8 - ? | [8.0 Documentation](https://primefaces.github.io/primefaces/8_0/#/)
+
+<details>
+  <summary>Archive</summary>
+  
+
+Version | Binary | Source | JSF version | Java version | Documentation
+------------ | -------------  | ------------- | ------------- | ------------- | ------------- |
 7.0| [primefaces-7.0.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/7.0/primefaces-7.0.jar)  | [primefaces-7.0-sources.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/7.0/primefaces-7.0-sources.jar) | 2.0 - 2.3 | 1.7 - ? | [7.0 Documentation](https://primefaces.github.io/primefaces/7_0/#/)
 6.2| [primefaces-6.2.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/6.2/primefaces-6.2.jar)  | [primefaces-6.2-sources.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/6.2/primefaces-6.2-sources.jar) | 2.0 - 2.3 | 1.6 - ? | [6.2 Documentation](https://www.primefaces.org/docs/guide/primefaces_user_guide_6_2.pdf)
 6.1| [primefaces-6.1.jar](http://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/6.1/primefaces-6.1.jar)  | [primefaces-6.1-sources.jar](http://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/6.1/primefaces-6.1-sources.jar) | 2.0 - 2.3 | 1.5 - ? | [6.1 Documentation](https://www.primefaces.org/docs/guide/primefaces_user_guide_6_1.pdf)
@@ -38,25 +54,25 @@ Version | Binary | Source | JSF version | Java version | Documentation
 5.3| [primefaces-5.3.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/5.3/primefaces-5.3.jar)  | [primefaces-5.3-sources.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/5.3/primefaces-5.3-sources.jar) | 2.0 - 2.2 | 1.5 - ? | [5.3 Documentation](https://www.primefaces.org/docs/guide/primefaces_user_guide_5_3.pdf)
 5.2| [primefaces-5.2.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/5.2/primefaces-5.2.jar)  | [primefaces-5.2-sources.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/5.2/primefaces-5.2-sources.jar) | 2.0 - 2.2 | 1.5 - ? | [5.2 Documentation](https://www.primefaces.org/docs/guide/primefaces_user_guide_5_2.pdf)
 5.1| [primefaces-5.1.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/5.1/primefaces-5.1.jar)  | [primefaces-5.1-sources.jar](https://search.maven.org/remotecontent?filepath=org/primefaces/primefaces/5.1/primefaces-5.1-sources.jar) | 2.0 - 2.2 | 1.5 - ? | [5.1 Documentation](https://www.primefaces.org/docs/guide/primefaces_user_guide_5_1.pdf)
+</details>
 
 
 For a full list of the available downloads, please visit the [download page](https://www.primefaces.org/downloads).
 
-##### Maven
+### Maven
+***
 
-- Official release (javax; JSF 2.0 - JSF 2.3)
+##### Release 
 
   ```xml
+  <!-- Java EE / javax.* / JSF 2.0 - JSF 2.3 -->
   <dependency>
       <groupId>org.primefaces</groupId>
       <artifactId>primefaces</artifactId>
       <version>11.0.0</version>
   </dependency>
-  ```
 
-- Official release (jakarta; Faces 3.0 - Faces 4.0)
-
-  ```xml
+  <!-- Jakarta EE / jakarta.* / Faces 3.0 - Faces 4.0  -->	
   <dependency>
       <groupId>org.primefaces</groupId>
       <artifactId>primefaces</artifactId>
@@ -65,26 +81,17 @@ For a full list of the available downloads, please visit the [download page](htt
   </dependency>
   ```
 
-- Snapshot (javax; JSF 2.0 - JSF 2.3; should NOT be used in production environments!)
+##### SNAPSHOT
 
   ```xml
+  <!-- Java EE / javax.* / JSF 2.0 - JSF 2.3 -->
   <dependency>
       <groupId>com.github.primefaces</groupId>
       <artifactId>primefaces</artifactId>
       <version>master-SNAPSHOT</version>
   </dependency>
 
-  <repositories>
-      <repository>
-          <id>jitpack.io</id>
-          <url>https://jitpack.io</url>
-      </repository>
-  </repositories>
-  ```
-
-- Snapshot (jakarta; Faces 3.0 - Faces 4.0; should NOT be used in production environments!)
-
-  ```xml
+  <!-- Jakarta EE / jakarta.* / Faces 3.0 - Faces 4.0  -->
   <dependency>
       <groupId>com.github.primefaces</groupId>
       <artifactId>primefaces</artifactId>
@@ -99,19 +106,10 @@ For a full list of the available downloads, please visit the [download page](htt
       </repository>
   </repositories>
   ```
+
 ### Usage
 ***
 
-##### Namespaces
-
-The PrimeFaces namespace is necessary to add PrimeFaces components to your pages.
-
-```xml
-xmlns:p="http://primefaces.org/ui"
-```
-
-##### Test Run
-
 ```xml
 <html xmlns="http://www.w3.org/1999/xhtml"
 	xmlns:h="http://java.sun.com/jsf/html"
@@ -135,10 +133,6 @@ xmlns:p="http://primefaces.org/ui"
 ***
 Please refer to the [showcase](https://www.primefaces.org/showcase) in order to see the full usage of the components. Sources of PrimeFaces showcase are available within module [primefaces-showcase](https://github.com/primefaces/primefaces/tree/master/primefaces-showcase).
 
-### Documentation
-***
-A User Guide is available [here](https://primefaces.github.io/primefaces/).
-
 ### Contribution
 ***
 Visit the [Contribution Wiki](https://github.com/primefaces/primefaces/wiki/Contributing-to-PrimeFaces) page for detailed information.
@@ -148,7 +142,7 @@ Visit the [Contribution Wiki](https://github.com/primefaces/primefaces/wiki/Cont
 - Run `mvn versions:set -DgenerateBackupPoms=false -DnewVersion=11.0.0` to update all modules versions
 - Commit and push the changes to GitHub
 - In GitHub create a new Release titled `11.0.0` to tag this release
-- Run `mvn clean deploy -Pminify,release` to push to Maven Central
+- Run `mvn clean deploy -Prelease` to push to Maven Central
 - Rename Milestone in GitHub Issues and close it
 - Create a new Milestone
 
diff --git a/pom.xml b/pom.xml
index 0ffed2b208..bbd0e6b541 100644
--- a/pom.xml
+++ b/pom.xml
@@ -269,7 +269,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>
-                <version>3.2.4</version>
+                <version>3.3.0</version>
             </plugin>
         </plugins>
     </build>
@@ -317,18 +317,17 @@
             <dependency>
                 <groupId>org.json</groupId>
                 <artifactId>json</artifactId>
-                <version>20211205</version>
+                <version>20220320</version>
             </dependency>
             <dependency>
                 <groupId>org.owasp.encoder</groupId>
                 <artifactId>encoder</artifactId>
                 <version>1.2.3</version>
             </dependency>
-            <!-- use 2.4 as later versions would require multiple files to shade -->
             <dependency>
                 <groupId>commons-io</groupId>
                 <artifactId>commons-io</artifactId>
-                <version>2.4</version>
+                <version>2.11.0</version>
             </dependency>
 
             <dependency>
@@ -341,12 +340,12 @@
             <dependency>
                 <groupId>org.apache.poi</groupId>
                 <artifactId>poi</artifactId>
-                <version>5.2.1</version>
+                <version>5.2.2</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.poi</groupId>
                 <artifactId>poi-ooxml</artifactId>
-                <version>5.2.1</version>
+                <version>5.2.2</version>
             </dependency>
             <dependency>
                 <groupId>com.github.librepdf</groupId>
diff --git a/primefaces-selenium/README.md b/primefaces-selenium/README.md
index 3190f0710c..7827412f03 100644
--- a/primefaces-selenium/README.md
+++ b/primefaces-selenium/README.md
@@ -81,6 +81,7 @@ Currently, only the following components are implemented (partially):
 - InputText
 - InputTextarea
 - Messages
+- Menubar
 - OutputLabel
 - OverlayPanel
 - Panel
diff --git a/primefaces-selenium/primefaces-selenium-components/src/main/java/org/primefaces/selenium/component/Menubar.java b/primefaces-selenium/primefaces-selenium-components/src/main/java/org/primefaces/selenium/component/Menubar.java
new file mode 100644
index 0000000000..92eb5550d6
--- /dev/null
+++ b/primefaces-selenium/primefaces-selenium-components/src/main/java/org/primefaces/selenium/component/Menubar.java
@@ -0,0 +1,97 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2009-2021 PrimeTek
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.primefaces.selenium.component;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.NoSuchElementException;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+import org.primefaces.selenium.PrimeSelenium;
+import org.primefaces.selenium.component.base.AbstractInputComponent;
+
+import java.util.List;
+
+/**
+ * Component wrapper for the PrimeFaces {@code p:menubar}.
+ */
+public abstract class Menubar extends AbstractInputComponent {
+
+    public WebElement findMenuitemByValue(String value) {
+        return findMenuitemByValue(this, value);
+    }
+
+    public WebElement findMenuitemByValue(WebElement parentElt, String value) {
+        List<WebElement> subElements = parentElt.findElements(By.cssSelector("ul > li.ui-menuitem"));
+        return subElements.stream()
+                .filter(e -> e.getText().equals(value))
+                .findFirst()
+                .orElseThrow(() -> new NoSuchElementException("no menuitem with value '" + value + "'"));
+    }
+
+    /**
+     * Select L1 menuitem
+     * @param value
+     * @return
+     */
+    public WebElement selectMenuitemByValue(String value) {
+        Actions actions = new Actions(getWebDriver());
+        actions.moveToElement(this.getWrappedElement()).build().perform(); // FF - workaround when clicking on multiple menuitems successively
+        return selectMenuitemByValue(this, value);
+    }
+
+    /**
+     * Select L2+ menuitem
+     * @param parentElt parent menuitem
+     * @param value
+     * @return
+     */
+    public WebElement selectMenuitemByValue(WebElement parentElt, String value) {
+        WebElement elt = findMenuitemByValue(parentElt, value);
+
+        if ((PrimeSelenium.hasCssClass(elt, "ui-menu-parent")) && isToggleEventHover()) {
+            Actions actions = new Actions(getWebDriver());
+            actions.moveToElement(elt).build().perform();
+        }
+        else {
+            WebElement eltA = elt.findElement(By.xpath("./a"));
+            if (isAjaxified(eltA, "onclick")) {
+                PrimeSelenium.guardAjax(elt).click();
+            }
+            else {
+                elt.click();
+            }
+            // some more cases?
+        }
+
+        return  elt;
+    }
+
+    public boolean isToggleEventHover() {
+        return "hover".equals(getWidgetConfiguration().getString("toggleEvent"));
+    }
+
+    public boolean isToggleEventClick() {
+        return "click".equals(getWidgetConfiguration().getString("toggleEvent"));
+    }
+}
diff --git a/primefaces-selenium/primefaces-selenium-core/pom.xml b/primefaces-selenium/primefaces-selenium-core/pom.xml
index 18b4e6fc67..c4e200999c 100644
--- a/primefaces-selenium/primefaces-selenium-core/pom.xml
+++ b/primefaces-selenium/primefaces-selenium-core/pom.xml
@@ -52,12 +52,12 @@
         <dependency>
             <groupId>org.seleniumhq.selenium</groupId>
             <artifactId>selenium-api</artifactId>
-            <version>4.1.2</version>
+            <version>4.1.3</version>
         </dependency>
         <dependency>
             <groupId>org.seleniumhq.selenium</groupId>
             <artifactId>selenium-java</artifactId>
-            <version>4.1.2</version>
+            <version>4.1.3</version>
         </dependency>
 
         <!-- org.seleniumhq.selenium and com.googlecode.owasp-java-html-sanitizer need guava; resolved version-conflicts -->
diff --git a/primefaces-showcase/pom.xml b/primefaces-showcase/pom.xml
index b053f6b33d..d21b7b6ac9 100644
--- a/primefaces-showcase/pom.xml
+++ b/primefaces-showcase/pom.xml
@@ -23,10 +23,19 @@
         <myfaces.version>2.3.9</myfaces.version>
         <myfaces-next.version>2.3-next-M6</myfaces-next.version>
         <resteasy.version>5.0.2.Final</resteasy.version>
-        <jetty.version>9.4.45.v20220203</jetty.version>
+        <jetty.version>9.4.46.v20220331</jetty.version>
         <jsf.project.stage>Production</jsf.project.stage>
     </properties>
 
+    <repositories>
+        <repository>
+            <id>primefaces</id>
+            <name>PrimeFaces Maven Repository</name>
+            <url>https://repository.primefaces.org</url>
+            <layout>default</layout>
+        </repository>
+    </repositories>
+
     <dependencies>
         <dependency>
             <groupId>org.apache.tomee</groupId>
@@ -131,6 +140,7 @@
         <dependency>
             <groupId>net.sf.barcode4j</groupId>
             <artifactId>barcode4j-light</artifactId>
+            <version>2.1</version>
         </dependency>
 
         <!-- Cache -->
@@ -160,7 +170,6 @@
         <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
-            <version>2.11.0</version>
         </dependency>
 
         <!-- JAXB required for JDK9+ -->
diff --git a/primefaces-showcase/src/main/java/org/primefaces/showcase/view/data/dataexporter/CustomizedDocumentsView.java b/primefaces-showcase/src/main/java/org/primefaces/showcase/view/data/dataexporter/CustomizedDocumentsView.java
index 49e86d7f8a..27e2e2209f 100644
--- a/primefaces-showcase/src/main/java/org/primefaces/showcase/view/data/dataexporter/CustomizedDocumentsView.java
+++ b/primefaces-showcase/src/main/java/org/primefaces/showcase/view/data/dataexporter/CustomizedDocumentsView.java
@@ -23,7 +23,18 @@
  */
 package org.primefaces.showcase.view.data.dataexporter;
 
-import com.lowagie.text.*;
+import java.io.File;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.RequestScoped;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+import javax.inject.Inject;
+import javax.inject.Named;
+
 import org.apache.poi.hssf.usermodel.*;
 import org.apache.poi.hssf.util.HSSFColor;
 import org.apache.poi.ss.usermodel.FillPatternType;
@@ -33,16 +44,7 @@ import org.primefaces.component.export.PDFOrientationType;
 import org.primefaces.showcase.domain.Product;
 import org.primefaces.showcase.service.ProductService;
 
-import javax.annotation.PostConstruct;
-import javax.enterprise.context.RequestScoped;
-import javax.faces.context.ExternalContext;
-import javax.faces.context.FacesContext;
-import javax.inject.Inject;
-import javax.inject.Named;
-import java.io.File;
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.List;
+import com.lowagie.text.*;
 
 @Named
 @RequestScoped
@@ -73,7 +75,7 @@ public class CustomizedDocumentsView implements Serializable {
         excelOpt.setFacetFontSize("10");
         excelOpt.setFacetFontColor("#0000ff");
         excelOpt.setFacetFontStyle("BOLD");
-        excelOpt.setCellFontColor("#00ff00");
+        excelOpt.setCellFontColor("#145c14");
         excelOpt.setCellFontSize("8");
         excelOpt.setFontName("Verdana");
 
diff --git a/primefaces-showcase/src/main/webapp/ui/data/dataexporter/customizedDocuments.xhtml b/primefaces-showcase/src/main/webapp/ui/data/dataexporter/customizedDocuments.xhtml
index 052a1d6d14..547eaca3cd 100644
--- a/primefaces-showcase/src/main/webapp/ui/data/dataexporter/customizedDocuments.xhtml
+++ b/primefaces-showcase/src/main/webapp/ui/data/dataexporter/customizedDocuments.xhtml
@@ -20,7 +20,7 @@
             <h:form>
                 <h5>Processors</h5>
                 <p:commandButton value="XLS" styleClass="p-mr-2 p-mb-2">
-                    <p:dataExporter type="xls" target="tbl" fileName="products"
+                    <p:dataExporter type="xlsxstream" target="tbl" fileName="products"
                                     postProcessor="#{customizedDocumentsView.postProcessXLS}"/>
                 </p:commandButton>
 
@@ -62,7 +62,7 @@
 
                 <h5>Options</h5>
                 <p:commandButton value="XLS" styleClass="p-mr-2 p-mb-2">
-                    <p:dataExporter type="xls" target="tbl2" fileName="products"
+                    <p:dataExporter type="xlsxstream" target="tbl2" fileName="products"
                                     options="#{customizedDocumentsView.excelOpt}"/>
                 </p:commandButton>
 
diff --git a/primefaces/pom.xml b/primefaces/pom.xml
index 19a187b2d4..544c096c60 100644
--- a/primefaces/pom.xml
+++ b/primefaces/pom.xml
@@ -17,7 +17,8 @@
     <name>PrimeFaces</name>
 
     <properties>
-
+        <minify.disabled>true</minify.disabled>
+        <resources.dir.compressed>${project.build.directory}/classes/META-INF/resources/primefaces</resources.dir.compressed>
     </properties>
 
     <dependencies>
@@ -62,8 +63,8 @@
                     <artifactId>jcl-over-slf4j</artifactId>
                 </exclusion>
                 <exclusion>
-                	<groupId>org.apache.logging.log4j</groupId>
-                	<artifactId>log4j-api</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                    <artifactId>log4j-api</artifactId>
                 </exclusion>
             </exclusions>
             <scope>provided</scope>
@@ -101,8 +102,8 @@
                     <artifactId>bcprov-jdk15on</artifactId>
                 </exclusion>
                 <exclusion>
-                	<groupId>org.apache.logging.log4j</groupId>
-                	<artifactId>log4j-api</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                    <artifactId>log4j-api</artifactId>
                 </exclusion>
             </exclusions>
             <scope>provided</scope>
@@ -179,7 +180,7 @@
         <dependency>
             <groupId>org.apache.tomcat</groupId>
             <artifactId>tomcat-jasper-el</artifactId>
-            <version>9.0.60</version>
+            <version>9.0.62</version>
             <scope>test</scope>
         </dependency>
         <!-- Content type validation in FileUploadUtilsTest -->
@@ -251,7 +252,6 @@
             <artifactId>encoder</artifactId>
             <optional>true</optional>
         </dependency>
-        <!-- use 2.4 as later versions would require multiple files to shade -->
         <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
@@ -374,6 +374,10 @@
                             <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                         </manifest>
                     </archive>
+                    <excludes>
+                        <!-- Remove all Typescript files as not needed -->
+                        <exclude>**/META-INF/resources/**/*.ts</exclude>
+                    </excludes>
                 </configuration>
             </plugin>
 
@@ -529,443 +533,340 @@
             </plugin>
 
             <plugin>
-                <groupId>net.alchim31.maven</groupId>
-                <artifactId>yuicompressor-maven-plugin</artifactId>
-                <version>1.5.1</version>
+                <groupId>org.primefaces.extensions</groupId>
+                <artifactId>resources-optimizer-maven-plugin</artifactId>
+                <version>2.3.8</version>
                 <executions>
                     <execution>
+                        <id>optimize</id>
+                        <phase>prepare-package</phase>
                         <goals>
-                            <goal>compress</goal>
+                            <goal>optimize</goal>
                         </goals>
                     </execution>
                 </executions>
                 <configuration>
-                    <nosuffix>true</nosuffix>
-                    <linebreakpos>-1</linebreakpos>
-                    <excludes>
-                        <exclude>**/*.js</exclude>
-                        <exclude>**/*.css</exclude>
-                    </excludes>
-                    <aggregations>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/components.css</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/core.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/jquery/jquery.ui.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/jquery/jquery.ui.timepicker.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/jquery/jquery.ui.pfextensions.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/avatar/avatar.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/avatargroup/avatargroup.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/badge/badge.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/card/card.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/chip/chip.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/chronoline/chronoline.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/confirmpopup/confirmpopup.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/tag/tag.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/skeleton/skeleton.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/accordion/accordion.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/autocomplete/autocomplete.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/blockui/blockui.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/carousel/carousel.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/columntoggler/columntoggler.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/dashboard/dashboard.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/datalist/datalist.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/datagrid/datagrid.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/datascroller/datascroller.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/datatable/datatable.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/dialog/dialog.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/divider/divider.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/fieldset/fieldset.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/inputgroup.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/grid/grid.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/growl/growl.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/inplace/inplace.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/lightbox/lightbox.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/menu/menu.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/messages/messages.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/notificationbar/notificationbar.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/orderlist/orderlist.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/overlaypanel/overlaypanel.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/panel/panel.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/panelgrid/panelgrid.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/paginator/paginator.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/picklist/picklist.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/progressbar/progressbar.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/rating/rating.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/scrolltop/scrolltop.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/spinner/spinner.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/splitter/splitter.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/speeddial/speeddial.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/tabview/tabview.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/tagcloud/tagcloud.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/toolbar/toolbar.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/tooltip/tooltip.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/tree/tree.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/treetable/treetable.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/wizard/wizard.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/chips/chips.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/sidebar/sidebar.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/dataview/dataview.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/datepicker/datepicker.css</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/core.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/jquery/jquery.browser.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/js.cookie.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/core.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/core.env.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/core.ajax.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/core.csp.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/core.expressions.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/core.utils.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/core.widget.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/core.resources.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/core.clientwindow.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/core.polyfills.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/core.polyfill.replaceall.min.js</include>
-
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/ajaxstatus/ajaxstatus.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/poll/poll.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/components.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/core/core.dialog.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/accordion/accordion.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/autocomplete/autocomplete.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/blockui/blockui.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/calendar/calendar.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/carousel/carousel.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/confirmpopup/confirmpopup.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/columntoggler/columntoggler.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/dashboard/dashboard.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/datagrid/datagrid.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/datalist/datalist.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/datascroller/datascroller.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/datatable/datatable.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/datatable/datatable.frozen.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/dialog/dialog.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/dragdrop/dragdrop.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/effect/effect.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/fieldset/fieldset.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.inputtext.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.inputtextarea.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.selectonemenu.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.selectoneradio.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.selectbooleancheckbox.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.selectmanycheckbox.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.selectlistbox.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.selectonelistbox.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.selectmanymenu.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.cascadeselect.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.commandbutton.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.commandlink.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.button.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.linkbutton.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.selectmanybutton.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.selectonebutton.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.selectbooleanbutton.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.selectcheckboxmenu.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.password.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.defaultcommand.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.splitbutton.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/forms/forms.multiselectlistbox.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/growl/growl.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/inplace/inplace.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/lightbox/lightbox.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/menu/menu.base.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/menu/menu.breadcrumb.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/menu/menu.tieredmenu.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/menu/menu.menubar.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/menu/menu.slidemenu.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/menu/menu.plainmenu.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/menu/menu.menubutton.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/menu/menu.contextmenu.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/menu/menu.megamenu.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/menu/menu.panelmenu.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/menu/menu.tabmenu.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/message/message.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/messages/messages.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/notificationbar/notificationbar.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/panel/panel.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/orderlist/orderlist.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/outputpanel/outputpanel.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/overlaypanel/overlaypanel.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/paginator/paginator.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/picklist/picklist.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/progressbar/progressbar.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/rating/rating.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/resizable/resizable.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/slider/slider.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/spinner/spinner.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/splitter/splitter.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/spotlight/spotlight.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/speeddial/speeddial.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/sticky/sticky.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/tabview/tabview.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/tagcloud/tagcloud.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/tooltip/tooltip.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/tree/tree.base.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/tree/tree.vertical.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/tree/tree.horizontal.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/treetable/treetable.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/wizard/wizard.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/tristatecheckbox/tristatecheckbox.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/chip/chip.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/chips/chips.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/scrolltop/scrolltop.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/sidebar/sidebar.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/dataview/dataview.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/validation/validation.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/validation/validation.common.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/validation/validation.converters.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/validation/validation.validators.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/validation/validation.highlighters.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/imagecropper/imagecropper.js</output>
+                    <useDataUri>false</useDataUri>
+                    <failOnWarning>true</failOnWarning>
+                    <imagesDir>${project.build.directory}/classes/META-INF/resources</imagesDir>
+                    <languageIn>ECMASCRIPT_2015</languageIn>
+                    <languageOut>ECMASCRIPT5</languageOut>
+                    <resourcesSets>
+                        <resourcesSet>
                             <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/imagecropper/0-cropper.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/imagecropper/1-jquery-cropper.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/imagecropper/2-imagecropper.js</include>
+                                <include>charts/**</include>
+                                <include>clock/**</include>
+                                <include>colorpicker/**</include>
+                                <include>contentflow/**</include>
+                                <include>datepicker/**</include>
+                                <include>diagram/**</include>
+                                <include>dock/**</include>
+                                <include>filedownload/**</include>
+                                <include>fileupload/**</include>
+                                <include>galleria/**</include>
+                                <include>gmap/**</include>
+                                <include>hotkey/**</include>
+                                <include>idlemonitor/**</include>
+                                <include>imagecompare/**</include>
+                                <include>imagecropper/**</include>
+                                <include>imageswitch/**</include>
+                                <include>inputmask/**</include>
+                                <include>inputnumber/**</include>
+                                <include>inputswitch/**</include>
+                                <include>keyboard/**</include>
+                                <include>keyfilter/**</include>
+                                <include>knob/**</include>
+                                <include>lifecycle/**</include>
+                                <include>log/**</include>
+                                <include>mindmap/**</include>
+                                <include>organigram/**</include>
+                                <include>orgchart/**</include>
+                                <include>photocam/**</include>
+                                <include>primeicons/*.css</include>
+                                <include>printer/**</include>
+                                <include>ring/**</include>
+                                <include>schedule/**</include>
+                                <include>scrollpanel/**</include>
+                                <include>signature/**</include>
+                                <include>stack/**</include>
+                                <include>terminal/**</include>
+                                <include>texteditor/**</include>
+                                <include>timeline/**</include>
+                                <include>toggleswitch/**</include>
+                                <include>watermark/**</include>
                             </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/inputmask/inputmask.js</output>
+                            <aggregations>
+                                <aggregation>
+                                    <inputDir>${resources.dir.compressed}</inputDir>
+                                    <subDirMode>true</subDirMode>
+                                    <withoutCompress>${minify.disabled}</withoutCompress>
+                                </aggregation>
+                            </aggregations>
+                        </resourcesSet>
+                        <!-- uncompressed widgets -->
+                        <resourcesSet>
                             <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/inputmask/0-jquery.inputmask.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/inputmask/1-inputmask.js</include>
+                                <include>chartjs/**</include>
                             </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/inputnumber/inputnumber.js</output>
+                            <aggregations>
+                                <aggregation>
+                                    <inputDir>${resources.dir.compressed}</inputDir>
+                                    <subDirMode>true</subDirMode>
+                                    <withoutCompress>true</withoutCompress>
+                                </aggregation>
+                            </aggregations>
+                        </resourcesSet>
+                        <resourcesSet>
                             <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/inputnumber/0-autoNumeric.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/inputnumber/1-inputnumber.js</include>
+                                <include>core/core.css</include>
+                                <include>jquery/jquery.ui.css</include>
+                                <include>jquery/jquery.ui.timepicker.css</include>
+                                <include>jquery/jquery.ui.pfextensions.css</include>
+                                <include>avatar/avatar.css</include>
+                                <include>avatargroup/avatargroup.css</include>
+                                <include>badge/badge.css</include>
+                                <include>card/card.css</include>
+                                <include>chip/chip.css</include>
+                                <include>chronoline/chronoline.css</include>
+                                <include>confirmpopup/confirmpopup.css</include>
+                                <include>tag/tag.css</include>
+                                <include>skeleton/skeleton.css</include>
+                                <include>accordion/accordion.css</include>
+                                <include>autocomplete/autocomplete.css</include>
+                                <include>blockui/blockui.css</include>
+                                <include>carousel/carousel.css</include>
+                                <include>columntoggler/columntoggler.css</include>
+                                <include>dashboard/dashboard.css</include>
+                                <include>datalist/datalist.css</include>
+                                <include>datagrid/datagrid.css</include>
+                                <include>datascroller/datascroller.css</include>
+                                <include>datatable/datatable.css</include>
+                                <include>dialog/dialog.css</include>
+                                <include>divider/divider.css</include>
+                                <include>fieldset/fieldset.css</include>
+                                <include>forms/forms.css</include>
+                                <include>forms/inputgroup.css</include>
+                                <include>grid/grid.css</include>
+                                <include>growl/growl.css</include>
+                                <include>inplace/inplace.css</include>
+                                <include>lightbox/lightbox.css</include>
+                                <include>menu/menu.css</include>
+                                <include>messages/messages.css</include>
+                                <include>notificationbar/notificationbar.css</include>
+                                <include>orderlist/orderlist.css</include>
+                                <include>overlaypanel/overlaypanel.css</include>
+                                <include>panel/panel.css</include>
+                                <include>panelgrid/panelgrid.css</include>
+                                <include>paginator/paginator.css</include>
+                                <include>picklist/picklist.css</include>
+                                <include>progressbar/progressbar.css</include>
+                                <include>rating/rating.css</include>
+                                <include>scrolltop/scrolltop.css</include>
+                                <include>spinner/spinner.css</include>
+                                <include>splitter/splitter.css</include>
+                                <include>speeddial/speeddial.css</include>
+                                <include>tabview/tabview.css</include>
+                                <include>tagcloud/tagcloud.css</include>
+                                <include>toolbar/toolbar.css</include>
+                                <include>tooltip/tooltip.css</include>
+                                <include>tree/tree.css</include>
+                                <include>treetable/treetable.css</include>
+                                <include>wizard/wizard.css</include>
+                                <include>chips/chips.css</include>
+                                <include>sidebar/sidebar.css</include>
+                                <include>dataview/dataview.css</include>
+                                <include>datepicker/datepicker.css</include>
                             </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/keyboard/keyboard.js</output>
+                            <aggregations>
+                                <aggregation>
+                                    <inputDir>${resources.dir.compressed}</inputDir>
+                                    <outputFile>${resources.dir.compressed}/components.css</outputFile>
+                                    <withoutCompress>${minify.disabled}</withoutCompress>
+                                </aggregation>
+                            </aggregations>
+                        </resourcesSet>
+                        <resourcesSet>
                             <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/keyboard/0-jquery.keypad.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/keyboard/1-keyboard.js</include>
+                                <include>jquery/jquery.browser.js</include>
+                                <include>core/js.cookie.js</include>
+                                <include>core/core.js</include>
+                                <include>core/core.env.js</include>
+                                <include>core/core.ajax.js</include>
+                                <include>core/core.csp.js</include>
+                                <include>core/core.expressions.js</include>
+                                <include>core/core.utils.js</include>
+                                <include>core/core.widget.js</include>
+                                <include>core/core.resources.js</include>
+                                <include>core/core.clientwindow.js</include>
+                                <include>core/core.polyfills.js</include>
+                                <include>core/core.polyfill.replaceall.min.js</include>
+                                <include>ajaxstatus/ajaxstatus.js</include>
+                                <include>poll/poll.js</include>
                             </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/keyfilter/keyfilter.js</output>
+                            <aggregations>
+                                <aggregation>
+                                    <inputDir>${resources.dir.compressed}</inputDir>
+                                    <outputFile>${resources.dir.compressed}/core.js</outputFile>
+                                    <withoutCompress>${minify.disabled}</withoutCompress>
+                                </aggregation>
+                            </aggregations>
+                        </resourcesSet>
+                        <resourcesSet>
                             <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/keyfilter/0-jquery.keyfilter.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/keyfilter/1-keyfilter.js</include>
+                                <include>core/core.dialog.js</include>
+                                <include>accordion/accordion.js</include>
+                                <include>autocomplete/autocomplete.js</include>
+                                <include>blockui/blockui.js</include>
+                                <include>calendar/calendar.js</include>
+                                <include>carousel/carousel.js</include>
+                                <include>confirmpopup/confirmpopup.js</include>
+                                <include>columntoggler/columntoggler.js</include>
+                                <include>dashboard/dashboard.js</include>
+                                <include>datagrid/datagrid.js</include>
+                                <include>datalist/datalist.js</include>
+                                <include>datascroller/datascroller.js</include>
+                                <include>datatable/datatable.js</include>
+                                <include>datatable/datatable.frozen.js</include>
+                                <include>dialog/dialog.js</include>
+                                <include>dragdrop/dragdrop.js</include>
+                                <include>effect/effect.js</include>
+                                <include>fieldset/fieldset.js</include>
+                                <include>forms/forms.inputtext.js</include>
+                                <include>forms/forms.inputtextarea.js</include>
+                                <include>forms/forms.selectonemenu.js</include>
+                                <include>forms/forms.selectoneradio.js</include>
+                                <include>forms/forms.selectbooleancheckbox.js</include>
+                                <include>forms/forms.selectmanycheckbox.js</include>
+                                <include>forms/forms.selectlistbox.js</include>
+                                <include>forms/forms.selectonelistbox.js</include>
+                                <include>forms/forms.selectmanymenu.js</include>
+                                <include>forms/forms.cascadeselect.js</include>
+                                <include>forms/forms.commandbutton.js</include>
+                                <include>forms/forms.commandlink.js</include>
+                                <include>forms/forms.button.js</include>
+                                <include>forms/forms.linkbutton.js</include>
+                                <include>forms/forms.selectmanybutton.js</include>
+                                <include>forms/forms.selectonebutton.js</include>
+                                <include>forms/forms.selectbooleanbutton.js</include>
+                                <include>forms/forms.selectcheckboxmenu.js</include>
+                                <include>forms/forms.password.js</include>
+                                <include>forms/forms.defaultcommand.js</include>
+                                <include>forms/forms.splitbutton.js</include>
+                                <include>forms/forms.multiselectlistbox.js</include>
+                                <include>growl/growl.js</include>
+                                <include>inplace/inplace.js</include>
+                                <include>lightbox/lightbox.js</include>
+                                <include>menu/menu.base.js</include>
+                                <include>menu/menu.breadcrumb.js</include>
+                                <include>menu/menu.tieredmenu.js</include>
+                                <include>menu/menu.menubar.js</include>
+                                <include>menu/menu.slidemenu.js</include>
+                                <include>menu/menu.plainmenu.js</include>
+                                <include>menu/menu.menubutton.js</include>
+                                <include>menu/menu.contextmenu.js</include>
+                                <include>menu/menu.megamenu.js</include>
+                                <include>menu/menu.panelmenu.js</include>
+                                <include>menu/menu.tabmenu.js</include>
+                                <include>message/message.js</include>
+                                <include>messages/messages.js</include>
+                                <include>notificationbar/notificationbar.js</include>
+                                <include>panel/panel.js</include>
+                                <include>orderlist/orderlist.js</include>
+                                <include>outputpanel/outputpanel.js</include>
+                                <include>overlaypanel/overlaypanel.js</include>
+                                <include>paginator/paginator.js</include>
+                                <include>picklist/picklist.js</include>
+                                <include>progressbar/progressbar.js</include>
+                                <include>rating/rating.js</include>
+                                <include>resizable/resizable.js</include>
+                                <include>slider/slider.js</include>
+                                <include>spinner/spinner.js</include>
+                                <include>splitter/splitter.js</include>
+                                <include>spotlight/spotlight.js</include>
+                                <include>speeddial/speeddial.js</include>
+                                <include>sticky/sticky.js</include>
+                                <include>tabview/tabview.js</include>
+                                <include>tagcloud/tagcloud.js</include>
+                                <include>tooltip/tooltip.js</include>
+                                <include>tree/tree.base.js</include>
+                                <include>tree/tree.vertical.js</include>
+                                <include>tree/tree.horizontal.js</include>
+                                <include>treetable/treetable.js</include>
+                                <include>wizard/wizard.js</include>
+                                <include>tristatecheckbox/tristatecheckbox.js</include>
+                                <include>chip/chip.js</include>
+                                <include>chips/chips.js</include>
+                                <include>scrolltop/scrolltop.js</include>
+                                <include>sidebar/sidebar.js</include>
+                                <include>dataview/dataview.js</include>
                             </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/knob/knob.js</output>
+                            <aggregations>
+                                <aggregation>
+                                    <inputDir>${resources.dir.compressed}</inputDir>
+                                    <outputFile>${resources.dir.compressed}/components.js</outputFile>
+                                    <withoutCompress>${minify.disabled}</withoutCompress>
+                                </aggregation>
+                            </aggregations>
+                        </resourcesSet>
+                        <resourcesSet>
                             <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/knob/1-jquery.knob.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/knob/2-knob.js</include>
+                                <include>jquery/jquery.ui.js</include>
+                                <include>jquery/jquery.ui.timepicker.js</include>
+                                <include>jquery/jquery.caretposition.js</include>
+                                <include>jquery/jquery.autosize.js</include>
+                                <include>jquery/jquery.mousewheel.js</include>
+                                <include>jquery/jquery.rangy.js</include>
+                                <include>jquery/jquery.ui.touch-punch.js</include>
+                                <include>jquery/jquery.ui.pfextensions.js</include>
                             </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/chartjs/chartjs.js</output>
+                            <aggregations>
+                                <aggregation>
+                                    <inputDir>${resources.dir.compressed}</inputDir>
+                                    <outputFile>${resources.dir.compressed}/jquery/jquery-plugins.js</outputFile>
+                                    <withoutCompress>${minify.disabled}</withoutCompress>
+                                </aggregation>
+                            </aggregations>
+                        </resourcesSet>
+                        <resourcesSet>
                             <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/chartjs/0-chartjs.min.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/chartjs/1-widgets.js</include>
+                                <include>touch/touchswipe.js</include>
                             </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/signature/signature.js</output>
+                            <aggregations>
+                                <aggregation>
+                                    <inputDir>${resources.dir.compressed}</inputDir>
+                                    <outputFile>${resources.dir.compressed}/touch/touchswipe.js</outputFile>
+                                    <withoutCompress>${minify.disabled}</withoutCompress>
+                                </aggregation>
+                            </aggregations>
+                        </resourcesSet>
+                        <resourcesSet>
                             <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/signature/0-signature.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/signature/1-widget.js</include>
+                                <include>validation/validation.bv.js</include>
                             </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/scrollpanel/scrollpanel.js</output>
+                            <aggregations>
+                                <aggregation>
+                                    <inputDir>${resources.dir.compressed}</inputDir>
+                                    <outputFile>${resources.dir.compressed}/validation/validation.bv.js</outputFile>
+                                    <withoutCompress>${minify.disabled}</withoutCompress>
+                                </aggregation>
+                            </aggregations>
+                        </resourcesSet>
+                        <resourcesSet>
                             <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/scrollpanel/0-jquery.jscrollpane.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/scrollpanel/1-scrollpanel.js</include>
+                                <include>validation/validation.common.js</include>
+                                <include>validation/validation.converters.js</include>
+                                <include>validation/validation.validators.js</include>
+                                <include>validation/validation.highlighters.js</include>
                             </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/timeline/timeline.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/timeline/0-timeline.min.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/timeline/1-timeline.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/idlemonitor/idlemonitor.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/idlemonitor/0-jquery.idletimer.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/idlemonitor/1-idlemonitor.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/charts/charts.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/charts/0-jqPlot.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/charts/1-charts.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/jquery/jquery-plugins.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/jquery/jquery.ui.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/jquery/jquery.ui.timepicker.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/jquery/jquery.caretposition.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/jquery/jquery.autosize.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/jquery/jquery.mousewheel.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/jquery/jquery.rangy.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/jquery/jquery.ui.touch-punch.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/jquery/jquery.ui.pfextensions.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/colorpicker/colorpicker.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/colorpicker/0-jquery.colorpicker.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/colorpicker/1-colorpicker.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/diagram/diagram.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/diagram/0-jsplumb.min.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/diagram/1-diagram.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/diagram/diagram.css</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/diagram/0-jsplumbtoolkit-defaults.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/diagram/1-diagram.css</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/fileupload/fileupload.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/fileupload/0-jquery.iframe-transport.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/fileupload/1-jquery.fileupload.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/fileupload/2-fileupload.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/fileupload/3-fileupload.simple.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/schedule/schedule.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/schedule/fullcalendar.min.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/schedule/1-schedule.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/schedule/schedule.css</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/schedule/fullcalendar.min.css</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/datepicker/datepicker.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/datepicker/0-datepicker.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/datepicker/1-datepicker.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/texteditor/texteditor.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/texteditor/0-quill.min.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/texteditor/1-texteditor.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/texteditor/texteditor.css</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/texteditor/0-texteditor.css</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/texteditor/1-texteditor-theme.css</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/filedownload/filedownload.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/filedownload/0-download.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/filedownload/1-pf-filedownload.js</include>
-                            </includes>
-                        </aggregation>
-                        <aggregation>
-                            <insertNewLine>true</insertNewLine>
-                            <removeIncluded>true</removeIncluded>
-                            <output>${project.build.directory}/classes/META-INF/resources/primefaces/galleria/galleria.js</output>
-                            <includes>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/galleria/0-galleriaitem.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/galleria/0-galleriathumbnail.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/galleria/0-galleria.js</include>
-                                <include>${project.build.directory}/classes/META-INF/resources/primefaces/galleria/1-galleria.js</include>
-                            </includes>
-                        </aggregation>
-                    </aggregations>
+                            <aggregations>
+                                <aggregation>
+                                    <inputDir>${resources.dir.compressed}</inputDir>
+                                    <outputFile>${resources.dir.compressed}/validation/validation.js</outputFile>
+                                    <withoutCompress>${minify.disabled}</withoutCompress>
+                                </aggregation>
+                            </aggregations>
+                        </resourcesSet>
+                    </resourcesSets>
                 </configuration>
             </plugin>
 
@@ -999,10 +900,9 @@
                             <shadedPattern>org.primefaces.shaded.commons.io</shadedPattern>
                             <includes>
                                 <include>org.apache.commons.io.FilenameUtils</include>
-                                <include>org.apache.commons.io.IOUtils</include>
+                                <include>org.apache.commons.io.FileSystem</include>
+                                <include>org.apache.commons.io.IOCase</include>
                                 <include>org.apache.commons.io.input.BoundedInputStream</include>
-                                <include>org.apache.commons.io.output.StringBuilderWriter</include>
-                                <include>org.apache.commons.io.output.ByteArrayOutputStream</include>
                             </includes>
                         </relocation>
                     </relocations>
@@ -1011,10 +911,9 @@
                             <artifact>commons-io:commons-io</artifact>
                             <includes>
                                 <include>org/apache/commons/io/FilenameUtils.class</include>
-                                <include>org/apache/commons/io/IOUtils.class</include>
+                                <include>org/apache/commons/io/FileSystem.class</include>
+                                <include>org/apache/commons/io/IOCase.class</include>
                                 <include>org/apache/commons/io/input/BoundedInputStream.class</include>
-                                <include>org/apache/commons/io/output/StringBuilderWriter.class</include>
-                                <include>org/apache/commons/io/output/ByteArrayOutputStream.class</include>
                             </includes>
                         </filter>
                         <filter>
@@ -1188,7 +1087,7 @@
                     <plugin>
                         <groupId>org.owasp</groupId>
                         <artifactId>dependency-check-maven</artifactId>
-                        <version>7.0.0</version>
+                        <version>7.0.4</version>
                         <configuration>
                             <skipProvidedScope>false</skipProvidedScope>
                             <skipRuntimeScope>false</skipRuntimeScope>
@@ -1287,47 +1186,17 @@
         </profile>
         <profile>
             <id>minify</id>
+            <properties>
+                <minify.disabled>false</minify.disabled>
+            </properties>
             <build>
-                <plugins>
-                    <!--
-                        don't skip *.js and *.css, we need to minify
-                    -->
-                    <plugin>
-                        <groupId>net.alchim31.maven</groupId>
-                        <artifactId>yuicompressor-maven-plugin</artifactId>
-                        <version>1.5.1</version>
-                        <configuration>
-                            <jswarn>false</jswarn>
-                            <force>true</force>
-                            <useProcessedResources>true</useProcessedResources>
-                            <excludes>
-                                <exclude>**/*.something</exclude>
-                                <exclude>**/photocam.js</exclude>
-                                <exclude>**/0-quill.min.js</exclude>
-                                <exclude>**/jquery.js</exclude>
-                                <exclude>**/fullcalendar.min.js</exclude>
-                                <exclude>**/0-jsplumb.min.js</exclude>
-                                <exclude>**/0-timeline.min.js</exclude>
-                                <exclude>**/0-chartjs.min.js</exclude>
-                                <exclude>**/0-jquery.inputmask.js</exclude>
-                                <exclude>**/moment.js</exclude>
-                                <exclude>**/moment-timezone-with-data.js</exclude>
-                                <exclude>**/printer.js</exclude>
-                                <exclude>**/raphael.js</exclude>
-                                <exclude>**/theme.css</exclude>
-                                <exclude>**/build/**</exclude>
-                            </excludes>
-                            <includes>
-                                <include>**/*.js</include>
-                                <include>**/*.css</include>
-                            </includes>
-                        </configuration>
-                    </plugin>
-                </plugins>
             </build>
         </profile>
         <profile>
             <id>release</id>
+            <properties>
+                <minify.disabled>false</minify.disabled>
+            </properties>
             <build>
                 <plugins>
                     <!-- Write docs and *.d.ts file to the current documentation directory docs/jsdocs -->
diff --git a/primefaces/src/conf/owasp-suppressions.xml b/primefaces/src/conf/owasp-suppressions.xml
index ef39a0d84b..269baf5362 100644
--- a/primefaces/src/conf/owasp-suppressions.xml
+++ b/primefaces/src/conf/owasp-suppressions.xml
@@ -1,12 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <suppressions xmlns="https://jeremylong.github.io/DependencyCheck/dependency-suppression.1.3.xsd">
-    <suppress>
-        <notes>
-            <![CDATA[file name: commons-io-2.4.jar. PrimeFaces shades this JAR and does not use the function in this report.]]>
-        </notes>
-        <packageUrl regex="true">^pkg:maven/commons\-io/commons\-io@.*$</packageUrl>
-        <cve>CVE-2021-29425</cve>
-    </suppress>
     <suppress>
         <notes>
             <![CDATA[file name: guava.jar PrimeFaces does not use the temp directory functionality that is vulnerable]]>
diff --git a/primefaces/src/main/java/org/primefaces/application/resource/MoveScriptsToBottomResponseWriter.java b/primefaces/src/main/java/org/primefaces/application/resource/MoveScriptsToBottomResponseWriter.java
index 26a6aa22bc..4e04684d19 100644
--- a/primefaces/src/main/java/org/primefaces/application/resource/MoveScriptsToBottomResponseWriter.java
+++ b/primefaces/src/main/java/org/primefaces/application/resource/MoveScriptsToBottomResponseWriter.java
@@ -201,12 +201,11 @@ public class MoveScriptsToBottomResponseWriter extends ResponseWriterWrapper {
 
             // write script includes
             for (Entry<String, List<Map<String, String>>> entry : state.getIncludes().entrySet()) {
-                String scriptType = entry.getKey();
-                List<Map<String, String>> includes = entry.getValue();
 
+                List<Map<String, String>> includes = entry.getValue();
                 for (int i = 0; i < includes.size(); i++) {
                     Map<String, String> attributes = includes.get(i);
-                    attributes.put(TYPE_ATTRIBUTE, scriptType);
+                    attributes.put(TYPE_ATTRIBUTE, entry.getKey());
                     getWrapped().startElement(SCRIPT_TAG, null);
                     for (Entry<String, String> attribute : attributes.entrySet()) {
                         String attributeName = attribute.getKey();
diff --git a/primefaces/src/main/java/org/primefaces/behavior/ajax/AjaxBehaviorListenerImpl.java b/primefaces/src/main/java/org/primefaces/behavior/ajax/AjaxBehaviorListenerImpl.java
index 1fb7e64cf9..57dbe12506 100644
--- a/primefaces/src/main/java/org/primefaces/behavior/ajax/AjaxBehaviorListenerImpl.java
+++ b/primefaces/src/main/java/org/primefaces/behavior/ajax/AjaxBehaviorListenerImpl.java
@@ -71,15 +71,10 @@ public class AjaxBehaviorListenerImpl implements AjaxBehaviorListener, Serializa
         try {
             listener.invoke(elContext, new Object[]{});
         }
-        catch (MethodNotFoundException | IllegalArgumentException e) {
-            processArgListener(context, elContext, event);
-        }
-        // JBoss hack, see #1375
-        catch (ArrayIndexOutOfBoundsException e) {
-            processArgListener(context, elContext, event);
-        }
-        // Mojarra hack for Composite Components, see #7819
-        catch (PropertyNotFoundException e) {
+        // catch MethodNotFoundException and IllegalArgumentException by spec
+        // catch ArrayIndexOutOfBoundsException as JBoss hack, see #1375
+        // catch PropertyNotFoundException as Mojarra hack for Composite Components, see #7819
+        catch (MethodNotFoundException | IllegalArgumentException | ArrayIndexOutOfBoundsException | PropertyNotFoundException e) {
             processArgListener(context, elContext, event);
         }
     }
@@ -92,15 +87,10 @@ public class AjaxBehaviorListenerImpl implements AjaxBehaviorListener, Serializa
         try {
             listenerWithArg.invoke(elContext, new Object[]{event});
         }
-        catch (MethodNotFoundException | IllegalArgumentException e) {
-            processCustomArgListener(context, elContext, event);
-        }
-        // JBoss hack, see #1375
-        catch (ArrayIndexOutOfBoundsException e) {
-            processCustomArgListener(context, elContext, event);
-        }
-        // Mojarra hack for Composite Components, see #7819
-        catch (PropertyNotFoundException e) {
+        // catch MethodNotFoundException and IllegalArgumentException by spec
+        // catch ArrayIndexOutOfBoundsException as JBoss hack, see #1375
+        // catch PropertyNotFoundException as Mojarra hack for Composite Components, see #7819
+        catch (MethodNotFoundException | IllegalArgumentException | ArrayIndexOutOfBoundsException | PropertyNotFoundException e) {
             processCustomArgListener(context, elContext, event);
         }
     }
diff --git a/primefaces/src/main/java/org/primefaces/component/accordionpanel/AccordionPanelRenderer.java b/primefaces/src/main/java/org/primefaces/component/accordionpanel/AccordionPanelRenderer.java
index 3aab5b7d85..487c5b6639 100644
--- a/primefaces/src/main/java/org/primefaces/component/accordionpanel/AccordionPanelRenderer.java
+++ b/primefaces/src/main/java/org/primefaces/component/accordionpanel/AccordionPanelRenderer.java
@@ -206,15 +206,22 @@ public class AccordionPanelRenderer extends CoreRenderer {
 
         ResponseWriter writer = context.getResponseWriter();
 
-        String headerClass = active ? AccordionPanel.ACTIVE_TAB_HEADER_CLASS : AccordionPanel.TAB_HEADER_CLASS;
-        headerClass = tab.isDisabled() ? headerClass + " ui-state-disabled" : headerClass;
-        headerClass = tab.getTitleStyleClass() == null ? headerClass : headerClass + " " + tab.getTitleStyleClass();
-        String iconClass = active
-                           ? AccordionPanel.ACTIVE_TAB_HEADER_ICON_CLASS
-                           : (rtl ? AccordionPanel.TAB_HEADER_ICON_RTL_CLASS : AccordionPanel.TAB_HEADER_ICON_CLASS);
-        String contentClass = active
-                              ? AccordionPanel.ACTIVE_TAB_CONTENT_CLASS
-                              : AccordionPanel.INACTIVE_TAB_CONTENT_CLASS;
+        String headerStyleClass = getStyleClassBuilder(context)
+            .add(active, AccordionPanel.ACTIVE_TAB_HEADER_CLASS, AccordionPanel.TAB_HEADER_CLASS)
+            .add(tab.isDisabled(), "ui-state-disabled")
+            .add(tab.getTitleStyleClass())
+            .build();
+
+        String iconStyleClass = getStyleClassBuilder(context)
+            .add(active, AccordionPanel.ACTIVE_TAB_HEADER_ICON_CLASS)
+            .add(!active && rtl, AccordionPanel.TAB_HEADER_ICON_RTL_CLASS)
+            .add(!active && !rtl, AccordionPanel.TAB_HEADER_ICON_CLASS)
+            .build();
+
+        String contentStyleClass = getStyleClassBuilder(context)
+            .add(active, AccordionPanel.ACTIVE_TAB_CONTENT_CLASS, AccordionPanel.INACTIVE_TAB_CONTENT_CLASS)
+            .build();
+
         UIComponent titleFacet = tab.getFacet("title");
         String title = tab.getTitle();
         String tabindex = tab.isDisabled() ? "-1" : accordionPanel.getTabindex();
@@ -222,7 +229,7 @@ public class AccordionPanelRenderer extends CoreRenderer {
         //header container
         writer.startElement("div", null);
         writer.writeAttribute("id", tab.getClientId(context) + "_header", null);
-        writer.writeAttribute("class", headerClass, null);
+        writer.writeAttribute("class", headerStyleClass, null);
         writer.writeAttribute("role", "tab", null);
         writer.writeAttribute(HTML.ARIA_EXPANDED, String.valueOf(active), null);
         writer.writeAttribute(HTML.ARIA_SELECTED, String.valueOf(active), null);
@@ -237,7 +244,7 @@ public class AccordionPanelRenderer extends CoreRenderer {
 
         //icon
         writer.startElement("span", null);
-        writer.writeAttribute("class", iconClass, null);
+        writer.writeAttribute("class", iconStyleClass, null);
         writer.endElement("span");
 
         if (ComponentUtils.shouldRenderFacet(titleFacet)) {
@@ -255,7 +262,7 @@ public class AccordionPanelRenderer extends CoreRenderer {
         //content
         writer.startElement("div", null);
         writer.writeAttribute("id", tab.getClientId(context), null);
-        writer.writeAttribute("class", contentClass, null);
+        writer.writeAttribute("class", contentStyleClass, null);
         writer.writeAttribute("role", "tabpanel", null);
         writer.writeAttribute(HTML.ARIA_HIDDEN, String.valueOf(!active), null);
 
diff --git a/primefaces/src/main/java/org/primefaces/component/api/UITable.java b/primefaces/src/main/java/org/primefaces/component/api/UITable.java
index 41f2ca94f8..01e6a72386 100644
--- a/primefaces/src/main/java/org/primefaces/component/api/UITable.java
+++ b/primefaces/src/main/java/org/primefaces/component/api/UITable.java
@@ -61,7 +61,7 @@ public interface UITable<T extends UITableState> extends ColumnAware, MultiViewS
 
 
     default Map<String, FilterMeta> initFilterBy(FacesContext context) {
-        Map<String, FilterMeta> filterBy = new HashMap<>();
+        Map<String, FilterMeta> filterBy = new LinkedHashMap<>();
         AtomicBoolean filtered = new AtomicBoolean();
 
         // build columns filterBy
@@ -274,7 +274,7 @@ public interface UITable<T extends UITableState> extends ColumnAware, MultiViewS
     void setGlobalFilterOnly(boolean globalFilterOnly);
 
     default Map<String, SortMeta> initSortBy(FacesContext context) {
-        Map<String, SortMeta> sortBy = new HashMap<>();
+        Map<String, SortMeta> sortBy = new LinkedHashMap<>();
         AtomicBoolean sorted = new AtomicBoolean();
 
         HeaderRow headerRow = getHeaderRow();
diff --git a/primefaces/src/main/java/org/primefaces/component/datatable/DataTable.java b/primefaces/src/main/java/org/primefaces/component/datatable/DataTable.java
index 4e7d1c0a8c..db816aa707 100644
--- a/primefaces/src/main/java/org/primefaces/component/datatable/DataTable.java
+++ b/primefaces/src/main/java/org/primefaces/component/datatable/DataTable.java
@@ -811,7 +811,7 @@ public class DataTable extends DataTableBase {
 
     @Override
     protected boolean visitRows(VisitContext context, VisitCallback callback, boolean visitRows) {
-        if (getFacesContext().isPostback()) {
+        if (getFacesContext().isPostback() && !ComponentUtils.isSkipIteration(context, context.getFacesContext())) {
             loadLazyDataIfRequired();
         }
         return super.visitRows(context, callback, visitRows);
diff --git a/primefaces/src/main/java/org/primefaces/component/datatable/DataTableRenderer.java b/primefaces/src/main/java/org/primefaces/component/datatable/DataTableRenderer.java
index e40b9fe4e1..e3b72858d6 100644
--- a/primefaces/src/main/java/org/primefaces/component/datatable/DataTableRenderer.java
+++ b/primefaces/src/main/java/org/primefaces/component/datatable/DataTableRenderer.java
@@ -268,7 +268,7 @@ public class DataTableRenderer extends DataRenderer {
         boolean scrollable = table.isScrollable();
         boolean hasPaginator = table.isPaginator();
         boolean resizable = table.isResizableColumns();
-        String style = table.getStyle();
+        String style = Objects.toString(table.getStyle(), Constants.EMPTY_STRING);
         String paginatorPosition = table.getPaginatorPosition();
         int frozenColumns = table.getFrozenColumns();
         boolean hasFrozenColumns = (frozenColumns != 0);
diff --git a/primefaces/src/main/java/org/primefaces/component/datatable/export/DataTableExcelExporter.java b/primefaces/src/main/java/org/primefaces/component/datatable/export/DataTableExcelExporter.java
index eb18a5ba15..d4c256ff11 100644
--- a/primefaces/src/main/java/org/primefaces/component/datatable/export/DataTableExcelExporter.java
+++ b/primefaces/src/main/java/org/primefaces/component/datatable/export/DataTableExcelExporter.java
@@ -533,10 +533,6 @@ public class DataTableExcelExporter extends DataTableExporter {
     }
 
     protected Cell applyColumnAlignments(UIColumn column, Cell cell) {
-        if (cell.getCellStyle() != null) {
-            // don't apply style if cell already has one
-            return cell;
-        }
         String[] styles = new String[] {column.getStyle(), column.getStyleClass()};
         if (LangUtils.containsIgnoreCase(styles, "right")) {
             cell.setCellStyle(cellStyleRightAlign);
diff --git a/primefaces/src/main/java/org/primefaces/component/filedownload/FileDownloadActionListener.java b/primefaces/src/main/java/org/primefaces/component/filedownload/FileDownloadActionListener.java
index 3081ffa063..a262b1adab 100644
--- a/primefaces/src/main/java/org/primefaces/component/filedownload/FileDownloadActionListener.java
+++ b/primefaces/src/main/java/org/primefaces/component/filedownload/FileDownloadActionListener.java
@@ -38,7 +38,6 @@ import javax.faces.event.AbortProcessingException;
 import javax.faces.event.ActionEvent;
 import javax.faces.event.ActionListener;
 
-import org.apache.commons.io.IOUtils;
 import org.primefaces.PrimeFaces;
 import org.primefaces.model.StreamedContent;
 import org.primefaces.util.*;
diff --git a/primefaces/src/main/java/org/primefaces/component/orderlist/OrderListRenderer.java b/primefaces/src/main/java/org/primefaces/component/orderlist/OrderListRenderer.java
index a8cabe752f..efcc9906a6 100644
--- a/primefaces/src/main/java/org/primefaces/component/orderlist/OrderListRenderer.java
+++ b/primefaces/src/main/java/org/primefaces/component/orderlist/OrderListRenderer.java
@@ -46,11 +46,9 @@ public class OrderListRenderer extends CoreRenderer {
     public void decode(FacesContext context, UIComponent component) {
         OrderList pickList = (OrderList) component;
         Map<String, String[]> params = context.getExternalContext().getRequestParameterValuesMap();
-        String values = pickList.getClientId(context) + "_values";
 
-        if (values != null) {
-            pickList.setSubmittedValue(params.get(values));
-        }
+        String[] values = params.get(pickList.getClientId(context) + "_values");
+        pickList.setSubmittedValue(values);
 
         decodeBehaviors(context, component);
     }
diff --git a/primefaces/src/main/java/org/primefaces/model/map/Marker.java b/primefaces/src/main/java/org/primefaces/model/map/Marker.java
index f2d8202848..b3d3caca53 100644
--- a/primefaces/src/main/java/org/primefaces/model/map/Marker.java
+++ b/primefaces/src/main/java/org/primefaces/model/map/Marker.java
@@ -43,6 +43,8 @@ public class Marker extends Overlay {
 
     private String title;
 
+    private MarkerLabel label;
+
     private boolean visible = true;
 
     private Animation animation;
@@ -156,4 +158,12 @@ public class Marker extends Overlay {
     public void setAnimation(Animation animation) {
         this.animation = animation;
     }
+
+    public MarkerLabel getLabel() {
+        return label;
+    }
+
+    public void setLabel(MarkerLabel label) {
+        this.label = label;
+    }
 }
diff --git a/primefaces/src/main/java/org/primefaces/model/map/MarkerLabel.java b/primefaces/src/main/java/org/primefaces/model/map/MarkerLabel.java
new file mode 100644
index 0000000000..b2952d6e13
--- /dev/null
+++ b/primefaces/src/main/java/org/primefaces/model/map/MarkerLabel.java
@@ -0,0 +1,143 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2009-2021 PrimeTek
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.primefaces.model.map;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * These options specify the appearance of a marker label. A marker label is a string (often a single character)
+ * which will appear inside the marker. If you are using it with a custom marker, you can reposition it with
+ * the labelOrigin property in the Icon class.
+ */
+public class MarkerLabel implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * The text to be displayed in the label.
+     */
+    private String text;
+
+    /**
+     * The className property of the label's element (equivalent to the element's class attribute).
+     * Multiple space-separated CSS classes can be added. Default is no CSS class (an empty string).
+     * The font color, size, weight, and family can only be set via the other properties of MarkerLabel.
+     * CSS classes should not be used to change the position nor orientation of the label
+     * (e.g. using translations and rotations) if also using marker collision management.
+     */
+    private String className;
+
+    /**
+     * The color of the label text. Default color is black.
+     */
+    private String color;
+
+    /**
+     * The font family of the label text (equivalent to the CSS font-family property).
+     */
+    private String fontFamily;
+
+    /**
+     * The font size of the label text (equivalent to the CSS font-size property). Default size is 14px.
+     */
+    private String fontSize;
+
+    /**
+     * The font weight of the label text (equivalent to the CSS font-weight property).
+     */
+    private String fontWeight;
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getColor() {
+        return color;
+    }
+
+    public void setColor(String color) {
+        this.color = color;
+    }
+
+    public String getFontFamily() {
+        return fontFamily;
+    }
+
+    public void setFontFamily(String fontFamily) {
+        this.fontFamily = fontFamily;
+    }
+
+    public String getFontSize() {
+        return fontSize;
+    }
+
+    public void setFontSize(String fontSize) {
+        this.fontSize = fontSize;
+    }
+
+    public String getFontWeight() {
+        return fontWeight;
+    }
+
+    public void setFontWeight(String fontWeight) {
+        this.fontWeight = fontWeight;
+    }
+
+    @Override
+    public String toString() {
+        return "MarkerLabel [text=" + text + ", className=" + className + ", color=" + color + ", fontFamily=" + fontFamily + ", fontSize=" + fontSize
+                    + ", fontWeight=" + fontWeight + "]";
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(className, color, fontFamily, fontSize, fontWeight, text);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof MarkerLabel)) {
+            return false;
+        }
+        MarkerLabel other = (MarkerLabel) obj;
+        return Objects.equals(className, other.className) && Objects.equals(color, other.color) && Objects.equals(fontFamily, other.fontFamily)
+                    && Objects.equals(fontSize, other.fontSize) && Objects.equals(fontWeight, other.fontWeight) && Objects.equals(text, other.text);
+    }
+}
diff --git a/primefaces/src/main/java/org/primefaces/util/FileUploadUtils.java b/primefaces/src/main/java/org/primefaces/util/FileUploadUtils.java
index 1d56f718a2..30993cc5a0 100644
--- a/primefaces/src/main/java/org/primefaces/util/FileUploadUtils.java
+++ b/primefaces/src/main/java/org/primefaces/util/FileUploadUtils.java
@@ -45,7 +45,6 @@ import javax.faces.validator.ValidatorException;
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.IOUtils;
 import org.primefaces.component.fileupload.FileUpload;
 import org.primefaces.component.fileupload.FileUploadChunkDecoder;
 import org.primefaces.component.fileupload.FileUploadDecoder;
diff --git a/primefaces/src/main/java/org/primefaces/util/IOUtils.java b/primefaces/src/main/java/org/primefaces/util/IOUtils.java
new file mode 100644
index 0000000000..66b6ee44c0
--- /dev/null
+++ b/primefaces/src/main/java/org/primefaces/util/IOUtils.java
@@ -0,0 +1,73 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2009-2021 PrimeTek
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.primefaces.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.nio.charset.Charset;
+
+public class IOUtils {
+
+    private IOUtils() {
+
+    }
+
+    public static String toString(InputStream is, Charset charset) throws IOException {
+        char[] buffer = new char[1024];
+
+        StringBuilder out = new StringBuilder();
+        Reader in = new InputStreamReader(is, charset);
+        int read = 0;
+        while ((read = in.read(buffer, 0, buffer.length)) != -1) {
+            out.append(buffer, 0, read);
+        }
+
+        return out.toString();
+    }
+
+    public static byte[] toByteArray(InputStream input) throws IOException {
+        byte[] buffer = new byte[1024];
+
+        ByteArrayOutputStream output = new ByteArrayOutputStream();
+        int read = 0;
+        while ((read = input.read(buffer)) != -1) {
+            output.write(buffer, 0, read);
+        }
+
+        return output.toByteArray();
+    }
+
+    public static void copyLarge(InputStream input, OutputStream output) throws IOException {
+        byte[] buffer = new byte[1024 * 4];
+
+        int read = 0;
+        while ((read = input.read(buffer)) != -1) {
+            output.write(buffer, 0, read);
+        }
+    }
+}
diff --git a/primefaces/src/main/java/org/primefaces/virusscan/impl/ClamDaemonClient.java b/primefaces/src/main/java/org/primefaces/virusscan/impl/ClamDaemonClient.java
index 8e8eef0499..623135abb4 100644
--- a/primefaces/src/main/java/org/primefaces/virusscan/impl/ClamDaemonClient.java
+++ b/primefaces/src/main/java/org/primefaces/virusscan/impl/ClamDaemonClient.java
@@ -34,8 +34,6 @@ import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 
-import org.apache.commons.io.IOUtils;
-
 /**
  * Simple client for ClamAV's clamd scanner.
  * Provides straightforward instream scanning.
@@ -87,13 +85,15 @@ public class ClamDaemonClient {
      * @throws IOException if there is an I/O problem communicating with CLAMD
      */
     public boolean ping() throws IOException {
-        try (Socket s = getSocket(); OutputStream outs = s.getOutputStream()) {
+        try (Socket s = getSocket(); OutputStream os = s.getOutputStream()) {
             s.setSoTimeout(timeout);
-            outs.write(asBytes("zPING\0"));
-            outs.flush();
-            final byte[] buffer = new byte[4];
-            IOUtils.read(s.getInputStream(), buffer);
-            return Arrays.equals(buffer, asBytes("PONG"));
+            os.write(asBytes("zPING\0"));
+            os.flush();
+            try (InputStream is = s.getInputStream()) {
+                byte[] buffer = new byte[4];
+                int read = is.read(buffer);
+                return Arrays.equals(buffer, asBytes("PONG"));
+            }
         }
     }
 
diff --git a/primefaces/src/main/java/org/primefaces/virusscan/impl/VirusTotalReportScanner.java b/primefaces/src/main/java/org/primefaces/virusscan/impl/VirusTotalReportScanner.java
index 2d90675983..0d3213e501 100644
--- a/primefaces/src/main/java/org/primefaces/virusscan/impl/VirusTotalReportScanner.java
+++ b/primefaces/src/main/java/org/primefaces/virusscan/impl/VirusTotalReportScanner.java
@@ -23,7 +23,6 @@
  */
 package org.primefaces.virusscan.impl;
 
-import org.apache.commons.io.IOUtils;
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.primefaces.model.file.UploadedFile;
@@ -32,6 +31,7 @@ import org.primefaces.util.LangUtils;
 import org.primefaces.util.MessageFactory;
 import org.primefaces.virusscan.VirusException;
 import org.primefaces.virusscan.VirusScanner;
+import org.primefaces.util.IOUtils;
 
 import javax.faces.FacesException;
 import javax.faces.context.ExternalContext;
diff --git a/primefaces/src/main/resources/META-INF/resources/primefaces/datatable/datatable.js b/primefaces/src/main/resources/META-INF/resources/primefaces/datatable/datatable.js
index 94b7beb30c..548115b8ae 100644
--- a/primefaces/src/main/resources/META-INF/resources/primefaces/datatable/datatable.js
+++ b/primefaces/src/main/resources/META-INF/resources/primefaces/datatable/datatable.js
@@ -802,7 +802,7 @@ PrimeFaces.widget.DataTable = PrimeFaces.widget.DeferredWidget.extend({
     setupSelection: function() {
         this.selectionHolder = this.jqId + '_selection';
         this.cfg.rowSelectMode = this.cfg.rowSelectMode||'new';
-        this.rowSelector = '> tr.ui-widget-content.ui-datatable-selectable';
+        this.rowSelector = 'tr.ui-widget-content.ui-datatable-selectable';
         this.cfg.disabledTextSelection = this.cfg.disabledTextSelection === false ? false : true;
         this.cfg.selectionPageOnly = this.cfg.selectionPageOnly !== false;
         this.rowSelectorForRowClick = this.cfg.rowSelector||'td:not(.ui-column-unselectable):not(.ui-grouped-column),span:not(.ui-c)';
@@ -851,7 +851,7 @@ PrimeFaces.widget.DataTable = PrimeFaces.widget.DeferredWidget.extend({
 
         this.bindRowHover(this.rowSelector);
 
-        this.tbody.off('click.dataTable mousedown.dataTable', this.rowSelector).on('mousedown.dataTable', this.rowSelector, null, function(e) {
+        this.jq.off('click.dataTable mousedown.dataTable', this.rowSelector).on('mousedown.dataTable', this.rowSelector, null, function(e) {
             $this.mousedownOnRow = true;
         })
         .on('click.dataTable', this.rowSelector, null, function(e) {
@@ -985,7 +985,7 @@ PrimeFaces.widget.DataTable = PrimeFaces.widget.DeferredWidget.extend({
      */
     bindRowHover: function(rowSelector) {
         var $this = this;
-        this.tbody.off('mouseenter.dataTable mouseleave.dataTable', rowSelector)
+        this.jq.off('mouseenter.dataTable mouseleave.dataTable', rowSelector)
             .on('mouseenter.dataTable', rowSelector, null, function() {
                 if (!$this.ignoreRowHoverEvent) {
                     $(this).addClass('ui-state-hover');
@@ -999,7 +999,7 @@ PrimeFaces.widget.DataTable = PrimeFaces.widget.DeferredWidget.extend({
 
         if (this.cfg.groupColumnIndexes) {
             var columnSelector = rowSelector + ' > td';
-            this.tbody.off('mouseenter.dataTable mouseleave.dataTable', columnSelector)
+            this.jq.off('mouseenter.dataTable mouseleave.dataTable', columnSelector)
                 .on('mouseenter.dataTable', columnSelector, null, function() {
                     var row = $(this).parent();
                     if ($(this).hasClass('ui-grouped-column')) {
@@ -1093,14 +1093,14 @@ PrimeFaces.widget.DataTable = PrimeFaces.widget.DeferredWidget.extend({
         checkboxSelector;
 
         if(this.cfg.nativeElements) {
-            checkboxSelector = '> tr.ui-widget-content.ui-datatable-selectable > td.ui-selection-column :checkbox';
+            checkboxSelector = 'tr.ui-widget-content.ui-datatable-selectable > td.ui-selection-column :checkbox';
             this.checkAllToggler = this.thead.find('> tr > th.ui-selection-column > :checkbox');
 
             this.checkAllToggler.on('click', function() {
                 $this.toggleCheckAll();
             });
 
-            this.tbody.off('click.dataTable', checkboxSelector).on('click.dataTable', checkboxSelector, null, function(e) {
+            this.jq.off('click.dataTable', checkboxSelector).on('click.dataTable', checkboxSelector, null, function(e) {
                 var checkbox = $(this);
 
                 if(checkbox.prop('checked'))
@@ -1110,7 +1110,7 @@ PrimeFaces.widget.DataTable = PrimeFaces.widget.DeferredWidget.extend({
             });
         }
         else {
-            checkboxSelector = '> tr.ui-widget-content.ui-datatable-selectable > td.ui-selection-column > div.ui-chkbox > div.ui-chkbox-box';
+            checkboxSelector = 'tr.ui-widget-content.ui-datatable-selectable > td.ui-selection-column > div.ui-chkbox > div.ui-chkbox-box';
             this.checkAllToggler = this.thead.find('> tr > th.ui-selection-column > div.ui-chkbox.ui-chkbox-all > div.ui-chkbox-box');
 
             this.checkAllToggler.on('mouseenter', function() {
@@ -1144,7 +1144,7 @@ PrimeFaces.widget.DataTable = PrimeFaces.widget.DeferredWidget.extend({
                 }
             });
 
-            this.tbody.off('mouseenter.dataTable mouseleave.dataTable click.dataTable', checkboxSelector)
+            this.jq.off('mouseenter.dataTable mouseleave.dataTable click.dataTable', checkboxSelector)
                         .on('mouseenter.dataTable', checkboxSelector, null, function() {
                             $(this).addClass('ui-state-hover');
                         })
@@ -2767,7 +2767,7 @@ PrimeFaces.widget.DataTable = PrimeFaces.widget.DeferredWidget.extend({
      * irrespective of whether they are on the currently shown page.
      */
     unselectAllRows: function() {
-        var selectedRows = this.tbody.children('tr.ui-state-highlight'),
+        var selectedRows = this.jq.find('tr.ui-state-highlight'),
         checkboxSelectionEnabled = this.isCheckboxSelectionEnabled(),
         radioSelectionEnabled = this.isRadioSelectionEnabled();
 
@@ -2840,7 +2840,7 @@ PrimeFaces.widget.DataTable = PrimeFaces.widget.DeferredWidget.extend({
     toggleCheckAll: function() {
         var shouldCheckAll = true;
         if(this.cfg.nativeElements) {
-            var checkboxes = this.tbody.find('> tr.ui-datatable-selectable > td.ui-selection-column > :checkbox:visible'),
+            var checkboxes = this.jq.find('tr.ui-datatable-selectable > td.ui-selection-column > :checkbox:visible'),
             checked = this.checkAllToggler.prop('checked'),
             $this = this;
 
@@ -2859,7 +2859,7 @@ PrimeFaces.widget.DataTable = PrimeFaces.widget.DeferredWidget.extend({
             });
         }
         else {
-            var checkboxes = this.tbody.find('> tr.ui-datatable-selectable > td.ui-selection-column > div.ui-chkbox > div.ui-chkbox-box:visible'),
+            var checkboxes = this.jq.find('tr.ui-datatable-selectable > td.ui-selection-column > div.ui-chkbox > div.ui-chkbox-box:visible'),
             checked = this.checkAllToggler.attr('aria-checked') === "true";
             $this = this;
 
diff --git a/primefaces/src/main/resources/META-INF/resources/primefaces/forms/forms.inputtextarea.js b/primefaces/src/main/resources/META-INF/resources/primefaces/forms/forms.inputtextarea.js
index c1db536b3b..ee7ea9ec77 100644
--- a/primefaces/src/main/resources/META-INF/resources/primefaces/forms/forms.inputtextarea.js
+++ b/primefaces/src/main/resources/META-INF/resources/primefaces/forms/forms.inputtextarea.js
@@ -116,7 +116,7 @@ PrimeFaces.widget.InputTextarea = PrimeFaces.widget.DeferredWidget.extend({
             length = value.length;
 
             if(length > _self.cfg.maxlength) {
-                _self.jq.val(value.substr(0, _self.cfg.maxlength));
+                _self.jq.val(value.slice(0, _self.cfg.maxlength));
             }
         });
     },
diff --git a/primefaces/src/main/resources/META-INF/resources/primefaces/inputnumber/1-inputnumber.js b/primefaces/src/main/resources/META-INF/resources/primefaces/inputnumber/1-inputnumber.js
index e80ffc5362..956568ee0d 100644
--- a/primefaces/src/main/resources/META-INF/resources/primefaces/inputnumber/1-inputnumber.js
+++ b/primefaces/src/main/resources/META-INF/resources/primefaces/inputnumber/1-inputnumber.js
@@ -156,6 +156,11 @@ PrimeFaces.widget.InputNumber = PrimeFaces.widget.BaseWidget.extend({
                     newValue = newValue.replaceAll($this.cfg.digitGroupSeparator, '');
                 }
                 element.set(newValue, null, true);
+
+                // GitHub #8610: reset the raw values so we don't fire change event if 1.0 == 1.00
+                if (Number(element.rawValue) === Number(element.rawValueOnFocus)) {
+                   element.rawValueOnFocus = element.rawValue;
+                }
             }
             $this.copyValueToHiddenInput();
         });
diff --git a/primefaces/src/main/resources/META-INF/resources/primefaces/tooltip/tooltip.js b/primefaces/src/main/resources/META-INF/resources/primefaces/tooltip/tooltip.js
index 61bd67473f..31ce907f76 100644
--- a/primefaces/src/main/resources/META-INF/resources/primefaces/tooltip/tooltip.js
+++ b/primefaces/src/main/resources/META-INF/resources/primefaces/tooltip/tooltip.js
@@ -403,11 +403,17 @@ PrimeFaces.widget.Tooltip = PrimeFaces.widget.BaseWidget.extend({
             }
         }
 
-        this.jq.css({ 'display': 'block', 'opacity': '0', 'pointer-events': 'none' });
+        // allow pointer events when autohide is disabled
+        var pointerEvents = '';
+        if (this.isAutoHide()) {
+            pointerEvents = 'none';
+        }
+
+        this.jq.css({ 'display': 'block', 'opacity': '0', 'pointer-events': pointerEvents });
 
         this.align();
 
-        this.jq.css({ 'display': 'none', 'opacity': '', 'pointer-events': '' });
+        this.jq.css({ 'display': 'none', 'opacity': '' });
 
         if (this.cfg.trackMouse) {
             this.followMouse();
diff --git a/primefaces/src/main/type-definitions/package-lock.json b/primefaces/src/main/type-definitions/package-lock.json
index bdc32b96ea..36b398c361 100644
--- a/primefaces/src/main/type-definitions/package-lock.json
+++ b/primefaces/src/main/type-definitions/package-lock.json
@@ -3008,9 +3008,9 @@
       }
     },
     "node_modules/minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
       "dev": true
     },
     "node_modules/minipass": {
@@ -4398,12 +4398,6 @@
         "node": ">=0.3.1"
       }
     },
-    "node_modules/tslint/node_modules/minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
-    },
     "node_modules/tslint/node_modules/mkdirp": {
       "version": "0.5.4",
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz",
@@ -7039,9 +7033,9 @@
       }
     },
     "minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
       "dev": true
     },
     "minipass": {
@@ -8113,12 +8107,6 @@
           "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
           "dev": true
         },
-        "minimist": {
-          "version": "1.2.5",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-          "dev": true
-        },
         "mkdirp": {
           "version": "0.5.4",
           "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz",
diff --git a/primefaces/src/main/type-definitions/src/create-code-info-object.js b/primefaces/src/main/type-definitions/src/create-code-info-object.js
index fb32adfbc9..0cb40e12fb 100644
--- a/primefaces/src/main/type-definitions/src/create-code-info-object.js
+++ b/primefaces/src/main/type-definitions/src/create-code-info-object.js
@@ -88,7 +88,7 @@ function createMethodCodeInfoFromTags(severitySettings, method, additionalTempla
                         name: tag.name,
                         required: !tag.optional,
                         rest: rest,
-                        typedef: rest ? type.substr(3) : type,
+                        typedef: rest ? type.slice(3) : type,
                     };
                 }
             }
diff --git a/primefaces/src/main/type-definitions/src/lang.js b/primefaces/src/main/type-definitions/src/lang.js
index 21d3e5f276..b2266d27d8 100644
--- a/primefaces/src/main/type-definitions/src/lang.js
+++ b/primefaces/src/main/type-definitions/src/lang.js
@@ -239,7 +239,7 @@ function newEmptyArray() {
  * @return {string} The given string, with the first character turned to upper case.
  */
 function capitalize(str) {
-    return str ? str.charAt(0).toUpperCase() + str.substr(1) : "";
+    return str ? str.charAt(0).toUpperCase() + str.slice(1) : "";
 }
 
 /**
@@ -248,10 +248,10 @@ function capitalize(str) {
  */
 function removeLineBreaksFromStartAndEnd(str) {
     while (str.startsWith("\n") || str.startsWith("\r")) {
-        str = str.substr(1);
+        str = str.slice(1);
     }
     while (str.endsWith("\n") || str.endsWith("\r")) {
-        str = str.substr(0, str.length - 1);
+        str = str.slice(0, -1);
     }
     return str;
 }
diff --git a/primefaces/src/main/type-definitions/src/ts-commenthandler.js b/primefaces/src/main/type-definitions/src/ts-commenthandler.js
index 2b4232fb65..cb8191fd15 100644
--- a/primefaces/src/main/type-definitions/src/ts-commenthandler.js
+++ b/primefaces/src/main/type-definitions/src/ts-commenthandler.js
@@ -115,8 +115,8 @@ function makeCommentHandler(docsByNode) {
  */
 function extractComment(fullText, commentRange, severitySettings) {
     const commentLength = commentRange.end - commentRange.pos;
-    const isTripleSlashComment = commentLength >= 3 && ts.SyntaxKind.SingleLineCommentTrivia === commentRange.kind && fullText.substr(commentRange.pos, 3) === "///";
-    const isDocComment = commentLength >= 3 && ts.SyntaxKind.MultiLineCommentTrivia === commentRange.kind && fullText.substr(commentRange.pos, 3) === "/**";
+    const isTripleSlashComment = commentLength >= 3 && ts.SyntaxKind.SingleLineCommentTrivia === commentRange.kind && fullText.slice(commentRange.pos, commentRange.pos + 3) === "///";
+    const isDocComment = commentLength >= 3 && ts.SyntaxKind.MultiLineCommentTrivia === commentRange.kind && fullText.slice(commentRange.pos, commentRange.pos + 3) === "/**";
     if (isTripleSlashComment) {
         return undefined;
     }
diff --git a/primefaces/src/main/type-definitions/src/ts-postprocess.js b/primefaces/src/main/type-definitions/src/ts-postprocess.js
index 5b505f1354..27d9c3c930 100644
--- a/primefaces/src/main/type-definitions/src/ts-postprocess.js
+++ b/primefaces/src/main/type-definitions/src/ts-postprocess.js
@@ -116,8 +116,8 @@ function fixupInlineBlockComments(sourceCode) {
         if (indexSlashStarStar >= 0 && i < lines.length - 1) {
             const nextLine = lines[i + 1] ?? "";
             const indexStar = nextLine.indexOf("*");
-            const lineBeforeComment = trimmed.substr(0, indexSlashStarStar).trimRight();
-            if (indexStar >= 0 && lineBeforeComment.length > 0 && nextLine.substr(0, indexStar).trim().length === 0) {
+            const lineBeforeComment = trimmed.slice(0, indexSlashStarStar).trimRight();
+            if (indexStar >= 0 && lineBeforeComment.length > 0 && nextLine.slice(0, indexStar).trim().length === 0) {
                 const commentBeginLine = " ".repeat(indexStar - 1) + "/**";
                 result.push(lineBeforeComment);
                 result.push(commentBeginLine);
diff --git a/primefaces/src/main/type-definitions/src/ts-types.js b/primefaces/src/main/type-definitions/src/ts-types.js
index a68d88a09a..00b8375d74 100644
--- a/primefaces/src/main/type-definitions/src/ts-types.js
+++ b/primefaces/src/main/type-definitions/src/ts-types.js
@@ -113,7 +113,7 @@ function getReturnType({ async, generator, baseTypeNext, baseTypeReturn, baseTyp
  * @return {string} The type, without the rest "..." indicator if present.
  */
 function removeRestFromType(type) {
-    return hasRestSpecifier(type) ? type.substr(3) : type;
+    return hasRestSpecifier(type) ? type.slice(3) : type;
 }
 
 /**


Test patch:
diff --git a/primefaces-integration-tests/pom.xml b/primefaces-integration-tests/pom.xml
index 5853e93173..b4706c8979 100644
--- a/primefaces-integration-tests/pom.xml
+++ b/primefaces-integration-tests/pom.xml
@@ -33,10 +33,10 @@
         <lombok.version>1.18.22</lombok.version>
         <myfaces.version>2.3.9</myfaces.version>
         <myfaces-next.version>2.3-next-M6</myfaces-next.version>
-        <tomcat.version>9.0.60</tomcat.version>
+        <tomcat.version>9.0.62</tomcat.version>
         <resteasy.version>5.0.2.Final</resteasy.version>
         <owb.version>2.0.26</owb.version>
-        <jetty.version>9.4.45.v20220203</jetty.version>
+        <jetty.version>9.4.46.v20220331</jetty.version>
     </properties>
 
     <dependencies>
diff --git a/primefaces-integration-tests/src/main/java/org/primefaces/integrationtests/datatable/DataTable035.java b/primefaces-integration-tests/src/main/java/org/primefaces/integrationtests/datatable/DataTable035.java
new file mode 100644
index 0000000000..16ada0b32a
--- /dev/null
+++ b/primefaces-integration-tests/src/main/java/org/primefaces/integrationtests/datatable/DataTable035.java
@@ -0,0 +1,74 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2009-2021 PrimeTek
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.primefaces.integrationtests.datatable;
+
+import lombok.Data;
+
+import javax.annotation.PostConstruct;
+import javax.inject.Named;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import javax.enterprise.context.RequestScoped;
+import lombok.Getter;
+import lombok.Setter;
+
+@Named
+@RequestScoped
+@Data
+public class DataTable035 implements Serializable {
+
+    private List<Car> cars;
+    private Car selectedCar;
+
+    @PostConstruct
+    public void init() {
+        cars = new ArrayList<>();
+        cars.add(new Car(1, "Entry_1"));
+        cars.add(new Car(2, "Entry_2"));
+        cars.add(new Car(3, "Entry_3"));
+        cars.add(new Car(4, "Entry_4"));
+        cars.add(new Car(5, "Entry_5"));
+        cars.add(new Car(6, "Entry_6"));
+        cars.add(new Car(7, "Entry_7"));
+        cars.add(new Car(8, "Entry_8"));
+        cars.add(new Car(9, "Entry_9"));
+    }
+
+    @Getter
+    @Setter
+    public static class Car implements Serializable {
+
+        private Integer number;
+        private String name;
+
+        public Car() {
+        }
+
+        public Car(Integer number , String name ) {
+            this.number = number;
+            this.name = name;
+        }
+    }
+}
\ No newline at end of file
diff --git a/primefaces-integration-tests/src/main/java/org/primefaces/integrationtests/menubar/MenuBar001.java b/primefaces-integration-tests/src/main/java/org/primefaces/integrationtests/menubar/MenuBar001.java
new file mode 100644
index 0000000000..7466bfc5b4
--- /dev/null
+++ b/primefaces-integration-tests/src/main/java/org/primefaces/integrationtests/menubar/MenuBar001.java
@@ -0,0 +1,50 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2009-2021 PrimeTek
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.primefaces.integrationtests.menubar;
+
+import lombok.Data;
+import org.primefaces.integrationtests.general.utilities.TestUtils;
+
+import javax.annotation.PostConstruct;
+import javax.faces.view.ViewScoped;
+import javax.inject.Named;
+import java.io.Serializable;
+
+@Named
+@ViewScoped
+@Data
+public class MenuBar001 implements Serializable {
+
+    private static final long serialVersionUID = 5366641524856531279L;
+
+    @PostConstruct
+    public void init() {
+
+    }
+
+    public void someAction(String msg) {
+        TestUtils.addMessage(msg);
+    }
+
+}
diff --git a/primefaces-integration-tests/src/main/webapp/datatable/dataTable035.xhtml b/primefaces-integration-tests/src/main/webapp/datatable/dataTable035.xhtml
new file mode 100644
index 0000000000..cbad8fe4db
--- /dev/null
+++ b/primefaces-integration-tests/src/main/webapp/datatable/dataTable035.xhtml
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+      xmlns:f="http://xmlns.jcp.org/jsf/core"
+      xmlns:p="http://primefaces.org/ui"
+      xmlns:h="http://xmlns.jcp.org/jsf/html">
+
+    <h:head>
+    </h:head>
+    <h:body>
+        <h:form id="form">
+
+            <p:dataTable id="datatable" value="#{dataTable035.cars}" var="car"
+                         multiViewState="true" rows="4" paginator="true"
+                         rowKey="#{car.number}" selection="#{dataTable035.selectedCar}"
+                         selectionMode="single" lazy="false">
+
+                <p:ajax event="rowSelect" process="@this" />
+                
+                <p:column headerText="Number">
+                    <h:outputText id="number" value="#{car.number}" />
+                    <p:commandButton id="select" value="Select" process="@this" update="@form">
+                        <f:setPropertyActionListener value="#{car}" target="#{dataTable035.selectedCar}" />
+                    </p:commandButton>
+                </p:column>
+
+                <p:column headerText="Car Name">
+                    <h:outputText id="name" value="#{car.name}" />
+                    
+                </p:column>
+
+            </p:dataTable>
+
+        </h:form>
+    </h:body>
+</html>
\ No newline at end of file
diff --git a/primefaces-integration-tests/src/main/webapp/menubar/menuBar001.xhtml b/primefaces-integration-tests/src/main/webapp/menubar/menuBar001.xhtml
new file mode 100644
index 0000000000..ca7beb4d5b
--- /dev/null
+++ b/primefaces-integration-tests/src/main/webapp/menubar/menuBar001.xhtml
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:h="http://xmlns.jcp.org/jsf/html"
+      xmlns:f="http://xmlns.jcp.org/jsf/core"
+      xmlns:p="http://primefaces.org/ui">
+
+<f:view contentType="text/html;charset=UTF-8" encoding="UTF-8">
+    <h:head>
+
+    </h:head>
+
+    <h:body>
+        <h:form id="form">
+            <p:messages id="msgs" showDetail="true" skipDetailIfEqualsSummary="true">
+                <p:autoUpdate />
+            </p:messages>
+
+            <p:menubar id="menubar" toggleEvent="click">
+                <p:submenu label="Main A" id="mainA">
+                    <p:submenu label="Sub A-1" id="subA1">
+                        <p:menuitem value="Detail A-1-I" id="detailA1I" action="#{menuBar001.someAction('Detail A-1-I')}"/>
+                        <p:menuitem value="Detail A-1-II" id="detailA1II" action="#{menuBar001.someAction('Detail A-1-II')}"/>
+                    </p:submenu>
+                    <p:menuitem value="Sub A-2" id="subA2" action="#{menuBar001.someAction('Sub A-2')}"/>
+                    <p:divider />
+                    <p:menuitem value="Sub A-3" id="subA3" action="#{menuBar001.someAction('Sub A-3')}"/>
+                </p:submenu>
+
+                <p:submenu label="Main B" id="mainB">
+                    <p:menuitem value="Sub B-1" id="subB1" action="#{menuBar001.someAction('Sub B-1')}"/>
+                    <p:menuitem value="Sub B-2" id="subB2" action="#{menuBar001.someAction('Sub B-2')}"/>
+                    <p:menuitem value="Sub B-3" id="subB3" action="#{menuBar001.someAction('Sub B-3')}"/>
+                    <p:menuitem value="Sub B-4" id="subB4" action="#{menuBar001.someAction('Sub B-4')}"/>
+                </p:submenu>
+
+                <p:divider layout="vertical"/>
+
+                <p:menuitem value="Main C" id="mainC" action="#{menuBar001.someAction('Main C')}"/>
+            </p:menubar>
+        </h:form>
+
+    </h:body>
+</f:view>
+
+</html>
\ No newline at end of file
diff --git a/primefaces-integration-tests/src/main/webapp/menubar/menuBar001b.xhtml b/primefaces-integration-tests/src/main/webapp/menubar/menuBar001b.xhtml
new file mode 100644
index 0000000000..4250b4ce10
--- /dev/null
+++ b/primefaces-integration-tests/src/main/webapp/menubar/menuBar001b.xhtml
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:h="http://xmlns.jcp.org/jsf/html"
+      xmlns:f="http://xmlns.jcp.org/jsf/core"
+      xmlns:p="http://primefaces.org/ui">
+
+<f:view contentType="text/html;charset=UTF-8" encoding="UTF-8">
+    <h:head>
+
+    </h:head>
+
+    <h:body>
+        <h:form id="form">
+            <p:messages id="msgs" showDetail="true" skipDetailIfEqualsSummary="true">
+                <p:autoUpdate />
+            </p:messages>
+
+            <p:menubar id="menubar">
+                <p:submenu label="Main A" id="mainA">
+                    <p:submenu label="Sub A-1" id="subA1">
+                        <p:menuitem value="Detail A-1-I" id="detailA1I" action="#{menuBar001.someAction('Detail A-1-I')}"/>
+                        <p:menuitem value="Detail A-1-II" id="detailA1II" action="#{menuBar001.someAction('Detail A-1-II')}"/>
+                    </p:submenu>
+                    <p:menuitem value="Sub A-2" id="subA2" action="#{menuBar001.someAction('Sub A-2')}"/>
+                    <p:divider />
+                    <p:menuitem value="Sub A-3" id="subA3" action="#{menuBar001.someAction('Sub A-3')}"/>
+                </p:submenu>
+
+                <p:submenu label="Main B" id="mainB">
+                    <p:menuitem value="Sub B-1" id="subB1" action="#{menuBar001.someAction('Sub B-1')}"/>
+                    <p:menuitem value="Sub B-2" id="subB2" action="#{menuBar001.someAction('Sub B-2')}"/>
+                    <p:menuitem value="Sub B-3" id="subB3" action="#{menuBar001.someAction('Sub B-3')}"/>
+                    <p:menuitem value="Sub B-4" id="subB4" action="#{menuBar001.someAction('Sub B-4')}"/>
+                </p:submenu>
+
+                <p:divider layout="vertical"/>
+
+                <p:menuitem value="Main C" id="mainC" action="#{menuBar001.someAction('Main C')}"/>
+            </p:menubar>
+        </h:form>
+
+    </h:body>
+</f:view>
+
+</html>
\ No newline at end of file
diff --git a/primefaces-integration-tests/src/test/java/org/primefaces/integrationtests/datatable/DataTable035Test.java b/primefaces-integration-tests/src/test/java/org/primefaces/integrationtests/datatable/DataTable035Test.java
new file mode 100644
index 0000000000..02ec0a7ea6
--- /dev/null
+++ b/primefaces-integration-tests/src/test/java/org/primefaces/integrationtests/datatable/DataTable035Test.java
@@ -0,0 +1,70 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2009-2021 PrimeTek
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.primefaces.integrationtests.datatable;
+
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+import org.primefaces.selenium.AbstractPrimePage;
+import org.primefaces.selenium.PrimeSelenium;
+import org.primefaces.selenium.component.DataTable;
+
+public class DataTable035Test extends AbstractDataTableTest {
+
+    @Test
+    @DisplayName("DataTable: Manually assign selection doesnt show")
+    @Disabled
+    public void test(Page page) throws InterruptedException {
+
+        // trigger selection on row1
+        WebElement nameRow1 = getWebDriver().findElement(By.id("form:datatable:1:name"));
+        PrimeSelenium.guardAjax(nameRow1).click();
+
+        // assert selection
+        WebElement row1 = page.dataTable.findElement(By.cssSelector("tr[data-ri='1']"));
+        assertCss(row1, "ui-state-highlight");
+
+        // trigger selection on row2 via button
+        WebElement buttonRow2 = getWebDriver().findElement(By.id("form:datatable:2:select"));
+        PrimeSelenium.guardAjax(buttonRow2).click();
+
+        // assert selection
+        WebElement row2 = page.dataTable.findElement(By.cssSelector("tr[data-ri='2']"));
+        assertCss(row2, "ui-state-highlight");
+    }
+
+    public static class Page extends AbstractPrimePage {
+
+        @FindBy(id = "form:datatable")
+        DataTable dataTable;
+
+        @Override
+        public String getLocation() {
+            return "datatable/dataTable035.xhtml";
+        }
+    }
+}
diff --git a/primefaces-integration-tests/src/test/java/org/primefaces/integrationtests/menubar/MenuBar001Test.java b/primefaces-integration-tests/src/test/java/org/primefaces/integrationtests/menubar/MenuBar001Test.java
new file mode 100644
index 0000000000..53e00eee1e
--- /dev/null
+++ b/primefaces-integration-tests/src/test/java/org/primefaces/integrationtests/menubar/MenuBar001Test.java
@@ -0,0 +1,110 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2009-2021 PrimeTek
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.primefaces.integrationtests.menubar;
+
+import org.json.JSONObject;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+import org.primefaces.selenium.AbstractPrimePage;
+import org.primefaces.selenium.AbstractPrimePageTest;
+import org.primefaces.selenium.PrimeSelenium;
+import org.primefaces.selenium.component.Menubar;
+import org.primefaces.selenium.component.Messages;
+
+public class MenuBar001Test extends AbstractPrimePageTest {
+
+    @Test
+    @Order(1)
+    @DisplayName("MenuBar: basic (click)")
+    public void testBasic(Page page) {
+        // Arrange
+        Menubar menubar = page.menubar;
+
+        // Act
+        WebElement eltMenuMainC = menubar.findElement(By.id("form:mainC"));
+        PrimeSelenium.guardAjax(eltMenuMainC).click();
+
+        // Assert
+        Assertions.assertTrue(page.messages.getMessage(0).getSummary().contains("Main C"));
+
+        // Act
+        WebElement eltMenuMainA = menubar.findElement(By.id("form:mainA"));
+        eltMenuMainA.click();
+        WebElement eltMenuSubA2 = eltMenuMainA.findElement(By.id("form:subA2"));
+        PrimeSelenium.guardAjax(eltMenuSubA2).click();
+
+        // Assert
+        Assertions.assertTrue(page.messages.getMessage(0).getSummary().contains("Sub A-2"));
+
+        assertConfiguration(menubar.getWidgetConfiguration());
+    }
+
+    @Test
+    @Order(2)
+    @DisplayName("MenuBar: basic (click, selection via value)")
+    public void testBasicByValue(Page page) {
+        // Arrange
+        Menubar menubar = page.menubar;
+
+        // Act
+        menubar.selectMenuitemByValue("Main C");
+
+        // Assert
+        Assertions.assertTrue(page.messages.getMessage(0).getSummary().contains("Main C"));
+
+        // Act
+        WebElement eltMenuMainA = menubar.selectMenuitemByValue("Main A");
+        menubar.selectMenuitemByValue(eltMenuMainA, "Sub A-2");
+
+        // Assert
+        Assertions.assertTrue(page.messages.getMessage(0).getSummary().contains("Sub A-2"));
+
+        assertConfiguration(menubar.getWidgetConfiguration());
+    }
+
+    private void assertConfiguration(JSONObject cfg) {
+        assertNoJavascriptErrors();
+        System.out.println("MenuBar Config = " + cfg);
+        Assertions.assertTrue(cfg.has("toggleEvent")); // click or hover
+        Assertions.assertEquals("click", cfg.getString("toggleEvent"));
+    }
+
+    public static class Page extends AbstractPrimePage {
+        @FindBy(id = "form:msgs")
+        Messages messages;
+
+        @FindBy(id = "form:menubar")
+        Menubar menubar;
+
+        @Override
+        public String getLocation() {
+            return "menubar/menuBar001.xhtml";
+        }
+    }
+}
diff --git a/primefaces-integration-tests/src/test/java/org/primefaces/integrationtests/menubar/MenuBar001bTest.java b/primefaces-integration-tests/src/test/java/org/primefaces/integrationtests/menubar/MenuBar001bTest.java
new file mode 100644
index 0000000000..f3f3ab8be9
--- /dev/null
+++ b/primefaces-integration-tests/src/test/java/org/primefaces/integrationtests/menubar/MenuBar001bTest.java
@@ -0,0 +1,132 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2009-2021 PrimeTek
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.primefaces.integrationtests.menubar;
+
+import org.json.JSONObject;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+import org.openqa.selenium.support.FindBy;
+import org.primefaces.selenium.AbstractPrimePage;
+import org.primefaces.selenium.AbstractPrimePageTest;
+import org.primefaces.selenium.PrimeSelenium;
+import org.primefaces.selenium.component.Menubar;
+import org.primefaces.selenium.component.Messages;
+
+public class MenuBar001bTest extends AbstractPrimePageTest {
+
+    @Test
+    @Order(1)
+    @DisplayName("MenuBar: basic (hover)")
+    public void testBasic(Page page) {
+        // Arrange
+        Menubar menubar = page.menubar;
+
+        // Act
+        WebElement eltMenuMainC = menubar.findElement(By.id("form:mainC"));
+        PrimeSelenium.guardAjax(eltMenuMainC).click();
+
+        // Assert
+        Assertions.assertTrue(page.messages.getMessage(0).getSummary().contains("Main C"));
+
+        // Act
+        Actions actions = new Actions(page.getWebDriver());
+        WebElement eltMenuMainA = menubar.findElement(By.id("form:mainA"));
+        WebElement eltMenuSubA2 = eltMenuMainA.findElement(By.id("form:subA2"));
+        actions.moveToElement(eltMenuMainA).build().perform();
+        PrimeSelenium.guardAjax(eltMenuSubA2).click();
+
+        // Assert
+        Assertions.assertTrue(page.messages.getMessage(0).getSummary().contains("Sub A-2"));
+
+        // Act
+        actions = new Actions(page.getWebDriver());
+        WebElement eltMenuSubA1 = eltMenuMainA.findElement(By.id("form:subA1"));
+        WebElement eltMenuDetailA1II = eltMenuMainA.findElement(By.id("form:detailA1II"));
+        actions.moveToElement(menubar.getWrappedElement()).build().perform();
+        actions.moveToElement(eltMenuMainA).build().perform();
+        actions.moveToElement(eltMenuSubA1).build().perform();
+        PrimeSelenium.guardAjax(eltMenuDetailA1II).click();
+
+        // Assert
+        Assertions.assertTrue(page.messages.getMessage(0).getSummary().contains("Detail A-1-II"));
+
+        assertConfiguration(menubar.getWidgetConfiguration());
+    }
+
+    @Test
+    @Order(2)
+    @DisplayName("MenuBar: basic (hover, selection via value)")
+    public void testBasicByValue(Page page) {
+        // Arrange
+        Menubar menubar = page.menubar;
+
+        // Act
+        menubar.selectMenuitemByValue("Main C");
+
+        // Assert
+        Assertions.assertTrue(page.messages.getMessage(0).getSummary().contains("Main C"));
+
+        // Act
+        WebElement eltMenuMainA = menubar.selectMenuitemByValue("Main A");
+        menubar.selectMenuitemByValue(eltMenuMainA, "Sub A-2");
+
+        // Assert
+        Assertions.assertTrue(page.messages.getMessage(0).getSummary().contains("Sub A-2"));
+
+        // Act
+        eltMenuMainA = menubar.selectMenuitemByValue("Main A");
+        WebElement eltMenuSubA1 = menubar.selectMenuitemByValue(eltMenuMainA, "Sub A-1");
+        menubar.selectMenuitemByValue(eltMenuSubA1, "Detail A-1-II");
+
+        // Assert
+        Assertions.assertTrue(page.messages.getMessage(0).getSummary().contains("Detail A-1-II"));
+
+        assertConfiguration(menubar.getWidgetConfiguration());
+    }
+
+    private void assertConfiguration(JSONObject cfg) {
+        assertNoJavascriptErrors();
+        System.out.println("MenuBar Config = " + cfg);
+        Assertions.assertTrue(cfg.has("toggleEvent"));
+        Assertions.assertEquals("hover", cfg.getString("toggleEvent"));
+    }
+
+    public static class Page extends AbstractPrimePage {
+        @FindBy(id = "form:msgs")
+        Messages messages;
+
+        @FindBy(id = "form:menubar")
+        Menubar menubar;
+
+        @Override
+        public String getLocation() {
+            return "menubar/menuBar001b.xhtml";
+        }
+    }
+}
diff --git a/primefaces-integration-tests/src/test/java/org/primefaces/integrationtests/schedule/Schedule001Test.java b/primefaces-integration-tests/src/test/java/org/primefaces/integrationtests/schedule/Schedule001Test.java
index 6b53b07907..9e81696ad8 100644
--- a/primefaces-integration-tests/src/test/java/org/primefaces/integrationtests/schedule/Schedule001Test.java
+++ b/primefaces-integration-tests/src/test/java/org/primefaces/integrationtests/schedule/Schedule001Test.java
@@ -23,6 +23,9 @@
  */
 package org.primefaces.integrationtests.schedule;
 
+import java.time.*;
+import java.util.List;
+
 import org.json.JSONObject;
 import org.junit.jupiter.api.*;
 import org.openqa.selenium.By;
@@ -36,9 +39,6 @@ import org.primefaces.selenium.PrimeSelenium;
 import org.primefaces.selenium.component.*;
 import org.primefaces.selenium.component.model.Msg;
 
-import java.time.*;
-import java.util.List;
-
 public class Schedule001Test extends AbstractPrimePageTest {
 
     public static final String ALTERNATIV_SERVER_TIMEZONE = "Europe/Vienna";
@@ -106,8 +106,10 @@ public class Schedule001Test extends AbstractPrimePageTest {
         int hour = 10 - calcOffsetInHoursBetweenClientAndServerAndTimezone(startOfWeek.atStartOfDay(ZoneId.of(ALTERNATIV_SERVER_TIMEZONE)));
         // Message is created by server, so we see date selected transfered into server-timezone, what may be confusing from a user perspective
 
-        expectedMessage = "T" + String.format("%02d", hour) + ":00";
-        Assertions.assertTrue(msg.getDetail().endsWith(expectedMessage));
+        String hourDST = String.format("T%02d:00", hour);
+        String hourST = String.format("T%02d:00", hour + 1);
+        boolean hourOK = msg.getDetail().endsWith(hourDST) || msg.getDetail().endsWith(hourST);
+        Assertions.assertTrue(hourOK, String.format("Expected: %s or %s , Actual: %s", hourDST, hourST, msg.getDetail()));
     }
 
     private void selectSlot(Page page, String time) {
diff --git a/primefaces/src/test/java/org/primefaces/util/FileUploadUtilsTest.java b/primefaces/src/test/java/org/primefaces/util/FileUploadUtilsTest.java
index 39827d5d37..7de69c758d 100644
--- a/primefaces/src/test/java/org/primefaces/util/FileUploadUtilsTest.java
+++ b/primefaces/src/test/java/org/primefaces/util/FileUploadUtilsTest.java
@@ -37,7 +37,6 @@ import javax.faces.application.Application;
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 
-import org.apache.commons.io.IOUtils;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;