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

ddekany pushed a commit to branch 2.3-gae
in repository https://gitbox.apache.org/repos/asf/freemarker.git

commit 651598673527586ab793664589ae83644451fa43
Author: ddekany <[email protected]>
AuthorDate: Mon Dec 25 18:12:14 2023 +0100

    Dropped support for very old Servlet and JSP versions, and now requiring at 
least Servlet 3.0 and JSP 2.2. This way, we only need to support a single javax 
Servlet/JSP version, and could remove the complications from supporting 
multiple old versions. Also, with this, the "jsp20" and "jsp21" Gradle 
configurations were unified as "javaxServlet" (because later we want to have 
"jakartaServlet" too).
---
 build.gradle.kts                                   |  33 ++--
 .../freemarker/cache/WebappTemplateLoader.java     |   0
 .../ext/jsp/CustomTagAndELFunctionCombiner.java    |   0
 .../java/freemarker/ext/jsp/EventForwarding.java   |   0
 .../ext/jsp/FreeMarkerJspApplicationContext.java   |   0
 .../freemarker/ext/jsp/FreeMarkerJspFactory.java   |  30 +++-
 .../freemarker/ext/jsp/FreeMarkerPageContext.java  | 172 +++++++++++++++------
 .../java/freemarker/ext/jsp/FreemarkerTag.java     |   0
 .../java/freemarker/ext/jsp/JspContextModel.java   |   0
 .../java/freemarker/ext/jsp/JspTagModelBase.java   |   0
 .../java/freemarker/ext/jsp/JspWriterAdapter.java  |   0
 .../freemarker/ext/jsp/PageContextFactory.java     |  23 ++-
 .../ext/jsp/SimpleTagDirectiveModel.java           |   0
 .../java/freemarker/ext/jsp/TagTransformModel.java |   0
 .../java/freemarker/ext/jsp/TaglibFactory.java     |   0
 .../java/freemarker/ext/jsp/TaglibMethodUtil.java  |   0
 .../src/main/java/freemarker/ext/jsp/package.html  |   0
 .../ext/servlet/AllHttpScopesHashModel.java        |   0
 .../freemarker/ext/servlet/FreemarkerServlet.java  |   0
 .../ext/servlet/HttpRequestHashModel.java          |   0
 .../servlet/HttpRequestParametersHashModel.java    |   0
 .../ext/servlet/HttpSessionHashModel.java          |   0
 .../java/freemarker/ext/servlet/IncludePage.java   |   0
 .../freemarker/ext/servlet/InitParamParser.java    |   0
 .../ext/servlet/ServletContextHashModel.java       |   0
 .../freemarker/ext/servlet/SuppressFBWarnings.java |   0
 .../main/java/freemarker/ext/servlet/package.html  |   0
 .../ext/jsp/JspTestFreemarkerServlet.java          |   0
 ...spTestFreemarkerServletWithDefaultOverride.java |   0
 .../ext/jsp/RealServletContainertTest.java         |   0
 .../java/freemarker/ext/jsp/TLDParsingTest.java    |   0
 .../freemarker/ext/jsp/TaglibMethodUtilTest.java   |   0
 .../jsp/taglibmembers/AttributeAccessorTag.java    |   0
 .../ext/jsp/taglibmembers/AttributeInfoTag.java    |   0
 .../ext/jsp/taglibmembers/EnclosingClass.java      |   0
 .../ext/jsp/taglibmembers/GetAndSetTag.java        |   0
 .../ext/jsp/taglibmembers/TestFunctions.java       |   0
 .../ext/jsp/taglibmembers/TestSimpleTag.java       |   0
 .../ext/jsp/taglibmembers/TestSimpleTag2.java      |   0
 .../ext/jsp/taglibmembers/TestSimpleTag3.java      |   0
 .../freemarker/ext/jsp/taglibmembers/TestTag.java  |   0
 .../freemarker/ext/jsp/taglibmembers/TestTag2.java |   0
 .../freemarker/ext/jsp/taglibmembers/TestTag3.java |   0
 .../config/WebappLocalFreemarkerServlet.java       |   0
 .../ext/servlet/FreemarkerServletTest.java         |   0
 .../ext/servlet/InitParamParserTest.java           |   0
 .../freemarker/template/MockServletContext.java    |   0
 .../template/TemplateNotFoundMessageTest.java      |   0
 .../test/servlet/DefaultModel2TesterAction.java    |   0
 .../java/freemarker/test/servlet/Model2Action.java |   0
 .../test/servlet/Model2TesterServlet.java          |   0
 .../freemarker/test/servlet/WebAppTestCase.java    |   0
 .../META-INF/tldDiscovery MetaInfTldSources-1.tld  |   0
 .../freemarker/ext/jsp/TLDParsingTest.tld          |   0
 .../ext/jsp/templates/classpath-test.ftl           |   0
 .../ext/jsp/tldDiscovery-ClassPathTlds-1.tld       |   0
 .../ext/jsp/tldDiscovery-ClassPathTlds-2.tld       |   0
 .../freemarker/ext/jsp/webapps/basic/CONTENTS.txt  |   0
 .../basic/WEB-INF/el-function-tag-name-clash.tld   |   0
 .../ext/jsp/webapps/basic/WEB-INF/el-functions.tld |   0
 .../basic/WEB-INF/expected/attributes-2.3.0.txt    |   0
 .../WEB-INF/expected/attributes-2.3.22-future.txt  |   0
 .../webapps/basic/WEB-INF/expected/attributes.txt  |   0
 .../webapps/basic/WEB-INF/expected/customTags1.txt |   0
 .../ext/jsp/webapps/basic/WEB-INF/test.tld         |   0
 .../ext/jsp/webapps/basic/WEB-INF/web.xml          |   0
 .../ext/jsp/webapps/basic/attributes.ftl           |   0
 .../ext/jsp/webapps/basic/customELFunctions1.ftl   |   0
 .../ext/jsp/webapps/basic/customELFunctions1.jsp   |   0
 .../ext/jsp/webapps/basic/customTags1.ftl          |   0
 .../jsp/webapps/basic/elFunctionsTagNameClash.ftl  |   0
 .../jsp/webapps/basic/elFunctionsTagNameClash.jsp  |   0
 .../ext/jsp/webapps/basic/[email protected] |   0
 .../freemarker/ext/jsp/webapps/basic/trivial.ftl   |   0
 .../freemarker/ext/jsp/webapps/basic/trivial.jsp   |   0
 .../freemarker/ext/jsp/webapps/config/CONTENTS.txt |   0
 .../webapps/config/WEB-INF/classes/sub/test.ftl    |   0
 .../jsp/webapps/config/WEB-INF/classes/test.ftl    |   0
 .../config/WEB-INF/lib/templates.jar/sub/test2.ftl |   0
 .../jsp/webapps/config/WEB-INF/templates/test.ftl  |   0
 .../ext/jsp/webapps/config/WEB-INF/web.xml         |   0
 .../freemarker/ext/jsp/webapps/config/test.ftl     |   0
 .../freemarker/ext/jsp/webapps/errors/CONTENTS.txt |   0
 .../ext/jsp/webapps/errors/WEB-INF/web.xml         |   0
 .../ext/jsp/webapps/errors/failing-parsetime.ftlnv |   0
 .../ext/jsp/webapps/errors/failing-parsetime.jsp   |   0
 .../ext/jsp/webapps/errors/failing-runtime.ftl     |   0
 .../ext/jsp/webapps/errors/failing-runtime.jsp     |   0
 .../ext/jsp/webapps/errors/not-failing.ftl         |   0
 .../ext/jsp/webapps/multipleLoaders/CONTENTS.txt   |   0
 .../multipleLoaders/WEB-INF/templates/test.ftl     |   0
 .../jsp/webapps/multipleLoaders/WEB-INF/web.xml    |   0
 .../ext/jsp/webapps/tldDiscovery/CONTENTS.txt      |   0
 .../WEB-INF/expected/subdir/test-rel.txt           |   0
 .../WEB-INF/expected/test-noClasspath.txt          |   0
 .../tldDiscovery/WEB-INF/expected/test1.txt        |   0
 .../webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld   |   0
 .../webapps/tldDiscovery/WEB-INF/fmtesttag4.tld    |   0
 .../lib/taglib-foo.jar/META-INF/foo bar.tld        |   0
 .../WEB-INF/subdir-with-tld/fmtesttag3.tld         |   0
 .../WEB-INF/taglib 2.jar/META-INF/taglib.tld       |   0
 .../ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml   |   0
 .../tldDiscovery/not-auto-scanned/fmtesttag.tld    |   0
 .../jsp/webapps/tldDiscovery/subdir/test-rel.ftl   |   0
 .../jsp/webapps/tldDiscovery/test-noClasspath.ftl  |   0
 .../ext/jsp/webapps/tldDiscovery/test1.ftl         |   0
 .../test/resources/freemarker/test/servlet/web.xml |   0
 .../freemarker/ext/jsp/PageContextFactory.java     |  71 ---------
 .../ext/jsp/_FreeMarkerPageContext2.java           |  97 ------------
 .../freemarker/ext/jsp/FreeMarkerJspFactory21.java |  51 ------
 .../ext/jsp/_FreeMarkerPageContext21.java          | 121 ---------------
 freemarker-manual/src/main/docgen/en_US/book.xml   |  25 ++-
 112 files changed, 206 insertions(+), 417 deletions(-)

