Merge pull request #689 from apache/WW-5310-equal-sign

[WW-5310] Properly parses param value with equal sign
diff --git a/apps/rest-showcase/src/main/resources/struts.xml b/apps/rest-showcase/src/main/resources/struts.xml
index b451518..5a49e0e 100644
--- a/apps/rest-showcase/src/main/resources/struts.xml
+++ b/apps/rest-showcase/src/main/resources/struts.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 
 
 <struts>
diff --git a/apps/showcase/src/main/resources/struts-actionchaining.xml b/apps/showcase/src/main/resources/struts-actionchaining.xml
index 2b187dd..4f39940 100644
--- a/apps/showcase/src/main/resources/struts-actionchaining.xml
+++ b/apps/showcase/src/main/resources/struts-actionchaining.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 	<package name="actionchaining" extends="struts-default" namespace="/actionchaining">
diff --git a/apps/showcase/src/main/resources/struts-async.xml b/apps/showcase/src/main/resources/struts-async.xml
index 0921e68..178a14d 100644
--- a/apps/showcase/src/main/resources/struts-async.xml
+++ b/apps/showcase/src/main/resources/struts-async.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <package name="async" extends="json-default" namespace="/async">
diff --git a/apps/showcase/src/main/resources/struts-conversion.xml b/apps/showcase/src/main/resources/struts-conversion.xml
index 4c4c165..873c070 100644
--- a/apps/showcase/src/main/resources/struts-conversion.xml
+++ b/apps/showcase/src/main/resources/struts-conversion.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 	<package name="conversion" namespace="/conversion" extends="struts-default">
diff --git a/apps/showcase/src/main/resources/struts-dispatcher.xml b/apps/showcase/src/main/resources/struts-dispatcher.xml
index 7051b1f..9d9ea24 100644
--- a/apps/showcase/src/main/resources/struts-dispatcher.xml
+++ b/apps/showcase/src/main/resources/struts-dispatcher.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <package name="dispatcher" extends="struts-default" namespace="/dispatcher">
diff --git a/apps/showcase/src/main/resources/struts-filedownload.xml b/apps/showcase/src/main/resources/struts-filedownload.xml
index 335777b..5a8b5ae 100644
--- a/apps/showcase/src/main/resources/struts-filedownload.xml
+++ b/apps/showcase/src/main/resources/struts-filedownload.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 	<package name="filedownload" extends="struts-default" namespace="/filedownload">
diff --git a/apps/showcase/src/main/resources/struts-fileupload.xml b/apps/showcase/src/main/resources/struts-fileupload.xml
index 4efcad8..5b500b7 100644
--- a/apps/showcase/src/main/resources/struts-fileupload.xml
+++ b/apps/showcase/src/main/resources/struts-fileupload.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 	<package name="fileupload" extends="struts-default" namespace="/fileupload">
diff --git a/apps/showcase/src/main/resources/struts-freemarker.xml b/apps/showcase/src/main/resources/struts-freemarker.xml
index c0de0a9..e4dd3f1 100644
--- a/apps/showcase/src/main/resources/struts-freemarker.xml
+++ b/apps/showcase/src/main/resources/struts-freemarker.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <package name="freemarker" namespace="/freemarker" extends="struts-default">
diff --git a/apps/showcase/src/main/resources/struts-hangman.xml b/apps/showcase/src/main/resources/struts-hangman.xml
index d81f4b3..510b4e7 100644
--- a/apps/showcase/src/main/resources/struts-hangman.xml
+++ b/apps/showcase/src/main/resources/struts-hangman.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 	<package name="hangman" extends="struts-default" namespace="/hangman">
diff --git a/apps/showcase/src/main/resources/struts-interactive.xml b/apps/showcase/src/main/resources/struts-interactive.xml
index cda563d..c057a39 100644
--- a/apps/showcase/src/main/resources/struts-interactive.xml
+++ b/apps/showcase/src/main/resources/struts-interactive.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <package name="interactive" namespace="/interactive" extends="struts-default">
diff --git a/apps/showcase/src/main/resources/struts-model-driven.xml b/apps/showcase/src/main/resources/struts-model-driven.xml
index da01d92..2183c20 100644
--- a/apps/showcase/src/main/resources/struts-model-driven.xml
+++ b/apps/showcase/src/main/resources/struts-model-driven.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 	<package name="modelDriven" extends="struts-default" namespace="/modelDriven">
diff --git a/apps/showcase/src/main/resources/struts-person.xml b/apps/showcase/src/main/resources/struts-person.xml
index a150088..0a97104 100644
--- a/apps/showcase/src/main/resources/struts-person.xml
+++ b/apps/showcase/src/main/resources/struts-person.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <!-- START SNIPPET: xworkSample -->
 
diff --git a/apps/showcase/src/main/resources/struts-tags-non-ui.xml b/apps/showcase/src/main/resources/struts-tags-non-ui.xml
index f445da0..c6a2ee3 100644
--- a/apps/showcase/src/main/resources/struts-tags-non-ui.xml
+++ b/apps/showcase/src/main/resources/struts-tags-non-ui.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 
diff --git a/apps/showcase/src/main/resources/struts-tags-ui.xml b/apps/showcase/src/main/resources/struts-tags-ui.xml
index 1055678..0580d5b 100644
--- a/apps/showcase/src/main/resources/struts-tags-ui.xml
+++ b/apps/showcase/src/main/resources/struts-tags-ui.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <package name="ui-tags" extends="velocity-default" namespace="/tags/ui">
diff --git a/apps/showcase/src/main/resources/struts-tags.xml b/apps/showcase/src/main/resources/struts-tags.xml
index c9482f1..eb7ee23 100644
--- a/apps/showcase/src/main/resources/struts-tags.xml
+++ b/apps/showcase/src/main/resources/struts-tags.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <include file="struts-tags-ui.xml"/>
diff --git a/apps/showcase/src/main/resources/struts-tiles.xml b/apps/showcase/src/main/resources/struts-tiles.xml
index 5fa2f80..7175d71 100644
--- a/apps/showcase/src/main/resources/struts-tiles.xml
+++ b/apps/showcase/src/main/resources/struts-tiles.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <package name="tiles" extends="tiles-default" namespace="/tiles">
diff --git a/apps/showcase/src/main/resources/struts-token.xml b/apps/showcase/src/main/resources/struts-token.xml
index db67041..2b4a18d 100644
--- a/apps/showcase/src/main/resources/struts-token.xml
+++ b/apps/showcase/src/main/resources/struts-token.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <package name="token" extends="struts-default" namespace="/token">
 
diff --git a/apps/showcase/src/main/resources/struts-validation.xml b/apps/showcase/src/main/resources/struts-validation.xml
index 31bcab4..de225d7 100755
--- a/apps/showcase/src/main/resources/struts-validation.xml
+++ b/apps/showcase/src/main/resources/struts-validation.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 
diff --git a/apps/showcase/src/main/resources/struts-wait.xml b/apps/showcase/src/main/resources/struts-wait.xml
index 23784b9..b68431c 100644
--- a/apps/showcase/src/main/resources/struts-wait.xml
+++ b/apps/showcase/src/main/resources/struts-wait.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 
diff --git a/apps/showcase/src/main/resources/struts.xml b/apps/showcase/src/main/resources/struts.xml
index 6354a36..f73963d 100644
--- a/apps/showcase/src/main/resources/struts.xml
+++ b/apps/showcase/src/main/resources/struts.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <!-- START SNIPPET: xworkSample -->
 <struts>
diff --git a/bundles/admin/src/main/resources/struts.xml b/bundles/admin/src/main/resources/struts.xml
index 2bb1bf1..2f00289 100644
--- a/bundles/admin/src/main/resources/struts.xml
+++ b/bundles/admin/src/main/resources/struts.xml
@@ -21,8 +21,8 @@
 -->
 
 <!DOCTYPE struts PUBLIC
-    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-    "https://struts.apache.org/dtds/struts-2.5.dtd">
+    "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+    "https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <constant name="struts.enable.DynamicMethodInvocation" value="false" />
diff --git a/bundles/demo/src/main/resources/struts.xml b/bundles/demo/src/main/resources/struts.xml
index 003635f..2c9baf9 100644
--- a/bundles/demo/src/main/resources/struts.xml
+++ b/bundles/demo/src/main/resources/struts.xml
@@ -20,8 +20,8 @@
  */

 -->

 <!DOCTYPE struts PUBLIC

-    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"

-    "https://struts.apache.org/dtds/struts-2.5.dtd">

+    "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"

+    "https://struts.apache.org/dtds/struts-6.0.dtd">

 

 <struts>

     <!-- Set some Struts 2 constants relevant to the OSGi Plugin.

