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();
+    }
 }
