Add missing tags and TLDs to standard-compat jar
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/core/RedirectTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/core/RedirectTag.java
index e30bc96..9808d36 100644
--- a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/core/RedirectTag.java
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/core/RedirectTag.java
@@ -52,7 +52,7 @@
         urlExpression = ExpressionUtil.createValueExpression(pageContext, url, String.class);
     }
 
-    public void setContextExpression(String context) {
+    public void setContext(String context) {
         contextExpression = ExpressionUtil.createValueExpression(pageContext, context, String.class);
     }
 }
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/BundleTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/BundleTag.java
new file mode 100644
index 0000000..0c0a730
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/BundleTag.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.fmt;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.fmt.BundleSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <bundle>} using the container's EL implementation.
+ */
+public class BundleTag extends BundleSupport {
+
+    private ValueExpression basenameExpression;
+    private ValueExpression prefixExpression;
+
+    public int doStartTag() throws JspException {
+        basename = ExpressionUtil.evaluate(basenameExpression, pageContext);
+        prefix = ExpressionUtil.evaluate(prefixExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    public void release() {
+        super.release();
+
+        basenameExpression = null;
+        prefixExpression = null;
+    }
+
+
+    public void setBasename(String expression) {
+        basenameExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setPrefix(String expression) {
+        prefixExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/FormatDateTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/FormatDateTag.java
new file mode 100644
index 0000000..cb775f7
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/FormatDateTag.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.fmt;
+
+import java.util.Date;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.fmt.FormatDateSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <formatDate>} using the container's EL implementation.
+ */
+public class FormatDateTag extends FormatDateSupport {
+
+    private ValueExpression valueExpression;
+    private ValueExpression typeExpression;
+    private ValueExpression dateStyleExpression;
+    private ValueExpression timeStyleExpression;
+    private ValueExpression patternExpression;
+    private ValueExpression timeZoneExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        value = ExpressionUtil.evaluate(valueExpression, pageContext);
+        type = ExpressionUtil.evaluate(typeExpression, pageContext);
+        dateStyle = ExpressionUtil.evaluate(dateStyleExpression, pageContext);
+        timeStyle = ExpressionUtil.evaluate(timeStyleExpression, pageContext);
+        pattern = ExpressionUtil.evaluate(patternExpression, pageContext);
+        timeZone = ExpressionUtil.evaluate(timeZoneExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+        valueExpression = null;
+        typeExpression = null;
+        dateStyleExpression = null;
+        timeStyleExpression = null;
+        patternExpression = null;
+        timeZoneExpression = null;
+    }
+
+    public void setValue(String expression) {
+        valueExpression = ExpressionUtil.createValueExpression(pageContext, expression, Date.class);
+    }
+
+    public void setType(String expression) {
+        typeExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setDateStyle(String expression) {
+        dateStyleExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setTimeStyle(String expression) {
+        timeStyleExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setPattern(String expression) {
+        patternExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setTimeZone(String expression) {
+        timeZoneExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/FormatNumberTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/FormatNumberTag.java
new file mode 100644
index 0000000..0e73549
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/FormatNumberTag.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.fmt;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.fmt.FormatNumberSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <formatNumber>} using the container's EL implementation.
+ */
+public class FormatNumberTag extends FormatNumberSupport {
+
+    private ValueExpression valueExpression;
+    private ValueExpression typeExpression;
+    private ValueExpression patternExpression;
+    private ValueExpression currencyCodeExpression;
+    private ValueExpression currencySymbolExpression;
+    private ValueExpression groupingUsedExpression;
+    private ValueExpression maxIntegerDigitsExpression;
+    private ValueExpression minIntegerDigitsExpression;
+    private ValueExpression maxFractionDigitsExpression;
+    private ValueExpression minFractionDigitsExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        value = ExpressionUtil.evaluate(valueExpression, pageContext);
+        type = ExpressionUtil.evaluate(typeExpression, pageContext);
+        pattern = ExpressionUtil.evaluate(patternExpression, pageContext);
+        currencyCode = ExpressionUtil.evaluate(currencyCodeExpression, pageContext);
+        currencySymbol = ExpressionUtil.evaluate(currencySymbolExpression, pageContext);
+        isGroupingUsed = ExpressionUtil.evaluate(groupingUsedExpression, pageContext, false);
+        maxIntegerDigits = ExpressionUtil.evaluate(maxIntegerDigitsExpression, pageContext, 0);
+        minIntegerDigits = ExpressionUtil.evaluate(minIntegerDigitsExpression, pageContext, 0);
+        maxFractionDigits = ExpressionUtil.evaluate(maxFractionDigitsExpression, pageContext, 0);
+        minFractionDigits = ExpressionUtil.evaluate(minFractionDigitsExpression, pageContext, 0);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        valueExpression = null;
+        typeExpression = null;
+        patternExpression = null;
+        currencyCodeExpression = null;
+        currencySymbolExpression = null;
+        groupingUsedExpression = null;
+        maxIntegerDigitsExpression = null;
+        minIntegerDigitsExpression = null;
+        maxFractionDigitsExpression = null;
+        minFractionDigitsExpression = null;
+
+        super.release();
+    }
+
+    public void setValue(String expression) {
+        valueExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+        valueSpecified = true;
+    }
+
+    public void setType(String expression) {
+        typeExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setPattern(String expression) {
+        patternExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setCurrencyCode(String expression) {
+        currencyCodeExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setCurrencySymbol(String expression) {
+        currencySymbolExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setGroupingUsed(String expression) {
+        groupingUsedExpression = ExpressionUtil.createValueExpression(pageContext, expression, Boolean.class);
+        groupingUsedSpecified = true;
+    }
+
+    public void setMaxIntegerDigits(String expression) {
+        maxIntegerDigitsExpression = ExpressionUtil.createValueExpression(pageContext, expression, Integer.class);
+        maxIntegerDigitsSpecified = true;
+    }
+
+    public void setMinIntegerDigits(String expression) {
+        minIntegerDigitsExpression = ExpressionUtil.createValueExpression(pageContext, expression, Integer.class);
+        minIntegerDigitsSpecified = true;
+    }
+
+    public void setMaxFactionDigits(String expression) {
+        maxFractionDigitsExpression = ExpressionUtil.createValueExpression(pageContext, expression, Integer.class);
+        maxFractionDigitsSpecified = true;
+    }
+
+    public void setMinFractionDigits(String expression) {
+        minFractionDigitsExpression = ExpressionUtil.createValueExpression(pageContext, expression, Integer.class);
+        minFractionDigitsSpecified = true;
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/MessageTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/MessageTag.java
new file mode 100644
index 0000000..f6e785b
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/MessageTag.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.fmt;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.jstl.fmt.LocalizationContext;
+
+import org.apache.taglibs.standard.tag.common.fmt.MessageSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <message>} using the container's EL implementation.
+ */
+public class MessageTag extends MessageSupport {
+
+    private ValueExpression keyExpression;
+    private ValueExpression bundleExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        keyAttrValue = ExpressionUtil.evaluate(keyExpression, pageContext);
+        bundleAttrValue = ExpressionUtil.evaluate(bundleExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        keyExpression = null;
+        bundleExpression = null;
+    }
+
+    public void setKey(String expression) {
+        keyExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+        keySpecified = true;
+    }
+
+    public void setBundle(String expression) {
+        bundleExpression = ExpressionUtil.createValueExpression(pageContext, expression, LocalizationContext.class);
+        bundleSpecified = true;
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/ParamTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/ParamTag.java
new file mode 100644
index 0000000..f365622
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/ParamTag.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.fmt;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.fmt.ParamSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <param>} using the container's EL implementation.
+ */
+public class ParamTag extends ParamSupport {
+    private ValueExpression valueExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        value = ExpressionUtil.evaluate(valueExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        valueExpression = null;
+    }
+
+    public void setValue(String expression) {
+        valueExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+        valueSpecified = true;
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/ParseDateTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/ParseDateTag.java
new file mode 100644
index 0000000..49e81f9
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/ParseDateTag.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.fmt;
+
+import java.util.Date;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.fmt.LocaleUtil;
+import org.apache.taglibs.standard.tag.common.fmt.ParseDateSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <parseDate>} using the container's EL implementation.
+ */
+public class ParseDateTag extends ParseDateSupport {
+
+    private ValueExpression valueExpression;
+    private ValueExpression typeExpression;
+    private ValueExpression dateStyleExpression;
+    private ValueExpression timeStyleExpression;
+    private ValueExpression patternExpression;
+    private ValueExpression timeZoneExpression;
+    private ValueExpression parseLocaleExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        value = ExpressionUtil.evaluate(valueExpression, pageContext);
+        type = ExpressionUtil.evaluate(typeExpression, pageContext);
+        dateStyle = ExpressionUtil.evaluate(dateStyleExpression, pageContext);
+        timeStyle = ExpressionUtil.evaluate(timeStyleExpression, pageContext);
+        pattern = ExpressionUtil.evaluate(patternExpression, pageContext);
+        timeZone = ExpressionUtil.evaluate(timeZoneExpression, pageContext);
+        parseLocale = LocaleUtil.parseLocaleAttributeValue(
+                ExpressionUtil.evaluate(parseLocaleExpression, pageContext));
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+        valueExpression = null;
+        typeExpression = null;
+        dateStyleExpression = null;
+        timeStyleExpression = null;
+        patternExpression = null;
+        timeZoneExpression = null;
+        parseLocaleExpression = null;
+    }
+
+    public void setValue(String expression) {
+        valueExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+        valueSpecified = true;
+    }
+
+    public void setType(String expression) {
+        typeExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setDateStyle(String expression) {
+        dateStyleExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setTimeStyle(String expression) {
+        timeStyleExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setPattern(String expression) {
+        patternExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setTimeZone(String expression) {
+        timeZoneExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+    }
+
+    public void setParseLocale(String expression) {
+        parseLocaleExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/ParseNumberTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/ParseNumberTag.java
new file mode 100644
index 0000000..b058fbe
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/ParseNumberTag.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.fmt;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.fmt.LocaleUtil;
+import org.apache.taglibs.standard.tag.common.fmt.ParseNumberSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <parseNumber>} using the container's EL implementation.
+ */
+public class ParseNumberTag extends ParseNumberSupport {
+
+    private ValueExpression valueExpression;
+    private ValueExpression typeExpression;
+    private ValueExpression patternExpression;
+    private ValueExpression parseLocaleExpression;
+    private ValueExpression integerOnlyExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        value = ExpressionUtil.evaluate(valueExpression, pageContext);
+        type = ExpressionUtil.evaluate(typeExpression, pageContext);
+        pattern = ExpressionUtil.evaluate(patternExpression, pageContext);
+        parseLocale = LocaleUtil.parseLocaleAttributeValue(
+                ExpressionUtil.evaluate(parseLocaleExpression, pageContext));
+        isIntegerOnly = ExpressionUtil.evaluate(integerOnlyExpression, pageContext, false);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        valueExpression = null;
+        typeExpression = null;
+        patternExpression = null;
+        parseLocaleExpression = null;
+        integerOnlyExpression = null;
+
+        super.release();
+    }
+
+    public void setValue(String expression) {
+        valueExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+        valueSpecified = true;
+    }
+
+    public void setType(String expression) {
+        typeExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setPattern(String expression) {
+        patternExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setParseLocale(String expression) {
+        parseLocaleExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+    }
+
+    public void setIntegerOnly(String expression) {
+        integerOnlyExpression = ExpressionUtil.createValueExpression(pageContext, expression, Boolean.class);
+        integerOnlySpecified = true;
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/RequestEncodingTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/RequestEncodingTag.java
new file mode 100644
index 0000000..3511b01
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/RequestEncodingTag.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.fmt;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.fmt.ParamSupport;
+import org.apache.taglibs.standard.tag.common.fmt.RequestEncodingSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <requestEncoding>} using the container's EL implementation.
+ */
+public class RequestEncodingTag extends RequestEncodingSupport {
+    private ValueExpression valueExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        value = ExpressionUtil.evaluate(valueExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        valueExpression = null;
+    }
+
+    public void setValue(String expression) {
+        valueExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/SetBundleTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/SetBundleTag.java
new file mode 100644
index 0000000..1a459bf
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/SetBundleTag.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.fmt;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.fmt.BundleSupport;
+import org.apache.taglibs.standard.tag.common.fmt.SetBundleSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <setBundle>} using the container's EL implementation.
+ */
+public class SetBundleTag extends SetBundleSupport {
+
+    private ValueExpression basenameExpression;
+
+    public int doStartTag() throws JspException {
+        basename = ExpressionUtil.evaluate(basenameExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    public void release() {
+        super.release();
+
+        basenameExpression = null;
+    }
+
+
+    public void setBasename(String expression) {
+        basenameExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/SetLocaleTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/SetLocaleTag.java
new file mode 100644
index 0000000..d6921f2
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/SetLocaleTag.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.fmt;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.fmt.ParamSupport;
+import org.apache.taglibs.standard.tag.common.fmt.SetLocaleSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <param>} using the container's EL implementation.
+ */
+public class SetLocaleTag extends SetLocaleSupport {
+    private ValueExpression valueExpression;
+    private ValueExpression variantExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        value = ExpressionUtil.evaluate(valueExpression, pageContext);
+        variant = ExpressionUtil.evaluate(variantExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        valueExpression = null;
+        variantExpression = null;
+    }
+
+    public void setValue(String expression) {
+        valueExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+    }
+
+    public void setVariant(String expression) {
+        variantExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/SetTimeZoneTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/SetTimeZoneTag.java
new file mode 100644
index 0000000..f24c682
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/SetTimeZoneTag.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.fmt;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.fmt.ParamSupport;
+import org.apache.taglibs.standard.tag.common.fmt.SetTimeZoneSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <setTimeZone>} using the container's EL implementation.
+ */
+public class SetTimeZoneTag extends SetTimeZoneSupport {
+    private ValueExpression valueExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        value = ExpressionUtil.evaluate(valueExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        valueExpression = null;
+    }
+
+    public void setValue(String expression) {
+        valueExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/TimeZoneTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/TimeZoneTag.java
new file mode 100644
index 0000000..e836a19
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/fmt/TimeZoneTag.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.fmt;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.fmt.TimeZoneSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <timeZone>} using the container's EL implementation.
+ */
+public class TimeZoneTag extends TimeZoneSupport {
+    private ValueExpression valueExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        value = ExpressionUtil.evaluate(valueExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        valueExpression = null;
+    }
+
+    public void setValue(String expression) {
+        valueExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/DateParamTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/DateParamTag.java
new file mode 100644
index 0000000..2e53ea6
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/DateParamTag.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.sql;
+
+import java.util.Date;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.sql.DateParamTagSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <dateParam>} using the container's EL implementation.
+ */
+public class DateParamTag extends DateParamTagSupport {
+    private ValueExpression valueExpression;
+    private ValueExpression typeExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        value = ExpressionUtil.evaluate(valueExpression, pageContext);
+        type = ExpressionUtil.evaluate(typeExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        valueExpression = null;
+        typeExpression = null;
+    }
+
+    public void setValue(String expression) {
+        valueExpression = ExpressionUtil.createValueExpression(pageContext, expression, Date.class);
+    }
+
+    public void setType(String expression) {
+        typeExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/ParamTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/ParamTag.java
new file mode 100644
index 0000000..1706369
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/ParamTag.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.sql;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.sql.ParamTagSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <param>} using the container's EL implementation.
+ */
+public class ParamTag extends ParamTagSupport {
+    private ValueExpression valueExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        value = ExpressionUtil.evaluate(valueExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        valueExpression = null;
+    }
+
+    public void setValue(String expression) {
+        valueExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/QueryTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/QueryTag.java
new file mode 100644
index 0000000..322a511
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/QueryTag.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.sql;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.sql.QueryTagSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <query>} using the container's EL implementation.
+ */
+public class QueryTag extends QueryTagSupport {
+    private ValueExpression dataSourceExpression;
+    private ValueExpression sqlExpression;
+    private ValueExpression startRowExpression;
+    private ValueExpression maxRowsExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        rawDataSource = ExpressionUtil.evaluate(dataSourceExpression, pageContext);
+        sql = ExpressionUtil.evaluate(sqlExpression, pageContext);
+        startRow = ExpressionUtil.evaluate(startRowExpression, pageContext, 0);
+        maxRows = ExpressionUtil.evaluate(maxRowsExpression, pageContext, -1);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        dataSourceExpression = null;
+        sqlExpression = null;
+        startRowExpression = null;
+        maxRowsExpression = null;
+    }
+
+    public void setDataSource(String expression) {
+        dataSourceExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+        dataSourceSpecified = true;
+    }
+
+    public void setSql(String expression) {
+        sqlExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setStartRow(String expression) {
+        startRowExpression = ExpressionUtil.createValueExpression(pageContext, expression, Integer.class);
+    }
+
+    public void setMaxRows(String expression) {
+        maxRowsExpression = ExpressionUtil.createValueExpression(pageContext, expression, Integer.class);
+        maxRowsSpecified = true;
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/SetDataSourceTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/SetDataSourceTag.java
new file mode 100644
index 0000000..22525bc
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/SetDataSourceTag.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.sql;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.sql.SetDataSourceTagSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <setDataSource>} using the container's EL implementation.
+ */
+public class SetDataSourceTag extends SetDataSourceTagSupport {
+    private ValueExpression dataSourceExpression;
+    private ValueExpression driverClassNameExpression;
+    private ValueExpression jdbcUrlExpression;
+    private ValueExpression usernameExpression;
+    private ValueExpression passwordExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        dataSource = ExpressionUtil.evaluate(dataSourceExpression, pageContext);
+        driverClassName = ExpressionUtil.evaluate(driverClassNameExpression, pageContext);
+        jdbcURL = ExpressionUtil.evaluate(jdbcUrlExpression, pageContext);
+        userName = ExpressionUtil.evaluate(usernameExpression, pageContext);
+        password = ExpressionUtil.evaluate(passwordExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        dataSourceExpression = null;
+        driverClassNameExpression = null;
+        jdbcUrlExpression = null;
+        usernameExpression = null;
+        passwordExpression = null;
+    }
+
+    public void setDataSource(String expression) {
+        dataSourceExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+        dataSourceSpecified = true;
+    }
+
+    public void setDriver(String expression) {
+        driverClassNameExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setUrl(String expression) {
+        jdbcUrlExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setUser(String expression) {
+        usernameExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setPassword(String expression) {
+        passwordExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/TransactionTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/TransactionTag.java
new file mode 100644
index 0000000..ea9da12
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/TransactionTag.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.sql;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.sql.TransactionTagSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <transaction>} using the container's EL implementation.
+ */
+public class TransactionTag extends TransactionTagSupport {
+    private ValueExpression dataSourceExpression;
+    private ValueExpression isolationExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        rawDataSource = ExpressionUtil.evaluate(dataSourceExpression, pageContext);
+        if (isolationExpression != null) {
+            super.setIsolation((String) ExpressionUtil.evaluate(isolationExpression, pageContext));
+        }
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        dataSourceExpression = null;
+        isolationExpression = null;
+    }
+
+    public void setDataSource(String expression) {
+        dataSourceExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+        dataSourceSpecified = true;
+    }
+
+    public void setIsolation(String expression) {
+        isolationExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/UpdateTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/UpdateTag.java
new file mode 100644
index 0000000..bc525b5
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/sql/UpdateTag.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.sql;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.sql.UpdateTagSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <update>} using the container's EL implementation.
+ */
+public class UpdateTag extends UpdateTagSupport {
+    private ValueExpression dataSourceExpression;
+    private ValueExpression sqlExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        rawDataSource = ExpressionUtil.evaluate(dataSourceExpression, pageContext);
+        sql = ExpressionUtil.evaluate(sqlExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        dataSourceExpression = null;
+        sqlExpression = null;
+    }
+
+    public void setDataSource(String expression) {
+        dataSourceExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+        dataSourceSpecified = true;
+    }
+
+    public void setSql(String expression) {
+        sqlExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/xml/ExprTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/xml/ExprTag.java
new file mode 100644
index 0000000..5a67554
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/xml/ExprTag.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.xml;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.sql.ParamTagSupport;
+import org.apache.taglibs.standard.tag.common.xml.ExprSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <out>} using the container's EL implementation.
+ */
+public class ExprTag extends ExprSupport {
+    private ValueExpression escapeXmlExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        escapeXml = ExpressionUtil.evaluate(escapeXmlExpression, pageContext, true);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        escapeXmlExpression = null;
+    }
+
+    public void setEscapeXml(String expression) {
+        escapeXmlExpression = ExpressionUtil.createValueExpression(pageContext, expression, Boolean.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/xml/ParamTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/xml/ParamTag.java
new file mode 100644
index 0000000..b439ac3
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/xml/ParamTag.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.xml;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.sql.ParamTagSupport;
+import org.apache.taglibs.standard.tag.common.xml.ParamSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <param>} using the container's EL implementation.
+ */
+public class ParamTag extends ParamSupport {
+    private ValueExpression nameExpression;
+    private ValueExpression valueExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        name = ExpressionUtil.evaluate(nameExpression, pageContext);
+        value = ExpressionUtil.evaluate(valueExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        nameExpression = null;
+        valueExpression = null;
+    }
+
+    public void setName(String expression) {
+        nameExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setValue(String expression) {
+        valueExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/xml/ParseTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/xml/ParseTag.java
new file mode 100644
index 0000000..fc59c47
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/xml/ParseTag.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.xml;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.xml.ParseSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+import org.xml.sax.XMLFilter;
+
+/**
+ * Implementation of JSTL 1.0 {@code <param>} using the container's EL implementation.
+ */
+public class ParseTag extends ParseSupport {
+    private ValueExpression xmlExpression;
+    private ValueExpression systemIdExpression;
+    private ValueExpression filterExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        xml = ExpressionUtil.evaluate(xmlExpression, pageContext);
+        systemId = ExpressionUtil.evaluate(systemIdExpression, pageContext);
+        filter = ExpressionUtil.evaluate(filterExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        xmlExpression = null;
+        systemIdExpression = null;
+        filterExpression = null;
+    }
+
+    public void setXml(String expression) {
+        xmlExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+    }
+
+    public void setSystemId(String expression) {
+        systemIdExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setFilter(String expression) {
+        filterExpression = ExpressionUtil.createValueExpression(pageContext, expression, XMLFilter.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tag/compat/xml/TransformTag.java b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/xml/TransformTag.java
new file mode 100644
index 0000000..f3d2319
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tag/compat/xml/TransformTag.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.taglibs.standard.tag.compat.xml;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+import javax.xml.transform.Result;
+
+import org.apache.taglibs.standard.tag.common.xml.TransformSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ * Implementation of JSTL 1.0 {@code <param>} using the container's EL implementation.
+ */
+public class TransformTag extends TransformSupport {
+    private ValueExpression xmlExpression;
+    private ValueExpression xmlSystemIdExpression;
+    private ValueExpression xsltExpression;
+    private ValueExpression xsltSystemIdExpression;
+    private ValueExpression resultExpression;
+
+    @Override
+    public int doStartTag() throws JspException {
+        xml = ExpressionUtil.evaluate(xmlExpression, pageContext);
+        xmlSystemId = ExpressionUtil.evaluate(xmlSystemIdExpression, pageContext);
+        xslt = ExpressionUtil.evaluate(xsltExpression, pageContext);
+        xsltSystemId = ExpressionUtil.evaluate(xsltSystemIdExpression, pageContext);
+        result = ExpressionUtil.evaluate(resultExpression, pageContext);
+
+        return super.doStartTag();
+    }
+
+    @Override
+    public void release() {
+        super.release();
+
+        xmlExpression = null;
+        xmlSystemIdExpression = null;
+        xsltExpression = null;
+        xsltSystemIdExpression = null;
+        resultExpression = null;
+    }
+
+    public void setXml(String expression) {
+        xmlExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+        xmlSpecified = true;
+    }
+
+    public void setXmlSystemId(String expression) {
+        xmlSystemIdExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setXslt(String expression) {
+        xsltExpression = ExpressionUtil.createValueExpression(pageContext, expression, Object.class);
+    }
+
+    public void setXsltSystemId(String expression) {
+        xsltSystemIdExpression = ExpressionUtil.createValueExpression(pageContext, expression, String.class);
+    }
+
+    public void setResult(String expression) {
+        resultExpression = ExpressionUtil.createValueExpression(pageContext, expression, Result.class);
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tlv/compat/JstlELCoreTLV.java b/compat/src/main/java/org/apache/taglibs/standard/tlv/compat/JstlELCoreTLV.java
new file mode 100644
index 0000000..a5d7d87
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tlv/compat/JstlELCoreTLV.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.taglibs.standard.tlv.compat;
+
+import org.apache.taglibs.standard.tlv.JstlCoreTLV;
+
+/**
+ */
+public class JstlELCoreTLV extends JstlCoreTLV {
+    @Override
+    protected String validateExpression(String elem, String att, String expr) {
+        return null;
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tlv/compat/JstlELFmtTLV.java b/compat/src/main/java/org/apache/taglibs/standard/tlv/compat/JstlELFmtTLV.java
new file mode 100644
index 0000000..4134c1d
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tlv/compat/JstlELFmtTLV.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.taglibs.standard.tlv.compat;
+
+import org.apache.taglibs.standard.tlv.JstlFmtTLV;
+
+/**
+ */
+public class JstlELFmtTLV extends JstlFmtTLV {
+    @Override
+    protected String validateExpression(String elem, String att, String expr) {
+        return null;
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tlv/compat/JstlELSqlTLV.java b/compat/src/main/java/org/apache/taglibs/standard/tlv/compat/JstlELSqlTLV.java
new file mode 100644
index 0000000..53807f5
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tlv/compat/JstlELSqlTLV.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.taglibs.standard.tlv.compat;
+
+import org.apache.taglibs.standard.tlv.JstlSqlTLV;
+
+/**
+ */
+public class JstlELSqlTLV extends JstlSqlTLV {
+    @Override
+    protected String validateExpression(String elem, String att, String expr) {
+        return null;
+    }
+}
diff --git a/compat/src/main/java/org/apache/taglibs/standard/tlv/compat/JstlELXmlTLV.java b/compat/src/main/java/org/apache/taglibs/standard/tlv/compat/JstlELXmlTLV.java
new file mode 100644
index 0000000..1bd893d
--- /dev/null
+++ b/compat/src/main/java/org/apache/taglibs/standard/tlv/compat/JstlELXmlTLV.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.taglibs.standard.tlv.compat;
+
+import org.apache.taglibs.standard.tlv.JstlXmlTLV;
+
+/**
+ */
+public class JstlELXmlTLV extends JstlXmlTLV {
+    @Override
+    protected String validateExpression(String elem, String att, String expr) {
+        return null;
+    }
+}
diff --git a/compat/src/main/resources/META-INF/c-1_0.tld b/compat/src/main/resources/META-INF/c-1_0.tld
new file mode 100644
index 0000000..da3573f
--- /dev/null
+++ b/compat/src/main/resources/META-INF/c-1_0.tld
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<!DOCTYPE taglib
+        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
+        "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
+<taglib>
+    <tlib-version>1.0</tlib-version>
+    <jsp-version>1.2</jsp-version>
+    <short-name>c</short-name>
+    <uri>http://java.sun.com/jstl/core</uri>
+    <display-name>JSTL core</display-name>
+    <description>JSTL 1.0 core library</description>
+
+    <validator>
+        <validator-class>
+            org.apache.taglibs.standard.tlv.compat.JstlELCoreTLV
+        </validator-class>
+        <init-param>
+            <param-name>expressionAttributes</param-name>
+            <param-value>
+                out:value
+                out:default
+                out:escapeXml
+                if:test
+                import:url
+                import:context
+                import:charEncoding
+                forEach:items
+                forEach:begin
+                forEach:end
+                forEach:step
+                forTokens:items
+                forTokens:begin
+                forTokens:end
+                forTokens:step
+                param:encode
+                param:name
+                param:value
+                redirect:context
+                redirect:url
+                set:property
+                set:target
+                set:value
+                url:context
+                url:value
+                when:test
+            </param-value>
+            <description>
+                Whitespace-separated list of colon-separated token pairs
+                describing tag:attribute combinations that accept expressions.
+                The validator uses this information to determine which
+                attributes need their syntax validated.
+            </description>
+        </init-param>
+    </validator>
+
+    <tag>
+        <name>catch</name>
+        <tag-class>org.apache.taglibs.standard.tag.common.core.CatchTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Catches any Throwable that occurs in its body and optionally
+            exposes it.
+        </description>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>choose</name>
+        <tag-class>org.apache.taglibs.standard.tag.common.core.ChooseTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Simple conditional tag that establishes a context for
+            mutually exclusive conditional operations, marked by
+            &lt;when&gt; and &lt;otherwise&gt;
+        </description>
+    </tag>
+
+    <tag>
+        <name>out</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.core.OutTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Like &lt;%= ... &gt;, but for expressions.
+        </description>
+        <attribute>
+            <name>value</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>default</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>escapeXml</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>if</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.core.IfTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Simple conditional tag, which evalutes its body if the
+            supplied condition is true and optionally exposes a Boolean
+            scripting variable representing the evaluation of this condition
+        </description>
+        <attribute>
+            <name>test</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>import</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.core.ImportTag</tag-class>
+        <tei-class>org.apache.taglibs.standard.tei.ImportTEI</tei-class>
+        <body-content>JSP</body-content>
+        <description>
+            Retrieves an absolute or relative URL and exposes its contents
+            to either the page, a String in 'var', or a Reader in 'varReader'.
+        </description>
+        <attribute>
+            <name>url</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>varReader</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>context</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>charEncoding</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>forEach</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.core.ForEachTag</tag-class>
+        <tei-class>org.apache.taglibs.standard.tei.ForEachTEI</tei-class>
+        <body-content>JSP</body-content>
+        <description>
+            The basic iteration tag, accepting many different
+            collection types and supporting subsetting and other
+            functionality
+        </description>
+        <attribute>
+            <name>items</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>begin</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>end</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>step</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>varStatus</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>forTokens</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.core.ForTokensTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Iterates over tokens, separated by the supplied delimeters
+        </description>
+        <attribute>
+            <name>items</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>delims</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>begin</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>end</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>step</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>varStatus</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>otherwise</name>
+        <tag-class>org.apache.taglibs.standard.tag.common.core.OtherwiseTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Subtag of &lt;choose&gt; that follows &lt;when&gt; tags
+            and runs only if all of the prior conditions evaluated to
+            'false'
+        </description>
+    </tag>
+
+    <tag>
+        <name>param</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.core.ParamTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Adds a parameter to a containing 'import' tag's URL.
+        </description>
+        <attribute>
+            <name>name</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>value</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>redirect</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.core.RedirectTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Redirects to a new URL.
+        </description>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>url</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>context</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>remove</name>
+        <tag-class>org.apache.taglibs.standard.tag.common.core.RemoveTag</tag-class>
+        <body-content>empty</body-content>
+        <description>
+            Removes a scoped variable (from a particular scope, if specified).
+        </description>
+        <attribute>
+            <name>var</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>set</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.core.SetTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Sets the result of an expression evaluation in a 'scope'
+        </description>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>value</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>target</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>property</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>url</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.core.UrlTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Prints or exposes a URL with optional query parameters
+            (via the c:param tag).
+        </description>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>value</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>context</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>when</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.core.WhenTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Subtag of &lt;choose&gt; that includes its body if its
+            condition evalutes to 'true'
+        </description>
+        <attribute>
+            <name>test</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+</taglib>
diff --git a/compat/src/main/resources/META-INF/fmt-1_0.tld b/compat/src/main/resources/META-INF/fmt-1_0.tld
new file mode 100644
index 0000000..4caec3d
--- /dev/null
+++ b/compat/src/main/resources/META-INF/fmt-1_0.tld
@@ -0,0 +1,458 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<!DOCTYPE taglib
+        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
+        "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
+<taglib>
+    <tlib-version>1.0</tlib-version>
+    <jsp-version>1.2</jsp-version>
+    <short-name>fmt</short-name>
+    <uri>http://java.sun.com/jstl/fmt</uri>
+    <display-name>JSTL fmt</display-name>
+    <description>JSTL 1.0 i18n-capable formatting library</description>
+
+    <validator>
+        <validator-class>
+            org.apache.taglibs.standard.tlv.compat.JstlELFmtTLV
+        </validator-class>
+        <init-param>
+            <param-name>expressionAttributes</param-name>
+            <param-value>
+                requestEncoding:value
+                setLocale:value
+                setLocale:variant
+                timeZone:value
+                setTimeZone:value
+                bundle:basename
+                bundle:prefix
+                setBundle:basename
+                message:key
+                message:bundle
+                param:value
+                formatNumber:value
+                formatNumber:pattern
+                formatNumber:currencyCode
+                formatNumber:currencySymbol
+                formatNumber:groupingUsed
+                formatNumber:maxIntegerDigits
+                formatNumber:minIntegerDigits
+                formatNumber:maxFractionDigits
+                formatNumber:minFractionDigits
+                parseNumber:value
+                parseNumber:pattern
+                parseNumber:parseLocale
+                parseNumber:integerOnly
+                formatDate:value
+                formatDate:pattern
+                formatDate:timeZone
+                parseDate:value
+                parseDate:pattern
+                parseDate:timeZone
+                parseDate:parseLocale
+            </param-value>
+            <description>
+                Whitespace-separated list of colon-separated token pairs
+                describing tag:attribute combinations that accept expressions.
+                The validator uses this information to determine which
+                attributes need their syntax validated.
+            </description>
+        </init-param>
+    </validator>
+
+    <tag>
+        <name>requestEncoding</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.fmt.RequestEncodingTag</tag-class>
+        <body-content>empty</body-content>
+        <description>
+            Sets the request character encoding
+        </description>
+        <attribute>
+            <name>value</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>setLocale</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.fmt.SetLocaleTag</tag-class>
+        <body-content>empty</body-content>
+        <description>
+            Stores the given locale in the locale configuration variable
+        </description>
+        <attribute>
+            <name>value</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>variant</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>timeZone</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.fmt.TimeZoneTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Specifies the time zone for any time formatting or parsing actions
+            nested in its body
+        </description>
+        <attribute>
+            <name>value</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>setTimeZone</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.fmt.SetTimeZoneTag</tag-class>
+        <body-content>empty</body-content>
+        <description>
+            Stores the given time zone in the time zone configuration variable
+        </description>
+        <attribute>
+            <name>value</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>bundle</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.fmt.BundleTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Loads a resource bundle to be used by its tag body
+        </description>
+        <attribute>
+            <name>basename</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>prefix</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>setBundle</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.fmt.SetBundleTag</tag-class>
+        <body-content>empty</body-content>
+        <description>
+            Loads a resource bundle and stores it in the named scoped variable or
+            the bundle configuration variable
+        </description>
+        <attribute>
+            <name>basename</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>message</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.fmt.MessageTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Maps key to localized message and performs parametric replacement
+        </description>
+        <attribute>
+            <name>key</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>bundle</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>param</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.fmt.ParamTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Supplies an argument for parametric replacement to a containing
+            &lt;message&gt; tag
+        </description>
+        <attribute>
+            <name>value</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>formatNumber</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.fmt.FormatNumberTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Formats a numeric value as a number, currency, or percentage
+        </description>
+        <attribute>
+            <name>value</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>type</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>pattern</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>currencyCode</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>currencySymbol</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>groupingUsed</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>maxIntegerDigits</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>minIntegerDigits</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>maxFractionDigits</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>minFractionDigits</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>parseNumber</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.fmt.ParseNumberTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Parses the string representation of a number, currency, or percentage
+        </description>
+        <attribute>
+            <name>value</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>type</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>pattern</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>parscompatocale</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>integerOnly</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>formatDate</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.fmt.FormatDateTag</tag-class>
+        <body-content>empty</body-content>
+        <description>
+            Formats a date and/or time using the supplied styles and pattern
+        </description>
+        <attribute>
+            <name>value</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>type</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>dateStyle</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>timeStyle</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>pattern</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>timeZone</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>parseDate</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.fmt.ParseDateTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Parses the string representation of a date and/or time
+        </description>
+        <attribute>
+            <name>value</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>type</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>dateStyle</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>timeStyle</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>pattern</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>timeZone</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>parscompatocale</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+</taglib>
diff --git a/compat/src/main/resources/META-INF/sql-1_0.tld b/compat/src/main/resources/META-INF/sql-1_0.tld
new file mode 100644
index 0000000..fa6353e
--- /dev/null
+++ b/compat/src/main/resources/META-INF/sql-1_0.tld
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<!DOCTYPE taglib
+        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
+        "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
+<taglib>
+    <tlib-version>1.0</tlib-version>
+    <jsp-version>1.2</jsp-version>
+    <short-name>sql</short-name>
+    <uri>http://java.sun.com/jstl/sql</uri>
+    <display-name>JSTL sql</display-name>
+    <description>JSTL 1.0 sql library</description>
+
+    <validator>
+        <validator-class>
+            org.apache.taglibs.standard.tlv.compat.JstlELSqlTLV
+        </validator-class>
+        <init-param>
+            <param-name>expressionAttributes</param-name>
+            <param-value>
+                transaction:dataSource
+                transaction:isolation
+                query:sql
+                query:dataSource
+                query:startRow
+                query:maxRows
+                update:sql
+                update:dataSource
+                param:value
+                dateParam:value
+                dateParam:type
+                setDataSource:dataSource
+                setDataSource:driver
+                setDataSource:url
+                setDataSource:user
+                setDataSource:password
+            </param-value>
+            <description>
+                Whitespace-separated list of colon-separated token pairs
+                describing tag:attribute combinations that accept expressions.
+                The validator uses this information to determine which
+                attributes need their syntax validated.
+            </description>
+        </init-param>
+    </validator>
+
+    <tag>
+        <name>transaction</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.sql.TransactionTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Provides nested database action elements with a shared Connection,
+            set up to execute all statements as one transaction.
+        </description>
+        <attribute>
+            <name>dataSource</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>isolation</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>query</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.sql.QueryTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Executes the SQL query defined in its body or through the
+            sql attribute.
+        </description>
+        <attribute>
+            <name>var</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>sql</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>dataSource</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>startRow</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>maxRows</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>update</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.sql.UpdateTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Executes the SQL update defined in its body or through the
+            sql attribute.
+        </description>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>sql</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>dataSource</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>param</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.sql.ParamTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Sets a parameter in an SQL statement to the specified value.
+        </description>
+        <attribute>
+            <name>value</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>dateParam</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.sql.DateParamTag</tag-class>
+        <body-content>empty</body-content>
+        <description>
+            Sets a parameter in an SQL statement to the specified java.util.Date val
+            ue.
+        </description>
+        <attribute>
+            <name>value</name>
+            <required>true</required>
+            <rtexprvalue>true</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>type</name>
+            <required>false</required>
+            <rtexprvalue>true</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>setDataSource</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.sql.SetDataSourceTag</tag-class>
+        <body-content>empty</body-content>
+        <description>
+            Creates a simple DataSource suitable only for prototyping.
+        </description>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>dataSource</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>driver</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>url</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>user</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>password</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+</taglib>
diff --git a/compat/src/main/resources/META-INF/x-1_0.tld b/compat/src/main/resources/META-INF/x-1_0.tld
new file mode 100644
index 0000000..5ff8911
--- /dev/null
+++ b/compat/src/main/resources/META-INF/x-1_0.tld
@@ -0,0 +1,289 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<!DOCTYPE taglib
+        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
+        "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
+<taglib>
+    <tlib-version>1.0</tlib-version>
+    <jsp-version>1.2</jsp-version>
+    <short-name>x</short-name>
+    <uri>http://java.sun.com/jstl/xml</uri>
+    <display-name>JSTL XML</display-name>
+    <description>JSTL 1.0 XML library</description>
+
+    <validator>
+        <validator-class>
+            org.apache.taglibs.standard.tlv.compat.JstlELXmlTLV
+        </validator-class>
+        <init-param>
+            <param-name>expressionAttributes</param-name>
+            <param-value>
+                out:escapeXml
+                parse:xml
+                parse:systemId
+                parse:filter
+                transform:xml
+                transform:xmlSystemId
+                transform:xslt
+                transform:xsltSystemId
+                transform:result
+            </param-value>
+            <description>
+                Whitespace-separated list of colon-separated token pairs
+                describing tag:attribute combinations that accept expressions.
+                The validator uses this information to determine which
+                attributes need their syntax validated.
+            </description>
+        </init-param>
+    </validator>
+
+    <tag>
+        <name>choose</name>
+        <tag-class>org.apache.taglibs.standard.tag.common.core.ChooseTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Simple conditional tag that establishes a context for
+            mutually exclusive conditional operations, marked by
+            &lt;when&gt; and &lt;otherwise&gt;
+        </description>
+    </tag>
+
+    <tag>
+        <name>out</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.xml.ExprTag</tag-class>
+        <body-content>empty</body-content>
+        <description>
+            Like &lt;%= ... &gt;, but for XPath expressions.
+        </description>
+        <attribute>
+            <name>select</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>escapeXml</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>if</name>
+        <tag-class>org.apache.taglibs.standard.tag.common.xml.IfTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            XML conditional tag, which evalutes its body if the
+            supplied XPath expression evalutes to 'true' as a boolean
+        </description>
+        <attribute>
+            <name>select</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>forEach</name>
+        <tag-class>org.apache.taglibs.standard.tag.common.xml.ForEachTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            XML iteration tag.
+        </description>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>select</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>otherwise</name>
+        <tag-class>org.apache.taglibs.standard.tag.common.core.OtherwiseTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Subtag of &lt;choose&gt; that follows &lt;when&gt; tags
+            and runs only if all of the prior conditions evaluated to
+            'false'
+        </description>
+    </tag>
+
+    <tag>
+        <name>param</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.xml.ParamTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Adds a parameter to a containing 'transform' tag's Transformer
+        </description>
+        <attribute>
+            <name>name</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>value</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>parse</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.xml.ParseTag</tag-class>
+        <tei-class>org.apache.taglibs.standard.tei.XmlParseTEI</tei-class>
+        <body-content>JSP</body-content>
+        <description>
+            Parses XML content from 'source' attribute or 'body'
+        </description>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>varDom</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scopeDom</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>xml</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>systemId</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>filter</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>set</name>
+        <tag-class>org.apache.taglibs.standard.tag.common.xml.SetTag</tag-class>
+        <body-content>empty</body-content>
+        <description>
+            Saves the result of an XPath expression evaluation in a 'scope'
+        </description>
+        <attribute>
+            <name>var</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>select</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>transform</name>
+        <tag-class>org.apache.taglibs.standard.tag.compat.xml.TransformTag</tag-class>
+        <tei-class>org.apache.taglibs.standard.tei.XmlTransformTEI</tei-class>
+        <body-content>JSP</body-content>
+        <description>
+            Conducts a transformation given a source XML document
+            and an XSLT stylesheet
+        </description>
+        <attribute>
+            <name>var</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>scope</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>result</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>xml</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>xmlSystemId</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>xslt</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+        <attribute>
+            <name>xsltSystemId</name>
+            <required>false</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+    <tag>
+        <name>when</name>
+        <tag-class>org.apache.taglibs.standard.tag.common.xml.WhenTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Subtag of &lt;choose&gt; that includes its body if its
+            expression evalutes to 'true'
+        </description>
+        <attribute>
+            <name>select</name>
+            <required>true</required>
+            <rtexprvalue>false</rtexprvalue>
+        </attribute>
+    </tag>
+
+</taglib>
diff --git a/impl/src/main/java/org/apache/taglibs/standard/util/ExpressionUtil.java b/impl/src/main/java/org/apache/taglibs/standard/util/ExpressionUtil.java
index 108a157..fb027da 100644
--- a/impl/src/main/java/org/apache/taglibs/standard/util/ExpressionUtil.java
+++ b/impl/src/main/java/org/apache/taglibs/standard/util/ExpressionUtil.java
@@ -50,4 +50,38 @@
         JspApplicationContext appContext = JspFactory.getDefaultFactory().getJspApplicationContext(pageContext.getServletContext());
         return appContext.getExpressionFactory();
     }
+
+    /**
+     * Evaluate a value expression. To support optional attributes, if the expression is null then
+     * null will be returned.
+     *
+     * @param expression the expression
+     * @param pageContext the context for the JSP
+     * @param <T> the expected type of the expression
+     * @return the result of evaluating the expression
+     */
+    public static <T> T evaluate(ValueExpression expression, PageContext pageContext) {
+        if (expression == null) {
+            return null;
+        }
+        @SuppressWarnings("unchecked")
+        T value = (T) expression.getValue(pageContext.getELContext());
+        return value;
+    }
+
+    public static boolean evaluate(ValueExpression expression, PageContext pageContext, boolean fallback) {
+        if (expression == null) {
+            return fallback;
+        }
+        Boolean result = (Boolean) expression.getValue(pageContext.getELContext());
+        return result == null ? fallback : result.booleanValue();
+    }
+
+    public static int evaluate(ValueExpression expression, PageContext pageContext, int fallback) {
+        if (expression == null) {
+            return fallback;
+        }
+        Integer result = (Integer) expression.getValue(pageContext.getELContext());
+        return result == null ? fallback : result.intValue();
+    }
 }