You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2019/12/29 08:10:19 UTC

[struts] 01/14: WW-5049 Moves Velocity support into a dedicated plugin

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

lukaszlenart pushed a commit to branch WW-5049-velocity-plugin
in repository https://gitbox.apache.org/repos/asf/struts.git

commit 5c55e69b4fb8effd6456e222ff4d080c13cd41f1
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Mon Nov 25 09:33:05 2019 +0100

    WW-5049 Moves Velocity support into a dedicated plugin
---
 apps/showcase/pom.xml                              |  5 ++
 .../showcase/src/main/resources/struts-tags-ui.xml |  2 +-
 .../java/org/apache/struts2/StrutsConstants.java   |  3 -
 .../config/DefaultBeanSelectionProvider.java       |  4 -
 .../struts2/config/entities/ConstantConfig.java    |  1 -
 .../apache/struts2/views/DefaultTagLibrary.java    | 90 +---------------------
 .../struts2/views/TagLibraryDirectiveProvider.java |  2 +-
 core/src/main/resources/struts-default.xml         |  4 -
 .../struts2/views/TemplateEngineManagerTest.java   | 12 +--
 plugins/pom.xml                                    |  3 +-
 plugins/portlet/pom.xml                            |  5 ++
 plugins/sitemesh/pom.xml                           | 11 +--
 plugins/{sitemesh => velocity}/pom.xml             | 41 ++++++++--
 .../views/velocity/StrutsResourceLoader.java       |  0
 .../views/velocity/StrutsVelocityContext.java      | 13 ++--
 .../velocity/VelocityBeanSelectionProvider.java    | 54 +++++++++++++
 .../struts2/views/velocity/VelocityConstants.java  | 11 ++-
 .../struts2/views/velocity/VelocityManager.java    | 54 +++++--------
 .../struts2/views/velocity/VelocityTagLibrary.java | 33 +++-----
 .../velocity/components/AbstractDirective.java     |  0
 .../views/velocity/components/ActionDirective.java |  0
 .../velocity/components/ActionErrorDirective.java  |  0
 .../components/ActionMessageDirective.java         |  0
 .../views/velocity/components/AnchorDirective.java |  0
 .../views/velocity/components/BeanDirective.java   |  0
 .../velocity/components/CheckBoxDirective.java     |  0
 .../velocity/components/CheckBoxListDirective.java |  0
 .../velocity/components/ComboBoxDirective.java     |  0
 .../velocity/components/ComponentDirective.java    |  0
 .../views/velocity/components/DateDirective.java   |  0
 .../velocity/components/DoubleSelectDirective.java |  0
 .../velocity/components/FieldErrorDirective.java   |  0
 .../views/velocity/components/FileDirective.java   |  0
 .../views/velocity/components/FormDirective.java   |  0
 .../views/velocity/components/HeadDirective.java   |  0
 .../views/velocity/components/HiddenDirective.java |  0
 .../views/velocity/components/I18nDirective.java   |  0
 .../velocity/components/IncludeDirective.java      |  0
 .../components/InputTransferSelectDirective.java   |  0
 .../views/velocity/components/LabelDirective.java  |  0
 .../velocity/components/OptGroupDirective.java     |  0
 .../components/OptionTransferSelectDirective.java  |  0
 .../views/velocity/components/ParamDirective.java  |  0
 .../velocity/components/PasswordDirective.java     |  0
 .../velocity/components/PropertyDirective.java     |  0
 .../views/velocity/components/PushDirective.java   |  0
 .../views/velocity/components/RadioDirective.java  |  0
 .../views/velocity/components/ResetDirective.java  |  0
 .../views/velocity/components/SelectDirective.java |  0
 .../views/velocity/components/SetDirective.java    |  0
 .../views/velocity/components/SubmitDirective.java |  0
 .../velocity/components/TextAreaDirective.java     |  0
 .../views/velocity/components/TextDirective.java   |  0
 .../velocity/components/TextFieldDirective.java    |  0
 .../views/velocity/components/TokenDirective.java  |  0
 .../views/velocity/components/URLDirective.java    |  0
 .../velocity/components/UpDownSelectDirective.java |  0
 .../org/apache/struts2/views/velocity/package.html |  0
 .../views/velocity}/result/VelocityResult.java     |  3 +-
 .../velocity}/template/VelocityTemplateEngine.java |  6 +-
 .../velocity/src/main/resources/struts-plugin.xml  | 41 ++++++++++
 .../resources/template/velocity}/ajax/a-close.vm   |  0
 .../main/resources/template/velocity}/ajax/a.vm    |  0
 .../resources/template/velocity}/ajax/div-close.vm |  0
 .../main/resources/template/velocity}/ajax/div.vm  |  0
 .../template/velocity}/ajax/form-close.vm          |  0
 .../main/resources/template/velocity}/ajax/form.vm |  0
 .../resources/template/velocity}/ajax/submit.vm    |  0
 .../resources/template/velocity}/ajax/tab-close.vm |  0
 .../main/resources/template/velocity}/ajax/tab.vm  |  0
 .../template/velocity}/simple/checkbox.vm          |  0
 .../template/velocity}/simple/checkboxlist.vm      |  0
 .../template/velocity}/simple/combobox.vm          |  0
 .../resources/template/velocity}/simple/debug.vm   |  0
 .../template/velocity}/simple/doubleselect.vm      |  0
 .../resources/template/velocity/simple}/empty.vm   |  0
 .../resources/template/velocity}/simple/file.vm    |  0
 .../template/velocity}/simple/form-close.vm        |  0
 .../resources/template/velocity}/simple/form.vm    |  0
 .../resources/template/velocity}/simple/hidden.vm  |  0
 .../resources/template/velocity}/simple/label.vm   |  0
 .../template/velocity}/simple/password.vm          |  0
 .../template/velocity}/simple/radiomap.vm          |  0
 .../template/velocity}/simple/scripting-events.vm  |  0
 .../resources/template/velocity}/simple/select.vm  |  0
 .../resources/template/velocity}/simple/submit.vm  |  0
 .../resources/template/velocity}/simple/table.vm   |  0
 .../resources/template/velocity}/simple/text.vm    |  0
 .../template/velocity}/simple/textarea.vm          |  0
 .../resources/template/velocity}/simple/token.vm   |  0
 .../resources/template/velocity}/xhtml/checkbox.vm |  0
 .../template/velocity}/xhtml/checkboxlist.vm       |  0
 .../resources/template/velocity}/xhtml/combobox.vm |  0
 .../template/velocity}/xhtml/controlfooter.vm      |  0
 .../template/velocity}/xhtml/controlheader.vm      |  0
 .../resources/template/velocity}/xhtml/debug.vm    |  0
 .../template/velocity}/xhtml/doubleselect.vm       |  0
 .../resources/template/velocity/xhtml}/empty.vm    |  0
 .../resources/template/velocity}/xhtml/file.vm     |  0
 .../template/velocity}/xhtml/form-close.vm         |  0
 .../resources/template/velocity}/xhtml/form.vm     |  0
 .../resources/template/velocity}/xhtml/hidden.vm   |  0
 .../resources/template/velocity}/xhtml/label.vm    |  0
 .../resources/template/velocity}/xhtml/password.vm |  0
 .../resources/template/velocity}/xhtml/radiomap.vm |  0
 .../resources/template/velocity}/xhtml/select.vm   |  0
 .../resources/template/velocity}/xhtml/submit.vm   |  0
 .../resources/template/velocity}/xhtml/table.vm    |  0
 .../resources/template/velocity}/xhtml/text.vm     |  0
 .../resources/template/velocity}/xhtml/textarea.vm |  0
 .../resources/template/velocity}/xhtml/token.vm    |  0
 .../views/velocity}/result/VelocityResultTest.java | 22 +++---
 .../template/VelocityTemplateEngineTest.java       | 48 +++++-------
 pom.xml                                            |  6 +-
 114 files changed, 238 insertions(+), 236 deletions(-)

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/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 @@ public final class StrutsConstants {
     
     /** 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/DefaultBeanSelectionProvider.java
index 0ebe8cd..1e976f0 100644
--- a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java
+++ b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java
@@ -67,7 +67,6 @@ import org.apache.struts2.dispatcher.multipart.MultiPartRequest;
 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
@@ -367,8 +366,6 @@ import org.apache.struts2.views.velocity.VelocityManager;
  */
 public class DefaultBeanSelectionProvider extends AbstractBeanSelectionProvider {
 
-    private static final Logger LOG = LogManager.getLogger(DefaultBeanSelectionProvider.class);
-
     public void register(ContainerBuilder builder, LocatableProperties props) {
         alias(ObjectFactory.class, StrutsConstants.STRUTS_OBJECTFACTORY, builder, props);
         alias(ActionFactory.class, StrutsConstants.STRUTS_OBJECTFACTORY_ACTIONFACTORY, builder, props);
@@ -404,7 +401,6 @@ public class DefaultBeanSelectionProvider extends AbstractBeanSelectionProvider
         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/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 @@ public class ConstantConfig {
         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/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 @@ public class DefaultTagLibrary implements TagLibraryDirectiveProvider, TagLibrar
         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 @@ public interface TagLibraryDirectiveProvider {
      * 
      * @return A list of Velocity directive classes
      */
-    public List<Class> getDirectiveClasses();
+    List<Class> getDirectiveClasses();
 
 }
diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml
index ed850bd..6ab501d 100644
--- a/core/src/main/resources/struts-default.xml
+++ b/core/src/main/resources/struts-default.xml
@@ -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/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.JspTemplateEngine;
 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 @@ public class TemplateEngineManagerTest extends TestCase {
         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 class TemplateEngineManagerTest extends TestCase {
     }
     
     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 @@ public class TemplateEngineManagerTest extends TestCase {
         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/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>
 
+        <!-- Velocity -->
         <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/sitemesh/pom.xml b/plugins/velocity/pom.xml
similarity index 63%
copy from plugins/sitemesh/pom.xml
copy to plugins/velocity/pom.xml
index 66375ae5..de58b17 100644
--- a/plugins/sitemesh/pom.xml
+++ b/plugins/velocity/pom.xml
@@ -27,29 +27,56 @@
         <version>2.6-SNAPSHOT</version>
     </parent>
 
-    <artifactId>struts2-sitemesh-plugin</artifactId>
+    <artifactId>struts2-velocity-plugin</artifactId>
     <packaging>jar</packaging>
-    <name>Struts 2 Sitemesh Plugin</name>
+    <name>Struts 2 Velocity Plugin</name>
 
     <dependencies>
+
+        <!-- Velocity -->
         <dependency>
-            <groupId>opensymphony</groupId>
-            <artifactId>sitemesh</artifactId>
+            <groupId>org.apache.struts</groupId>
+            <artifactId>struts2-core</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>
-            <optional>true</optional>
         </dependency>
 
-   </dependencies>
+        <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>
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 @@ import com.opensymphony.xwork2.util.ValueStack;
 
 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 @@ public class StrutsVelocityContext extends VelocityContext {
         this.stack = stack;
     }
 
-
     public boolean internalContainsKey(Object key) {
         boolean contains = super.internalContainsKey(key);
 
@@ -63,8 +60,8 @@ public class StrutsVelocityContext extends VelocityContext {
 
         // 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 @@ public class StrutsVelocityContext extends VelocityContext {
 
         // 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..5690813
--- /dev/null
+++ b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityBeanSelectionProvider.java
@@ -0,0 +1,54 @@
+/*
+ * 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;
+
+/**
+ * Please see {@link org.apache.struts2.config.DefaultBeanSelectionProvider} 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/java/org/apache/struts2/views/velocity/package.html b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityConstants.java
similarity index 74%
copy from core/src/main/java/org/apache/struts2/views/velocity/package.html
copy to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityConstants.java
index c57efe1..f905662 100644
--- a/core/src/main/java/org/apache/struts2/views/velocity/package.html
+++ b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityConstants.java
@@ -1,4 +1,3 @@
-<!--
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -17,5 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
--->
-<body>Classes for views using Velocity.</body>
+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..b653380 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 @@ import java.util.*;
  * 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 @@ public class VelocityManager {
     protected ToolboxManager toolboxManager = null;
     private String toolBoxLocation;
 
-
     /**
      * Names of contexts that will be chained on every request
      */
@@ -137,8 +129,8 @@ public class VelocityManager {
         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 @@ public class VelocityManager {
 
         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 @@ public class VelocityManager {
             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 @@ public class VelocityManager {
         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 @@ public class VelocityManager {
         }
     }
 
-
-
-
     /**
      * <p>
      * Instantiates a new VelocityEngine.
@@ -488,11 +476,11 @@ public class VelocityManager {
         } 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", "");
             }
 
@@ -536,7 +524,7 @@ public class VelocityManager {
         sb.append(clazz.getName()).append(",");
     }
 
-    private static final String replace(String string, String oldString, String newString) {
+    private String replace(String string, String oldString, String newString) {
         if (string == null) {
             return null;
         }
diff --git a/core/src/main/java/org/apache/struts2/views/DefaultTagLibrary.java b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityTagLibrary.java
similarity index 86%
copy from core/src/main/java/org/apache/struts2/views/DefaultTagLibrary.java
copy to plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityTagLibrary.java
index 5a01df3..6135164 100644
--- a/core/src/main/java/org/apache/struts2/views/DefaultTagLibrary.java
+++ b/plugins/velocity/src/main/java/org/apache/struts2/views/velocity/VelocityTagLibrary.java
@@ -16,15 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.struts2.views;
+package org.apache.struts2.views.velocity;
 
-import java.util.Arrays;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.struts2.views.freemarker.tags.StrutsModels;
+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;
@@ -61,19 +55,12 @@ 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 {
+import java.util.Arrays;
+import java.util.List;
 
-    public Object getModels(ValueStack stack, HttpServletRequest req,
-                            HttpServletResponse res) {
-        
-        return new StrutsModels(stack, req, res);
-    }
+public class VelocityTagLibrary implements TagLibraryDirectiveProvider {
 
+    @Override
     public List<Class> getDirectiveClasses() {
         Class[] directives = new Class[] {
             ActionDirective.class,
@@ -115,10 +102,10 @@ public class DefaultTagLibrary implements TagLibraryDirectiveProvider, TagLibrar
         return Arrays.asList(directives);
     }
 
-    public Object getFreemarkerModels(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
-        return getModels(stack, req, res);
-    }
-
+    /**
+     * @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.LogManager;
 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 org.apache.velocity.context.Context;
 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..00a4207
--- /dev/null
+++ b/plugins/velocity/src/main/resources/struts-plugin.xml
@@ -0,0 +1,41 @@
+<?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.5//EN"
+	"http://struts.apache.org/dtds/struts-2.5.dtd">
+    
+<struts>
+    <bean class="org.apache.struts2.views.velocity.VelocityManager" name="struts" />
+
+    <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>
+
+</struts>
diff --git a/core/src/main/resources/template/archive/ajax/a-close.vm b/plugins/velocity/src/main/resources/template/velocity/ajax/a-close.vm
similarity index 100%
rename from core/src/main/resources/template/archive/ajax/a-close.vm
rename to plugins/velocity/src/main/resources/template/velocity/ajax/a-close.vm
diff --git a/core/src/main/resources/template/archive/ajax/a.vm b/plugins/velocity/src/main/resources/template/velocity/ajax/a.vm
similarity index 100%
rename from core/src/main/resources/template/archive/ajax/a.vm
rename to plugins/velocity/src/main/resources/template/velocity/ajax/a.vm
diff --git a/core/src/main/resources/template/archive/ajax/div-close.vm b/plugins/velocity/src/main/resources/template/velocity/ajax/div-close.vm
similarity index 100%
rename from core/src/main/resources/template/archive/ajax/div-close.vm
rename to plugins/velocity/src/main/resources/template/velocity/ajax/div-close.vm
diff --git a/core/src/main/resources/template/archive/ajax/div.vm b/plugins/velocity/src/main/resources/template/velocity/ajax/div.vm
similarity index 100%
rename from core/src/main/resources/template/archive/ajax/div.vm
rename to plugins/velocity/src/main/resources/template/velocity/ajax/div.vm
diff --git a/core/src/main/resources/template/archive/ajax/form-close.vm b/plugins/velocity/src/main/resources/template/velocity/ajax/form-close.vm
similarity index 100%
rename from core/src/main/resources/template/archive/ajax/form-close.vm
rename to plugins/velocity/src/main/resources/template/velocity/ajax/form-close.vm
diff --git a/core/src/main/resources/template/archive/ajax/form.vm b/plugins/velocity/src/main/resources/template/velocity/ajax/form.vm
similarity index 100%
rename from core/src/main/resources/template/archive/ajax/form.vm
rename to plugins/velocity/src/main/resources/template/velocity/ajax/form.vm
diff --git a/core/src/main/resources/template/archive/ajax/submit.vm b/plugins/velocity/src/main/resources/template/velocity/ajax/submit.vm
similarity index 100%
rename from core/src/main/resources/template/archive/ajax/submit.vm
rename to plugins/velocity/src/main/resources/template/velocity/ajax/submit.vm
diff --git a/core/src/main/resources/template/archive/ajax/tab-close.vm b/plugins/velocity/src/main/resources/template/velocity/ajax/tab-close.vm
similarity index 100%
rename from core/src/main/resources/template/archive/ajax/tab-close.vm
rename to plugins/velocity/src/main/resources/template/velocity/ajax/tab-close.vm
diff --git a/core/src/main/resources/template/archive/ajax/tab.vm b/plugins/velocity/src/main/resources/template/velocity/ajax/tab.vm
similarity index 100%
rename from core/src/main/resources/template/archive/ajax/tab.vm
rename to plugins/velocity/src/main/resources/template/velocity/ajax/tab.vm
diff --git a/core/src/main/resources/template/archive/simple/checkbox.vm b/plugins/velocity/src/main/resources/template/velocity/simple/checkbox.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/checkbox.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/checkbox.vm
diff --git a/core/src/main/resources/template/archive/simple/checkboxlist.vm b/plugins/velocity/src/main/resources/template/velocity/simple/checkboxlist.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/checkboxlist.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/checkboxlist.vm
diff --git a/core/src/main/resources/template/archive/simple/combobox.vm b/plugins/velocity/src/main/resources/template/velocity/simple/combobox.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/combobox.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/combobox.vm
diff --git a/core/src/main/resources/template/archive/simple/debug.vm b/plugins/velocity/src/main/resources/template/velocity/simple/debug.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/debug.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/debug.vm
diff --git a/core/src/main/resources/template/archive/simple/doubleselect.vm b/plugins/velocity/src/main/resources/template/velocity/simple/doubleselect.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/doubleselect.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/doubleselect.vm
diff --git a/core/src/main/resources/template/archive/xhtml/empty.vm b/plugins/velocity/src/main/resources/template/velocity/simple/empty.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/empty.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/empty.vm
diff --git a/core/src/main/resources/template/archive/simple/file.vm b/plugins/velocity/src/main/resources/template/velocity/simple/file.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/file.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/file.vm
diff --git a/core/src/main/resources/template/archive/simple/form-close.vm b/plugins/velocity/src/main/resources/template/velocity/simple/form-close.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/form-close.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/form-close.vm
diff --git a/core/src/main/resources/template/archive/simple/form.vm b/plugins/velocity/src/main/resources/template/velocity/simple/form.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/form.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/form.vm
diff --git a/core/src/main/resources/template/archive/simple/hidden.vm b/plugins/velocity/src/main/resources/template/velocity/simple/hidden.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/hidden.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/hidden.vm
diff --git a/core/src/main/resources/template/archive/simple/label.vm b/plugins/velocity/src/main/resources/template/velocity/simple/label.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/label.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/label.vm
diff --git a/core/src/main/resources/template/archive/simple/password.vm b/plugins/velocity/src/main/resources/template/velocity/simple/password.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/password.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/password.vm
diff --git a/core/src/main/resources/template/archive/simple/radiomap.vm b/plugins/velocity/src/main/resources/template/velocity/simple/radiomap.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/radiomap.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/radiomap.vm
diff --git a/core/src/main/resources/template/archive/simple/scripting-events.vm b/plugins/velocity/src/main/resources/template/velocity/simple/scripting-events.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/scripting-events.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/scripting-events.vm
diff --git a/core/src/main/resources/template/archive/simple/select.vm b/plugins/velocity/src/main/resources/template/velocity/simple/select.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/select.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/select.vm
diff --git a/core/src/main/resources/template/archive/simple/submit.vm b/plugins/velocity/src/main/resources/template/velocity/simple/submit.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/submit.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/submit.vm
diff --git a/core/src/main/resources/template/archive/simple/table.vm b/plugins/velocity/src/main/resources/template/velocity/simple/table.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/table.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/table.vm
diff --git a/core/src/main/resources/template/archive/simple/text.vm b/plugins/velocity/src/main/resources/template/velocity/simple/text.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/text.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/text.vm
diff --git a/core/src/main/resources/template/archive/simple/textarea.vm b/plugins/velocity/src/main/resources/template/velocity/simple/textarea.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/textarea.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/textarea.vm
diff --git a/core/src/main/resources/template/archive/simple/token.vm b/plugins/velocity/src/main/resources/template/velocity/simple/token.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/token.vm
rename to plugins/velocity/src/main/resources/template/velocity/simple/token.vm
diff --git a/core/src/main/resources/template/archive/xhtml/checkbox.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/checkbox.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/checkbox.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/checkbox.vm
diff --git a/core/src/main/resources/template/archive/xhtml/checkboxlist.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/checkboxlist.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/checkboxlist.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/checkboxlist.vm
diff --git a/core/src/main/resources/template/archive/xhtml/combobox.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/combobox.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/combobox.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/combobox.vm
diff --git a/core/src/main/resources/template/archive/xhtml/controlfooter.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/controlfooter.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/controlfooter.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/controlfooter.vm
diff --git a/core/src/main/resources/template/archive/xhtml/controlheader.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/controlheader.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/controlheader.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/controlheader.vm
diff --git a/core/src/main/resources/template/archive/xhtml/debug.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/debug.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/debug.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/debug.vm
diff --git a/core/src/main/resources/template/archive/xhtml/doubleselect.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/doubleselect.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/doubleselect.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/doubleselect.vm
diff --git a/core/src/main/resources/template/archive/simple/empty.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/empty.vm
similarity index 100%
rename from core/src/main/resources/template/archive/simple/empty.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/empty.vm
diff --git a/core/src/main/resources/template/archive/xhtml/file.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/file.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/file.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/file.vm
diff --git a/core/src/main/resources/template/archive/xhtml/form-close.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/form-close.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/form-close.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/form-close.vm
diff --git a/core/src/main/resources/template/archive/xhtml/form.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/form.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/form.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/form.vm
diff --git a/core/src/main/resources/template/archive/xhtml/hidden.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/hidden.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/hidden.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/hidden.vm
diff --git a/core/src/main/resources/template/archive/xhtml/label.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/label.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/label.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/label.vm
diff --git a/core/src/main/resources/template/archive/xhtml/password.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/password.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/password.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/password.vm
diff --git a/core/src/main/resources/template/archive/xhtml/radiomap.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/radiomap.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/radiomap.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/radiomap.vm
diff --git a/core/src/main/resources/template/archive/xhtml/select.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/select.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/select.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/select.vm
diff --git a/core/src/main/resources/template/archive/xhtml/submit.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/submit.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/submit.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/submit.vm
diff --git a/core/src/main/resources/template/archive/xhtml/table.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/table.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/table.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/table.vm
diff --git a/core/src/main/resources/template/archive/xhtml/text.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/text.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/text.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/text.vm
diff --git a/core/src/main/resources/template/archive/xhtml/textarea.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/textarea.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/textarea.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/textarea.vm
diff --git a/core/src/main/resources/template/archive/xhtml/token.vm b/plugins/velocity/src/main/resources/template/velocity/xhtml/token.vm
similarity index 100%
rename from core/src/main/resources/template/archive/xhtml/token.vm
rename to plugins/velocity/src/main/resources/template/velocity/xhtml/token.vm
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 @@ import com.opensymphony.xwork2.util.ValueStack;
 /**
  *
  */
-public class VelocityResultTest extends StrutsInternalTestCase {
+public class VelocityResultTest extends XWorkTestCase {
 
     ActionInvocation actionInvocation;
     Mock mockActionProxy;
@@ -56,11 +56,11 @@ public class VelocityResultTest extends StrutsInternalTestCase {
         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 @@ public class VelocityResultTest extends StrutsInternalTestCase {
         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 @@ public class VelocityResultTest extends StrutsInternalTestCase {
         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/core/src/test/java/org/apache/struts2/views/TemplateEngineManagerTest.java b/plugins/velocity/src/test/java/org/apache/struts2/views/velocity/template/VelocityTemplateEngineTest.java
similarity index 84%
copy from core/src/test/java/org/apache/struts2/views/TemplateEngineManagerTest.java
copy to plugins/velocity/src/test/java/org/apache/struts2/views/velocity/template/VelocityTemplateEngineTest.java
index 3fb8d0d..b206e2a 100644
--- a/core/src/test/java/org/apache/struts2/views/TemplateEngineManagerTest.java
+++ b/plugins/velocity/src/test/java/org/apache/struts2/views/velocity/template/VelocityTemplateEngineTest.java
@@ -16,51 +16,44 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.struts2.views;
-
-import java.util.HashSet;
-
-import junit.framework.TestCase;
+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 org.apache.struts2.components.template.VelocityTemplateEngine;
-import org.apache.struts2.dispatcher.mapper.CompositeActionMapper;
 
-import com.mockobjects.dynamic.C;
-import com.mockobjects.dynamic.Mock;
-import com.opensymphony.xwork2.inject.Container;
+import java.util.HashSet;
+
+public class VelocityTemplateEngineTest extends XWorkTestCase {
+
+    private TemplateEngineManager mgr;
 
-/**
- * TemplateEngineManagerTest
- *
- */
-public class TemplateEngineManagerTest extends TestCase {
-    
-    TemplateEngineManager mgr;
-    Mock mockContainer;
-    
     public void setUp() throws Exception {
+        super.setUp();
+
         mgr = new TemplateEngineManager();
-        mockContainer = new Mock(Container.class);
+        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() {{
+        mockContainer.matchAndReturn("getInstanceNames", C.args(C.eq(TemplateEngine.class)), new HashSet<String>() {{
             add("jsp");
             add("vm");
             add("ftl");
         }});
-        
-        mgr.setContainer((Container)mockContainer.proxy());
+
+        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);
@@ -81,10 +74,11 @@ public class TemplateEngineManagerTest extends TestCase {
         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 {
         super.tearDown();
     }
-}
+
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index f8128dc..c8c6387 100644
--- a/pom.xml
+++ b/pom.xml
@@ -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>