Merge pull request #384 from apache/WW-5049-velocity-plugin

[WW-5049] Velocity plugin
diff --git a/apps/showcase/pom.xml b/apps/showcase/pom.xml
index c0b9023..99bceb7 100644
--- a/apps/showcase/pom.xml
+++ b/apps/showcase/pom.xml
@@ -95,6 +95,11 @@
         </dependency>
 
         <dependency>
+            <groupId>org.apache.struts</groupId>
+            <artifactId>struts2-velocity-plugin</artifactId>
+        </dependency>
+
+        <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>servlet-api</artifactId>
             <scope>provided</scope>
diff --git a/apps/showcase/src/main/resources/struts-tags-ui.xml b/apps/showcase/src/main/resources/struts-tags-ui.xml
index 69b9bda..13e33d6 100644
--- a/apps/showcase/src/main/resources/struts-tags-ui.xml
+++ b/apps/showcase/src/main/resources/struts-tags-ui.xml
@@ -24,7 +24,7 @@
 	"http://struts.apache.org/dtds/struts-2.5.dtd">
 
 <struts>
-    <package name="ui-tags" extends="struts-default" namespace="/tags/ui">
+    <package name="ui-tags" extends="velocity-default" namespace="/tags/ui">
         <action name="example" class="org.apache.struts2.showcase.UITagExample">
             <result>/WEB-INF/tags/ui/example.jsp</result>
             <result name="input">/WEB-INF/tags/ui/example.jsp</result>
diff --git a/assembly/src/main/assembly/all.xml b/assembly/src/main/assembly/all.xml
index 36ca3f5..0c08b48 100644
--- a/assembly/src/main/assembly/all.xml
+++ b/assembly/src/main/assembly/all.xml
@@ -209,6 +209,10 @@
         <directory>../plugins/tiles/target/apidocs</directory>
         <outputDirectory>docs/struts2-plugins/struts2-tiles-plugin/apidocs</outputDirectory>
       </fileSet>
+      <fileSet>
+        <directory>../plugins/velocity/target/apidocs</directory>
+        <outputDirectory>docs/struts2-plugins/struts2-velocity-plugin/apidocs</outputDirectory>
+      </fileSet>
 
     <!-- bundles -->
     <fileSet>
diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
index 24d388e..ce1587d 100644
--- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
+++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProvider.java
@@ -22,6 +22,7 @@
 import com.opensymphony.xwork2.FileManager;
 import com.opensymphony.xwork2.FileManagerFactory;
 import com.opensymphony.xwork2.ObjectFactory;
+import com.opensymphony.xwork2.config.BeanSelectionProvider;
 import com.opensymphony.xwork2.config.Configuration;
 import com.opensymphony.xwork2.config.ConfigurationException;
 import com.opensymphony.xwork2.config.ConfigurationProvider;
@@ -116,6 +117,7 @@
         this.errorIfMissing = errorIfMissing;
 
         Map<String, String> mappings = new HashMap<>();
+        mappings.put("-//Apache Struts//XWork 2.6//EN", "xwork-2.6.dtd");
         mappings.put("-//Apache Struts//XWork 2.5//EN", "xwork-2.5.dtd");
         mappings.put("-//Apache Struts//XWork 2.3//EN", "xwork-2.3.dtd");
         mappings.put("-//Apache Struts//XWork 2.1.3//EN", "xwork-2.1.3.dtd");
@@ -219,14 +221,28 @@
 
                     final String nodeName = child.getNodeName();
 
-                    if ("bean".equals(nodeName)) {
+                    if ("bean-selection".equals(nodeName)) {
+                        String name = child.getAttribute("name");
+                        String impl = child.getAttribute("class");
+                        try {
+                            Class classImpl = ClassLoaderUtil.loadClass(impl, getClass());
+                            if (BeanSelectionProvider.class.isAssignableFrom(classImpl)) {
+                                BeanSelectionProvider provider = (BeanSelectionProvider) classImpl.newInstance();
+                                provider.register(containerBuilder, props);
+                            } else {
+                                throw new ConfigurationException("The bean-provider: name:" + name + " class:" + impl + " does not implement " + BeanSelectionProvider.class.getName(), childNode);
+                            }
+                        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
+                            throw new ConfigurationException("Unable to load bean-provider: name:" + name + " class:" + impl, e, childNode);
+                        }
+                    } else if ("bean".equals(nodeName)) {
                         String type = child.getAttribute("type");
                         String name = child.getAttribute("name");
                         String impl = child.getAttribute("class");
                         String onlyStatic = child.getAttribute("static");
                         String scopeStr = child.getAttribute("scope");
                         boolean optional = "true".equals(child.getAttribute("optional"));
-                        Scope scope = Scope.SINGLETON;
+                        Scope scope;
                         if ("prototype".equals(scopeStr)) {
                             scope = Scope.PROTOTYPE;
                         } else if ("request".equals(scopeStr)) {
@@ -237,6 +253,8 @@
                             scope = Scope.SINGLETON;
                         } else if ("thread".equals(scopeStr)) {
                             scope = Scope.THREAD;
+                        } else {
+                            scope = Scope.SINGLETON;
                         }
 
                         if (StringUtils.isEmpty(name)) {
diff --git a/core/src/main/java/org/apache/struts2/StrutsConstants.java b/core/src/main/java/org/apache/struts2/StrutsConstants.java
index 3f9da83..2d12095 100644
--- a/core/src/main/java/org/apache/struts2/StrutsConstants.java
+++ b/core/src/main/java/org/apache/struts2/StrutsConstants.java
@@ -102,9 +102,6 @@
     
     /** Maximum strong sizing for MruCacheStorage for freemarker */
     public static final String STRUTS_FREEMARKER_MRU_MAX_STRONG_SIZE = "struts.freemarker.mru.max.strong.size";
-    
-    /** org.apache.struts2.views.velocity.VelocityManager implementation class */
-    public static final String STRUTS_VELOCITY_MANAGER_CLASSNAME = "struts.velocity.manager.classname";
 
     /** The Velocity configuration file path */
     public static final String STRUTS_VELOCITY_CONFIGFILE = "struts.velocity.configfile";
diff --git a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java b/core/src/main/java/org/apache/struts2/config/StrutsBeanSelectionProvider.java
similarity index 98%
rename from core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java
rename to core/src/main/java/org/apache/struts2/config/StrutsBeanSelectionProvider.java
index 0ebe8cd..2551f77 100644
--- a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java
+++ b/core/src/main/java/org/apache/struts2/config/StrutsBeanSelectionProvider.java
@@ -67,7 +67,6 @@
 import org.apache.struts2.util.ContentTypeMatcher;
 import org.apache.struts2.views.freemarker.FreemarkerManager;
 import org.apache.struts2.views.util.UrlHelper;
-import org.apache.struts2.views.velocity.VelocityManager;
 
 /**
  * Selects the implementations of key framework extension points, using the loaded
@@ -365,9 +364,7 @@
  *   <li><code>struts.configuration.xml.reload = true</code></li>
  * </ul>
  */
-public class DefaultBeanSelectionProvider extends AbstractBeanSelectionProvider {
-
-    private static final Logger LOG = LogManager.getLogger(DefaultBeanSelectionProvider.class);
+public class StrutsBeanSelectionProvider extends AbstractBeanSelectionProvider {
 
     public void register(ContainerBuilder builder, LocatableProperties props) {
         alias(ObjectFactory.class, StrutsConstants.STRUTS_OBJECTFACTORY, builder, props);
@@ -404,7 +401,6 @@
         alias(ActionMapper.class, StrutsConstants.STRUTS_MAPPER_CLASS, builder, props);
         alias(MultiPartRequest.class, StrutsConstants.STRUTS_MULTIPART_PARSER, builder, props, Scope.PROTOTYPE);
         alias(FreemarkerManager.class, StrutsConstants.STRUTS_FREEMARKER_MANAGER_CLASSNAME, builder, props);
-        alias(VelocityManager.class, StrutsConstants.STRUTS_VELOCITY_MANAGER_CLASSNAME, builder, props);
         alias(UrlRenderer.class, StrutsConstants.STRUTS_URL_RENDERER, builder, props);
         alias(ActionValidatorManager.class, StrutsConstants.STRUTS_ACTIONVALIDATORMANAGER, builder, props);
         alias(ValueStackFactory.class, StrutsConstants.STRUTS_VALUESTACKFACTORY, builder, props);
diff --git a/core/src/main/java/org/apache/struts2/config/StrutsJavaConfiguration.java b/core/src/main/java/org/apache/struts2/config/StrutsJavaConfiguration.java
index da84d5e..1129304 100644
--- a/core/src/main/java/org/apache/struts2/config/StrutsJavaConfiguration.java
+++ b/core/src/main/java/org/apache/struts2/config/StrutsJavaConfiguration.java
@@ -19,8 +19,10 @@
 package org.apache.struts2.config;
 
 import java.util.List;
+import java.util.Optional;
 
 import org.apache.struts2.config.entities.BeanConfig;
+import org.apache.struts2.config.entities.BeanSelectionConfig;
 import org.apache.struts2.config.entities.ConstantConfig;
 
 public interface StrutsJavaConfiguration {
@@ -28,5 +30,7 @@
 
     List<ConstantConfig> constants();
 
+    default Optional<BeanSelectionConfig> beanSelection() { return Optional.empty();}
+
     List<String> unknownHandlerStack();
 }
diff --git a/core/src/main/java/org/apache/struts2/config/StrutsJavaConfigurationProvider.java b/core/src/main/java/org/apache/struts2/config/StrutsJavaConfigurationProvider.java
index 5aaaf57..7538ea3 100644
--- a/core/src/main/java/org/apache/struts2/config/StrutsJavaConfigurationProvider.java
+++ b/core/src/main/java/org/apache/struts2/config/StrutsJavaConfigurationProvider.java
@@ -24,9 +24,12 @@
 import java.util.Map;
 import java.util.Map.Entry;
 
+import com.opensymphony.xwork2.config.BeanSelectionProvider;
+import com.opensymphony.xwork2.util.ClassLoaderUtil;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.struts2.config.entities.BeanConfig;
+import org.apache.struts2.config.entities.BeanSelectionConfig;
 import org.apache.struts2.config.entities.ConstantConfig;
 
 import com.opensymphony.xwork2.config.Configuration;
@@ -91,6 +94,20 @@
             }
         }
 
+        // bean-selection
+        javaConfig.beanSelection().ifPresent(beanSelectionConfig -> {
+            try {
+                LOG.debug("Registering bean selection provider {} of type {}",
+                    beanSelectionConfig.getName(), beanSelectionConfig.getClazz().getName());
+
+                BeanSelectionProvider provider = beanSelectionConfig.getClazz().newInstance();
+                provider.register(builder, props);
+            } catch (IllegalAccessException | InstantiationException e) {
+                throw new ConfigurationException("Unable to load : name:" + beanSelectionConfig.getName()
+                    + " class:" + beanSelectionConfig.getClazz().getName());
+            }
+        });
+
         // unknown-handler-stack
         List<String> unknownHandlers = javaConfig.unknownHandlerStack();
         if (unknownHandlers != null) {
@@ -125,10 +142,10 @@
             } else {
                 if (containerBuilder.contains(beanConf.getType(), beanConf.getName())) {
                     Location loc = LocationUtils
-                            .getLocation(loadedBeans.get(beanConf.getType().getName() + beanConf.getName()));
+                        .getLocation(loadedBeans.get(beanConf.getType().getName() + beanConf.getName()));
                     if (throwExceptionOnDuplicateBeans) {
                         throw new ConfigurationException("Bean type " + beanConf.getType() + " with the name "
-                                + beanConf.getName() + " has already been loaded by " + loc, javaConfig);
+                            + beanConf.getName() + " has already been loaded by " + loc, javaConfig);
                     }
                 }
 
@@ -137,17 +154,21 @@
                 beanConf.getClazz().getDeclaredConstructors();
 
                 LOG.debug("Loaded type: {} name: {} clazz: {}", beanConf.getType(), beanConf.getName(),
-                        beanConf.getClazz());
+                    beanConf.getClazz());
+
                 containerBuilder.factory(
-                        beanConf.getType(), beanConf.getName(), new LocatableFactory(beanConf.getName(),
-                                beanConf.getType(), beanConf.getClazz(), beanConf.getScope(), javaConfig),
-                        beanConf.getScope());
+                    beanConf.getType(),
+                    beanConf.getName(),
+                    new LocatableFactory(
+                        beanConf.getName(), beanConf.getType(), beanConf.getClazz(), beanConf.getScope(), javaConfig
+                    ),
+                    beanConf.getScope());
             }
             loadedBeans.put(beanConf.getType().getName() + beanConf.getName(), javaConfig);
         } catch (Throwable ex) {
             if (!beanConf.isOptional()) {
                 throw new ConfigurationException(
-                        "Unable to load bean: type:" + beanConf.getType() + " class:" + beanConf.getClazz(), ex);
+                    "Unable to load bean: type:" + beanConf.getType() + " class:" + beanConf.getClazz(), ex);
             } else {
                 LOG.debug("Unable to load optional class: {}", beanConf.getClazz());
             }
diff --git a/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java b/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java
index ef27b6c..5f4bf9e 100644
--- a/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java
+++ b/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java
@@ -73,6 +73,7 @@
         dtdMappings.put("-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN", "struts-2.1.7.dtd");
         dtdMappings.put("-//Apache Software Foundation//DTD Struts Configuration 2.3//EN", "struts-2.3.dtd");
         dtdMappings.put("-//Apache Software Foundation//DTD Struts Configuration 2.5//EN", "struts-2.5.dtd");