diff --git a/core/src/main/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcher.java b/core/src/main/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcher.java
index 24e5e9b..027dc4a 100644
--- a/core/src/main/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcher.java
+++ b/core/src/main/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcher.java
@@ -87,8 +87,8 @@
         int s = 0;
         while (s < len) {
             int e = data.indexOf('{', s);
-            if (e < 0 && data.indexOf('}') > -1) {
-                throw new IllegalArgumentException("Missing openning '{' in [" + data + "]!");
+            if (e < 0 && data.indexOf('}', s) > -1) {
+                throw new IllegalArgumentException("Missing opening '{' in [" + data + "]!");
             }
             if (e < 0) {
                 regex.append(Pattern.quote(data.substring(s)));
diff --git a/core/src/main/java/org/apache/struts2/components/FormButton.java b/core/src/main/java/org/apache/struts2/components/FormButton.java
index d9e75f1..0ed08d4 100644
--- a/core/src/main/java/org/apache/struts2/components/FormButton.java
+++ b/core/src/main/java/org/apache/struts2/components/FormButton.java
@@ -96,33 +96,33 @@
      * </ol>
      */
     protected void populateComponentHtmlId(Form form) {
-        String _tmp_id = "";
+        String tmpId = "";
         if (id != null) {
             // this check is needed for backwards compatibility with 2.1.x
-            _tmp_id = findString(id);
+            tmpId = findString(id);
         } else {
             if (form != null && form.getParameters().get("id") != null) {
-                _tmp_id = _tmp_id + form.getParameters().get("id").toString() + "_";
+                tmpId = tmpId + form.getParameters().get("id").toString() + "_";
             }
             if (name != null) {
-                _tmp_id = _tmp_id + escape(name);
+                tmpId = tmpId + escape(findString(name));
             } else if (action != null || method != null) {
                 if (action != null) {
-                    _tmp_id = _tmp_id + escape(action);
+                    tmpId = tmpId + escape(findString(action));
                 }
                 if (method != null) {
-                    _tmp_id = _tmp_id + "_" + escape(method);
+                    tmpId = tmpId + "_" + escape(findString(method));
                 }
             } else {
                 // if form is null, this component is used, without a form, i guess
                 // there's not much we could do then.
                 if (form != null) {
-                    _tmp_id = _tmp_id + form.getSequence();
+                    tmpId = tmpId + form.getSequence();
                 }
             }
         }
-        addParameter("id", _tmp_id);
-        addParameter("escapedId", escape(_tmp_id));
+        addParameter("id", tmpId);
+        addParameter("escapedId", escape(tmpId));
     }
 
     /**
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
index f7c3ad7..51ae95d 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
@@ -78,7 +78,6 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
@@ -109,6 +108,8 @@
 
     public static final String MULTIPART_FORM_DATA_REGEX = "^multipart/form-data(?:\\s*;\\s*boundary=[0-9a-zA-Z'()+_,\\-./:=?]{1,70})?(?:\\s*;\\s*charset=[a-zA-Z\\-0-9]{3,14})?";
 
+    private static final String CONFIG_SPLIT_REGEX = "\\s*,\\s*";
+
     /**
      * Provide a thread local instance.
      */
@@ -427,10 +428,14 @@
         if (configPaths == null) {
             configPaths = DEFAULT_CONFIGURATION_PATHS;
         }
-        String[] files = configPaths.split("\\s*[,]\\s*");
+        loadConfigPaths(configPaths);
+    }
+
+    private void loadConfigPaths(String configPaths) {
+        String[] files = configPaths.split(CONFIG_SPLIT_REGEX);
         for (String file : files) {
             if (file.endsWith(".xml")) {
-                configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext));
+                configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, servletContext));
             } else {
                 throw new IllegalArgumentException("Invalid configuration file name");
             }
