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).
diff --git a/build.gradle.kts b/build.gradle.kts
index e9a2750..b023bee 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -39,8 +39,7 @@
 
 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 @@
 configurations {
     register("combinedClasspath") {
         extendsFrom(named("jython25CompileClasspath").get())
-        extendsFrom(named("jsp21CompileClasspath").get())
+        extendsFrom(named("javaxServletCompileClasspath").get())
     }
 }
 
@@ -494,7 +493,7 @@
             configurations["combinedClasspath"],
             configurations["core16CompileClasspath"],
             configurations["testUtilsCompileClasspath"],
-            configurations["jsp21TestCompileClasspath"]
+            configurations["javaxServletTestCompileClasspath"]
         )
     }
 }
@@ -515,7 +514,7 @@
         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 @@
 
     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 9f67335..0df7dfd 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 @@
         // 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 041f892..b97d2c7 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 @@
 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.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.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.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 @@
     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 @@
         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 @@
             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 @@
         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 @@
 
     @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 @@
 
     @Override
     public void removeAttribute(String name, int scope) {
-        switch(scope) {
+        switch (scope) {
             case PAGE_SCOPE: {
                 environment.getGlobalNamespace().remove(name);
                 break;
@@ -300,11 +320,11 @@
 
     @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 @@
     public HttpSession getSession() {
         return getSession(false);
     }
-    
+
     @Override
     public Object getPage() {
         return servlet;
@@ -401,7 +421,7 @@
             public PrintWriter getWriter() {
                 return pw;
             }
-            
+
             @Override
             public ServletOutputStream getOutputStream() {
                 throw new UnsupportedOperationException("JSP-included resource must use getWriter()");
@@ -422,13 +442,13 @@
 
     @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 @@
             }
         }
         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 @@
                 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-javax-servlet/src/main/java/freemarker/ext/jsp/PageContextFactory.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/PageContextFactory.java
new file mode 100644
index 0000000..b7fedb9
--- /dev/null
+++ b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/PageContextFactory.java
@@ -0,0 +1,39 @@
+/*
+ * 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;
+
+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;
+    }
+}
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/trivial-jstl-@Ignore.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl
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/FreeMarkerJspFactory2.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
deleted file mode 100644
index 2eed561..0000000
--- a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
+++ /dev/null
@@ -1,30 +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;
-
-
-/**
- */
-class FreeMarkerJspFactory2 extends FreeMarkerJspFactory {
-    @Override
-    protected String getSpecificationVersion() {
-        return "2.0";
-    }
-}
\ No newline at end of file
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 51aad6d..0000000
--- 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 d2fa19d..0000000
--- 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 d7670c0..0000000
--- 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 d99e22c..0000000
--- 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 fce81f3..9d184e0 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 @@
         <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 @@
                 </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>