+        dtdMappings.put("-//Apache Software Foundation//DTD Struts Configuration 2.6//EN", "struts-2.6.dtd");
         setDtdMappings(dtdMappings);
         File file = new File(filename);
         if (file.getParent() != null) {
diff --git a/core/src/main/java/org/apache/struts2/config/entities/BeanSelectionConfig.java b/core/src/main/java/org/apache/struts2/config/entities/BeanSelectionConfig.java
new file mode 100644
index 0000000..dfa7697
--- /dev/null
+++ b/core/src/main/java/org/apache/struts2/config/entities/BeanSelectionConfig.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.config.entities;
+
+import com.opensymphony.xwork2.config.BeanSelectionProvider;
+import com.opensymphony.xwork2.inject.Container;
+
+public class BeanSelectionConfig {
+
+    private final Class<? extends BeanSelectionProvider> clazz;
+    private final String name;
+
+    public BeanSelectionConfig(Class<? extends BeanSelectionProvider> clazz) {
+        this(clazz, Container.DEFAULT_NAME);
+    }
+
+    public BeanSelectionConfig(Class<? extends BeanSelectionProvider> clazz, String name) {
+        this.clazz = clazz;
+        this.name = name;
+    }
+
+    public Class<? extends BeanSelectionProvider> getClazz() {
+        return clazz;
+    }
+
+    public String getName() {
+        return name;
+    }
+}
diff --git a/core/src/main/java/org/apache/struts2/config/entities/ConstantConfig.java b/core/src/main/java/org/apache/struts2/config/entities/ConstantConfig.java
index d92ce00..904296f 100644
--- a/core/src/main/java/org/apache/struts2/config/entities/ConstantConfig.java
+++ b/core/src/main/java/org/apache/struts2/config/entities/ConstantConfig.java
@@ -185,7 +185,6 @@
         map.put(StrutsConstants.STRUTS_FREEMARKER_TEMPLATES_CACHE_UPDATE_DELAY, freemarkerTemplatesCacheUpdateDelay);
         map.put(StrutsConstants.STRUTS_FREEMARKER_BEANWRAPPER_CACHE, Objects.toString(freemarkerBeanwrapperCache, null));
         map.put(StrutsConstants.STRUTS_FREEMARKER_MRU_MAX_STRONG_SIZE, Objects.toString(freemarkerMruMaxStrongSize, null));
-        map.put(StrutsConstants.STRUTS_VELOCITY_MANAGER_CLASSNAME, beanConfToString(velocityManagerClassname));
         map.put(StrutsConstants.STRUTS_VELOCITY_CONFIGFILE, velocityConfigfile);
         map.put(StrutsConstants.STRUTS_VELOCITY_TOOLBOXLOCATION, velocityToolboxlocation);
         map.put(StrutsConstants.STRUTS_VELOCITY_CONTEXTS, StringUtils.join(velocityContexts, ','));
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 575de94..27d025b 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
@@ -44,7 +44,7 @@
 import org.apache.struts2.StrutsConstants;
 import org.apache.struts2.StrutsException;
 import org.apache.struts2.StrutsStatics;
-import org.apache.struts2.config.DefaultBeanSelectionProvider;
+import org.apache.struts2.config.StrutsBeanSelectionProvider;
 import org.apache.struts2.config.DefaultPropertiesProvider;
 import org.apache.struts2.config.PropertiesConfigurationProvider;
 import org.apache.struts2.config.StrutsJavaConfiguration;
@@ -481,7 +481,7 @@
     }
 
     private void init_AliasStandardObjects() {
-        configurationManager.addContainerProvider(new DefaultBeanSelectionProvider());
+        configurationManager.addContainerProvider(new StrutsBeanSelectionProvider());
     }
 
     private Container init_PreloadConfiguration() {
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/StaticContentLoader.java b/core/src/main/java/org/apache/struts2/dispatcher/StaticContentLoader.java
index cf4dd47..7859702 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/StaticContentLoader.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/StaticContentLoader.java
@@ -1,59 +1,61 @@
-/*

- * Licensed to the Apache Software Foundation (ASF) under one

- * or more contributor license agreements.  See the NOTICE file

- * distributed with this work for additional information

- * regarding copyright ownership.  The ASF licenses this file

- * to you under the Apache License, Version 2.0 (the

- * "License"); you may not use this file except in compliance

- * with the License.  You may obtain a copy of the License at

- *

- *  http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing,

- * software distributed under the License is distributed on an

- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

- * KIND, either express or implied.  See the License for the

- * specific language governing permissions and limitations

- * under the License.

- */

-package org.apache.struts2.dispatcher;

-

-import javax.servlet.http.HttpServletRequest;

-import javax.servlet.http.HttpServletResponse;

-import java.io.IOException;

-

-/**

- * Interface for loading static resources, based on a path. After implementing your own static content loader

- * you must tell the framework how to use it, eg.

- *

- * &lt;bean name="myContentLoader" type="org.apache.struts2.dispatcher" class="com.company.struts.MyContentLoader"/&gt;

- * &lt;constant name="struts.staticContentLoader" value="myContentLoader"/&gt;

- *

- * Check {@link org.apache.struts2.config.DefaultBeanSelectionProvider} for more details.

- */

-public interface StaticContentLoader {

-

-    /**

-     * @param path Requested resource path

-     * @return true if this loader is able to load this type of resource, false otherwise

-     */

-    public boolean canHandle(String path);

-

-    /**

-     * @param filterConfig The filter configuration

-     */

-    public abstract void setHostConfig(HostConfig filterConfig);

-

-    /**

-     * Locate a static resource and copy directly to the response, setting the

-     * appropriate caching headers.

-     *

-     * @param path     The resource name

-     * @param request  The request

-     * @param response The response

-     * @throws IOException If anything goes wrong

-     */

-    public abstract void findStaticResource(String path, HttpServletRequest request, HttpServletResponse response)

-            throws IOException;

-

-}

+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.dispatcher;
+
+import org.apache.struts2.config.StrutsBeanSelectionProvider;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * Interface for loading static resources, based on a path. After implementing your own static content loader
+ * you must tell the framework how to use it, eg.
+ *
+ * &lt;bean name="myContentLoader" type="org.apache.struts2.dispatcher" class="com.company.struts.MyContentLoader"/&gt;
+ * &lt;constant name="struts.staticContentLoader" value="myContentLoader"/&gt;
+ *
+ * Check {@link StrutsBeanSelectionProvider} for more details.
+ */
+public interface StaticContentLoader {
+
+    /**
+     * @param path Requested resource path
+     * @return true if this loader is able to load this type of resource, false otherwise
+     */
+    public boolean canHandle(String path);
+
+    /**
+     * @param filterConfig The filter configuration
+     */
+    public abstract void setHostConfig(HostConfig filterConfig);
+
+    /**
+     * Locate a static resource and copy directly to the response, setting the
+     * appropriate caching headers.
+     *
+     * @param path     The resource name
+     * @param request  The request
+     * @param response The response
+     * @throws IOException If anything goes wrong
+     */
+    public abstract void findStaticResource(String path, HttpServletRequest request, HttpServletResponse response)
+            throws IOException;
+
+}
diff --git a/core/src/main/java/org/apache/struts2/views/DefaultTagLibrary.java b/core/src/main/java/org/apache/struts2/views/DefaultTagLibrary.java
index 5a01df3..cab6c40 100644
--- a/core/src/main/java/org/apache/struts2/views/DefaultTagLibrary.java
+++ b/core/src/main/java/org/apache/struts2/views/DefaultTagLibrary.java
@@ -18,55 +18,16 @@
  */
 package org.apache.struts2.views;
 
-import java.util.Arrays;
-import java.util.List;
+import com.opensymphony.xwork2.util.ValueStack;
+import org.apache.struts2.views.freemarker.tags.StrutsModels;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.struts2.views.freemarker.tags.StrutsModels;
-import org.apache.struts2.views.velocity.components.ActionDirective;
-import org.apache.struts2.views.velocity.components.ActionErrorDirective;
-import org.apache.struts2.views.velocity.components.ActionMessageDirective;
-import org.apache.struts2.views.velocity.components.AnchorDirective;
-import org.apache.struts2.views.velocity.components.BeanDirective;
-import org.apache.struts2.views.velocity.components.CheckBoxDirective;
-import org.apache.struts2.views.velocity.components.CheckBoxListDirective;
-import org.apache.struts2.views.velocity.components.ComboBoxDirective;
-import org.apache.struts2.views.velocity.components.ComponentDirective;
-import org.apache.struts2.views.velocity.components.DateDirective;
-import org.apache.struts2.views.velocity.components.DoubleSelectDirective;
-import org.apache.struts2.views.velocity.components.FieldErrorDirective;
-import org.apache.struts2.views.velocity.components.FileDirective;
-import org.apache.struts2.views.velocity.components.FormDirective;
-import org.apache.struts2.views.velocity.components.HeadDirective;
-import org.apache.struts2.views.velocity.components.HiddenDirective;
-import org.apache.struts2.views.velocity.components.I18nDirective;
-import org.apache.struts2.views.velocity.components.IncludeDirective;
-import org.apache.struts2.views.velocity.components.LabelDirective;
-import org.apache.struts2.views.velocity.components.OptionTransferSelectDirective;
-import org.apache.struts2.views.velocity.components.ParamDirective;
-import org.apache.struts2.views.velocity.components.PasswordDirective;
-import org.apache.struts2.views.velocity.components.PropertyDirective;
-import org.apache.struts2.views.velocity.components.PushDirective;
-import org.apache.struts2.views.velocity.components.RadioDirective;
-import org.apache.struts2.views.velocity.components.ResetDirective;
-import org.apache.struts2.views.velocity.components.SelectDirective;
-import org.apache.struts2.views.velocity.components.SetDirective;
-import org.apache.struts2.views.velocity.components.SubmitDirective;
-import org.apache.struts2.views.velocity.components.TextAreaDirective;
-import org.apache.struts2.views.velocity.components.TextDirective;
-import org.apache.struts2.views.velocity.components.TextFieldDirective;
-import org.apache.struts2.views.velocity.components.TokenDirective;
-import org.apache.struts2.views.velocity.components.URLDirective;
-import org.apache.struts2.views.velocity.components.UpDownSelectDirective;
-
-import com.opensymphony.xwork2.util.ValueStack;
-
 /**
  * The default Struts tag library
  */
-public class DefaultTagLibrary implements TagLibraryDirectiveProvider, TagLibraryModelProvider {
+public class DefaultTagLibrary implements TagLibraryModelProvider {
 
     public Object getModels(ValueStack stack, HttpServletRequest req,
                             HttpServletResponse res) {
@@ -74,53 +35,8 @@
         return new StrutsModels(stack, req, res);
     }
 
-    public List<Class> getDirectiveClasses() {
-        Class[] directives = new Class[] {
-            ActionDirective.class,
-            BeanDirective.class,
-            CheckBoxDirective.class,
-            CheckBoxListDirective.class,
-            ComboBoxDirective.class,
-            ComponentDirective.class,
-            DateDirective.class,
-            DoubleSelectDirective.class,
-            FileDirective.class,
-            FormDirective.class,
-            HeadDirective.class,
-            HiddenDirective.class,
-            AnchorDirective.class,
-            I18nDirective.class,
-            IncludeDirective.class,
-            LabelDirective.class,
-            ParamDirective.class,
-            PasswordDirective.class,
-            PushDirective.class,
-            PropertyDirective.class,
-            RadioDirective.class,
-            SelectDirective.class,
-            SetDirective.class,
-            SubmitDirective.class,
-            ResetDirective.class,
-            TextAreaDirective.class,
-            TextDirective.class,
-            TextFieldDirective.class,
-            TokenDirective.class,
-            URLDirective.class,
-            ActionErrorDirective.class,
-            ActionMessageDirective.class,
-            FieldErrorDirective.class,
-            OptionTransferSelectDirective.class,
-            UpDownSelectDirective.class
-        };
-        return Arrays.asList(directives);
-    }
-
     public Object getFreemarkerModels(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
         return getModels(stack, req, res);
     }
 
-    public List<Class> getVelocityDirectiveClasses() {
-        return getDirectiveClasses();
-    }
-
 }
diff --git a/core/src/main/java/org/apache/struts2/views/TagLibraryDirectiveProvider.java b/core/src/main/java/org/apache/struts2/views/TagLibraryDirectiveProvider.java
index 4df60a0..7636846 100644
--- a/core/src/main/java/org/apache/struts2/views/TagLibraryDirectiveProvider.java
+++ b/core/src/main/java/org/apache/struts2/views/TagLibraryDirectiveProvider.java
@@ -36,6 +36,6 @@
      * 
      * @return A list of Velocity directive classes
      */
-    public List<Class> getDirectiveClasses();
+    List<Class> getDirectiveClasses();
 
 }
diff --git a/core/src/main/resources/struts-2.6.dtd b/core/src/main/resources/struts-2.6.dtd
new file mode 100644
index 0000000..964fd69
--- /dev/null
+++ b/core/src/main/resources/struts-2.6.dtd
@@ -0,0 +1,157 @@
+<?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.
+ */
+-->
+<!-- START SNIPPET: strutsDtd -->
+
+<!--
+   Struts configuration DTD.
+   Use the following DOCTYPE
+
+   <!DOCTYPE struts PUBLIC
+	"-//Apache Software Foundation//DTD Struts Configuration 2.6//EN"
+	"http://struts.apache.org/dtds/struts-2.6.dtd">
+-->
+
+<!ELEMENT struts ((package|include|bean|constant)*,bean-selection?, unknown-handler-stack?)>
+<!ATTLIST struts
+    order CDATA #IMPLIED
+>
+
+<!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, default-class-ref?, global-results?, global-allowed-methods?, global-exception-mappings?, action*)>
+<!ATTLIST package
+    name CDATA #REQUIRED
+    extends CDATA #IMPLIED
+    namespace CDATA #IMPLIED
+    abstract CDATA #IMPLIED
+    strict-method-invocation (true|false) "true"
+>
+
+<!ELEMENT result-types (result-type+)>
+
+<!ELEMENT result-type (param*)>
+<!ATTLIST result-type
+    name CDATA #REQUIRED
+    class CDATA #REQUIRED
+    default (true|false) "false"
+>
+
+<!ELEMENT interceptors (interceptor|interceptor-stack)+>
+
+<!ELEMENT interceptor (param*)>
+<!ATTLIST interceptor
+    name CDATA #REQUIRED
+    class CDATA #REQUIRED
+>
+
+<!ELEMENT interceptor-stack (interceptor-ref*)>
+<!ATTLIST interceptor-stack
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT interceptor-ref (param*)>
+<!ATTLIST interceptor-ref
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT default-interceptor-ref (#PCDATA)>
+<!ATTLIST default-interceptor-ref
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT default-action-ref (#PCDATA)>
+<!ATTLIST default-action-ref
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT default-class-ref (#PCDATA)>
+<!ATTLIST default-class-ref
+    class CDATA #REQUIRED
+>
+
+<!ELEMENT global-results (result+)>
+
+<!ELEMENT global-allowed-methods (#PCDATA)>
+
+<!ELEMENT global-exception-mappings (exception-mapping+)>
+
+<!ELEMENT action ((param|result|interceptor-ref|exception-mapping)*,allowed-methods?)>
+<!ATTLIST action
+    name CDATA #REQUIRED
+    class CDATA #IMPLIED
+    method CDATA #IMPLIED
+    converter CDATA #IMPLIED
+>
+
+<!ELEMENT param (#PCDATA)>
+<!ATTLIST param
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT result (#PCDATA|param)*>
+<!ATTLIST result
+    name CDATA #IMPLIED
+    type CDATA #IMPLIED
+>
+
+<!ELEMENT exception-mapping (#PCDATA|param)*>
+<!ATTLIST exception-mapping
+    name CDATA #IMPLIED
+    exception CDATA #REQUIRED
+    result CDATA #REQUIRED
+>
+
+<!ELEMENT allowed-methods (#PCDATA)>
+
+<!ELEMENT include (#PCDATA)>
+<!ATTLIST include
+    file CDATA #REQUIRED
+>
+
+<!ELEMENT bean (#PCDATA)>
+<!ATTLIST bean
+    type CDATA #IMPLIED
+    name CDATA #IMPLIED
+    class CDATA #REQUIRED
+    scope CDATA #IMPLIED
+    static CDATA #IMPLIED
+    optional CDATA #IMPLIED
+>
+
+<!ELEMENT bean-selection (#PCDATA)>
+<!ATTLIST bean-selection
+    name CDATA #IMPLIED
+    class CDATA #IMPLIED
+>
+
+<!ELEMENT constant (#PCDATA)>
+<!ATTLIST constant
+    name CDATA #REQUIRED
+    value CDATA #REQUIRED
+>
+
+<!ELEMENT unknown-handler-stack (unknown-handler-ref*)>
+<!ELEMENT unknown-handler-ref (#PCDATA)>
+<!ATTLIST unknown-handler-ref
+    name CDATA #REQUIRED
+>
+
+<!-- END SNIPPET: strutsDtd -->
+
diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml
index ed850bd..9da9daf 100644
--- a/core/src/main/resources/struts-default.xml
+++ b/core/src/main/resources/struts-default.xml
@@ -23,8 +23,8 @@
 <!--
     When declaring beans in this file you must either use name="struts" or don't name the bean at all.
 
-    The name="struts" must be used when alias was defined in {@link org.apache.struts2.config.DefaultBeanSelectionProvider} -
-    it is then the default bean's name and {@link org.apache.struts2.config.DefaultBeanSelectionProvider} links name "struts"
+    The name="struts" must be used when alias was defined in {@link org.apache.struts2.config.StrutsBeanSelectionProvider} -
+    it is then the default bean's name and {@link org.apache.struts2.config.StrutsBeanSelectionProvider} links name "struts"
     with "default" (aliasing it)
 
     If name won't be defined then the "default" value will be used {@link com.opensymphony.xwork2.inject.Container#DEFAULT_NAME}
@@ -106,16 +106,13 @@
     <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="prototype"/>
     <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta-stream" class="org.apache.struts2.dispatcher.multipart.JakartaStreamMultiPartRequest" scope="prototype"/>
 
-    <bean type="org.apache.struts2.views.TagLibraryDirectiveProvider" name="s" class="org.apache.struts2.views.DefaultTagLibrary" />
     <bean type="org.apache.struts2.views.TagLibraryModelProvider" name="s" class="org.apache.struts2.views.DefaultTagLibrary" />
 
     <bean class="org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader" />
     <bean class="org.apache.struts2.views.freemarker.FreemarkerManager" name="struts" />
-    <bean class="org.apache.struts2.views.velocity.VelocityManager" name="struts" optional="true" />
 
     <bean class="org.apache.struts2.components.template.TemplateEngineManager" />
     <bean type="org.apache.struts2.components.template.TemplateEngine" name="ftl" class="org.apache.struts2.components.template.FreemarkerTemplateEngine" />
-    <bean type="org.apache.struts2.components.template.TemplateEngine" name="vm" class="org.apache.struts2.components.template.VelocityTemplateEngine" />
     <bean type="org.apache.struts2.components.template.TemplateEngine" name="jsp" class="org.apache.struts2.components.template.JspTemplateEngine" />
 
     <bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter" name="struts" class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" />
@@ -201,7 +198,6 @@
             <result-type name="redirect" class="org.apache.struts2.result.ServletRedirectResult"/>
             <result-type name="redirectAction" class="org.apache.struts2.result.ServletActionRedirectResult"/>
             <result-type name="stream" class="org.apache.struts2.result.StreamResult"/>
-            <result-type name="velocity" class="org.apache.struts2.result.VelocityResult"/>
             <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
             <result-type name="plainText" class="org.apache.struts2.result.PlainTextResult" />
             <result-type name="postback" class="org.apache.struts2.result.PostbackResult" />
diff --git a/core/src/main/resources/template/archive/ajax/a-close.vm b/core/src/main/resources/template/archive/ajax/a-close.vm
deleted file mode 100644
index f8c9229..0000000
--- a/core/src/main/resources/template/archive/ajax/a-close.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-</a>
diff --git a/core/src/main/resources/template/archive/ajax/a.vm b/core/src/main/resources/template/archive/ajax/a.vm
deleted file mode 100644
index 83c3501..0000000
--- a/core/src/main/resources/template/archive/ajax/a.vm
+++ /dev/null
@@ -1,33 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<a dojoType="BindAnchor" evalResult="true"
-#if ($parameters.id) id="$!struts.htmlEncode($parameters.id)" #end
-#if ($parameters.href) href="$!struts.htmlEncode($parameters.href)" #end
-#if ($parameters.notifyTopics) notifyTopics="$!struts.htmlEncode($parameters.notifyTopics)" #end
-#if ($parameters.errorText) errorHtml="$!struts.htmlEncode($parameters.errorText)" #end
-#if ($parameters.showErrorTransportText)  showTransportError="true" #end
-#if ($parameters.afterLoading) onLoad="$!parameters.afterLoading" #end
-#if ($parameters.preInvokeJS) preInvokeJS="$!parameters.preInvokeJS" #end
-#if ($parameters.tabindex) tabindex="$!struts.htmlEncode($parameters.tabindex)" #end
-#if ($parameters.cssClass) class="$!struts.htmlEncode($parameters.cssClass)" #end
-#if ($parameters.cssStyle) style="$!struts.htmlEncode($parameters.cssStyle)" #end
-#parse("/$parameters.templateDir/simple/scripting-events.vm")
->
diff --git a/core/src/main/resources/template/archive/ajax/div-close.vm b/core/src/main/resources/template/archive/ajax/div-close.vm
deleted file mode 100644
index da96f0c..0000000
--- a/core/src/main/resources/template/archive/ajax/div-close.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-</div>
diff --git a/core/src/main/resources/template/archive/ajax/div.vm b/core/src/main/resources/template/archive/ajax/div.vm
deleted file mode 100644
index 2d7d925..0000000
--- a/core/src/main/resources/template/archive/ajax/div.vm
+++ /dev/null
@@ -1,35 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<div dojoType='BindDiv'
-#if ($parameters.id) id="$!struts.htmlEncode($parameters.id)" #end
-#if ($parameters.href) href="$!parameters.href" #end
-#if ($parameters.loadingText) loadingHtml="$!struts.htmlEncode($parameters.loadingText)" #end
-#if ($parameters.errorText) errorHtml="$!struts.htmlEncode($parameters.errorText)" #end
-#if ($parameters.showErrorTransportText) showTransportError="true" #end
-#if ($parameters.delay) delay="$!parameters.delay" #end
-#if ($parameters.updateFreq) refresh="$!parameters.updateFreq" #end
-#if ($parameters.listenTopics) listenTopics="$!parameters.listenTopics" #end
-#if ($parameters.afterLoading) onLoad="$!parameters.afterLoading" #end
-#if ($parameters.tabindex) tabindex="$!struts.htmlEncode($parameters.tabindex)" #end
-#if ($parameters.cssClass) class="$!struts.htmlEncode($parameters.cssClass)" #end
-#if ($parameters.cssStyle) style="$!struts.htmlEncode($parameters.cssStyle)" #end
-#parse("/$parameters.templateDir/simple/scripting-events.vm")
->
diff --git a/core/src/main/resources/template/archive/ajax/form-close.vm b/core/src/main/resources/template/archive/ajax/form-close.vm
deleted file mode 100644
index 9e62164..0000000
--- a/core/src/main/resources/template/archive/ajax/form-close.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-</table>
-</form>
diff --git a/core/src/main/resources/template/archive/ajax/form.vm b/core/src/main/resources/template/archive/ajax/form.vm
deleted file mode 100644
index 2ad6075..0000000
--- a/core/src/main/resources/template/archive/ajax/form.vm
+++ /dev/null
@@ -1,39 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#if ($parameters.validate)
-<script src="$!base/struts/validationClient.js"></script>
-<script src="$!base/dwr/interface/validator.js"></script>
-<script src="$!base/dwr/engine.js"></script>
-<script src="$!base/struts/template/xhtml/validation.js"></script>
-#end
-<form
-#if ($parameters.namespace) namespace="$!struts.htmlEncode($parameters.namespace)" #end
-#if ($parameters.id) id="$!struts.htmlEncode($parameters.id)" #end
-#if ($parameters.name) name="$!struts.htmlEncode($parameters.name)" #end
-#if ($parameters.action) action="$!struts.htmlEncode($parameters.action)" #end
-#if ($parameters.target) target="$!struts.htmlEncode($parameters.target)" #end
-#if ($parameters.method) method="$!struts.htmlEncode($parameters.method)" #end
-#if ($parameters.enctype) enctype="$!struts.htmlEncode($parameters.enctype)" #end
-#if ($parameters.cssClass) class="$!struts.htmlEncode($parameters.cssClass)" #end
-#if ($parameters.cssStyle) style="$!struts.htmlEncode($parameters.cssStyle)" #end
-onSubmit="return false;"
->
-<table class="wwFormTable">
diff --git a/core/src/main/resources/template/archive/ajax/submit.vm b/core/src/main/resources/template/archive/ajax/submit.vm
deleted file mode 100644
index 26056fa..0000000
--- a/core/src/main/resources/template/archive/ajax/submit.vm
+++ /dev/null
@@ -1,33 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<button type="submit" dojoType="BindButton"<#rt/>
-#if ($parameters.form && $parameters.form.id)  formId="$parameters.form.id" #end
-#if ($parameters.name) name="$!struts.htmlEncode($parameters.name)" #end
-#if ($parameters.nameValue) value="$!struts.htmlEncode($parameters.nameValue)" #end
-#if ($parameters.cssClass) class="$!struts.htmlEncode($parameters.cssClass)" #end
-#if ($parameters.cssStyle) style="$!struts.htmlEncode($parameters.cssStyle)" #end
-#if ($parameters.resultDivId) targetDiv="$!struts.htmlEncode($parameters.resultDivId)" #end
-#if ($parameters.onLoadJS) onLoad="$!parameters.onLoadJS" #end
-#if ($parameters.preInvokeJS) preInvokeJS="$!parameters.preInvokeJS" #end
-#if ($parameters.notifyTopics) notifyTopics="$!struts.htmlEncode($parameters.notifyTopics)" #end
-#if ($parameters.listenTopics) listenTopics="$!struts.htmlEncode($parameters.listenTopics)" #end
-#parse("/$parameters.templateDir/simple/scripting-events.vm")
-/>
diff --git a/core/src/main/resources/template/archive/ajax/tab-close.vm b/core/src/main/resources/template/archive/ajax/tab-close.vm
deleted file mode 100644
index 2353ee7..0000000
--- a/core/src/main/resources/template/archive/ajax/tab-close.vm
+++ /dev/null
@@ -1,27 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-    </div>
-    </div>
-
-    <script type="text/javascript">
-        var tabpanelc_$!parameters.id = new TabContent( "$!parameters.id", $!parameters.remote );
-        dojo.event.topic.subscribe( "$!parameters.subscribeTopicName", tabpanelc_$!parameters.id, "updateVisibility" );
-    </script>
diff --git a/core/src/main/resources/template/archive/ajax/tab.vm b/core/src/main/resources/template/archive/ajax/tab.vm
deleted file mode 100644
index 5551944..0000000
--- a/core/src/main/resources/template/archive/ajax/tab.vm
+++ /dev/null
@@ -1,37 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<div class="tab_contents_header" id="tab_contents_${parameters.id}">
-    <div class="tab_contents"
-         id="tab_contents_update_${parameters.id}"
-	 #if ($parameters.remote)
-	      dojoType='BindDiv'
-	      #if ($parameters.href) href="$!struts.htmlEncode($parameters.href)" #end
-	      #if ($parameters.loadingText) loadingHtml="$!struts.htmlEncode($parameters.loadingText)" #end
-	      #if ($parameters.errorText) errorHtml="$!struts.htmlEncode($parameters.errorText)" #end
-	      #if ($parameters.showErrorTransportText) showTransportError="true" #end
-	      #if ($parameters.delay) delay="$!parameters.delay" #end
-	      #if ($parameters.updateFreq) refresh="$!parameters.updateFreq" #end
-	      #if ($parameters.listenTopics) listenTopics="$!struts.htmlEncode($parameters.listenTopics)" #end
-	      #if ($parameters.afterLoading) onLoad="$!struts.htmlEncode($parameters.afterLoading)" #end
-     #end
- 	 #if ($parameters.cssClass) class="$!struts.htmlEncode($parameters.cssClass)" #end
-	 #if ($parameters.cssStyle) style="$!struts.htmlEncode($parameters.cssStyle)" #end
-      >
diff --git a/core/src/main/resources/template/archive/simple/checkbox.vm b/core/src/main/resources/template/archive/simple/checkbox.vm
deleted file mode 100644
index bd9e0e8..0000000
--- a/core/src/main/resources/template/archive/simple/checkbox.vm
+++ /dev/null
@@ -1,30 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<input type="checkbox" name="$!struts.htmlEncode($parameters.name)" value="$!struts.htmlEncode($parameters.fieldValue)"
-#if ($parameters.nameValue)        checked="checked"                                        #end
-#if ($parameters.disabled && $parameters.disabled == true)
-                                   disabled="disabled"                                      #end
-#if ($parameters.tabindex)         tabindex="$!struts.htmlEncode($parameters.tabindex)"    #end
-#if ($parameters.id)               id="$!struts.htmlEncode($parameters.id)"                #end
-#if ($parameters.cssClass)         class="$!struts.htmlEncode($parameters.cssClass)"       #end
-#if ($parameters.cssStyle)         style="$!struts.htmlEncode($parameters.cssStyle)"       #end
-#parse("/$parameters.templateDir/simple/scripting-events.vm")
-/>
diff --git a/core/src/main/resources/template/archive/simple/checkboxlist.vm b/core/src/main/resources/template/archive/simple/checkboxlist.vm
deleted file mode 100644
index 979bc3a..0000000
--- a/core/src/main/resources/template/archive/simple/checkboxlist.vm
+++ /dev/null
@@ -1,45 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#set( $items = $parameters.list )
-#if( $items )
-    #set( $itemCount = 0 )
-    #foreach( $item in $items )
-        #set( $itemCount = $itemCount + 1)
-        $stack.push($item)
-        #if( $parameters.listKey )
-            #set( $itemKey = $stack.findValue($parameters.listKey) )
-        #else
-            #set( $itemKey = $item )
-        #end
-        #if( $parameters.listValue )
-            #set( $itemValue  = $stack.findValue($parameters.listValue) )
-        #else
-            #set( $itemValue = $item )
-        #end
-        <input type="checkbox" name="$!struts.htmlEncode($parameters.name)" value="$!struts.htmlEncode($itemKey)"
-        #parse("/$parameters.templateDir/simple/scripting-events.vm")
-        id="$!struts.htmlEncode($parameters.name)-$itemCount" #if( $tag.contains($parameters.nameValue, $itemKey) ) checked="checked" #end />
-        <label for="$!struts.htmlEncode($parameters.name)-$itemCount" class="checkboxLabel">$!struts.htmlEncode($itemValue)</label><br />
-        #set ($trash = $stack.pop())
-    #end
-#else
-  &nbsp;
-#end
diff --git a/core/src/main/resources/template/archive/simple/combobox.vm b/core/src/main/resources/template/archive/simple/combobox.vm
deleted file mode 100644
index 42fc0e3..0000000
--- a/core/src/main/resources/template/archive/simple/combobox.vm
+++ /dev/null
@@ -1,43 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<input type="text"
-                                   name="$!struts.htmlEncode($parameters.name)"
-#if ($parameters.size)             size="$!struts.htmlEncode($parameters.size)"            #end
-#if ($parameters.maxlength)        maxlength="$!struts.htmlEncode($parameters.maxlength)"  #end
-#if ($parameters.nameValue)        value="$!struts.htmlEncode($parameters.nameValue)"      #end
-#if ($parameters.disabled && $parameters.disabled == true)
-                                   disabled="disabled"                                      #end
-#if ($parameters.readonly)         readonly="readonly"                                      #end
-#if ($parameters.tabindex)         tabindex="$!struts.htmlEncode($parameters.tabindex)"    #end
-#if ($parameters.id)               id="$!struts.htmlEncode($parameters.id)"                #end
-#if ($parameters.cssClass)         class="$!struts.htmlEncode($parameters.cssClass)"       #end
-#if ($parameters.cssStyle)         style="$!struts.htmlEncode($parameters.cssStyle)"       #end
-#parse("/$parameters.templateDir/simple/scripting-events.vm")
-/><br />
-
-#if ($parameters.list)
-<select onChange="this.form.elements['$!struts.htmlEncode($parameters.name)'].value=this.options[this.selectedIndex].value"
-     #if ($parameters.disabled == true) disabled="disabled" #end
->
-#foreach ($param in $parameters.list)
-    <option value="$!struts.htmlEncode($param)"#if ($parameters.name == $param) selected="selected"#end>$!struts.htmlEncode($param)</option>
-#end
-</select>#end
diff --git a/core/src/main/resources/template/archive/simple/debug.vm b/core/src/main/resources/template/archive/simple/debug.vm
deleted file mode 100644
index d65d091..0000000
--- a/core/src/main/resources/template/archive/simple/debug.vm
+++ /dev/null
@@ -1,85 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<script type="text/javascript">
-<!--
-    function toggleDebug(debugId) {
-        var debugDiv = document.getElementById(debugId);
-        if (debugDiv) {
-            var display = debugDiv.style.display;
-            if (display == 'none') {
-                debugDiv.style.display = 'block';
-            } else if (display == 'block') {
-                debugDiv.style.display = 'none';
-            }
-        }
-    }
--->
-</script>
-<p />
-
-#set ($id = $parameters.id)
-#if ($id) #else #set ($id = 'debug') #end
-<a href="#" onclick="toggleDebug('$id');return false;">[Debug]</a>
-<div style="display:none" id="$id">
-<h2>Struts ValueStack Debug</h2>
-<p />
-
-#set($contextMap = $stack.context)
-
-<h3>Value Stack Contents</h3>
-#set ($stackContents = $parameters.stackValues)
-<table border="0" cellpadding="5" cellspacing="0" width="100%" bgcolor="#DDDDDD">
-    <tr><th>Object</th><th>Property Name</th><th>Property Value</th></tr>
-
-    #set ($index = 1)
-    #foreach ($stackObject in $stackContents)
-    <tr>
-        <td rowspan="$stackObject.value.size()">$stackObject.key</td>
-        #set ($renderRow = false)
-        #set ($propertyMap = $stackObject.value)
-        #foreach ($propertyName in $propertyMap.keySet())
-            #if ($renderRow == true)<tr>#else #set ($renderRow = true) #end
-        <td bgcolor="#if (($index % 2) == 0)#BBBBBB#else#CCCCCC#end">$propertyName</td>
-        <td bgcolor="#if (($index % 2) == 0)#BBBBBB#else#CCCCCC#end">$propertyMap.get($propertyName)</td>
-    </tr>
-            #set ($index = $index + 1)
-        #end
-    #end
-</table>
-
-<h3>Stack Context</h3>
-<i>These items are available using the #key notation</i>
-<table border="0" cellpadding="5" cellspacing="0" width="100%" bgcolor="#DDDDDD">
-    <tr>
-        <th>Key</th><th>Value</th>
-    </tr>
-
-    #set ($index = 1)
-    #foreach ($contextKey in $contextMap.keySet())
-    <tr bgcolor="#if (($index % 2) == 0)#BBBBBB#else#CCCCCC#end">
-        <td>$contextKey</td><td>$contextMap.get($contextKey)</td>
-    </tr>
-    #set ($index = $index + 1)
-    #end
-</table>
-<p />
-
-</div>
diff --git a/core/src/main/resources/template/archive/simple/doubleselect.vm b/core/src/main/resources/template/archive/simple/doubleselect.vm
deleted file mode 100644
index 3b7ee7f..0000000
--- a/core/src/main/resources/template/archive/simple/doubleselect.vm
+++ /dev/null
@@ -1,108 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-`#parse("/$parameters.templateDir/simple/select.vm")
-#set ( $startCount = 0)
-#if ($parameters.headerKey && $parameters.headerValue)
-    #set ( $startCount = $startCount + 1)
-#end
-#if ($parameters.emptyOption)
-    #set ( $startCount = $startCount + 1)
-#end
-
-<br />
-<select name="$!struts.htmlEncode($parameters.doubleName)"
-    #if ($parameters.disabled)         disabled="disabled"                                         #end
-    #if ($parameters.doubleTabindex)   tabindex="$!struts.htmlEncode($parameters.doubleTabindex)" #end
-    #if ($parameters.doubleId)         id="$!struts.htmlEncode($parameters.doubleId)"             #end
-    #if ($parameters.multiple)         multiple="multiple"                                         #end
-    #if ($parameters.cssClass)         class="$!struts.htmlEncode($parameters.cssClass)"          #end
-    #if ($parameters.cssStyle)         style="$!struts.htmlEncode($parameters.cssStyle)"          #end
->
-</select>
-<script type="text/javascript">
-#set( $itemCount = $startCount )
-var $!struts.htmlEncode($parameters.name)Group = new Array($!{parameters.listSize} + $startCount);
-for (i = 0; i < ($!{parameters.listSize} + $startCount); i++)
-$!struts.htmlEncode($parameters.name)Group[i] = new Array();
-#foreach( $item in $items )
-    $stack.push($item)
-    #if( $parameters.listKey )
-        #set( $itemKey = $stack.findValue($parameters.listKey) )
-    #else
-        #set( $itemKey = $item )
-    #end
-    #if( $parameters.listValue )
-        #set( $itemValue  = $stack.findValue($parameters.listValue) )
-    #else
-        #set( $itemValue = $item )
-    #end
-    #set( $doubleItems = $stack.findValue($parameters.doubleList) )
-    #set( $doubleItemCount = 0 )
-    #if( $doubleItems )
-        #foreach( $doubleItem in $doubleItems )
-            $stack.push($doubleItem)
-            #if( $parameters.doubleListKey )
-                #set( $doubleItemKey = $stack.findValue($parameters.doubleListKey) )
-            #else
-                #set( $doubleItemKey = $doubleItem )
-            #end
-            #if( $parameters.doubleListValue )
-                #set( $doubleItemValue  = $stack.findValue($parameters.doubleListValue) )
-            #else
-                #set( $doubleItemValue = $doubleItem )
-            #end
-            $!struts.htmlEncode($parameters.name)Group[$itemCount][$doubleItemCount] = new Option("$doubleItemKey", "$doubleItemValue");
-            #set( $doubleItemCount = $doubleItemCount + 1 )
-            #set ($trash = $stack.pop())
-        #end
-        #set( $itemCount = $itemCount + 1 )
-    #end
-    #set ($trash = $stack.pop())
-#end
-var $!struts.htmlEncode($parameters.name)Temp = document.$!struts.htmlEncode(${parameters.formName}).$!struts.htmlEncode(${parameters.doubleName});
-#set( $itemCount = $startCount )
-#set( $redirectTo = 0 )
-#foreach( $item in $items )
-    $stack.push($item)
-    #if( $parameters.listValue )
-        #set( $itemValue  = $stack.findValue($parameters.listValue) )
-    #else
-        #set( $itemValue = $item )
-    #end
-    #if( $tag.contains($parameters.nameValue, $itemKey) )
-        #set( $redirectTo = $itemCount )
-    #end
-    #set( $itemCount = $itemCount + 1 )
-    #set ($trash = $stack.pop())
-#end
-$!{struts.htmlEncode($parameters.name)}Redirect($redirectTo);
-function $!{struts.htmlEncode($parameters.name)}Redirect(x) {
-    for (m = $!{struts.htmlEncode($parameters.name)}Temp.options.length - 1; m >= 0; m--)
-        $!{struts.htmlEncode($parameters.name)}Temp.remove(m);
-
-    for (i = 0; i < $!{parameters.name}Group[x].length; i++) {
-        $!{struts.htmlEncode($parameters.name)}Temp.options[i] = new Option($!{struts.htmlEncode($parameters.name)}Group[x][i].text, $!{struts.htmlEncode($parameters.name)}Group[x][i].value);
-    }
-
-    if ($!{parameters.name}Temp.options.length > 0)
-        $!{struts.htmlEncode($parameters.name)}Temp.options[0].selected = true;
-}
-</script>
diff --git a/core/src/main/resources/template/archive/simple/empty.vm b/core/src/main/resources/template/archive/simple/empty.vm
deleted file mode 100644
index 7627ce1..0000000
--- a/core/src/main/resources/template/archive/simple/empty.vm
+++ /dev/null
@@ -1,20 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
diff --git a/core/src/main/resources/template/archive/simple/file.vm b/core/src/main/resources/template/archive/simple/file.vm
deleted file mode 100644
index 129cab5..0000000
--- a/core/src/main/resources/template/archive/simple/file.vm
+++ /dev/null
@@ -1,32 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<input type="file"
-                                   name="$!struts.htmlEncode($parameters.name)"
-#if ($parameters.size)             size="$!struts.htmlEncode($parameters.size)"            #end
-#if ($parameters.nameValue)        value="$!struts.htmlEncode($parameters.nameValue)"      #end
-#if ($parameters.disabled && $parameters.disabled == true)
-                                   disabled="disabled"                                      #end
-#if ($parameters.id)               id="$!struts.htmlEncode($parameters.id)"                #end
-#if ($parameters.accept)           accept="$!struts.htmlEncode($parameters.accept)"        #end
-#if ($parameters.cssClass)         class="$!struts.htmlEncode($parameters.cssClass)"       #end
-#if ($parameters.cssStyle)         style="$!struts.htmlEncode($parameters.cssStyle)"       #end
-#parse("/$parameters.templateDir/simple/scripting-events.vm")
-/>
diff --git a/core/src/main/resources/template/archive/simple/form-close.vm b/core/src/main/resources/template/archive/simple/form-close.vm
deleted file mode 100644
index dc96bcc..0000000
--- a/core/src/main/resources/template/archive/simple/form-close.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-</form>
diff --git a/core/src/main/resources/template/archive/simple/form.vm b/core/src/main/resources/template/archive/simple/form.vm
deleted file mode 100644
index 59ec46d..0000000
--- a/core/src/main/resources/template/archive/simple/form.vm
+++ /dev/null
@@ -1,32 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<form
-#if ($parameters.namespace) namespace="$!parameters.namespace"                  #end
-#if ($parameters.id)        id="$!struts.htmlEncode($parameters.id)"           #end
-#if ($parameters.name)      name="$!struts.htmlEncode($parameters.name)"       #end
-#if ($parameters.action)    action="$!struts.htmlEncode($parameters.action)"   #end
-#if ($parameters.target)    target="$!struts.htmlEncode($parameters.target)"   #end
-#if ($parameters.method)    method="$!struts.htmlEncode($parameters.method)"   #end
-#if ($parameters.enctype)   enctype="$!struts.htmlEncode($parameters.enctype)" #end
-#if ($parameters.cssClass)  class="$!struts.htmlEncode($parameters.cssClass)"  #end
-#if ($parameters.cssStyle)  style="$!struts.htmlEncode($parameters.cssStyle)"  #end
->
-
diff --git a/core/src/main/resources/template/archive/simple/hidden.vm b/core/src/main/resources/template/archive/simple/hidden.vm
deleted file mode 100644
index 672b210..0000000
--- a/core/src/main/resources/template/archive/simple/hidden.vm
+++ /dev/null
@@ -1,28 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<input
-    type="hidden"
-    #if ($parameters.name)      name="$!struts.htmlEncode($parameters.name)"       #end
-    #if ($parameters.nameValue) value="$!struts.htmlEncode($parameters.nameValue)" #end
-    #if ($parameters.cssClass)  class="$!struts.htmlEncode($parameters.cssClass)"  #end
-    #if ($parameters.cssStyle)  style="$!struts.htmlEncode($parameters.cssStyle)"  #end
-    #if ($parameters.id)        id="$!struts.htmlEncode($parameters.id)"           #end
-/>
diff --git a/core/src/main/resources/template/archive/simple/label.vm b/core/src/main/resources/template/archive/simple/label.vm
deleted file mode 100644
index 008e519..0000000
--- a/core/src/main/resources/template/archive/simple/label.vm
+++ /dev/null
@@ -1,26 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<label
-#if ($parameters.id)               id="$!struts.htmlEncode($parameters.id)"                #end
-#if ($parameters.cssClass)         class="$!struts.htmlEncode($parameters.cssClass)"       #end
-#if ($parameters.cssStyle)         style="$!struts.htmlEncode($parameters.cssStyle)"       #end
-#if ($parameters.for)              for="$!struts.htmlEncode($parameters.for)"              #end
->#if ($parameters.nameValue)$!struts.htmlEncode($parameters.nameValue)#end</label>
diff --git a/core/src/main/resources/template/archive/simple/password.vm b/core/src/main/resources/template/archive/simple/password.vm
deleted file mode 100644
index 0a9bc1e..0000000
--- a/core/src/main/resources/template/archive/simple/password.vm
+++ /dev/null
@@ -1,34 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<input type="password"
-                                   name="$!struts.htmlEncode($parameters.name)"
-#if ($parameters.size)             size="$!struts.htmlEncode($parameters.size)"            #end
-#if ($parameters.maxlength)        maxlength="$!struts.htmlEncode($parameters.maxlength)"  #end
-#if ($parameters.nameValue && $parameters.showPassword && $parameters.showPassword == true)
-                                   value="$!struts.htmlEncode($parameters.nameValue)"      #end
-#if ($parameters.disabled && $parameters.disabled == true)
-                                   disabled="disabled"                                      #end
-#if ($parameters.readonly)         readonly="readonly"                                      #end
-#if ($parameters.tabindex)         tabindex="$!struts.htmlEncode($parameters.tabindex)"    #end
-#if ($parameters.id)               id="$!struts.htmlEncode($parameters.id)"                #end
-#if ($parameters.cssClass)         class="$!struts.htmlEncode($parameters.cssClass)"       #end
-#parse("/$parameters.templateDir/simple/scripting-events.vm")
-/>
diff --git a/core/src/main/resources/template/archive/simple/radiomap.vm b/core/src/main/resources/template/archive/simple/radiomap.vm
deleted file mode 100644
index 6664395..0000000
--- a/core/src/main/resources/template/archive/simple/radiomap.vm
+++ /dev/null
@@ -1,55 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#set( $items = $parameters.list )
-#if( $items )
-    #foreach( $item in $items )
-        $stack.push($item)
-
-        #if( $parameters.listKey )
-            #set( $itemKey = $stack.findValue($parameters.listKey) )
-        #else
-            #set( $itemKey = $item )
-        #end
-
-        #if( $parameters.listValue )
-            #set( $itemValue  = $stack.findValue($parameters.listValue) )
-        #else
-            #set( $itemValue = $item )
-        #end
-
-        <input
-            type="radio"
-            #if( $tag.contains($parameters.nameValue, $itemKey) )checked="checked"#end
-            #if ($parameters.name)
-                                        name="$!struts.htmlEncode($parameters.name)"
-                                        id="$!struts.htmlEncode($parameters.name)$!struts.htmlEncode($itemKey)"
-            #end
-            #if ($itemKey)              value="$!struts.htmlEncode($itemKey)"                #end
-            #if ($parameters.disabled)  disabled="disabled"                                   #end
-            #if ($parameters.tabindex)  tabindex="$!struts.htmlEncode($parameters.tabindex)" #end
-            #if ($parameters.cssClass)  class="$!struts.htmlEncode($parameters.cssClass)"    #end
-            #if ($parameters.cssStyle)  style="$!struts.htmlEncode($parameters.cssStyle)"    #end
-            #parse("/$parameters.templateDir/simple/scripting-events.vm")
-        /><label for="$!struts.htmlEncode($parameters.name)$!struts.htmlEncode($itemKey)">$!itemValue</label>
-
-        #set ($trash = $stack.pop())
-    #end
-#end
diff --git a/core/src/main/resources/template/archive/simple/scripting-events.vm b/core/src/main/resources/template/archive/simple/scripting-events.vm
deleted file mode 100644
index de9ea10..0000000
--- a/core/src/main/resources/template/archive/simple/scripting-events.vm
+++ /dev/null
@@ -1,34 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#if ($parameters.onclick)     onclick="$!struts.htmlEncode($parameters.onclick)"         #end
-#if ($parameters.ondblclick)  ondblclick="$!struts.htmlEncode($parameters.ondblclick)"   #end
-#if ($parameters.onmousedown) onmousedown="$!struts.htmlEncode($parameters.onmousedown)" #end
-#if ($parameters.onmouseup)   onmouseup="$!struts.htmlEncode($parameters.onmouseup)"     #end
-#if ($parameters.onmouseover) onmouseover="$!struts.htmlEncode($parameters.onmouseover)" #end
-#if ($parameters.onmousemove) onmousemove="$!struts.htmlEncode($parameters.onmousemove)" #end
-#if ($parameters.onmouseout)  onmouseout="$!struts.htmlEncode($parameters.onmouseout)"   #end
-#if ($parameters.onfocus)     onfocus="$!struts.htmlEncode($parameters.onfocus)"         #end
-#if ($parameters.onblur)      onblur="$!struts.htmlEncode($parameters.onblur)"           #end
-#if ($parameters.onkeypress)  onkeypress="$!struts.htmlEncode($parameters.onkeypress)"   #end
-#if ($parameters.onkeydown)   onkeydown="$!struts.htmlEncode($parameters.onkeydown)"     #end
-#if ($parameters.onkeyup)     onkeyup="$!struts.htmlEncode($parameters.onkeyup)"         #end
-#if ($parameters.onselect)    onselect="$!struts.htmlEncode($parameters.onselect)"       #end
-#if ($parameters.onchange)    onchange="$!struts.htmlEncode($parameters.onchange)"       #end
diff --git a/core/src/main/resources/template/archive/simple/select.vm b/core/src/main/resources/template/archive/simple/select.vm
deleted file mode 100644
index 4e7fd8e..0000000
--- a/core/src/main/resources/template/archive/simple/select.vm
+++ /dev/null
@@ -1,63 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<select name="$!struts.htmlEncode($parameters.name)"
-    #if ($parameters.size)             size="$!struts.htmlEncode($parameters.size)"         #end
-    #if ($parameters.disabled)         disabled="disabled"                                   #end
-    #if ($parameters.tabindex)         tabindex="$!struts.htmlEncode($parameters.tabindex)" #end
-    #if ($parameters.id)               id="$!struts.htmlEncode($parameters.id)"             #end
-    #if ($parameters.multiple)         multiple="multiple"                                   #end
-    #if ($parameters.cssClass)         class="$!struts.htmlEncode($parameters.cssClass)"    #end
-    #if ($parameters.cssStyle)         style="$!struts.htmlEncode($parameters.cssStyle)"    #end
-    #parse("/$parameters.templateDir/simple/scripting-events.vm")
->
-
-#if ($parameters.headerKey && $parameters.headerValue)
-    <option value="$!struts.htmlEncode($parameters.headerKey)">$!struts.htmlEncode($parameters.headerValue)</option>
-#end
-
-#if ($parameters.emptyOption)
-    <option value=""></option>
-#end
-
-#set( $items = $parameters.list )
-#if( $items )
-    #foreach( $item in $items )
-        $stack.push($item)
-
-        #if( $parameters.listKey )
-            #set( $itemKey = $stack.findValue($parameters.listKey) )
-        #else
-            #set( $itemKey = $item )
-        #end
-
-        #if( $parameters.listValue )
-            #set( $itemValue = $stack.findValue($parameters.listValue) )
-        #else
-            #set( $itemValue = $item )
-        #end
-
-        <option value="$!struts.htmlEncode($itemKey)"#if( $tag.contains($parameters.nameValue, $itemKey) ) selected="selected"#end>$!struts.htmlEncode($itemValue)</option>
-
-        #set ($trash = $stack.pop())
-    #end
-#end
-
-</select>
diff --git a/core/src/main/resources/template/archive/simple/submit.vm b/core/src/main/resources/template/archive/simple/submit.vm
deleted file mode 100644
index 07f4652..0000000
--- a/core/src/main/resources/template/archive/simple/submit.vm
+++ /dev/null
@@ -1,27 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<input type="submit"
-#if ($parameters.name)       name="$!struts.htmlEncode($parameters.name)"           #end
-#if ($parameters.nameValue)  value="$!struts.htmlEncode($parameters.nameValue)"     #end
-#if ($parameters.cssClass)   class="$!struts.htmlEncode($parameters.cssClass)"      #end
-#if ($parameters.cssStyle)   style="$!struts.htmlEncode($parameters.cssStyle)"      #end
-#parse("/$parameters.templateDir/simple/scripting-events.vm")
-/>
diff --git a/core/src/main/resources/template/archive/simple/table.vm b/core/src/main/resources/template/archive/simple/table.vm
deleted file mode 100644
index 0082020..0000000
--- a/core/src/main/resources/template/archive/simple/table.vm
+++ /dev/null
@@ -1,101 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#set($webTable=$tag)
-#set($tableModel=$webTable.Model)
-
-
-#if($tableModel)
-		<p align="center">
-			<table bgcolor="white" border="0" cellpadding="1" cellspacing="0" >
-				<tr>
-					<td>
-						<table  border="0" cellpadding="2" cellspacing="1">
-
-                            <tr bgcolor="yellow">
-
-                            #*
-                                Show the visible column names.  Use the display name that can
-                                be set in the jsp.
-                            *#
-                            #foreach($curColumn in $webTable.Columns)
-                                #if($curColumn.isVisible())
-                                        <th>
-
-                                            #if($webTable.isSortable())
-                                                <table border="0" cellspacing="0" cellpadding="0">
-												<tr>
-												    <td>
-												        $curColumn.DisplayName
-												    </td>
-												    <td>
-												        <table border="0" cellspacing="0" cellpadding="0">
-												            <tr>
-                                                                <td align="bottom">
-
-                                                                    #if(($webTable.sortColumn == $curColumn.offset) && ($webTable.sortOrder == 'ASC'))
-                                                                        <img src="#tag( URL "value='/images/sorted_asc.gif'")" border="0" align="bottom" />                                                                    #else
-                                                                        <a href="#bodytag( URL )
-                                                                                    #param( $webTable.sortColumnLinkName $curColumn.offset)
-                                                                                    #param( $webTable.sortOrderLinkName 'ASC')
-                                                                                 #end">
-                                                                       <img src="#tag( URL "value='/images/unsorted_asc.gif'")" border="0" align="bottom" /></a>
-                                                                    #end
-                                                                </td>
-												            </tr>
-												            <tr>
-
-                                                                <td align="top">
-                                                                    #if(($webTable.sortColumn == $curColumn.offset) && ($webTable.sortOrder == 'DESC'))
-                                                                        <img src="#tag( URL "value='/images/sorted_desc.gif'")" border="0" align="top" />
-                                                                    #else
-                                                                        <a href="#bodytag( URL )
-                                                                                    #param( $webTable.sortColumnLinkName $curColumn.offset)
-                                                                                    #param( $webTable.sortOrderLinkName 'DESC')
-                                                                                  #end"><img src="#tag( URL "value='/images/unsorted_desc.gif'")" border="0" align="top" /></a>
-                                                                    #end
-                                                                </td>
-                                                            </tr>
-												        </table>
-
-												    </td>
-												</tr>
-												</table>
-                                            #else
-                                                $curColumn.DisplayName
-                                            #end
-                                        </th>
-                                #end
-                            #end
-                            </tr>
-                             #foreach($curRow in $webTable.RowIterator)
-                                <tr #if($velocityCount % 2 == 1) bgcolor="EEEEFF" #else bgcolor="FFFFFF" #end/>
-                                #foreach($curColumn in $curRow)
-                                <td>$curColumn</td>
-
-                                #end
-                             #end
-						</table>
-					</td>
-				</tr>
-			</table>
-		</p>
-
-#end
diff --git a/core/src/main/resources/template/archive/simple/text.vm b/core/src/main/resources/template/archive/simple/text.vm
deleted file mode 100644
index 9dd8f30..0000000
--- a/core/src/main/resources/template/archive/simple/text.vm
+++ /dev/null
@@ -1,34 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<input type="text"
-                                   name="$!struts.htmlEncode($parameters.name)"
-#if ($parameters.size)             size="$!struts.htmlEncode($parameters.size)"            #end
-#if ($parameters.maxlength)        maxlength="$!struts.htmlEncode($parameters.maxlength)"  #end
-#if ($parameters.nameValue)        value="$!struts.htmlEncode($parameters.nameValue)"      #end
-#if ($parameters.disabled && $parameters.disabled == true)
-                                   disabled="disabled"                                      #end
-#if ($parameters.readonly)         readonly="readonly"                                      #end
-#if ($parameters.tabindex)         tabindex="$!struts.htmlEncode($parameters.tabindex)"    #end
-#if ($parameters.id)               id="$!struts.htmlEncode($parameters.id)"                #end
-#if ($parameters.cssClass)         class="$!struts.htmlEncode($parameters.cssClass)"       #end
-#if ($parameters.cssStyle)         style="$!struts.htmlEncode($parameters.cssStyle)"       #end
-#parse("/$parameters.templateDir/simple/scripting-events.vm")
-/>
diff --git a/core/src/main/resources/template/archive/simple/textarea.vm b/core/src/main/resources/template/archive/simple/textarea.vm
deleted file mode 100644
index 7a51745..0000000
--- a/core/src/main/resources/template/archive/simple/textarea.vm
+++ /dev/null
@@ -1,33 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<textarea name="$!struts.htmlEncode($parameters.name)"
-          cols="$!struts.htmlEncode($parameters.cols)"
-          rows="$!struts.htmlEncode($parameters.rows)"
-#if ($parameters.wrap)             wrap="$!struts.htmlEncode($parameters.wrap)"            #end
-#if ($parameters.disabled && $parameters.disabled== true)
-                                   disabled="disabled"                                      #end
-#if ($parameters.readonly)         readonly="readonly"                                      #end
-#if ($parameters.tabindex)         tabindex="$!struts.htmlEncode($parameters.tabindex)"    #end
-#if ($parameters.id)               id="$!struts.htmlEncode($parameters.id)"                #end
-#if ($parameters.cssClass)         class="$!struts.htmlEncode($parameters.cssClass)"       #end
-#if ($parameters.cssStyle)         style="$!struts.htmlEncode($parameters.cssStyle)"       #end
-#parse("/$parameters.templateDir/simple/scripting-events.vm")
->#if ($parameters.nameValue)$!struts.htmlEncode($parameters.nameValue)#end</textarea>
diff --git a/core/src/main/resources/template/archive/xhtml/checkbox.vm b/core/src/main/resources/template/archive/xhtml/checkbox.vm
deleted file mode 100644
index 9e77217..0000000
--- a/core/src/main/resources/template/archive/xhtml/checkbox.vm
+++ /dev/null
@@ -1,39 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#if( $fieldErrors.get($parameters.name) )
-  #set ($hasFieldErrors = $fieldErrors.get($parameters.name))
-  #foreach ($error in $fieldErrors.get($parameters.name))
-    <tr>
-        <td align="left" valign="top" colspan="2"><span class="errorMessage">$!error</span></td>
-    </tr>
-  #end
-#end
-
-<tr>
-    <td valign="top" colspan="2">
-#* Use an extra table so that the checkbox doesn't align with the other columns. *#
-<table width="100%" border="0" cellpadding="0" cellspacing="0">
-    <tr>
-        <td valign="middle">#parse("$!{tag.templateDir}/simple/checkbox.vm")</td>
-        <td width="100%" valign="middle"><label #if ($parameters.id) for="$!struts.htmlEncode($parameters.id)"#end#if ($hasFieldErrors) class="checkboxErrorLabel"#else class="checkboxLabel"#end>$!struts.htmlEncode($parameters.label)</label></td>
-    </tr>
-</table>
-#parse("/$parameters.templateDir/xhtml/controlfooter.vm")
diff --git a/core/src/main/resources/template/archive/xhtml/checkboxlist.vm b/core/src/main/resources/template/archive/xhtml/checkboxlist.vm
deleted file mode 100644
index 85cf568..0000000
--- a/core/src/main/resources/template/archive/xhtml/checkboxlist.vm
+++ /dev/null
@@ -1,23 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse( "/$parameters.templateDir/xhtml/controlheader.vm" )
-#parse( "/$parameters.templateDir/simple/checkboxlist.vm" )
-#parse( "/$parameters.templateDir/xhtml/controlfooter.vm" )
diff --git a/core/src/main/resources/template/archive/xhtml/combobox.vm b/core/src/main/resources/template/archive/xhtml/combobox.vm
deleted file mode 100644
index d47f5e9..0000000
--- a/core/src/main/resources/template/archive/xhtml/combobox.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse("/$parameters.templateDir/xhtml/controlheader.vm")#parse("/$parameters.templateDir/simple/combobox.vm")#parse("/$parameters.templateDir/xhtml/controlfooter.vm")
diff --git a/core/src/main/resources/template/archive/xhtml/controlfooter.vm b/core/src/main/resources/template/archive/xhtml/controlfooter.vm
deleted file mode 100644
index b7ddce9..0000000
--- a/core/src/main/resources/template/archive/xhtml/controlfooter.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-$!{parameters.after}</td>
-</tr>
diff --git a/core/src/main/resources/template/archive/xhtml/controlheader.vm b/core/src/main/resources/template/archive/xhtml/controlheader.vm
deleted file mode 100644
index a07d787..0000000
--- a/core/src/main/resources/template/archive/xhtml/controlheader.vm
+++ /dev/null
@@ -1,47 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-## Only show message if errors are available.
-## This will be done if ActionSupport is used.
-#if( $fieldErrors.get($parameters.name) )
-  #set ($hasFieldErrors = $fieldErrors.get($parameters.name))
-  #foreach ($error in $fieldErrors.get($parameters.name))
-    <tr errorFor="$parameters.id">
-        #if ($parameters.labelposition == 'top')<td align="left" valign="top" colspan="2">#else<td align="center" valign="top" colspan="2">#end<span class="errorMessage">$!struts.htmlEncode($error)</span></td>
-    </tr>
-  #end
-#end
-## if the label position is top,
-## then give the label it's own row in the table
-<tr>
-#if ($parameters.labelposition && $parameters.labelposition == 'top')<td align="left" valign="top" colspan="2">#else<td align="right" valign="top">#end#if ($parameters.label)<label #if ($parameters.id) for="$!struts.htmlEncode($parameters.id)"#end#if ($hasFieldErrors) class="errorLabel"#else class="label"#end>#if ($parameters.required)<span class="required">*</span>#end$!struts.htmlEncode($parameters.label):</label>#end</td>
-## add the extra row
-#if ($parameters.labelposition && $parameters.labelposition == 'top')
-</tr>
-<tr>
-#end
-#if ($parameters.form.validate && $parameters.form.validate == true)
-    #if ($parameters.onblur)
-        #set ($parameters.onblur = "validate(this);${parameters.onblur}")
-    #else
-        #set ($parameters.onblur = "validate(this)")
-    #end
-#end
-    <td>
diff --git a/core/src/main/resources/template/archive/xhtml/debug.vm b/core/src/main/resources/template/archive/xhtml/debug.vm
deleted file mode 100644
index f4e2cd9..0000000
--- a/core/src/main/resources/template/archive/xhtml/debug.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse("/$parameters.templateDir/xhtml/controlheader.vm")#parse("/$parameters.templateDir/simple/debug.vm")#parse("/$parameters.templateDir/xhtml/controlfooter.vm")
diff --git a/core/src/main/resources/template/archive/xhtml/doubleselect.vm b/core/src/main/resources/template/archive/xhtml/doubleselect.vm
deleted file mode 100644
index d5c894f..0000000
--- a/core/src/main/resources/template/archive/xhtml/doubleselect.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse("/$parameters.templateDir/xhtml/controlheader.vm")#parse("/$parameters.templateDir/simple/doubleselect.vm")#parse("/$parameters.templateDir/xhtml/controlfooter.vm")
diff --git a/core/src/main/resources/template/archive/xhtml/empty.vm b/core/src/main/resources/template/archive/xhtml/empty.vm
deleted file mode 100644
index 7627ce1..0000000
--- a/core/src/main/resources/template/archive/xhtml/empty.vm
+++ /dev/null
@@ -1,20 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
diff --git a/core/src/main/resources/template/archive/xhtml/file.vm b/core/src/main/resources/template/archive/xhtml/file.vm
deleted file mode 100644
index 65750ac..0000000
--- a/core/src/main/resources/template/archive/xhtml/file.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse("/$parameters.templateDir/xhtml/controlheader.vm")#parse("/$parameters.templateDir/simple/file.vm")#parse("/$parameters.templateDir/xhtml/controlfooter.vm")
diff --git a/core/src/main/resources/template/archive/xhtml/form-close.vm b/core/src/main/resources/template/archive/xhtml/form-close.vm
deleted file mode 100644
index 4b5b26b..0000000
--- a/core/src/main/resources/template/archive/xhtml/form-close.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-</table>
-#parse("/$parameters.templateDir/simple/form-close.vm")
diff --git a/core/src/main/resources/template/archive/xhtml/form.vm b/core/src/main/resources/template/archive/xhtml/form.vm
deleted file mode 100644
index 1beb97e..0000000
--- a/core/src/main/resources/template/archive/xhtml/form.vm
+++ /dev/null
@@ -1,28 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#if ($parameters.validate && $parameters.validate == true)
-<script src="${base}/struts/validationClient.js"></script>
-<script src="${base}/dwr/interface/validator.js"></script>
-<script src="${base}/dwr/engine.js"></script>
-<script src="${base}/struts/template/xhtml/validation.js"></script>
-#end
-#parse("/$parameters.templateDir/simple/form.vm")
-<table class="wwFormTable">
diff --git a/core/src/main/resources/template/archive/xhtml/hidden.vm b/core/src/main/resources/template/archive/xhtml/hidden.vm
deleted file mode 100644
index 5dc922d..0000000
--- a/core/src/main/resources/template/archive/xhtml/hidden.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse("/$parameters.templateDir/simple/hidden.vm")
diff --git a/core/src/main/resources/template/archive/xhtml/label.vm b/core/src/main/resources/template/archive/xhtml/label.vm
deleted file mode 100644
index 08c8e9f..0000000
--- a/core/src/main/resources/template/archive/xhtml/label.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse("/$parameters.templateDir/xhtml/controlheader.vm")#parse("/$parameters.templateDir/simple/label.vm")#parse("/$parameters.templateDir/xhtml/controlfooter.vm")
diff --git a/core/src/main/resources/template/archive/xhtml/password.vm b/core/src/main/resources/template/archive/xhtml/password.vm
deleted file mode 100644
index 211dfbe..0000000
--- a/core/src/main/resources/template/archive/xhtml/password.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse("/$parameters.templateDir/xhtml/controlheader.vm")#parse("/$parameters.templateDir/simple/password.vm")#parse("/$parameters.templateDir/xhtml/controlfooter.vm")
diff --git a/core/src/main/resources/template/archive/xhtml/radiomap.vm b/core/src/main/resources/template/archive/xhtml/radiomap.vm
deleted file mode 100644
index 793e15f..0000000
--- a/core/src/main/resources/template/archive/xhtml/radiomap.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse("/$parameters.templateDir/xhtml/controlheader.vm")#parse("/$parameters.templateDir/simple/radiomap.vm")#parse("/$parameters.templateDir/xhtml/controlfooter.vm")
diff --git a/core/src/main/resources/template/archive/xhtml/select.vm b/core/src/main/resources/template/archive/xhtml/select.vm
deleted file mode 100644
index 001ec89..0000000
--- a/core/src/main/resources/template/archive/xhtml/select.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse("/$parameters.templateDir/xhtml/controlheader.vm")#parse("/$parameters.templateDir/simple/select.vm")#parse("/$parameters.templateDir/xhtml/controlfooter.vm")
diff --git a/core/src/main/resources/template/archive/xhtml/submit.vm b/core/src/main/resources/template/archive/xhtml/submit.vm
deleted file mode 100644
index 0ec2837..0000000
--- a/core/src/main/resources/template/archive/xhtml/submit.vm
+++ /dev/null
@@ -1,23 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-<tr>
-    <td colspan="2"><div #if ($parameters.align) align="$!struts.htmlEncode($parameters.align)" #end
->#parse("/$parameters.templateDir/simple/submit.vm")</div>#parse( "/$parameters.templateDir/xhtml/controlfooter.vm" )
diff --git a/core/src/main/resources/template/archive/xhtml/table.vm b/core/src/main/resources/template/archive/xhtml/table.vm
deleted file mode 100644
index 78a9f4e..0000000
--- a/core/src/main/resources/template/archive/xhtml/table.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse("/$parameters.templateDir/simple/table.vm")
diff --git a/core/src/main/resources/template/archive/xhtml/text.vm b/core/src/main/resources/template/archive/xhtml/text.vm
deleted file mode 100644
index 64a24be..0000000
--- a/core/src/main/resources/template/archive/xhtml/text.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse("/$parameters.templateDir/xhtml/controlheader.vm")#parse("/$parameters.templateDir/simple/text.vm")#parse("/$parameters.templateDir/xhtml/controlfooter.vm")
diff --git a/core/src/main/resources/template/archive/xhtml/textarea.vm b/core/src/main/resources/template/archive/xhtml/textarea.vm
deleted file mode 100644
index a8514e6..0000000
--- a/core/src/main/resources/template/archive/xhtml/textarea.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse("/$parameters.templateDir/xhtml/controlheader.vm")#parse("/$parameters.templateDir/simple/textarea.vm")#parse("/$parameters.templateDir/xhtml/controlfooter.vm")
-
diff --git a/core/src/main/resources/template/archive/xhtml/token.vm b/core/src/main/resources/template/archive/xhtml/token.vm
deleted file mode 100644
index 04d011d..0000000
--- a/core/src/main/resources/template/archive/xhtml/token.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *#
-#parse("/$parameters.templateDir/simple/token.vm")
diff --git a/core/src/main/resources/xwork-2.6.dtd b/core/src/main/resources/xwork-2.6.dtd
new file mode 100644
index 0000000..ba6dddf
--- /dev/null
+++ b/core/src/main/resources/xwork-2.6.dtd
@@ -0,0 +1,157 @@
+<?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.
+ */
+-->
+<!-- START SNIPPET: xworkDtd -->
+
+<!--
+   XWork configuration DTD.
+   Use the following DOCTYPE
+
+   <!DOCTYPE xwork PUBLIC
+	"-//Apache Struts//XWork 2.6//EN"
+	"http://struts.apache.org/dtds/xwork-2.6.dtd">
+-->
+
+<!ELEMENT xwork ((package|include|bean|constant)*, bean-selection?, unknown-handler-stack?)>
+<!ATTLIST xwork
+    order CDATA #IMPLIED
+>
+
+<!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, default-class-ref?, global-results?, global-allowed-methods?, global-exception-mappings?, action*)>
+<!ATTLIST package
+    name CDATA #REQUIRED
+    extends CDATA #IMPLIED
+    namespace CDATA #IMPLIED
+    abstract CDATA #IMPLIED
+    strict-method-invocation (true|false) "true"
+>
+
+<!ELEMENT result-types (result-type+)>
+
+<!ELEMENT result-type (param*)>
+<!ATTLIST result-type
+    name CDATA #REQUIRED
+    class CDATA #REQUIRED
+    default (true|false) "false"
+>
+
+<!ELEMENT interceptors (interceptor|interceptor-stack)+>
+
+<!ELEMENT interceptor (param*)>
+<!ATTLIST interceptor
+    name CDATA #REQUIRED
+    class CDATA #REQUIRED
+>
+
+<!ELEMENT interceptor-stack (interceptor-ref*)>
+<!ATTLIST interceptor-stack
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT interceptor-ref (param*)>
+<!ATTLIST interceptor-ref
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT default-interceptor-ref (#PCDATA)>
+<!ATTLIST default-interceptor-ref
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT default-action-ref (#PCDATA)>
+<!ATTLIST default-action-ref
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT default-class-ref (#PCDATA)>
+<!ATTLIST default-class-ref
+   class CDATA #REQUIRED
+>
+
+<!ELEMENT global-results (result+)>
+
+<!ELEMENT global-allowed-methods (#PCDATA)>
+
+<!ELEMENT global-exception-mappings (exception-mapping+)>
+
+<!ELEMENT action ((param|result|interceptor-ref|exception-mapping)*,allowed-methods?)>
+<!ATTLIST action
+    name CDATA #REQUIRED
+    class CDATA #IMPLIED
+    method CDATA #IMPLIED
+    converter CDATA #IMPLIED
+>
+
+<!ELEMENT param (#PCDATA)>
+<!ATTLIST param
+    name CDATA #REQUIRED
+>
+
+<!ELEMENT result (#PCDATA|param)*>
+<!ATTLIST result
+    name CDATA #IMPLIED
+    type CDATA #IMPLIED
+>
+
+<!ELEMENT exception-mapping (#PCDATA|param)*>
+<!ATTLIST exception-mapping
+    name CDATA #IMPLIED
+    exception CDATA #REQUIRED
+    result CDATA #REQUIRED
+>
+
+<!ELEMENT allowed-methods (#PCDATA)>
+
+<!ELEMENT include (#PCDATA)>
+<!ATTLIST include
+    file CDATA #REQUIRED
+>
+
+<!ELEMENT bean (#PCDATA)>
+<!ATTLIST bean
+    type CDATA #IMPLIED
+    name CDATA #IMPLIED
+    class CDATA #REQUIRED
+    scope CDATA #IMPLIED
+    static CDATA #IMPLIED
+    optional CDATA #IMPLIED
+>
+
+<!ELEMENT bean-selection (#PCDATA)>
+<!ATTLIST bean-selection
+    name CDATA #IMPLIED
+    class CDATA #IMPLIED
+>
+
+<!ELEMENT constant (#PCDATA)>
+<!ATTLIST constant
+    name CDATA #REQUIRED
+    value CDATA #REQUIRED
+>
+
+<!ELEMENT unknown-handler-stack (unknown-handler-ref*)>
+<!ELEMENT unknown-handler-ref (#PCDATA)>
+<!ATTLIST unknown-handler-ref
+    name CDATA #REQUIRED
+>
+
+<!-- END SNIPPET: xworkDtd -->
+
diff --git a/core/src/test/java/com/opensymphony/xwork2/util/location/LocationUtilsTest.java b/core/src/test/java/com/opensymphony/xwork2/util/location/LocationUtilsTest.java
index a47d718..f64ffef 100644
--- a/core/src/test/java/com/opensymphony/xwork2/util/location/LocationUtilsTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/util/location/LocationUtilsTest.java
@@ -19,9 +19,11 @@
 package com.opensymphony.xwork2.util.location;
 
 import java.util.List;
+import java.util.Optional;
 
 import org.apache.struts2.config.StrutsJavaConfiguration;
 import org.apache.struts2.config.entities.BeanConfig;
+import org.apache.struts2.config.entities.BeanSelectionConfig;
 import org.apache.struts2.config.entities.ConstantConfig;
 
 import junit.framework.TestCase;
@@ -74,6 +76,10 @@
             public List<BeanConfig> beans() {
                 return null;
             }
+            @Override
+            public Optional<BeanSelectionConfig> beanSelection() {
+                return Optional.empty();
+            }
         };
         Location loc = LocationUtils.getLocation(conf, null);
 
diff --git a/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java b/core/src/test/java/org/apache/struts2/config/StrutsBeanSelectionProviderTest.java
similarity index 96%
rename from core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java
rename to core/src/test/java/org/apache/struts2/config/StrutsBeanSelectionProviderTest.java
index 42e07bb..30cc175 100644
--- a/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java
+++ b/core/src/test/java/org/apache/struts2/config/StrutsBeanSelectionProviderTest.java
@@ -29,7 +29,7 @@
 import com.opensymphony.xwork2.inject.ContainerBuilder;
 import com.opensymphony.xwork2.util.location.LocatableProperties;
 
-public class DefaultBeanSelectionProviderTest extends XWorkTestCase {
+public class StrutsBeanSelectionProviderTest extends XWorkTestCase {
 
     public void testRegister() {
         LocalizedTextProvider localizedTextProvider = container.getInstance(LocalizedTextProvider.class);
diff --git a/core/src/test/java/org/apache/struts2/config/StrutsJavaConfigurationProviderTest.java b/core/src/test/java/org/apache/struts2/config/StrutsJavaConfigurationProviderTest.java
index 933de81..5e08f98 100644
--- a/core/src/test/java/org/apache/struts2/config/StrutsJavaConfigurationProviderTest.java
+++ b/core/src/test/java/org/apache/struts2/config/StrutsJavaConfigurationProviderTest.java
@@ -19,10 +19,14 @@
 package org.apache.struts2.config;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
+import java.util.Set;
 
 import org.apache.struts2.StrutsConstants;
 import org.apache.struts2.config.entities.BeanConfig;
+import org.apache.struts2.config.entities.BeanSelectionConfig;
 import org.apache.struts2.config.entities.ConstantConfig;
 import org.junit.Assert;
 import org.junit.Test;
@@ -46,18 +50,26 @@
         StrutsJavaConfiguration javaConfig = new StrutsJavaConfiguration() {
             @Override
             public List<String> unknownHandlerStack() {
-                return Arrays.asList(expectedUnknownHandler);
+                return Collections.singletonList(expectedUnknownHandler);
             }
 
             @Override
             public List<ConstantConfig> constants() {
-                return Arrays.asList(constantConfig);
+                return Collections.singletonList(constantConfig);
             }
 
             @Override
             public List<BeanConfig> beans() {
-                return Arrays.asList(new BeanConfig(TestBean.class),
-                        new BeanConfig(TestBean.class, "testBean", TestBean.class, Scope.PROTOTYPE, true, true));
+                return Arrays.asList(
+                    new BeanConfig(TestBean.class, "struts"),
+                    new BeanConfig(TestBean.class, "struts.static", TestBean.class, Scope.PROTOTYPE, true, true),
+                    new BeanConfig(TestBean.class, "struts.test.bean", TestBean.class)
+                );
+            }
+
+            @Override
+            public Optional<BeanSelectionConfig> beanSelection() {
+                return Optional.of(new BeanSelectionConfig(TestBeanSelectionProvider.class, "testBeans"));
             }
         };
         StrutsJavaConfigurationProvider provider = new StrutsJavaConfigurationProvider(javaConfig);
@@ -83,5 +95,13 @@
         Container container = builder.create(true);
         TestBean testBean = container.getInstance(TestBean.class);
         Assert.assertNotNull(testBean);
+
+        testBean = container.getInstance(TestBean.class, "struts");
+        Assert.assertNotNull(testBean);
+
+        // bean selection
+        Set<String> names = container.getInstanceNames(TestBean.class);
+        Assert.assertTrue(names.contains("struts"));
+        Assert.assertTrue(names.contains("struts.test.bean"));
     }
 }
diff --git a/core/src/test/java/org/apache/struts2/config/TestBeanSelectionProvider.java b/core/src/test/java/org/apache/struts2/config/TestBeanSelectionProvider.java
new file mode 100644
index 0000000..79d6dd2
--- /dev/null
+++ b/core/src/test/java/org/apache/struts2/config/TestBeanSelectionProvider.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.config;
+
+import com.opensymphony.xwork2.TestBean;
+import com.opensymphony.xwork2.config.ConfigurationException;
+import com.opensymphony.xwork2.inject.ContainerBuilder;
+import com.opensymphony.xwork2.util.location.LocatableProperties;
+
+public class TestBeanSelectionProvider extends AbstractBeanSelectionProvider {
+
+    @Override
+    public void register(ContainerBuilder builder, LocatableProperties props) throws ConfigurationException {
+        alias(TestBean.class, "struts.test.bean", builder, props);
+    }
+
+}
diff --git a/core/src/test/java/org/apache/struts2/views/TemplateEngineManagerTest.java b/core/src/test/java/org/apache/struts2/views/TemplateEngineManagerTest.java
index 3fb8d0d..dbd406d 100644
--- a/core/src/test/java/org/apache/struts2/views/TemplateEngineManagerTest.java
+++ b/core/src/test/java/org/apache/struts2/views/TemplateEngineManagerTest.java
@@ -27,8 +27,6 @@
 import org.apache.struts2.components.template.Template;
 import org.apache.struts2.components.template.TemplateEngine;
 import org.apache.struts2.components.template.TemplateEngineManager;
-import org.apache.struts2.components.template.VelocityTemplateEngine;
-import org.apache.struts2.dispatcher.mapper.CompositeActionMapper;
 
 import com.mockobjects.dynamic.C;
 import com.mockobjects.dynamic.Mock;
@@ -47,9 +45,8 @@
         mgr = new TemplateEngineManager();
         mockContainer = new Mock(Container.class);
         mockContainer.matchAndReturn("getInstance", C.args(C.eq(TemplateEngine.class), C.eq("jsp")), new JspTemplateEngine());
-        mockContainer.matchAndReturn("getInstance", C.args(C.eq(TemplateEngine.class), C.eq("vm")), new VelocityTemplateEngine());
         mockContainer.matchAndReturn("getInstance", C.args(C.eq(TemplateEngine.class), C.eq("ftl")), new FreemarkerTemplateEngine());
-        mockContainer.matchAndReturn("getInstanceNames", C.args(C.eq(TemplateEngine.class)), new HashSet() {{
+        mockContainer.matchAndReturn("getInstanceNames", C.args(C.eq(TemplateEngine.class)), new HashSet<String>() {{
             add("jsp");
             add("vm");
             add("ftl");
@@ -60,18 +57,13 @@
     }
     
     public void testTemplateTypeFromTemplateNameAndDefaults() {
-        
         TemplateEngine engine = mgr.getTemplateEngine(new Template("/template", "simple", "foo"), null);
         assertTrue(engine instanceof JspTemplateEngine);
-        engine = mgr.getTemplateEngine(new Template("/template", "simple", "foo.vm"), null);
-        assertTrue(engine instanceof VelocityTemplateEngine);
     }
 
     public void testTemplateTypeOverrides() {
         TemplateEngine engine = mgr.getTemplateEngine(new Template("/template", "simple", "foo"), "ftl");
         assertTrue(engine instanceof FreemarkerTemplateEngine);
-        engine = mgr.getTemplateEngine(new Template("/template", "simple", "foo.vm"), "ftl");
-        assertTrue(engine instanceof VelocityTemplateEngine);
         engine = mgr.getTemplateEngine(new Template("/template", "simple", "foo.ftl"), "");
         assertTrue(engine instanceof FreemarkerTemplateEngine);
     }
@@ -81,7 +73,7 @@
         TemplateEngine engine = mgr.getTemplateEngine(new Template("/template", "simple", "foo"), null);
         Template template = new Template("/template", "simple", "foo." + TemplateEngineManager.DEFAULT_TEMPLATE_TYPE);
         TemplateEngine defaultTemplateEngine = mgr.getTemplateEngine(template, null);
-        assertTrue(engine.getClass().equals(defaultTemplateEngine.getClass()));
+        assertEquals(engine.getClass(), defaultTemplateEngine.getClass());
     }
 
     protected void tearDown() throws Exception {
diff --git a/plugins/config-browser/pom.xml b/plugins/config-browser/pom.xml
index d494d4b..1286000 100644
--- a/plugins/config-browser/pom.xml
+++ b/plugins/config-browser/pom.xml
@@ -34,4 +34,11 @@
     <properties>
     	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.struts</groupId>
+            <artifactId>struts2-velocity-plugin</artifactId>
+        </dependency>
+    </dependencies>
 </project>
diff --git a/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ShowBeansAction.java b/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ShowBeansAction.java
index c1eec8a..8827fd8 100644
--- a/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ShowBeansAction.java
+++ b/plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ShowBeansAction.java
@@ -30,6 +30,7 @@
 import org.apache.struts2.dispatcher.mapper.ActionMapper;
 import org.apache.struts2.dispatcher.multipart.MultiPartRequest;
 import org.apache.struts2.views.freemarker.FreemarkerManager;
+import org.apache.struts2.views.velocity.VelocityConstants;
 import org.apache.struts2.views.velocity.VelocityManager;
 
 import java.util.Map;
@@ -57,7 +58,7 @@
         bindings.put(ActionMapper.class.getName(), addBindings(container, ActionMapper.class, StrutsConstants.STRUTS_MAPPER_CLASS));
         bindings.put(MultiPartRequest.class.getName(), addBindings(container, MultiPartRequest.class, StrutsConstants.STRUTS_MULTIPART_PARSER));
         bindings.put(FreemarkerManager.class.getName(), addBindings(container, FreemarkerManager.class, StrutsConstants.STRUTS_FREEMARKER_MANAGER_CLASSNAME));
-        bindings.put(VelocityManager.class.getName(), addBindings(container, VelocityManager.class, StrutsConstants.STRUTS_VELOCITY_MANAGER_CLASSNAME));
+        bindings.put(VelocityManager.class.getName(), addBindings(container, VelocityManager.class, VelocityConstants.STRUTS_VELOCITY_MANAGER_CLASSNAME));
         bindings.put(UrlRenderer.class.getName(), addBindings(container, UrlRenderer.class, StrutsConstants.STRUTS_URL_RENDERER));
     }
 
diff --git a/plugins/osgi/pom.xml b/plugins/osgi/pom.xml
index 9162538..d78412c 100644
--- a/plugins/osgi/pom.xml
+++ b/plugins/osgi/pom.xml
@@ -63,14 +63,8 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.velocity</groupId>
-            <artifactId>velocity</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.velocity</groupId>
-            <artifactId>velocity-tools</artifactId>
-            <optional>true</optional>
+            <groupId>org.apache.struts</groupId>
+            <artifactId>struts2-velocity-plugin</artifactId>
         </dependency>
 
         <dependency>
diff --git a/plugins/pom.xml b/plugins/pom.xml
index 4ecdd0e..66bb555 100644
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -32,6 +32,7 @@
     <name>Struts 2 Plugins</name>
 
     <modules>
+        <module>async</module>
         <module>bean-validation</module>
         <module>cdi</module>
         <module>config-browser</module>
@@ -55,7 +56,7 @@
         <module>spring</module>
         <module>testng</module>
         <module>tiles</module>
-        <module>async</module>
+        <module>velocity</module>
     </modules>
 
     <dependencies>
diff --git a/plugins/portlet/pom.xml b/plugins/portlet/pom.xml
index 06146d0..81f08b6 100644
--- a/plugins/portlet/pom.xml
+++ b/plugins/portlet/pom.xml
@@ -41,6 +41,11 @@
         </dependency>
 
         <dependency>
+            <groupId>org.apache.struts</groupId>
+            <artifactId>struts2-velocity-plugin</artifactId>
+        </dependency>
+
+        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <optional>true</optional>
diff --git a/plugins/sitemesh/pom.xml b/plugins/sitemesh/pom.xml
index 66375ae5..8a47ea2 100644
--- a/plugins/sitemesh/pom.xml
+++ b/plugins/sitemesh/pom.xml
@@ -36,16 +36,11 @@
             <groupId>opensymphony</groupId>
             <artifactId>sitemesh</artifactId>
         </dependency>
+
         <!-- Velocity -->
         <dependency>
-            <groupId>org.apache.velocity</groupId>
-            <artifactId>velocity</artifactId>
-            <optional>true</optional>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.velocity</groupId>
-            <artifactId>velocity-tools</artifactId>
+            <groupId>org.apache.struts</groupId>
+            <artifactId>struts2-velocity-plugin</artifactId>
             <optional>true</optional>
         </dependency>
 
diff --git a/plugins/velocity/pom.xml b/plugins/velocity/pom.xml
new file mode 100644
index 0000000..649e1d4
--- /dev/null
+++ b/plugins/velocity/pom.xml
@@ -0,0 +1,77 @@
+<?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.
+ */
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.struts</groupId>
+        <artifactId>struts2-plugins</artifactId>
+        <version>2.6-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>struts2-velocity-plugin</artifactId>
+    <packaging>jar</packaging>
+    <name>Struts 2 Velocity Plugin</name>
+
+    <dependencies>
+
+        <!-- Velocity -->
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-tools</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.servlet.jsp</groupId>
+            <artifactId>jsp-api</artifactId>
+        </dependency>
+
+        <!-- The Servlet API mocks in Spring Framework 4.0 support Servlet 3.0 and higher
+           So this is only necessary in tests-->
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>3.1.0</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>mockobjects</groupId>
+            <artifactId>mockobjects-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+    <properties>
+    	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+</project>
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/StrutsResourceLoader.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/StrutsResourceLoader.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/StrutsResourceLoader.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/StrutsResourceLoader.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/StrutsVelocityContext.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/StrutsVelocityContext.java
similarity index 87%
rename from core/src/main/java/org/apache/struts2/views/velocity/StrutsVelocityContext.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/StrutsVelocityContext.java
index 469e570..f8f6075 100644
--- a/core/src/main/java/org/apache/struts2/views/velocity/StrutsVelocityContext.java
+++ b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/StrutsVelocityContext.java
@@ -24,11 +24,9 @@
 
 public class StrutsVelocityContext extends VelocityContext {
 
-    private static final long serialVersionUID = 8497212428904436963L;
     ValueStack stack;
     VelocityContext[] chainedContexts;
 
-
     public StrutsVelocityContext(ValueStack stack) {
         this(null, stack);
     }
@@ -38,7 +36,6 @@
         this.stack = stack;
     }
 
-
     public boolean internalContainsKey(Object key) {
         boolean contains = super.internalContainsKey(key);
 
@@ -63,8 +60,8 @@
 
         // if we still haven't found it, le's search through our chained contexts
         if (chainedContexts != null) {
-            for (int index = 0; index < chainedContexts.length; index++) {
-                if (chainedContexts[index].containsKey(key)) {
+            for (VelocityContext chainedContext : chainedContexts) {
+                if (chainedContext.containsKey(key)) {
                     return true;
                 }
             }
@@ -97,9 +94,9 @@
 
         // finally, if we're chained to other contexts, let's look in them
         if (chainedContexts != null) {
-            for (int index = 0; index < chainedContexts.length; index++) {
-                if (chainedContexts[index].containsKey(key)) {
-                    return chainedContexts[index].internalGet(key);
+            for (VelocityContext chainedContext : chainedContexts) {
+                if (chainedContext.containsKey(key)) {
+                    return chainedContext.internalGet(key);
                 }
             }
         }
diff --git a/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityBeanSelectionProvider.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityBeanSelectionProvider.java
new file mode 100644
index 0000000..f53ec66
--- /dev/null
+++ b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityBeanSelectionProvider.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.views.velocity;
+
+import com.opensymphony.xwork2.config.ConfigurationException;
+import com.opensymphony.xwork2.inject.ContainerBuilder;
+import com.opensymphony.xwork2.util.location.LocatableProperties;
+import org.apache.struts2.config.AbstractBeanSelectionProvider;
+import org.apache.struts2.config.StrutsBeanSelectionProvider;
+
+/**
+ * Please see {@link StrutsBeanSelectionProvider} for more details.
+ *
+ * <p>
+ * The following is a list of the allowed extension points:
+ *
+ * <table border="1" summary="">
+ *   <tr>
+ *     <th>Type</th>
+ *     <th>Property</th>
+ *     <th>Scope</th>
+ *     <th>Description</th>
+ *   </tr>
+ *   <tr>
+ *     <td>org.apache.struts2.views.velocity.VelocityManager</td>
+ *     <td>struts.velocity.manager.classname</td>
+ *     <td>singleton</td>
+ *     <td>Loads and processes Velocity templates</td>
+ *   </tr>
+ * </table>
+ */
+public class VelocityBeanSelectionProvider extends AbstractBeanSelectionProvider {
+
+    @Override
+    public void register(ContainerBuilder builder, LocatableProperties props) throws ConfigurationException {
+        alias(VelocityManager.class, VelocityConstants.STRUTS_VELOCITY_MANAGER_CLASSNAME, builder, props);
+    }
+
+}
diff --git a/core/src/main/resources/template/archive/simple/token.vm b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityConstants.java
similarity index 73%
rename from core/src/main/resources/template/archive/simple/token.vm
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityConstants.java
index 5e5d18d..f905662 100644
--- a/core/src/main/resources/template/archive/simple/token.vm
+++ b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityConstants.java
@@ -1,6 +1,4 @@
-#*
- * $Id$
- *
+/*
  * 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
@@ -17,6 +15,12 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *#
-<input type="hidden" name="$!{parameters.tokenNameField}" value="$struts.htmlEncode($!parameters.name)"/>
-<input type="hidden" name="$!parameters.name" value="$struts.htmlEncode($!parameters.token)"/>
+ */
+package org.apache.struts2.views.velocity;
+
+public final class VelocityConstants {
+
+    /** org.apache.struts2.views.velocity.VelocityManager implementation class */
+    public static final String STRUTS_VELOCITY_MANAGER_CLASSNAME = "struts.velocity.manager.classname";
+
+}
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/VelocityManager.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityManager.java
similarity index 94%
rename from core/src/main/java/org/apache/struts2/views/velocity/VelocityManager.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityManager.java
index f94ac7e..6cbbaed 100644
--- a/core/src/main/java/org/apache/struts2/views/velocity/VelocityManager.java
+++ b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityManager.java
@@ -53,22 +53,15 @@
  * Manages the environment for Velocity result types
  */
 public class VelocityManager {
+
     private static final Logger LOG = LogManager.getLogger(VelocityManager.class);
+
     public static final String STRUTS = "struts";
+
     private ObjectFactory objectFactory;
 
     public static final String KEY_VELOCITY_STRUTS_CONTEXT = ".KEY_velocity.struts2.context";
 
-    /**
-     * the parent JSP tag
-     */
-    public static final String PARENT = "parent";
-
-    /**
-     * the current JSP tag
-     */
-    public static final String TAG = "tag";
-
     private VelocityEngine velocityEngine;
 
     /**
@@ -77,7 +70,6 @@
     protected ToolboxManager toolboxManager = null;
     private String toolBoxLocation;
 
-
     /**
      * Names of contexts that will be chained on every request
      */
@@ -137,8 +129,8 @@
         VelocityContext[] chainedContexts = prepareChainedContexts(req, res, stack.getContext());
         StrutsVelocityContext context = new StrutsVelocityContext(chainedContexts, stack);
         Map standardMap = ContextUtil.getStandardContext(stack, req, res);
-        for (Iterator iterator = standardMap.entrySet().iterator(); iterator.hasNext();) {
-            Map.Entry entry = (Map.Entry) iterator.next();
+        for (Object o : standardMap.entrySet()) {
+            Map.Entry entry = (Map.Entry) o;
             context.put((String) entry.getKey(), entry.getValue());
         }
         context.put(STRUTS, new VelocityStrutsUtil(velocityEngine, context, stack, req, res));
@@ -236,13 +228,13 @@
 
         String defaultUserDirective = properties.getProperty("userdirective");
 
-        /**
-         * if the user has specified an external velocity configuration file, we'll want to search for it in the
-         * following order
-         *
-         * 1. relative to the context path
-         * 2. relative to /WEB-INF
-         * 3. in the class path
+        /*
+          if the user has specified an external velocity configuration file, we'll want to search for it in the
+          following order
+
+          1. relative to the context path
+          2. relative to /WEB-INF
+          3. in the class path
          */
         String configfile;
 
@@ -301,16 +293,15 @@
             if (in != null) {
                 try {
                     in.close();
-                } catch (IOException e) {
+                } catch (IOException ignore) {
                 }
             }
         }
 
         // overide with programmatically set properties
         if (this.velocityProperties != null) {
-            Iterator keys = this.velocityProperties.keySet().iterator();
-            while (keys.hasNext()) {
-                String key = (String) keys.next();
+            for (Object o : this.velocityProperties.keySet()) {
+                String key = (String) o;
                 properties.setProperty(key, this.velocityProperties.getProperty(key));
             }
         }
@@ -330,8 +321,8 @@
         if (LOG.isDebugEnabled()) {
             LOG.debug("Initializing Velocity with the following properties ...");
 
-            for (Iterator iter = properties.keySet().iterator(); iter.hasNext(); ) {
-                String key = (String) iter.next();
+            for (Object o : properties.keySet()) {
+                String key = (String) o;
                 String value = properties.getProperty(key);
                 LOG.debug("    '{}' = '{}'", key, value);
             }
@@ -394,9 +385,6 @@
         }
     }
 
-
-
-
     /**
      * <p>
      * Instantiates a new VelocityEngine.
@@ -488,11 +476,11 @@
         } else {
             // remove strutsfile from resource loader property
             String prop = properties.getProperty(Velocity.RESOURCE_LOADER);
-            if (prop.indexOf("strutsfile,") != -1) {
+            if (prop.contains("strutsfile,")) {
                 prop = replace(prop, "strutsfile,", "");
-            } else if (prop.indexOf(", strutsfile") != -1) {
+            } else if (prop.contains(", strutsfile")) {
                 prop = replace(prop, ", strutsfile", "");
-            } else if (prop.indexOf("strutsfile") != -1) {
+            } else if (prop.contains("strutsfile")) {
                 prop = replace(prop, "strutsfile", "");
             }
 
diff --git a/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityTagLibrary.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityTagLibrary.java
new file mode 100644
index 0000000..6135164
--- /dev/null
+++ b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityTagLibrary.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.views.velocity;
+
+import org.apache.struts2.views.TagLibraryDirectiveProvider;
+import org.apache.struts2.views.velocity.components.ActionDirective;
+import org.apache.struts2.views.velocity.components.ActionErrorDirective;
+import org.apache.struts2.views.velocity.components.ActionMessageDirective;
+import org.apache.struts2.views.velocity.components.AnchorDirective;
+import org.apache.struts2.views.velocity.components.BeanDirective;
+import org.apache.struts2.views.velocity.components.CheckBoxDirective;
+import org.apache.struts2.views.velocity.components.CheckBoxListDirective;
+import org.apache.struts2.views.velocity.components.ComboBoxDirective;
+import org.apache.struts2.views.velocity.components.ComponentDirective;
+import org.apache.struts2.views.velocity.components.DateDirective;
+import org.apache.struts2.views.velocity.components.DoubleSelectDirective;
+import org.apache.struts2.views.velocity.components.FieldErrorDirective;
+import org.apache.struts2.views.velocity.components.FileDirective;
+import org.apache.struts2.views.velocity.components.FormDirective;
+import org.apache.struts2.views.velocity.components.HeadDirective;
+import org.apache.struts2.views.velocity.components.HiddenDirective;
+import org.apache.struts2.views.velocity.components.I18nDirective;
+import org.apache.struts2.views.velocity.components.IncludeDirective;
+import org.apache.struts2.views.velocity.components.LabelDirective;
+import org.apache.struts2.views.velocity.components.OptionTransferSelectDirective;
+import org.apache.struts2.views.velocity.components.ParamDirective;
+import org.apache.struts2.views.velocity.components.PasswordDirective;
+import org.apache.struts2.views.velocity.components.PropertyDirective;
+import org.apache.struts2.views.velocity.components.PushDirective;
+import org.apache.struts2.views.velocity.components.RadioDirective;
+import org.apache.struts2.views.velocity.components.ResetDirective;
+import org.apache.struts2.views.velocity.components.SelectDirective;
+import org.apache.struts2.views.velocity.components.SetDirective;
+import org.apache.struts2.views.velocity.components.SubmitDirective;
+import org.apache.struts2.views.velocity.components.TextAreaDirective;
+import org.apache.struts2.views.velocity.components.TextDirective;
+import org.apache.struts2.views.velocity.components.TextFieldDirective;
+import org.apache.struts2.views.velocity.components.TokenDirective;
+import org.apache.struts2.views.velocity.components.URLDirective;
+import org.apache.struts2.views.velocity.components.UpDownSelectDirective;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class VelocityTagLibrary implements TagLibraryDirectiveProvider {
+
+    @Override
+    public List<Class> getDirectiveClasses() {
+        Class[] directives = new Class[] {
+            ActionDirective.class,
+            BeanDirective.class,
+            CheckBoxDirective.class,
+            CheckBoxListDirective.class,
+            ComboBoxDirective.class,
+            ComponentDirective.class,
+            DateDirective.class,
+            DoubleSelectDirective.class,
+            FileDirective.class,
+            FormDirective.class,
+            HeadDirective.class,
+            HiddenDirective.class,
+            AnchorDirective.class,
+            I18nDirective.class,
+            IncludeDirective.class,
+            LabelDirective.class,
+            ParamDirective.class,
+            PasswordDirective.class,
+            PushDirective.class,
+            PropertyDirective.class,
+            RadioDirective.class,
+            SelectDirective.class,
+            SetDirective.class,
+            SubmitDirective.class,
+            ResetDirective.class,
+            TextAreaDirective.class,
+            TextDirective.class,
+            TextFieldDirective.class,
+            TokenDirective.class,
+            URLDirective.class,
+            ActionErrorDirective.class,
+            ActionMessageDirective.class,
+            FieldErrorDirective.class,
+            OptionTransferSelectDirective.class,
+            UpDownSelectDirective.class
+        };
+        return Arrays.asList(directives);
+    }
+
+    /**
+     * @deprecated please use {#getDirectiveClasses}
+     */
+    @Deprecated()
+    public List<Class> getVelocityDirectiveClasses() {
+        return getDirectiveClasses();
+    }
+
+}
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/AbstractDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/AbstractDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/AbstractDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/AbstractDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/ActionDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ActionDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/ActionDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ActionDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/ActionErrorDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ActionErrorDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/ActionErrorDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ActionErrorDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/ActionMessageDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ActionMessageDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/ActionMessageDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ActionMessageDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/AnchorDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/AnchorDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/AnchorDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/AnchorDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/BeanDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/BeanDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/BeanDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/BeanDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/CheckBoxDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/CheckBoxDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/CheckBoxDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/CheckBoxDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/CheckBoxListDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/CheckBoxListDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/CheckBoxListDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/CheckBoxListDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/ComboBoxDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ComboBoxDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/ComboBoxDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ComboBoxDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/ComponentDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ComponentDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/ComponentDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ComponentDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/DateDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/DateDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/DateDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/DateDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/DoubleSelectDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/DoubleSelectDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/DoubleSelectDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/DoubleSelectDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/FieldErrorDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/FieldErrorDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/FieldErrorDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/FieldErrorDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/FileDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/FileDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/FileDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/FileDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/FormDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/FormDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/FormDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/FormDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/HeadDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/HeadDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/HeadDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/HeadDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/HiddenDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/HiddenDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/HiddenDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/HiddenDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/I18nDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/I18nDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/I18nDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/I18nDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/IncludeDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/IncludeDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/IncludeDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/IncludeDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/InputTransferSelectDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/InputTransferSelectDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/InputTransferSelectDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/InputTransferSelectDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/LabelDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/LabelDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/LabelDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/LabelDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/OptGroupDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/OptGroupDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/OptGroupDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/OptGroupDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/OptionTransferSelectDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/OptionTransferSelectDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/OptionTransferSelectDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/OptionTransferSelectDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/ParamDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ParamDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/ParamDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ParamDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/PasswordDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/PasswordDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/PasswordDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/PasswordDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/PropertyDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/PropertyDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/PropertyDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/PropertyDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/PushDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/PushDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/PushDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/PushDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/RadioDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/RadioDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/RadioDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/RadioDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/ResetDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ResetDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/ResetDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/ResetDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/SelectDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/SelectDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/SelectDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/SelectDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/SetDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/SetDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/SetDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/SetDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/SubmitDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/SubmitDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/SubmitDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/SubmitDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/TextAreaDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/TextAreaDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/TextAreaDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/TextAreaDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/TextDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/TextDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/TextDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/TextDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/TextFieldDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/TextFieldDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/TextFieldDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/TextFieldDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/TokenDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/TokenDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/TokenDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/TokenDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/URLDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/URLDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/URLDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/URLDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/components/UpDownSelectDirective.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/UpDownSelectDirective.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/components/UpDownSelectDirective.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/components/UpDownSelectDirective.java
diff --git a/core/src/main/java/org/apache/struts2/views/velocity/package.html b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/package.html
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/velocity/package.html
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/package.html
diff --git a/core/src/main/java/org/apache/struts2/result/VelocityResult.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/result/VelocityResult.java
similarity index 98%
rename from core/src/main/java/org/apache/struts2/result/VelocityResult.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/result/VelocityResult.java
index b552fb7..c62f687 100644
--- a/core/src/main/java/org/apache/struts2/result/VelocityResult.java
+++ b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/result/VelocityResult.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.struts2.result;
+package org.apache.struts2.views.velocity.result;
 
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
@@ -26,6 +26,7 @@
 import org.apache.logging.log4j.Logger;
 import org.apache.struts2.ServletActionContext;
 import org.apache.struts2.StrutsConstants;
+import org.apache.struts2.result.StrutsResultSupport;
 import org.apache.struts2.views.JspSupportServlet;
 import org.apache.struts2.views.velocity.VelocityManager;
 import org.apache.velocity.Template;
diff --git a/core/src/main/java/org/apache/struts2/components/template/VelocityTemplateEngine.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/template/VelocityTemplateEngine.java
similarity index 93%
rename from core/src/main/java/org/apache/struts2/components/template/VelocityTemplateEngine.java
rename to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/template/VelocityTemplateEngine.java
index 24f4564..423029e 100644
--- a/core/src/main/java/org/apache/struts2/components/template/VelocityTemplateEngine.java
+++ b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/template/VelocityTemplateEngine.java
@@ -16,12 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.struts2.components.template;
+package org.apache.struts2.views.velocity.template;
 
 import com.opensymphony.xwork2.inject.Inject;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.struts2.ServletActionContext;
+import org.apache.struts2.components.template.BaseTemplateEngine;
+import org.apache.struts2.components.template.Template;
+import org.apache.struts2.components.template.TemplateRenderingContext;
 import org.apache.struts2.views.velocity.VelocityManager;
 import org.apache.velocity.app.VelocityEngine;
 import org.apache.velocity.context.Context;
@@ -29,7 +32,6 @@
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
 import java.io.Writer;
 import java.util.List;
 import java.util.Map;
diff --git a/plugins/velocity/src/main/resources/struts-plugin.xml b/plugins/velocity/src/main/resources/struts-plugin.xml
new file mode 100644
index 0000000..39112ba
--- /dev/null
+++ b/plugins/velocity/src/main/resources/struts-plugin.xml
@@ -0,0 +1,44 @@
+<?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 2.6//EN"
+	"http://struts.apache.org/dtds/struts-2.6.dtd">
+    
+<struts>
+
+    <bean name="struts" class="org.apache.struts2.views.velocity.VelocityManager" />
+
+    <bean type="org.apache.struts2.components.template.TemplateEngine" name="vm"
+          class="org.apache.struts2.views.velocity.template.VelocityTemplateEngine" />
+
+    <bean type="org.apache.struts2.views.TagLibraryDirectiveProvider" name="s"
+          class="org.apache.struts2.views.velocity.VelocityTagLibrary" />
+
+    <package name="velocity-default" extends="struts-default">
+        <result-types>
+            <result-type name="velocity" class="org.apache.struts2.views.velocity.result.VelocityResult"/>
+        </result-types>
+    </package>
+
+    <bean-selection name="velocityBeans" class="org.apache.struts2.views.velocity.VelocityBeanSelectionProvider"/>
+
+</struts>
diff --git a/core/src/test/java/org/apache/struts2/result/VelocityResultTest.java b/plugins/velocity/src/test/java/org/apache/struts2/views/velocity/result/VelocityResultTest.java
similarity index 85%
rename from core/src/test/java/org/apache/struts2/result/VelocityResultTest.java
rename to plugins/velocity/src/test/java/org/apache/struts2/views/velocity/result/VelocityResultTest.java
index 9ba000f..7fa4bb9 100644
--- a/core/src/test/java/org/apache/struts2/result/VelocityResultTest.java
+++ b/plugins/velocity/src/test/java/org/apache/struts2/views/velocity/result/VelocityResultTest.java
@@ -16,11 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.struts2.result;
+package org.apache.struts2.views.velocity.result;
 
-import org.apache.struts2.StrutsInternalTestCase;
+import com.opensymphony.xwork2.XWorkTestCase;
+import junit.framework.TestCase;
 import org.apache.struts2.result.StrutsResultSupport;
-import org.apache.struts2.result.VelocityResult;
 import org.apache.velocity.Template;
 import org.apache.velocity.app.VelocityEngine;
 import org.apache.velocity.exception.ParseErrorException;
@@ -36,7 +36,7 @@
 /**
  *
  */
-public class VelocityResultTest extends StrutsInternalTestCase {
+public class VelocityResultTest extends XWorkTestCase {
 
     ActionInvocation actionInvocation;
     Mock mockActionProxy;
@@ -56,11 +56,11 @@
         ValueStack stack = ActionContext.getContext().getValueStack();
         stack.push(bean);
 
-        assertEquals(location, stack.findValue("location"));
+        TestCase.assertEquals(location, stack.findValue("location"));
 
         result.setLocation("${location}");
         result.execute(actionInvocation);
-        assertEquals(location, result.finalLocation);
+        TestCase.assertEquals(location, result.finalLocation);
     }
 
     public void testCanResolveLocationUsingStaticExpression() throws Exception {
@@ -68,15 +68,15 @@
         String location = "/any.action";
         result.setLocation("${'" + location + "'}");
         result.execute(actionInvocation);
-        assertEquals(location, result.finalLocation);
+        TestCase.assertEquals(location, result.finalLocation);
     }
 
     public void testResourcesFoundUsingAbsolutePath() throws Exception {
         String location = "/WEB-INF/views/registration.vm";
 
         Template template = result.getTemplate(stack, velocity, actionInvocation, location, "UTF-8");
-        assertNotNull(template);
-        assertEquals("expect absolute locations to be handled as is", location, velocity.templateName);
+        TestCase.assertNotNull(template);
+        TestCase.assertEquals("expect absolute locations to be handled as is", location, velocity.templateName);
     }
 
     public void testResourcesFoundUsingNames() throws Exception {
@@ -84,8 +84,8 @@
         String expectedTemplateName = namespace + "/" + location;
 
         Template template = result.getTemplate(stack, velocity, actionInvocation, location, "UTF-8");
-        assertNotNull(template);
-        assertEquals("expect the prefix to be appended to the path when the location is not absolute", expectedTemplateName, velocity.templateName);
+        TestCase.assertNotNull(template);
+        TestCase.assertEquals("expect the prefix to be appended to the path when the location is not absolute", expectedTemplateName, velocity.templateName);
     }
 
     protected void setUp() throws Exception {
diff --git a/plugins/velocity/src/test/java/org/apache/struts2/views/velocity/template/VelocityTemplateEngineTest.java b/plugins/velocity/src/test/java/org/apache/struts2/views/velocity/template/VelocityTemplateEngineTest.java
new file mode 100644
index 0000000..b206e2a
--- /dev/null
+++ b/plugins/velocity/src/test/java/org/apache/struts2/views/velocity/template/VelocityTemplateEngineTest.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.views.velocity.template;
+
+import com.mockobjects.dynamic.C;
+import com.mockobjects.dynamic.Mock;
+import com.opensymphony.xwork2.XWorkTestCase;
+import com.opensymphony.xwork2.inject.Container;
+import org.apache.struts2.components.template.FreemarkerTemplateEngine;
+import org.apache.struts2.components.template.JspTemplateEngine;
+import org.apache.struts2.components.template.Template;
+import org.apache.struts2.components.template.TemplateEngine;
+import org.apache.struts2.components.template.TemplateEngineManager;
+
+import java.util.HashSet;
+
+public class VelocityTemplateEngineTest extends XWorkTestCase {
+
+    private TemplateEngineManager mgr;
+
+    public void setUp() throws Exception {
+        super.setUp();
+
+        mgr = new TemplateEngineManager();
+        Mock mockContainer = new Mock(Container.class);
+        mockContainer.matchAndReturn("getInstance", C.args(C.eq(TemplateEngine.class), C.eq("jsp")), new JspTemplateEngine());
+        mockContainer.matchAndReturn("getInstance", C.args(C.eq(TemplateEngine.class), C.eq("vm")), new VelocityTemplateEngine());
+        mockContainer.matchAndReturn("getInstance", C.args(C.eq(TemplateEngine.class), C.eq("ftl")), new FreemarkerTemplateEngine());
+        mockContainer.matchAndReturn("getInstanceNames", C.args(C.eq(TemplateEngine.class)), new HashSet<String>() {{
+            add("jsp");
+            add("vm");
+            add("ftl");
+        }});
+
+        mgr.setContainer((Container) mockContainer.proxy());
+        mgr.setDefaultTemplateType("jsp");
+    }
+
+    public void testTemplateTypeFromTemplateNameAndDefaults() {
+
+        TemplateEngine engine = mgr.getTemplateEngine(new Template("/template", "simple", "foo"), null);
+        assertTrue(engine instanceof JspTemplateEngine);
+        engine = mgr.getTemplateEngine(new Template("/template", "simple", "foo.vm"), null);
+        assertTrue(engine instanceof VelocityTemplateEngine);
+    }
+
+    public void testTemplateTypeOverrides() {
+        TemplateEngine engine = mgr.getTemplateEngine(new Template("/template", "simple", "foo"), "ftl");
+        assertTrue(engine instanceof FreemarkerTemplateEngine);
+        engine = mgr.getTemplateEngine(new Template("/template", "simple", "foo.vm"), "ftl");
+        assertTrue(engine instanceof VelocityTemplateEngine);
+        engine = mgr.getTemplateEngine(new Template("/template", "simple", "foo.ftl"), "");
+        assertTrue(engine instanceof FreemarkerTemplateEngine);
+    }
+
+    public void testTemplateTypeUsesDefaultWhenNotSetInConfiguration() {
+        mgr.setDefaultTemplateType(null);
+        TemplateEngine engine = mgr.getTemplateEngine(new Template("/template", "simple", "foo"), null);
+        Template template = new Template("/template", "simple", "foo." + TemplateEngineManager.DEFAULT_TEMPLATE_TYPE);
+        TemplateEngine defaultTemplateEngine = mgr.getTemplateEngine(template, null);
+        assertEquals(engine.getClass(), defaultTemplateEngine.getClass());
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index f8128dc..8b42a17 100644
--- a/pom.xml
+++ b/pom.xml
@@ -75,9 +75,9 @@
     <modules>
         <module>bom</module>
         <module>core</module>
-        <module>apps</module>
         <module>plugins</module>
         <module>bundles</module>
+        <module>apps</module>
     </modules>
 
     <licenses>
@@ -691,6 +691,11 @@
                 <artifactId>struts2-osgi-demo-bundle</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.struts</groupId>
+                <artifactId>struts2-velocity-plugin</artifactId>
+                <version>${project.version}</version>
+            </dependency>
 
             <dependency>
                 <groupId>org.freemarker</groupId>
@@ -731,7 +736,6 @@
                 <groupId>org.apache.velocity</groupId>
                 <artifactId>velocity</artifactId>
                 <version>1.7</version>
-                <optional>true</optional>
             </dependency>
 
             <dependency>