@@ -452,7 +457,7 @@
     private void init_JavaConfigurations() {
         String configClasses = initParams.get("javaConfigClasses");
         if (configClasses != null) {
-            String[] classes = configClasses.split("\\s*[,]\\s*");
+            String[] classes = configClasses.split(CONFIG_SPLIT_REGEX);
             for (String cname : classes) {
                 try {
                     Class<?> cls = ClassLoaderUtil.loadClass(cname, this.getClass());
@@ -476,7 +481,7 @@
     private void init_CustomConfigurationProviders() {
         String configProvs = initParams.get("configProviders");
         if (configProvs != null) {
-            String[] classes = configProvs.split("\\s*[,]\\s*");
+            String[] classes = configProvs.split(CONFIG_SPLIT_REGEX);
             for (String cname : classes) {
                 try {
                     Class cls = ClassLoaderUtil.loadClass(cname, this.getClass());
@@ -521,6 +526,13 @@
         configurationManager.addContainerProvider(new StrutsBeanSelectionProvider());
     }
 
+    /**
+     * `struts-deferred.xml` can be used to load configuration which is sensitive to loading order such as 'bean-selection' elements
+     */
+    private void init_DeferredXmlConfigurations() {
+        loadConfigPaths("struts-deferred.xml");
+    }
+
     private Container init_PreloadConfiguration() {
         return getContainer();
     }
@@ -554,6 +566,7 @@
             init_CustomConfigurationProviders(); // [5]
             init_FilterInitParameters(); // [6]
             init_AliasStandardObjects(); // [7]
+            init_DeferredXmlConfigurations();
 
             Container container = init_PreloadConfiguration();
             container.inject(this);
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/SessionMap.java b/core/src/main/java/org/apache/struts2/dispatcher/SessionMap.java
index dac8404..8fe5777 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/SessionMap.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/SessionMap.java
@@ -42,7 +42,7 @@
 
 
     /**
-     * Creates a new session map given a http servlet request. Note, ths enumeration of request
+     * Creates a new session map given a http servlet request. Note, the enumeration of request
      * attributes will occur when the map entries are asked for.
      *
      * @param request the http servlet request object.
@@ -82,7 +82,7 @@
 
         synchronized (session.getId().intern()) {
             entries = null;
-            Enumeration<String> attributeNamesEnum = session.getAttributeNames();
+            final Enumeration<String> attributeNamesEnum = session.getAttributeNames();
             while (attributeNamesEnum.hasMoreElements()) {
                 session.removeAttribute(attributeNamesEnum.nextElement());
             }
@@ -105,7 +105,7 @@
             if (entries == null) {
                 entries = new HashSet<>();
 
-                Enumeration<String> enumeration = session.getAttributeNames();
+                final Enumeration<String> enumeration = session.getAttributeNames();
 
                 while (enumeration.hasMoreElements()) {
                     final String key = enumeration.nextElement();
@@ -127,17 +127,21 @@
 
     /**
      * Returns the session attribute associated with the given key or <tt>null</tt> if it doesn't exist.
+     * 
+     * <b>Note:</b> Must use the same signature as {@link java.util.AbstractMap#get(java.lang.Object)} to ensure the
+     *   expected specialized behaviour is performed here (and not the generic ancestor behaviour).
      *
      * @param key the name of the session attribute.
      * @return the session attribute or <tt>null</tt> if it doesn't exist.
      */
-    public Object get(final String key) {
+    @Override
+    public Object get(final Object key) {
         if (session == null) {
             return null;
         }
 
         synchronized (session.getId().intern()) {
-            return session.getAttribute(key);
+            return session.getAttribute(key != null ? key.toString() : null);
         }
     }
 
@@ -156,7 +160,7 @@
             }
         }
         synchronized (session.getId().intern()) {
-            Object oldValue = get(key);
+            final Object oldValue = get(key);
             entries = null;
             session.setAttribute(key, value);
             return oldValue;
@@ -166,10 +170,14 @@
     /**
      * Removes the specified session attribute.
      *
+     * <b>Note:</b> Must use the same signature as {@link java.util.AbstractMap#remove(java.lang.Object)} to ensure the
+     *   expected specialized behaviour is performed here (and not the generic ancestor behaviour).
+     * 
      * @param key the name of the attribute to remove.
      * @return the value that was removed or <tt>null</tt> if the value was not found (and hence, not removed).
      */
-    public Object remove(final String key) {
+    @Override
+    public Object remove(final Object key) {
         if (session == null) {
             return null;
         }
@@ -177,8 +185,9 @@
         synchronized (session.getId().intern()) {
             entries = null;
 
-            Object value = get(key);
-            session.removeAttribute(key);
+            final String keyAsString = (key != null ? key.toString() : null);
+            final Object value = get(keyAsString);
+            session.removeAttribute(keyAsString);
 
             return value;
         }
@@ -188,16 +197,21 @@
     /**
      * Checks if the specified session attribute with the given key exists.
      *
+     * <b>Note:</b> Must use the same signature as {@link java.util.AbstractMap#containsKey(java.lang.Object)} to ensure the
+     *   expected specialized behaviour is performed here (and not the generic ancestor behaviour).
+     * 
      * @param key the name of the session attribute.
      * @return <tt>true</tt> if the session attribute exits or <tt>false</tt> if it doesn't exist.
      */
-    public boolean containsKey(final String key) {
+    @Override
+    public boolean containsKey(final Object key) {
         if (session == null) {
             return false;
         }
 
         synchronized (session.getId().intern()) {
-            return (session.getAttribute(key.toString()) != null);
+            final String keyAsString = (key != null ? key.toString() : null);
+            return (session.getAttribute(keyAsString) != null);
         }
     }
 }
diff --git a/core/src/main/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java
index 7a022c9..8d48766 100644
--- a/core/src/main/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java
+++ b/core/src/main/java/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.java
@@ -228,6 +228,7 @@
     /* (non-Javadoc)
      * @see com.opensymphony.xwork2.interceptor.MethodFilterInterceptor#doIntercept(com.opensymphony.xwork2.ActionInvocation)
      */
+    @Override
     protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
         ActionProxy proxy = actionInvocation.getProxy();
         String name = getBackgroundProcessName(proxy);
@@ -235,34 +236,40 @@
         Map<String, Object> session = context.getSession();
         HttpSession httpSession = ServletActionContext.getRequest().getSession(true);
 
-        Boolean secondTime = true;
-        if (executeAfterValidationPass) {
-            secondTime = (Boolean) context.get(KEY);
-            if (secondTime == null) {
-                context.put(KEY, true);
-                secondTime = false;
-            } else {
-                secondTime = true;
-                context.put(KEY, null);
-            }
-        }
-
         //sync on the real HttpSession as the session from the context is a wrap that is created
         //on every request
         synchronized (httpSession) {
-            BackgroundProcess bp = (BackgroundProcess) session.get(KEY + name);
+            // State flag processing moved within the synchronization block, to ensure consistency.
+            Boolean secondTime = true;
+            if (executeAfterValidationPass) {
+                secondTime = (Boolean) context.get(KEY);
+                if (secondTime == null) {
+                    context.put(KEY, true);
+                    secondTime = false;
+                } else {
+                    secondTime = true;
+                    context.put(KEY, null);
+                }
+            }
+
+            final String bp_SessionKey = KEY + name;
+            BackgroundProcess bp = (BackgroundProcess) session.get(bp_SessionKey);
+
+            LOG.debug("Intercepting invocation for BackgroundProcess - session key: {}, value: {}", bp_SessionKey, bp);
 
             //WW-4900 Checks if from a de-serialized session? so background thread missed, let's start a new one.
             if (bp != null && bp.getInvocation() == null) {
-                session.remove(KEY + name);
+                LOG.trace("BackgroundProcess invocation is null (remove key, clear instance)");
+                session.remove(bp_SessionKey);
                 bp = null;
             }
 
             if ((!executeAfterValidationPass || secondTime) && bp == null) {
+                LOG.trace("BackgroundProcess instance is null (create new instance) - executeAfterValidationPass: {}, secondTime: {}.", executeAfterValidationPass, secondTime);
                 bp = getNewBackgroundProcess(name, actionInvocation, threadPriority).prepare();
-                session.put(KEY + name, bp);
-                if (executor.isShutdown()) {
-                    LOG.warn("Executor is shutting down, cannot execute a new process");
+                session.put(bp_SessionKey, bp);
+                if (executor == null || executor.isShutdown()) {
+                    LOG.warn("Executor is shutting down (or null), cannot execute a new process, invoke next ActionInvocation step and return.");
                     return actionInvocation.invoke();
                 }
                 executor.execute(bp);
@@ -271,6 +278,7 @@
             }
 
             if ((!executeAfterValidationPass || !secondTime) && bp != null && !bp.isDone()) {
+                LOG.trace("BackgroundProcess instance is not done (wait processing) - executeAfterValidationPass: {}, secondTime: {}.", executeAfterValidationPass, secondTime);
                 actionInvocation.getStack().push(bp.getAction());
 
                 final String token = TokenHelper.getToken();
@@ -297,7 +305,8 @@
 
                 return WAIT;
             } else if ((!executeAfterValidationPass || !secondTime) && bp != null && bp.isDone()) {
-                session.remove(KEY + name);
+                LOG.trace("BackgroundProcess instance is done (remove key, return result) - executeAfterValidationPass: {}, secondTime: {}.", executeAfterValidationPass, secondTime);
+                session.remove(bp_SessionKey);
                 actionInvocation.getStack().push(bp.getAction());
 
                 // if an exception occurred during action execution, throw it here
@@ -307,6 +316,7 @@
 
                 return bp.getResult();
             } else {
+                LOG.trace("BackgroundProcess state fall-through (first instance, pass through), invoke next ActionInvocation step and return - executeAfterValidationPass: {}, secondTime: {}.", executeAfterValidationPass, secondTime);
                 // this is the first instance of the interceptor and there is no existing action
                 // already run in the background, so let's just let this pass through. We assume
                 // the action invocation will be run in the background on the subsequent pass through
@@ -394,7 +404,10 @@
 
     @Override
     public void destroy() {
-        super.destroy();
-        executor.shutdown();
+        try {
+          executor.shutdown();
+        } finally {
+          super.destroy();
+        }
     }
 }
diff --git a/core/src/main/java/org/apache/struts2/interceptor/exec/StrutsBackgroundProcess.java b/core/src/main/java/org/apache/struts2/interceptor/exec/StrutsBackgroundProcess.java
index 8f56391..4223726 100644
--- a/core/src/main/java/org/apache/struts2/interceptor/exec/StrutsBackgroundProcess.java
+++ b/core/src/main/java/org/apache/struts2/interceptor/exec/StrutsBackgroundProcess.java
@@ -33,10 +33,10 @@
     private final String threadName;
     private final int threadPriority;
 
-    private transient  Thread processThread;
+    private transient Thread processThread;
     //WW-4900 transient since 2.5.15
     protected transient ActionInvocation invocation;
-    protected transient  Exception exception;
+    protected transient Exception exception;
 
     protected String result;
     protected boolean done;
@@ -64,9 +64,9 @@
                     afterInvocation();
                 } catch (Exception e) {
                     exception = e;
+                } finally {
+                  done = true;
                 }
-
-                done = true;
             });
             processThread.setName(threadName);
             processThread.setPriority(threadPriority);
diff --git a/core/src/main/resources/template/simple/submit.ftl b/core/src/main/resources/template/simple/submit.ftl
index 48026b3..a932103 100644
--- a/core/src/main/resources/template/simple/submit.ftl
+++ b/core/src/main/resources/template/simple/submit.ftl
@@ -88,4 +88,4 @@
 <#include "/${parameters.templateDir}/${parameters.expandTheme}/common-attributes.ftl" />
 <#include "/${parameters.templateDir}/${parameters.expandTheme}/dynamic-attributes.ftl" />
 />
-</#if>
\ No newline at end of file
+</#if>
diff --git a/core/src/main/resources/xwork-default.xml b/core/src/main/resources/xwork-default.xml
index b4dce65..c25cdc5 100644
--- a/core/src/main/resources/xwork-default.xml
+++ b/core/src/main/resources/xwork-default.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <package name="xwork-default" abstract="true">
 
diff --git a/core/src/test/java/com/opensymphony/xwork2/TestBean.java b/core/src/test/java/com/opensymphony/xwork2/TestBean.java
index 8b1a8ff..fd5bc59 100644
--- a/core/src/test/java/com/opensymphony/xwork2/TestBean.java
+++ b/core/src/test/java/com/opensymphony/xwork2/TestBean.java
@@ -20,25 +20,18 @@
 
 import java.util.Date;
 
-
-/**
- * TestBean
- *
- * @author Jason Carreira
- *         Created Aug 4, 2003 12:39:53 AM
- */
 public class TestBean {
 
     private Date birth;
     private String name;
     private int count;
-    
+    private String subName;
+
     private TestChildBean child = new TestChildBean();
 
     public TestBean() {
     }
 
-
     public void setBirth(Date birth) {
         this.birth = birth;
     }
@@ -63,13 +56,19 @@
         return name;
     }
 
-
     public TestChildBean getChild() {
         return child;
     }
 
-
     public void setChild(TestChildBean child) {
         this.child = child;
     }
+
+    public String getSubName() {
+        return subName;
+    }
+
+    public void setSubName(String subName) {
+        this.subName = subName;
+    }
 }
diff --git a/core/src/test/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcherTest.java b/core/src/test/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcherTest.java
index b5eda4f..da7f3f0 100644
--- a/core/src/test/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcherTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcherTest.java
@@ -53,6 +53,26 @@
         assertEquals("bob", pattern.getVariableNames().get(1));
         assertTrue(pattern.getPattern().matcher("foostar/jie").matches());
         assertFalse(pattern.getPattern().matcher("foo/star/jie").matches());
+
+        pattern = matcher.compilePattern("{urlLocale}/eula_cz");
+        assertEquals("([^/]+)\\Q/eula_cz\\E", pattern.getPattern().pattern());
+        assertEquals("urlLocale", pattern.getVariableNames().get(0));
+        assertTrue(pattern.getPattern().matcher("foostar/eula_cz").matches());
+        assertFalse(pattern.getPattern().matcher("foo/star/eula_cz").matches());
+
+        pattern = matcher.compilePattern("{test1}/path/{test2}");
+        assertEquals("([^/]+)\\Q/path/\\E([^/]+)", pattern.getPattern().pattern());
+        assertEquals("test1", pattern.getVariableNames().get(0));
+        assertEquals("test2", pattern.getVariableNames().get(1));
+        assertTrue(pattern.getPattern().matcher("test1/path/test2").matches());
+        assertFalse(pattern.getPattern().matcher("test/1/path/test2").matches());
+
+        pattern = matcher.compilePattern("path1/{test1}/path2/{test2}");
+        assertEquals("\\Qpath1/\\E([^/]+)\\Q/path2/\\E([^/]+)", pattern.getPattern().pattern());
+        assertEquals("test1", pattern.getVariableNames().get(0));
+        assertEquals("test2", pattern.getVariableNames().get(1));
+        assertTrue(pattern.getPattern().matcher("path1/test1/path2/test2").matches());
+        assertFalse(pattern.getPattern().matcher("path1/test/1/path2/test2").matches());
     }
 
     @Test(expected = IllegalArgumentException.class)
diff --git a/core/src/test/java/org/apache/struts2/components/FormButtonTest.java b/core/src/test/java/org/apache/struts2/components/FormButtonTest.java
index bf0fe95..429ecfd 100644
--- a/core/src/test/java/org/apache/struts2/components/FormButtonTest.java
+++ b/core/src/test/java/org/apache/struts2/components/FormButtonTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.struts2.components;
 
+import com.opensymphony.xwork2.TestBean;
 import org.apache.struts2.StrutsInternalTestCase;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.mock.web.MockHttpServletResponse;
@@ -31,7 +32,7 @@
  */
 public class FormButtonTest extends StrutsInternalTestCase {
 
-    public void testPopulateComponentHtmlId1() throws Exception {
+    public void testPopulateComponentHtmlId1() {
         MockHttpServletRequest req = new MockHttpServletRequest();
         MockHttpServletResponse res = new MockHttpServletResponse();
         ValueStack stack = ActionContext.getContext().getValueStack();
@@ -47,7 +48,7 @@
         assertEquals("submitId", submit.getParameters().get("id"));
     }
 
-    public void testPopulateComponentHtmlId2() throws Exception {
+    public void testPopulateComponentHtmlId2() {
         MockHttpServletRequest req = new MockHttpServletRequest();
         MockHttpServletResponse res = new MockHttpServletResponse();
         ValueStack stack = ActionContext.getContext().getValueStack();
@@ -63,7 +64,7 @@
         assertEquals("formId_submitName", submit.getParameters().get("id"));
     }
 
-    public void testPopulateComponentHtmlId3() throws Exception {
+    public void testPopulateComponentHtmlId3() {
         MockHttpServletRequest req = new MockHttpServletRequest();
         MockHttpServletResponse res = new MockHttpServletResponse();
         ValueStack stack = ActionContext.getContext().getValueStack();
@@ -80,7 +81,7 @@
         assertEquals("formId_submitAction_submitMethod", submit.getParameters().get("id"));
     }
 
-    public void testPopulateComponentHtmlId4() throws Exception {
+    public void testPopulateComponentHtmlId4() {
         MockHttpServletRequest req = new MockHttpServletRequest();
         MockHttpServletResponse res = new MockHttpServletResponse();
         ValueStack stack = ActionContext.getContext().getValueStack();
@@ -93,7 +94,7 @@
         assertEquals("submitId", submit.getParameters().get("id"));
     }
 
-    public void testPopulateComponentHtmlId5() throws Exception {
+    public void testPopulateComponentHtmlId5() {
         MockHttpServletRequest req = new MockHttpServletRequest();
         MockHttpServletResponse res = new MockHttpServletResponse();
         ValueStack stack = ActionContext.getContext().getValueStack();
@@ -106,7 +107,7 @@
         assertEquals("submitName", submit.getParameters().get("id"));
     }
 
-    public void testPopulateComponentHtmlId6() throws Exception {
+    public void testPopulateComponentHtmlId6() {
         MockHttpServletRequest req = new MockHttpServletRequest();
         MockHttpServletResponse res = new MockHttpServletResponse();
         ValueStack stack = ActionContext.getContext().getValueStack();
@@ -119,4 +120,38 @@
 
         assertEquals("submitAction_submitMethod", submit.getParameters().get("id"));
     }
+
+    public void testPopulateComponentHtmlId7() {
+        MockHttpServletRequest req = new MockHttpServletRequest();
+        MockHttpServletResponse res = new MockHttpServletResponse();
+        ValueStack stack = ActionContext.getContext().getValueStack();
+        TestBean bean = new TestBean();
+        bean.setName("secondAction");
+        stack.push(bean);
+
+        Submit submit = new Submit(stack, req, res);
+        submit.setName("%{name}");
+
+        submit.populateComponentHtmlId(null);
+
+        assertEquals("secondAction", submit.getParameters().get("id"));
+    }
+
+    public void testPopulateComponentHtmlId8() {
+        MockHttpServletRequest req = new MockHttpServletRequest();
+        MockHttpServletResponse res = new MockHttpServletResponse();
+        ValueStack stack = ActionContext.getContext().getValueStack();
+        TestBean bean = new TestBean();
+        bean.setName("boo");
+        bean.setSubName("foo");
+        stack.push(bean);
+
+        Submit submit = new Submit(stack, req, res);
+        submit.setAction("%{name}");
+        submit.setMethod("%{subName}");
+
+        submit.populateComponentHtmlId(null);
+
+        assertEquals("boo_foo", submit.getParameters().get("id"));
+    }
 }
diff --git a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java
index d19b778..73a5265 100644
--- a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java
+++ b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java
@@ -51,6 +51,7 @@
 import java.util.HashSet;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Test case for Dispatcher.
@@ -230,12 +231,13 @@
         du.init();
         Configuration config = du.getConfigurationManager().getConfiguration();
         assertNotNull(config);
-        HashSet<String> expected = new HashSet<>();
+        Set<String> expected = new HashSet<>();
         expected.add("struts-default.xml");
         expected.add("struts-beans.xml");
         expected.add("struts-excluded-classes.xml");
         expected.add("struts-plugin.xml");
         expected.add("struts.xml");
+        expected.add("struts-deferred.xml");
         assertEquals(expected, config.getLoadedFileNames());
         assertTrue(config.getPackageConfigs().size() > 0);
         PackageConfig packageConfig = config.getPackageConfig("struts-default");
diff --git a/core/src/test/java/org/apache/struts2/dispatcher/SessionMapTest.java b/core/src/test/java/org/apache/struts2/dispatcher/SessionMapTest.java
index 8c292cd..6dc597e 100644
--- a/core/src/test/java/org/apache/struts2/dispatcher/SessionMapTest.java
+++ b/core/src/test/java/org/apache/struts2/dispatcher/SessionMapTest.java
@@ -36,6 +36,7 @@
 import com.mockobjects.constraint.IsAnything;
 import com.mockobjects.constraint.IsEqual;
 import com.mockobjects.dynamic.Mock;
+import java.util.AbstractMap;
 
 
 /**
@@ -47,24 +48,18 @@
 
 
     public void testClearInvalidatesTheSession() throws Exception {
-        List<String> attributeNames = new ArrayList<String>();
+        List<String> attributeNames = new ArrayList<>();
         attributeNames.add("test");
         attributeNames.add("anotherTest");
         Enumeration<String> attributeNamesEnum = Collections.enumeration(attributeNames);
 
         MockSessionMap sessionMap = new MockSessionMap((HttpServletRequest) requestMock.proxy());
-        sessionMock.expect("getAttribute",
-                new Constraint[] {
-                    new IsEqual("test")
-                });
+        // Note: getAttribute() calls no longer expected after fix to ensure descendant (not ancestor) calls are made for
+        //   the SessionMap Map methods (i.e. the overrides are called, as expected).
         sessionMock.expect("setAttribute",
                 new Constraint[] {
                     new IsEqual("test"), new IsEqual("test value")
                 });
-        sessionMock.expect("getAttribute",
-                new Constraint[] {
-                    new IsEqual("anotherTest")
-                });
         sessionMock.expect("setAttribute",
                 new Constraint[] {
                     new IsEqual("anotherTest"), new IsEqual("another test value")
@@ -78,14 +73,6 @@
                 new Constraint[]{
                     new IsEqual("anotherTest")
                 });
-        sessionMock.expect("getAttribute",
-                new Constraint[] {
-                    new IsEqual("test")
-                });
-        sessionMock.expect("getAttribute",
-                new Constraint[] {
-                    new IsEqual("anotherTest")
-                });
         sessionMap.put("test", "test value");
         sessionMap.put("anotherTest", "another test value");
         sessionMap.clear();
@@ -121,7 +108,7 @@
         String key = "theKey";
         Object value = new Object();
         sessionMock.expectAndReturn("getAttribute", new Constraint[]{
-                new IsEqual(key.toString())
+                new IsEqual(key)
         }, value);
 
         SessionMap sessionMap = new SessionMap((HttpServletRequest) requestMock.proxy());
@@ -134,7 +121,7 @@
         Object value = new Object();
         sessionMock.expect("getAttribute", new Constraint[]{new IsAnything()});
         sessionMock.expect("setAttribute", new Constraint[]{
-                new IsEqual(key.toString()), new IsEqual(value)
+                new IsEqual(key), new IsEqual(value)
         });
 
         SessionMap sessionMap = new SessionMap((HttpServletRequest) requestMock.proxy());
@@ -159,7 +146,7 @@
     	MockHttpServletRequest request = new MockHttpServletRequest();
     	
         String key = "theKey";
-        Object someOtherKey = "someOtherKey";
+        String someOtherKey = "someOtherKey";
         Object value = new Object();
         
         SessionMap sessionMap = new SessionMap(request);
@@ -218,6 +205,79 @@
         sessionMock.verify();
     }
 
+    /** 
+     * Attempt to detect any changes that would make the attribute handling for puts produce different results
+     * for the SessionMap and underlying HttpSession attributes.
+     * 
+     * @throws Exception 
+     */
+    public void testPutResultInSessionAttributes() throws Exception {
+        Object value = new Object();
+
+        //HttpSession httpSessionMock = ((HttpServletRequest) requestMock.proxy()).getSession(false);
+        HttpSession httpSessionMock = (HttpSession) sessionMock.proxy();
+        sessionMock.expectAndReturn("getAttribute", new Constraint[]{
+                new IsEqual("KEY")
+        }, null);
+        sessionMock.expect("setAttribute", new Constraint[]{
+                new IsEqual("KEY"), new IsEqual(value)
+        });
+        sessionMock.expectAndReturn("getAttribute", new Constraint[]{
+                new IsEqual("KEY")
+        }, value);
+        sessionMock.expectAndReturn("getAttribute", new Constraint[]{
+                new IsEqual("KEY")
+        }, value);
+
+        SessionMap sessionMap = new SessionMap((HttpServletRequest) requestMock.proxy());
+        AbstractMap<String, Object> abstractMap = (AbstractMap<String, Object>) sessionMap;
+        abstractMap.put("KEY", value);
+        assertEquals("Underlying HttpSession attribute does not match after SessionMap put ?", abstractMap.get("KEY"), httpSessionMock.getAttribute("KEY"));
+        sessionMock.verify();
+    }
+
+    /**
+     * Attempt to detect any changes that would make the attribute handling for removes produce different results
+     * for the SessionMap and underlying HttpSession attributes.
+     * 
+     * @throws Exception 
+     */
+    public void testRemoveResultInSessionAttributes() throws Exception {
+        Object value = new Object();
+        Object removedValue;
+
+        //HttpSession httpSessionMock = ((HttpServletRequest) requestMock.proxy()).getSession(false);
+        HttpSession httpSessionMock = (HttpSession) sessionMock.proxy();
+        sessionMock.expectAndReturn("getAttribute", new Constraint[]{
+                new IsEqual("KEY")
+        }, null);
+        sessionMock.expect("setAttribute", new Constraint[]{
+                new IsEqual("KEY"), new IsEqual(value)
+        });
+        sessionMock.expectAndReturn("getAttribute", new Constraint[]{
+                new IsEqual("KEY")
+        }, value);
+        sessionMock.expect("removeAttribute", new Constraint[]{
+                new IsEqual("KEY")
+        });
+        sessionMock.expectAndReturn("getAttribute", new Constraint[]{
+                new IsEqual("KEY")
+        }, null);
+        sessionMock.expectAndReturn("getAttribute", new Constraint[]{
+                new IsEqual("KEY")
+        }, null);
+
+        SessionMap sessionMap = new SessionMap((HttpServletRequest) requestMock.proxy());
+        AbstractMap<String, Object> abstractMap = (AbstractMap<String, Object>) sessionMap;
+        abstractMap.put("KEY", value);
+        removedValue = abstractMap.remove("KEY");
+        assertEquals("Removed attribute not equal to put attribute ?", value, removedValue);
+        assertNull("Removed attribute still present in SessionMap ?", abstractMap.get("KEY"));
+        assertNull("Removed attribute still present in HttpSessionMock ?", httpSessionMock.getAttribute("KEY"));
+        sessionMock.verify();
+    }
+
+    @Override
     protected void setUp() throws Exception {
         sessionMock = new Mock(HttpSession.class);
         sessionMock.matchAndReturn("getId", "1");
@@ -235,16 +295,19 @@
 
         private static final long serialVersionUID = 8783604360786273764L;
 
-        private Map<String, Object> map = new HashMap<>();
+        private final Map<String, Object> map;
 
         public MockSessionMap(HttpServletRequest request) {
             super(request);
+            this.map = new HashMap<>();
         }
 
+        @Override
         public Object get(Object key) {
             return map.get(key);
         }
         
+        @Override
         public Object put(String key, Object value) {
             Object originalValue = super.put(key, value);
             map.put(key, value); //put the value into our map after putting it in the superclass map to avoid polluting the get call.
@@ -252,6 +315,7 @@
             return originalValue;
         }
 
+        @Override
         public void clear() {
             super.clear();
             map.clear();
diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/SubmitTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/SubmitTest.java
index 99eff80..2e80b46 100644
--- a/core/src/test/java/org/apache/struts2/views/jsp/ui/SubmitTest.java
+++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/SubmitTest.java
@@ -18,16 +18,15 @@
  */
 package org.apache.struts2.views.jsp.ui;
 
+import com.opensymphony.xwork2.TestBean;
 import org.apache.struts2.TestAction;
 import org.apache.struts2.views.jsp.AbstractUITagTest;
 
 import java.util.HashMap;
 import java.util.Map;
 
-
 /**
  * Unit test for {@link SubmitTag}.
- *
  */
 public class SubmitTest extends AbstractUITagTest {
 
@@ -699,4 +698,40 @@
 
         verify(TextFieldTag.class.getResource("Submit-12.txt"));
     }
+
+    public void testSubmitWithGeneratedId_shouldUseEvaluatedName() throws Exception {
+        TestAction testAction = (TestAction) action;
+        testAction.setFoo("entryEdit");
+
+        SubmitTag tag = new SubmitTag();
+        tag.setTheme("simple");
+        tag.setPageContext(pageContext);
+        tag.setName("%{foo}!saveDraft");
+        tag.setValue("Save");
+
+        tag.doStartTag();
+        tag.doEndTag();
+
+        verify(TextFieldTag.class.getResource("Submit-13.txt"));
+    }
+
+    public void testSubmitWithGeneratedId_shouldUseEvaluatedAction() throws Exception {
+        TestAction testAction = (TestAction) action;
+        testAction.setFoo("entryEdit");
+
+        TestBean bean = new TestBean();
+        bean.setName("mainAction");
+        stack.push(bean);
+
+        SubmitTag tag = new SubmitTag();
+        tag.setTheme("simple");
+        tag.setPageContext(pageContext);
+        tag.setAction("%{name}!saveDraft");
+        tag.setValue("Save");
+
+        tag.doStartTag();
+        tag.doEndTag();
+
+        verify(TextFieldTag.class.getResource("Submit-14.txt"));
+    }
 }
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/loadorder1/xwork-test-load-order.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/loadorder1/xwork-test-load-order.xml
index 805c5b6..14703dd 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/loadorder1/xwork-test-load-order.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/loadorder1/xwork-test-load-order.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts order="2">
 </struts>
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/loadorder2/xwork-test-load-order.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/loadorder2/xwork-test-load-order.xml
index 602d778..e94277b 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/loadorder2/xwork-test-load-order.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/loadorder2/xwork-test-load-order.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts order="3">
 </struts>
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/loadorder3/xwork-test-load-order.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/loadorder3/xwork-test-load-order.xml
index c54e17f..52846dc 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/loadorder3/xwork-test-load-order.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/loadorder3/xwork-test-load-order.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts order="1">
 </struts>
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork- test.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork- test.xml
index e832300..7cc074f 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork- test.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork- test.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <include file="xwork-test-beans.xml"/>
     <package name="default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-after-package-2.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-after-package-2.xml
index f29ce17..8b4c873 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-after-package-2.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-after-package-2.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <package name="namespace5" extends="namespace4" namespace="/namespace5">
         <action name="action5" class="com.opensymphony.xwork2.SimpleAction">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-after-package.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-after-package.xml
index d9f87ec..b48a4c4 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-after-package.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-after-package.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <package name="namespace4" extends="namespace1" namespace="/namespace4">
         <interceptors>
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-before-package-2.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-before-package-2.xml
index 59ef1e9..58f2771 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-before-package-2.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-before-package-2.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <package name="namespace2" extends="namespace1" namespace="/namespace2">
         <action name="action2" class="com.opensymphony.xwork2.SimpleAction">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-before-package.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-before-package.xml
index 2ccff3a..ca67f9f 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-before-package.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-before-package.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-beans.xml" />
 
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-parent.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-parent.xml
index 758b55f..b02746d 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-parent.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-include-parent.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-default.xml" />
 
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-action-invalid.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-action-invalid.xml
index 8fa3369..33194f9 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-action-invalid.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-action-invalid.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-beans.xml" />
     <package name="default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-actions-packagedefaultclassref.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-actions-packagedefaultclassref.xml
index 42d2d5b..f7f4a8f 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-actions-packagedefaultclassref.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-actions-packagedefaultclassref.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <package name="default">
 
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-actions.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-actions.xml
index e832300..7cc074f 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-actions.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-actions.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <include file="xwork-test-beans.xml"/>
     <package name="default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml
index 85ada7e..247b4ef 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowed-methods.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <package name="default" strict-method-invocation="false">
         <global-allowed-methods>input,cancel</global-allowed-methods>
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-bad-inheritance.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-bad-inheritance.xml
index 5f6b1f0..7b475f2 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-bad-inheritance.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-bad-inheritance.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-beans.xml" />
     <package name="default" />
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-basic-packages.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-basic-packages.xml
index e6b3a7f..a934bce 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-basic-packages.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-basic-packages.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <include file="xwork-test-beans.xml"/>
     <package name="default"/>
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-default-package.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-default-package.xml
index d5869ca..f9ea310 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-default-package.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-default-package.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-beans.xml" />
     <package name="default" />
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-defaultclassref-package.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-defaultclassref-package.xml
index ae9c254..deedbed 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-defaultclassref-package.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-defaultclassref-package.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <package name="hasDefaultClassRef">
         <default-class-ref class="com.opensymphony.xwork2.ActionSupport"/>
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-envs-substitution.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-envs-substitution.xml
index a328c72..f74cb8e 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-envs-substitution.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-envs-substitution.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 
     <constant name="foo" value="bar"/>
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-exception-mappings.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-exception-mappings.xml
index bb7a345..ab503c1 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-exception-mappings.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-exception-mappings.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-beans.xml" />
     <package name="default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-global-result-inheritence.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-global-result-inheritence.xml
index 4852fae..143b9f5 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-global-result-inheritence.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-global-result-inheritence.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <include file="xwork-test-beans.xml"/>
     <package name="parent" namespace="/base">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-include-wildcard.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-include-wildcard.xml
index afc3334..bec77a1 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-include-wildcard.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-include-wildcard.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
   <include file="com/opensymphony/xwork2/config/providers/xwork-include-*.xml"/>
 </struts>
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-defaultref.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-defaultref.xml
index 955c123..c5290c3 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-defaultref.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-defaultref.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <!-- this package has a default interceptor ref - so actions with no refs should have the default ref -->
     <package name="default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-inheritance.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-inheritance.xml
index 5226d0a..919eb39 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-inheritance.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-inheritance.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <include file="xwork-test-beans.xml"/>
     <package name="default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-param-overriding.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-param-overriding.xml
index af8c52d..15f5ace 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-param-overriding.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-param-overriding.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-		"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-		"https://struts.apache.org/dtds/struts-2.5.dtd">
+		"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+		"https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-beans.xml" />
 	<package name="packageOne">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-params.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-params.xml
index e74d532..0b502a1 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-params.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-params.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-beans.xml" />
     <package name="default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-stack-param-overriding.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-stack-param-overriding.xml
index 7a54fcd..47eb82b 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-stack-param-overriding.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptor-stack-param-overriding.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <package name="packageOne">
         <result-types>
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptors-basic.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptors-basic.xml
index dec118d..c271410 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptors-basic.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptors-basic.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-beans.xml" />
     <package name="default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptors-spring.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptors-spring.xml
index 1adf5ed..89e30ca 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptors-spring.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-interceptors-spring.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <include file="xwork-test-beans.xml"/>
     <package name="default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-multilevel.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-multilevel.xml
index 2852fb6..2d4b0a6 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-multilevel.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-multilevel.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-beans.xml" />
     <package name="default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-package-inheritance.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-package-inheritance.xml
index c728ac8..f6c2b97 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-package-inheritance.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-package-inheritance.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-beans.xml" />
     <package name="default" namespace="/default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-reload.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-reload.xml
index c71e8b5..949a0cb 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-reload.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-reload.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 
     <constant name="struts.configuration.xml.reload" value="true" />
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-inheritance.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-inheritance.xml
index 5e0f97c..8d6300e 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-inheritance.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-inheritance.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-beans.xml" />
     <package name="default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-names.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-names.xml
index e00fd3c..4e5b93f 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-names.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-names.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <include file="xwork-test-beans.xml" />
     <package name="default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-types.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-types.xml
index 569488e..5bfcaee 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-types.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-result-types.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <include file="xwork-test-beans.xml"/>
     <package name="xworkResultTypesTestPackage1">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-results.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-results.xml
index 76363a7..a4f279e 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-results.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-results.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-beans.xml" />
     <package name="default">
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-wildcard-1.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-wildcard-1.xml
index b447dd6..7625286 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-wildcard-1.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-wildcard-1.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <package name="default-1" />
 </struts>
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-wildcard-2.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-wildcard-2.xml
index 3ffb56b..1bab2a1 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-wildcard-2.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-wildcard-2.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <package name="default-2" />
 </struts>
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-wildcard-include.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-wildcard-include.xml
index 60a69c2..2d7003f 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-wildcard-include.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-wildcard-include.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <include file="xwork-test-beans.xml" />
     <include file="com/opensymphony/xwork2/config/providers/xwork-test-wildcard-*.xml" />
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-unknownhandler-stack-empty.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-unknownhandler-stack-empty.xml
index 4ec37d6..7073d94 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-unknownhandler-stack-empty.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-unknownhandler-stack-empty.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <bean type="com.opensymphony.xwork2.UnknownHandler" name="uh1" class="com.opensymphony.xwork2.config.providers.SomeUnknownHandler"/>
     <bean type="com.opensymphony.xwork2.UnknownHandler" name="uh2" class="com.opensymphony.xwork2.config.providers.SomeUnknownHandler"/>
diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-unknownhandler-stack.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-unknownhandler-stack.xml
index 6cf8010..ea0be85 100644
--- a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-unknownhandler-stack.xml
+++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-unknownhandler-stack.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <bean type="com.opensymphony.xwork2.UnknownHandler" name="uh1" class="com.opensymphony.xwork2.config.providers.SomeUnknownHandler"/>
     <bean type="com.opensymphony.xwork2.UnknownHandler" name="uh2" class="com.opensymphony.xwork2.config.providers.SomeUnknownHandler"/>
diff --git a/core/src/test/resources/includeTest.xml b/core/src/test/resources/includeTest.xml
index 16ff280..455834f 100644
--- a/core/src/test/resources/includeTest.xml
+++ b/core/src/test/resources/includeTest.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <package name="includeTest" extends="default" namespace="includeTest">
         <action name="includeTest" class="com.opensymphony.xwork2.SimpleAction"></action>
diff --git a/core/src/test/resources/org/apache/struts2/views/jsp/ui/Submit-13.txt b/core/src/test/resources/org/apache/struts2/views/jsp/ui/Submit-13.txt
new file mode 100644
index 0000000..9394631
--- /dev/null
+++ b/core/src/test/resources/org/apache/struts2/views/jsp/ui/Submit-13.txt
@@ -0,0 +1 @@
+<input type="submit" value="Save" id="entryEdit_saveDraft" name="entryEdit!saveDraft"/>
diff --git a/core/src/test/resources/org/apache/struts2/views/jsp/ui/Submit-14.txt b/core/src/test/resources/org/apache/struts2/views/jsp/ui/Submit-14.txt
new file mode 100644
index 0000000..481c547
--- /dev/null
+++ b/core/src/test/resources/org/apache/struts2/views/jsp/ui/Submit-14.txt
@@ -0,0 +1 @@
+<input type="submit" value="Save" id="mainAction_saveDraft" name="action:mainAction!saveDraft"/>
diff --git a/core/src/test/resources/struts-object-factory-result-builder.xml b/core/src/test/resources/struts-object-factory-result-builder.xml
index a76b6f7..76b872f 100644
--- a/core/src/test/resources/struts-object-factory-result-builder.xml
+++ b/core/src/test/resources/struts-object-factory-result-builder.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 
diff --git a/core/src/test/resources/struts-testing.xml b/core/src/test/resources/struts-testing.xml
index 62023b2..f1af997 100644
--- a/core/src/test/resources/struts-testing.xml
+++ b/core/src/test/resources/struts-testing.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-          "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-          "https://struts.apache.org/dtds/struts-2.5.dtd">
+          "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+          "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <include file="struts-default.xml"/>
     <package name="default" extends="struts-default" namespace="/">
diff --git a/core/src/test/resources/xwork-class-param-test.xml b/core/src/test/resources/xwork-class-param-test.xml
index 74161ea..c0f3273 100644
--- a/core/src/test/resources/xwork-class-param-test.xml
+++ b/core/src/test/resources/xwork-class-param-test.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 
     <constant name="struts.devMode" value="true" />
diff --git a/core/src/test/resources/xwork-param-test.xml b/core/src/test/resources/xwork-param-test.xml
index 8eed0b5..2affaac 100644
--- a/core/src/test/resources/xwork-param-test.xml
+++ b/core/src/test/resources/xwork-param-test.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <constant name="struts.devMode" value="true" />
     <constant name="struts.excludedClasses" value="java.lang.Object,java.lang.Runtime" />
diff --git a/core/src/test/resources/xwork-proxyinvoke.xml b/core/src/test/resources/xwork-proxyinvoke.xml
index 3e95e62..ca2555e 100644
--- a/core/src/test/resources/xwork-proxyinvoke.xml
+++ b/core/src/test/resources/xwork-proxyinvoke.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <bean type="com.opensymphony.xwork2.ObjectFactory" name="default" class="com.opensymphony.xwork2.ProxyObjectFactory" />
 
diff --git a/core/src/test/resources/xwork-sample.xml b/core/src/test/resources/xwork-sample.xml
index c310234..4e62f4c 100644
--- a/core/src/test/resources/xwork-sample.xml
+++ b/core/src/test/resources/xwork-sample.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <include file="xwork-test-default.xml"/>
     <package name="default" extends="xwork-test-default">
diff --git a/core/src/test/resources/xwork-test-beans.xml b/core/src/test/resources/xwork-test-beans.xml
index c88a349..dca7091 100644
--- a/core/src/test/resources/xwork-test-beans.xml
+++ b/core/src/test/resources/xwork-test-beans.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 
     <constant name="struts.excludedClasses" value="java.lang.Object,java.lang.Runtime,ognl.OgnlContext,ognl.MemberAccess,ognl.ClassResolver,ognl.TypeConverter,com.opensymphony.xwork2.ognl.SecurityMemberAccess" />
diff --git a/core/src/test/resources/xwork-test-default.xml b/core/src/test/resources/xwork-test-default.xml
index d9f6ddd..95da09c 100644
--- a/core/src/test/resources/xwork-test-default.xml
+++ b/core/src/test/resources/xwork-test-default.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <package name="xwork-test-default">
         <result-types>
diff --git a/core/src/test/resources/xwork-test-validation.xml b/core/src/test/resources/xwork-test-validation.xml
index b58c661..90721d7 100644
--- a/core/src/test/resources/xwork-test-validation.xml
+++ b/core/src/test/resources/xwork-test-validation.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<include file="xwork-test-beans.xml" />
     <package name="xwork-test-default">
diff --git a/plugins/async/src/main/resources/struts-plugin.xml b/plugins/async/src/main/resources/struts-plugin.xml
index da2aee8..012c505 100644
--- a/plugins/async/src/main/resources/struts-plugin.xml
+++ b/plugins/async/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <bean type="com.opensymphony.xwork2.AsyncManager" name="default"
diff --git a/plugins/bean-validation/src/main/resources/struts-plugin.xml b/plugins/bean-validation/src/main/resources/struts-plugin.xml
index 69e4c51..326be2f 100644
--- a/plugins/bean-validation/src/main/resources/struts-plugin.xml
+++ b/plugins/bean-validation/src/main/resources/struts-plugin.xml
@@ -21,8 +21,8 @@
 -->
 
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <constant name="struts.beanValidation.providerClass" value=""/>
diff --git a/plugins/bean-validation/src/test/resources/bean-validation-test.xml b/plugins/bean-validation/src/test/resources/bean-validation-test.xml
index bd5716c..2f1728d 100644
--- a/plugins/bean-validation/src/test/resources/bean-validation-test.xml
+++ b/plugins/bean-validation/src/test/resources/bean-validation-test.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <constant name="struts.beanValidation.providerClass" value="org.hibernate.validator.HibernateValidator"/>
     <constant name="struts.beanValidation.ignoreXMLConfiguration" value="false"/>
diff --git a/plugins/cdi/src/main/resources/struts-plugin.xml b/plugins/cdi/src/main/resources/struts-plugin.xml
index b969296..a17a81e 100644
--- a/plugins/cdi/src/main/resources/struts-plugin.xml
+++ b/plugins/cdi/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 
diff --git a/plugins/config-browser/src/main/resources/struts-plugin.xml b/plugins/config-browser/src/main/resources/struts-plugin.xml
index b2187d4..6cdb0ec 100644
--- a/plugins/config-browser/src/main/resources/struts-plugin.xml
+++ b/plugins/config-browser/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 
diff --git a/plugins/convention/src/main/resources/struts-plugin.xml b/plugins/convention/src/main/resources/struts-plugin.xml
index 6cd8b04..c80ca9b 100644
--- a/plugins/convention/src/main/resources/struts-plugin.xml
+++ b/plugins/convention/src/main/resources/struts-plugin.xml
@@ -21,8 +21,8 @@
 -->
 
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts order="20">
   <bean type="com.opensymphony.xwork2.UnknownHandler" name="convention" class="org.apache.struts2.convention.ConventionUnknownHandler"/>
diff --git a/plugins/embeddedjsp/src/main/resources/struts-plugin.xml b/plugins/embeddedjsp/src/main/resources/struts-plugin.xml
index 1651b3f..4df5875 100644
--- a/plugins/embeddedjsp/src/main/resources/struts-plugin.xml
+++ b/plugins/embeddedjsp/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */

 -->

 <!DOCTYPE struts PUBLIC

-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"

-	"https://struts.apache.org/dtds/struts-2.5.dtd">

+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"

+	"https://struts.apache.org/dtds/struts-6.0.dtd">

 

 <struts>

     <package name="embeddedjsp-default" extends="struts-default" abstract="true">

diff --git a/plugins/gxp/src/main/resources/struts-plugin.xml b/plugins/gxp/src/main/resources/struts-plugin.xml
index dd39530..e14ea03 100644
--- a/plugins/gxp/src/main/resources/struts-plugin.xml
+++ b/plugins/gxp/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */

 -->

 <!DOCTYPE struts PUBLIC

-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"

-	"https://struts.apache.org/dtds/struts-2.5.dtd">

+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"

+	"https://struts.apache.org/dtds/struts-6.0.dtd">

 

 <struts>

     <bean type="org.apache.struts2.views.gxp.inject.InjectedObjectContainer" class="org.apache.struts2.views.gxp.inject.InjectedObjectContainer" static="true" />

diff --git a/plugins/jasperreports/src/main/resources/struts-plugin.xml b/plugins/jasperreports/src/main/resources/struts-plugin.xml
index e992091..dee8ffd 100644
--- a/plugins/jasperreports/src/main/resources/struts-plugin.xml
+++ b/plugins/jasperreports/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <package name="jasperreports-default" extends="struts-default">
diff --git a/plugins/javatemplates/src/main/resources/struts-plugin.xml b/plugins/javatemplates/src/main/resources/struts-plugin.xml
index 5ca258c..d4ae225 100644
--- a/plugins/javatemplates/src/main/resources/struts-plugin.xml
+++ b/plugins/javatemplates/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 
diff --git a/plugins/jfreechart/src/main/resources/struts-plugin.xml b/plugins/jfreechart/src/main/resources/struts-plugin.xml
index 68506ab..e692f44 100644
--- a/plugins/jfreechart/src/main/resources/struts-plugin.xml
+++ b/plugins/jfreechart/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <package name="jfreechart-default" extends="struts-default">
diff --git a/plugins/json/src/main/resources/struts-plugin.xml b/plugins/json/src/main/resources/struts-plugin.xml
index a20a592..1291246 100644
--- a/plugins/json/src/main/resources/struts-plugin.xml
+++ b/plugins/json/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <bean type="org.apache.struts2.json.JSONWriter" name="struts" class="org.apache.struts2.json.DefaultJSONWriter"
diff --git a/plugins/junit/src/test/resources/struts-convention-configuration.xml b/plugins/junit/src/test/resources/struts-convention-configuration.xml
index df72927..1c3768b 100644
--- a/plugins/junit/src/test/resources/struts-convention-configuration.xml
+++ b/plugins/junit/src/test/resources/struts-convention-configuration.xml
@@ -21,8 +21,8 @@
 -->
 
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 
diff --git a/plugins/osgi/src/main/resources/struts-plugin.xml b/plugins/osgi/src/main/resources/struts-plugin.xml
index 22c1cd4..738f8b8 100644
--- a/plugins/osgi/src/main/resources/struts-plugin.xml
+++ b/plugins/osgi/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts order="10">
     <constant name="struts.objectFactory" value="osgi" />
diff --git a/plugins/oval/src/main/resources/struts-plugin.xml b/plugins/oval/src/main/resources/struts-plugin.xml
index da21088..9b56b8e 100644
--- a/plugins/oval/src/main/resources/struts-plugin.xml
+++ b/plugins/oval/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 
diff --git a/plugins/oval/src/test/resources/oval-test.xml b/plugins/oval/src/test/resources/oval-test.xml
index e4a69b5..0cade6a 100644
--- a/plugins/oval/src/test/resources/oval-test.xml
+++ b/plugins/oval/src/test/resources/oval-test.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
     <bean type="org.apache.struts2.oval.interceptor.OValValidationManager"
           class="org.apache.struts2.oval.interceptor.DummyDefaultOValValidationManager"/>
diff --git a/plugins/pell-multipart/src/main/resources/struts-plugin.xml b/plugins/pell-multipart/src/main/resources/struts-plugin.xml
index a9fc10b..2640ad4 100644
--- a/plugins/pell-multipart/src/main/resources/struts-plugin.xml
+++ b/plugins/pell-multipart/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="pell" class="org.apache.struts2.dispatcher.multipart.PellMultiPartRequest" />
diff --git a/plugins/plexus/src/main/resources/struts-plugin.xml b/plugins/plexus/src/main/resources/struts-plugin.xml
index 43e2035..7059b0f 100644
--- a/plugins/plexus/src/main/resources/struts-plugin.xml
+++ b/plugins/plexus/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <bean type="com.opensymphony.xwork2.ObjectFactory" name="plexus" class="org.apache.struts2.plexus.PlexusObjectFactory" />
diff --git a/plugins/portlet-tiles/src/main/resources/struts-plugin.xml b/plugins/portlet-tiles/src/main/resources/struts-plugin.xml
index b7ad6ce..9aa82ca 100644
--- a/plugins/portlet-tiles/src/main/resources/struts-plugin.xml
+++ b/plugins/portlet-tiles/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 
diff --git a/plugins/portlet/src/main/resources/struts-plugin.xml b/plugins/portlet/src/main/resources/struts-plugin.xml
index a664797..9e319ea 100644
--- a/plugins/portlet/src/main/resources/struts-plugin.xml
+++ b/plugins/portlet/src/main/resources/struts-plugin.xml
@@ -21,8 +21,8 @@
 -->

 

 <!DOCTYPE struts PUBLIC

-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"

-        "https://struts.apache.org/dtds/struts-2.5.dtd">

+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"

+        "https://struts.apache.org/dtds/struts-6.0.dtd">

 

 <struts>

 

diff --git a/plugins/portlet/src/test/resources/struts.xml b/plugins/portlet/src/test/resources/struts.xml
index afd0d9a..82cac42 100644
--- a/plugins/portlet/src/test/resources/struts.xml
+++ b/plugins/portlet/src/test/resources/struts.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 
diff --git a/plugins/rest/src/main/resources/struts-plugin.xml b/plugins/rest/src/main/resources/struts-plugin.xml
index 589d12c..f680489 100644
--- a/plugins/rest/src/main/resources/struts-plugin.xml
+++ b/plugins/rest/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 
diff --git a/plugins/sitemesh/src/main/resources/struts-plugin.xml b/plugins/sitemesh/src/main/resources/struts-plugin.xml
index bad62b8..694e393 100644
--- a/plugins/sitemesh/src/main/resources/struts-plugin.xml
+++ b/plugins/sitemesh/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <bean class="org.apache.struts2.sitemesh.FreemarkerPageFilter" static="true" optional="true"/>
diff --git a/plugins/spring/src/main/resources/struts-plugin.xml b/plugins/spring/src/main/resources/struts-plugin.xml
index 7a54620..33f68db 100644
--- a/plugins/spring/src/main/resources/struts-plugin.xml
+++ b/plugins/spring/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
diff --git a/plugins/spring/src/test/resources/com/opensymphony/xwork2/spring/actionContext-xwork.xml b/plugins/spring/src/test/resources/com/opensymphony/xwork2/spring/actionContext-xwork.xml
index 6364747..c454bac 100644
--- a/plugins/spring/src/test/resources/com/opensymphony/xwork2/spring/actionContext-xwork.xml
+++ b/plugins/spring/src/test/resources/com/opensymphony/xwork2/spring/actionContext-xwork.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-        "https://struts.apache.org/dtds/struts-2.5.dtd">
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
 <struts>
 	<bean type="com.opensymphony.xwork2.ObjectFactory" class="com.opensymphony.xwork2.spring.SpringObjectFactory" />
 	<constant name="applicationContextPath" value="com/opensymphony/xwork2/spring/actionContext-spring.xml" />
diff --git a/plugins/tiles/src/main/resources/struts-plugin.xml b/plugins/tiles/src/main/resources/struts-plugin.xml
index 9ae060a..09d33f5 100644
--- a/plugins/tiles/src/main/resources/struts-plugin.xml
+++ b/plugins/tiles/src/main/resources/struts-plugin.xml
@@ -20,8 +20,8 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
-	"https://struts.apache.org/dtds/struts-2.5.dtd">
+	"-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+	"https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
     <package name="tiles-default" extends="struts-default">
diff --git a/plugins/velocity/src/main/resources/struts-deferred.xml b/plugins/velocity/src/main/resources/struts-deferred.xml
new file mode 100644
index 0000000..914a649
--- /dev/null
+++ b/plugins/velocity/src/main/resources/struts-deferred.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+-->
+<!DOCTYPE struts PUBLIC
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
+
+<struts>
+
+    <bean-selection name="velocityBeans" class="org.apache.struts2.views.velocity.VelocityBeanSelectionProvider"/>
+
+</struts>
diff --git a/plugins/velocity/src/main/resources/struts-plugin.xml b/plugins/velocity/src/main/resources/struts-plugin.xml
index 48ae45b..7630d41 100644
--- a/plugins/velocity/src/main/resources/struts-plugin.xml
+++ b/plugins/velocity/src/main/resources/struts-plugin.xml
@@ -39,6 +39,4 @@
         </result-types>
     </package>
 
-    <bean-selection name="velocityBeans" class="org.apache.struts2.views.velocity.VelocityBeanSelectionProvider"/>
-
 </struts>
diff --git a/pom.xml b/pom.xml
index 3390e9f..1b22a1c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -116,7 +116,7 @@
         <log4j2.version>2.19.0</log4j2.version>
         <ognl.version>3.3.4</ognl.version>
         <slf4j.version>1.7.32</slf4j.version>
-        <spring.platformVersion>5.3.26</spring.platformVersion>
+        <spring.platformVersion>5.3.27</spring.platformVersion>
         <tiles.version>3.0.8</tiles.version>
         <tiles-request.version>1.0.7</tiles-request.version>
         <maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version>