diff --git a/apps/portlet/pom.xml b/apps/portlet/pom.xml
index 4b483b4ae..d4a60566b 100644
--- a/apps/portlet/pom.xml
+++ b/apps/portlet/pom.xml
@@ -19,6 +19,13 @@
provided
+
+ org.apache.struts
+ struts2-portlet-plugin
+ ${pom.version}
+
+
+
javax.servlet
servlet-api
diff --git a/plugins/portlet/pom.xml b/plugins/portlet/pom.xml
new file mode 100644
index 000000000..f5085a2fc
--- /dev/null
+++ b/plugins/portlet/pom.xml
@@ -0,0 +1,143 @@
+
+
+ 4.0.0
+
+ org.apache.struts
+ struts2-plugins
+ 2.0.1-SNAPSHOT
+
+ org.apache.struts
+ struts2-portlet-plugin
+ jar
+ Struts 2 Portlet Plugin
+
+
+
+ apache-site
+ scp://people.apache.org/www/struts.apache.org/2.x/plugins/portlet
+
+
+
+
+
+ org.apache.struts
+ struts-core
+ 1.3.5
+
+
+
+ portlet-api
+ portlet-api
+ 1.0
+ provided
+
+
+
+ javax.servlet
+ jsp-api
+ 2.0
+ provided
+
+
+
+
+ org.apache.pluto
+ pluto
+ 1.0.1-rc4
+ true
+
+
+
+ velocity
+ velocity
+ 1.4
+ true
+
+
+
+ velocity-tools
+ velocity-tools
+ 1.1
+ true
+
+
+
+
+ commons-lang
+ commons-lang
+ 2.0
+
+
+
+ org.springframework
+ spring-core
+ 1.2.8
+ test
+
+
+
+
+ org.springframework
+ spring-mock
+ 1.2.8
+ test
+
+
+
+ org.easymock
+ easymock
+ 2.0
+ test
+
+
+
+ jmock
+ jmock
+ 1.0.1
+ test
+
+
+ jmock
+ jmock-cglib
+ 1.0.1
+ test
+
+
+
+ mockobjects
+ mockobjects-core
+ 0.09
+ test
+
+
+
+ mockobjects
+ mockobjects-jdk1.3
+ 0.09
+ test
+
+
+
+ mockobjects
+ mockobjects-alt-jdk1.3
+ 0.09
+ test
+
+
+
+ mockobjects
+ mockobjects-alt-jdk1.3-j2ee1.3
+ 0.09
+ test
+
+
+
+ mockobjects
+ mockobjects-jdk1.3-j2ee1.3
+ 0.09
+ test
+
+
+
+
diff --git a/core/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java
rename to plugins/portlet/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java
diff --git a/core/src/main/java/org/apache/struts2/portlet/PortletApplicationMap.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/PortletApplicationMap.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/portlet/PortletApplicationMap.java
rename to plugins/portlet/src/main/java/org/apache/struts2/portlet/PortletApplicationMap.java
diff --git a/core/src/main/java/org/apache/struts2/portlet/PortletRequestMap.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/PortletRequestMap.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/portlet/PortletRequestMap.java
rename to plugins/portlet/src/main/java/org/apache/struts2/portlet/PortletRequestMap.java
diff --git a/core/src/main/java/org/apache/struts2/portlet/PortletSessionMap.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/PortletSessionMap.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/portlet/PortletSessionMap.java
rename to plugins/portlet/src/main/java/org/apache/struts2/portlet/PortletSessionMap.java
diff --git a/core/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java
rename to plugins/portlet/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java
diff --git a/core/src/main/java/org/apache/struts2/portlet/context/PreparatorServlet.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/context/PreparatorServlet.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/portlet/context/PreparatorServlet.java
rename to plugins/portlet/src/main/java/org/apache/struts2/portlet/context/PreparatorServlet.java
diff --git a/core/src/main/java/org/apache/struts2/portlet/context/ServletContextHolderListener.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/context/ServletContextHolderListener.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/portlet/context/ServletContextHolderListener.java
rename to plugins/portlet/src/main/java/org/apache/struts2/portlet/context/ServletContextHolderListener.java
diff --git a/core/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java
rename to plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java
diff --git a/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
rename to plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
diff --git a/core/src/main/java/org/apache/struts2/portlet/result/PortletResult.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/result/PortletResult.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/portlet/result/PortletResult.java
rename to plugins/portlet/src/main/java/org/apache/struts2/portlet/result/PortletResult.java
diff --git a/core/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java
rename to plugins/portlet/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java
diff --git a/core/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelper.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelper.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelper.java
rename to plugins/portlet/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelper.java
diff --git a/core/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java b/plugins/portlet/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java
similarity index 100%
rename from core/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java
rename to plugins/portlet/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java
diff --git a/core/src/main/resources/struts-portlet-default.xml b/plugins/portlet/src/main/resources/struts-plugin.xml
similarity index 100%
rename from core/src/main/resources/struts-portlet-default.xml
rename to plugins/portlet/src/main/resources/struts-plugin.xml
diff --git a/plugins/portlet/src/test/java/org/apache/struts2/TestAction.java b/plugins/portlet/src/test/java/org/apache/struts2/TestAction.java
new file mode 100644
index 000000000..ac4394397
--- /dev/null
+++ b/plugins/portlet/src/test/java/org/apache/struts2/TestAction.java
@@ -0,0 +1,139 @@
+/*
+ * $Id$
+ *
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.struts2.views.jsp.ui.User;
+
+import com.opensymphony.xwork2.Action;
+import com.opensymphony.xwork2.ActionSupport;
+
+
+/**
+ */
+public class TestAction extends ActionSupport {
+
+ private static final long serialVersionUID = -8891365561914451494L;
+
+ private Collection collection;
+ private Collection collection2;
+ private Map map;
+ private String foo;
+ private String result;
+ private User user;
+ private String[] array;
+ private String[][] list;
+ private List list2;
+ private List list3;
+
+ public Collection getCollection() {
+ return collection;
+ }
+
+ public void setCollection(Collection collection) {
+ this.collection = collection;
+ }
+
+ public Map getMap() {
+ return map;
+ }
+
+ public void setMap(Map map) {
+ this.map = map;
+ }
+
+ public String getFoo() {
+ return foo;
+ }
+
+ public void setFoo(String foo) {
+ this.foo = foo;
+ }
+
+ public String getResult() {
+ return result;
+ }
+
+ public void setResult(String result) {
+ this.result = result;
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(User user) {
+ this.user = user;
+ }
+
+ public String[] getArray() {
+ return array;
+ }
+
+ public void setArray(String[] array) {
+ this.array = array;
+ }
+
+ public String[][] getList() {
+ return list;
+ }
+
+ public void setList(String[][] list) {
+ this.list = list;
+ }
+
+ public List getList2() {
+ return list2;
+ }
+
+ public void setList2(List list2) {
+ this.list2 = list2;
+ }
+
+ public void setList3(List list) {
+ this.list3 = list;
+ }
+
+ public List getList3() {
+ return this.list3;
+ }
+
+ public Collection getCollection2() {
+ return this.collection2;
+ }
+
+ public void setCollection2(Collection collection) {
+ this.collection2 = collection;
+ }
+
+ public String execute() throws Exception {
+ if (result == null) {
+ result = Action.SUCCESS;
+ }
+
+ return result;
+ }
+
+ public String doInput() throws Exception {
+ return INPUT;
+ }
+
+}
diff --git a/core/src/test/java/org/apache/struts2/portlet/PortletApplicationMapTest.java b/plugins/portlet/src/test/java/org/apache/struts2/portlet/PortletApplicationMapTest.java
similarity index 100%
rename from core/src/test/java/org/apache/struts2/portlet/PortletApplicationMapTest.java
rename to plugins/portlet/src/test/java/org/apache/struts2/portlet/PortletApplicationMapTest.java
diff --git a/core/src/test/java/org/apache/struts2/portlet/PortletRequestMapTest.java b/plugins/portlet/src/test/java/org/apache/struts2/portlet/PortletRequestMapTest.java
similarity index 100%
rename from core/src/test/java/org/apache/struts2/portlet/PortletRequestMapTest.java
rename to plugins/portlet/src/test/java/org/apache/struts2/portlet/PortletRequestMapTest.java
diff --git a/core/src/test/java/org/apache/struts2/portlet/PortletSessionMapTest.java b/plugins/portlet/src/test/java/org/apache/struts2/portlet/PortletSessionMapTest.java
similarity index 100%
rename from core/src/test/java/org/apache/struts2/portlet/PortletSessionMapTest.java
rename to plugins/portlet/src/test/java/org/apache/struts2/portlet/PortletSessionMapTest.java
diff --git a/core/src/test/java/org/apache/struts2/portlet/context/PortletActionContextTest.java b/plugins/portlet/src/test/java/org/apache/struts2/portlet/context/PortletActionContextTest.java
similarity index 100%
rename from core/src/test/java/org/apache/struts2/portlet/context/PortletActionContextTest.java
rename to plugins/portlet/src/test/java/org/apache/struts2/portlet/context/PortletActionContextTest.java
diff --git a/core/src/test/java/org/apache/struts2/portlet/context/PreparatorServletTest.java b/plugins/portlet/src/test/java/org/apache/struts2/portlet/context/PreparatorServletTest.java
similarity index 100%
rename from core/src/test/java/org/apache/struts2/portlet/context/PreparatorServletTest.java
rename to plugins/portlet/src/test/java/org/apache/struts2/portlet/context/PreparatorServletTest.java
diff --git a/core/src/test/java/org/apache/struts2/portlet/context/ServletContextHolderListenerTest.java b/plugins/portlet/src/test/java/org/apache/struts2/portlet/context/ServletContextHolderListenerTest.java
similarity index 100%
rename from core/src/test/java/org/apache/struts2/portlet/context/ServletContextHolderListenerTest.java
rename to plugins/portlet/src/test/java/org/apache/struts2/portlet/context/ServletContextHolderListenerTest.java
diff --git a/core/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java b/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
similarity index 100%
rename from core/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
rename to plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
diff --git a/core/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java b/plugins/portlet/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java
similarity index 100%
rename from core/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java
rename to plugins/portlet/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java
diff --git a/core/src/test/java/org/apache/struts2/portlet/util/PortletUrlHelperTest.java b/plugins/portlet/src/test/java/org/apache/struts2/portlet/util/PortletUrlHelperTest.java
similarity index 100%
rename from core/src/test/java/org/apache/struts2/portlet/util/PortletUrlHelperTest.java
rename to plugins/portlet/src/test/java/org/apache/struts2/portlet/util/PortletUrlHelperTest.java
diff --git a/core/src/test/java/org/apache/struts2/portlet/util/StrutsUtilTest.java b/plugins/portlet/src/test/java/org/apache/struts2/portlet/util/StrutsUtilTest.java
similarity index 100%
rename from core/src/test/java/org/apache/struts2/portlet/util/StrutsUtilTest.java
rename to plugins/portlet/src/test/java/org/apache/struts2/portlet/util/StrutsUtilTest.java
diff --git a/core/src/test/java/org/apache/struts2/views/jsp/PortletUrlTagTest.java b/plugins/portlet/src/test/java/org/apache/struts2/views/jsp/PortletUrlTagTest.java
similarity index 100%
rename from core/src/test/java/org/apache/struts2/views/jsp/PortletUrlTagTest.java
rename to plugins/portlet/src/test/java/org/apache/struts2/views/jsp/PortletUrlTagTest.java
diff --git a/plugins/portlet/src/test/java/org/apache/struts2/views/jsp/ui/User.java b/plugins/portlet/src/test/java/org/apache/struts2/views/jsp/ui/User.java
new file mode 100644
index 000000000..2f5d2fa32
--- /dev/null
+++ b/plugins/portlet/src/test/java/org/apache/struts2/views/jsp/ui/User.java
@@ -0,0 +1,39 @@
+/*
+ * $Id$
+ *
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.jsp.ui;
+
+
+/**
+ */
+public class User {
+
+ private String name;
+
+
+ public User() {
+ }
+
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}