diff --git a/build.gradle.kts b/build.gradle.kts
index e9a2750b..b023bee2 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -39,8 +39,7 @@ tasks.withType<JavaCompile>().configureEach {
 
 freemarkerRoot {
     configureSourceSet(SourceSet.MAIN_SOURCE_SET_NAME) { enableTests() }
-    configureSourceSet("jsp20")
-    configureSourceSet("jsp21") { enableTests() }
+    configureSourceSet("javaxServlet") { enableTests() }
     configureSourceSet("jython20")
     configureSourceSet("jython22")
     configureSourceSet("jython25") { enableTests() }
@@ -105,7 +104,7 @@ tasks.jar.configure {
 configurations {
     register("combinedClasspath") {
         extendsFrom(named("jython25CompileClasspath").get())
-        extendsFrom(named("jsp21CompileClasspath").get())
+        extendsFrom(named("javaxServletCompileClasspath").get())
     }
 }
 
@@ -494,7 +493,7 @@ eclipse {
             configurations["combinedClasspath"],
             configurations["core16CompileClasspath"],
             configurations["testUtilsCompileClasspath"],
-            configurations["jsp21TestCompileClasspath"]
+            configurations["javaxServletTestCompileClasspath"]
         )
     }
 }
@@ -515,7 +514,7 @@ configurations {
         exclude(group = "xml-apis", module = "xml-apis")
     }
 
-    "jsp21TestImplementation" {
+    "javaxServletTestImplementation" {
         extendsFrom(compileClasspath.get())
         exclude(group = "javax.servlet.jsp")
         exclude(group = "javax.servlet", module = "servlet-api")
@@ -544,27 +543,23 @@ dependencies {
 
     testImplementation(xalan)
 
-    "jsp20CompileOnly"("javax.servlet.jsp:jsp-api:2.0")
-    "jsp20CompileOnly"("javax.servlet:servlet-api:2.4")
+    "javaxServletCompileOnly"("javax.servlet.jsp:jsp-api:2.1")
+    "javaxServletCompileOnly"("javax.servlet:servlet-api:2.5")
 
-    "jsp21CompileOnly"(sourceSets["jsp20"].output)
-    "jsp21CompileOnly"("javax.servlet.jsp:jsp-api:2.1")
-    "jsp21CompileOnly"("javax.servlet:servlet-api:2.5")
-
-    "jsp21TestImplementation"("org.eclipse.jetty:jetty-server:${jettyVersion}")
-    "jsp21TestImplementation"("org.eclipse.jetty:jetty-webapp:${jettyVersion}")
-    "jsp21TestImplementation"("org.eclipse.jetty:jetty-util:${jettyVersion}")
-    "jsp21TestImplementation"("org.eclipse.jetty:apache-jsp:${jettyVersion}")
+    
"javaxServletTestImplementation"("org.eclipse.jetty:jetty-server:${jettyVersion}")
+    
"javaxServletTestImplementation"("org.eclipse.jetty:jetty-webapp:${jettyVersion}")
+    
"javaxServletTestImplementation"("org.eclipse.jetty:jetty-util:${jettyVersion}")
+    
"javaxServletTestImplementation"("org.eclipse.jetty:apache-jsp:${jettyVersion}")
     // Jetty also contains the servlet-api and jsp-api classes
 
     // JSP JSTL (not included in Jetty):
-    
"jsp21TestImplementation"("org.apache.taglibs:taglibs-standard-impl:${tagLibsVersion}")
-    
"jsp21TestImplementation"("org.apache.taglibs:taglibs-standard-spec:${tagLibsVersion}")
+    
"javaxServletTestImplementation"("org.apache.taglibs:taglibs-standard-impl:${tagLibsVersion}")
+    
"javaxServletTestImplementation"("org.apache.taglibs:taglibs-standard-spec:${tagLibsVersion}")
 
-    
"jsp21TestImplementation"("org.springframework:spring-core:${springVersion}") {
+    
"javaxServletTestImplementation"("org.springframework:spring-core:${springVersion}")
 {
         exclude(group = "commons-logging", module = "commons-logging")
     }
-    
"jsp21TestImplementation"("org.springframework:spring-test:${springVersion}") {
+    
"javaxServletTestImplementation"("org.springframework:spring-test:${springVersion}")
 {
         exclude(group = "commons-logging", module = "commons-logging")
     }
 
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/cache/WebappTemplateLoader.java 
b/freemarker-javax-servlet/src/main/java/freemarker/cache/WebappTemplateLoader.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/cache/WebappTemplateLoader.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/cache/WebappTemplateLoader.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/EventForwarding.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/EventForwarding.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/jsp/EventForwarding.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/EventForwarding.java
diff --git 
a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
similarity index 100%
rename from 
freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
similarity index 69%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
index 9f673357..0df7dfd8 100644
--- 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
+++ 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
@@ -20,16 +20,21 @@
 package freemarker.ext.jsp;
 
 import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
+import javax.servlet.jsp.JspApplicationContext;
 import javax.servlet.jsp.JspEngineInfo;
 import javax.servlet.jsp.JspFactory;
 import javax.servlet.jsp.PageContext;
 
-/**
- */
-abstract class FreeMarkerJspFactory extends JspFactory {
-    protected abstract String getSpecificationVersion();
+class FreeMarkerJspFactory extends JspFactory {
+    private static final String SPECIFICATION_VERSION = "2.2";
+    private static final String JSPCTX_KEY = 
"freemarker.ext.jsp.FreeMarkerJspFactory21#jspAppContext";
+
+    protected String getSpecificationVersion() {
+        return SPECIFICATION_VERSION;
+    }
     
     @Override
     public JspEngineInfo getEngineInfo() {
@@ -60,4 +65,21 @@ abstract class FreeMarkerJspFactory extends JspFactory {
         // for this API.
         throw new UnsupportedOperationException();
     }
+
+    @Override
+    public JspApplicationContext getJspApplicationContext(ServletContext ctx) {
+        JspApplicationContext jspctx = (JspApplicationContext) 
ctx.getAttribute(
+                JSPCTX_KEY);
+        if (jspctx == null) {
+            synchronized (ctx) {
+                jspctx = (JspApplicationContext) ctx.getAttribute(JSPCTX_KEY);
+                if (jspctx == null) {
+                    jspctx = new FreeMarkerJspApplicationContext();
+                    ctx.setAttribute(JSPCTX_KEY, jspctx);
+                }
+            }
+        }
+        return jspctx;
+    }
+
 }
\ No newline at end of file
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
similarity index 76%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
index 041f8926..b97d2c74 100644
--- 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
+++ 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
@@ -23,12 +23,15 @@ package freemarker.ext.jsp;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.ListIterator;
 
+import javax.el.ELContext;
 import javax.servlet.GenericServlet;
 import javax.servlet.Servlet;
 import javax.servlet.ServletConfig;
@@ -41,8 +44,14 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponseWrapper;
 import javax.servlet.http.HttpSession;
+import javax.servlet.jsp.JspApplicationContext;
+import javax.servlet.jsp.JspContext;
+import javax.servlet.jsp.JspFactory;
 import javax.servlet.jsp.JspWriter;
 import javax.servlet.jsp.PageContext;
+import javax.servlet.jsp.el.ELException;
+import javax.servlet.jsp.el.ExpressionEvaluator;
+import javax.servlet.jsp.el.VariableResolver;
 import javax.servlet.jsp.tagext.BodyContent;
 
 import freemarker.core.Environment;
@@ -50,6 +59,7 @@ import freemarker.ext.servlet.FreemarkerServlet;
 import freemarker.ext.servlet.HttpRequestHashModel;
 import freemarker.ext.servlet.ServletContextHashModel;
 import freemarker.ext.util.WrapperTemplateModel;
+import freemarker.log.Logger;
 import freemarker.template.AdapterTemplateModel;
 import freemarker.template.ObjectWrapper;
 import freemarker.template.ObjectWrapperAndUnwrapper;
@@ -62,13 +72,22 @@ import freemarker.template.TemplateModelIterator;
 import freemarker.template.TemplateNumberModel;
 import freemarker.template.TemplateScalarModel;
 import freemarker.template._VersionInts;
+import freemarker.template.utility.ClassUtil;
 import freemarker.template.utility.UndeclaredThrowableException;
 
-/**
- */
-abstract class FreeMarkerPageContext extends PageContext implements 
TemplateModel {
+class FreeMarkerPageContext extends PageContext implements TemplateModel {
+    private static final Logger LOG = Logger.getLogger("freemarker.jsp");
+
+    static {
+        if (JspFactory.getDefaultFactory() == null) {
+            JspFactory.setDefaultFactory(new FreeMarkerJspFactory());
+        }
+        LOG.debug("Using JspFactory implementation class " +
+                JspFactory.getDefaultFactory().getClass().getName());
+    }
+
     private static final Class OBJECT_CLASS = Object.class;
-        
+
     private final Environment environment;
     private final int incompatibleImprovements;
     private List tags = new ArrayList();
@@ -80,7 +99,8 @@ abstract class FreeMarkerPageContext extends PageContext 
implements TemplateMode
     private final ObjectWrapper wrapper;
     private final ObjectWrapperAndUnwrapper unwrapper;
     private JspWriter jspOut;
-    
+    private ELContext elContext;
+
     protected FreeMarkerPageContext() throws TemplateModelException {
         environment = Environment.getCurrentEnvironment();
         incompatibleImprovements = 
environment.getConfiguration().getIncompatibleImprovements().intValue();
@@ -94,15 +114,15 @@ abstract class FreeMarkerPageContext extends PageContext 
implements TemplateMode
         if (appModel instanceof ServletContextHashModel) {
             this.servlet = ((ServletContextHashModel) appModel).getServlet();
         } else {
-            throw new  TemplateModelException("Could not find an instance of " 
+ 
-                    ServletContextHashModel.class.getName() + 
-                    " in the data model under either the name " + 
-                    FreemarkerServlet.KEY_APPLICATION_PRIVATE + " or " + 
+            throw new TemplateModelException("Could not find an instance of " +
+                    ServletContextHashModel.class.getName() +
+                    " in the data model under either the name " +
+                    FreemarkerServlet.KEY_APPLICATION_PRIVATE + " or " +
                     FreemarkerServlet.KEY_APPLICATION);
         }
-        
-        TemplateModel requestModel = 
-            
environment.getGlobalVariable(FreemarkerServlet.KEY_REQUEST_PRIVATE);
+
+        TemplateModel requestModel =
+                
environment.getGlobalVariable(FreemarkerServlet.KEY_REQUEST_PRIVATE);
         if (!(requestModel instanceof HttpRequestHashModel)) {
             requestModel = environment.getGlobalVariable(
                     FreemarkerServlet.KEY_REQUEST);
@@ -116,10 +136,10 @@ abstract class FreeMarkerPageContext extends PageContext 
implements TemplateMode
             unwrapper = this.wrapper instanceof ObjectWrapperAndUnwrapper
                     ? (ObjectWrapperAndUnwrapper) this.wrapper : null;
         } else {
-            throw new  TemplateModelException("Could not find an instance of " 
+ 
-                    HttpRequestHashModel.class.getName() + 
-                    " in the data model under either the name " + 
-                    FreemarkerServlet.KEY_REQUEST_PRIVATE + " or " + 
+            throw new TemplateModelException("Could not find an instance of " +
+                    HttpRequestHashModel.class.getName() +
+                    " in the data model under either the name " +
+                    FreemarkerServlet.KEY_REQUEST_PRIVATE + " or " +
                     FreemarkerServlet.KEY_REQUEST);
         }
 
@@ -132,17 +152,17 @@ abstract class FreeMarkerPageContext extends PageContext 
implements TemplateMode
         setAttribute(CONFIG, servlet.getServletConfig());
         setAttribute(PAGECONTEXT, this);
         setAttribute(APPLICATION, servlet.getServletContext());
-    }    
-            
+    }
+
     ObjectWrapper getObjectWrapper() {
         return wrapper;
     }
-    
+
     @Override
     public void initialize(
-        Servlet servlet, ServletRequest request, ServletResponse response,
-        String errorPageURL, boolean needsSession, int bufferSize, 
-        boolean autoFlush) {
+            Servlet servlet, ServletRequest request, ServletResponse response,
+            String errorPageURL, boolean needsSession, int bufferSize,
+            boolean autoFlush) {
         throw new UnsupportedOperationException();
     }
 
@@ -157,7 +177,7 @@ abstract class FreeMarkerPageContext extends PageContext 
implements TemplateMode
 
     @Override
     public void setAttribute(String name, Object value, int scope) {
-        switch(scope) {
+        switch (scope) {
             case PAGE_SCOPE: {
                 try {
                     environment.setGlobalVariable(name, wrapper.wrap(value));
@@ -263,7 +283,7 @@ abstract class FreeMarkerPageContext extends PageContext 
implements TemplateMode
 
     @Override
     public void removeAttribute(String name, int scope) {
-        switch(scope) {
+        switch (scope) {
             case PAGE_SCOPE: {
                 environment.getGlobalNamespace().remove(name);
                 break;
@@ -300,11 +320,11 @@ abstract class FreeMarkerPageContext extends PageContext 
implements TemplateMode
 
     @Override
     public Enumeration getAttributeNamesInScope(int scope) {
-        switch(scope) {
+        switch (scope) {
             case PAGE_SCOPE: {
                 try {
-                    return 
-                        new 
TemplateHashModelExEnumeration(environment.getGlobalNamespace());
+                    return
+                            new 
TemplateHashModelExEnumeration(environment.getGlobalNamespace());
                 } catch (TemplateModelException e) {
                     throw new UndeclaredThrowableException(e);
                 }
@@ -347,7 +367,7 @@ abstract class FreeMarkerPageContext extends PageContext 
implements TemplateMode
     public HttpSession getSession() {
         return getSession(false);
     }
-    
+
     @Override
     public Object getPage() {
         return servlet;
@@ -401,7 +421,7 @@ abstract class FreeMarkerPageContext extends PageContext 
implements TemplateMode
             public PrintWriter getWriter() {
                 return pw;
             }
-            
+
             @Override
             public ServletOutputStream getOutputStream() {
                 throw new UnsupportedOperationException("JSP-included resource 
must use getWriter()");
@@ -422,13 +442,13 @@ abstract class FreeMarkerPageContext extends PageContext 
implements TemplateMode
 
     @Override
     public BodyContent pushBody() {
-      return (BodyContent) pushWriter(new 
TagTransformModel.BodyContentImpl(getOut(), true));
-  }
+        return (BodyContent) pushWriter(new 
TagTransformModel.BodyContentImpl(getOut(), true));
+    }
 
-  @Override
-public JspWriter pushBody(Writer w) {
-      return pushWriter(new JspWriterAdapter(w));
-  }
+    @Override
+    public JspWriter pushBody(Writer w) {
+        return pushWriter(new JspWriterAdapter(w));
+    }
 
     @Override
     public JspWriter popBody() {
@@ -444,35 +464,95 @@ public JspWriter pushBody(Writer w) {
             }
         }
         return null;
-    }  
-    
+    }
+
     void popTopTag() {
         tags.remove(tags.size() - 1);
-    }  
+    }
 
     void popWriter() {
         jspOut = (JspWriter) outs.remove(outs.size() - 1);
         setAttribute(OUT, jspOut);
     }
-    
+
     void pushTopTag(Object tag) {
         tags.add(tag);
-    } 
-    
+    }
+
     JspWriter pushWriter(JspWriter out) {
         outs.add(jspOut);
         jspOut = out;
         setAttribute(OUT, jspOut);
         return out;
-    } 
-    
+    }
+
+    /**
+     * Attempts to locate and manufacture an expression evaulator instance. 
For this to work you <b>must</b> have the
+     * Apache Commons-EL package in the classpath. If Commons-EL is not 
available, this method will throw an
+     * UnsupportedOperationException.
+     */
+    @Override
+    public ExpressionEvaluator getExpressionEvaluator() {
+        try {
+            Class type = ((ClassLoader) AccessController.doPrivileged(
+                    new PrivilegedAction() {
+                        @Override
+                        public Object run() {
+                            return 
Thread.currentThread().getContextClassLoader();
+                        }
+                    })).loadClass
+                    ("org.apache.commons.el.ExpressionEvaluatorImpl");
+            return (ExpressionEvaluator) type.newInstance();
+        } catch (Exception e) {
+            throw new UnsupportedOperationException("In order for the 
getExpressionEvaluator() " +
+                    "method to work, you must have downloaded the apache 
commons-el jar and " +
+                    "made it available in the classpath.");
+        }
+    }
+
+    /**
+     * Returns a variable resolver that will resolve variables by searching 
through the page scope, request scope,
+     * session scope and application scope for an attribute with a matching 
name.
+     */
+    @Override
+    public VariableResolver getVariableResolver() {
+        final PageContext ctx = this;
+
+        return new VariableResolver() {
+            @Override
+            public Object resolveVariable(String name) throws ELException {
+                return ctx.findAttribute(name);
+            }
+        };
+    }
+
+    @Override
+    public ELContext getELContext() {
+        if (elContext == null) {
+            JspApplicationContext jspctx = 
JspFactory.getDefaultFactory().getJspApplicationContext(getServletContext());
+            if (jspctx instanceof FreeMarkerJspApplicationContext) {
+                elContext = ((FreeMarkerJspApplicationContext) 
jspctx).createNewELContext(this);
+                elContext.putContext(JspContext.class, this);
+            } else {
+                throw new UnsupportedOperationException(
+                        "Can not create an ELContext using a foreign 
JspApplicationContext (of class "
+                                + ClassUtil.getShortClassNameOfObject(jspctx) 
+ ").\n" +
+                                "Hint: The cause of this is often that you are 
trying to use JSTL tags/functions in " +
+                                "FTL. "
+                                + "In that case, know that that's not really 
suppored, and you are supposed to use FTL "
+                                + "constrcuts instead, like #list instead of 
JSTL's forEach, etc.");
+            }
+        }
+        return elContext;
+    }
+
     private static class TemplateHashModelExEnumeration implements Enumeration 
{
         private final TemplateModelIterator it;
-            
+
         private TemplateHashModelExEnumeration(TemplateHashModelEx hashEx) 
throws TemplateModelException {
             it = hashEx.keys().iterator();
         }
-        
+
         @Override
         public boolean hasMoreElements() {
             try {
@@ -481,7 +561,7 @@ public JspWriter pushBody(Writer w) {
                 throw new UndeclaredThrowableException(tme);
             }
         }
-        
+
         @Override
         public Object nextElement() {
             try {
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreemarkerTag.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreemarkerTag.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreemarkerTag.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreemarkerTag.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspContextModel.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspContextModel.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspContextModel.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspContextModel.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspTagModelBase.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspTagModelBase.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspTagModelBase.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspTagModelBase.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/PageContextFactory.java
similarity index 53%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/PageContextFactory.java
index 2eed561f..b7fedb97 100644
--- 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
+++ 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/PageContextFactory.java
@@ -19,12 +19,21 @@
 
 package freemarker.ext.jsp;
 
+import javax.servlet.jsp.PageContext;
 
-/**
- */
-class FreeMarkerJspFactory2 extends FreeMarkerJspFactory {
-    @Override
-    protected String getSpecificationVersion() {
-        return "2.0";
+import freemarker.core.Environment;
+import freemarker.template.TemplateModel;
+import freemarker.template.TemplateModelException;
+
+class PageContextFactory {
+    static FreeMarkerPageContext getCurrentPageContext() throws 
TemplateModelException {
+        Environment env = Environment.getCurrentEnvironment();
+        TemplateModel pageContextModel = 
env.getGlobalVariable(PageContext.PAGECONTEXT);
+        if (pageContextModel instanceof FreeMarkerPageContext) {
+            return (FreeMarkerPageContext) pageContextModel;
+        }
+        FreeMarkerPageContext pageContext = new FreeMarkerPageContext();
+        env.setGlobalVariable(PageContext.PAGECONTEXT, pageContext);
+        return pageContext;
     }
-}
\ No newline at end of file
+}
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TagTransformModel.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TagTransformModel.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/jsp/TagTransformModel.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TagTransformModel.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibFactory.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TaglibFactory.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibFactory.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TaglibFactory.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/package.html 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/package.html
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/package.html
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/package.html
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java
 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/IncludePage.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/IncludePage.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/servlet/IncludePage.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/IncludePage.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/InitParamParser.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/InitParamParser.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/servlet/InitParamParser.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/InitParamParser.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java
similarity index 100%
rename from 
freemarker-jsp20/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/package.html 
b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/package.html
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/package.html
rename to 
freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/package.html
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/TLDParsingTest.java 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/TLDParsingTest.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/TLDParsingTest.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/TLDParsingTest.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/ext/servlet/InitParamParserTest.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/ext/servlet/InitParamParserTest.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/ext/servlet/InitParamParserTest.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/ext/servlet/InitParamParserTest.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/template/MockServletContext.java 
b/freemarker-javax-servlet/src/test/java/freemarker/template/MockServletContext.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/template/MockServletContext.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/template/MockServletContext.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2Action.java 
b/freemarker-javax-servlet/src/test/java/freemarker/test/servlet/Model2Action.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2Action.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/test/servlet/Model2Action.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
 
b/freemarker-javax-servlet/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
diff --git 
a/freemarker-jsp21/src/test/java/freemarker/test/servlet/WebAppTestCase.java 
b/freemarker-javax-servlet/src/test/java/freemarker/test/servlet/WebAppTestCase.java
similarity index 100%
rename from 
freemarker-jsp21/src/test/java/freemarker/test/servlet/WebAppTestCase.java
rename to 
freemarker-javax-servlet/src/test/java/freemarker/test/servlet/WebAppTestCase.java
diff --git a/freemarker-jsp21/src/test/resources/META-INF/tldDiscovery 
MetaInfTldSources-1.tld 
b/freemarker-javax-servlet/src/test/resources/META-INF/tldDiscovery 
MetaInfTldSources-1.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/META-INF/tldDiscovery 
MetaInfTldSources-1.tld
rename to freemarker-javax-servlet/src/test/resources/META-INF/tldDiscovery 
MetaInfTldSources-1.tld
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/[email protected]
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/[email protected]
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/[email protected]
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/[email protected]
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag
 2.tld 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag
 2.tld
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag
 2.tld
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag
 2.tld
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo
 bar.tld 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo
 bar.tld
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo
 bar.tld
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo
 bar.tld
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib
 2.jar/META-INF/taglib.tld 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib
 2.jar/META-INF/taglib.tld
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib
 2.jar/META-INF/taglib.tld
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib
 2.jar/META-INF/taglib.tld
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl
 
b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl
similarity index 100%
rename from 
freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl
diff --git 
a/freemarker-jsp21/src/test/resources/freemarker/test/servlet/web.xml 
b/freemarker-javax-servlet/src/test/resources/freemarker/test/servlet/web.xml
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/test/servlet/web.xml
rename to 
freemarker-javax-servlet/src/test/resources/freemarker/test/servlet/web.xml
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/PageContextFactory.java 
b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/PageContextFactory.java
deleted file mode 100644
index 51aad6d0..00000000
--- a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/PageContextFactory.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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 freemarker.ext.jsp;
-
-import javax.servlet.jsp.PageContext;
-
-import freemarker.core.Environment;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-import freemarker.template.utility.UndeclaredThrowableException;
-
-/**
- */
-class PageContextFactory {
-    private static final Class pageContextImpl = getPageContextImpl();
-    
-    private static Class getPageContextImpl() {
-        try {
-            try {
-                PageContext.class.getMethod("getELContext", (Class[]) null);
-                return 
Class.forName("freemarker.ext.jsp._FreeMarkerPageContext21");
-            } catch (NoSuchMethodException e1) {
-                try {
-                    PageContext.class.getMethod("getExpressionEvaluator", 
(Class[]) null);
-                    return 
Class.forName("freemarker.ext.jsp._FreeMarkerPageContext2");
-                } catch (NoSuchMethodException e2) {
-                    throw new IllegalStateException(
-                            "Since FreeMarker 2.3.24, JSP support requires at 
least JSP 2.0.");
-                }
-            }
-        } catch (ClassNotFoundException e) {
-            throw new NoClassDefFoundError(e.getMessage());
-        }
-    }
-
-    static FreeMarkerPageContext getCurrentPageContext() throws 
TemplateModelException {
-        Environment env = Environment.getCurrentEnvironment();
-        TemplateModel pageContextModel = 
env.getGlobalVariable(PageContext.PAGECONTEXT);
-        if (pageContextModel instanceof FreeMarkerPageContext) {
-            return (FreeMarkerPageContext) pageContextModel;
-        }
-        try {
-            FreeMarkerPageContext pageContext = 
-                (FreeMarkerPageContext) pageContextImpl.newInstance();
-            env.setGlobalVariable(PageContext.PAGECONTEXT, pageContext);
-            return pageContext;
-        } catch (IllegalAccessException e) {
-            throw new IllegalAccessError(e.getMessage());
-        } catch (InstantiationException e) {
-            throw new UndeclaredThrowableException(e);
-        }
-    }
-    
-}
diff --git 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
 
b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
deleted file mode 100644
index d2fa19dc..00000000
--- 
a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * 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 freemarker.ext.jsp;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.jsp.JspFactory;
-import javax.servlet.jsp.PageContext;
-import javax.servlet.jsp.el.ELException;
-import javax.servlet.jsp.el.ExpressionEvaluator;
-import javax.servlet.jsp.el.VariableResolver;
-
-import freemarker.log.Logger;
-import freemarker.template.TemplateModelException;
-
-/**
- * Don't use this class; it's only public to work around Google App Engine Java
- * compliance issues. FreeMarker developers only: treat this class as 
package-visible.
- * 
- * Implementation of PageContext that contains JSP 2.0 specific methods.
- */
-public class _FreeMarkerPageContext2 extends FreeMarkerPageContext {
-    private static final Logger LOG = Logger.getLogger("freemarker.jsp");
-
-    static {
-        if (JspFactory.getDefaultFactory() == null) {
-            JspFactory.setDefaultFactory(new FreeMarkerJspFactory2());
-        }
-        LOG.debug("Using JspFactory implementation class " + 
-                JspFactory.getDefaultFactory().getClass().getName());
-    }
-
-    public _FreeMarkerPageContext2() throws TemplateModelException {
-        super();
-    }
-
-    /**
-     * Attempts to locate and manufacture an expression evaulator instance. 
For this
-     * to work you <b>must</b> have the Apache Commons-EL package in the 
classpath. If
-     * Commons-EL is not available, this method will throw an 
UnsupportedOperationException. 
-     */
-    @Override
-    public ExpressionEvaluator getExpressionEvaluator() {
-        try {
-            Class type = 
Thread.currentThread().getContextClassLoader().loadClass
-                    ("org.apache.commons.el.ExpressionEvaluatorImpl");
-            return (ExpressionEvaluator) type.newInstance();
-        } catch (Exception e) {
-            throw new UnsupportedOperationException("In order for the 
getExpressionEvaluator() " +
-                "method to work, you must have downloaded the apache 
commons-el jar and " +
-                "made it available in the classpath.");
-        }
-    }
-
-    /**
-     * Returns a variable resolver that will resolve variables by searching 
through
-     * the page scope, request scope, session scope and application scope for 
an
-     * attribute with a matching name.
-     */
-    @Override
-    public VariableResolver getVariableResolver() {
-        final PageContext ctx = this;
-
-        return new VariableResolver() {
-            @Override
-            public Object resolveVariable(String name) throws ELException {
-                return ctx.findAttribute(name);
-            }
-        };
-    }
-
-    /**
-     * Includes the specified path. The flush argument is ignored!
-     */
-    @Override
-    public void include(String path, boolean flush) throws IOException, 
ServletException {
-        super.include(path);
-    }
-}
diff --git 
a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java 
b/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java
deleted file mode 100644
index d7670c0f..00000000
--- 
a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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 freemarker.ext.jsp;
-
-import javax.servlet.ServletContext;
-import javax.servlet.jsp.JspApplicationContext;
-
-/**
- */
-class FreeMarkerJspFactory21 extends FreeMarkerJspFactory {
-    private static final String JSPCTX_KEY =  
-        FreeMarkerJspFactory21.class.getName() + "#jspAppContext";
-
-    @Override
-    protected String getSpecificationVersion() {
-        return "2.1";
-    }
-    
-    @Override
-    public JspApplicationContext getJspApplicationContext(ServletContext ctx) {
-        JspApplicationContext jspctx = (JspApplicationContext) 
ctx.getAttribute(
-                JSPCTX_KEY);
-        if (jspctx == null) {
-            synchronized (ctx) {
-                jspctx = (JspApplicationContext) ctx.getAttribute(JSPCTX_KEY);
-                if (jspctx == null) {
-                    jspctx = new FreeMarkerJspApplicationContext();
-                    ctx.setAttribute(JSPCTX_KEY, jspctx);
-                }
-            }
-        }
-        return jspctx;
-    }
-}
\ No newline at end of file
diff --git 
a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
 
b/freemarker-jsp21/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
deleted file mode 100644
index d99e22cc..00000000
--- 
a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * 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 freemarker.ext.jsp;
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-import javax.el.ELContext;
-import javax.servlet.jsp.JspApplicationContext;
-import javax.servlet.jsp.JspContext;
-import javax.servlet.jsp.JspFactory;
-import javax.servlet.jsp.PageContext;
-import javax.servlet.jsp.el.ELException;
-import javax.servlet.jsp.el.ExpressionEvaluator;
-import javax.servlet.jsp.el.VariableResolver;
-
-import freemarker.log.Logger;
-import freemarker.template.TemplateModelException;
-import freemarker.template.utility.ClassUtil;
-
-/**
- * Don't use this class; it's only public to work around Google App Engine Java
- * compliance issues. FreeMarker developers only: treat this class as 
package-visible.
- * 
- * Implementation of PageContext that contains JSP 2.0 and JSP 2.1 specific 
- * methods.
- */
-public class _FreeMarkerPageContext21 extends FreeMarkerPageContext {
-    private static final Logger LOG = Logger.getLogger("freemarker.jsp");
-
-    static {
-        if (JspFactory.getDefaultFactory() == null) {
-            JspFactory.setDefaultFactory(new FreeMarkerJspFactory21());
-        }
-        LOG.debug("Using JspFactory implementation class " + 
-                JspFactory.getDefaultFactory().getClass().getName());
-    }
-
-    public _FreeMarkerPageContext21() throws TemplateModelException {
-        super();
-    }
-
-    /**
-     * Attempts to locate and manufacture an expression evaulator instance. 
For this
-     * to work you <b>must</b> have the Apache Commons-EL package in the 
classpath. If
-     * Commons-EL is not available, this method will throw an 
UnsupportedOperationException. 
-     */
-    @Override
-    public ExpressionEvaluator getExpressionEvaluator() {
-        try {
-            Class type = ((ClassLoader) AccessController.doPrivileged(
-                    new PrivilegedAction() {
-                        @Override
-                        public Object run() {
-                            return 
Thread.currentThread().getContextClassLoader();
-                        }
-                    })).loadClass
-                    ("org.apache.commons.el.ExpressionEvaluatorImpl");
-            return (ExpressionEvaluator) type.newInstance();
-        } catch (Exception e) {
-            throw new UnsupportedOperationException("In order for the 
getExpressionEvaluator() " +
-                "method to work, you must have downloaded the apache 
commons-el jar and " +
-                "made it available in the classpath.");
-        }
-    }
-
-    /**
-     * Returns a variable resolver that will resolve variables by searching 
through
-     * the page scope, request scope, session scope and application scope for 
an
-     * attribute with a matching name.
-     */
-    @Override
-    public VariableResolver getVariableResolver() {
-        final PageContext ctx = this;
-
-        return new VariableResolver() {
-            @Override
-            public Object resolveVariable(String name) throws ELException {
-                return ctx.findAttribute(name);
-            }
-        };
-    }
-
-    private ELContext elContext;
-    
-    @Override
-    public ELContext getELContext() {
-        if (elContext == null) { 
-            JspApplicationContext jspctx = 
JspFactory.getDefaultFactory().getJspApplicationContext(getServletContext());
-            if (jspctx instanceof FreeMarkerJspApplicationContext) {
-                elContext = ((FreeMarkerJspApplicationContext) 
jspctx).createNewELContext(this);
-                elContext.putContext(JspContext.class, this);
-            } else {
-                throw new UnsupportedOperationException(
-                        "Can not create an ELContext using a foreign 
JspApplicationContext (of class "
-                        + ClassUtil.getShortClassNameOfObject(jspctx) + ").\n" 
+
-                        "Hint: The cause of this is often that you are trying 
to use JSTL tags/functions in FTL. "
-                        + "In that case, know that that's not really suppored, 
and you are supposed to use FTL "
-                        + "constrcuts instead, like #list instead of JSTL's 
forEach, etc.");
-            }
-        }
-        return elContext;
-    }
-}
diff --git a/freemarker-manual/src/main/docgen/en_US/book.xml 
b/freemarker-manual/src/main/docgen/en_US/book.xml
index fce81f36..9d184e00 100644
--- a/freemarker-manual/src/main/docgen/en_US/book.xml
+++ b/freemarker-manual/src/main/docgen/en_US/book.xml
@@ -30097,7 +30097,10 @@ TemplateModel x = env.getVariable("x");  // get 
variable x</programlisting>
         <para>Release date: [TODO]</para>
 
         <para>Please note that with this version the minimum required Java
-        version was increased from Java 7 to Java 8.</para>
+        version was increased from Java 7 to Java 8. Also for the few who
+        relly on Servlet and/or JSP support, the minimum is now increased to
+        Servlet 3.0, and JSP 2.2 (which are still very old versions from
+        2011).</para>
 
         <section>
           <title>Changes on the FTL side</title>
@@ -30301,6 +30304,26 @@ TemplateModel x = env.getVariable("x");  // get 
variable x</programlisting>
                 </listitem>
               </itemizedlist>
             </listitem>
+
+            <listitem>
+              <para>Minimum requirements were increased:</para>
+
+              <itemizedlist>
+                <listitem>
+                  <para>Java 8 (or higher)</para>
+                </listitem>
+
+                <listitem>
+                  <para>If Servlet-related features are used, Servlet 3.0 (or
+                  higher)</para>
+                </listitem>
+
+                <listitem>
+                  <para>If JSP-related features are used, JSP 2.2 (or
+                  higher)</para>
+                </listitem>
+              </itemizedlist>
+            </listitem>
           </itemizedlist>
         </section>
       </section>


Reply via email to