You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by as...@apache.org on 2026/05/30 16:29:34 UTC

(grails-website) branch asf-site-production updated: Deploying to documentation branch - 16:29:20

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

asf-ci-deploy pushed a commit to branch asf-site-production
in repository https://gitbox.apache.org/repos/asf/grails-website.git


The following commit(s) were added to refs/heads/asf-site-production by this push:
     new d09df77ae3a Deploying to documentation branch - 16:29:20
d09df77ae3a is described below

commit d09df77ae3a1948e865d731cfc738800f6b50afe
Author: jamesfredley <ja...@users.noreply.github.com>
AuthorDate: Sat May 30 16:29:22 2026 +0000

    Deploying to documentation branch - 16:29:20
---
 docs/snapshot/api/allclasses-frame.html            |   5 +
 docs/snapshot/api/grails/artefact/TagLibrary.html  |   2 +-
 docs/snapshot/api/grails/gsp/NotATag.html          | 241 +++++++++++
 docs/snapshot/api/grails/gsp/Tag.html              | 239 ++++++++++
 docs/snapshot/api/grails/gsp/package-frame.html    |   2 +-
 docs/snapshot/api/grails/gsp/package-summary.html  |  17 +
 .../TagLibArtefactTypeAstTransformation.html       |  66 ++-
 .../api/grails/testing/web/GrailsWebUnitTest.html  |  34 +-
 .../grails/testing/web/UrlMappingsUnitTest.html    |  49 ++-
 .../grails/testing/web/taglib/TagLibUnitTest.html  |  42 +-
 docs/snapshot/api/index-all.html                   | 198 +++++----
 .../plugins/web/taglib/ApplicationTagLib.html      | 384 ++++++++---------
 .../grails/plugins/web/taglib/CountryTagLib.html   |  89 ++--
 .../org/grails/plugins/web/taglib/FormTagLib.html  | 479 +++++++++------------
 .../grails/plugins/web/taglib/FormatTagLib.html    | 136 +++---
 .../grails/plugins/web/taglib/PluginTagLib.html    | 126 +++---
 .../plugins/web/taglib/UrlMappingTagLib.html       | 109 +++--
 .../plugins/web/taglib/ValidationTagLib.html       | 164 +++----
 .../api/org/grails/taglib/TagLibraryLookup.html    |  43 +-
 .../api/org/grails/taglib/TagLibraryMetaUtils.html |  20 +-
 .../TagMethodContext.html}                         | 146 +++----
 .../grails/taglib/TagMethodInvoker.html}           | 128 +++---
 .../api/org/grails/taglib/package-frame.html       |   2 +-
 .../api/org/grails/taglib/package-summary.html     |  16 +
 .../runtime/support/LazyTagLibraryLookup.html      |  24 +-
 ...ptor.html => UrlMappingCleanupInterceptor.html} |  28 +-
 .../spock/UrlMappingSetupSpecInterceptor.html      |   8 +
 .../testing/spock/WebTestingSupportExtension.html  |  21 +-
 .../org/grails/testing/spock/package-frame.html    |   2 +-
 .../org/grails/testing/spock/package-summary.html  |  12 +-
 .../web/pages/StandaloneTagLibraryLookup.html      |   2 +-
 .../developer-manual/gettingStarted.html           |   2 +-
 .../grails-data/developer-manual/introduction.html |   2 +-
 .../grails-data/developer-manual/stepByStep.html   |   2 +-
 .../grails-data/developer-manual/testing.html      |   2 +-
 .../developer-manual/understandingApi.html         |   2 +-
 .../understandingApi/datastoreBasics.html          |   2 +-
 .../understandingApi/gormApis.html                 |   2 +-
 .../understandingApi/gormEnhancer.html             |   2 +-
 .../understandingApi/implementingCrud.html         |   2 +-
 .../understandingApi/implementingQueries.html      |   2 +-
 .../understandingApi/secondaryIndexes.html         |   2 +-
 .../grails-data/whats-new-manual/index.html        |   2 +-
 docs/snapshot/guide/introduction.html              |  12 +-
 docs/snapshot/guide/single.html                    | 400 +++++++++++++++--
 docs/snapshot/guide/testing.html                   |  45 +-
 docs/snapshot/guide/theWebLayer.html               | 122 +++++-
 docs/snapshot/guide/upgrading.html                 | 221 +++++++++-
 48 files changed, 2448 insertions(+), 1210 deletions(-)

diff --git a/docs/snapshot/api/allclasses-frame.html b/docs/snapshot/api/allclasses-frame.html
index bd8b2066573..c427e36bd29 100644
--- a/docs/snapshot/api/allclasses-frame.html
+++ b/docs/snapshot/api/allclasses-frame.html
@@ -2120,6 +2120,7 @@
 <li><a href="org/grails/encoder/impl/NoneEncoder.html" title="class in org.grails.encoder.impl" target="classFrame">NoneEncoder</a></li>
 <li><a href="org/grails/plugins/databasemigration/NoopVisitor.html" title="class in org.grails.plugins.databasemigration" target="classFrame">NoopVisitor</a></li>
 <li><a href="org/apache/grails/data/testing/tck/domains/Nose.html" title="class in org.apache.grails.data.testing.tck.domains" target="classFrame">Nose</a></li>
+<li><a href="grails/gsp/NotATag.html" title="annotation type in grails.gsp" target="classFrame">NotATag</a></li>
 <li><a href="org/grails/datastore/gorm/validation/constraints/NotEqualConstraint.html" title="class in org.grails.datastore.gorm.validation.constraints" target="classFrame">NotEqualConstraint</a></li>
 <li><a href="org/apache/grails/data/testing/tck/tests/NotInListSpec.html" title="class in org.apache.grails.data.testing.tck.tests" target="classFrame">NotInListSpec</a></li>
 <li><a href="grails/gorm/transactions/NotTransactional.html" title="annotation type in grails.gorm.transactions" target="classFrame">NotTransactional</a></li>
@@ -2787,6 +2788,7 @@
 <li><a href="org/grails/datastore/mapping/cache/TPCacheAdapterRepository.html" title="interface in org.grails.datastore.mapping.cache" target="classFrame"><I>TPCacheAdapterRepository</I></a></li>
 <li><a href="org/grails/datastore/mapping/cache/impl/TPCacheAdapterRepositoryImpl.html" title="class in org.grails.datastore.mapping.cache.impl" target="classFrame">TPCacheAdapterRepositoryImpl</a></li>
 <li><a href="org/grails/orm/hibernate/cfg/Table.html" title="class in org.grails.orm.hibernate.cfg" target="classFrame">Table</a></li>
+<li><a href="grails/gsp/Tag.html" title="annotation type in grails.gsp" target="classFrame">Tag</a></li>
 <li><a href="org/grails/taglib/TagBodyClosure.html" title="class in org.grails.taglib" target="classFrame">TagBodyClosure</a></li>
 <li><a href="grails/gsp/TagLib.html" title="annotation type in grails.gsp" target="classFrame">TagLib</a></li>
 <li><a href="org/grails/core/artefact/gsp/TagLibArtefactHandler.html" title="class in org.grails.core.artefact.gsp" target="classFrame">TagLibArtefactHandler</a></li>
@@ -2801,6 +2803,8 @@
 <li><a href="org/grails/gsp/jsp/TagLibraryResolverImpl.html" title="class in org.grails.gsp.jsp" target="classFrame">TagLibraryResolverImpl</a></li>
 <li><a href="grails/compiler/traits/TagLibraryTraitInjector.html" title="class in grails.compiler.traits" target="classFrame">TagLibraryTraitInjector</a></li>
 <li><a href="org/grails/compiler/web/taglib/TagLibraryTransformer.html" title="class in org.grails.compiler.web.taglib" target="classFrame">TagLibraryTransformer</a></li>
+<li><a href="org/grails/taglib/TagMethodContext.html" title="class in org.grails.taglib" target="classFrame">TagMethodContext</a></li>
+<li><a href="org/grails/taglib/TagMethodInvoker.html" title="class in org.grails.taglib" target="classFrame">TagMethodInvoker</a></li>
 <li><a href="org/grails/taglib/TagOutput.html" title="class in org.grails.taglib" target="classFrame">TagOutput</a></li>
 <li><a href="org/grails/taglib/TagOutput.ConstantClosure.html" title="class in org.grails.taglib.TagOutput" target="classFrame">TagOutput.ConstantClosure</a></li>
 <li><a href="org/apache/grails/data/testing/tck/domains/Task.html" title="class in org.apache.grails.data.testing.tck.domains" target="classFrame">Task</a></li>
@@ -2912,6 +2916,7 @@
 <li><a href="org/grails/web/mapping/UrlCreatorCache.ReverseMappingKey.html" title="class in org.grails.web.mapping.UrlCreatorCache" target="classFrame">UrlCreatorCache.ReverseMappingKey</a></li>
 <li><a href="org/grails/scaffolding/registry/input/UrlInputRenderer.html" title="class in org.grails.scaffolding.registry.input" target="classFrame">UrlInputRenderer</a></li>
 <li><a href="grails/web/mapping/UrlMapping.html" title="interface in grails.web.mapping" target="classFrame"><I>UrlMapping</I></a></li>
+<li><a href="org/grails/testing/spock/UrlMappingCleanupInterceptor.html" title="class in org.grails.testing.spock" target="classFrame">UrlMappingCleanupInterceptor</a></li>
 <li><a href="grails/web/mapping/UrlMappingData.html" title="interface in grails.web.mapping" target="classFrame"><I>UrlMappingData</I></a></li>
 <li><a href="grails/web/mapping/UrlMappingEvaluator.html" title="interface in grails.web.mapping" target="classFrame"><I>UrlMappingEvaluator</I></a></li>
 <li><a href="grails/web/mapping/exceptions/UrlMappingException.html" title="class in grails.web.mapping.exceptions" target="classFrame">UrlMappingException</a></li>
diff --git a/docs/snapshot/api/grails/artefact/TagLibrary.html b/docs/snapshot/api/grails/artefact/TagLibrary.html
index d75c7bb3c8c..eede581d7ab 100644
--- a/docs/snapshot/api/grails/artefact/TagLibrary.html
+++ b/docs/snapshot/api/grails/artefact/TagLibrary.html
@@ -333,7 +333,7 @@ implements <a href='../../grails/web/api/ServletAttributes.html'>ServletAttribut
                         <a name="raw(java.lang.Object)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>@groovy.transform.CompileDynamic<br>java.lang.Object <strong>raw</strong>(java.lang.Object value)</h4>
+                                <h4>java.lang.Object <strong>raw</strong>(java.lang.Object value)</h4>
                                 <p></p>
                             </li>
                         </ul>
diff --git a/docs/snapshot/api/grails/gsp/NotATag.html b/docs/snapshot/api/grails/gsp/NotATag.html
new file mode 100644
index 00000000000..76484c541b0
--- /dev/null
+++ b/docs/snapshot/api/grails/gsp/NotATag.html
@@ -0,0 +1,241 @@
+<!--
+
+     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 HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- **************************************************************** -->
+<!-- *  PLEASE KEEP COMPLICATED EXPRESSIONS OUT OF THESE TEMPLATES, * -->
+<!-- *  i.e. only iterate & print data where possible. Thanks, Jez. * -->
+<!-- **************************************************************** -->
+
+<html>
+<head>
+    <!-- Generated by groovydoc (4.0.32) -->
+    <title>NotATag (Grails 8.0.0-SNAPSHOT)</title>
+    
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <link href="../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+    <link href="../../groovy.ico" type="image/x-icon" rel="icon">
+    <link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+
+<body class="center">
+<script type="text/javascript"><!--
+if (location.href.indexOf('is-external=true') == -1) {
+    parent.document.title="NotATag (Grails 8.0.0-SNAPSHOT)";
+}
+//-->
+</script>
+<noscript>
+    <div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+    <!--   -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+    <!--   -->
+</a>
+    <ul class="navList" title="Navigation">
+        <li><a href="../../overview-summary.html">Overview</a></li>
+        <li><a href="package-summary.html">Package</a></li>
+        <li class="navBarCell1Rev">Class</li>
+        <li><a href="../../deprecated-list.html">Deprecated</a></li>
+        <li><a href="../../index-all.html">Index</a></li>
+        <li><a href="../../help-doc.html">Help</a></li>
+    </ul>
+</div>
+
+<div class="subNav">
+    <div>
+        <ul class="navList">
+            <li><a href="../../index.html?grails/gsp/NotATag" target="_top">Frames</a></li>
+            <li><a href="NotATag.html" target="_top">No Frames</a></li>
+        </ul>
+    </div>
+    <div>
+        <ul class="subNavList">
+            <li>Summary:&nbsp;</li>
+            Required&nbsp;&nbsp;&nbsp;Optional&nbsp;&nbsp;&nbsp;
+        </ul>
+        <ul class="subNavList">
+            <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
+            Element&nbsp;&nbsp;&nbsp;
+        </ul>
+    </div>
+    <a name="skip-navbar_top">
+        <!--   -->
+    </a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+
+    <div class="subTitle">Package: <strong>grails.gsp</strong></div>
+
+    <h2 title="[Java] Annotation Type NotATag" class="title">[Java] Annotation Type NotATag</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><ul class="inheritance"></ul></li><li>grails.gsp.NotATag
+</ul>
+<div class="description">
+    <ul class="blockList">
+        <li class="blockList">
+
+
+            <!-- todo: direct known subclasses -->
+            <hr>
+
+<pre>@java.lang.annotation.Retention(RetentionPolicy.RUNTIME)
+@java.lang.annotation.Target(ElementType.METHOD)
+public @interface NotATag</pre>
+
+    <p> Marks a public method on a <CODE>TagLib</CODE> class as a helper that should not be
+ exposed as a tag. Use this to opt out individual methods that would otherwise
+ be picked up by the tag-method discovery convention.
+ </p>
+
+          </li>
+    </ul>
+</div>
+
+<div class="summary">
+    <ul class="blockList">
+        <li class="blockList">
+        <!-- =========== NESTED CLASS SUMMARY =========== -->
+        
+
+        <!-- =========== ENUM CONSTANT SUMMARY =========== -->
+        
+        <!-- =========== FIELD SUMMARY =========== -->
+        
+
+        <!-- =========== PROPERTY SUMMARY =========== -->
+        
+
+        <!-- =========== ELEMENT SUMMARY =========== -->
+        
+
+        
+
+        
+        <!-- ========== METHOD SUMMARY =========== -->
+        <ul class="blockList">
+            
+            <li class="blockList"><a name="method_summary"><!--   --></a>
+                    <h3>Inherited Methods Summary</h3>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited Methods Summary table">
+                        <caption><span>Inherited Methods</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Methods inherited from class</th>
+                            <th class="colLast" scope="col">Name</th>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code>class java.lang.Object</code></td>
+                            <td class="colLast"><code>java.lang.Object#equals(java.lang.Object), java.lang.Object#getClass(), java.lang.Object#hashCode(), java.lang.Object#notify(), java.lang.Object#notifyAll(), java.lang.Object#toString(), java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int)</code></td>
+                        </tr>
+                    </table>
+                   </ul>
+              </li>
+                
+        </ul>
+        
+    </li>
+    </ul>
+</div>
+
+<div class="details">
+    <ul class="blockList">
+        <li class="blockList">
+           
+
+            
+
+            
+
+            
+
+            
+
+
+            
+        </li>
+    </ul>
+</div>
+
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+    <!--   -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+    <!--   -->
+</a>
+    <ul class="navList" title="Navigation">
+        <li><a href="../../overview-summary.html">Overview</a></li>
+        <li><a href="package-summary.html">Package</a></li>
+        <li class="navBarCell1Rev">Class</li>
+        <li><a href="../../deprecated-list.html">Deprecated</a></li>
+        <li><a href="../../index-all.html">Index</a></li>
+        <li><a href="../../help-doc.html">Help</a></li>
+    </ul>
+</div>
+
+<div class="subNav">
+    <div>
+        <ul class="navList">
+            <li><a href="../../index.html?grails/gsp/NotATag" target="_top">Frames</a></li>
+            <li><a href="NotATag.html" target="_top">No Frames</a></li>
+        </ul>
+    </div>
+    <div>
+        <ul class="subNavList">
+            <li>Summary:&nbsp;</li>
+            Required&nbsp;&nbsp;&nbsp;Optional&nbsp;&nbsp;&nbsp;
+        </ul>
+        <ul class="subNavList">
+            <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
+            Element&nbsp;&nbsp;&nbsp;
+        </ul>
+    </div>
+    <p><!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+    /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
+    _paq.push(["setDoNotTrack", true]);
+    _paq.push(["disableCookies"]);
+    _paq.push(['trackPageView']);
+    _paq.push(['enableLinkTracking']);
+    (function() {
+        var u="https://analytics.apache.org/";
+        _paq.push(['setTrackerUrl', u+'matomo.php']);
+        _paq.push(['setSiteId', '79']);
+        var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code --></p>
+    <a name="skip-navbar_bottom">
+        <!--   -->
+    </a>
+    </div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+</body>
+</html>
diff --git a/docs/snapshot/api/grails/gsp/Tag.html b/docs/snapshot/api/grails/gsp/Tag.html
new file mode 100644
index 00000000000..ccf12e4789d
--- /dev/null
+++ b/docs/snapshot/api/grails/gsp/Tag.html
@@ -0,0 +1,239 @@
+<!--
+
+     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 HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- **************************************************************** -->
+<!-- *  PLEASE KEEP COMPLICATED EXPRESSIONS OUT OF THESE TEMPLATES, * -->
+<!-- *  i.e. only iterate & print data where possible. Thanks, Jez. * -->
+<!-- **************************************************************** -->
+
+<html>
+<head>
+    <!-- Generated by groovydoc (4.0.32) -->
+    <title>Tag (Grails 8.0.0-SNAPSHOT)</title>
+    
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <link href="../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+    <link href="../../groovy.ico" type="image/x-icon" rel="icon">
+    <link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+
+<body class="center">
+<script type="text/javascript"><!--
+if (location.href.indexOf('is-external=true') == -1) {
+    parent.document.title="Tag (Grails 8.0.0-SNAPSHOT)";
+}
+//-->
+</script>
+<noscript>
+    <div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+    <!--   -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+    <!--   -->
+</a>
+    <ul class="navList" title="Navigation">
+        <li><a href="../../overview-summary.html">Overview</a></li>
+        <li><a href="package-summary.html">Package</a></li>
+        <li class="navBarCell1Rev">Class</li>
+        <li><a href="../../deprecated-list.html">Deprecated</a></li>
+        <li><a href="../../index-all.html">Index</a></li>
+        <li><a href="../../help-doc.html">Help</a></li>
+    </ul>
+</div>
+
+<div class="subNav">
+    <div>
+        <ul class="navList">
+            <li><a href="../../index.html?grails/gsp/Tag" target="_top">Frames</a></li>
+            <li><a href="Tag.html" target="_top">No Frames</a></li>
+        </ul>
+    </div>
+    <div>
+        <ul class="subNavList">
+            <li>Summary:&nbsp;</li>
+            Required&nbsp;&nbsp;&nbsp;Optional&nbsp;&nbsp;&nbsp;
+        </ul>
+        <ul class="subNavList">
+            <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
+            Element&nbsp;&nbsp;&nbsp;
+        </ul>
+    </div>
+    <a name="skip-navbar_top">
+        <!--   -->
+    </a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+
+    <div class="subTitle">Package: <strong>grails.gsp</strong></div>
+
+    <h2 title="[Java] Annotation Type Tag" class="title">[Java] Annotation Type Tag</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><ul class="inheritance"></ul></li><li>grails.gsp.Tag
+</ul>
+<div class="description">
+    <ul class="blockList">
+        <li class="blockList">
+
+
+            <!-- todo: direct known subclasses -->
+            <hr>
+
+<pre>@java.lang.annotation.Retention(RetentionPolicy.RUNTIME)
+@java.lang.annotation.Target(ElementType.METHOD)
+public @interface Tag</pre>
+
+    <p> Marks a public TagLib method as an invokable GSP tag.
+  <DL><DT><B>Since:</B></DT><DD>8.0</DD></DL></p>
+
+          </li>
+    </ul>
+</div>
+
+<div class="summary">
+    <ul class="blockList">
+        <li class="blockList">
+        <!-- =========== NESTED CLASS SUMMARY =========== -->
+        
+
+        <!-- =========== ENUM CONSTANT SUMMARY =========== -->
+        
+        <!-- =========== FIELD SUMMARY =========== -->
+        
+
+        <!-- =========== PROPERTY SUMMARY =========== -->
+        
+
+        <!-- =========== ELEMENT SUMMARY =========== -->
+        
+
+        
+
+        
+        <!-- ========== METHOD SUMMARY =========== -->
+        <ul class="blockList">
+            
+            <li class="blockList"><a name="method_summary"><!--   --></a>
+                    <h3>Inherited Methods Summary</h3>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited Methods Summary table">
+                        <caption><span>Inherited Methods</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Methods inherited from class</th>
+                            <th class="colLast" scope="col">Name</th>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code>class java.lang.Object</code></td>
+                            <td class="colLast"><code>java.lang.Object#equals(java.lang.Object), java.lang.Object#getClass(), java.lang.Object#hashCode(), java.lang.Object#notify(), java.lang.Object#notifyAll(), java.lang.Object#toString(), java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int)</code></td>
+                        </tr>
+                    </table>
+                   </ul>
+              </li>
+                
+        </ul>
+        
+    </li>
+    </ul>
+</div>
+
+<div class="details">
+    <ul class="blockList">
+        <li class="blockList">
+           
+
+            
+
+            
+
+            
+
+            
+
+
+            
+        </li>
+    </ul>
+</div>
+
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+    <!--   -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+    <!--   -->
+</a>
+    <ul class="navList" title="Navigation">
+        <li><a href="../../overview-summary.html">Overview</a></li>
+        <li><a href="package-summary.html">Package</a></li>
+        <li class="navBarCell1Rev">Class</li>
+        <li><a href="../../deprecated-list.html">Deprecated</a></li>
+        <li><a href="../../index-all.html">Index</a></li>
+        <li><a href="../../help-doc.html">Help</a></li>
+    </ul>
+</div>
+
+<div class="subNav">
+    <div>
+        <ul class="navList">
+            <li><a href="../../index.html?grails/gsp/Tag" target="_top">Frames</a></li>
+            <li><a href="Tag.html" target="_top">No Frames</a></li>
+        </ul>
+    </div>
+    <div>
+        <ul class="subNavList">
+            <li>Summary:&nbsp;</li>
+            Required&nbsp;&nbsp;&nbsp;Optional&nbsp;&nbsp;&nbsp;
+        </ul>
+        <ul class="subNavList">
+            <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
+            Element&nbsp;&nbsp;&nbsp;
+        </ul>
+    </div>
+    <p><!-- Matomo -->
+<script>
+    var _paq = window._paq = window._paq || [];
+    /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
+    _paq.push(["setDoNotTrack", true]);
+    _paq.push(["disableCookies"]);
+    _paq.push(['trackPageView']);
+    _paq.push(['enableLinkTracking']);
+    (function() {
+        var u="https://analytics.apache.org/";
+        _paq.push(['setTrackerUrl', u+'matomo.php']);
+        _paq.push(['setSiteId', '79']);
+        var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+        g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+    })();
+</script>
+<!-- End Matomo Code --></p>
+    <a name="skip-navbar_bottom">
+        <!--   -->
+    </a>
+    </div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+</body>
+</html>
diff --git a/docs/snapshot/api/grails/gsp/package-frame.html b/docs/snapshot/api/grails/gsp/package-frame.html
index c1f4dc1a034..fb407f9cd5c 100644
--- a/docs/snapshot/api/grails/gsp/package-frame.html
+++ b/docs/snapshot/api/grails/gsp/package-frame.html
@@ -55,7 +55,7 @@
 <div class="indexContainer">
     <h2>Annotation Types</h2>
     <ul>
-        <li><a href="TagLib.html" title="annotation type in grails.gsp" target="classFrame">TagLib</a></li>
+        <li><a href="NotATag.html" title="annotation type in grails.gsp" target="classFrame">NotATag</a></li><li><a href="Tag.html" title="annotation type in grails.gsp" target="classFrame">Tag</a></li><li><a href="TagLib.html" title="annotation type in grails.gsp" target="classFrame">TagLib</a></li>
     </ul>
 </div>
 
diff --git a/docs/snapshot/api/grails/gsp/package-summary.html b/docs/snapshot/api/grails/gsp/package-summary.html
index 3ea57c1930b..dfe8e3bb2e8 100644
--- a/docs/snapshot/api/grails/gsp/package-summary.html
+++ b/docs/snapshot/api/grails/gsp/package-summary.html
@@ -158,6 +158,23 @@ function windowTitle()
                         <th class="colFirst" scope="col">Annotation Type</th>
                         <th class="colLast" scope="col">Description</th>
                     </tr>
+<tr class="altColor">
+                            <td class="colOne">
+                                <strong><a href="NotATag.html" title="class in grails/gsp">
+                                    NotATag
+                                </a></strong>
+                            </td>
+                            <td>Marks a public method on a <CODE>TagLib</CODE> class as a helper that should not be
+ exposed as a tag. </td>
+                        </tr>
+<tr class="altColor">
+                            <td class="colOne">
+                                <strong><a href="Tag.html" title="class in grails/gsp">
+                                    Tag
+                                </a></strong>
+                            </td>
+                            <td>Marks a public TagLib method as an invokable GSP tag.</td>
+                        </tr>
 <tr class="altColor">
                             <td class="colOne">
                                 <strong><a href="TagLib.html" title="class in grails/gsp">
diff --git a/docs/snapshot/api/grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html b/docs/snapshot/api/grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html
index c074fa7ca97..ffb5c8be128 100644
--- a/docs/snapshot/api/grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html
+++ b/docs/snapshot/api/grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html
@@ -70,11 +70,11 @@ if (location.href.indexOf('is-external=true') == -1) {
     <div>
         <ul class="subNavList">
             <li>Summary:&nbsp;</li>
-            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
+            Nested&nbsp;&nbsp;&nbsp;<li><a href="#field_summary">Field</a></li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
         <ul class="subNavList">
             <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
-            Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
+            <li><a href="#field_detail">Field</a></li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
     </div>
     <a name="skip-navbar_top">
@@ -120,6 +120,28 @@ extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransf
         <!-- =========== FIELD SUMMARY =========== -->
         
             <ul class="blockList">
+                <li class="blockList"><a name="field_summary"><!--   --></a>
+                    <h3>Field Summary</h3>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Enum constants summary table">
+                        <caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Modifiers</th>
+                            <th class="colLast" scope="col">Name</th>
+                            <th class="colLast" scope="col">Description</th>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code><strong>static&nbsp;java.lang.String</strong></code>&nbsp;</td>
+                            <td class="colLast"><code><a href="#WARN_DEPRECATED_CLOSURES_PROPERTY">WARN_DEPRECATED_CLOSURES_PROPERTY</a></code></td>
+                            <td class="colLast">System property to silence the closure-based tag deprecation warning emitted at compile time.
+ </td>
+                        </tr>
+                        
+                    </table>
+                   </ul>
+                </li>
+                
                 <li class="blockList"><a name="field_summary"><!--   --></a>
                     <ul class="blockList">
                     <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited fields summary table">
@@ -164,12 +186,18 @@ extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransf
                         </tr>
                         
                         <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>protected&nbsp;void</code></td>
+                            <td class="colLast"><code><strong><a href="#addClosureTagDeprecationWarnings(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)">addClosureTagDeprecationWarnings</a></strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, org.codehaus.groovy.ast.ClassNode classNode)</code><br></td>
+                        </tr>
+                        
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>protected&nbsp;org.codehaus.groovy.ast.ClassNode</code></td>
                             <td class="colLast"><code><strong><a href="#getAnnotationType()">getAnnotationType</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>protected&nbsp;java.lang.String</code></td>
                             <td class="colLast"><code><strong><a href="#resolveArtefactType(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.AnnotationNode, org.codehaus.groovy.ast.ClassNode)">resolveArtefactType</a></strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, org.codehaus.groovy.ast.AnnotationNode annotationNode, org.codehaus.groovy.ast.ClassNode classNode)</code><br></td>
@@ -213,6 +241,26 @@ extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransf
            
 
             
+            <!-- =========== FIELD DETAIL =========== -->
+            <ul class="blockList">
+                <li class="blockList"><a name="field_detail">
+                    <!--   -->
+                </a>
+                    <h3>Field Detail</h3>
+                    
+                        <a name="WARN_DEPRECATED_CLOSURES_PROPERTY"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>public&nbsp;static&nbsp;final&nbsp;java.lang.String <strong>WARN_DEPRECATED_CLOSURES_PROPERTY</strong></h4>
+                                <p> System property to silence the closure-based tag deprecation warning emitted at compile time.
+ Set to <CODE>false</CODE> to suppress (default <CODE>true</CODE>).
+     </p>
+                            </li>
+                        </ul>
+                    
+                </li>
+            </ul>
+            
 
             
 
@@ -229,6 +277,14 @@ extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransf
                 </a>
                     <h3>Method Detail</h3>
                     
+                        <a name="addClosureTagDeprecationWarnings(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>protected&nbsp;void <strong>addClosureTagDeprecationWarnings</strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, org.codehaus.groovy.ast.ClassNode classNode)</h4>
+                                <p></p>
+                            </li>
+                        </ul>
+                    
                         <a name="getAnnotationType()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -279,11 +335,11 @@ extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransf
     <div>
         <ul class="subNavList">
             <li>Summary:&nbsp;</li>
-            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
+            Nested&nbsp;&nbsp;&nbsp;<li><a href="#field_summary">Field</a></li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
         <ul class="subNavList">
             <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
-            Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
+            <li><a href="#field_detail">Field</a></li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
     </div>
     <p><!-- Matomo -->
diff --git a/docs/snapshot/api/grails/testing/web/GrailsWebUnitTest.html b/docs/snapshot/api/grails/testing/web/GrailsWebUnitTest.html
index 3af47df2d1f..20587847710 100644
--- a/docs/snapshot/api/grails/testing/web/GrailsWebUnitTest.html
+++ b/docs/snapshot/api/grails/testing/web/GrailsWebUnitTest.html
@@ -203,72 +203,66 @@ implements <a href='../../../org/grails/testing/GrailsUnitTest.html'>GrailsUnitT
                         </tr>
                         
                         <tr class="altColor">
-                            <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>boolean</code></td>
-                            <td class="colLast"><code><strong><a href="#getPurgeTagLibMetaClass()">getPurgeTagLibMetaClass</a></strong>()</code><br>When mocking tag libs, the LazyTagLibraryLookup will not be cleared by default. </td>
-                        </tr>
-                        
-                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code><a href='../../../org/grails/plugins/testing/GrailsMockHttpServletRequest.html'>GrailsMockHttpServletRequest</a></code></td>
                             <td class="colLast"><code><strong><a href="#getRequest()">getRequest</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code><a href='../../../org/grails/plugins/testing/GrailsMockHttpServletResponse.html'>GrailsMockHttpServletResponse</a></code></td>
                             <td class="colLast"><code><strong><a href="#getResponse()">getResponse</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code><a href='../../../org.springframework.mock.web.MockServletContext.html'>MockServletContext</a></code></td>
                             <td class="colLast"><code><strong><a href="#getServletContext()">getServletContext</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code><a href='../../../org.springframework.mock.web.MockHttpSession.html'>MockHttpSession</a></code></td>
                             <td class="colLast"><code><strong><a href="#getSession()">getSession</a></strong>()</code><br>The org.springframework.mock.web.MockHttpSession instance</td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>int</code></td>
                             <td class="colLast"><code><strong><a href="#getStatus()">getStatus</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>The status code of the response</DD></DL></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.util.Map&lt;java.lang.String, java.lang.String&gt;</code></td>
                             <td class="colLast"><code><strong><a href="#getViews()">getViews</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>void</code></td>
                             <td class="colLast"><code><strong><a href="#mockCodec(Class, boolean)">mockCodec</a></strong>(java.lang.Class&lt;?&gt; codecClass, boolean reinitialize)</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.lang.Object</code></td>
                             <td class="colLast"><code><strong><a href="#mockController(Class)">mockController</a></strong>(java.lang.Class&lt;?&gt; controllerClass)</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.lang.Object</code></td>
                             <td class="colLast"><code><strong><a href="#mockTagLib(Class)">mockTagLib</a></strong>(java.lang.Class&lt;?&gt; tagLibClass)</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>void</code></td>
                             <td class="colLast"><code><strong><a href="#mockTagLibs(Class)">mockTagLibs</a></strong>(java.lang.Class&lt;?&gt;[] tagLibClasses)</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.lang.String</code></td>
                             <td class="colLast"><code><strong><a href="#render(java.util.Map)">render</a></strong>(java.util.Map args)</code><br>Mimics the behavior of the render method in controllers but returns the rendered contents directly</td>
@@ -383,14 +377,6 @@ implements <a href='../../../org/grails/testing/GrailsUnitTest.html'>GrailsUnitT
                             </li>
                         </ul>
                     
-                        <a name="getPurgeTagLibMetaClass()"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>boolean <strong>getPurgeTagLibMetaClass</strong>()</h4>
-                                <p> When mocking tag libs, the LazyTagLibraryLookup will not be cleared by default. True forces it to be cleared.</p>
-                            </li>
-                        </ul>
-                    
                         <a name="getRequest()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
diff --git a/docs/snapshot/api/grails/testing/web/UrlMappingsUnitTest.html b/docs/snapshot/api/grails/testing/web/UrlMappingsUnitTest.html
index 569b8a845c5..5dca884586b 100644
--- a/docs/snapshot/api/grails/testing/web/UrlMappingsUnitTest.html
+++ b/docs/snapshot/api/grails/testing/web/UrlMappingsUnitTest.html
@@ -212,45 +212,59 @@ implements <a href='../../../grails/testing/web/GrailsWebUnitTest.html'>GrailsWe
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>void</code></td>
-                            <td class="colLast"><code><strong><a href="#configuredMockedControllers()">configuredMockedControllers</a></strong>()</code><br></td>
+                            <td class="colLast"><code><strong><a href="#cleanupUrlMappingsAfterFeature()">cleanupUrlMappingsAfterFeature</a></strong>()</code><br>Clears any URL mapping artefacts registered by this spec so that subsequent specs in
+ the same JVM start from a clean registry. </td>
                         </tr>
                         
                         <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>void</code></td>
+                            <td class="colLast"><code><strong><a href="#configuredMockedControllers()">configuredMockedControllers</a></strong>()</code><br></td>
+                        </tr>
+                        
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.lang.String</code></td>
                             <td class="colLast"><code><strong><a href="#getBeanName(Class)">getBeanName</a></strong>(java.lang.Class&lt;?&gt; urlMappingsClass)</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code><a href='../../../grails/core/GrailsControllerClass.html'>GrailsControllerClass</a></code></td>
                             <td class="colLast"><code><strong><a href="#getControllerClass(java.lang.String)">getControllerClass</a></strong>(java.lang.String controller)</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.lang.Class[]</code></td>
                             <td class="colLast"><code><strong><a href="#getControllersToMock()">getControllersToMock</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code><a href='../../../grails/web/mapping/UrlMappingsHolder.html'>UrlMappingsHolder</a></code></td>
                             <td class="colLast"><code><strong><a href="#getUrlMappingsHolder()">getUrlMappingsHolder</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>The UrlMappingsHolder bean</DD></DL></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.lang.Object</code></td>
                             <td class="colLast"><code><strong><a href="#mapURI(java.lang.String)">mapURI</a></strong>(java.lang.String uri)</code><br>Maps a URI and returns the appropriate controller instance</td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>void</code></td>
                             <td class="colLast"><code><strong><a href="#mockArtefact(Class)">mockArtefact</a></strong>(java.lang.Class&lt;?&gt; urlMappingsClass)</code><br></td>
                         </tr>
                         
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>void</code></td>
+                            <td class="colLast"><code><strong><a href="#resetUrlMappingsForFeature()">resetUrlMappingsForFeature</a></strong>()</code><br>Re-registers this spec's URL mappings and rebuilds the <CODE>grailsUrlMappingsHolder</CODE>
+ bean so each feature method starts with only this spec's mappings active. </td>
+                        </tr>
+                        
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>boolean</code></td>
@@ -418,6 +432,18 @@ implements <a href='../../../grails/testing/web/GrailsWebUnitTest.html'>GrailsWe
                             </li>
                         </ul>
                     
+                        <a name="cleanupUrlMappingsAfterFeature()"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>@groovy.transform.CompileDynamic<br>void <strong>cleanupUrlMappingsAfterFeature</strong>()</h4>
+                                <p> Clears any URL mapping artefacts registered by this spec so that subsequent specs in
+ the same JVM start from a clean registry. The holder bean itself is left intact —
+ destroying it would leave <CODE>linkGenerator</CODE> (held by tag libraries) pointing at a
+ destroyed bean for any non-URL-mapping spec that runs next. The next
+ <a href='../../../grails/testing/web/UrlMappingsUnitTest.html' title='UrlMappingsUnitTest'>UrlMappingsUnitTest</a>-based spec rebuilds the holder via <a href='#mockArtefact'>mockArtefact</a>.</p>
+                            </li>
+                        </ul>
+                    
                         <a name="configuredMockedControllers()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -474,6 +500,17 @@ implements <a href='../../../grails/testing/web/GrailsWebUnitTest.html'>GrailsWe
                             </li>
                         </ul>
                     
+                        <a name="resetUrlMappingsForFeature()"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>void <strong>resetUrlMappingsForFeature</strong>()</h4>
+                                <p> Re-registers this spec's URL mappings and rebuilds the <CODE>grailsUrlMappingsHolder</CODE>
+ bean so each feature method starts with only this spec's mappings active. Other specs
+ running in the same JVM may register their own mappings or clear the registry; calling
+ this restores the state expected by this spec.</p>
+                            </li>
+                        </ul>
+                    
                         <a name="verifyAction(java.lang.String, java.lang.String)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
diff --git a/docs/snapshot/api/grails/testing/web/taglib/TagLibUnitTest.html b/docs/snapshot/api/grails/testing/web/taglib/TagLibUnitTest.html
index f9937e6999e..10ca2e87aff 100644
--- a/docs/snapshot/api/grails/testing/web/taglib/TagLibUnitTest.html
+++ b/docs/snapshot/api/grails/testing/web/taglib/TagLibUnitTest.html
@@ -170,21 +170,27 @@ implements <a href='../../../../grails/testing/web/GrailsWebUnitTest.html'>Grail
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>boolean</code></td>
-                            <td class="colLast"><code><strong><a href="#getPurgeTagLibMetaClass()">getPurgeTagLibMetaClass</a></strong>()</code><br></td>
+                            <td class="colLast"><code>T</code></td>
+                            <td class="colLast"><code><strong><a href="#getTagLib()">getTagLib</a></strong>()</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>T</code></td>
-                            <td class="colLast"><code><strong><a href="#getTagLib()">getTagLib</a></strong>()</code><br></td>
+                            <td class="colLast"><code>void</code></td>
+                            <td class="colLast"><code><strong><a href="#mockArtefact(Class)">mockArtefact</a></strong>(java.lang.Class&lt;?&gt; tagLibClass)</code><br>Mocks a tag library, making it available to subsequent calls to controllers mocked via
+ <a href='#mockArtefact(java.lang.Class)'>mockArtefact(Class)</a> and GSPs rendered via <a href='#applyTemplate(java.lang.String, java.util.Map)'>applyTemplate(String, Map)</a></td>
                         </tr>
                         
                         <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#mockTagLib(Class)">mockTagLib</a></strong>(java.lang.Class&lt;?&gt; tagLibClass)</code><br></td>
+                        </tr>
+                        
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>void</code></td>
-                            <td class="colLast"><code><strong><a href="#mockArtefact(Class)">mockArtefact</a></strong>(java.lang.Class&lt;?&gt; tagLibClass)</code><br>Mocks a tag library, making it available to subsequent calls to controllers mocked via
- <a href='#mockArtefact(java.lang.Class)'>mockArtefact(Class)</a> and GSPs rendered via <a href='#applyTemplate(java.lang.String, java.util.Map)'>applyTemplate(String, Map)</a></td>
+                            <td class="colLast"><code><strong><a href="#mockTagLibs(Class)">mockTagLibs</a></strong>(java.lang.Class&lt;?&gt;[] tagLibClasses)</code><br></td>
                         </tr>
                         
                     </table>
@@ -261,14 +267,6 @@ implements <a href='../../../../grails/testing/web/GrailsWebUnitTest.html'>Grail
                             </li>
                         </ul>
                     
-                        <a name="getPurgeTagLibMetaClass()"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>boolean <strong>getPurgeTagLibMetaClass</strong>()</h4>
-                                <p></p>
-                            </li>
-                        </ul>
-                    
                         <a name="getTagLib()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -286,6 +284,22 @@ implements <a href='../../../../grails/testing/web/GrailsWebUnitTest.html'>Grail
                             </li>
                         </ul>
                     
+                        <a name="mockTagLib(Class)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>mockTagLib</strong>(java.lang.Class&lt;?&gt; tagLibClass)</h4>
+                                <p></p>
+                            </li>
+                        </ul>
+                    
+                        <a name="mockTagLibs(Class)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>void <strong>mockTagLibs</strong>(java.lang.Class&lt;?&gt;[] tagLibClasses)</h4>
+                                <p></p>
+                            </li>
+                        </ul>
+                    
                 </li>
             </ul>
             
diff --git a/docs/snapshot/api/index-all.html b/docs/snapshot/api/index-all.html
index febcb28d21c..bcd8ef2c797 100644
--- a/docs/snapshot/api/index-all.html
+++ b/docs/snapshot/api/index-all.html
@@ -700,7 +700,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd><div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/testing/runtime/support/ActionSettingMethodHandler.html#ActionSettingMethodHandler(java.lang.Object, org.grails.web.servlet.mvc.GrailsWebRequest)" title="Constructor in ActionSettingMethodHandler">ActionSettingMethodHandler(java.lang.Object, org.grails.web.servlet.mvc.GrailsWebRequest)</a></span> - Constructor in <a href="org/grails/testing/runtime/support/ActionSettingMethodHandler.html">ActionSettingMethodHandler</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#actionSubmitImage" title="Property in FormTagLib">actionSubmitImage</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#actionSubmitImage(java.util.Map)" title="Method in FormTagLib">actionSubmitImage(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">Creates a an image submit button that submits to an action in the controller specified by the form action.
  </div></dd>
 <dt><span class="strong"><a href="org/grails/core/DefaultGrailsControllerClass.html#actionUriToViewName" title="Field in DefaultGrailsControllerClass">actionUriToViewName</a></span> - Field in <a href="org/grails/core/DefaultGrailsControllerClass.html">DefaultGrailsControllerClass</a>
@@ -871,6 +871,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/cli/command/archive/ArchiveCommand.ArchiveOptionHandler.html#addCliClasses(org.springframework.boot.loader.tools.JarWriter)" title="Method in ArchiveCommand.ArchiveOptionHandler">addCliClasses(org.springframework.boot.loader.tools.JarWriter)</a></span> - Method in <a href="org/grails/cli/command/archive/ArchiveCommand.ArchiveOptionHandler.html">ArchiveCommand.ArchiveOptionHandler</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html#addClosureTagDeprecationWarnings(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)" title="Method in TagLibArtefactTypeAstTransformation">addClosureTagDeprecationWarnings(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)</a></span> - Method in <a href="grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html">TagLibArtefactType [...]
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/cli/command/CommandRunner.html#addCommand(org.springframework.boot.cli.command.Command)" title="Method in CommandRunner">addCommand(org.springframework.boot.cli.command.Command)</a></span> - Method in <a href="org/grails/cli/command/CommandRunner.html">CommandRunner</a>
 </dt><dd> <div class="block">Add the specified command.</div></dd>
 <dt><span class="strong"><a href="org/grails/cli/command/CommandRunner.html#addCommands(Iterable<org.springframework.boot.cli.command.Command>)" title="Method in CommandRunner">addCommands(Iterable&lt;org.springframework.boot.cli.command.Command&gt;)</a></span> - Method in <a href="org/grails/cli/command/CommandRunner.html">CommandRunner</a>
@@ -1699,8 +1701,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/encoder/WriterEncodedAppender.html#appendCharSequence(org.grails.encoder.EncodingState, java.lang.CharSequence, int, int)" title="Method in WriterEncodedAppender">appendCharSequence(org.grails.encoder.EncodingState, java.lang.CharSequence, int, int)</a></span> - Method in <a href="org/grails/encoder/WriterEncodedAppender.html">WriterEncodedAppender</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html#appendClass(java.util.Map, java.lang.String)" title="Method in UrlMappingTagLib">appendClass(java.util.Map, java.lang.String)</a></span> - Method in <a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html">UrlMappingTagLib</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/doc/DocEngine.html#appendCreateLink(java.lang.StringBuffer, java.lang.String, java.lang.String)" title="Method in DocEngine">appendCreateLink(java.lang.StringBuffer, java.lang.String, java.lang.String)</a></span> - Method in <a href="grails/doc/DocEngine.html">DocEngine</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/query/jpa/JpaQueryBuilder.html#appendCriteriaForOperator(java.lang.StringBuilder, java.lang.String, java.lang.String, int, java.lang.String, boolean)" title="Method in JpaQueryBuilder">appendCriteriaForOperator(java.lang.StringBuilder, java.lang.String, java.lang.String, int, java.lang.String, boolean)</a></span> - Method in <a href="org/grails/datastore/mapping/query/jpa/JpaQueryBuilder.html">JpaQueryBuilder</a>
@@ -1955,7 +1955,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsGradlePlugin.html#applyBasePlugins(org.gradle.api.Project)" title="Method in GrailsGradlePlugin">applyBasePlugins(org.gradle.api.Project)</a></span> - Method in <a href="org/grails/gradle/plugin/core/GrailsGradlePlugin.html">GrailsGradlePlugin</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#applyCodec" title="Property in ApplicationTagLib">applyCodec</a></span> - Property in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#applyCodec(java.util.Map, groovy.lang.Closure)" title="Method in ApplicationTagLib">applyCodec(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceSettingsBuilder.html#applyConnectionString(java.lang.Object)" title="Method in MongoConnectionSourceSettingsBuilder">applyConnectionString(java.lang.Object)</a></span> - Method in <a href="org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceSettingsBuilder.html">MongoConnectionSourceSettingsBuilder</a>
 </dt><dd> <div class="block"></div></dd>
@@ -4646,7 +4646,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/plugins/databasemigration/liquibase/GroovyPrecondition.html#check(liquibase.database.Database, liquibase.changelog.DatabaseChangeLog, liquibase.changelog.ChangeSet, liquibase.changelog.visitor.ChangeExecListener)" title="Method in GroovyPrecondition">check(liquibase.database.Database, liquibase.changelog.DatabaseChangeLog, liquibase.changelog.ChangeSet, liquibase.changelog.visitor.ChangeExecListener)</a></span> - Method in <a href="org/grails/ [...]
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#checkBox" title="Property in FormTagLib">checkBox</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#checkBox(java.util.Map)" title="Method in FormTagLib">checkBox(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">A helper tag for creating checkboxes.</div></dd>
 <dt><span class="strong"><a href="org/grails/plugins/databasemigration/liquibase/GroovyPrecondition.html#checkClosure" title="Property in GroovyPrecondition">checkClosure</a></span> - Property in <a href="org/grails/plugins/databasemigration/liquibase/GroovyPrecondition.html">GroovyPrecondition</a>
 </dt><dd> <div class="block"></div></dd>
@@ -4972,6 +4972,9 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/apache/grails/data/testing/tck/base/GrailsDataTckSpec.html#cleanupSpec()" title="Method in GrailsDataTckSpec">cleanupSpec()</a></span> - Method in <a href="org/apache/grails/data/testing/tck/base/GrailsDataTckSpec.html">GrailsDataTckSpec</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/testing/web/UrlMappingsUnitTest.html#cleanupUrlMappingsAfterFeature()" title="Method in UrlMappingsUnitTest">cleanupUrlMappingsAfterFeature()</a></span> - Method in <a href="grails/testing/web/UrlMappingsUnitTest.html">UrlMappingsUnitTest</a>
+</dt><dd> <div class="block">Clears any URL mapping artefacts registered by this spec so that subsequent specs in
+ the same JVM start from a clean registry. </div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/gorm/support/AbstractDatastorePersistenceContextInterceptor.html#clear()" title="Method in AbstractDatastorePersistenceContextInterceptor">clear()</a></span> - Method in <a href="org/grails/datastore/gorm/support/AbstractDatastorePersistenceContextInterceptor.html">AbstractDatastorePersistenceContextInterceptor</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/orm/hibernate/AbstractHibernateSession.html#clear(java.lang.Object)" title="Method in AbstractHibernateSession">clear(java.lang.Object)</a></span> - Method in <a href="org/grails/orm/hibernate/AbstractHibernateSession.html">AbstractHibernateSession</a>
@@ -5034,6 +5037,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/beans/util/LazyMetaPropertyMap.html#clear()" title="Method in LazyMetaPropertyMap">clear()</a></span> - Method in <a href="grails/beans/util/LazyMetaPropertyMap.html">LazyMetaPropertyMap</a>
 </dt><dd> <div class="block"><DL><DT><B>throws:</B></DT><DD>UnsupportedOperationException</DD></DL> </div></dd>
+<dt><span class="strong"><a href="org/grails/testing/runtime/support/LazyTagLibraryLookup.html#clear()" title="Method in LazyTagLibraryLookup">clear()</a></span> - Method in <a href="org/grails/testing/runtime/support/LazyTagLibraryLookup.html">LazyTagLibraryLookup</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/util/Metadata.html#clear()" title="Method in Metadata">clear()</a></span> - Method in <a href="grails/util/Metadata.html">Metadata</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/config/NavigableMap.html#clear()" title="Method in NavigableMap">clear()</a></span> - Method in <a href="org/grails/config/NavigableMap.html">NavigableMap</a>
@@ -5058,6 +5063,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/buffer/StreamCharBuffer.html#clear()" title="Method in StreamCharBuffer">clear()</a></span> - Method in <a href="org/grails/buffer/StreamCharBuffer.html">StreamCharBuffer</a>
 </dt><dd> <div class="block">Clears the buffer and notifies the parents of this buffer of the change.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagLibraryLookup.html#clear()" title="Method in TagLibraryLookup">clear()</a></span> - Method in <a href="org/grails/taglib/TagLibraryLookup.html">TagLibraryLookup</a>
+</dt><dd> <div class="block">Clears all internal tag library caches. </div></dd>
 <dt><span class="strong"><a href="org/grails/web/mapping/UrlCreatorCache.html#clear()" title="Method in UrlCreatorCache">clear()</a></span> - Method in <a href="org/grails/web/mapping/UrlCreatorCache.html">UrlCreatorCache</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/plugin/cache/GrailsCacheAdminService.html#clearAllCaches()" title="Method in GrailsCacheAdminService">clearAllCaches()</a></span> - Method in <a href="grails/plugin/cache/GrailsCacheAdminService.html">GrailsCacheAdminService</a>
@@ -5976,6 +5983,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block">Sets a compound index definition</div></dd>
 <dt><span class="strong"><a href="org/grails/io/support/SpringIOUtils.html#computeChecksum(java.io.File, java.lang.String)" title="Method in SpringIOUtils">computeChecksum(java.io.File, java.lang.String)</a></span> - Method in <a href="org/grails/io/support/SpringIOUtils.html">SpringIOUtils</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagMethodInvoker.html#computeValue(Class<?>)" title="Method in TagMethodInvoker">computeValue(Class&lt;?&gt;)</a></span> - Method in <a href="org/grails/taglib/TagMethodInvoker.html">TagMethodInvoker</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/util/GrailsArrayUtils.html#concat(T, T)" title="Method in GrailsArrayUtils">concat(T, T)</a></span> - Method in <a href="grails/util/GrailsArrayUtils.html">GrailsArrayUtils</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/plugin/cache/Cacheable.html#condition" title="Field in Cacheable">condition</a></span> - Field in <a href="grails/plugin/cache/Cacheable.html">Cacheable</a>
@@ -6194,8 +6203,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsGradlePlugin.html#configureConsoleTask(org.gradle.api.Project)" title="Method in GrailsGradlePlugin">configureConsoleTask(org.gradle.api.Project)</a></span> - Method in <a href="org/grails/gradle/plugin/core/GrailsGradlePlugin.html">GrailsGradlePlugin</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#configureCsrf()" title="Method in FormTagLib">configureCsrf()</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/plugins/databasemigration/command/DatabaseMigrationCommand.html#configureDatabase(liquibase.database.Database)" title="Method in DatabaseMigrationCommand">configureDatabase(liquibase.database.Database)</a></span> - Method in <a href="org/grails/plugins/databasemigration/command/DatabaseMigrationCommand.html">DatabaseMigrationCommand</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/orm/bootstrap/HibernateDatastoreSpringInitializer.html#configureDataSources(org.springframework.core.env.PropertyResolver)" title="Method in HibernateDatastoreSpringInitializer">configureDataSources(org.springframework.core.env.PropertyResolver)</a></span> - Method in <a href="grails/orm/bootstrap/HibernateDatastoreSpringInitializer.html">HibernateDatastoreSpringInitializer</a>
@@ -7249,7 +7256,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/orm/hibernate/support/HibernateRuntimeUtils.html#convertValueToType(java.lang.Object, java.lang.Class, org.springframework.core.convert.ConversionService)" title="Method in HibernateRuntimeUtils">convertValueToType(java.lang.Object, java.lang.Class, org.springframework.core.convert.ConversionService)</a></span> - Method in <a href="org/grails/orm/hibernate/support/HibernateRuntimeUtils.html">HibernateRuntimeUtils</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#cookie" title="Property in ApplicationTagLib">cookie</a></span> - Property in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#cookie(java.util.Map)" title="Method in ApplicationTagLib">cookie(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
 </dt><dd> <div class="block">Obtains the value of a cookie.</div></dd>
 <dt><span class="strong"><a href="grails/web/http/HttpHeaders.html#COOKIE" title="Field in HttpHeaders">COOKIE</a></span> - Field in <a href="grails/web/http/HttpHeaders.html">HttpHeaders</a>
 </dt><dd> <div class="block"></div></dd>
@@ -7454,9 +7461,9 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/apache/grails/data/testing/tck/domains/Country.html#Country()" title="Constructor in Country">Country()</a></span> - Constructor in <a href="org/apache/grails/data/testing/tck/domains/Country.html">Country</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/CountryTagLib.html#country" title="Property in CountryTagLib">country</a></span> - Property in <a href="org/grails/plugins/web/taglib/CountryTagLib.html">CountryTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/CountryTagLib.html#country(java.util.Map)" title="Method in CountryTagLib">country(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/CountryTagLib.html">CountryTagLib</a>
 </dt><dd> <div class="block">Take a country code and output the country name, from the internal data.</div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/CountryTagLib.html#countrySelect" title="Property in CountryTagLib">countrySelect</a></span> - Property in <a href="org/grails/plugins/web/taglib/CountryTagLib.html">CountryTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/CountryTagLib.html#countrySelect(java.util.Map)" title="Method in CountryTagLib">countrySelect(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/CountryTagLib.html">CountryTagLib</a>
 </dt><dd> <div class="block">Display a country selection combo box.</div></dd>
 <dt><span class="strong"><a href="org/grails/plugins/web/taglib/CountryTagLib.html" title="Class in org.grails.plugins.web.taglib">CountryTagLib</a></span> - Class in <a href="./org/grails/plugins/web/taglib/package-summary.html">org.grails.plugins.web.taglib</a>
 </dt><dd><div class="block">Tags for rendering country selection / display of country names.</div></dd>
@@ -8028,7 +8035,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/build/logging/GrailsConsole.html#createLineReader(org.jline.terminal.Terminal, org.jline.reader.History)" title="Method in GrailsConsole">createLineReader(org.jline.terminal.Terminal, org.jline.reader.History)</a></span> - Method in <a href="grails/build/logging/GrailsConsole.html">GrailsConsole</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#createLink" title="Property in ApplicationTagLib">createLink</a></span> - Property in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#createLink(java.util.Map)" title="Method in ApplicationTagLib">createLink(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
 </dt><dd> <div class="block">Creates a grails application link from a set of attributes. </div></dd>
 <dt><span class="strong"><a href="grails/rest/Link.html#createLink(Map<String, Object>)" title="Method in Link">createLink(Map&lt;String, Object&gt;)</a></span> - Method in <a href="grails/rest/Link.html">Link</a>
 </dt><dd> <div class="block">Creates a link for the given arguments</div></dd>
@@ -8555,7 +8562,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd><div class="block">The default renderer for rendering java.util.Currency properties</div></dd>
 <dt><span class="strong"><a href="org/grails/scaffolding/registry/input/CurrencyInputRenderer.html#CurrencyInputRenderer()" title="Constructor in CurrencyInputRenderer">CurrencyInputRenderer()</a></span> - Constructor in <a href="org/grails/scaffolding/registry/input/CurrencyInputRenderer.html">CurrencyInputRenderer</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#currencySelect" title="Property in FormTagLib">currencySelect</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#currencySelect(java.util.Map, groovy.lang.Closure)" title="Method in FormTagLib">currencySelect(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">A helper tag for creating currency selects.</div></dd>
 <dt><span class="strong"><a href="org/grails/databinding/converters/CurrencyValueConverter.html" title="Class in org.grails.databinding.converters">CurrencyValueConverter</a></span> - Class in <a href="./org/grails/databinding/converters/package-summary.html">org.grails.databinding.converters</a>
 </dt><dd><div class="block">A ValueConverter for converting String to Currency.</div></dd>
@@ -8576,8 +8583,12 @@ if (location.href.indexOf('is-external=true') == -1) {
  </div></dd>
 <dt><span class="strong"><a href="grails/util/GrailsWebUtil.html#currentApplication()" title="Method in GrailsWebUtil">currentApplication()</a></span> - Method in <a href="grails/util/GrailsWebUtil.html">GrailsWebUtil</a>
 </dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The currently bound GrailsApplication instance</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagMethodContext.html#currentAttrs()" title="Method in TagMethodContext">currentAttrs()</a></span> - Method in <a href="org/grails/taglib/TagMethodContext.html">TagMethodContext</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/views/compiler/HalCodeVisitorSupport.html#currentBlock" title="Property in HalCodeVisitorSupport">currentBlock</a></span> - Property in <a href="grails/views/compiler/HalCodeVisitorSupport.html">HalCodeVisitorSupport</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagMethodContext.html#currentBody()" title="Method in TagMethodContext">currentBody()</a></span> - Method in <a href="org/grails/taglib/TagMethodContext.html">TagMethodContext</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/gorm/query/transform/DetachedCriteriaTransformer.html#currentClassNode" title="Field in DetachedCriteriaTransformer">currentClassNode</a></span> - Field in <a href="org/grails/datastore/gorm/query/transform/DetachedCriteriaTransformer.html">DetachedCriteriaTransformer</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/util/Environment.html#currentCompilationError" title="Field in Environment">currentCompilationError</a></span> - Field in <a href="grails/util/Environment.html">Environment</a>
@@ -9183,7 +9194,7 @@ if (location.href.indexOf('is-external=true') == -1) {
  with the system default zone.</div></dd>
 <dt><span class="strong"><a href="org/grails/databinding/converters/DateConversionHelper.html#dateParsingLenient" title="Property in DateConversionHelper">dateParsingLenient</a></span> - Property in <a href="org/grails/databinding/converters/DateConversionHelper.html">DateConversionHelper</a>
 </dt><dd> <div class="block">Whether data parsing is lenient</div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#datePicker" title="Property in FormTagLib">datePicker</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#datePicker(java.util.Map)" title="Method in FormTagLib">datePicker(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">A simple date picker that renders a date as selects.</div></dd>
 <dt><span class="strong"><a href="org/apache/grails/data/testing/tck/domains/Publication.html#datePublished" title="Property in Publication">datePublished</a></span> - Property in <a href="org/apache/grails/data/testing/tck/domains/Publication.html">Publication</a>
 </dt><dd> <div class="block"></div></dd>
@@ -11088,8 +11099,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd><div class="block">An ant task for using the DocEngine.</div></dd>
 <dt><span class="strong"><a href="grails/doc/ant/DocPublisherTask.html#DocPublisherTask()" title="Constructor in DocPublisherTask">DocPublisherTask()</a></span> - Constructor in <a href="grails/doc/ant/DocPublisherTask.html">DocPublisherTask</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#doCreateLink(java.util.Map)" title="Method in ApplicationTagLib">doCreateLink(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/apache/grails/testing/http/client/utils/XmlUtils.Format.html#doctype" title="Property in XmlUtils.Format">doctype</a></span> - Property in <a href="org/apache/grails/testing/http/client/utils/XmlUtils.Format.html">XmlUtils.Format</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/mongodb/mapping/MappingBuilder.html#document(groovy.lang.Closure)" title="Method in MappingBuilder">document(groovy.lang.Closure)</a></span> - Method in <a href="grails/mongodb/mapping/MappingBuilder.html">MappingBuilder</a>
@@ -11881,12 +11890,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block">Iterates over the request attributes.</div></dd>
 <dt><span class="strong"><a href="org/grails/web/servlet/HttpServletRequestExtension.html#each(jakarta.servlet.http.HttpServletRequest, groovy.lang.Closure)" title="Method in HttpServletRequestExtension">each(jakarta.servlet.http.HttpServletRequest, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/web/servlet/HttpServletRequestExtension.html">HttpServletRequestExtension</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#eachError" title="Property in ValidationTagLib">eachError</a></span> - Property in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#eachError(java.util.Map, groovy.lang.Closure)" title="Method in ValidationTagLib">eachError(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
 </dt><dd> <div class="block">Loops through each error of the specified bean or model. </div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#eachErrorInternal(java.lang.Object, java.lang.Object, boolean)" title="Method in ValidationTagLib">eachErrorInternal(java.lang.Object, java.lang.Object, boolean)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
-</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#eachErrorInternalForList(java.lang.Object, java.lang.Object, java.lang.Object, boolean)" title="Method in ValidationTagLib">eachErrorInternalForList(java.lang.Object, java.lang.Object, java.lang.Object, boolean)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/gorm/services/DefaultTenantService.html#eachTenant(groovy.lang.Closure)" title="Method in DefaultTenantService">eachTenant(groovy.lang.Closure)</a></span> - Method in <a href="org/grails/datastore/gorm/services/DefaultTenantService.html">DefaultTenantService</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/gorm/GormStaticApi.html#eachTenant(groovy.lang.Closure)" title="Method in GormStaticApi">eachTenant(groovy.lang.Closure)</a></span> - Method in <a href="org/grails/datastore/gorm/GormStaticApi.html">GormStaticApi</a>
@@ -12227,7 +12232,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd><div class="block">Marks a class capable of encoding itself with given Encoder</div></dd>
 <dt><span class="strong"><a href="org/grails/encoder/AbstractEncodedAppender.html#encodeAndWrite(org.grails.encoder.Encoder, org.grails.encoder.EncodingState, java.lang.CharSequence)" title="Method in AbstractEncodedAppender">encodeAndWrite(org.grails.encoder.Encoder, org.grails.encoder.EncodingState, java.lang.CharSequence)</a></span> - Method in <a href="org/grails/encoder/AbstractEncodedAppender.html">AbstractEncodedAppender</a>
 </dt><dd> <div class="block">Encode and write input to buffer using a non-streaming encoder</div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormatTagLib.html#encodeAs" title="Property in FormatTagLib">encodeAs</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormatTagLib.html">FormatTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormatTagLib.html#encodeAs(java.util.Map, groovy.lang.Closure)" title="Method in FormatTagLib">encodeAs(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormatTagLib.html">FormatTagLib</a>
 </dt><dd> <div class="block">Encodes the body using the specified codec.</div></dd>
 <dt><span class="strong"><a href="org/grails/plugins/codecs/Base64CodecExtensionMethods.html#encodeAsBase64(java.lang.Object)" title="Method in Base64CodecExtensionMethods">encodeAsBase64(java.lang.Object)</a></span> - Method in <a href="org/grails/plugins/codecs/Base64CodecExtensionMethods.html">Base64CodecExtensionMethods</a>
 </dt><dd> <div class="block"></div></dd>
@@ -13493,7 +13498,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block">The file extensions within the directories being watched</div></dd>
 <dt><span class="strong"><a href="org/grails/io/watch/FileExtensionFileChangeListener.html#extensions" title="Property in FileExtensionFileChangeListener">extensions</a></span> - Property in <a href="org/grails/io/watch/FileExtensionFileChangeListener.html">FileExtensionFileChangeListener</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#external" title="Property in ApplicationTagLib">external</a></span> - Property in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#external(java.util.Map)" title="Method in ApplicationTagLib">external(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
 </dt><dd> <div class="block">Render the appropriate kind of external link for use in <head> based on the type of the URI.
  </div></dd>
 <dt><span class="strong"><a href="grails/doc/DocEngine.html#EXTERNAL_DOCS" title="Property in DocEngine">EXTERNAL_DOCS</a></span> - Property in <a href="grails/doc/DocEngine.html">DocEngine</a>
@@ -13519,8 +13524,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd><div class="block"></div></dd>
 <dt><span class="strong"><a href="org/apache/grails/gradle/tasks/bom/ExtractedDependencyConstraint.html#ExtractedDependencyConstraint(java.lang.String)" title="Constructor in ExtractedDependencyConstraint">ExtractedDependencyConstraint(java.lang.String)</a></span> - Constructor in <a href="org/apache/grails/gradle/tasks/bom/ExtractedDependencyConstraint.html">ExtractedDependencyConstraint</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#extractErrors(java.lang.Object)" title="Method in ValidationTagLib">extractErrors(java.lang.Object)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/compiler/scaffolding/ScaffoldingControllerInjector.html#extractGenericDomainClass(org.codehaus.groovy.ast.ClassNode)" title="Method in ScaffoldingControllerInjector">extractGenericDomainClass(org.codehaus.groovy.ast.ClassNode)</a></span> - Method in <a href="org/grails/compiler/scaffolding/ScaffoldingControllerInjector.html">ScaffoldingControllerInjector</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/io/support/GrailsResourceUtils.html#extractJarFileURL(java.net.URL)" title="Method in GrailsResourceUtils">extractJarFileURL(java.net.URL)</a></span> - Method in <a href="org/grails/io/support/GrailsResourceUtils.html">GrailsResourceUtils</a>
@@ -13672,7 +13675,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The field or null if the field cannot be resolved</DD></DL></div></dd>
 <dt><span class="strong"><a href="org/grails/gorm/graphql/entity/fields/Field.html#Field()" title="Constructor in Field">Field()</a></span> - Constructor in <a href="org/grails/gorm/graphql/entity/fields/Field.html">Field</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#field" title="Property in FormTagLib">field</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#field(java.util.Map)" title="Method in FormTagLib">field(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">A general tag for creating fields.</div></dd>
 <dt><span class="strong"><a href="org/grails/gorm/graphql/testing/MockDataFetchingEnvironment.html#field" title="Property in MockDataFetchingEnvironment">field</a></span> - Property in <a href="org/grails/gorm/graphql/testing/MockDataFetchingEnvironment.html">MockDataFetchingEnvironment</a>
 </dt><dd> <div class="block"></div></dd>
@@ -13699,12 +13702,10 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd><div class="block">Uses field reflection or CGlib to improve performance</div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/reflect/FieldEntityAccess.html#FieldEntityAccess(org.grails.datastore.mapping.model.PersistentEntity, java.lang.Object, org.springframework.core.convert.ConversionService)" title="Constructor in FieldEntityAccess">FieldEntityAccess(org.grails.datastore.mapping.model.PersistentEntity, java.lang.Object, org.springframework.core.convert.ConversionService)</a></span> - Constructor in <a href="org/grails/datastore/mapping/reflect/ [...]
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#fieldError" title="Property in ValidationTagLib">fieldError</a></span> - Property in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#fieldError(java.util.Map, groovy.lang.Closure)" title="Method in ValidationTagLib">fieldError(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
 </dt><dd> <div class="block">Renders an error message for the given bean and field.</div></dd>
 <dt><span class="strong"><a href="org/grails/gorm/graphql/response/errors/DefaultGraphQLErrorsResponseHandler.html#fieldFetcher" title="Field in DefaultGraphQLErrorsResponseHandler">fieldFetcher</a></span> - Field in <a href="org/grails/gorm/graphql/response/errors/DefaultGraphQLErrorsResponseHandler.html">DefaultGraphQLErrorsResponseHandler</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#fieldImpl(org.grails.buffer.GrailsPrintWriter, java.util.Map)" title="Method in FormTagLib">fieldImpl(org.grails.buffer.GrailsPrintWriter, java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/gorm/graphql/response/errors/DefaultGraphQLErrorsResponseHandler.html#fieldName" title="Field in DefaultGraphQLErrorsResponseHandler">fieldName</a></span> - Field in <a href="org/grails/gorm/graphql/response/errors/DefaultGraphQLErrorsResponseHandler.html">DefaultGraphQLErrorsResponseHandler</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/gorm/graphql/entity/dsl/helpers/ComplexTyped.html#fields" title="Property in ComplexTyped">fields</a></span> - Property in <a href="org/grails/gorm/graphql/entity/dsl/helpers/ComplexTyped.html">ComplexTyped</a>
@@ -13719,7 +13720,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/gorm/graphql/testing/MockDataFetchingEnvironment.html#fieldType" title="Property in MockDataFetchingEnvironment">fieldType</a></span> - Property in <a href="org/grails/gorm/graphql/testing/MockDataFetchingEnvironment.html">MockDataFetchingEnvironment</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#fieldValue" title="Property in ValidationTagLib">fieldValue</a></span> - Property in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#fieldValue(java.util.Map, groovy.lang.Closure)" title="Method in ValidationTagLib">fieldValue(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
 </dt><dd> <div class="block">Obtains the value of a field either from the original errors.</div></dd>
 <dt><span class="strong"><a href="org/grails/cli/profile/commands/io/FileSystemInteraction.html#file(java.lang.Object)" title="Method in FileSystemInteraction">file(java.lang.Object)</a></span> - Method in <a href="org/grails/cli/profile/commands/io/FileSystemInteraction.html">FileSystemInteraction</a>
 </dt><dd> <div class="block">Obtain a file for the given path</div></dd>
@@ -14566,7 +14567,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/cli/profile/commands/script/GroovyScriptCommand.html#flag(java.lang.String)" title="Method in GroovyScriptCommand">flag(java.lang.String)</a></span> - Method in <a href="org/grails/cli/profile/commands/script/GroovyScriptCommand.html">GroovyScriptCommand</a>
 </dt><dd> <div class="block">Obtains details of the given flag if it has been set by the user</div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#flashMessages" title="Property in ApplicationTagLib">flashMessages</a></span> - Property in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#flashMessages(java.util.Map)" title="Method in ApplicationTagLib">flashMessages(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
 </dt><dd> <div class="block">Renders flash.message, flash.error, and flash.warning as Bootstrap alert divs.
  </div></dd>
 <dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#flashMessagesDismissible" title="Property in ApplicationTagLib">flashMessagesDismissible</a></span> - Property in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
@@ -14749,11 +14750,11 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/testing/web/controllers/ControllerUnitTest.html#FORM_CONTENT_TYPE" title="Property in ControllerUnitTest">FORM_CONTENT_TYPE</a></span> - Property in <a href="grails/testing/web/controllers/ControllerUnitTest.html">ControllerUnitTest</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#form" title="Property in FormTagLib">form</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#form(java.util.Map, groovy.lang.Closure)" title="Method in FormTagLib">form(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">General linking to controllers, actions etc. </div></dd>
 <dt><span class="strong"><a href="grails/web/mime/MimeType.html#FORM" title="Field in MimeType">FORM</a></span> - Field in <a href="grails/web/mime/MimeType.html">MimeType</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#formActionSubmit" title="Property in FormTagLib">formActionSubmit</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#formActionSubmit(java.util.Map)" title="Method in FormTagLib">formActionSubmit(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">Creates a submit button using the `formaction` attribute to submit to a different action than the form.
  </div></dd>
 <dt><span class="strong"><a href="grails/gorm/validation/DefaultConstrainedProperty.html#format" title="Property in DefaultConstrainedProperty">format</a></span> - Property in <a href="grails/gorm/validation/DefaultConstrainedProperty.html">DefaultConstrainedProperty</a>
@@ -14773,7 +14774,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/rest/render/atom/AtomRenderer.html#formatAtomDate(java.util.Date)" title="Method in AtomRenderer">formatAtomDate(java.util.Date)</a></span> - Method in <a href="grails/rest/render/atom/AtomRenderer.html">AtomRenderer</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormatTagLib.html#formatBoolean" title="Property in FormatTagLib">formatBoolean</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormatTagLib.html">FormatTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormatTagLib.html#formatBoolean(java.util.Map)" title="Method in FormatTagLib">formatBoolean(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormatTagLib.html">FormatTagLib</a>
 </dt><dd> <div class="block">Outputs the given boolean as the specified text label. </div></dd>
 <dt><span class="strong"><a href="org/grails/core/exceptions/DefaultErrorsPrinter.html#formatCodeSnippetEnd(org.springframework.core.io.Resource, int)" title="Method in DefaultErrorsPrinter">formatCodeSnippetEnd(org.springframework.core.io.Resource, int)</a></span> - Method in <a href="org/grails/core/exceptions/DefaultErrorsPrinter.html">DefaultErrorsPrinter</a>
 </dt><dd> <div class="block"></div></dd>
@@ -14791,7 +14792,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/web/errors/ErrorsViewStackTracePrinter.html#formatCodeSnippetStart(org.springframework.core.io.Resource, int, java.util.Map)" title="Method in ErrorsViewStackTracePrinter">formatCodeSnippetStart(org.springframework.core.io.Resource, int, java.util.Map)</a></span> - Method in <a href="org/grails/web/errors/ErrorsViewStackTracePrinter.html">ErrorsViewStackTracePrinter</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormatTagLib.html#formatDate" title="Property in FormatTagLib">formatDate</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormatTagLib.html">FormatTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormatTagLib.html#formatDate(java.util.Map)" title="Method in FormatTagLib">formatDate(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormatTagLib.html">FormatTagLib</a>
 </dt><dd> <div class="block">Outputs the given <code>Date</code> object in the specified format. </div></dd>
 <dt><span class="strong"><a href="grails/rest/render/atom/AtomRenderer.html#formatDateCreated(java.lang.Object)" title="Method in AtomRenderer">formatDateCreated(java.lang.Object)</a></span> - Method in <a href="grails/rest/render/atom/AtomRenderer.html">AtomRenderer</a>
 </dt><dd> <div class="block"></div></dd>
@@ -14807,7 +14808,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/rest/render/atom/AtomRenderer.html#formatLastUpdated(java.lang.Object)" title="Method in AtomRenderer">formatLastUpdated(java.lang.Object)</a></span> - Method in <a href="grails/rest/render/atom/AtomRenderer.html">AtomRenderer</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormatTagLib.html#formatNumber" title="Property in FormatTagLib">formatNumber</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormatTagLib.html">FormatTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormatTagLib.html#formatNumber(java.util.Map)" title="Method in FormatTagLib">formatNumber(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormatTagLib.html">FormatTagLib</a>
 </dt><dd> <div class="block">Outputs the given number in the specified format.  </div></dd>
 <dt><span class="strong"><a href="org/grails/plugins/web/mime/FormatInterceptor.html#formatOptions" title="Property in FormatInterceptor">formatOptions</a></span> - Property in <a href="org/grails/plugins/web/mime/FormatInterceptor.html">FormatInterceptor</a>
 </dt><dd> <div class="block"></div></dd>
@@ -16309,6 +16310,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/cli/compiler/AstUtils.html#getClosure(org.codehaus.groovy.ast.stmt.BlockStatement, java.lang.String)" title="Method in AstUtils">getClosure(org.codehaus.groovy.ast.stmt.BlockStatement, java.lang.String)</a></span> - Method in <a href="org/grails/cli/compiler/AstUtils.html">AstUtils</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagMethodInvoker.html#getClosureTagProperty(groovy.lang.GroovyObject, java.lang.String)" title="Method in TagMethodInvoker">getClosureTagProperty(groovy.lang.GroovyObject, java.lang.String)</a></span> - Method in <a href="org/grails/taglib/TagMethodInvoker.html">TagMethodInvoker</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/web/taglib/jsp/JspMessageTag.html#getCode()" title="Method in JspMessageTag">getCode()</a></span> - Method in <a href="org/grails/web/taglib/jsp/JspMessageTag.html">JspMessageTag</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/encoder/CodecIdentifier.html#getCodecAliases()" title="Method in CodecIdentifier">getCodecAliases()</a></span> - Method in <a href="org/grails/encoder/CodecIdentifier.html">CodecIdentifier</a>
@@ -18743,6 +18746,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The inverse side or null if the association is not bidirectional</DD></DL></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/model/types/Basic.html#getInverseSide()" title="Method in Basic">getInverseSide()</a></span> - Method in <a href="org/grails/datastore/mapping/model/types/Basic.html">Basic</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagMethodInvoker.html#getInvokableTagMethodNames(Class<?>)" title="Method in TagMethodInvoker">getInvokableTagMethodNames(Class&lt;?&gt;)</a></span> - Method in <a href="org/grails/taglib/TagMethodInvoker.html">TagMethodInvoker</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/orm/hibernate/AbstractHibernateSession.html#getIterableAsCollection(java.lang.Iterable)" title="Method in AbstractHibernateSession">getIterableAsCollection(java.lang.Iterable)</a></span> - Method in <a href="org/grails/orm/hibernate/AbstractHibernateSession.html">AbstractHibernateSession</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/orm/hibernate/GrailsHibernateTemplate.html#getIterableAsCollection(java.lang.Iterable)" title="Method in GrailsHibernateTemplate">getIterableAsCollection(java.lang.Iterable)</a></span> - Method in <a href="org/grails/orm/hibernate/GrailsHibernateTemplate.html">GrailsHibernateTemplate</a>
@@ -21121,10 +21126,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/gorm/proxy/ProxyInstanceMetaClass.html#getProxyTarget()" title="Method in ProxyInstanceMetaClass">getProxyTarget()</a></span> - Method in <a href="org/grails/datastore/gorm/proxy/ProxyInstanceMetaClass.html">ProxyInstanceMetaClass</a>
 </dt><dd> <div class="block">Load the target from the DB.</div></dd>
-<dt><span class="strong"><a href="grails/testing/web/GrailsWebUnitTest.html#getPurgeTagLibMetaClass()" title="Method in GrailsWebUnitTest">getPurgeTagLibMetaClass()</a></span> - Method in <a href="grails/testing/web/GrailsWebUnitTest.html">GrailsWebUnitTest</a>
-</dt><dd> <div class="block">When mocking tag libs, the LazyTagLibraryLookup will not be cleared by default. </div></dd>
-<dt><span class="strong"><a href="grails/testing/web/taglib/TagLibUnitTest.html#getPurgeTagLibMetaClass()" title="Method in TagLibUnitTest">getPurgeTagLibMetaClass()</a></span> - Method in <a href="grails/testing/web/taglib/TagLibUnitTest.html">TagLibUnitTest</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/web/mime/MimeType.html#getQuality()" title="Method in MimeType">getQuality()</a></span> - Method in <a href="grails/web/mime/MimeType.html">MimeType</a>
 </dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The quality of the Mime type</DD></DL></div></dd>
 <dt><span class="strong"><a href="grails/web/mime/MimeType.html#getQualityAsNumber()" title="Method in MimeType">getQualityAsNumber()</a></span> - Method in <a href="grails/web/mime/MimeType.html">MimeType</a>
@@ -25028,7 +25029,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block">Tests whether an instance has any errors</div></dd>
 <dt><span class="strong"><a href="grails/validation/Validateable.html#hasErrors()" title="Method in Validateable">hasErrors()</a></span> - Method in <a href="grails/validation/Validateable.html">Validateable</a>
 </dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>Whether the object has errors</DD></DL></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#hasErrors" title="Property in ValidationTagLib">hasErrors</a></span> - Property in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#hasErrors(java.util.Map, groovy.lang.Closure)" title="Method in ValidationTagLib">hasErrors(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
 </dt><dd> <div class="block">Checks if the request has errors either for a field or global errors.</div></dd>
 <dt><span class="strong"><a href="org/grails/events/gorm/GormEventDispatcher.html#hasEventSubscribers" title="Field in GormEventDispatcher">hasEventSubscribers</a></span> - Field in <a href="org/grails/events/gorm/GormEventDispatcher.html">GormEventDispatcher</a>
 </dt><dd> <div class="block"></div></dd>
@@ -25168,6 +25169,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/plugins/GrailsPlugin.html#hasInterestInChange(java.lang.String)" title="Method in GrailsPlugin">hasInterestInChange(java.lang.String)</a></span> - Method in <a href="grails/plugins/GrailsPlugin.html">GrailsPlugin</a>
 </dt><dd> <div class="block">Whether the plugin is interested in a particular change</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagMethodInvoker.html#hasInvokableTagMethod(groovy.lang.GroovyObject, java.lang.String)" title="Method in TagMethodInvoker">hasInvokableTagMethod(groovy.lang.GroovyObject, java.lang.String)</a></span> - Method in <a href="org/grails/taglib/TagMethodInvoker.html">TagMethodInvoker</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/GrailsDomainBinder.html#hasJoinColumnMapping(org.grails.orm.hibernate.cfg.PropertyConfig)" title="Method in GrailsDomainBinder">hasJoinColumnMapping(org.grails.orm.hibernate.cfg.PropertyConfig)</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/GrailsDomainBinder.html">GrailsDomainBinder</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/GrailsDomainBinder.html#hasJoinKeyMapping(org.grails.orm.hibernate.cfg.PropertyConfig)" title="Method in GrailsDomainBinder">hasJoinKeyMapping(org.grails.orm.hibernate.cfg.PropertyConfig)</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/GrailsDomainBinder.html">GrailsDomainBinder</a>
@@ -25329,7 +25332,7 @@ if (location.href.indexOf('is-external=true') == -1) {
  </div></dd>
 <dt><span class="strong"><a href="org/grails/web/mapping/reporting/AnsiConsoleUrlMappingsRenderer.html#header(java.lang.String, java.lang.String)" title="Method in AnsiConsoleUrlMappingsRenderer">header(java.lang.String, java.lang.String)</a></span> - Method in <a href="org/grails/web/mapping/reporting/AnsiConsoleUrlMappingsRenderer.html">AnsiConsoleUrlMappingsRenderer</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#header" title="Property in ApplicationTagLib">header</a></span> - Property in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#header(java.util.Map)" title="Method in ApplicationTagLib">header(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
 </dt><dd> <div class="block">Renders the specified request header value.</div></dd>
 <dt><span class="strong"><a href="grails/artefact/Controller.html#header(java.lang.String, java.lang.Object)" title="Method in Controller">header(java.lang.String, java.lang.Object)</a></span> - Method in <a href="grails/artefact/Controller.html">Controller</a>
 </dt><dd> <div class="block">Sets a response header for the given name and value</div></dd>
@@ -25614,10 +25617,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd><div class="block">Methods to deal with the differences in different Hibernate versions</div></dd>
 <dt><span class="strong"><a href="org/grails/web/config/http/GrailsFilters.html#HIDDEN_HTTP_METHOD_FILTER" title="Enum Constant in GrailsFilters">HIDDEN_HTTP_METHOD_FILTER</a></span> - Enum Constant in <a href="org/grails/web/config/http/GrailsFilters.html">GrailsFilters</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#hiddenField" title="Property in FormTagLib">hiddenField</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#hiddenField(java.util.Map)" title="Method in FormTagLib">hiddenField(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">Creates a hidden field.</div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#hiddenFieldImpl(java.lang.Object, java.lang.Object)" title="Method in FormTagLib">hiddenFieldImpl(java.lang.Object, java.lang.Object)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/web/filters/HiddenHttpMethodFilter.html" title="Class in org.grails.web.filters">HiddenHttpMethodFilter</a></span> - Class in <a href="./org/grails/web/filters/package-summary.html">org.grails.web.filters</a>
 </dt><dd><div class="block">Based off the Spring implementation, but also supports the X-HTTP-Method-Override HTTP header.</div></dd>
 <dt><span class="strong"><a href="org/grails/web/filters/HiddenHttpMethodFilter.HttpMethodRequestWrapper.html" title="Class in org.grails.web.filters.HiddenHttpMethodFilter">HiddenHttpMethodFilter.HttpMethodRequestWrapper</a></span> - Class in <a href="./org/grails/web/filters/package-summary.html">org.grails.web.filters</a>
@@ -26134,7 +26135,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/doc/DocPublisher.html#images" title="Property in DocPublisher">images</a></span> - Property in <a href="grails/doc/DocPublisher.html">DocPublisher</a>
 </dt><dd> <div class="block">The directory containing any images to use (will override defaults) *</div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#img" title="Property in ApplicationTagLib">img</a></span> - Property in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#img(java.util.Map)" title="Method in ApplicationTagLib">img(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
 </dt><dd> <div class="block">Render an img tag with src set to a static resource<DL><DT><B>attr:</B></DT><DD>dir Optional name of resource directory, defaults to "images"</DD></DL><DL><DT><B>attr:</B></DT><DD>file Name of resource file (optional if uri specified)</DD></DL><DL><DT><B>attr:</B></DT><DD>plugin Optional the name of the grails plugin if the resource is not part of the application</DD></DL><DL><DT><B>attr:</B></DT><DD>uri Optional app-relative URI path of the resource if not u [...]
 <dt><span class="strong"><a href="org/grails/web/converters/configuration/ImmutableConverterConfiguration.html" title="Class in org.grails.web.converters.configuration">ImmutableConverterConfiguration</a></span> - Class in <a href="./org/grails/web/converters/configuration/package-summary.html">org.grails.web.converters.configuration</a>
 </dt><dd><div class="block">Immutable Converter Configuration.</div></dd>
@@ -26238,7 +26239,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/boot/config/tools/SettingsFile.html#include(java.lang.String)" title="Method in SettingsFile">include(java.lang.String)</a></span> - Method in <a href="grails/boot/config/tools/SettingsFile.html">SettingsFile</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html#include" title="Property in UrlMappingTagLib">include</a></span> - Property in <a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html">UrlMappingTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html#include(java.util.Map, groovy.lang.Closure)" title="Method in UrlMappingTagLib">include(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html">UrlMappingTagLib</a>
 </dt><dd> <div class="block">Includes another controller/action within the current response.</div></dd>
 <dt><span class="strong"><a href="grails/plugin/json/view/api/internal/DefaultJsonViewHelper.html#includeAssociations(java.util.Map)" title="Method in DefaultJsonViewHelper">includeAssociations(java.util.Map)</a></span> - Method in <a href="grails/plugin/json/view/api/internal/DefaultJsonViewHelper.html">DefaultJsonViewHelper</a>
 </dt><dd> <div class="block"></div></dd>
@@ -27097,6 +27098,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/views/json/test/spock/JsonViewSetupSpecInterceptor.html#intercept(org.spockframework.runtime.extension.IMethodInvocation)" title="Method in JsonViewSetupSpecInterceptor">intercept(org.spockframework.runtime.extension.IMethodInvocation)</a></span> - Method in <a href="grails/views/json/test/spock/JsonViewSetupSpecInterceptor.html">JsonViewSetupSpecInterceptor</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/testing/spock/UrlMappingCleanupInterceptor.html#intercept(org.spockframework.runtime.extension.IMethodInvocation)" title="Method in UrlMappingCleanupInterceptor">intercept(org.spockframework.runtime.extension.IMethodInvocation)</a></span> - Method in <a href="org/grails/testing/spock/UrlMappingCleanupInterceptor.html">UrlMappingCleanupInterceptor</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html#intercept(org.spockframework.runtime.extension.IMethodInvocation)" title="Method in UrlMappingSetupSpecInterceptor">intercept(org.spockframework.runtime.extension.IMethodInvocation)</a></span> - Method in <a href="org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html">UrlMappingSetupSpecInterceptor</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/testing/spock/WebCleanupInterceptor.html#intercept(org.spockframework.runtime.extension.IMethodInvocation)" title="Method in WebCleanupInterceptor">intercept(org.spockframework.runtime.extension.IMethodInvocation)</a></span> - Method in <a href="org/grails/testing/spock/WebCleanupInterceptor.html">WebCleanupInterceptor</a>
@@ -27350,6 +27353,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/gsp/GroovyPage.html#invokeTag(java.lang.String, java.lang.String, int, java.util.Map, int)" title="Method in GroovyPage">invokeTag(java.lang.String, java.lang.String, int, java.util.Map, int)</a></span> - Method in <a href="org/grails/gsp/GroovyPage.html">GroovyPage</a>
 </dt><dd> <div class="block">Attempts to invokes a dynamic tag</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagMethodInvoker.html#invokeTagMethod(groovy.lang.GroovyObject, java.lang.String, Map<?,?>, Closure<?>)" title="Method in TagMethodInvoker">invokeTagMethod(groovy.lang.GroovyObject, java.lang.String, Map&lt;?,?&gt;, Closure&lt;?&gt;)</a></span> - Method in <a href="org/grails/taglib/TagMethodInvoker.html">TagMethodInvoker</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/proxy/GroovyObjectMethodHandler.html#invokeThisMethod(java.lang.Object, java.lang.String, java.lang.Object)" title="Method in GroovyObjectMethodHandler">invokeThisMethod(java.lang.Object, java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/datastore/mapping/proxy/GroovyObjectMethodHandler.html">GroovyObjectMethodHandler</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/config/DatastoreServiceMethodInvokingFactoryBean.html#invokeWithTargetException()" title="Method in DatastoreServiceMethodInvokingFactoryBean">invokeWithTargetException()</a></span> - Method in <a href="org/grails/datastore/mapping/config/DatastoreServiceMethodInvokingFactoryBean.html">DatastoreServiceMethodInvokingFactoryBean</a>
@@ -27606,7 +27611,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>Whether jakarta.validation is available</DD></DL></div></dd>
 <dt><span class="strong"><a href="org/grails/boot/internal/JavaCompiler.html#isAvailable()" title="Method in JavaCompiler">isAvailable()</a></span> - Method in <a href="org/grails/boot/internal/JavaCompiler.html">JavaCompiler</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/PluginTagLib.html#isAvailable" title="Property in PluginTagLib">isAvailable</a></span> - Property in <a href="org/grails/plugins/web/taglib/PluginTagLib.html">PluginTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/PluginTagLib.html#isAvailable(java.util.Map, groovy.lang.Closure)" title="Method in PluginTagLib">isAvailable(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/PluginTagLib.html">PluginTagLib</a>
 </dt><dd> <div class="block">Checks whether a particular plugin exists and executes the body if it does.</div></dd>
 <dt><span class="strong"><a href="org/grails/plugins/AbstractGrailsPlugin.html#isBase" title="Field in AbstractGrailsPlugin">isBase</a></span> - Field in <a href="org/grails/plugins/AbstractGrailsPlugin.html">AbstractGrailsPlugin</a>
 </dt><dd> <div class="block"></div></dd>
@@ -28435,7 +28440,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/gorm/support/EventTriggerCaller.html#isNoOperationCaller()" title="Method in EventTriggerCaller">isNoOperationCaller()</a></span> - Method in <a href="org/grails/datastore/gorm/support/EventTriggerCaller.html">EventTriggerCaller</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/PluginTagLib.html#isNotAvailable" title="Property in PluginTagLib">isNotAvailable</a></span> - Property in <a href="org/grails/plugins/web/taglib/PluginTagLib.html">PluginTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/PluginTagLib.html#isNotAvailable(java.util.Map, groovy.lang.Closure)" title="Method in PluginTagLib">isNotAvailable(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/PluginTagLib.html">PluginTagLib</a>
 </dt><dd> <div class="block">Checks whether a particular plugin does not exist and executes the body if it does.</div></dd>
 <dt><span class="strong"><a href="grails/util/GrailsStringUtils.html#isNotBlank(java.lang.String)" title="Method in GrailsStringUtils">isNotBlank(java.lang.String)</a></span> - Method in <a href="grails/util/GrailsStringUtils.html">GrailsStringUtils</a>
 </dt><dd> <div class="block">Opposite of <a href='../../grails/util/GrailsStringUtils.html#isBlank(java.lang.String)' title='GrailsStringUtils.isBlank'>GrailsStringUtils.isBlank</a></div></dd>
@@ -28983,6 +28988,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>Return true if the environment has been set as a System property</DD></DL></div></dd>
 <dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/Mapping.html#isTablePerConcreteClass()" title="Method in Mapping">isTablePerConcreteClass()</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/Mapping.html">Mapping</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagMethodInvoker.html#isTagMethodCandidate(java.lang.reflect.Method)" title="Method in TagMethodInvoker">isTagMethodCandidate(java.lang.reflect.Method)</a></span> - Method in <a href="org/grails/taglib/TagMethodInvoker.html">TagMethodInvoker</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/config/AbstractGormMappingFactory.html#isTenantId(org.grails.datastore.mapping.model.PersistentEntity, org.grails.datastore.mapping.model.MappingContext, java.beans.PropertyDescriptor)" title="Method in AbstractGormMappingFactory">isTenantId(org.grails.datastore.mapping.model.PersistentEntity, org.grails.datastore.mapping.model.MappingContext, java.beans.PropertyDescriptor)</a></span> - Method in <a href="org/grails/datastore [...]
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/keyvalue/mapping/config/KeyValueMappingFactory.html#isTenantId(org.grails.datastore.mapping.model.PersistentEntity, org.grails.datastore.mapping.model.MappingContext, java.beans.PropertyDescriptor)" title="Method in KeyValueMappingFactory">isTenantId(org.grails.datastore.mapping.model.PersistentEntity, org.grails.datastore.mapping.model.MappingContext, java.beans.PropertyDescriptor)</a></span> - Method in <a href="org/grails/ [...]
@@ -29308,7 +29315,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/orm/hibernate/query/AbstractHibernateQuery.html#join(java.lang.String, jakarta.persistence.criteria.JoinType)" title="Method in AbstractHibernateQuery">join(java.lang.String, jakarta.persistence.criteria.JoinType)</a></span> - Method in <a href="org/grails/orm/hibernate/query/AbstractHibernateQuery.html">AbstractHibernateQuery</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#join" title="Property in ApplicationTagLib">join</a></span> - Property in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#join(java.util.Map)" title="Method in ApplicationTagLib">join(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
 </dt><dd> <div class="block">Uses the Groovy JDK join method to concatenate the toString() representation of each item
  in this collection with the given separator.</div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/query/api/BuildableCriteria.html#join(java.lang.String, jakarta.persistence.criteria.JoinType)" title="Method in BuildableCriteria">join(java.lang.String, jakarta.persistence.criteria.JoinType)</a></span> - Method in <a href="org/grails/datastore/mapping/query/api/BuildableCriteria.html">BuildableCriteria</a>
@@ -30721,7 +30728,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/views/mvc/SmartViewResolver.html#localeResolver" title="Property in SmartViewResolver">localeResolver</a></span> - Property in <a href="grails/views/mvc/SmartViewResolver.html">SmartViewResolver</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#localeSelect" title="Property in FormTagLib">localeSelect</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#localeSelect(java.util.Map)" title="Method in FormTagLib">localeSelect(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">A helper tag for creating locale selects.</div></dd>
 <dt><span class="strong"><a href="grails/plugin/geb/support/LocalhostDownloadSupport.html" title="Class in grails.plugin.geb.support">LocalhostDownloadSupport</a></span> - Class in <a href="./grails/plugin/geb/support/package-summary.html">grails.plugin.geb.support</a>
 </dt><dd><div class="block"> <DL><DT><B>Authors:</B></DT><DD>Mattias Reichel</DD></DL></div></dd>
@@ -31899,14 +31906,10 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block">Obtains a i18n message</div></dd>
 <dt><span class="strong"><a href="grails/plugin/json/view/test/JsonRenderResult.html#message" title="Property in JsonRenderResult">message</a></span> - Property in <a href="grails/plugin/json/view/test/JsonRenderResult.html">JsonRenderResult</a>
 </dt><dd> <div class="block">The HTTP response message</div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#message" title="Property in ValidationTagLib">message</a></span> - Property in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#message(java.util.Map)" title="Method in ValidationTagLib">message(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
 </dt><dd> <div class="block">Resolves a message code for a given error or code from the resource bundle.</div></dd>
 <dt><span class="strong"><a href="org/grails/gorm/graphql/response/errors/DefaultGraphQLErrorsResponseHandler.html#messageFetcher" title="Field in DefaultGraphQLErrorsResponseHandler">messageFetcher</a></span> - Field in <a href="org/grails/gorm/graphql/response/errors/DefaultGraphQLErrorsResponseHandler.html">DefaultGraphQLErrorsResponseHandler</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormatTagLib.html#messageHelper(java.lang.String, java.lang.Object, java.util.List, java.util.Locale)" title="Method in FormatTagLib">messageHelper(java.lang.String, java.lang.Object, java.util.List, java.util.Locale)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormatTagLib.html">FormatTagLib</a>
-</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#messageImpl(java.util.Map)" title="Method in ValidationTagLib">messageImpl(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/gorm/validation/jakarta/GormValidatorFactoryAdapter.GormValidatorContext.html#messageInterpolator(jakarta.validation.MessageInterpolator)" title="Method in GormValidatorFactoryAdapter.GormValidatorContext">messageInterpolator(jakarta.validation.MessageInterpolator)</a></span> - Method in <a href="org/grails/datastore/gorm/validation/jakarta/GormValidatorFactoryAdapter.GormValidatorContext.html">GormValidatorFactoryAdapter.GormValidat [...]
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/build/logging/GrailsConsoleBuildListener.html#messageLogged(org.apache.tools.ant.BuildEvent)" title="Method in GrailsConsoleBuildListener">messageLogged(org.apache.tools.ant.BuildEvent)</a></span> - Method in <a href="org/grails/build/logging/GrailsConsoleBuildListener.html">GrailsConsoleBuildListener</a>
@@ -31949,7 +31952,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/plugins/domain/GrailsDomainClassAutoConfiguration.html#messageSources" title="Property in GrailsDomainClassAutoConfiguration">messageSources</a></span> - Property in <a href="org/grails/plugins/domain/GrailsDomainClassAutoConfiguration.html">GrailsDomainClassAutoConfiguration</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#meta" title="Property in ApplicationTagLib">meta</a></span> - Property in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#meta(java.util.Map)" title="Method in ApplicationTagLib">meta(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
 </dt><dd> <div class="block">Output application metadata that is loaded from application.yml and grails.build.info if it is present.</div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/proxy/GroovyObjectMethodHandler.html#META_CLASS_PROPERTY" title="Field in GroovyObjectMethodHandler">META_CLASS_PROPERTY</a></span> - Field in <a href="org/grails/datastore/mapping/proxy/GroovyObjectMethodHandler.html">GroovyObjectMethodHandler</a>
 </dt><dd> <div class="block"></div></dd>
@@ -32391,8 +32394,12 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd><div class="block">Loads Resources from Strings that are registered as Mock resources.</div></dd>
 <dt><span class="strong"><a href="grails/testing/web/GrailsWebUnitTest.html#mockTagLib(Class<?>)" title="Method in GrailsWebUnitTest">mockTagLib(Class&lt;?&gt;)</a></span> - Method in <a href="grails/testing/web/GrailsWebUnitTest.html">GrailsWebUnitTest</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/testing/web/taglib/TagLibUnitTest.html#mockTagLib(Class<?>)" title="Method in TagLibUnitTest">mockTagLib(Class&lt;?&gt;)</a></span> - Method in <a href="grails/testing/web/taglib/TagLibUnitTest.html">TagLibUnitTest</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/testing/web/GrailsWebUnitTest.html#mockTagLibs(Class<?>)" title="Method in GrailsWebUnitTest">mockTagLibs(Class&lt;?&gt;)</a></span> - Method in <a href="grails/testing/web/GrailsWebUnitTest.html">GrailsWebUnitTest</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/testing/web/taglib/TagLibUnitTest.html#mockTagLibs(Class<?>)" title="Method in TagLibUnitTest">mockTagLibs(Class&lt;?&gt;)</a></span> - Method in <a href="grails/testing/web/taglib/TagLibUnitTest.html">TagLibUnitTest</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/orm/hibernate/connections/HibernateConnectionSourceSettings.HibernateSettings.FlushSettings.html#mode" title="Property in HibernateConnectionSourceSettings.HibernateSettings.FlushSettings">mode</a></span> - Property in <a href="org/grails/orm/hibernate/connections/HibernateConnectionSourceSettings.HibernateSettings.FlushSettings.html">HibernateConnectionSourceSettings.HibernateSettings.FlushSettings</a>
 </dt><dd> <div class="block">The default flush mode</div></dd>
 <dt><span class="strong"><a href="org/grails/test/spock/IntegrationSpecConfigurerExtension.IntegrationSpecMethodInterceptor.html#mode" title="Property in IntegrationSpecConfigurerExtension.IntegrationSpecMethodInterceptor">mode</a></span> - Property in <a href="org/grails/test/spock/IntegrationSpecConfigurerExtension.IntegrationSpecMethodInterceptor.html">IntegrationSpecConfigurerExtension.IntegrationSpecMethodInterceptor</a>
@@ -33518,6 +33525,9 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/gorm/validation/ConstrainedProperty.html#NOT_PREFIX" title="Field in ConstrainedProperty">NOT_PREFIX</a></span> - Field in <a href="grails/gorm/validation/ConstrainedProperty.html">ConstrainedProperty</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/gsp/NotATag.html" title="Annotation Type in grails.gsp">NotATag</a></span> - Annotation Type in <a href="./grails/gsp/package-summary.html">grails.gsp</a>
+</dt><dd><div class="block">Marks a public method on a <CODE>TagLib</CODE> class as a helper that should not be
+ exposed as a tag. </div></dd>
 <dt><span class="strong"><a href="grails/doc/NoteMacro.html" title="Class in grails.doc">NoteMacro</a></span> - Class in <a href="./grails/doc/package-summary.html">grails.doc</a>
 </dt><dd><div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/doc/NoteMacro.html#NoteMacro()" title="Constructor in NoteMacro">NoteMacro()</a></span> - Constructor in <a href="grails/doc/NoteMacro.html">NoteMacro</a>
@@ -34448,8 +34458,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block">For displaying a page of results</div></dd>
 <dt><span class="strong"><a href="org/grails/gorm/graphql/entity/property/impl/PersistentGraphQLProperty.html#output" title="Property in PersistentGraphQLProperty">output</a></span> - Property in <a href="org/grails/gorm/graphql/entity/property/impl/PersistentGraphQLProperty.html">PersistentGraphQLProperty</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#outputAttributes(java.util.Map, org.grails.buffer.GrailsPrintWriter, boolean)" title="Method in FormTagLib">outputAttributes(java.util.Map, org.grails.buffer.GrailsPrintWriter, boolean)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
-</dt><dd> <div class="block">Dump out attributes in HTML compliant fashion.</div></dd>
 <dt><span class="strong"><a href="org/grails/web/servlet/mvc/OutputAwareHttpServletResponse.html" title="Class in org.grails.web.servlet.mvc">OutputAwareHttpServletResponse</a></span> - Class in <a href="./org/grails/web/servlet/mvc/package-summary.html">org.grails.web.servlet.mvc</a>
 </dt><dd><div class="block">Tracks whether getOutputStream() was called in order to prevent calls to getWriter() after
  getOutputStream() has been called</div></dd>
@@ -34607,7 +34615,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block">Pagination support which outputs hal links to the resulting pages</div></dd>
 <dt><span class="strong"><a href="org/grails/gorm/graphql/entity/operations/ListOperation.html#paginate" title="Property in ListOperation">paginate</a></span> - Property in <a href="org/grails/gorm/graphql/entity/operations/ListOperation.html">ListOperation</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html#paginate" title="Property in UrlMappingTagLib">paginate</a></span> - Property in <a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html">UrlMappingTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html#paginate(java.util.Map)" title="Method in UrlMappingTagLib">paginate(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html">UrlMappingTagLib</a>
 </dt><dd> <div class="block">Creates next/previous links to support pagination for the current controller.</div></dd>
 <dt><span class="strong"><a href="org/grails/gorm/graphql/entity/dsl/helpers/Typed.html#paginated" title="Property in Typed">paginated</a></span> - Property in <a href="org/grails/gorm/graphql/entity/dsl/helpers/Typed.html">Typed</a>
 </dt><dd> <div class="block"></div></dd>
@@ -34917,7 +34925,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/cli/profile/ProfileRepoConfig.html#password" title="Property in ProfileRepoConfig">password</a></span> - Property in <a href="org/grails/cli/profile/ProfileRepoConfig.html">ProfileRepoConfig</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#passwordField" title="Property in FormTagLib">passwordField</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#passwordField(java.util.Map)" title="Method in FormTagLib">passwordField(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">Creates a new password field.</div></dd>
 <dt><span class="strong"><a href="grails/init/GrailsVersion.html#patch" title="Field in GrailsVersion">patch</a></span> - Field in <a href="grails/init/GrailsVersion.html">GrailsVersion</a>
 </dt><dd> <div class="block"></div></dd>
@@ -34939,7 +34947,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/config/NavigableMap.NullSafeNavigator.html#path" title="Property in NavigableMap.NullSafeNavigator">path</a></span> - Property in <a href="org/grails/config/NavigableMap.NullSafeNavigator.html">NavigableMap.NullSafeNavigator</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/PluginTagLib.html#path" title="Property in PluginTagLib">path</a></span> - Property in <a href="org/grails/plugins/web/taglib/PluginTagLib.html">PluginTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/PluginTagLib.html#path(java.util.Map, groovy.lang.Closure)" title="Method in PluginTagLib">path(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/PluginTagLib.html">PluginTagLib</a>
 </dt><dd> <div class="block">Gets the path to a particular plugin.</div></dd>
 <dt><span class="strong"><a href="org/grails/web/pages/GroovyPagesUriSupport.html#PATH_TO_VIEWS" title="Field in GroovyPagesUriSupport">PATH_TO_VIEWS</a></span> - Field in <a href="org/grails/web/pages/GroovyPagesUriSupport.html">GroovyPagesUriSupport</a>
 </dt><dd> <div class="block"></div></dd>
@@ -35581,6 +35589,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/web/json/PathCapturingJSONWriterWrapper.html#pop(Mode)" title="Method in PathCapturingJSONWriterWrapper">pop(Mode)</a></span> - Method in <a href="org/grails/web/json/PathCapturingJSONWriterWrapper.html">PathCapturingJSONWriterWrapper</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagMethodContext.html#pop()" title="Method in TagMethodContext">pop()</a></span> - Method in <a href="org/grails/taglib/TagMethodContext.html">TagMethodContext</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/gsp/jsp/GroovyPagesPageContext.html#popBody()" title="Method in GroovyPagesPageContext">popBody()</a></span> - Method in <a href="org/grails/gsp/jsp/GroovyPagesPageContext.html">GroovyPagesPageContext</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/reflect/ClosureToMapPopulator.html#populate(groovy.lang.Closure)" title="Method in ClosureToMapPopulator">populate(groovy.lang.Closure)</a></span> - Method in <a href="org/grails/datastore/mapping/reflect/ClosureToMapPopulator.html">ClosureToMapPopulator</a>
@@ -36128,10 +36138,6 @@ if (location.href.indexOf('is-external=true') == -1) {
  for the given SessionFactory.</div></dd>
 <dt><span class="strong"><a href="grails/plugin/json/view/api/internal/DefaultGrailsJsonViewHelper.html#PROCESSED_OBJECT_VARIABLE" title="Field in DefaultGrailsJsonViewHelper">PROCESSED_OBJECT_VARIABLE</a></span> - Field in <a href="grails/plugin/json/view/api/internal/DefaultGrailsJsonViewHelper.html">DefaultGrailsJsonViewHelper</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#processedUrl(java.lang.String, java.lang.Object)" title="Method in ApplicationTagLib">processedUrl(java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
-</dt><dd> <div class="block">Filters the url through the RequestDataValueProcessor bean if it is registered.</div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#processedUrl(java.lang.String, java.lang.Object)" title="Method in FormTagLib">processedUrl(java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
-</dt><dd> <div class="block">Filters the url through the RequestDataValueProcessor bean if it is registered.</div></dd>
 <dt><span class="strong"><a href="grails/compiler/ast/GlobalClassInjectorAdapter.html#processesClassNames" title="Property in GlobalClassInjectorAdapter">processesClassNames</a></span> - Property in <a href="grails/compiler/ast/GlobalClassInjectorAdapter.html">GlobalClassInjectorAdapter</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/plugins/databasemigration/liquibase/DatabaseChangeLogBuilder.html#processGrailsChangeProperty(java.lang.String, java.lang.Object)" title="Method in DatabaseChangeLogBuilder">processGrailsChangeProperty(java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/plugins/databasemigration/liquibase/DatabaseChangeLogBuilder.html">DatabaseChangeLogBuilder</a>
@@ -36907,6 +36913,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/web/json/PathCapturingJSONWriterWrapper.html#push(Mode)" title="Method in PathCapturingJSONWriterWrapper">push(Mode)</a></span> - Method in <a href="org/grails/web/json/PathCapturingJSONWriterWrapper.html">PathCapturingJSONWriterWrapper</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagMethodContext.html#push(Map<?,?>, Closure<?>)" title="Method in TagMethodContext">push(Map&lt;?,?&gt;, Closure&lt;?&gt;)</a></span> - Method in <a href="org/grails/taglib/TagMethodContext.html">TagMethodContext</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/gsp/jsp/GroovyPagesPageContext.html#pushBody()" title="Method in GroovyPagesPageContext">pushBody()</a></span> - Method in <a href="org/grails/gsp/jsp/GroovyPagesPageContext.html">GroovyPagesPageContext</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/taglib/encoder/OutputEncodingStackAttributes.Builder.html#pushTop(boolean)" title="Method in OutputEncodingStackAttributes.Builder">pushTop(boolean)</a></span> - Method in <a href="org/grails/taglib/encoder/OutputEncodingStackAttributes.Builder.html">OutputEncodingStackAttributes.Builder</a>
@@ -37292,9 +37300,9 @@ if (location.href.indexOf('is-external=true') == -1) {
 
 <dt><span class="strong"><a href="org/grails/cli/compiler/autoconfigure/RabbitCompilerAutoConfiguration.html" title="Class in org.grails.cli.compiler.autoconfigure">RabbitCompilerAutoConfiguration</a></span> - Class in <a href="./org/grails/cli/compiler/autoconfigure/package-summary.html">org.grails.cli.compiler.autoconfigure</a>
 </dt><dd><div class="block">CompilerAutoConfiguration for Spring Rabbit.</div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#radio" title="Property in FormTagLib">radio</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#radio(java.util.Map)" title="Method in FormTagLib">radio(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">A helper tag for creating radio buttons.</div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#radioGroup" title="Property in FormTagLib">radioGroup</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#radioGroup(java.util.Map, groovy.lang.Closure)" title="Method in FormTagLib">radioGroup(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">A helper tag for creating radio button groups.</div></dd>
 <dt><span class="strong"><a href="grails/mongodb/geo/Circle.html#radius" title="Property in Circle">radius</a></span> - Property in <a href="grails/mongodb/geo/Circle.html">Circle</a>
 </dt><dd> <div class="block">The radius of the circle</div></dd>
@@ -37847,10 +37855,12 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/taglib/NamespacedTagDispatcher.html#registerTagMetaMethods(groovy.lang.ExpandoMetaClass)" title="Method in NamespacedTagDispatcher">registerTagMetaMethods(groovy.lang.ExpandoMetaClass)</a></span> - Method in <a href="org/grails/taglib/NamespacedTagDispatcher.html">NamespacedTagDispatcher</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/taglib/TagLibraryMetaUtils.html#registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)" title="Method in TagLibraryMetaUtils">registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)</a></span> - Method in <a href="org/grails/taglib/TagLibraryMetaUtils.html">TagLibraryMetaUtils</a>
+<dt><span class="strong"><a href="org/grails/taglib/TagLibraryMetaUtils.html#registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, boolean)" title="Method in TagLibraryMetaUtils">registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, boolean)</a></span> - Method in <a href="org/grails/taglib/TagLibraryMetaUtils.html">TagLibraryMetaUtils</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/taglib/TemplateNamespacedTagDispatcher.html#registerTagMetaMethods(groovy.lang.ExpandoMetaClass)" title="Method in TemplateNamespacedTagDispatcher">registerTagMetaMethods(groovy.lang.ExpandoMetaClass)</a></span> - Method in <a href="org/grails/taglib/TemplateNamespacedTagDispatcher.html">TemplateNamespacedTagDispatcher</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagLibraryMetaUtils.html#registerTagMethodContextMetaProperties(groovy.lang.MetaClass)" title="Method in TagLibraryMetaUtils">registerTagMethodContextMetaProperties(groovy.lang.MetaClass)</a></span> - Method in <a href="org/grails/taglib/TagLibraryMetaUtils.html">TagLibraryMetaUtils</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/taglib/TagLibraryLookup.html#registerTemplateNamespace()" title="Method in TagLibraryLookup">registerTemplateNamespace()</a></span> - Method in <a href="org/grails/taglib/TagLibraryLookup.html">TagLibraryLookup</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsGradlePlugin.html#registerToolingModelBuilder(org.gradle.api.Project, org.gradle.tooling.provider.model.ToolingModelBuilderRegistry)" title="Method in GrailsGradlePlugin">registerToolingModelBuilder(org.gradle.api.Project, org.gradle.tooling.provider.model.ToolingModelBuilderRegistry)</a></span> - Method in <a href="org/grails/gradle/plugin/core/GrailsGradlePlugin.html">GrailsGradlePlugin</a>
@@ -38258,10 +38268,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/plugin/json/view/api/internal/DefaultJsonApiViewHelper.html#renderMetaObject(java.io.Writer, java.lang.Object)" title="Method in DefaultJsonApiViewHelper">renderMetaObject(java.io.Writer, java.lang.Object)</a></span> - Method in <a href="grails/plugin/json/view/api/internal/DefaultJsonApiViewHelper.html">DefaultJsonApiViewHelper</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#renderNoSelectionOption" title="Property in FormTagLib">renderNoSelectionOption</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
-</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#renderNoSelectionOptionImpl(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)" title="Method in FormTagLib">renderNoSelectionOptionImpl(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
-</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/scaffolding/registry/output/DefaultOutputRenderer.html#renderOutput(org.grails.scaffolding.model.property.DomainProperty)" title="Method in DefaultOutputRenderer">renderOutput(org.grails.scaffolding.model.property.DomainProperty)</a></span> - Method in <a href="org/grails/scaffolding/registry/output/DefaultOutputRenderer.html">DefaultOutputRenderer</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/scaffolding/markup/DomainMarkupRenderer.html#renderOutput(org.grails.datastore.mapping.model.PersistentEntity)" title="Method in DomainMarkupRenderer">renderOutput(org.grails.datastore.mapping.model.PersistentEntity)</a></span> - Method in <a href="org/grails/scaffolding/markup/DomainMarkupRenderer.html">DomainMarkupRenderer</a>
@@ -38280,8 +38286,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/plugin/json/view/api/internal/DefaultJsonApiViewHelper.html#renderRelationshipLinks(java.lang.Object)" title="Method in DefaultJsonApiViewHelper">renderRelationshipLinks(java.lang.Object)</a></span> - Method in <a href="grails/plugin/json/view/api/internal/DefaultJsonApiViewHelper.html">DefaultJsonApiViewHelper</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#renderResourceLink(java.lang.Object)" title="Method in ApplicationTagLib">renderResourceLink(java.lang.Object)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
-</dt><dd> <div class="block"><DL><DT><B>attr:</B></DT><DD>uri</DD></DL><DL><DT><B>attr:</B></DT><DD>type</DD></DL> </div></dd>
 <dt><span class="strong"><a href="org/grails/cli/profile/steps/RenderStep.html" title="Class in org.grails.cli.profile.steps">RenderStep</a></span> - Class in <a href="./org/grails/cli/profile/steps/package-summary.html">org.grails.cli.profile.steps</a>
 </dt><dd><div class="block">A <a href='../../../../../org/grails/cli/profile/Step.html' title='Step'>Step</a> that renders a template</div></dd>
 <dt><span class="strong"><a href="org/grails/cli/profile/steps/RenderStep.html#RenderStep()" title="Constructor in RenderStep">RenderStep()</a></span> - Constructor in <a href="org/grails/cli/profile/steps/RenderStep.html">RenderStep</a>
@@ -38480,6 +38484,9 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/web/servlet/mvc/SynchronizerTokensHolder.html#resetToken(java.lang.String, java.lang.String)" title="Method in SynchronizerTokensHolder">resetToken(java.lang.String, java.lang.String)</a></span> - Method in <a href="org/grails/web/servlet/mvc/SynchronizerTokensHolder.html">SynchronizerTokensHolder</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/testing/web/UrlMappingsUnitTest.html#resetUrlMappingsForFeature()" title="Method in UrlMappingsUnitTest">resetUrlMappingsForFeature()</a></span> - Method in <a href="grails/testing/web/UrlMappingsUnitTest.html">UrlMappingsUnitTest</a>
+</dt><dd> <div class="block">Re-registers this spec's URL mappings and rebuilds the <CODE>grailsUrlMappingsHolder</CODE>
+ bean so each feature method starts with only this spec's mappings active. </div></dd>
 <dt><span class="strong"><a href="org/grails/buffer/GrailsPrintWriter.html#resetUsed()" title="Method in GrailsPrintWriter">resetUsed()</a></span> - Method in <a href="org/grails/buffer/GrailsPrintWriter.html">GrailsPrintWriter</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/buffer/GrailsPrintWriterAdapter.html#resetUsed()" title="Method in GrailsPrintWriterAdapter">resetUsed()</a></span> - Method in <a href="org/grails/buffer/GrailsPrintWriterAdapter.html">GrailsPrintWriterAdapter</a>
@@ -38518,8 +38525,6 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/cli/profile/commands/CreateAppCommand.html#resolveArtifactString(org.eclipse.aether.graph.Dependency)" title="Method in CreateAppCommand">resolveArtifactString(org.eclipse.aether.graph.Dependency)</a></span> - Method in <a href="org/grails/cli/profile/commands/CreateAppCommand.html">CreateAppCommand</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#resolveAttributes(java.util.Map)" title="Method in FormTagLib">resolveAttributes(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
-</dt><dd> <div class="block">Check required attributes, set the id to name if no id supplied, extract bean values etc.</div></dd>
 <dt><span class="strong"><a href="grails/views/ResolvableGroovyTemplateEngine.html#resolveCache" title="Field in ResolvableGroovyTemplateEngine">resolveCache</a></span> - Field in <a href="grails/views/ResolvableGroovyTemplateEngine.html">ResolvableGroovyTemplateEngine</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/plugins/databasemigration/command/DatabaseMigrationCommand.html#resolveChangeLogFile(java.lang.String)" title="Method in DatabaseMigrationCommand">resolveChangeLogFile(java.lang.String)</a></span> - Method in <a href="org/grails/plugins/databasemigration/command/DatabaseMigrationCommand.html">DatabaseMigrationCommand</a>
@@ -38833,7 +38838,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 <dt><span class="strong"><a href="org/grails/io/support/Resource.html" title="Interface in org.grails.io.support">Resource</a></span> - Interface in <a href="./org/grails/io/support/package-summary.html">org.grails.io.support</a>
 </dt><dd><div class="block">Interface for a resource descriptor that abstracts from the actual
  type of underlying resource, such as a file or class path resource.</div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#resource" title="Property in ApplicationTagLib">resource</a></span> - Property in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#resource(java.util.Map)" title="Method in ApplicationTagLib">resource(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
 </dt><dd> <div class="block">Creates a link to a resource, generally used as a method rather than a tag.</div></dd>
 <dt><span class="strong"><a href="grails/rest/render/errors/AbstractVndErrorRenderer.html#RESOURCE_ATTRIBUTE" title="Field in AbstractVndErrorRenderer">RESOURCE_ATTRIBUTE</a></span> - Field in <a href="grails/rest/render/errors/AbstractVndErrorRenderer.html">AbstractVndErrorRenderer</a>
 </dt><dd> <div class="block"></div></dd>
@@ -39679,7 +39684,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/gorm/DetachedCriteria.html#select(java.lang.String)" title="Method in DetachedCriteria">select(java.lang.String)</a></span> - Method in <a href="grails/gorm/DetachedCriteria.html">DetachedCriteria</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#select" title="Property in FormTagLib">select</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#select(java.util.Map)" title="Method in FormTagLib">select(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">A helper tag for creating HTML selects.</div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/query/Query.html#select(java.lang.String)" title="Method in Query">select(java.lang.String)</a></span> - Method in <a href="org/grails/datastore/mapping/query/Query.html">Query</a>
 </dt><dd> <div class="block">Specifies whether a select (lazy) query should be used (if join queries are supported by the underlying datastore)</div></dd>
@@ -39965,7 +39970,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/gorm/query/AbstractResultList.html#set(int, java.lang.Object)" title="Method in AbstractResultList">set(int, java.lang.Object)</a></span> - Method in <a href="org/grails/datastore/gorm/query/AbstractResultList.html">AbstractResultList</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#set" title="Property in ApplicationTagLib">set</a></span> - Property in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#set(java.util.Map, groovy.lang.Closure)" title="Method in ApplicationTagLib">set(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
 </dt><dd> <div class="block">Sets a variable in the pageContext or the specified scope.
  </div></dd>
 <dt><span class="strong"><a href="grails/web/http/HttpHeaders.html#SET_COOKIE2" title="Field in HttpHeaders">SET_COOKIE2</a></span> - Field in <a href="grails/web/http/HttpHeaders.html">HttpHeaders</a>
@@ -43051,7 +43056,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/PropertyConfig.html#sort" title="Property in PropertyConfig">sort</a></span> - Property in <a href="org/grails/orm/hibernate/cfg/PropertyConfig.html">PropertyConfig</a>
 </dt><dd> <div class="block">The default sort property name</div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html#sortableColumn" title="Property in UrlMappingTagLib">sortableColumn</a></span> - Property in <a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html">UrlMappingTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html#sortableColumn(java.util.Map)" title="Method in UrlMappingTagLib">sortableColumn(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/UrlMappingTagLib.html">UrlMappingTagLib</a>
 </dt><dd> <div class="block">Renders a sortable column to support sorting in list views.</div></dd>
 <dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/SortConfig.html" title="Class in org.grails.orm.hibernate.cfg">SortConfig</a></span> - Class in <a href="./org/grails/orm/hibernate/cfg/package-summary.html">org.grails.orm.hibernate.cfg</a>
 </dt><dd><div class="block">Configures sorting</div></dd>
@@ -43704,7 +43709,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/collection/PersistentList.html#subList(int, int)" title="Method in PersistentList">subList(int, int)</a></span> - Method in <a href="org/grails/datastore/mapping/collection/PersistentList.html">PersistentList</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#submitButton" title="Property in FormTagLib">submitButton</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#submitButton(java.util.Map)" title="Method in FormTagLib">submitButton(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">Creates a submit button.</div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/mapping/query/Query.SubqueryCriterion.html#SubqueryCriterion(java.lang.String, org.grails.datastore.mapping.query.api.QueryableCriteria)" title="Constructor in Query.SubqueryCriterion">SubqueryCriterion(java.lang.String, org.grails.datastore.mapping.query.api.QueryableCriteria)</a></span> - Constructor in <a href="org/grails/datastore/mapping/query/Query.SubqueryCriterion.html">Query.SubqueryCriterion</a>
 </dt><dd> <div class="block"></div></dd>
@@ -44161,6 +44166,8 @@ if (location.href.indexOf('is-external=true') == -1) {
  </div></dd>
 <dt><span class="strong"><a href="org/grails/web/json/parser/SimpleCharStream.html#tabSize" title="Field in SimpleCharStream">tabSize</a></span> - Field in <a href="org/grails/web/json/parser/SimpleCharStream.html">SimpleCharStream</a>
 </dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/gsp/Tag.html" title="Annotation Type in grails.gsp">Tag</a></span> - Annotation Type in <a href="./grails/gsp/package-summary.html">grails.gsp</a>
+</dt><dd><div class="block">Marks a public TagLib method as an invokable GSP tag.</div></dd>
 <dt><span class="strong"><a href="org/grails/core/gsp/DefaultGrailsTagLibClass.html#TAG_LIB" title="Field in DefaultGrailsTagLibClass">TAG_LIB</a></span> - Field in <a href="org/grails/core/gsp/DefaultGrailsTagLibClass.html">DefaultGrailsTagLibClass</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/gsp/compiler/tags/GroovyCollectTag.html#TAG_NAME" title="Field in GroovyCollectTag">TAG_NAME</a></span> - Field in <a href="org/grails/gsp/compiler/tags/GroovyCollectTag.html">GroovyCollectTag</a>
@@ -44250,6 +44257,10 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd><div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/gsp/jsp/WebXmlTagLibraryReader.html#tagLocations" title="Property in WebXmlTagLibraryReader">tagLocations</a></span> - Property in <a href="org/grails/gsp/jsp/WebXmlTagLibraryReader.html">WebXmlTagLibraryReader</a>
 </dt><dd> <div class="block">Contains a map of URI to tag library locations once the handler has read the web.xml file</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagMethodContext.html" title="Class in org.grails.taglib">TagMethodContext</a></span> - Class in <a href="./org/grails/taglib/package-summary.html">org.grails.taglib</a>
+</dt><dd><div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagMethodInvoker.html" title="Class in org.grails.taglib">TagMethodInvoker</a></span> - Class in <a href="./org/grails/taglib/package-summary.html">org.grails.taglib</a>
+</dt><dd><div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/testing/runtime/support/LazyTagLibraryLookup.html#tagNameKey(java.lang.String, java.lang.String)" title="Method in LazyTagLibraryLookup">tagNameKey(java.lang.String, java.lang.String)</a></span> - Method in <a href="org/grails/testing/runtime/support/LazyTagLibraryLookup.html">LazyTagLibraryLookup</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/taglib/TagLibraryLookup.html#tagNamespaces" title="Field in TagLibraryLookup">tagNamespaces</a></span> - Field in <a href="org/grails/taglib/TagLibraryLookup.html">TagLibraryLookup</a>
@@ -45043,13 +45054,13 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/web/mime/MimeType.html#TEXT_XML" title="Field in MimeType">TEXT_XML</a></span> - Field in <a href="grails/web/mime/MimeType.html">MimeType</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#textArea" title="Property in FormTagLib">textArea</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#textArea(java.util.Map, groovy.lang.Closure)" title="Method in FormTagLib">textArea(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">A general tag for creating textareas.</div></dd>
 <dt><span class="strong"><a href="org/grails/scaffolding/registry/input/TextareaInputRenderer.html" title="Class in org.grails.scaffolding.registry.input">TextareaInputRenderer</a></span> - Class in <a href="./org/grails/scaffolding/registry/input/package-summary.html">org.grails.scaffolding.registry.input</a>
 </dt><dd><div class="block">The default renderer for rendering properties with the constraint <CODE>[widget: "textarea"]</CODE></div></dd>
 <dt><span class="strong"><a href="org/grails/scaffolding/registry/input/TextareaInputRenderer.html#TextareaInputRenderer()" title="Constructor in TextareaInputRenderer">TextareaInputRenderer()</a></span> - Constructor in <a href="org/grails/scaffolding/registry/input/TextareaInputRenderer.html">TextareaInputRenderer</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#textField" title="Property in FormTagLib">textField</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#textField(java.util.Map)" title="Method in FormTagLib">textField(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">Creates a new text field.</div></dd>
 <dt><span class="strong"><a href="grails/doc/TextileLinkFilter.html" title="Class in grails.doc">TextileLinkFilter</a></span> - Class in <a href="./grails/doc/package-summary.html">grails.doc</a>
 </dt><dd><div class="block"></div></dd>
@@ -45137,7 +45148,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd><div class="block">The default renderer for rendering java.util.TimeZone properties</div></dd>
 <dt><span class="strong"><a href="org/grails/scaffolding/registry/input/TimeZoneInputRenderer.html#TimeZoneInputRenderer()" title="Constructor in TimeZoneInputRenderer">TimeZoneInputRenderer()</a></span> - Constructor in <a href="org/grails/scaffolding/registry/input/TimeZoneInputRenderer.html">TimeZoneInputRenderer</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#timeZoneSelect" title="Property in FormTagLib">timeZoneSelect</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#timeZoneSelect(java.util.Map)" title="Method in FormTagLib">timeZoneSelect(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">A helper tag for creating TimeZone selects.</div></dd>
 <dt><span class="strong"><a href="grails/rest/render/util/AbstractLinkingRenderer.html#TITLE_ATTRIBUTE" title="Field in AbstractLinkingRenderer">TITLE_ATTRIBUTE</a></span> - Field in <a href="grails/rest/render/util/AbstractLinkingRenderer.html">AbstractLinkingRenderer</a>
 </dt><dd> <div class="block"></div></dd>
@@ -46093,7 +46104,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/web/http/HttpHeaders.html#UPGRADE" title="Field in HttpHeaders">UPGRADE</a></span> - Field in <a href="grails/web/http/HttpHeaders.html">HttpHeaders</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#uploadForm" title="Property in FormTagLib">uploadForm</a></span> - Property in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/FormTagLib.html#uploadForm(java.util.Map, groovy.lang.Closure)" title="Method in FormTagLib">uploadForm(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/FormTagLib.html">FormTagLib</a>
 </dt><dd> <div class="block">Same as &lt;g:form&gt;, except sets the relevant enctype for a file upload form.</div></dd>
 <dt><span class="strong"><a href="grails/mongodb/geo/Box.html#upperRight" title="Property in Box">upperRight</a></span> - Property in <a href="grails/mongodb/geo/Box.html">Box</a>
 </dt><dd> <div class="block"></div></dd>
@@ -46206,6 +46217,14 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/web/mapping/UrlMapping.html" title="Interface in grails.web.mapping">UrlMapping</a></span> - Interface in <a href="./grails/web/mapping/package-summary.html">grails.web.mapping</a>
 </dt><dd><div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/testing/spock/UrlMappingCleanupInterceptor.html" title="Class in org.grails.testing.spock">UrlMappingCleanupInterceptor</a></span> - Class in <a href="./org/grails/testing/spock/package-summary.html">org.grails.testing.spock</a>
+</dt><dd><div class="block">Clears URL mapping artefacts and the cached holder bean after each feature method so that
+ other specs running later in the same JVM (including specs that don't implement
+ UrlMappingsUnitTest) start from a clean URL mappings registry.</div></dd>
+<dt><span class="strong"><a href="org/grails/testing/spock/UrlMappingCleanupInterceptor.html#UrlMappingCleanupInterceptor()" title="Constructor in UrlMappingCleanupInterceptor">UrlMappingCleanupInterceptor()</a></span> - Constructor in <a href="org/grails/testing/spock/UrlMappingCleanupInterceptor.html">UrlMappingCleanupInterceptor</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/testing/spock/WebTestingSupportExtension.html#urlMappingCleanupInterceptor" title="Property in WebTestingSupportExtension">urlMappingCleanupInterceptor</a></span> - Property in <a href="org/grails/testing/spock/WebTestingSupportExtension.html">WebTestingSupportExtension</a>
+</dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/web/mapping/UrlMappingData.html" title="Interface in grails.web.mapping">UrlMappingData</a></span> - Interface in <a href="./grails/web/mapping/package-summary.html">grails.web.mapping</a>
 </dt><dd><div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/web/mapping/UrlMappingEvaluator.html" title="Interface in grails.web.mapping">UrlMappingEvaluator</a></span> - Interface in <a href="./grails/web/mapping/package-summary.html">grails.web.mapping</a>
@@ -46251,7 +46270,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 <dt><span class="strong"><a href="org/grails/web/mapping/servlet/UrlMappingsErrorPageCustomizer.html#UrlMappingsErrorPageCustomizer()" title="Constructor in UrlMappingsErrorPageCustomizer">UrlMappingsErrorPageCustomizer()</a></span> - Constructor in <a href="org/grails/web/mapping/servlet/UrlMappingsErrorPageCustomizer.html">UrlMappingsErrorPageCustomizer</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html" title="Class in org.grails.testing.spock">UrlMappingSetupSpecInterceptor</a></span> - Class in <a href="./org/grails/testing/spock/package-summary.html">org.grails.testing.spock</a>
-</dt><dd><div class="block"></div></dd>
+</dt><dd><div class="block">Wires up controllers and URL mappings for UrlMappingsUnitTest-based specs.</div></dd>
 <dt><span class="strong"><a href="org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html#UrlMappingSetupSpecInterceptor()" title="Constructor in UrlMappingSetupSpecInterceptor">UrlMappingSetupSpecInterceptor()</a></span> - Constructor in <a href="org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html">UrlMappingSetupSpecInterceptor</a>
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="org/grails/testing/spock/WebTestingSupportExtension.html#urlMappingSetupSpecInterceptor" title="Property in WebTestingSupportExtension">urlMappingSetupSpecInterceptor</a></span> - Property in <a href="org/grails/testing/spock/WebTestingSupportExtension.html">WebTestingSupportExtension</a>
@@ -46512,7 +46531,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block">Validate the object for the given list of fields, parameters and adhoc constraints</div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/gorm/validation/jakarta/services/ValidatedService.html#validate(java.lang.Object, java.lang.reflect.Method, java.lang.Object)" title="Method in ValidatedService">validate(java.lang.Object, java.lang.reflect.Method, java.lang.Object)</a></span> - Method in <a href="org/grails/datastore/gorm/validation/jakarta/services/ValidatedService.html">ValidatedService</a>
 </dt><dd> <div class="block">Validate the given method for the given arguments</div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#validate" title="Property in ValidationTagLib">validate</a></span> - Property in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ValidationTagLib.html#validate(java.util.Map, groovy.lang.Closure)" title="Method in ValidationTagLib">validate(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ValidationTagLib.html">ValidationTagLib</a>
 </dt><dd> <div class="block">Validates a form using Apache commons validator javascript against constraints defined in a Grails
  domain class.</div></dd>
 <dt><span class="strong"><a href="grails/validation/Validateable.html" title="Trait in grails.validation">Validateable</a></span> - Trait in <a href="./grails/validation/package-summary.html">grails.validation</a>
@@ -47299,6 +47318,9 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block"></div></dd>
 <dt><span class="strong"><a href="grails/build/logging/ConsoleLogger.html#warn(java.lang.String)" title="Method in ConsoleLogger">warn(java.lang.String)</a></span> - Method in <a href="grails/build/logging/ConsoleLogger.html">ConsoleLogger</a>
 </dt><dd> <div class="block">Prints a warning message</div></dd>
+<dt><span class="strong"><a href="grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html#WARN_DEPRECATED_CLOSURES_PROPERTY" title="Field in TagLibArtefactTypeAstTransformation">WARN_DEPRECATED_CLOSURES_PROPERTY</a></span> - Field in <a href="grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html">TagLibArtefactTypeAstTransformation</a>
+</dt><dd> <div class="block">System property to silence the closure-based tag deprecation warning emitted at compile time.
+ </div></dd>
 <dt><span class="strong"><a href="grails/build/logging/GrailsConsole.html#warn(java.lang.String)" title="Method in GrailsConsole">warn(java.lang.String)</a></span> - Method in <a href="grails/build/logging/GrailsConsole.html">GrailsConsole</a>
 </dt><dd> <div class="block">Prints a warn message</div></dd>
 <dt><span class="strong"><a href="grails/util/GrailsUtil.html#warn(java.lang.String)" title="Method in GrailsUtil">warn(java.lang.String)</a></span> - Method in <a href="grails/util/GrailsUtil.html">GrailsUtil</a>
@@ -47825,7 +47847,7 @@ if (location.href.indexOf('is-external=true') == -1) {
 </dt><dd> <div class="block">Creates and binds a new session for the scope of the given closure</div></dd>
 <dt><span class="strong"><a href="org/grails/datastore/gorm/multitenancy/TenantDelegatingGormOperations.html#withStatelessSession(Closure<T>)" title="Method in TenantDelegatingGormOperations">withStatelessSession(Closure&lt;T&gt;)</a></span> - Method in <a href="org/grails/datastore/gorm/multitenancy/TenantDelegatingGormOperations.html">TenantDelegatingGormOperations</a>
 </dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#withTag" title="Property in ApplicationTagLib">withTag</a></span> - Property in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
+<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#withTag(java.util.Map, groovy.lang.Closure)" title="Method in ApplicationTagLib">withTag(java.util.Map, groovy.lang.Closure)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
 </dt><dd> <div class="block">Helper method for creating tags called like:<br/>
  <pre>
     withTag(name:'script',attrs:[type:'text/javascript']) {
diff --git a/docs/snapshot/api/org/grails/plugins/web/taglib/ApplicationTagLib.html b/docs/snapshot/api/org/grails/plugins/web/taglib/ApplicationTagLib.html
index 0b7fc86ca1f..847357d1e58 100644
--- a/docs/snapshot/api/org/grails/plugins/web/taglib/ApplicationTagLib.html
+++ b/docs/snapshot/api/org/grails/plugins/web/taglib/ApplicationTagLib.html
@@ -163,103 +163,60 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                         </tr>
                         
                         <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#applyCodec">applyCodec</a></code><br></td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#cookie">cookie</a></code><br>Obtains the value of a cookie.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#createLink">createLink</a></code><br>Creates a grails application link from a set of attributes. </td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#external">external</a></code><br>Render the appropriate kind of external link for use in <head> based on the type of the URI.
- </td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#flashMessages">flashMessages</a></code><br>Renders flash.message, flash.error, and flash.warning as Bootstrap alert divs.
- </td>
-                        </tr>
-                        
-                        <tr class="rowColor">
                             <td class="colFirst"><code><strong>boolean</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#flashMessagesDismissible">flashMessagesDismissible</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code><strong>java.lang.String</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#flashMessagesErrorClass">flashMessagesErrorClass</a></code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code><strong>java.lang.String</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#flashMessagesErrorIcon">flashMessagesErrorIcon</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code><strong>java.lang.String</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#flashMessagesMessageClass">flashMessagesMessageClass</a></code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code><strong>java.lang.String</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#flashMessagesMessageIcon">flashMessagesMessageIcon</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code><strong>java.lang.String</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#flashMessagesRole">flashMessagesRole</a></code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code><strong>java.lang.String</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#flashMessagesWarningClass">flashMessagesWarningClass</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code><strong>java.lang.String</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#flashMessagesWarningIcon">flashMessagesWarningIcon</a></code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code><strong><a href='../../../../../grails/core/GrailsApplication.html'>GrailsApplication</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#grailsApplication">grailsApplication</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code><strong><a href='../../../../../grails/web/mapping/UrlMappingsHolder.html'>UrlMappingsHolder</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#grailsUrlMappingsHolder">grailsUrlMappingsHolder</a></code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code><strong>boolean</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#hasResourceProcessor">hasResourceProcessor</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#header">header</a></code><br>Renders the specified request header value.</td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#img">img</a></code><br>Render an img tag with src set to a static resource<DL><DT><B>attr:</B></DT><DD>dir Optional name of resource directory, defaults to "images"</DD></DL><DL><DT><B>attr:</B></DT><DD>file Name of resource file (optional if uri specified)</DD></DL><DL><DT><B>attr:</B></DT><DD>plugin Optional the name of the grails plugin if the resource is not part of the application</DD></DL><DL><DT><B>attr:</B></DT><DD>u [...]
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#join">join</a></code><br>Uses the Groovy JDK join method to concatenate the toString() representation of each item
- in this collection with the given separator.</td>
-                        </tr>
-                        
                         <tr class="rowColor">
                             <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#link">link</a></code><br>General linking to controllers, actions etc. </td>
@@ -271,51 +228,25 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                         </tr>
                         
                         <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#meta">meta</a></code><br>Output application metadata that is loaded from application.yml and grails.build.info if it is present.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
                             <td class="colFirst"><code><strong><a href='../../../../../grails/plugins/GrailsPluginManager.html'>GrailsPluginManager</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#pluginManager">pluginManager</a></code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code><strong><a href='../../../../../org.springframework.web.servlet.support.RequestDataValueProcessor.html'>RequestDataValueProcessor</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#requestDataValueProcessor">requestDataValueProcessor</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#resource">resource</a></code><br>Creates a link to a resource, generally used as a method rather than a tag.</td>
-                        </tr>
-                        
                         <tr class="rowColor">
                             <td class="colFirst"><code><strong>static&nbsp;java.lang.Object</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#returnObjectForTags">returnObjectForTags</a></code><br></td>
                         </tr>
                         
                         <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#set">set</a></code><br>Sets a variable in the pageContext or the specified scope.
- </td>
-                        </tr>
-                        
-                        <tr class="rowColor">
                             <td class="colFirst"><code><strong>boolean</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#useJsessionId">useJsessionId</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#withTag">withTag</a></code><br>Helper method for creating tags called like:<br/>
- <pre>
-    withTag(name:'script',attrs:[type:'text/javascript']) {
-    ...
-    }
- </pre><DL><DT><B>attr:</B></DT><DD>name REQUIRED the tag name</DD></DL><DL><DT><B>attr:</B></DT><DD>attrs tag attributes</DD></DL> </td>
-                        </tr>
-                        
                     </table>
                    </ul>
                 </li>
@@ -371,15 +302,41 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                         </tr>
                         
                         <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#applyCodec(java.util.Map, groovy.lang.Closure)">applyCodec</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br></td>
+                        </tr>
+                        
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>static&nbsp;java.lang.String</code></td>
                             <td class="colLast"><code><strong><a href="#attrsToString(java.util.Map)">attrsToString</a></strong>(java.util.Map attrs)</code><br></td>
                         </tr>
                         
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#cookie(java.util.Map)">cookie</a></strong>(java.util.Map attrs)</code><br>Obtains the value of a cookie.</td>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#createLink(java.util.Map)">createLink</a></strong>(java.util.Map attrs)</code><br>Creates a grails application link from a set of attributes. </td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#external(java.util.Map)">external</a></strong>(java.util.Map attrs)</code><br>Render the appropriate kind of external link for use in <head> based on the type of the URI.
+ </td>
+                        </tr>
+                        
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>protected&nbsp;java.lang.String</code></td>
-                            <td class="colLast"><code><strong><a href="#doCreateLink(java.util.Map)">doCreateLink</a></strong>(java.util.Map attrs)</code><br></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#flashMessages(java.util.Map)">flashMessages</a></strong>(java.util.Map attrs)</code><br>Renders flash.message, flash.error, and flash.warning as Bootstrap alert divs.
+ </td>
                         </tr>
                         
                         <tr class="rowColor">
@@ -390,14 +347,51 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>java.lang.String</code></td>
-                            <td class="colLast"><code><strong><a href="#processedUrl(java.lang.String, java.lang.Object)">processedUrl</a></strong>(java.lang.String link, java.lang.Object request)</code><br>Filters the url through the RequestDataValueProcessor bean if it is registered.</td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#header(java.util.Map)">header</a></strong>(java.util.Map attrs)</code><br>Renders the specified request header value.</td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#img(java.util.Map)">img</a></strong>(java.util.Map attrs)</code><br>Render an img tag with src set to a static resource<DL><DT><B>attr:</B></DT><DD>dir Optional name of resource directory, defaults to "images"</DD></DL><DL><DT><B>attr:</B></DT><DD>file Name of resource file (optional if uri specified)</DD></DL><DL><DT><B>attr:</B></DT><DD>plugin Optional the name of the grails plugin if the resource is not part of th [...]
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#join(java.util.Map)">join</a></strong>(java.util.Map attrs)</code><br>Uses the Groovy JDK join method to concatenate the toString() representation of each item
+ in this collection with the given separator.</td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>protected&nbsp;java.lang.Object</code></td>
-                            <td class="colLast"><code><strong><a href="#renderResourceLink(java.lang.Object)">renderResourceLink</a></strong>(java.lang.Object attrs)</code><br><DL><DT><B>attr:</B></DT><DD>uri</DD></DL><DL><DT><B>attr:</B></DT><DD>type</DD></DL> </td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#meta(java.util.Map)">meta</a></strong>(java.util.Map attrs)</code><br>Output application metadata that is loaded from application.yml and grails.build.info if it is present.</td>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#resource(java.util.Map)">resource</a></strong>(java.util.Map attrs)</code><br>Creates a link to a resource, generally used as a method rather than a tag.</td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#set(java.util.Map, groovy.lang.Closure)">set</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>Sets a variable in the pageContext or the specified scope.
+ </td>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#withTag(java.util.Map, groovy.lang.Closure)">withTag</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>Helper method for creating tags called like:<br/>
+ <pre>
+    withTag(name:'script',attrs:[type:'text/javascript']) {
+    ...
+    }
+ </pre><DL><DT><B>attr:</B></DT><DD>name REQUIRED the tag name</DD></DL><DL><DT><B>attr:</B></DT><DD>attrs tag attributes</DD></DL> </td>
                         </tr>
                         
                     </table>
@@ -475,53 +469,6 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                             </li>
                         </ul>
                     
-                        <a name="applyCodec"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>applyCodec</strong></h4>
-                                <p></p>
-                            </li>
-                        </ul>
-                    
-                        <a name="cookie"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>cookie</strong></h4>
-                                <p> Obtains the value of a cookie.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the cookie name</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
-                        <a name="createLink"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>createLink</strong></h4>
-                                <p> Creates a grails application link from a set of attributes. This
- link can then be included in links, ajax calls etc. Generally used as a method call
- rather than a tag eg.<br/>
-
- &lt;a href="${createLink(action:'list')}"&gt;List&lt;/a&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr controller The name of the controller to use in the link, if not specified the current controller will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>action The name of the action to use in the link, if not specified the default action will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>uri relative URI</DD></DL><DL><DT><B>attr:</B></DT><DD>url A map containing the action, controller, id  [...]
-                            </li>
-                        </ul>
-                    
-                        <a name="external"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>external</strong></h4>
-                                <p> Render the appropriate kind of external link for use in <head> based on the type of the URI.
- For JS will render <script> tags, for CSS will render <link> with the correct rel, and so on for icons.<DL><DT><B>attr:</B></DT><DD>uri</DD></DL><DL><DT><B>attr:</B></DT><DD>dir</DD></DL><DL><DT><B>attr:</B></DT><DD>file</DD></DL><DL><DT><B>attr:</B></DT><DD>plugin</DD></DL><DL><DT><B>attr:</B></DT><DD>type</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
-                        <a name="flashMessages"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>flashMessages</strong></h4>
-                                <p> Renders flash.message, flash.error, and flash.warning as Bootstrap alert divs.
- Automatically skips rendering if already called during this request, preventing
- duplicate display when used in both pages and layouts.<DL><DT><B>emptyTag:</B></DT><DD>@attr messageClass CSS class for flash.message alerts (default: 'alert alert-success alert-dismissible fade show')</DD></DL><DL><DT><B>attr:</B></DT><DD>messageIcon Icon class for flash.message alerts (default: 'bi bi-check-circle me-2')</DD></DL><DL><DT><B>attr:</B></DT><DD>errorClass CSS class for flash.error alerts (default: 'alert alert-danger alert-dismissible fade show')</DD></DL><DL><DT><B>attr [...]
-                            </li>
-                        </ul>
-                    
                         <a name="flashMessagesDismissible"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -610,31 +557,6 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                             </li>
                         </ul>
                     
-                        <a name="header"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>header</strong></h4>
-                                <p> Renders the specified request header value.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the header name</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
-                        <a name="img"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>img</strong></h4>
-                                <p> Render an img tag with src set to a static resource<DL><DT><B>attr:</B></DT><DD>dir Optional name of resource directory, defaults to "images"</DD></DL><DL><DT><B>attr:</B></DT><DD>file Name of resource file (optional if uri specified)</DD></DL><DL><DT><B>attr:</B></DT><DD>plugin Optional the name of the grails plugin if the resource is not part of the application</DD></DL><DL><DT><B>attr:</B></DT><DD>uri Optional app-relative URI path of the resource i [...]
-                            </li>
-                        </ul>
-                    
-                        <a name="join"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>join</strong></h4>
-                                <p> Uses the Groovy JDK join method to concatenate the toString() representation of each item
- in this collection with the given separator.<DL><DT><B>emptyTag:</B></DT><DD>@attr REQUIRED in The collection to iterate over</DD></DL><DL><DT><B>attr:</B></DT><DD>delimiter The value of the delimiter to use during the join. If no delimiter is specified then ", " (a comma followed by a space) will be used as the delimiter.</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
                         <a name="link"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -654,14 +576,6 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                             </li>
                         </ul>
                     
-                        <a name="meta"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>meta</strong></h4>
-                                <p> Output application metadata that is loaded from application.yml and grails.build.info if it is present.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the metadata key</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
                         <a name="pluginManager"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -678,16 +592,6 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                             </li>
                         </ul>
                     
-                        <a name="resource"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>resource</strong></h4>
-                                <p> Creates a link to a resource, generally used as a method rather than a tag.<br/>
-
- eg. &lt;link type="text/css" href="${resource(dir:'css',file:'main.css')}" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr base Sets the prefix to be added to the link target address, typically an absolute server URL. This overrides the behaviour of the absolute property, if both are specified.x≈</DD></DL><DL><DT><B>attr:</B></DT><DD>contextPath the context path to use (relative to the application context path). Defaults to "" or path to the plugin for a plugin view or template.</DD></DL><D [...]
-                            </li>
-                        </ul>
-                    
                         <a name="returnObjectForTags"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -696,15 +600,6 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                             </li>
                         </ul>
                     
-                        <a name="set"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>set</strong></h4>
-                                <p> Sets a variable in the pageContext or the specified scope.
- The value can be specified directly or can be a bean retrieved from the applicationContext.<DL><DT><B>attr:</B></DT><DD>var REQUIRED the variable name</DD></DL><DL><DT><B>attr:</B></DT><DD>value the variable value; if not specified uses the rendered body</DD></DL><DL><DT><B>attr:</B></DT><DD>bean the name or the type of a bean in the applicationContext; the type can be an interface or superclass</DD></DL><DL><DT><B>attr:</B></DT><DD>scope the scope name; defaults to pageScope</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
                         <a name="useJsessionId"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -713,19 +608,6 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                             </li>
                         </ul>
                     
-                        <a name="withTag"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>withTag</strong></h4>
-                                <p> Helper method for creating tags called like:<br/>
- <pre>
-    withTag(name:'script',attrs:[type:'text/javascript']) {
-    ...
-    }
- </pre><DL><DT><B>attr:</B></DT><DD>name REQUIRED the tag name</DD></DL><DL><DT><B>attr:</B></DT><DD>attrs tag attributes</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
                 </li>
             </ul>
             
@@ -769,6 +651,14 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                             </li>
                         </ul>
                     
+                        <a name="applyCodec(java.util.Map, groovy.lang.Closure)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>applyCodec</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p></p>
+                            </li>
+                        </ul>
+                    
                         <a name="attrsToString(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -777,11 +667,42 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                             </li>
                         </ul>
                     
-                        <a name="doCreateLink(java.util.Map)"><!-- --></a>
+                        <a name="cookie(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>@groovy.transform.CompileStatic<br>protected&nbsp;java.lang.String <strong>doCreateLink</strong>(java.util.Map attrs)</h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>cookie</strong>(java.util.Map attrs)</h4>
+                                <p> Obtains the value of a cookie.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the cookie name</DD></DL> </p>
+                            </li>
+                        </ul>
+                    
+                        <a name="createLink(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>createLink</strong>(java.util.Map attrs)</h4>
+                                <p> Creates a grails application link from a set of attributes. This
+ link can then be included in links, ajax calls etc. Generally used as a method call
+ rather than a tag eg.<br/>
+
+ &lt;a href="${createLink(action:'list')}"&gt;List&lt;/a&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr controller The name of the controller to use in the link, if not specified the current controller will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>action The name of the action to use in the link, if not specified the default action will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>uri relative URI</DD></DL><DL><DT><B>attr:</B></DT><DD>url A map containing the action, controller, id  [...]
+                            </li>
+                        </ul>
+                    
+                        <a name="external(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>external</strong>(java.util.Map attrs)</h4>
+                                <p> Render the appropriate kind of external link for use in <head> based on the type of the URI.
+ For JS will render <script> tags, for CSS will render <link> with the correct rel, and so on for icons.<DL><DT><B>attr:</B></DT><DD>uri</DD></DL><DL><DT><B>attr:</B></DT><DD>dir</DD></DL><DL><DT><B>attr:</B></DT><DD>file</DD></DL><DL><DT><B>attr:</B></DT><DD>plugin</DD></DL><DL><DT><B>attr:</B></DT><DD>type</DD></DL> </p>
+                            </li>
+                        </ul>
+                    
+                        <a name="flashMessages(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>flashMessages</strong>(java.util.Map attrs)</h4>
+                                <p> Renders flash.message, flash.error, and flash.warning as Bootstrap alert divs.
+ Automatically skips rendering if already called during this request, preventing
+ duplicate display when used in both pages and layouts.<DL><DT><B>emptyTag:</B></DT><DD>@attr messageClass CSS class for flash.message alerts (default: 'alert alert-success alert-dismissible fade show')</DD></DL><DL><DT><B>attr:</B></DT><DD>messageIcon Icon class for flash.message alerts (default: 'bi bi-check-circle me-2')</DD></DL><DL><DT><B>attr:</B></DT><DD>errorClass CSS class for flash.error alerts (default: 'alert alert-danger alert-dismissible fade show')</DD></DL><DL><DT><B>attr [...]
                             </li>
                         </ul>
                     
@@ -793,19 +714,68 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                             </li>
                         </ul>
                     
-                        <a name="processedUrl(java.lang.String, java.lang.Object)"><!-- --></a>
+                        <a name="header(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>java.lang.String <strong>processedUrl</strong>(java.lang.String link, java.lang.Object request)</h4>
-                                <p> Filters the url through the RequestDataValueProcessor bean if it is registered.</p>
+                                <h4>java.lang.Object <strong>header</strong>(java.util.Map attrs)</h4>
+                                <p> Renders the specified request header value.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the header name</DD></DL> </p>
                             </li>
                         </ul>
                     
-                        <a name="renderResourceLink(java.lang.Object)"><!-- --></a>
+                        <a name="img(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>protected&nbsp;java.lang.Object <strong>renderResourceLink</strong>(java.lang.Object attrs)</h4>
-                                <p><DL><DT><B>attr:</B></DT><DD>uri</DD></DL><DL><DT><B>attr:</B></DT><DD>type</DD></DL> </p>
+                                <h4>java.lang.Object <strong>img</strong>(java.util.Map attrs)</h4>
+                                <p> Render an img tag with src set to a static resource<DL><DT><B>attr:</B></DT><DD>dir Optional name of resource directory, defaults to "images"</DD></DL><DL><DT><B>attr:</B></DT><DD>file Name of resource file (optional if uri specified)</DD></DL><DL><DT><B>attr:</B></DT><DD>plugin Optional the name of the grails plugin if the resource is not part of the application</DD></DL><DL><DT><B>attr:</B></DT><DD>uri Optional app-relative URI path of the resource i [...]
+                            </li>
+                        </ul>
+                    
+                        <a name="join(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>join</strong>(java.util.Map attrs)</h4>
+                                <p> Uses the Groovy JDK join method to concatenate the toString() representation of each item
+ in this collection with the given separator.<DL><DT><B>emptyTag:</B></DT><DD>@attr REQUIRED in The collection to iterate over</DD></DL><DL><DT><B>attr:</B></DT><DD>delimiter The value of the delimiter to use during the join. If no delimiter is specified then ", " (a comma followed by a space) will be used as the delimiter.</DD></DL> </p>
+                            </li>
+                        </ul>
+                    
+                        <a name="meta(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>meta</strong>(java.util.Map attrs)</h4>
+                                <p> Output application metadata that is loaded from application.yml and grails.build.info if it is present.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the metadata key</DD></DL> </p>
+                            </li>
+                        </ul>
+                    
+                        <a name="resource(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>resource</strong>(java.util.Map attrs)</h4>
+                                <p> Creates a link to a resource, generally used as a method rather than a tag.<br/>
+
+ eg. &lt;link type="text/css" href="${resource(dir:'css',file:'main.css')}" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr base Sets the prefix to be added to the link target address, typically an absolute server URL. This overrides the behaviour of the absolute property, if both are specified.x≈</DD></DL><DL><DT><B>attr:</B></DT><DD>contextPath the context path to use (relative to the application context path). Defaults to "" or path to the plugin for a plugin view or template.</DD></DL><D [...]
+                            </li>
+                        </ul>
+                    
+                        <a name="set(java.util.Map, groovy.lang.Closure)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>set</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> Sets a variable in the pageContext or the specified scope.
+ The value can be specified directly or can be a bean retrieved from the applicationContext.<DL><DT><B>attr:</B></DT><DD>var REQUIRED the variable name</DD></DL><DL><DT><B>attr:</B></DT><DD>value the variable value; if not specified uses the rendered body</DD></DL><DL><DT><B>attr:</B></DT><DD>bean the name or the type of a bean in the applicationContext; the type can be an interface or superclass</DD></DL><DL><DT><B>attr:</B></DT><DD>scope the scope name; defaults to pageScope</DD></DL> </p>
+                            </li>
+                        </ul>
+                    
+                        <a name="withTag(java.util.Map, groovy.lang.Closure)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>withTag</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> Helper method for creating tags called like:<br/>
+ <pre>
+    withTag(name:'script',attrs:[type:'text/javascript']) {
+    ...
+    }
+ </pre><DL><DT><B>attr:</B></DT><DD>name REQUIRED the tag name</DD></DL><DL><DT><B>attr:</B></DT><DD>attrs tag attributes</DD></DL> </p>
                             </li>
                         </ul>
                     
diff --git a/docs/snapshot/api/org/grails/plugins/web/taglib/CountryTagLib.html b/docs/snapshot/api/org/grails/plugins/web/taglib/CountryTagLib.html
index 2a6f4f5b170..e5989e517a6 100644
--- a/docs/snapshot/api/org/grails/plugins/web/taglib/CountryTagLib.html
+++ b/docs/snapshot/api/org/grails/plugins/web/taglib/CountryTagLib.html
@@ -70,11 +70,11 @@ if (location.href.indexOf('is-external=true') == -1) {
     <div>
         <ul class="subNavList">
             <li>Summary:&nbsp;</li>
-            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;<li><a href="#property_summary">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_summary">Constructor</a></li>&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;
+            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;<li><a href="#property_summary">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_summary">Constructor</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
         <ul class="subNavList">
             <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
-            Field&nbsp;&nbsp;&nbsp;<li><a href="#prop_detail">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_detail">Constructor</a></li>&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;
+            Field&nbsp;&nbsp;&nbsp;<li><a href="#prop_detail">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_detail">Constructor</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
     </div>
     <a name="skip-navbar_top">
@@ -156,16 +156,6 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                             <td class="colLast"><code><a href="#ISO3166_3">ISO3166_3</a></code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#country">country</a></code><br>Take a country code and output the country name, from the internal data.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#countrySelect">countrySelect</a></code><br>Display a country selection combo box.</td>
-                        </tr>
-                        
                     </table>
                    </ul>
                 </li>
@@ -203,6 +193,33 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
         <!-- ========== METHOD SUMMARY =========== -->
         <ul class="blockList">
             
+            <li class="blockList"><a name="method_summary"><!--   --></a>
+                    <h3>Methods Summary</h3>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Methods Summary table">
+                        <caption><span>Methods</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Type Params</th>
+                            <th class="colLast" scope="col">Return Type</th>
+                            <th class="colLast" scope="col">Name and description</th>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#country(java.util.Map)">country</a></strong>(java.util.Map attrs)</code><br>Take a country code and output the country name, from the internal data.</td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#countrySelect(java.util.Map)">countrySelect</a></strong>(java.util.Map attrs)</code><br>Display a country selection combo box.</td>
+                        </tr>
+                        
+                    </table>
+                   </ul>
+              </li>
+            
             <li class="blockList"><a name="method_summary"><!--   --></a>
                     <h3>Inherited Methods Summary</h3>
                     <ul class="blockList">
@@ -266,23 +283,6 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                             </li>
                         </ul>
                     
-                        <a name="country"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>country</strong></h4>
-                                <p> Take a country code and output the country name, from the internal data.<br/>
- Note: to use message bundle to resolve name, use g:message tag<DL><DT><B>emptyTag:</B></DT><DD>@attr code REQUIRED the ISO3166_3 country code</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
-                        <a name="countrySelect"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>countrySelect</strong></h4>
-                                <p> Display a country selection combo box.<DL><DT><B>emptyTag:</B></DT><DD>@attr from list of country codes or none for full list. Order is honoured</DD></DL><DL><DT><B>attr:</B></DT><DD>valueMessagePrefix code prefix to use, if you want names of countries to come from message bundle</DD></DL><DL><DT><B>attr:</B></DT><DD>value currently selected country code - ISO3166_3 (3 character, lowercase) form</DD></DL><DL><DT><B>attr:</B></DT><DD>default currently s [...]
-                            </li>
-                        </ul>
-                    
                 </li>
             </ul>
             
@@ -311,6 +311,33 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
 
 
             
+            <!-- =========== METHOD DETAIL =========== -->
+            <ul class="blockList">
+                <li class="blockList"><a name="method_detail">
+                    <!--   -->
+                </a>
+                    <h3>Method Detail</h3>
+                    
+                        <a name="country(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>country</strong>(java.util.Map attrs)</h4>
+                                <p> Take a country code and output the country name, from the internal data.<br/>
+ Note: to use message bundle to resolve name, use g:message tag<DL><DT><B>emptyTag:</B></DT><DD>@attr code REQUIRED the ISO3166_3 country code</DD></DL> </p>
+                            </li>
+                        </ul>
+                    
+                        <a name="countrySelect(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>countrySelect</strong>(java.util.Map attrs)</h4>
+                                <p> Display a country selection combo box.<DL><DT><B>emptyTag:</B></DT><DD>@attr from list of country codes or none for full list. Order is honoured</DD></DL><DL><DT><B>attr:</B></DT><DD>valueMessagePrefix code prefix to use, if you want names of countries to come from message bundle</DD></DL><DL><DT><B>attr:</B></DT><DD>value currently selected country code - ISO3166_3 (3 character, lowercase) form</DD></DL><DL><DT><B>attr:</B></DT><DD>default currently s [...]
+                            </li>
+                        </ul>
+                    
+                </li>
+            </ul>
+            
         </li>
     </ul>
 </div>
@@ -342,11 +369,11 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
     <div>
         <ul class="subNavList">
             <li>Summary:&nbsp;</li>
-            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;<li><a href="#property_summary">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_summary">Constructor</a></li>&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;
+            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;<li><a href="#property_summary">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_summary">Constructor</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
         <ul class="subNavList">
             <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
-            Field&nbsp;&nbsp;&nbsp;<li><a href="#prop_detail">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_detail">Constructor</a></li>&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;
+            Field&nbsp;&nbsp;&nbsp;<li><a href="#prop_detail">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_detail">Constructor</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
     </div>
     <p><!-- Matomo -->
diff --git a/docs/snapshot/api/org/grails/plugins/web/taglib/FormTagLib.html b/docs/snapshot/api/org/grails/plugins/web/taglib/FormTagLib.html
index 97654e54b02..bef1297ee0f 100644
--- a/docs/snapshot/api/org/grails/plugins/web/taglib/FormTagLib.html
+++ b/docs/snapshot/api/org/grails/plugins/web/taglib/FormTagLib.html
@@ -143,21 +143,10 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                         </tr>
                         
                         <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#actionSubmitImage">actionSubmitImage</a></code><br>Creates a an image submit button that submits to an action in the controller specified by the form action.
- </td>
-                        </tr>
-                        
-                        <tr class="rowColor">
                             <td class="colFirst"><code><strong><a href='../../../../../org.springframework.context.ApplicationContext.html'>ApplicationContext</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#applicationContext">applicationContext</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#checkBox">checkBox</a></code><br>A helper tag for creating checkboxes.</td>
-                        </tr>
-                        
                         <tr class="rowColor">
                             <td class="colFirst"><code><strong><a href='../../../../../org/grails/encoder/CodecLookup.html'>CodecLookup</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#codecLookup">codecLookup</a></code><br></td>
@@ -169,106 +158,20 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                         </tr>
                         
                         <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#currencySelect">currencySelect</a></code><br>A helper tag for creating currency selects.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#datePicker">datePicker</a></code><br>A simple date picker that renders a date as selects.</td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#field">field</a></code><br>A general tag for creating fields.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#form">form</a></code><br>General linking to controllers, actions etc. </td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>java.lang.Object</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#formActionSubmit">formActionSubmit</a></code><br>Creates a submit button using the `formaction` attribute to submit to a different action than the form.
- </td>
-                        </tr>
-                        
-                        <tr class="altColor">
                             <td class="colFirst"><code><strong><a href='../../../../../org/grails/plugins/web/GrailsTagDateHelper.html'>GrailsTagDateHelper</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#grailsTagDateHelper">grailsTagDateHelper</a></code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#hiddenField">hiddenField</a></code><br>Creates a hidden field.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#localeSelect">localeSelect</a></code><br>A helper tag for creating locale selects.</td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#passwordField">passwordField</a></code><br>Creates a new password field.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#radio">radio</a></code><br>A helper tag for creating radio buttons.</td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#radioGroup">radioGroup</a></code><br>A helper tag for creating radio button groups.</td>
-                        </tr>
-                        
                         <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#renderNoSelectionOption">renderNoSelectionOption</a></code><br></td>
-                        </tr>
-                        
-                        <tr class="rowColor">
                             <td class="colFirst"><code><strong><a href='../../../../../org.springframework.web.servlet.support.RequestDataValueProcessor.html'>RequestDataValueProcessor</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#requestDataValueProcessor">requestDataValueProcessor</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#select">select</a></code><br>A helper tag for creating HTML selects.</td>
-                        </tr>
-                        
                         <tr class="rowColor">
                             <td class="colFirst"><code><strong>java.lang.Class&lt;?&gt;</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#springSecurityCsrfTokenClass">springSecurityCsrfTokenClass</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#submitButton">submitButton</a></code><br>Creates a submit button.</td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#textArea">textArea</a></code><br>A general tag for creating textareas.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#textField">textField</a></code><br>Creates a new text field.</td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#timeZoneSelect">timeZoneSelect</a></code><br>A helper tag for creating TimeZone selects.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#uploadForm">uploadForm</a></code><br>Same as &lt;g:form&gt;, except sets the relevant enctype for a file upload form.</td>
-                        </tr>
-                        
                     </table>
                    </ul>
                 </li>
@@ -318,51 +221,89 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                         </tr>
                         
                         <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#actionSubmitImage(java.util.Map)">actionSubmitImage</a></strong>(java.util.Map attrs)</code><br>Creates a an image submit button that submits to an action in the controller specified by the form action.
+ </td>
+                        </tr>
+                        
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>void</code></td>
                             <td class="colLast"><code><strong><a href="#afterPropertiesSet()">afterPropertiesSet</a></strong>()</code><br></td>
                         </tr>
                         
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#checkBox(java.util.Map)">checkBox</a></strong>(java.util.Map attrs)</code><br>A helper tag for creating checkboxes.</td>
+                        </tr>
+                        
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>void</code></td>
-                            <td class="colLast"><code><strong><a href="#configureCsrf()">configureCsrf</a></strong>()</code><br></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#currencySelect(java.util.Map, groovy.lang.Closure)">currencySelect</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>A helper tag for creating currency selects.</td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.lang.Object</code></td>
-                            <td class="colLast"><code><strong><a href="#fieldImpl(org.grails.buffer.GrailsPrintWriter, java.util.Map)">fieldImpl</a></strong>(<a href='../../../../../org/grails/buffer/GrailsPrintWriter.html'>GrailsPrintWriter</a> out, java.util.Map attrs)</code><br></td>
+                            <td class="colLast"><code><strong><a href="#datePicker(java.util.Map)">datePicker</a></strong>(java.util.Map attrs)</code><br>A simple date picker that renders a date as selects.</td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.lang.Object</code></td>
-                            <td class="colLast"><code><strong><a href="#hiddenFieldImpl(java.lang.Object, java.lang.Object)">hiddenFieldImpl</a></strong>(java.lang.Object out, java.lang.Object attrs)</code><br></td>
+                            <td class="colLast"><code><strong><a href="#field(java.util.Map)">field</a></strong>(java.util.Map attrs)</code><br>A general tag for creating fields.</td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>void</code></td>
-                            <td class="colLast"><code><strong><a href="#outputAttributes(java.util.Map, org.grails.buffer.GrailsPrintWriter, boolean)">outputAttributes</a></strong>(java.util.Map attrs, <a href='../../../../../org/grails/buffer/GrailsPrintWriter.html'>GrailsPrintWriter</a> writer, boolean useNameAsIdIfIdDoesNotExist)</code><br>Dump out attributes in HTML compliant fashion.</td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#form(java.util.Map, groovy.lang.Closure)">form</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>General linking to controllers, actions etc. </td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>java.lang.String</code></td>
-                            <td class="colLast"><code><strong><a href="#processedUrl(java.lang.String, java.lang.Object)">processedUrl</a></strong>(java.lang.String link, java.lang.Object request)</code><br>Filters the url through the RequestDataValueProcessor bean if it is registered.</td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#formActionSubmit(java.util.Map)">formActionSubmit</a></strong>(java.util.Map attrs)</code><br>Creates a submit button using the `formaction` attribute to submit to a different action than the form.
+ </td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.lang.Object</code></td>
-                            <td class="colLast"><code><strong><a href="#renderNoSelectionOptionImpl(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)">renderNoSelectionOptionImpl</a></strong>(java.lang.Object out, java.lang.Object noSelectionKey, java.lang.Object noSelectionValue, java.lang.Object value)</code><br></td>
+                            <td class="colLast"><code><strong><a href="#hiddenField(java.util.Map)">hiddenField</a></strong>(java.util.Map attrs)</code><br>Creates a hidden field.</td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>void</code></td>
-                            <td class="colLast"><code><strong><a href="#resolveAttributes(java.util.Map)">resolveAttributes</a></strong>(java.util.Map attrs)</code><br>Check required attributes, set the id to name if no id supplied, extract bean values etc.</td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#localeSelect(java.util.Map)">localeSelect</a></strong>(java.util.Map attrs)</code><br>A helper tag for creating locale selects.</td>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#passwordField(java.util.Map)">passwordField</a></strong>(java.util.Map attrs)</code><br>Creates a new password field.</td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#radio(java.util.Map)">radio</a></strong>(java.util.Map attrs)</code><br>A helper tag for creating radio buttons.</td>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#radioGroup(java.util.Map, groovy.lang.Closure)">radioGroup</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>A helper tag for creating radio button groups.</td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#select(java.util.Map)">select</a></strong>(java.util.Map attrs)</code><br>A helper tag for creating HTML selects.</td>
                         </tr>
                         
                         <tr class="altColor">
@@ -371,6 +312,36 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                             <td class="colLast"><code><strong><a href="#setConfiguration(grails.config.Config)">setConfiguration</a></strong>(<a href='../../../../../grails/config/Config.html'>Config</a> co)</code><br></td>
                         </tr>
                         
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#submitButton(java.util.Map)">submitButton</a></strong>(java.util.Map attrs)</code><br>Creates a submit button.</td>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#textArea(java.util.Map, groovy.lang.Closure)">textArea</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>A general tag for creating textareas.</td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#textField(java.util.Map)">textField</a></strong>(java.util.Map attrs)</code><br>Creates a new text field.</td>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#timeZoneSelect(java.util.Map)">timeZoneSelect</a></strong>(java.util.Map attrs)</code><br>A helper tag for creating TimeZone selects.</td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#uploadForm(java.util.Map, groovy.lang.Closure)">uploadForm</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>Same as &lt;g:form&gt;, except sets the relevant enctype for a file upload form.</td>
+                        </tr>
+                        
                     </table>
                    </ul>
               </li>
@@ -414,19 +385,6 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                 </a>
                     <h3>Property Detail</h3>
                     
-                        <a name="actionSubmitImage"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>actionSubmitImage</strong></h4>
-                                <p> Creates a an image submit button that submits to an action in the controller specified by the form action.
- The name of the action attribute is translated into the action name, for example "Edit" becomes
- "_action_edit" or "List People" becomes "_action_listPeople".<br/>
- If the action attribute is not specified, the value attribute will be used as part of the action name.<br/>
-
- &lt;g:actionSubmitImage src="/images/submitButton.gif" action="Edit" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr value REQUIRED The title of the button and name of action when not explicitly defined.</DD></DL><DL><DT><B>attr:</B></DT><DD>action The name of the action to be executed, otherwise it is derived from the value.</DD></DL><DL><DT><B>attr:</B></DT><DD>src The source of the image to use</DD></DL><DL><DT><B>attr:</B></DT><DD>disabled Makes the button to be disabled. Will be interp [...]
-                            </li>
-                        </ul>
-                    
                         <a name="applicationContext"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -435,14 +393,6 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                             </li>
                         </ul>
                     
-                        <a name="checkBox"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>checkBox</strong></h4>
-                                <p> A helper tag for creating checkboxes.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the name of the checkbox</DD></DL><DL><DT><B>attr:</B></DT><DD>value  the value of the checkbox</DD></DL><DL><DT><B>attr:</B></DT><DD>checked if evaluates to true sets to checkbox to checked</DD></DL><DL><DT><B>attr:</B></DT><DD>disabled if evaluates to true sets to checkbox to disabled</DD></DL><DL><DT><B>attr:</B></DT><DD>readonly if evaluates to true, sets to c [...]
-                            </li>
-                        </ul>
-                    
                         <a name="codecLookup"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -459,289 +409,246 @@ implements <a href='../../../../../org.springframework.context.ApplicationContex
                             </li>
                         </ul>
                     
-                        <a name="currencySelect"><!-- --></a>
+                        <a name="grailsTagDateHelper"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>currencySelect</strong></h4>
-                                <p> A helper tag for creating currency selects.<br/>
-
- eg. &lt;g:currencySelect name="myCurrency" value="${currency}" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr from The currency symbols to select from, defaults to the major ones if not specified</DD></DL><DL><DT><B>attr:</B></DT><DD>value The currency value as the currency code. Defaults to the currency for the current Locale if not specified</DD></DL> </p>
+                                <h4><a href='../../../../../org/grails/plugins/web/GrailsTagDateHelper.html'>GrailsTagDateHelper</a> <strong>grailsTagDateHelper</strong></h4>
+                                <p></p>
                             </li>
                         </ul>
                     
-                        <a name="datePicker"><!-- --></a>
+                        <a name="requestDataValueProcessor"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>datePicker</strong></h4>
-                                <p> A simple date picker that renders a date as selects.<br/>
- e.g. &lt;g:datePicker name="myDate" value="${new Date()}" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED The name of the date picker field set</DD></DL><DL><DT><B>attr:</B></DT><DD>value The current value of the date picker; defaults to either the value specified by the default attribute or now if no default is set</DD></DL><DL><DT><B>attr:</B></DT><DD>default A Date or parsable date string that will be used if there is no value</DD></DL><DL><DT><B>attr:</B></DT><DD>precision [...]
+                                <h4><a href='../../../../../org.springframework.web.servlet.support.RequestDataValueProcessor.html'>RequestDataValueProcessor</a> <strong>requestDataValueProcessor</strong></h4>
+                                <p></p>
                             </li>
                         </ul>
                     
-                        <a name="field"><!-- --></a>
+                        <a name="springSecurityCsrfTokenClass"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>field</strong></h4>
-                                <p> A general tag for creating fields.<DL><DT><B>attr:</B></DT><DD>type REQUIRED the input type</DD></DL> </p>
+                                <h4>java.lang.Class&lt;?&gt; <strong>springSecurityCsrfTokenClass</strong></h4>
+                                <p></p>
                             </li>
                         </ul>
                     
-                        <a name="form"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>form</strong></h4>
-                                <p> General linking to controllers, actions etc. Examples:<br/>
+                </li>
+            </ul>
+            
 
- &lt;g:form action="myaction"&gt;...&lt;/g:form&gt;<br/>
- &lt;g:form controller="myctrl" action="myaction"&gt;...&lt;/g:form&gt;<br/><DL><DT><B>attr:</B></DT><DD>action the name of the action to use in the link, if not specified the default action will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>controller the name of the controller to use in the link, if not specified the current controller will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>id The id to use in the link</DD></DL><DL><DT><B>attr:</B></DT><DD>url A map containing the actio [...]
-                            </li>
-                        </ul>
-                    
-                        <a name="formActionSubmit"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>java.lang.Object <strong>formActionSubmit</strong></h4>
-                                <p> Creates a submit button using the `formaction` attribute to submit to a different action than the form.
- The target URL is generated from the supported link attributes.<br/>
- The rendered `&lt;input&gt;` uses this tag's `id` attribute for its DOM id. If the generated URL needs an
- `id`, provide it through the `url` map.<br/>
+            
 
- &lt;g:formActionSubmit action="myaction" value="Submit"/&gt;<br/>
- &lt;g:formActionSubmit controller="myctrl" action="myaction" value="ButtonName"/&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr value REQUIRED The label shown on the submit button</DD></DL><DL><DT><B>attr:</B></DT><DD>id DOM id for the rendered input element</DD></DL><DL><DT><B>attr:</B></DT><DD>disabled Makes the button disabled. Will be interpreted as a Groovy Truth</DD></DL><DL><DT><B>attr:</B></DT><DD>action The name of the action to use in the generated link, if not specified the d [...]
-                            </li>
-                        </ul>
+            
+            <!-- =========== CONSTRUCTOR DETAIL =========== -->
+            <ul class="blockList">
+                <li class="blockList"><a name="constructor_detail">
+                    <!--   -->
+                </a>
+                    <h3>Constructor Detail</h3>
                     
-                        <a name="grailsTagDateHelper"><!-- --></a>
+                        <a name="FormTagLib()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4><a href='../../../../../org/grails/plugins/web/GrailsTagDateHelper.html'>GrailsTagDateHelper</a> <strong>grailsTagDateHelper</strong></h4>
+                                <h4><strong>FormTagLib</strong>()</h4>
                                 <p></p>
                             </li>
                         </ul>
                     
-                        <a name="hiddenField"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>hiddenField</strong></h4>
-                                <p> Creates a hidden field.<DL><DT><B>attr:</B></DT><DD>name REQUIRED the field name</DD></DL><DL><DT><B>attr:</B></DT><DD>value the field value</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
-                        <a name="localeSelect"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>localeSelect</strong></h4>
-                                <p> A helper tag for creating locale selects.<br/>
+                </li>
+            </ul>
+            
 
- eg. &lt;g:localeSelect name="myLocale" value="${locale}" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED The name of the select</DD></DL><DL><DT><B>attr:</B></DT><DD>value The set locale, defaults to the current request locale if not specified</DD></DL><DL><DT><B>attr:</B></DT><DD>locale The locale to use for formatting the locale names. Defaults to the current request locale and then the system default locale if not specified</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
-                        <a name="passwordField"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>passwordField</strong></h4>
-                                <p> Creates a new password field.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the field name</DD></DL><DL><DT><B>attr:</B></DT><DD>value the field value</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
-                        <a name="radio"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>radio</strong></h4>
-                                <p> A helper tag for creating radio buttons.<DL><DT><B>emptyTag:</B></DT><DD>@attr value REQUIRED The value of the radio button</DD></DL><DL><DT><B>attr:</B></DT><DD>name REQUIRED The name of the radio button</DD></DL><DL><DT><B>attr:</B></DT><DD>checked boolean to indicate that the radio button should be checked</DD></DL><DL><DT><B>attr:</B></DT><DD>disabled boolean to indicate that the radio button should be disabled</DD></DL><DL><DT><B>attr:</B></DT><DD [...]
-                            </li>
-                        </ul>
+
+            
+            <!-- =========== METHOD DETAIL =========== -->
+            <ul class="blockList">
+                <li class="blockList"><a name="method_detail">
+                    <!--   -->
+                </a>
+                    <h3>Method Detail</h3>
                     
-                        <a name="radioGroup"><!-- --></a>
+                        <a name="actionSubmitImage(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>radioGroup</strong></h4>
-                                <p> A helper tag for creating radio button groups.<DL><DT><B>attr:</B></DT><DD>name REQUIRED The name of the group</DD></DL><DL><DT><B>attr:</B></DT><DD>values REQUIRED The list values for the radio buttons</DD></DL><DL><DT><B>attr:</B></DT><DD>value The current selected value</DD></DL><DL><DT><B>attr:</B></DT><DD>labels Labels for each value contained in the values list. If this is ommitted the label property on the iterator variable (see below) will defa [...]
+                                <h4>java.lang.Object <strong>actionSubmitImage</strong>(java.util.Map attrs)</h4>
+                                <p> Creates a an image submit button that submits to an action in the controller specified by the form action.
+ The name of the action attribute is translated into the action name, for example "Edit" becomes
+ "_action_edit" or "List People" becomes "_action_listPeople".<br/>
+ If the action attribute is not specified, the value attribute will be used as part of the action name.<br/>
+
+ &lt;g:actionSubmitImage src="/images/submitButton.gif" action="Edit" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr value REQUIRED The title of the button and name of action when not explicitly defined.</DD></DL><DL><DT><B>attr:</B></DT><DD>action The name of the action to be executed, otherwise it is derived from the value.</DD></DL><DL><DT><B>attr:</B></DT><DD>src The source of the image to use</DD></DL><DL><DT><B>attr:</B></DT><DD>disabled Makes the button to be disabled. Will be interp [...]
                             </li>
                         </ul>
                     
-                        <a name="renderNoSelectionOption"><!-- --></a>
+                        <a name="afterPropertiesSet()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>renderNoSelectionOption</strong></h4>
+                                <h4>void <strong>afterPropertiesSet</strong>()</h4>
                                 <p></p>
                             </li>
                         </ul>
                     
-                        <a name="requestDataValueProcessor"><!-- --></a>
+                        <a name="checkBox(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4><a href='../../../../../org.springframework.web.servlet.support.RequestDataValueProcessor.html'>RequestDataValueProcessor</a> <strong>requestDataValueProcessor</strong></h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>checkBox</strong>(java.util.Map attrs)</h4>
+                                <p> A helper tag for creating checkboxes.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the name of the checkbox</DD></DL><DL><DT><B>attr:</B></DT><DD>value  the value of the checkbox</DD></DL><DL><DT><B>attr:</B></DT><DD>checked if evaluates to true sets to checkbox to checked</DD></DL><DL><DT><B>attr:</B></DT><DD>disabled if evaluates to true sets to checkbox to disabled</DD></DL><DL><DT><B>attr:</B></DT><DD>readonly if evaluates to true, sets to c [...]
                             </li>
                         </ul>
                     
-                        <a name="select"><!-- --></a>
+                        <a name="currencySelect(java.util.Map, groovy.lang.Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>select</strong></h4>
-                                <p> A helper tag for creating HTML selects.<br/>
+                                <h4>java.lang.Object <strong>currencySelect</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> A helper tag for creating currency selects.<br/>
 
- Examples:<br/>
- &lt;g:select name="user.age" from="${18..65}" value="${age}" /&gt;<br/>
- &lt;g:select name="user.company.id" from="${Company.list()}" value="${user?.company.id}" optionKey="id" /&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the select name</DD></DL><DL><DT><B>attr:</B></DT><DD>id the DOM element id - uses the name attribute if not specified</DD></DL><DL><DT><B>attr:</B></DT><DD>from REQUIRED The list or range to select from</DD></DL><DL><DT><B>attr:</B></DT><DD>keys A list of values to be used for the value attribute of each "option" element. [...]
+ eg. &lt;g:currencySelect name="myCurrency" value="${currency}" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr from The currency symbols to select from, defaults to the major ones if not specified</DD></DL><DL><DT><B>attr:</B></DT><DD>value The currency value as the currency code. Defaults to the currency for the current Locale if not specified</DD></DL> </p>
                             </li>
                         </ul>
                     
-                        <a name="springSecurityCsrfTokenClass"><!-- --></a>
+                        <a name="datePicker(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>java.lang.Class&lt;?&gt; <strong>springSecurityCsrfTokenClass</strong></h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>datePicker</strong>(java.util.Map attrs)</h4>
+                                <p> A simple date picker that renders a date as selects.<br/>
+ e.g. &lt;g:datePicker name="myDate" value="${new Date()}" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED The name of the date picker field set</DD></DL><DL><DT><B>attr:</B></DT><DD>value The current value of the date picker; defaults to either the value specified by the default attribute or now if no default is set</DD></DL><DL><DT><B>attr:</B></DT><DD>default A Date or parsable date string that will be used if there is no value</DD></DL><DL><DT><B>attr:</B></DT><DD>precision [...]
                             </li>
                         </ul>
                     
-                        <a name="submitButton"><!-- --></a>
+                        <a name="field(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>submitButton</strong></h4>
-                                <p> Creates a submit button.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the field name</DD></DL><DL><DT><B>attr:</B></DT><DD>value the button text</DD></DL><DL><DT><B>attr:</B></DT><DD>type input type; defaults to 'submit'</DD></DL><DL><DT><B>attr:</B></DT><DD>event the webflow event id</DD></DL> </p>
+                                <h4>java.lang.Object <strong>field</strong>(java.util.Map attrs)</h4>
+                                <p> A general tag for creating fields.<DL><DT><B>attr:</B></DT><DD>type REQUIRED the input type</DD></DL> </p>
                             </li>
                         </ul>
                     
-                        <a name="textArea"><!-- --></a>
+                        <a name="form(java.util.Map, groovy.lang.Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>textArea</strong></h4>
-                                <p> A general tag for creating textareas.<DL><DT><B>attr:</B></DT><DD>name REQUIRED the name of the textarea</DD></DL><DL><DT><B>attr:</B></DT><DD>value  the text of the textarea; if not specified renders the body as the text</DD></DL><DL><DT><B>attr:</B></DT><DD>escapeHtml if true escapes the text as HTML</DD></DL><DL><DT><B>attr:</B></DT><DD>id DOM element id; defaults to name</DD></DL> </p>
+                                <h4>java.lang.Object <strong>form</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> General linking to controllers, actions etc. Examples:<br/>
+
+ &lt;g:form action="myaction"&gt;...&lt;/g:form&gt;<br/>
+ &lt;g:form controller="myctrl" action="myaction"&gt;...&lt;/g:form&gt;<br/><DL><DT><B>attr:</B></DT><DD>action the name of the action to use in the link, if not specified the default action will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>controller the name of the controller to use in the link, if not specified the current controller will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>id The id to use in the link</DD></DL><DL><DT><B>attr:</B></DT><DD>url A map containing the actio [...]
                             </li>
                         </ul>
                     
-                        <a name="textField"><!-- --></a>
+                        <a name="formActionSubmit(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>textField</strong></h4>
-                                <p> Creates a new text field.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the field name</DD></DL><DL><DT><B>attr:</B></DT><DD>value the field value</DD></DL> </p>
+                                <h4>java.lang.Object <strong>formActionSubmit</strong>(java.util.Map attrs)</h4>
+                                <p> Creates a submit button using the `formaction` attribute to submit to a different action than the form.
+ The target URL is generated from the supported link attributes.<br/>
+ The rendered `&lt;input&gt;` uses this tag's `id` attribute for its DOM id. If the generated URL needs an
+ `id`, provide it through the `url` map.<br/>
+
+ &lt;g:formActionSubmit action="myaction" value="Submit"/&gt;<br/>
+ &lt;g:formActionSubmit controller="myctrl" action="myaction" value="ButtonName"/&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr value REQUIRED The label shown on the submit button</DD></DL><DL><DT><B>attr:</B></DT><DD>id DOM id for the rendered input element</DD></DL><DL><DT><B>attr:</B></DT><DD>disabled Makes the button disabled. Will be interpreted as a Groovy Truth</DD></DL><DL><DT><B>attr:</B></DT><DD>action The name of the action to use in the generated link, if not specified the d [...]
                             </li>
                         </ul>
                     
-                        <a name="timeZoneSelect"><!-- --></a>
+                        <a name="hiddenField(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>timeZoneSelect</strong></h4>
-                                <p> A helper tag for creating TimeZone selects.<br/>
- eg. &lt;g:timeZoneSelect name="myTimeZone" value="${tz}" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED The name of the select</DD></DL><DL><DT><B>attr:</B></DT><DD>value An instance of java.util.TimeZone. Defaults to the time zone for the current Locale if not specified</DD></DL><DL><DT><B>attr:</B></DT><DD>locale The locale to use for formatting the time zone names. Defaults to the current request locale and then system default locale if not specified</DD></DL> </p>
+                                <h4>java.lang.Object <strong>hiddenField</strong>(java.util.Map attrs)</h4>
+                                <p> Creates a hidden field.<DL><DT><B>attr:</B></DT><DD>name REQUIRED the field name</DD></DL><DL><DT><B>attr:</B></DT><DD>value the field value</DD></DL> <DL><DT><B>Parameters:</B></DT><DD><code>name</code> -  required field name</DD><DD><code>attrs</code> -  optional tag attributes including value and additional HTML attributes</DD></DL></p>
                             </li>
                         </ul>
                     
-                        <a name="uploadForm"><!-- --></a>
+                        <a name="localeSelect(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>uploadForm</strong></h4>
-                                <p> Same as &lt;g:form&gt;, except sets the relevant enctype for a file upload form.<DL><DT><B>attr:</B></DT><DD>action the name of the action to use in the link, if not specified the default action will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>controller the name of the controller to use in the link, if not specified the current controller will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>id The id to use in the link</DD></DL><DL><DT><B>attr:</B [...]
+                                <h4>java.lang.Object <strong>localeSelect</strong>(java.util.Map attrs)</h4>
+                                <p> A helper tag for creating locale selects.<br/>
+
+ eg. &lt;g:localeSelect name="myLocale" value="${locale}" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED The name of the select</DD></DL><DL><DT><B>attr:</B></DT><DD>value The set locale, defaults to the current request locale if not specified</DD></DL><DL><DT><B>attr:</B></DT><DD>locale The locale to use for formatting the locale names. Defaults to the current request locale and then the system default locale if not specified</DD></DL> </p>
                             </li>
                         </ul>
                     
-                </li>
-            </ul>
-            
-
-            
-
-            
-            <!-- =========== CONSTRUCTOR DETAIL =========== -->
-            <ul class="blockList">
-                <li class="blockList"><a name="constructor_detail">
-                    <!--   -->
-                </a>
-                    <h3>Constructor Detail</h3>
-                    
-                        <a name="FormTagLib()"><!-- --></a>
+                        <a name="passwordField(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4><strong>FormTagLib</strong>()</h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>passwordField</strong>(java.util.Map attrs)</h4>
+                                <p> Creates a new password field.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the field name</DD></DL><DL><DT><B>attr:</B></DT><DD>value the field value</DD></DL> <DL><DT><B>Parameters:</B></DT><DD><code>name</code> -  required field name</DD><DD><code>attrs</code> -  optional tag attributes including value, id, class and other HTML attributes</DD></DL></p>
                             </li>
                         </ul>
                     
-                </li>
-            </ul>
-            
-
-
-            
-            <!-- =========== METHOD DETAIL =========== -->
-            <ul class="blockList">
-                <li class="blockList"><a name="method_detail">
-                    <!--   -->
-                </a>
-                    <h3>Method Detail</h3>
-                    
-                        <a name="afterPropertiesSet()"><!-- --></a>
+                        <a name="radio(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>void <strong>afterPropertiesSet</strong>()</h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>radio</strong>(java.util.Map attrs)</h4>
+                                <p> A helper tag for creating radio buttons.<DL><DT><B>emptyTag:</B></DT><DD>@attr value REQUIRED The value of the radio button</DD></DL><DL><DT><B>attr:</B></DT><DD>name REQUIRED The name of the radio button</DD></DL><DL><DT><B>attr:</B></DT><DD>checked boolean to indicate that the radio button should be checked</DD></DL><DL><DT><B>attr:</B></DT><DD>disabled boolean to indicate that the radio button should be disabled</DD></DL><DL><DT><B>attr:</B></DT><DD [...]
                             </li>
                         </ul>
                     
-                        <a name="configureCsrf()"><!-- --></a>
+                        <a name="radioGroup(java.util.Map, groovy.lang.Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>void <strong>configureCsrf</strong>()</h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>radioGroup</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> A helper tag for creating radio button groups.<DL><DT><B>attr:</B></DT><DD>name REQUIRED The name of the group</DD></DL><DL><DT><B>attr:</B></DT><DD>values REQUIRED The list values for the radio buttons</DD></DL><DL><DT><B>attr:</B></DT><DD>value The current selected value</DD></DL><DL><DT><B>attr:</B></DT><DD>labels Labels for each value contained in the values list. If this is ommitted the label property on the iterator variable (see below) will defa [...]
                             </li>
                         </ul>
                     
-                        <a name="fieldImpl(org.grails.buffer.GrailsPrintWriter, java.util.Map)"><!-- --></a>
+                        <a name="select(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>@groovy.transform.CompileStatic<br>java.lang.Object <strong>fieldImpl</strong>(<a href='../../../../../org/grails/buffer/GrailsPrintWriter.html'>GrailsPrintWriter</a> out, java.util.Map attrs)</h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>select</strong>(java.util.Map attrs)</h4>
+                                <p> A helper tag for creating HTML selects.<br/>
+
+ Examples:<br/>
+ &lt;g:select name="user.age" from="${18..65}" value="${age}" /&gt;<br/>
+ &lt;g:select name="user.company.id" from="${Company.list()}" value="${user?.company.id}" optionKey="id" /&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the select name</DD></DL><DL><DT><B>attr:</B></DT><DD>id the DOM element id - uses the name attribute if not specified</DD></DL><DL><DT><B>attr:</B></DT><DD>from REQUIRED The list or range to select from</DD></DL><DL><DT><B>attr:</B></DT><DD>keys A list of values to be used for the value attribute of each "option" element. [...]
                             </li>
                         </ul>
                     
-                        <a name="hiddenFieldImpl(java.lang.Object, java.lang.Object)"><!-- --></a>
+                        <a name="setConfiguration(grails.config.Config)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>java.lang.Object <strong>hiddenFieldImpl</strong>(java.lang.Object out, java.lang.Object attrs)</h4>
+                                <h4>@java.lang.Override<br>void <strong>setConfiguration</strong>(<a href='../../../../../grails/config/Config.html'>Config</a> co)</h4>
                                 <p></p>
                             </li>
                         </ul>
                     
-                        <a name="outputAttributes(java.util.Map, org.grails.buffer.GrailsPrintWriter, boolean)"><!-- --></a>
+                        <a name="submitButton(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>@groovy.transform.CompileStatic<br>void <strong>outputAttributes</strong>(java.util.Map attrs, <a href='../../../../../org/grails/buffer/GrailsPrintWriter.html'>GrailsPrintWriter</a> writer, boolean useNameAsIdIfIdDoesNotExist)</h4>
-                                <p> Dump out attributes in HTML compliant fashion.</p>
+                                <h4>java.lang.Object <strong>submitButton</strong>(java.util.Map attrs)</h4>
+                                <p> Creates a submit button.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the field name</DD></DL><DL><DT><B>attr:</B></DT><DD>value the button text</DD></DL><DL><DT><B>attr:</B></DT><DD>type input type; defaults to 'submit'</DD></DL><DL><DT><B>attr:</B></DT><DD>event the webflow event id</DD></DL> <DL><DT><B>Parameters:</B></DT><DD><code>name</code> -  required field name</DD><DD><code>attrs</code> -  optional tag attributes including value, type,  [...]
                             </li>
                         </ul>
                     
-                        <a name="processedUrl(java.lang.String, java.lang.Object)"><!-- --></a>
+                        <a name="textArea(java.util.Map, groovy.lang.Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>java.lang.String <strong>processedUrl</strong>(java.lang.String link, java.lang.Object request)</h4>
-                                <p> Filters the url through the RequestDataValueProcessor bean if it is registered.</p>
+                                <h4>java.lang.Object <strong>textArea</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> A general tag for creating textareas.<DL><DT><B>attr:</B></DT><DD>name REQUIRED the name of the textarea</DD></DL><DL><DT><B>attr:</B></DT><DD>value  the text of the textarea; if not specified renders the body as the text</DD></DL><DL><DT><B>attr:</B></DT><DD>escapeHtml if true escapes the text as HTML</DD></DL><DL><DT><B>attr:</B></DT><DD>id DOM element id; defaults to name</DD></DL> </p>
                             </li>
                         </ul>
                     
-                        <a name="renderNoSelectionOptionImpl(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)"><!-- --></a>
+                        <a name="textField(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>java.lang.Object <strong>renderNoSelectionOptionImpl</strong>(java.lang.Object out, java.lang.Object noSelectionKey, java.lang.Object noSelectionValue, java.lang.Object value)</h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>textField</strong>(java.util.Map attrs)</h4>
+                                <p> Creates a new text field.<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED the field name</DD></DL><DL><DT><B>attr:</B></DT><DD>value the field value</DD></DL> <DL><DT><B>Parameters:</B></DT><DD><code>name</code> -  required field name</DD><DD><code>attrs</code> -  optional tag attributes including value, id, class and other HTML attributes</DD></DL></p>
                             </li>
                         </ul>
                     
-                        <a name="resolveAttributes(java.util.Map)"><!-- --></a>
+                        <a name="timeZoneSelect(java.util.Map)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>void <strong>resolveAttributes</strong>(java.util.Map attrs)</h4>
-                                <p> Check required attributes, set the id to name if no id supplied, extract bean values etc.</p>
+                                <h4>java.lang.Object <strong>timeZoneSelect</strong>(java.util.Map attrs)</h4>
+                                <p> A helper tag for creating TimeZone selects.<br/>
+ eg. &lt;g:timeZoneSelect name="myTimeZone" value="${tz}" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED The name of the select</DD></DL><DL><DT><B>attr:</B></DT><DD>value An instance of java.util.TimeZone. Defaults to the time zone for the current Locale if not specified</DD></DL><DL><DT><B>attr:</B></DT><DD>locale The locale to use for formatting the time zone names. Defaults to the current request locale and then system default locale if not specified</DD></DL> </p>
                             </li>
                         </ul>
                     
-                        <a name="setConfiguration(grails.config.Config)"><!-- --></a>
+                        <a name="uploadForm(java.util.Map, groovy.lang.Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>@java.lang.Override<br>void <strong>setConfiguration</strong>(<a href='../../../../../grails/config/Config.html'>Config</a> co)</h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>uploadForm</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> Same as &lt;g:form&gt;, except sets the relevant enctype for a file upload form.<DL><DT><B>attr:</B></DT><DD>action the name of the action to use in the link, if not specified the default action will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>controller the name of the controller to use in the link, if not specified the current controller will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>id The id to use in the link</DD></DL><DL><DT><B>attr:</B [...]
                             </li>
                         </ul>
                     
diff --git a/docs/snapshot/api/org/grails/plugins/web/taglib/FormatTagLib.html b/docs/snapshot/api/org/grails/plugins/web/taglib/FormatTagLib.html
index f17874eefdc..752fc15bc99 100644
--- a/docs/snapshot/api/org/grails/plugins/web/taglib/FormatTagLib.html
+++ b/docs/snapshot/api/org/grails/plugins/web/taglib/FormatTagLib.html
@@ -147,26 +147,6 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                             <td class="colLast"><code><a href="#codecLookup">codecLookup</a></code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#encodeAs">encodeAs</a></code><br>Encodes the body using the specified codec.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#formatBoolean">formatBoolean</a></code><br>Outputs the given boolean as the specified text label. </td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#formatDate">formatDate</a></code><br>Outputs the given <code>Date</code> object in the specified format. </td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#formatNumber">formatNumber</a></code><br>Outputs the given number in the specified format.  </td>
-                        </tr>
-                        
                         <tr class="rowColor">
                             <td class="colFirst"><code><strong><a href='../../../../../org/grails/plugins/web/GrailsTagDateHelper.html'>GrailsTagDateHelper</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#grailsTagDateHelper">grailsTagDateHelper</a></code><br></td>
@@ -232,11 +212,29 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>java.lang.String</code></td>
-                            <td class="colLast"><code><strong><a href="#messageHelper(java.lang.String, java.lang.Object, java.util.List, java.util.Locale)">messageHelper</a></strong>(java.lang.String code, java.lang.Object defaultMessage, java.util.List args, java.util.Locale locale)</code><br></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#encodeAs(java.util.Map, groovy.lang.Closure)">encodeAs</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>Encodes the body using the specified codec.</td>
                         </tr>
                         
                         <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#formatBoolean(java.util.Map)">formatBoolean</a></strong>(java.util.Map attrs)</code><br>Outputs the given boolean as the specified text label. </td>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#formatDate(java.util.Map)">formatDate</a></strong>(java.util.Map attrs)</code><br>Outputs the given <code>Date</code> object in the specified format. </td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#formatNumber(java.util.Map)">formatNumber</a></strong>(java.util.Map attrs)</code><br>Outputs the given number in the specified format.  </td>
+                        </tr>
+                        
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>static&nbsp;java.util.Locale</code></td>
                             <td class="colLast"><code><strong><a href="#resolveLocale(java.lang.Object)">resolveLocale</a></strong>(java.lang.Object localeAttr)</code><br></td>
@@ -293,54 +291,6 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                             </li>
                         </ul>
                     
-                        <a name="encodeAs"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>encodeAs</strong></h4>
-                                <p> Encodes the body using the specified codec.<DL><DT><B>attr:</B></DT><DD>codec REQUIRED the codec name</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
-                        <a name="formatBoolean"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>formatBoolean</strong></h4>
-                                <p> Outputs the given boolean as the specified text label. If the
- <code>true</code> and <code>false</code> option are not given,
- then the boolean is output using the default label.<br/>
-
- Examples:<br/>
-
- &lt;g:formatBoolean boolean="${myBoolean}" /&gt;<br/>
- &lt;g:formatBoolean boolean="${myBoolean}" true="True!" false="False!" /&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr boolean REQUIRED the boolean to output</DD></DL><DL><DT><B>attr:</B></DT><DD>true text label for boolean true value</DD></DL><DL><DT><B>attr:</B></DT><DD>false text label for boolean false value</DD></DL><DL><DT><B>attr:</B></DT><DD>locale Force the locale for formatting.</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
-                        <a name="formatDate"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>formatDate</strong></h4>
-                                <p> Outputs the given <code>Date</code> object in the specified format. If
- the <code>date</code> is not given, then the current date/time is used.
- If the <code>format</code> option is not given, then the date is output
- using the default format.<br/>
-
- e.g., &lt;g:formatDate date="${myDate}" format="yyyy-MM-dd HH:mm" /&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr date the date object to display; defaults to now if not specified</DD></DL><DL><DT><B>attr:</B></DT><DD>format The formatting pattern to use for the date, see SimpleDateFormat</DD></DL><DL><DT><B>attr:</B></DT><DD>formatName Look up format from the default MessageSource / ResourceBundle (i18n/*.properties file) with this key. If format and formatName are empty, format is lo [...]
-                            </li>
-                        </ul>
-                    
-                        <a name="formatNumber"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>formatNumber</strong></h4>
-                                <p> Outputs the given number in the specified format.  If the
- <code>format</code> option is not given, then the number is output
- using the default format.<br/>
-
- e.g., &lt;g:formatNumber number="${myNumber}" format="###,##0" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr number REQUIRED the number to display</DD></DL><DL><DT><B>attr:</B></DT><DD>format The formatting pattern to use for the number, see DecimalFormat</DD></DL><DL><DT><B>attr:</B></DT><DD>formatName Look up format from the default MessageSource / ResourceBundle (i18n/.properties file) with this key.Look up format from the default MessageSource / ResourceBundle (i18n/.properties file)  [...]
-                            </li>
-                        </ul>
-                    
                         <a name="grailsTagDateHelper"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -400,11 +350,51 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                 </a>
                     <h3>Method Detail</h3>
                     
-                        <a name="messageHelper(java.lang.String, java.lang.Object, java.util.List, java.util.Locale)"><!-- --></a>
+                        <a name="encodeAs(java.util.Map, groovy.lang.Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>@groovy.transform.CompileStatic<br>java.lang.String <strong>messageHelper</strong>(java.lang.String code, java.lang.Object defaultMessage, java.util.List args, java.util.Locale locale)</h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>encodeAs</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> Encodes the body using the specified codec.<DL><DT><B>attr:</B></DT><DD>codec REQUIRED the codec name</DD></DL> </p>
+                            </li>
+                        </ul>
+                    
+                        <a name="formatBoolean(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>formatBoolean</strong>(java.util.Map attrs)</h4>
+                                <p> Outputs the given boolean as the specified text label. If the
+ <code>true</code> and <code>false</code> option are not given,
+ then the boolean is output using the default label.<br/>
+
+ Examples:<br/>
+
+ &lt;g:formatBoolean boolean="${myBoolean}" /&gt;<br/>
+ &lt;g:formatBoolean boolean="${myBoolean}" true="True!" false="False!" /&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr boolean REQUIRED the boolean to output</DD></DL><DL><DT><B>attr:</B></DT><DD>true text label for boolean true value</DD></DL><DL><DT><B>attr:</B></DT><DD>false text label for boolean false value</DD></DL><DL><DT><B>attr:</B></DT><DD>locale Force the locale for formatting.</DD></DL> </p>
+                            </li>
+                        </ul>
+                    
+                        <a name="formatDate(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>formatDate</strong>(java.util.Map attrs)</h4>
+                                <p> Outputs the given <code>Date</code> object in the specified format. If
+ the <code>date</code> is not given, then the current date/time is used.
+ If the <code>format</code> option is not given, then the date is output
+ using the default format.<br/>
+
+ e.g., &lt;g:formatDate date="${myDate}" format="yyyy-MM-dd HH:mm" /&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr date the date object to display; defaults to now if not specified</DD></DL><DL><DT><B>attr:</B></DT><DD>format The formatting pattern to use for the date, see SimpleDateFormat</DD></DL><DL><DT><B>attr:</B></DT><DD>formatName Look up format from the default MessageSource / ResourceBundle (i18n/*.properties file) with this key. If format and formatName are empty, format is lo [...]
+                            </li>
+                        </ul>
+                    
+                        <a name="formatNumber(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>formatNumber</strong>(java.util.Map attrs)</h4>
+                                <p> Outputs the given number in the specified format.  If the
+ <code>format</code> option is not given, then the number is output
+ using the default format.<br/>
+
+ e.g., &lt;g:formatNumber number="${myNumber}" format="###,##0" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr number REQUIRED the number to display</DD></DL><DL><DT><B>attr:</B></DT><DD>format The formatting pattern to use for the number, see DecimalFormat</DD></DL><DL><DT><B>attr:</B></DT><DD>formatName Look up format from the default MessageSource / ResourceBundle (i18n/.properties file) with this key.Look up format from the default MessageSource / ResourceBundle (i18n/.properties file)  [...]
                             </li>
                         </ul>
                     
diff --git a/docs/snapshot/api/org/grails/plugins/web/taglib/PluginTagLib.html b/docs/snapshot/api/org/grails/plugins/web/taglib/PluginTagLib.html
index 1b486c55ac6..cd04b0fe7a6 100644
--- a/docs/snapshot/api/org/grails/plugins/web/taglib/PluginTagLib.html
+++ b/docs/snapshot/api/org/grails/plugins/web/taglib/PluginTagLib.html
@@ -70,11 +70,11 @@ if (location.href.indexOf('is-external=true') == -1) {
     <div>
         <ul class="subNavList">
             <li>Summary:&nbsp;</li>
-            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;<li><a href="#property_summary">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_summary">Constructor</a></li>&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;
+            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;<li><a href="#property_summary">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_summary">Constructor</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
         <ul class="subNavList">
             <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
-            Field&nbsp;&nbsp;&nbsp;<li><a href="#prop_detail">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_detail">Constructor</a></li>&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;
+            Field&nbsp;&nbsp;&nbsp;<li><a href="#prop_detail">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_detail">Constructor</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
     </div>
     <a name="skip-navbar_top">
@@ -141,27 +141,12 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                             <th class="colLast" scope="col">Name and description</th>
                         </tr>
                         
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#isAvailable">isAvailable</a></code><br>Checks whether a particular plugin exists and executes the body if it does.</td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#isNotAvailable">isNotAvailable</a></code><br>Checks whether a particular plugin does not exist and executes the body if it does.</td>
-                        </tr>
-                        
                         <tr class="altColor">
                             <td class="colFirst"><code><strong>static&nbsp;java.lang.String</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#namespace">namespace</a></code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#path">path</a></code><br>Gets the path to a particular plugin.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
                             <td class="colFirst"><code><strong><a href='../../../../../grails/plugins/GrailsPluginManager.html'>GrailsPluginManager</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#pluginManager">pluginManager</a></code><br></td>
                         </tr>
@@ -203,6 +188,39 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
         <!-- ========== METHOD SUMMARY =========== -->
         <ul class="blockList">
             
+            <li class="blockList"><a name="method_summary"><!--   --></a>
+                    <h3>Methods Summary</h3>
+                    <ul class="blockList">
+                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Methods Summary table">
+                        <caption><span>Methods</span><span class="tabEnd">&nbsp;</span></caption>
+                        <tr>
+                            <th class="colFirst" scope="col">Type Params</th>
+                            <th class="colLast" scope="col">Return Type</th>
+                            <th class="colLast" scope="col">Name and description</th>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#isAvailable(java.util.Map, groovy.lang.Closure)">isAvailable</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>Checks whether a particular plugin exists and executes the body if it does.</td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#isNotAvailable(java.util.Map, groovy.lang.Closure)">isNotAvailable</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>Checks whether a particular plugin does not exist and executes the body if it does.</td>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#path(java.util.Map, groovy.lang.Closure)">path</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>Gets the path to a particular plugin.</td>
+                        </tr>
+                        
+                    </table>
+                   </ul>
+              </li>
+            
             <li class="blockList"><a name="method_summary"><!--   --></a>
                     <h3>Inherited Methods Summary</h3>
                     <ul class="blockList">
@@ -242,26 +260,6 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                 </a>
                     <h3>Property Detail</h3>
                     
-                        <a name="isAvailable"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>isAvailable</strong></h4>
-                                <p> Checks whether a particular plugin exists and executes the body if it does.<br/>
-
- eg. &lt;plugin:isAvailable name="hibernate"&gt;print me&lt;/plugin:isAvailable&gt;<DL><DT><B>attr:</B></DT><DD>name REQUIRED the plugin name</DD></DL><DL><DT><B>attr:</B></DT><DD>version the plugin version</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
-                        <a name="isNotAvailable"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>isNotAvailable</strong></h4>
-                                <p> Checks whether a particular plugin does not exist and executes the body if it does.<br/>
-
- eg. &lt;plugin:isNotAvailable name="hibernate"&gt;print me&lt;/plugin:isNotAvailable&gt;<DL><DT><B>attr:</B></DT><DD>name REQUIRED the plugin name</DD></DL><DL><DT><B>attr:</B></DT><DD>version the plugin version</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
                         <a name="namespace"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -270,16 +268,6 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                             </li>
                         </ul>
                     
-                        <a name="path"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>path</strong></h4>
-                                <p> Gets the path to a particular plugin.<br/>
-
- eg. &lt;plugin:path name="myPlugin" /&gt;<DL><DT><B>attr:</B></DT><DD>name REQUIRED the plugin name</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
                         <a name="pluginManager"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -316,6 +304,46 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
 
 
             
+            <!-- =========== METHOD DETAIL =========== -->
+            <ul class="blockList">
+                <li class="blockList"><a name="method_detail">
+                    <!--   -->
+                </a>
+                    <h3>Method Detail</h3>
+                    
+                        <a name="isAvailable(java.util.Map, groovy.lang.Closure)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>isAvailable</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> Checks whether a particular plugin exists and executes the body if it does.<br/>
+
+ eg. &lt;plugin:isAvailable name="hibernate"&gt;print me&lt;/plugin:isAvailable&gt;<DL><DT><B>attr:</B></DT><DD>name REQUIRED the plugin name</DD></DL><DL><DT><B>attr:</B></DT><DD>version the plugin version</DD></DL> </p>
+                            </li>
+                        </ul>
+                    
+                        <a name="isNotAvailable(java.util.Map, groovy.lang.Closure)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>isNotAvailable</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> Checks whether a particular plugin does not exist and executes the body if it does.<br/>
+
+ eg. &lt;plugin:isNotAvailable name="hibernate"&gt;print me&lt;/plugin:isNotAvailable&gt;<DL><DT><B>attr:</B></DT><DD>name REQUIRED the plugin name</DD></DL><DL><DT><B>attr:</B></DT><DD>version the plugin version</DD></DL> </p>
+                            </li>
+                        </ul>
+                    
+                        <a name="path(java.util.Map, groovy.lang.Closure)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>path</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> Gets the path to a particular plugin.<br/>
+
+ eg. &lt;plugin:path name="myPlugin" /&gt;<DL><DT><B>attr:</B></DT><DD>name REQUIRED the plugin name</DD></DL> </p>
+                            </li>
+                        </ul>
+                    
+                </li>
+            </ul>
+            
         </li>
     </ul>
 </div>
@@ -347,11 +375,11 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
     <div>
         <ul class="subNavList">
             <li>Summary:&nbsp;</li>
-            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;<li><a href="#property_summary">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_summary">Constructor</a></li>&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;
+            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;<li><a href="#property_summary">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_summary">Constructor</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
         <ul class="subNavList">
             <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
-            Field&nbsp;&nbsp;&nbsp;<li><a href="#prop_detail">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_detail">Constructor</a></li>&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;
+            Field&nbsp;&nbsp;&nbsp;<li><a href="#prop_detail">Property</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#constructor_detail">Constructor</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
     </div>
     <p><!-- Matomo -->
diff --git a/docs/snapshot/api/org/grails/plugins/web/taglib/UrlMappingTagLib.html b/docs/snapshot/api/org/grails/plugins/web/taglib/UrlMappingTagLib.html
index 1b4f490a990..8ada19697c8 100644
--- a/docs/snapshot/api/org/grails/plugins/web/taglib/UrlMappingTagLib.html
+++ b/docs/snapshot/api/org/grails/plugins/web/taglib/UrlMappingTagLib.html
@@ -148,25 +148,10 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                         </tr>
                         
                         <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#include">include</a></code><br>Includes another controller/action within the current response.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
                             <td class="colFirst"><code><strong><a href='../../../../../grails/web/mapping/LinkGenerator.html'>LinkGenerator</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#linkGenerator">linkGenerator</a></code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#paginate">paginate</a></code><br>Creates next/previous links to support pagination for the current controller.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#sortableColumn">sortableColumn</a></code><br>Renders a sortable column to support sorting in list views.</td>
-                        </tr>
-                        
                     </table>
                    </ul>
                 </li>
@@ -217,8 +202,20 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>java.util.Map</code></td>
-                            <td class="colLast"><code><strong><a href="#appendClass(java.util.Map, java.lang.String)">appendClass</a></strong>(java.util.Map attrs, java.lang.String cssClass)</code><br></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#include(java.util.Map, groovy.lang.Closure)">include</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>Includes another controller/action within the current response.</td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#paginate(java.util.Map)">paginate</a></strong>(java.util.Map attrs)</code><br>Creates next/previous links to support pagination for the current controller.</td>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#sortableColumn(java.util.Map)">sortableColumn</a></strong>(java.util.Map attrs)</code><br>Renders a sortable column to support sorting in list views.</td>
                         </tr>
                         
                     </table>
@@ -272,16 +269,6 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                             </li>
                         </ul>
                     
-                        <a name="include"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>include</strong></h4>
-                                <p> Includes another controller/action within the current response.<br/>
-
- &lt;g:include controller="foo" action="test"&gt;&lt;/g:include&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr controller The name of the controller</DD></DL><DL><DT><B>attr:</B></DT><DD>action The name of the action</DD></DL><DL><DT><B>attr:</B></DT><DD>id The identifier</DD></DL><DL><DT><B>attr:</B></DT><DD>params Any parameters</DD></DL><DL><DT><B>attr:</B></DT><DD>view The name of the view. Cannot be specified in combination with controller/action/id</DD></DL><DL><DT><B>attr:</B></DT [...]
-                            </li>
-                        </ul>
-                    
                         <a name="linkGenerator"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -290,36 +277,6 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                             </li>
                         </ul>
                     
-                        <a name="paginate"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>paginate</strong></h4>
-                                <p> Creates next/previous links to support pagination for the current controller.<br/>
-
- &lt;g:paginate total="${Account.count()}" /&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr total REQUIRED The total number of results to paginate</DD></DL><DL><DT><B>attr:</B></DT><DD>action the name of the action to use in the link, if not specified the default action will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>controller the name of the controller to use in the link, if not specified the current controller will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>id The id to use  [...]
-                            </li>
-                        </ul>
-                    
-                        <a name="sortableColumn"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>sortableColumn</strong></h4>
-                                <p> Renders a sortable column to support sorting in list views.<br/>
-
- Attribute title or titleKey is required. When both attributes are specified then titleKey takes precedence,
- resulting in the title caption to be resolved against the message source. In case when the message could
- not be resolved, the title will be used as title caption.<br/>
-
- Examples:<br/>
-
- &lt;g:sortableColumn property="title" title="Title" /&gt;<br/>
- &lt;g:sortableColumn property="title" title="Title" style="width: 200px" /&gt;<br/>
- &lt;g:sortableColumn property="title" titleKey="book.title" /&gt;<br/>
- &lt;g:sortableColumn property="releaseDate" defaultOrder="desc" title="Release Date" /&gt;<br/>
- &lt;g:sortableColumn property="releaseDate" defaultOrder="desc" title="Release Date" titleKey="book.releaseDate" /&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr property - name of the property relating to the field</DD></DL><DL><DT><B>attr:</B></DT><DD>defaultOrder default order for the property; choose between asc (default if not provided) and desc</DD></DL><DL><DT><B>attr:</B></DT><DD>title title caption for the column</DD></DL><DL><DT><B>attr:</B></DT><DD>titleKey title key to use f [...]
-                            </li>
-                        </ul>
-                    
                 </li>
             </ul>
             
@@ -355,11 +312,43 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                 </a>
                     <h3>Method Detail</h3>
                     
-                        <a name="appendClass(java.util.Map, java.lang.String)"><!-- --></a>
+                        <a name="include(java.util.Map, groovy.lang.Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>java.util.Map <strong>appendClass</strong>(java.util.Map attrs, java.lang.String cssClass)</h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>include</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> Includes another controller/action within the current response.<br/>
+
+ &lt;g:include controller="foo" action="test"&gt;&lt;/g:include&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr controller The name of the controller</DD></DL><DL><DT><B>attr:</B></DT><DD>action The name of the action</DD></DL><DL><DT><B>attr:</B></DT><DD>id The identifier</DD></DL><DL><DT><B>attr:</B></DT><DD>params Any parameters</DD></DL><DL><DT><B>attr:</B></DT><DD>view The name of the view. Cannot be specified in combination with controller/action/id</DD></DL><DL><DT><B>attr:</B></DT [...]
+                            </li>
+                        </ul>
+                    
+                        <a name="paginate(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>paginate</strong>(java.util.Map attrs)</h4>
+                                <p> Creates next/previous links to support pagination for the current controller.<br/>
+
+ &lt;g:paginate total="${Account.count()}" /&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr total REQUIRED The total number of results to paginate</DD></DL><DL><DT><B>attr:</B></DT><DD>action the name of the action to use in the link, if not specified the default action will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>controller the name of the controller to use in the link, if not specified the current controller will be linked</DD></DL><DL><DT><B>attr:</B></DT><DD>id The id to use  [...]
+                            </li>
+                        </ul>
+                    
+                        <a name="sortableColumn(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>sortableColumn</strong>(java.util.Map attrs)</h4>
+                                <p> Renders a sortable column to support sorting in list views.<br/>
+
+ Attribute title or titleKey is required. When both attributes are specified then titleKey takes precedence,
+ resulting in the title caption to be resolved against the message source. In case when the message could
+ not be resolved, the title will be used as title caption.<br/>
+
+ Examples:<br/>
+
+ &lt;g:sortableColumn property="title" title="Title" /&gt;<br/>
+ &lt;g:sortableColumn property="title" title="Title" style="width: 200px" /&gt;<br/>
+ &lt;g:sortableColumn property="title" titleKey="book.title" /&gt;<br/>
+ &lt;g:sortableColumn property="releaseDate" defaultOrder="desc" title="Release Date" /&gt;<br/>
+ &lt;g:sortableColumn property="releaseDate" defaultOrder="desc" title="Release Date" titleKey="book.releaseDate" /&gt;<br/><DL><DT><B>emptyTag:</B></DT><DD>@attr property - name of the property relating to the field</DD></DL><DL><DT><B>attr:</B></DT><DD>defaultOrder default order for the property; choose between asc (default if not provided) and desc</DD></DL><DL><DT><B>attr:</B></DT><DD>title title caption for the column</DD></DL><DL><DT><B>attr:</B></DT><DD>titleKey title key to use f [...]
                             </li>
                         </ul>
                     
diff --git a/docs/snapshot/api/org/grails/plugins/web/taglib/ValidationTagLib.html b/docs/snapshot/api/org/grails/plugins/web/taglib/ValidationTagLib.html
index bb2807982a9..28eb3436fbe 100644
--- a/docs/snapshot/api/org/grails/plugins/web/taglib/ValidationTagLib.html
+++ b/docs/snapshot/api/org/grails/plugins/web/taglib/ValidationTagLib.html
@@ -152,51 +152,20 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                         </tr>
                         
                         <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#eachError">eachError</a></code><br>Loops through each error of the specified bean or model. </td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#fieldError">fieldError</a></code><br>Renders an error message for the given bean and field.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#fieldValue">fieldValue</a></code><br>Obtains the value of a field either from the original errors.</td>
-                        </tr>
-                        
-                        <tr class="rowColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#hasErrors">hasErrors</a></code><br>Checks if the request has errors either for a field or global errors.</td>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#message">message</a></code><br>Resolves a message code for a given error or code from the resource bundle.</td>
-                        </tr>
-                        
-                        <tr class="rowColor">
                             <td class="colFirst"><code><strong><a href='../../../../../org.springframework.context.MessageSource.html'>MessageSource</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#messageSource">messageSource</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#renderErrors">renderErrors</a></code><br>Loops through each error and renders it using one of the supported mechanisms (defaults to "list" if unsupported).</td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code><strong>static&nbsp;java.lang.Object</strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#returnObjectForTags">returnObjectForTags</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
-                            <td class="colFirst"><code><strong>groovy.lang.Closure</strong></code>&nbsp;</td>
-                            <td class="colLast"><code><a href="#validate">validate</a></code><br>Validates a form using Apache commons validator javascript against constraints defined in a Grails
- domain class.</td>
-                        </tr>
-                        
                     </table>
                    </ul>
                 </li>
@@ -248,19 +217,19 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.lang.Object</code></td>
-                            <td class="colLast"><code><strong><a href="#eachErrorInternal(java.lang.Object, java.lang.Object, boolean)">eachErrorInternal</a></strong>(java.lang.Object attrs, java.lang.Object body, boolean outputResult)</code><br></td>
+                            <td class="colLast"><code><strong><a href="#eachError(java.util.Map, groovy.lang.Closure)">eachError</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>Loops through each error of the specified bean or model. </td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.lang.Object</code></td>
-                            <td class="colLast"><code><strong><a href="#eachErrorInternalForList(java.lang.Object, java.lang.Object, java.lang.Object, boolean)">eachErrorInternalForList</a></strong>(java.lang.Object attrs, java.lang.Object errorsList, java.lang.Object body, boolean outputResult)</code><br></td>
+                            <td class="colLast"><code><strong><a href="#fieldError(java.util.Map, groovy.lang.Closure)">fieldError</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>Renders an error message for the given bean and field.</td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.lang.Object</code></td>
-                            <td class="colLast"><code><strong><a href="#extractErrors(java.lang.Object)">extractErrors</a></strong>(java.lang.Object attrs)</code><br></td>
+                            <td class="colLast"><code><strong><a href="#fieldValue(java.util.Map, groovy.lang.Closure)">fieldValue</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>Obtains the value of a field either from the original errors.</td>
                         </tr>
                         
                         <tr class="rowColor">
@@ -273,7 +242,20 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>java.lang.Object</code></td>
-                            <td class="colLast"><code><strong><a href="#messageImpl(java.util.Map)">messageImpl</a></strong>(java.util.Map attrs)</code><br></td>
+                            <td class="colLast"><code><strong><a href="#hasErrors(java.util.Map, groovy.lang.Closure)">hasErrors</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>Checks if the request has errors either for a field or global errors.</td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#message(java.util.Map)">message</a></strong>(java.util.Map attrs)</code><br>Resolves a message code for a given error or code from the resource bundle.</td>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#validate(java.util.Map, groovy.lang.Closure)">validate</a></strong>(java.util.Map attrs, groovy.lang.Closure body)</code><br>Validates a form using Apache commons validator javascript against constraints defined in a Grails
+ domain class.</td>
                         </tr>
                         
                     </table>
@@ -335,52 +317,6 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                             </li>
                         </ul>
                     
-                        <a name="eachError"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>eachError</strong></h4>
-                                <p> Loops through each error of the specified bean or model. If no arguments
- are specified it will go through all model attributes and check for errors.<DL><DT><B>attr:</B></DT><DD>bean The bean to check for errors</DD></DL><DL><DT><B>attr:</B></DT><DD>field The field of the bean or model reference to check</DD></DL><DL><DT><B>attr:</B></DT><DD>model The model reference to check for errors</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
-                        <a name="fieldError"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>fieldError</strong></h4>
-                                <p> Renders an error message for the given bean and field.<br/>
-
- eg. &lt;g:fieldError bean="${book}" field="title" /&gt;<DL><DT><B>attr:</B></DT><DD>bean REQUIRED The bean to check for errors</DD></DL><DL><DT><B>attr:</B></DT><DD>field REQUIRED The field of the bean or model reference to check</DD></DL><DL><DT><B>attr:</B></DT><DD>message The object to resolve the message for. Objects must implement org.springframework.context.MessageSourceResolvable.</DD></DL><DL><DT><B>attr:</B></DT><DD>encodeAs The name of a codec to apply, i.e. HTML, JavaScript,  [...]
-                            </li>
-                        </ul>
-                    
-                        <a name="fieldValue"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>fieldValue</strong></h4>
-                                <p> Obtains the value of a field either from the original errors.<br/>
-
- eg. &lt;g:fieldValue bean="${book}" field="title" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr bean REQUIRED The bean to check for errors</DD></DL><DL><DT><B>attr:</B></DT><DD>field REQUIRED The field of the bean or model reference to check</DD></DL><DL><DT><B>attr:</B></DT><DD>valueMessagePrefix Setting this allows the value to be resolved from the I18n messages.</DD></DL>
- </p>
-                            </li>
-                        </ul>
-                    
-                        <a name="hasErrors"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>hasErrors</strong></h4>
-                                <p> Checks if the request has errors either for a field or global errors.<DL><DT><B>attr:</B></DT><DD>bean The bean to check for errors</DD></DL><DL><DT><B>attr:</B></DT><DD>field The field of the bean or model reference to check</DD></DL><DL><DT><B>attr:</B></DT><DD>model The model reference to check for errors</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
-                        <a name="message"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>message</strong></h4>
-                                <p> Resolves a message code for a given error or code from the resource bundle.<DL><DT><B>emptyTag:</B></DT><DD>@attr error The error to resolve the message for. Used for built-in Grails messages.</DD></DL><DL><DT><B>attr:</B></DT><DD>message The object to resolve the message for. Objects must implement org.springframework.context.MessageSourceResolvable.</DD></DL><DL><DT><B>attr:</B></DT><DD>code The code to resolve the message for. Used for custom applic [...]
-                            </li>
-                        </ul>
-                    
                         <a name="messageSource"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
@@ -405,17 +341,6 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                             </li>
                         </ul>
                     
-                        <a name="validate"><!-- --></a>
-                        <ul class="blockListLast">
-                            <li class="blockList">
-                                <h4>groovy.lang.Closure <strong>validate</strong></h4>
-                                <p> Validates a form using Apache commons validator javascript against constraints defined in a Grails
- domain class.<br/>
-
- TODO: This tag is a work in progress<DL><DT><B>attr:</B></DT><DD>form REQUIRED the HTML form name</DD></DL><DL><DT><B>attr:</B></DT><DD>againstClass REQUIRED the domain class name</DD></DL> </p>
-                            </li>
-                        </ul>
-                    
                 </li>
             </ul>
             
@@ -451,34 +376,40 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                 </a>
                     <h3>Method Detail</h3>
                     
-                        <a name="eachErrorInternal(java.lang.Object, java.lang.Object, boolean)"><!-- --></a>
+                        <a name="eachError(java.util.Map, groovy.lang.Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>java.lang.Object <strong>eachErrorInternal</strong>(java.lang.Object attrs, java.lang.Object body, boolean outputResult)</h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>eachError</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> Loops through each error of the specified bean or model. If no arguments
+ are specified it will go through all model attributes and check for errors.<DL><DT><B>attr:</B></DT><DD>bean The bean to check for errors</DD></DL><DL><DT><B>attr:</B></DT><DD>field The field of the bean or model reference to check</DD></DL><DL><DT><B>attr:</B></DT><DD>model The model reference to check for errors</DD></DL> </p>
                             </li>
                         </ul>
                     
-                        <a name="eachErrorInternalForList(java.lang.Object, java.lang.Object, java.lang.Object, boolean)"><!-- --></a>
+                        <a name="fieldError(java.util.Map, groovy.lang.Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>java.lang.Object <strong>eachErrorInternalForList</strong>(java.lang.Object attrs, java.lang.Object errorsList, java.lang.Object body, boolean outputResult)</h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>fieldError</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> Renders an error message for the given bean and field.<br/>
+
+ eg. &lt;g:fieldError bean="${book}" field="title" /&gt;<DL><DT><B>attr:</B></DT><DD>bean REQUIRED The bean to check for errors</DD></DL><DL><DT><B>attr:</B></DT><DD>field REQUIRED The field of the bean or model reference to check</DD></DL><DL><DT><B>attr:</B></DT><DD>message The object to resolve the message for. Objects must implement org.springframework.context.MessageSourceResolvable.</DD></DL><DL><DT><B>attr:</B></DT><DD>encodeAs The name of a codec to apply, i.e. HTML, JavaScript,  [...]
                             </li>
                         </ul>
                     
-                        <a name="extractErrors(java.lang.Object)"><!-- --></a>
+                        <a name="fieldValue(java.util.Map, groovy.lang.Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>java.lang.Object <strong>extractErrors</strong>(java.lang.Object attrs)</h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>fieldValue</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> Obtains the value of a field either from the original errors.<br/>
+
+ eg. &lt;g:fieldValue bean="${book}" field="title" /&gt;<DL><DT><B>emptyTag:</B></DT><DD>@attr bean REQUIRED The bean to check for errors</DD></DL><DL><DT><B>attr:</B></DT><DD>field REQUIRED The field of the bean or model reference to check</DD></DL><DL><DT><B>attr:</B></DT><DD>valueMessagePrefix Setting this allows the value to be resolved from the I18n messages.</DD></DL>
+ </p>
                             </li>
                         </ul>
                     
                         <a name="formatValue(java.lang.Object, java.lang.String, java.lang.Boolean)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>java.lang.Object <strong>formatValue</strong>(java.lang.Object value, java.lang.String propertyPath, java.lang.Boolean tagSyntaxCall)</h4>
+                                <h4>@<a href='../../../../../grails/gsp/Tag.html' title='Tag'>Tag</a><br>java.lang.Object <strong>formatValue</strong>(java.lang.Object value, java.lang.String propertyPath, java.lang.Boolean tagSyntaxCall)</h4>
                                 <p> Formats a given value for output to an HTML page by converting
  it to a string and encoding it. If the value is a number, it is
  formatted according to the current user's locale during the
@@ -486,11 +417,30 @@ implements <a href='../../../../../grails/artefact/TagLibrary.html'>TagLibrary</
                             </li>
                         </ul>
                     
-                        <a name="messageImpl(java.util.Map)"><!-- --></a>
+                        <a name="hasErrors(java.util.Map, groovy.lang.Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>@groovy.transform.CompileStatic<br>java.lang.Object <strong>messageImpl</strong>(java.util.Map attrs)</h4>
-                                <p></p>
+                                <h4>java.lang.Object <strong>hasErrors</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> Checks if the request has errors either for a field or global errors.<DL><DT><B>attr:</B></DT><DD>bean The bean to check for errors</DD></DL><DL><DT><B>attr:</B></DT><DD>field The field of the bean or model reference to check</DD></DL><DL><DT><B>attr:</B></DT><DD>model The model reference to check for errors</DD></DL> </p>
+                            </li>
+                        </ul>
+                    
+                        <a name="message(java.util.Map)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>message</strong>(java.util.Map attrs)</h4>
+                                <p> Resolves a message code for a given error or code from the resource bundle.<DL><DT><B>emptyTag:</B></DT><DD>@attr error The error to resolve the message for. Used for built-in Grails messages.</DD></DL><DL><DT><B>attr:</B></DT><DD>message The object to resolve the message for. Objects must implement org.springframework.context.MessageSourceResolvable.</DD></DL><DL><DT><B>attr:</B></DT><DD>code The code to resolve the message for. Used for custom applic [...]
+                            </li>
+                        </ul>
+                    
+                        <a name="validate(java.util.Map, groovy.lang.Closure)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>java.lang.Object <strong>validate</strong>(java.util.Map attrs, groovy.lang.Closure body)</h4>
+                                <p> Validates a form using Apache commons validator javascript against constraints defined in a Grails
+ domain class.<br/>
+
+ TODO: This tag is a work in progress<DL><DT><B>attr:</B></DT><DD>form REQUIRED the HTML form name</DD></DL><DL><DT><B>attr:</B></DT><DD>againstClass REQUIRED the domain class name</DD></DL> </p>
                             </li>
                         </ul>
                     
diff --git a/docs/snapshot/api/org/grails/taglib/TagLibraryLookup.html b/docs/snapshot/api/org/grails/taglib/TagLibraryLookup.html
index ae42270f7d8..58cd18644d4 100644
--- a/docs/snapshot/api/org/grails/taglib/TagLibraryLookup.html
+++ b/docs/snapshot/api/org/grails/taglib/TagLibraryLookup.html
@@ -212,84 +212,90 @@ implements <a href='../../../org.springframework.context.ApplicationContextAware
                         </tr>
                         
                         <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>public&nbsp;void</code></td>
+                            <td class="colLast"><code><strong><a href="#clear()">clear</a></strong>()</code><br>Clears all internal tag library caches. </td>
+                        </tr>
+                        
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;boolean</code></td>
                             <td class="colLast"><code><strong><a href="#doesTagReturnObject(java.lang.String, java.lang.String)">doesTagReturnObject</a></strong>(java.lang.String namespace, java.lang.String tagName)</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;java.util.Set&lt;java.lang.String&gt;</code></td>
                             <td class="colLast"><code><strong><a href="#getAvailableNamespaces()">getAvailableNamespaces</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>The namespaces available</DD></DL></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;java.util.Set&lt;java.lang.String&gt;</code></td>
                             <td class="colLast"><code><strong><a href="#getAvailableTags(java.lang.String)">getAvailableTags</a></strong>(java.lang.String namespace)</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;java.util.Map&lt;java.lang.String, java.lang.Object&gt;</code></td>
                             <td class="colLast"><code><strong><a href="#getEncodeAsForTag(java.lang.String, java.lang.String)">getEncodeAsForTag</a></strong>(java.lang.String namespace, java.lang.String tagName)</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;boolean</code></td>
                             <td class="colLast"><code><strong><a href="#hasNamespace(java.lang.String)">hasNamespace</a></strong>(java.lang.String namespace)</code><br>Returns whether the given namespace is in use</td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;<a href='../../../org/grails/taglib/NamespacedTagDispatcher.html'>NamespacedTagDispatcher</a></code></td>
                             <td class="colLast"><code><strong><a href="#lookupNamespaceDispatcher(java.lang.String)">lookupNamespaceDispatcher</a></strong>(java.lang.String namespace)</code><br>Looks up a namespace dispatcher for the given namespace</td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;groovy.lang.GroovyObject</code></td>
                             <td class="colLast"><code><strong><a href="#lookupTagLibrary(java.lang.String, java.lang.String)">lookupTagLibrary</a></strong>(java.lang.String namespace, java.lang.String tagName)</code><br>Looks up a tag library for the given namespace and tag name.</td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>protected&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a href="#putTagLib(Map, java.lang.String, grails.core.gsp.GrailsTagLibClass)">putTagLib</a></strong>(java.util.Map&lt;java.lang.String, java.lang.Object&gt; tags, java.lang.String name, <a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> taglib)</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>protected&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a href="#registerNamespaceDispatcher(java.lang.String)">registerNamespaceDispatcher</a></strong>(java.lang.String namespace)</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a href="#registerTagLib(grails.core.gsp.GrailsTagLibClass)">registerTagLib</a></strong>(<a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> taglib)</code><br>Registers a tag library for lookup. </td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>protected&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a href="#registerTagLibraries()">registerTagLibraries</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>protected&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a href="#registerTemplateNamespace()">registerTemplateNamespace</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a href="#setApplicationContext(org.springframework.context.ApplicationContext)">setApplicationContext</a></strong>(<a href='../../../org.springframework.context.ApplicationContext.html'>ApplicationContext</a> applicationContext)</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a href="#setGrailsApplication(grails.core.GrailsApplication)">setGrailsApplication</a></strong>(<a href='../../../grails/core/GrailsApplication.html'>GrailsApplication</a> grailsApplication)</code><br></td>
@@ -411,6 +417,17 @@ implements <a href='../../../org.springframework.context.ApplicationContextAware
                             </li>
                         </ul>
                     
+                        <a name="clear()"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>public&nbsp;void <strong>clear</strong>()</h4>
+                                <p> Clears all internal tag library caches. This should be called during
+ test cleanup to prevent stale tag library references from leaking
+ between test contexts.
+     </p>
+                            </li>
+                        </ul>
+                    
                         <a name="doesTagReturnObject(java.lang.String, java.lang.String)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
diff --git a/docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html b/docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html
index 8eae885ef7d..fd52e730a77 100644
--- a/docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html
+++ b/docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html
@@ -226,7 +226,13 @@ extends java.lang.Object</pre>
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>static&nbsp;void</code></td>
-                            <td class="colLast"><code><strong><a href="#registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)">registerTagMetaMethods</a></strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace)</code><br></td>
+                            <td class="colLast"><code><strong><a href="#registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, boolean)">registerTagMetaMethods</a></strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, boolean overrideMethods)</code><br></td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>static&nbsp;void</code></td>
+                            <td class="colLast"><code><strong><a href="#registerTagMethodContextMetaProperties(groovy.lang.MetaClass)">registerTagMethodContextMetaProperties</a></strong>(groovy.lang.MetaClass metaClass)</code><br></td>
                         </tr>
                         
                     </table>
@@ -377,10 +383,18 @@ extends java.lang.Object</pre>
                             </li>
                         </ul>
                     
-                        <a name="registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)"><!-- --></a>
+                        <a name="registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, boolean)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>@groovy.transform.CompileStatic<br>static&nbsp;void <strong>registerTagMetaMethods</strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, boolean overrideMethods)</h4>
+                                <p></p>
+                            </li>
+                        </ul>
+                    
+                        <a name="registerTagMethodContextMetaProperties(groovy.lang.MetaClass)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>@groovy.transform.CompileStatic<br>static&nbsp;void <strong>registerTagMetaMethods</strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace)</h4>
+                                <h4>@groovy.transform.CompileStatic<br>static&nbsp;void <strong>registerTagMethodContextMetaProperties</strong>(groovy.lang.MetaClass metaClass)</h4>
                                 <p></p>
                             </li>
                         </ul>
diff --git a/docs/snapshot/api/org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html b/docs/snapshot/api/org/grails/taglib/TagMethodContext.html
similarity index 63%
copy from docs/snapshot/api/org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html
copy to docs/snapshot/api/org/grails/taglib/TagMethodContext.html
index bd7af3ec836..c165bd8d905 100644
--- a/docs/snapshot/api/org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html
+++ b/docs/snapshot/api/org/grails/taglib/TagMethodContext.html
@@ -27,17 +27,17 @@
 <html>
 <head>
     <!-- Generated by groovydoc (4.0.32) -->
-    <title>UrlMappingSetupSpecInterceptor (Grails 8.0.0-SNAPSHOT)</title>
+    <title>TagMethodContext (Grails 8.0.0-SNAPSHOT)</title>
     
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-    <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
-    <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
-    <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
+    <link href="../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+    <link href="../../../groovy.ico" type="image/x-icon" rel="icon">
+    <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
 
 <body class="center">
 <script type="text/javascript"><!--
 if (location.href.indexOf('is-external=true') == -1) {
-    parent.document.title="UrlMappingSetupSpecInterceptor (Grails 8.0.0-SNAPSHOT)";
+    parent.document.title="TagMethodContext (Grails 8.0.0-SNAPSHOT)";
 }
 //-->
 </script>
@@ -51,30 +51,30 @@ if (location.href.indexOf('is-external=true') == -1) {
     <!--   -->
 </a>
     <ul class="navList" title="Navigation">
-        <li><a href="../../../../overview-summary.html">Overview</a></li>
+        <li><a href="../../../overview-summary.html">Overview</a></li>
         <li><a href="package-summary.html">Package</a></li>
         <li class="navBarCell1Rev">Class</li>
-        <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
-        <li><a href="../../../../index-all.html">Index</a></li>
-        <li><a href="../../../../help-doc.html">Help</a></li>
+        <li><a href="../../../deprecated-list.html">Deprecated</a></li>
+        <li><a href="../../../index-all.html">Index</a></li>
+        <li><a href="../../../help-doc.html">Help</a></li>
     </ul>
 </div>
 
 <div class="subNav">
     <div>
         <ul class="navList">
-            <li><a href="../../../../index.html?org/grails/testing/spock/UrlMappingSetupSpecInterceptor" target="_top">Frames</a></li>
-            <li><a href="UrlMappingSetupSpecInterceptor.html" target="_top">No Frames</a></li>
+            <li><a href="../../../index.html?org/grails/taglib/TagMethodContext" target="_top">Frames</a></li>
+            <li><a href="TagMethodContext.html" target="_top">No Frames</a></li>
         </ul>
     </div>
     <div>
         <ul class="subNavList">
             <li>Summary:&nbsp;</li>
-            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<li><a href="#constructor_summary">Constructor</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
+            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
         <ul class="subNavList">
             <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
-            Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<li><a href="#constructor_detail">Constructor</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
+            Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
     </div>
     <a name="skip-navbar_top">
@@ -85,31 +85,24 @@ if (location.href.indexOf('is-external=true') == -1) {
 <!-- ======== START OF CLASS DATA ======== -->
 <div class="header">
 
-    <div class="subTitle">Package: <strong>org.grails.testing.spock</strong></div>
+    <div class="subTitle">Package: <strong>org.grails.taglib</strong></div>
 
-    <h2 title="[Groovy] Class UrlMappingSetupSpecInterceptor" class="title">[Groovy] Class UrlMappingSetupSpecInterceptor</h2>
+    <h2 title="[Java] Class TagMethodContext" class="title">[Java] Class TagMethodContext</h2>
 </div>
 <div class="contentContainer">
 <ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.testing.spock.UrlMappingSetupSpecInterceptor
+<li><ul class="inheritance"></ul></li><li>org.grails.taglib.TagMethodContext
 </ul>
 <div class="description">
     <ul class="blockList">
         <li class="blockList">
 
-            <dl>
-                <dt>All Implemented Interfaces and Traits:</dt>
-                <dd><a href='../../../../org.spockframework.runtime.extension.IMethodInterceptor.html'>IMethodInterceptor</a></dd>
-            </dl>
-    
 
             <!-- todo: direct known subclasses -->
             <hr>
 
-<pre>@groovy.transform.CompileStatic
-class UrlMappingSetupSpecInterceptor
-extends java.lang.Object
-implements <a href='../../../../org.spockframework.runtime.extension.IMethodInterceptor.html'>IMethodInterceptor</a></pre>
+<pre>public final class TagMethodContext
+extends java.lang.Object</pre>
 
           </li>
     </ul>
@@ -133,27 +126,6 @@ implements <a href='../../../../org.spockframework.runtime.extension.IMethodInte
         
 
         
-        <!-- ======== CONSTRUCTOR SUMMARY ======== -->
-        <ul class="blockList">
-                <li class="blockList"><a name="constructor_summary"><!--   --></a>
-                    <h3>Constructor Summary</h3>
-                    <ul class="blockList">
-                    <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructors Summary table">
-                        <caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
-                        <tr>
-                            <th class="colFirst" scope="col">Constructor and description</th>
-                        </tr>
-                        
-                        <tr class="altColor">
-                            <td class="colFirst">
-                                <code><strong><a href="#UrlMappingSetupSpecInterceptor()">UrlMappingSetupSpecInterceptor</a></strong>()</code><br></td>
-                        </tr>
-                        
-                    </table>
-                   </ul>
-              </li>
-        </ul>
-        
 
         
         <!-- ========== METHOD SUMMARY =========== -->
@@ -172,8 +144,26 @@ implements <a href='../../../../org.spockframework.runtime.extension.IMethodInte
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>void</code></td>
-                            <td class="colLast"><code><strong><a href="#intercept(org.spockframework.runtime.extension.IMethodInvocation)">intercept</a></strong>(<a href='../../../../org.spockframework.runtime.extension.IMethodInvocation.html'>IMethodInvocation</a> invocation)</code><br></td>
+                            <td class="colLast"><code>public&nbsp;static&nbsp;java.util.Map&lt;?, ?&gt;</code></td>
+                            <td class="colLast"><code><strong><a href="#currentAttrs()">currentAttrs</a></strong>()</code><br></td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>public&nbsp;static&nbsp;groovy.lang.Closure&lt;?&gt;</code></td>
+                            <td class="colLast"><code><strong><a href="#currentBody()">currentBody</a></strong>()</code><br></td>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>public&nbsp;static&nbsp;void</code></td>
+                            <td class="colLast"><code><strong><a href="#pop()">pop</a></strong>()</code><br></td>
+                        </tr>
+                        
+                        <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>public&nbsp;static&nbsp;void</code></td>
+                            <td class="colLast"><code><strong><a href="#push(Map, Closure)">push</a></strong>(java.util.Map&lt;?, ?&gt; attrs, groovy.lang.Closure&lt;?&gt; body)</code><br></td>
                         </tr>
                         
                     </table>
@@ -216,38 +206,44 @@ implements <a href='../../../../org.spockframework.runtime.extension.IMethodInte
             
 
             
-            <!-- =========== CONSTRUCTOR DETAIL =========== -->
+
+
+            
+            <!-- =========== METHOD DETAIL =========== -->
             <ul class="blockList">
-                <li class="blockList"><a name="constructor_detail">
+                <li class="blockList"><a name="method_detail">
                     <!--   -->
                 </a>
-                    <h3>Constructor Detail</h3>
+                    <h3>Method Detail</h3>
                     
-                        <a name="UrlMappingSetupSpecInterceptor()"><!-- --></a>
+                        <a name="currentAttrs()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4><strong>UrlMappingSetupSpecInterceptor</strong>()</h4>
+                                <h4>public&nbsp;static&nbsp;java.util.Map&lt;?, ?&gt; <strong>currentAttrs</strong>()</h4>
                                 <p></p>
                             </li>
                         </ul>
                     
-                </li>
-            </ul>
-            
-
-
-            
-            <!-- =========== METHOD DETAIL =========== -->
-            <ul class="blockList">
-                <li class="blockList"><a name="method_detail">
-                    <!--   -->
-                </a>
-                    <h3>Method Detail</h3>
+                        <a name="currentBody()"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>public&nbsp;static&nbsp;groovy.lang.Closure&lt;?&gt; <strong>currentBody</strong>()</h4>
+                                <p></p>
+                            </li>
+                        </ul>
+                    
+                        <a name="pop()"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>public&nbsp;static&nbsp;void <strong>pop</strong>()</h4>
+                                <p></p>
+                            </li>
+                        </ul>
                     
-                        <a name="intercept(org.spockframework.runtime.extension.IMethodInvocation)"><!-- --></a>
+                        <a name="push(Map, Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>@java.lang.Override<br>void <strong>intercept</strong>(<a href='../../../../org.spockframework.runtime.extension.IMethodInvocation.html'>IMethodInvocation</a> invocation)</h4>
+                                <h4>public&nbsp;static&nbsp;void <strong>push</strong>(java.util.Map&lt;?, ?&gt; attrs, groovy.lang.Closure&lt;?&gt; body)</h4>
                                 <p></p>
                             </li>
                         </ul>
@@ -267,30 +263,30 @@ implements <a href='../../../../org.spockframework.runtime.extension.IMethodInte
     <!--   -->
 </a>
     <ul class="navList" title="Navigation">
-        <li><a href="../../../../overview-summary.html">Overview</a></li>
+        <li><a href="../../../overview-summary.html">Overview</a></li>
         <li><a href="package-summary.html">Package</a></li>
         <li class="navBarCell1Rev">Class</li>
-        <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
-        <li><a href="../../../../index-all.html">Index</a></li>
-        <li><a href="../../../../help-doc.html">Help</a></li>
+        <li><a href="../../../deprecated-list.html">Deprecated</a></li>
+        <li><a href="../../../index-all.html">Index</a></li>
+        <li><a href="../../../help-doc.html">Help</a></li>
     </ul>
 </div>
 
 <div class="subNav">
     <div>
         <ul class="navList">
-            <li><a href="../../../../index.html?org/grails/testing/spock/UrlMappingSetupSpecInterceptor" target="_top">Frames</a></li>
-            <li><a href="UrlMappingSetupSpecInterceptor.html" target="_top">No Frames</a></li>
+            <li><a href="../../../index.html?org/grails/taglib/TagMethodContext" target="_top">Frames</a></li>
+            <li><a href="TagMethodContext.html" target="_top">No Frames</a></li>
         </ul>
     </div>
     <div>
         <ul class="subNavList">
             <li>Summary:&nbsp;</li>
-            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<li><a href="#constructor_summary">Constructor</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
+            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
         <ul class="subNavList">
             <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
-            Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<li><a href="#constructor_detail">Constructor</a></li>&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
+            Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
     </div>
     <p><!-- Matomo -->
diff --git a/docs/snapshot/api/grails/testing/web/taglib/TagLibUnitTest.html b/docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html
similarity index 60%
copy from docs/snapshot/api/grails/testing/web/taglib/TagLibUnitTest.html
copy to docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html
index f9937e6999e..7adb2271ea2 100644
--- a/docs/snapshot/api/grails/testing/web/taglib/TagLibUnitTest.html
+++ b/docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html
@@ -27,17 +27,17 @@
 <html>
 <head>
     <!-- Generated by groovydoc (4.0.32) -->
-    <title>TagLibUnitTest (Grails 8.0.0-SNAPSHOT)</title>
+    <title>TagMethodInvoker (Grails 8.0.0-SNAPSHOT)</title>
     
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-    <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
-    <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
-    <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
+    <link href="../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+    <link href="../../../groovy.ico" type="image/x-icon" rel="icon">
+    <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
 
 <body class="center">
 <script type="text/javascript"><!--
 if (location.href.indexOf('is-external=true') == -1) {
-    parent.document.title="TagLibUnitTest (Grails 8.0.0-SNAPSHOT)";
+    parent.document.title="TagMethodInvoker (Grails 8.0.0-SNAPSHOT)";
 }
 //-->
 </script>
@@ -51,30 +51,30 @@ if (location.href.indexOf('is-external=true') == -1) {
     <!--   -->
 </a>
     <ul class="navList" title="Navigation">
-        <li><a href="../../../../overview-summary.html">Overview</a></li>
+        <li><a href="../../../overview-summary.html">Overview</a></li>
         <li><a href="package-summary.html">Package</a></li>
         <li class="navBarCell1Rev">Class</li>
-        <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
-        <li><a href="../../../../index-all.html">Index</a></li>
-        <li><a href="../../../../help-doc.html">Help</a></li>
+        <li><a href="../../../deprecated-list.html">Deprecated</a></li>
+        <li><a href="../../../index-all.html">Index</a></li>
+        <li><a href="../../../help-doc.html">Help</a></li>
     </ul>
 </div>
 
 <div class="subNav">
     <div>
         <ul class="navList">
-            <li><a href="../../../../index.html?grails/testing/web/taglib/TagLibUnitTest" target="_top">Frames</a></li>
-            <li><a href="TagLibUnitTest.html" target="_top">No Frames</a></li>
+            <li><a href="../../../index.html?org/grails/taglib/TagMethodInvoker" target="_top">Frames</a></li>
+            <li><a href="TagMethodInvoker.html" target="_top">No Frames</a></li>
         </ul>
     </div>
     <div>
         <ul class="subNavList">
             <li>Summary:&nbsp;</li>
-            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
+            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
         <ul class="subNavList">
             <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
-            Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
+            Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
     </div>
     <a name="skip-navbar_top">
@@ -85,32 +85,24 @@ if (location.href.indexOf('is-external=true') == -1) {
 <!-- ======== START OF CLASS DATA ======== -->
 <div class="header">
 
-    <div class="subTitle">Package: <strong>grails.testing.web.taglib</strong></div>
+    <div class="subTitle">Package: <strong>org.grails.taglib</strong></div>
 
-    <h2 title="[Groovy] Trait TagLibUnitTest&lt;T&gt;" class="title">[Groovy] Trait TagLibUnitTest&lt;T&gt;</h2>
+    <h2 title="[Java] Class TagMethodInvoker" class="title">[Java] Class TagMethodInvoker</h2>
 </div>
 <div class="contentContainer">
 <ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>grails.testing.web.taglib.TagLibUnitTest
+<li><ul class="inheritance"></ul></li><li>org.grails.taglib.TagMethodInvoker
 </ul>
 <div class="description">
     <ul class="blockList">
         <li class="blockList">
 
-            <dl>
-                <dt>All Implemented Interfaces and Traits:</dt>
-                <dd><a href='../../../../grails/testing/web/GrailsWebUnitTest.html'>GrailsWebUnitTest</a>, ParameterizedGrailsUnitTest&lt;T&gt;</dd>
-            </dl>
-    
 
             <!-- todo: direct known subclasses -->
             <hr>
 
-<pre>@groovy.transform.Trait
-@groovy.transform.CompileStatic
-trait TagLibUnitTest&lt;T&gt;
-extends java.lang.Object
-implements <a href='../../../../grails/testing/web/GrailsWebUnitTest.html'>GrailsWebUnitTest</a>, ParameterizedGrailsUnitTest&lt;T&gt;</pre>
+<pre>public final class TagMethodInvoker
+extends java.lang.Object</pre>
 
           </li>
     </ul>
@@ -152,39 +144,44 @@ implements <a href='../../../../grails/testing/web/GrailsWebUnitTest.html'>Grail
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>java.lang.String</code></td>
-                            <td class="colLast"><code><strong><a href="#applyTemplate(java.lang.String, java.util.Map)">applyTemplate</a></strong>(java.lang.String contents, java.util.Map model)</code><br>Renders a template for the given contents and model</td>
+                            <td class="colLast"><code>protected&nbsp;java.util.Map&lt;java.lang.String, java.lang.reflect.Field&gt;</code></td>
+                            <td class="colLast"><code><strong><a href="#computeValue(Class)">computeValue</a></strong>(java.lang.Class&lt;?&gt; type)</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>void</code></td>
-                            <td class="colLast"><code><strong><a href="#applyTemplate(java.io.StringWriter, java.lang.String, java.util.Map)">applyTemplate</a></strong>(java.io.StringWriter sw, java.lang.String template, java.util.Map params)</code><br></td>
+                            <td class="colLast"><code>protected&nbsp;java.util.Map&lt;java.lang.String, java.util.List&lt;java.lang.reflect.Method&gt;&gt;</code></td>
+                            <td class="colLast"><code><strong><a href="#computeValue(Class)">computeValue</a></strong>(java.lang.Class&lt;?&gt; type)</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>java.lang.String</code></td>
-                            <td class="colLast"><code><strong><a href="#getBeanName(Class)">getBeanName</a></strong>(java.lang.Class&lt;?&gt; tagLibClass)</code><br></td>
+                            <td class="colLast"><code>public&nbsp;static&nbsp;java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#getClosureTagProperty(groovy.lang.GroovyObject, java.lang.String)">getClosureTagProperty</a></strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>boolean</code></td>
-                            <td class="colLast"><code><strong><a href="#getPurgeTagLibMetaClass()">getPurgeTagLibMetaClass</a></strong>()</code><br></td>
+                            <td class="colLast"><code>public&nbsp;static&nbsp;java.util.Collection&lt;java.lang.String&gt;</code></td>
+                            <td class="colLast"><code><strong><a href="#getInvokableTagMethodNames(Class)">getInvokableTagMethodNames</a></strong>(java.lang.Class&lt;?&gt; tagLibClass)</code><br></td>
                         </tr>
                         
                         <tr class="altColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>T</code></td>
-                            <td class="colLast"><code><strong><a href="#getTagLib()">getTagLib</a></strong>()</code><br></td>
+                            <td class="colLast"><code>public&nbsp;static&nbsp;boolean</code></td>
+                            <td class="colLast"><code><strong><a href="#hasInvokableTagMethod(groovy.lang.GroovyObject, java.lang.String)">hasInvokableTagMethod</a></strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</code><br></td>
                         </tr>
                         
                         <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
-                            <td class="colLast"><code>void</code></td>
-                            <td class="colLast"><code><strong><a href="#mockArtefact(Class)">mockArtefact</a></strong>(java.lang.Class&lt;?&gt; tagLibClass)</code><br>Mocks a tag library, making it available to subsequent calls to controllers mocked via
- <a href='#mockArtefact(java.lang.Class)'>mockArtefact(Class)</a> and GSPs rendered via <a href='#applyTemplate(java.lang.String, java.util.Map)'>applyTemplate(String, Map)</a></td>
+                            <td class="colLast"><code>public&nbsp;static&nbsp;java.lang.Object</code></td>
+                            <td class="colLast"><code><strong><a href="#invokeTagMethod(groovy.lang.GroovyObject, java.lang.String, Map, Closure)">invokeTagMethod</a></strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName, java.util.Map&lt;?, ?&gt; attrs, groovy.lang.Closure&lt;?&gt; body)</code><br></td>
+                        </tr>
+                        
+                        <tr class="altColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>public&nbsp;static&nbsp;boolean</code></td>
+                            <td class="colLast"><code><strong><a href="#isTagMethodCandidate(java.lang.reflect.Method)">isTagMethodCandidate</a></strong>(java.lang.reflect.Method method)</code><br></td>
                         </tr>
                         
                     </table>
@@ -237,52 +234,59 @@ implements <a href='../../../../grails/testing/web/GrailsWebUnitTest.html'>Grail
                 </a>
                     <h3>Method Detail</h3>
                     
-                        <a name="applyTemplate(java.lang.String, java.util.Map)"><!-- --></a>
+                        <a name="computeValue(Class)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>java.lang.String <strong>applyTemplate</strong>(java.lang.String contents, java.util.Map model)</h4>
-                                <p> Renders a template for the given contents and model <DL><DT><B>Parameters:</B></DT><DD><code>contents</code> -  The contents</DD><DD><code>model</code> -  The model</DD></DL><DL><DT><B>Returns:</B></DT><DD>The rendered template</DD></DL></p>
+                                <h4>@java.lang.Override<br>protected&nbsp;java.util.Map&lt;java.lang.String, java.lang.reflect.Field&gt; <strong>computeValue</strong>(java.lang.Class&lt;?&gt; type)</h4>
+                                <p></p>
                             </li>
                         </ul>
                     
-                        <a name="applyTemplate(java.io.StringWriter, java.lang.String, java.util.Map)"><!-- --></a>
+                        <a name="computeValue(Class)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>void <strong>applyTemplate</strong>(java.io.StringWriter sw, java.lang.String template, java.util.Map params)</h4>
+                                <h4>@java.lang.Override<br>protected&nbsp;java.util.Map&lt;java.lang.String, java.util.List&lt;java.lang.reflect.Method&gt;&gt; <strong>computeValue</strong>(java.lang.Class&lt;?&gt; type)</h4>
                                 <p></p>
                             </li>
                         </ul>
                     
-                        <a name="getBeanName(Class)"><!-- --></a>
+                        <a name="getClosureTagProperty(groovy.lang.GroovyObject, java.lang.String)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>java.lang.String <strong>getBeanName</strong>(java.lang.Class&lt;?&gt; tagLibClass)</h4>
+                                <h4>public&nbsp;static&nbsp;java.lang.Object <strong>getClosureTagProperty</strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</h4>
                                 <p></p>
                             </li>
                         </ul>
                     
-                        <a name="getPurgeTagLibMetaClass()"><!-- --></a>
+                        <a name="getInvokableTagMethodNames(Class)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>boolean <strong>getPurgeTagLibMetaClass</strong>()</h4>
+                                <h4>public&nbsp;static&nbsp;java.util.Collection&lt;java.lang.String&gt; <strong>getInvokableTagMethodNames</strong>(java.lang.Class&lt;?&gt; tagLibClass)</h4>
                                 <p></p>
                             </li>
                         </ul>
                     
-                        <a name="getTagLib()"><!-- --></a>
+                        <a name="hasInvokableTagMethod(groovy.lang.GroovyObject, java.lang.String)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>T <strong>getTagLib</strong>()</h4>
+                                <h4>public&nbsp;static&nbsp;boolean <strong>hasInvokableTagMethod</strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</h4>
                                 <p></p>
                             </li>
                         </ul>
                     
-                        <a name="mockArtefact(Class)"><!-- --></a>
+                        <a name="invokeTagMethod(groovy.lang.GroovyObject, java.lang.String, Map, Closure)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4>void <strong>mockArtefact</strong>(java.lang.Class&lt;?&gt; tagLibClass)</h4>
-                                <p> Mocks a tag library, making it available to subsequent calls to controllers mocked via
- <a href='#mockArtefact(java.lang.Class)'>mockArtefact(Class)</a> and GSPs rendered via <a href='#applyTemplate(java.lang.String, java.util.Map)'>applyTemplate(String, Map)</a> <DL><DT><B>Parameters:</B></DT><DD><code>tagLibClass</code> -  The tag library class</DD></DL><DL><DT><B>Returns:</B></DT><DD>The tag library instance</DD></DL></p>
+                                <h4>public&nbsp;static&nbsp;java.lang.Object <strong>invokeTagMethod</strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName, java.util.Map&lt;?, ?&gt; attrs, groovy.lang.Closure&lt;?&gt; body)</h4>
+                                <p></p>
+                            </li>
+                        </ul>
+                    
+                        <a name="isTagMethodCandidate(java.lang.reflect.Method)"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>public&nbsp;static&nbsp;boolean <strong>isTagMethodCandidate</strong>(java.lang.reflect.Method method)</h4>
+                                <p></p>
                             </li>
                         </ul>
                     
@@ -301,30 +305,30 @@ implements <a href='../../../../grails/testing/web/GrailsWebUnitTest.html'>Grail
     <!--   -->
 </a>
     <ul class="navList" title="Navigation">
-        <li><a href="../../../../overview-summary.html">Overview</a></li>
+        <li><a href="../../../overview-summary.html">Overview</a></li>
         <li><a href="package-summary.html">Package</a></li>
         <li class="navBarCell1Rev">Class</li>
-        <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
-        <li><a href="../../../../index-all.html">Index</a></li>
-        <li><a href="../../../../help-doc.html">Help</a></li>
+        <li><a href="../../../deprecated-list.html">Deprecated</a></li>
+        <li><a href="../../../index-all.html">Index</a></li>
+        <li><a href="../../../help-doc.html">Help</a></li>
     </ul>
 </div>
 
 <div class="subNav">
     <div>
         <ul class="navList">
-            <li><a href="../../../../index.html?grails/testing/web/taglib/TagLibUnitTest" target="_top">Frames</a></li>
-            <li><a href="TagLibUnitTest.html" target="_top">No Frames</a></li>
+            <li><a href="../../../index.html?org/grails/taglib/TagMethodInvoker" target="_top">Frames</a></li>
+            <li><a href="TagMethodInvoker.html" target="_top">No Frames</a></li>
         </ul>
     </div>
     <div>
         <ul class="subNavList">
             <li>Summary:&nbsp;</li>
-            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
+            Nested&nbsp;&nbsp;&nbsp;Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_summary">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
         <ul class="subNavList">
             <li>&nbsp;|&nbsp;Detail:&nbsp;</li>
-            Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
+            Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;&nbsp;&nbsp;<li><a href="#method_detail">Method</a></li>&nbsp;&nbsp;&nbsp;
         </ul>
     </div>
     <p><!-- Matomo -->
diff --git a/docs/snapshot/api/org/grails/taglib/package-frame.html b/docs/snapshot/api/org/grails/taglib/package-frame.html
index 76a429c9461..706822aede9 100644
--- a/docs/snapshot/api/org/grails/taglib/package-frame.html
+++ b/docs/snapshot/api/org/grails/taglib/package-frame.html
@@ -43,7 +43,7 @@
 <div class="indexContainer">
     <h2>Classes</h2>
     <ul>
-        <li><a href="AbstractTemplateVariableBinding.html" title="class in org.grails.taglib" target="classFrame">AbstractTemplateVariableBinding</a></li><li><a href="AbstractTemplateVariableBinding.BindingMapEntry.html" title="class in org.grails.taglib" target="classFrame">AbstractTemplateVariableBinding.BindingMapEntry</a></li><li><a href="AbstractTemplateVariableBinding.TemplateVariableBindingMap.html" title="class in org.grails.taglib" target="classFrame">AbstractTemplateVariableBin [...]
+        <li><a href="AbstractTemplateVariableBinding.html" title="class in org.grails.taglib" target="classFrame">AbstractTemplateVariableBinding</a></li><li><a href="AbstractTemplateVariableBinding.BindingMapEntry.html" title="class in org.grails.taglib" target="classFrame">AbstractTemplateVariableBinding.BindingMapEntry</a></li><li><a href="AbstractTemplateVariableBinding.TemplateVariableBindingMap.html" title="class in org.grails.taglib" target="classFrame">AbstractTemplateVariableBin [...]
     </ul>
 </div>
 
diff --git a/docs/snapshot/api/org/grails/taglib/package-summary.html b/docs/snapshot/api/org/grails/taglib/package-summary.html
index 60dde27fb47..4d073928ee6 100644
--- a/docs/snapshot/api/org/grails/taglib/package-summary.html
+++ b/docs/snapshot/api/org/grails/taglib/package-summary.html
@@ -171,6 +171,22 @@ function windowTitle()
                             </td>
                             <td></td>
                         </tr>
+<tr class="altColor">
+                            <td class="colOne">
+                                <strong><a href="TagMethodContext.html" title="class in org/grails/taglib">
+                                    TagMethodContext
+                                </a></strong>
+                            </td>
+                            <td></td>
+                        </tr>
+<tr class="altColor">
+                            <td class="colOne">
+                                <strong><a href="TagMethodInvoker.html" title="class in org/grails/taglib">
+                                    TagMethodInvoker
+                                </a></strong>
+                            </td>
+                            <td></td>
+                        </tr>
 <tr class="altColor">
                             <td class="colOne">
                                 <strong><a href="TagOutput.html" title="class in org/grails/taglib">
diff --git a/docs/snapshot/api/org/grails/testing/runtime/support/LazyTagLibraryLookup.html b/docs/snapshot/api/org/grails/testing/runtime/support/LazyTagLibraryLookup.html
index 6d75cc3070c..4ad0b38adcb 100644
--- a/docs/snapshot/api/org/grails/testing/runtime/support/LazyTagLibraryLookup.html
+++ b/docs/snapshot/api/org/grails/testing/runtime/support/LazyTagLibraryLookup.html
@@ -195,30 +195,36 @@ extends <a href='../../../../../org/grails/taglib/TagLibraryLookup.html'>TagLibr
                         </tr>
                         
                         <tr class="rowColor">
+                            <td class="colFirst"><code></code></td>
+                            <td class="colLast"><code>public&nbsp;void</code></td>
+                            <td class="colLast"><code><strong><a href="#clear()">clear</a></strong>()</code><br></td>
+                        </tr>
+                        
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;groovy.lang.GroovyObject</code></td>
                             <td class="colLast"><code><strong><a href="#lookupTagLibrary(java.lang.String, java.lang.String)">lookupTagLibrary</a></strong>(java.lang.String namespace, java.lang.String tagName)</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>protected&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a href="#putTagLib(Map, java.lang.String, grails.core.gsp.GrailsTagLibClass)">putTagLib</a></strong>(java.util.Map&lt;java.lang.String, java.lang.Object&gt; tags, java.lang.String name, <a href='../../../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> taglib)</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>public&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a href="#registerLazyLoadableTagLibClass(java.lang.Class)">registerLazyLoadableTagLibClass</a></strong>(java.lang.Class tagLibClass)</code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>protected&nbsp;void</code></td>
                             <td class="colLast"><code><strong><a href="#registerTagLibraries()">registerTagLibraries</a></strong>()</code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code></code></td>
                             <td class="colLast"><code>protected&nbsp;java.lang.String</code></td>
                             <td class="colLast"><code><strong><a href="#tagNameKey(java.lang.String, java.lang.String)">tagNameKey</a></strong>(java.lang.String namespace, java.lang.String tagName)</code><br></td>
@@ -240,7 +246,7 @@ extends <a href='../../../../../org/grails/taglib/TagLibraryLookup.html'>TagLibr
                         
                         <tr class="altColor">
                             <td class="colFirst"><code>class <a href='../../../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a></code></td>
-                            <td class="colLast"><code><a href='../../../../../org/grails/taglib/TagLibraryLookup.html#afterPropertiesSet()'>afterPropertiesSet</a>, <a href='../../../../../org/grails/taglib/TagLibraryLookup.html#doesTagReturnObject(java.lang.String, java.lang.String)'>doesTagReturnObject</a>, <a href='../../../../../org/grails/taglib/TagLibraryLookup.html#getAvailableNamespaces()'>getAvailableNamespaces</a>, <a href='../../../../../org/grails/taglib/TagLibraryLookup.html# [...]
+                            <td class="colLast"><code><a href='../../../../../org/grails/taglib/TagLibraryLookup.html#afterPropertiesSet()'>afterPropertiesSet</a>, <a href='../../../../../org/grails/taglib/TagLibraryLookup.html#clear()'>clear</a>, <a href='../../../../../org/grails/taglib/TagLibraryLookup.html#doesTagReturnObject(java.lang.String, java.lang.String)'>doesTagReturnObject</a>, <a href='../../../../../org/grails/taglib/TagLibraryLookup.html#getAvailableNamespaces()'>getAvail [...]
                         </tr>
                     </table>
                    </ul>
@@ -300,6 +306,14 @@ extends <a href='../../../../../org/grails/taglib/TagLibraryLookup.html'>TagLibr
                             </li>
                         </ul>
                     
+                        <a name="clear()"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4>@java.lang.Override<br>public&nbsp;void <strong>clear</strong>()</h4>
+                                <p></p>
+                            </li>
+                        </ul>
+                    
                         <a name="lookupTagLibrary(java.lang.String, java.lang.String)"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
diff --git a/docs/snapshot/api/org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html b/docs/snapshot/api/org/grails/testing/spock/UrlMappingCleanupInterceptor.html
similarity index 91%
copy from docs/snapshot/api/org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html
copy to docs/snapshot/api/org/grails/testing/spock/UrlMappingCleanupInterceptor.html
index bd7af3ec836..52bb5e2cada 100644
--- a/docs/snapshot/api/org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html
+++ b/docs/snapshot/api/org/grails/testing/spock/UrlMappingCleanupInterceptor.html
@@ -27,7 +27,7 @@
 <html>
 <head>
     <!-- Generated by groovydoc (4.0.32) -->
-    <title>UrlMappingSetupSpecInterceptor (Grails 8.0.0-SNAPSHOT)</title>
+    <title>UrlMappingCleanupInterceptor (Grails 8.0.0-SNAPSHOT)</title>
     
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
@@ -37,7 +37,7 @@
 <body class="center">
 <script type="text/javascript"><!--
 if (location.href.indexOf('is-external=true') == -1) {
-    parent.document.title="UrlMappingSetupSpecInterceptor (Grails 8.0.0-SNAPSHOT)";
+    parent.document.title="UrlMappingCleanupInterceptor (Grails 8.0.0-SNAPSHOT)";
 }
 //-->
 </script>
@@ -63,8 +63,8 @@ if (location.href.indexOf('is-external=true') == -1) {
 <div class="subNav">
     <div>
         <ul class="navList">
-            <li><a href="../../../../index.html?org/grails/testing/spock/UrlMappingSetupSpecInterceptor" target="_top">Frames</a></li>
-            <li><a href="UrlMappingSetupSpecInterceptor.html" target="_top">No Frames</a></li>
+            <li><a href="../../../../index.html?org/grails/testing/spock/UrlMappingCleanupInterceptor" target="_top">Frames</a></li>
+            <li><a href="UrlMappingCleanupInterceptor.html" target="_top">No Frames</a></li>
         </ul>
     </div>
     <div>
@@ -87,11 +87,11 @@ if (location.href.indexOf('is-external=true') == -1) {
 
     <div class="subTitle">Package: <strong>org.grails.testing.spock</strong></div>
 
-    <h2 title="[Groovy] Class UrlMappingSetupSpecInterceptor" class="title">[Groovy] Class UrlMappingSetupSpecInterceptor</h2>
+    <h2 title="[Groovy] Class UrlMappingCleanupInterceptor" class="title">[Groovy] Class UrlMappingCleanupInterceptor</h2>
 </div>
 <div class="contentContainer">
 <ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.testing.spock.UrlMappingSetupSpecInterceptor
+<li><ul class="inheritance"></ul></li><li>org.grails.testing.spock.UrlMappingCleanupInterceptor
 </ul>
 <div class="description">
     <ul class="blockList">
@@ -107,10 +107,14 @@ if (location.href.indexOf('is-external=true') == -1) {
             <hr>
 
 <pre>@groovy.transform.CompileStatic
-class UrlMappingSetupSpecInterceptor
+class UrlMappingCleanupInterceptor
 extends java.lang.Object
 implements <a href='../../../../org.spockframework.runtime.extension.IMethodInterceptor.html'>IMethodInterceptor</a></pre>
 
+    <p> Clears URL mapping artefacts and the cached holder bean after each feature method so that
+ other specs running later in the same JVM (including specs that don't implement
+ UrlMappingsUnitTest) start from a clean URL mappings registry.</p>
+
           </li>
     </ul>
 </div>
@@ -146,7 +150,7 @@ implements <a href='../../../../org.spockframework.runtime.extension.IMethodInte
                         
                         <tr class="altColor">
                             <td class="colFirst">
-                                <code><strong><a href="#UrlMappingSetupSpecInterceptor()">UrlMappingSetupSpecInterceptor</a></strong>()</code><br></td>
+                                <code><strong><a href="#UrlMappingCleanupInterceptor()">UrlMappingCleanupInterceptor</a></strong>()</code><br></td>
                         </tr>
                         
                     </table>
@@ -223,10 +227,10 @@ implements <a href='../../../../org.spockframework.runtime.extension.IMethodInte
                 </a>
                     <h3>Constructor Detail</h3>
                     
-                        <a name="UrlMappingSetupSpecInterceptor()"><!-- --></a>
+                        <a name="UrlMappingCleanupInterceptor()"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
-                                <h4><strong>UrlMappingSetupSpecInterceptor</strong>()</h4>
+                                <h4><strong>UrlMappingCleanupInterceptor</strong>()</h4>
                                 <p></p>
                             </li>
                         </ul>
@@ -279,8 +283,8 @@ implements <a href='../../../../org.spockframework.runtime.extension.IMethodInte
 <div class="subNav">
     <div>
         <ul class="navList">
-            <li><a href="../../../../index.html?org/grails/testing/spock/UrlMappingSetupSpecInterceptor" target="_top">Frames</a></li>
-            <li><a href="UrlMappingSetupSpecInterceptor.html" target="_top">No Frames</a></li>
+            <li><a href="../../../../index.html?org/grails/testing/spock/UrlMappingCleanupInterceptor" target="_top">Frames</a></li>
+            <li><a href="UrlMappingCleanupInterceptor.html" target="_top">No Frames</a></li>
         </ul>
     </div>
     <div>
diff --git a/docs/snapshot/api/org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html b/docs/snapshot/api/org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html
index bd7af3ec836..7fa7818bdcf 100644
--- a/docs/snapshot/api/org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html
+++ b/docs/snapshot/api/org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html
@@ -111,6 +111,14 @@ class UrlMappingSetupSpecInterceptor
 extends java.lang.Object
 implements <a href='../../../../org.spockframework.runtime.extension.IMethodInterceptor.html'>IMethodInterceptor</a></pre>
 
+    <p> Wires up controllers and URL mappings for UrlMappingsUnitTest-based specs.
+
+ Acts as both a <CODE>setupSpec</CODE> interceptor (mocking declared controllers once per spec
+ class) and a <CODE>setup</CODE> interceptor (re-registering this spec's URL mappings before
+ every feature method). The per-feature pass guarantees that a spec running after another
+ spec in the same JVM sees only its own URL mappings, regardless of what the previous spec
+ did to the artefact registry or the <CODE>grailsUrlMappingsHolder</CODE> bean.</p>
+
           </li>
     </ul>
 </div>
diff --git a/docs/snapshot/api/org/grails/testing/spock/WebTestingSupportExtension.html b/docs/snapshot/api/org/grails/testing/spock/WebTestingSupportExtension.html
index 62d8c876ae9..46e2308bf2a 100644
--- a/docs/snapshot/api/org/grails/testing/spock/WebTestingSupportExtension.html
+++ b/docs/snapshot/api/org/grails/testing/spock/WebTestingSupportExtension.html
@@ -139,26 +139,31 @@ extends <a href='../../../../org.spockframework.runtime.extension.AbstractGlobal
                         </tr>
                         
                         <tr class="rowColor">
+                            <td class="colFirst"><code><strong><a href='../../../../org/grails/testing/spock/UrlMappingCleanupInterceptor.html'>UrlMappingCleanupInterceptor</a></strong></code>&nbsp;</td>
+                            <td class="colLast"><code><a href="#urlMappingCleanupInterceptor">urlMappingCleanupInterceptor</a></code><br></td>
+                        </tr>
+                        
+                        <tr class="altColor">
                             <td class="colFirst"><code><strong><a href='../../../../org/grails/testing/spock/UrlMappingSetupSpecInterceptor.html'>UrlMappingSetupSpecInterceptor</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#urlMappingSetupSpecInterceptor">urlMappingSetupSpecInterceptor</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code><strong><a href='../../../../org/grails/testing/spock/WebCleanupInterceptor.html'>WebCleanupInterceptor</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#webCleanupInterceptor">webCleanupInterceptor</a></code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code><strong><a href='../../../../org/grails/testing/spock/WebCleanupSpecInterceptor.html'>WebCleanupSpecInterceptor</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#webCleanupSpecInterceptor">webCleanupSpecInterceptor</a></code><br></td>
                         </tr>
                         
-                        <tr class="altColor">
+                        <tr class="rowColor">
                             <td class="colFirst"><code><strong><a href='../../../../org/grails/testing/spock/WebSetupInterceptor.html'>WebSetupInterceptor</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#webSetupInterceptor">webSetupInterceptor</a></code><br></td>
                         </tr>
                         
-                        <tr class="rowColor">
+                        <tr class="altColor">
                             <td class="colFirst"><code><strong><a href='../../../../org/grails/testing/spock/WebSetupSpecInterceptor.html'>WebSetupSpecInterceptor</a></strong></code>&nbsp;</td>
                             <td class="colLast"><code><a href="#webSetupSpecInterceptor">webSetupSpecInterceptor</a></code><br></td>
                         </tr>
@@ -250,6 +255,14 @@ extends <a href='../../../../org.spockframework.runtime.extension.AbstractGlobal
                             </li>
                         </ul>
                     
+                        <a name="urlMappingCleanupInterceptor"><!-- --></a>
+                        <ul class="blockListLast">
+                            <li class="blockList">
+                                <h4><a href='../../../../org/grails/testing/spock/UrlMappingCleanupInterceptor.html'>UrlMappingCleanupInterceptor</a> <strong>urlMappingCleanupInterceptor</strong></h4>
+                                <p></p>
+                            </li>
+                        </ul>
+                    
                         <a name="urlMappingSetupSpecInterceptor"><!-- --></a>
                         <ul class="blockListLast">
                             <li class="blockList">
diff --git a/docs/snapshot/api/org/grails/testing/spock/package-frame.html b/docs/snapshot/api/org/grails/testing/spock/package-frame.html
index 041e80ab279..165874e4ed6 100644
--- a/docs/snapshot/api/org/grails/testing/spock/package-frame.html
+++ b/docs/snapshot/api/org/grails/testing/spock/package-frame.html
@@ -43,7 +43,7 @@
 <div class="indexContainer">
     <h2>Classes</h2>
     <ul>
-        <li><a href="AutowiredInterceptor.html" title="class in org.grails.testing.spock" target="classFrame">AutowiredInterceptor</a></li><li><a href="CleanupContextInterceptor.html" title="class in org.grails.testing.spock" target="classFrame">CleanupContextInterceptor</a></li><li><a href="InterceptorSetupSpecInterceptor.html" title="class in org.grails.testing.spock" target="classFrame">InterceptorSetupSpecInterceptor</a></li><li><a href="RunOnceExtension.html" title="class in org.gra [...]
+        <li><a href="AutowiredInterceptor.html" title="class in org.grails.testing.spock" target="classFrame">AutowiredInterceptor</a></li><li><a href="CleanupContextInterceptor.html" title="class in org.grails.testing.spock" target="classFrame">CleanupContextInterceptor</a></li><li><a href="InterceptorSetupSpecInterceptor.html" title="class in org.grails.testing.spock" target="classFrame">InterceptorSetupSpecInterceptor</a></li><li><a href="RunOnceExtension.html" title="class in org.gra [...]
     </ul>
 </div>
 
diff --git a/docs/snapshot/api/org/grails/testing/spock/package-summary.html b/docs/snapshot/api/org/grails/testing/spock/package-summary.html
index 2752b98c564..4c0bc1b0d5b 100644
--- a/docs/snapshot/api/org/grails/testing/spock/package-summary.html
+++ b/docs/snapshot/api/org/grails/testing/spock/package-summary.html
@@ -136,13 +136,23 @@ function windowTitle()
                             </td>
                             <td></td>
                         </tr>
+<tr class="altColor">
+                            <td class="colOne">
+                                <strong><a href="UrlMappingCleanupInterceptor.html" title="class in org/grails/testing/spock">
+                                    UrlMappingCleanupInterceptor
+                                </a></strong>
+                            </td>
+                            <td>Clears URL mapping artefacts and the cached holder bean after each feature method so that
+ other specs running later in the same JVM (including specs that don't implement
+ UrlMappingsUnitTest) start from a clean URL mappings registry.</td>
+                        </tr>
 <tr class="altColor">
                             <td class="colOne">
                                 <strong><a href="UrlMappingSetupSpecInterceptor.html" title="class in org/grails/testing/spock">
                                     UrlMappingSetupSpecInterceptor
                                 </a></strong>
                             </td>
-                            <td></td>
+                            <td>Wires up controllers and URL mappings for UrlMappingsUnitTest-based specs.</td>
                         </tr>
 <tr class="altColor">
                             <td class="colOne">
diff --git a/docs/snapshot/api/org/grails/web/pages/StandaloneTagLibraryLookup.html b/docs/snapshot/api/org/grails/web/pages/StandaloneTagLibraryLookup.html
index 8ea036fee87..fb58e2d022b 100644
--- a/docs/snapshot/api/org/grails/web/pages/StandaloneTagLibraryLookup.html
+++ b/docs/snapshot/api/org/grails/web/pages/StandaloneTagLibraryLookup.html
@@ -223,7 +223,7 @@ implements <a href='../../../../org.springframework.context.ApplicationListener.
                         
                         <tr class="altColor">
                             <td class="colFirst"><code>class <a href='../../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a></code></td>
-                            <td class="colLast"><code><a href='../../../../org/grails/taglib/TagLibraryLookup.html#afterPropertiesSet()'>afterPropertiesSet</a>, <a href='../../../../org/grails/taglib/TagLibraryLookup.html#doesTagReturnObject(java.lang.String, java.lang.String)'>doesTagReturnObject</a>, <a href='../../../../org/grails/taglib/TagLibraryLookup.html#getAvailableNamespaces()'>getAvailableNamespaces</a>, <a href='../../../../org/grails/taglib/TagLibraryLookup.html#getAvailable [...]
+                            <td class="colLast"><code><a href='../../../../org/grails/taglib/TagLibraryLookup.html#afterPropertiesSet()'>afterPropertiesSet</a>, <a href='../../../../org/grails/taglib/TagLibraryLookup.html#clear()'>clear</a>, <a href='../../../../org/grails/taglib/TagLibraryLookup.html#doesTagReturnObject(java.lang.String, java.lang.String)'>doesTagReturnObject</a>, <a href='../../../../org/grails/taglib/TagLibraryLookup.html#getAvailableNamespaces()'>getAvailableNamespac [...]
                         </tr>
                     </table>
                    </ul>
diff --git a/docs/snapshot/grails-data/developer-manual/gettingStarted.html b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
index 8a888e3cb67..cc13be83292 100644
--- a/docs/snapshot/grails-data/developer-manual/gettingStarted.html
+++ b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
@@ -523,7 +523,7 @@ cd grails-core</pre>
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-05-29 05:22:25 UTC
+Last updated 2026-05-30 15:15:46 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/introduction.html b/docs/snapshot/grails-data/developer-manual/introduction.html
index ce2e8576fb9..52197305a18 100644
--- a/docs/snapshot/grails-data/developer-manual/introduction.html
+++ b/docs/snapshot/grails-data/developer-manual/introduction.html
@@ -476,7 +476,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-05-29 05:22:25 UTC
+Last updated 2026-05-30 15:15:46 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/stepByStep.html b/docs/snapshot/grails-data/developer-manual/stepByStep.html
index 9f71677a7b1..ff5e3f5c408 100644
--- a/docs/snapshot/grails-data/developer-manual/stepByStep.html
+++ b/docs/snapshot/grails-data/developer-manual/stepByStep.html
@@ -621,7 +621,7 @@ class XyzTestSuite {
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-05-29 05:22:25 UTC
+Last updated 2026-05-30 15:15:46 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/testing.html b/docs/snapshot/grails-data/developer-manual/testing.html
index 29aa9444646..bbbb4562495 100644
--- a/docs/snapshot/grails-data/developer-manual/testing.html
+++ b/docs/snapshot/grails-data/developer-manual/testing.html
@@ -511,7 +511,7 @@ class PagedResultSpec extends GormDatastoreSpec{
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-05-29 05:22:25 UTC
+Last updated 2026-05-30 15:15:46 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi.html b/docs/snapshot/grails-data/developer-manual/understandingApi.html
index a62841b34ed..f28db8a0e08 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi.html
@@ -454,7 +454,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-05-29 05:22:25 UTC
+Last updated 2026-05-30 15:15:46 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html b/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
index 80724e6a62b..c3a01652840 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
@@ -561,7 +561,7 @@ protected Session createSession(PropertyResolver connDetails) {
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-05-29 05:22:25 UTC
+Last updated 2026-05-30 15:15:46 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html b/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
index 495bf389c09..c13f0a0c87c 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
@@ -496,7 +496,7 @@ class Neo4jEntityTraitProvider implements GormEntityTraitProvider {
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-05-29 05:22:25 UTC
+Last updated 2026-05-30 15:15:46 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html b/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
index d23e05f3b3c..3407677625d 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
@@ -488,7 +488,7 @@ enhancer.enhance()</code></pre>
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-05-29 05:22:25 UTC
+Last updated 2026-05-30 15:15:46 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
index ce7d57d614d..ee868f91af8 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
@@ -673,7 +673,7 @@ protected void deleteEntry(String family, final Object key, final Object entry)
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-05-29 05:22:25 UTC
+Last updated 2026-05-30 15:15:46 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
index f3d08ce49f4..c1c673a5ccb 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
@@ -588,7 +588,7 @@ If, for instance, the underlying datastore does not support the calculation of a
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-05-29 05:22:25 UTC
+Last updated 2026-05-30 15:15:46 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html b/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
index fcb74477ea9..6506aca6162 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
@@ -526,7 +526,7 @@ If the underlying datastore supports secondary indexes then it is ok to just ret
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-05-29 05:22:25 UTC
+Last updated 2026-05-30 15:15:46 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/grails-data/whats-new-manual/index.html b/docs/snapshot/grails-data/whats-new-manual/index.html
index ad8f89e0c93..72b177cd1c2 100644
--- a/docs/snapshot/grails-data/whats-new-manual/index.html
+++ b/docs/snapshot/grails-data/whats-new-manual/index.html
@@ -527,7 +527,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
 <div id="footer">
 <div id="footer-text">
 Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-05-29 05:22:25 UTC
+Last updated 2026-05-30 15:15:46 UTC
 </div>
 </div>
 </body>
diff --git a/docs/snapshot/guide/introduction.html b/docs/snapshot/guide/introduction.html
index 66f068af57b..d89b1d3a429 100644
--- a/docs/snapshot/guide/introduction.html
+++ b/docs/snapshot/guide/introduction.html
@@ -307,9 +307,17 @@ This release focuses on enhancing the developer experience, improving performanc
 Notable new features are included below.</p>
 </div>
 <div class="sect3">
-<h4 id="_no_new_features_at_this_time">No New Features at this time</h4>
+<h4 id="_gsp_tag_library_improvements">GSP Tag Library Improvements</h4>
 <div class="paragraph">
-<p>No new features at this time</p>
+<p>Grails 8 continues the move toward method-based TagLib handlers while preserving compatibility with existing closure-based tags.
+Method-defined tags now bind named attributes more predictably, exclude inherited framework and <code>Object</code> methods from tag dispatch, and preserve real namespace property getters.</p>
+</div>
+<div class="paragraph">
+<p>The Grails Gradle extension now defaults <code>preserveParameterNames</code> to <code>true</code>, so application Groovy compilation preserves method parameter names for features such as typed method TagLib arguments.</p>
+</div>
+<div class="paragraph">
+<p>Tag library unit tests also clean up and rebuild TagLib metadata automatically between features.
+Tests that use <code>TagLibUnitTest</code> no longer need to manage <code>purgeTagLibMetaClass</code>, and specs that mock additional tag libraries continue to work across feature methods.</p>
 </div>
 </div>
 </div>
diff --git a/docs/snapshot/guide/single.html b/docs/snapshot/guide/single.html
index e9b9d90fc22..0600f81097f 100644
--- a/docs/snapshot/guide/single.html
+++ b/docs/snapshot/guide/single.html
@@ -870,9 +870,17 @@ This release focuses on enhancing the developer experience, improving performanc
 Notable new features are included below.</p>
 </div>
 <div class="sect3">
-<h4 id="_no_new_features_at_this_time">No New Features at this time</h4>
+<h4 id="_gsp_tag_library_improvements">GSP Tag Library Improvements</h4>
 <div class="paragraph">
-<p>No new features at this time</p>
+<p>Grails 8 continues the move toward method-based TagLib handlers while preserving compatibility with existing closure-based tags.
+Method-defined tags now bind named attributes more predictably, exclude inherited framework and <code>Object</code> methods from tag dispatch, and preserve real namespace property getters.</p>
+</div>
+<div class="paragraph">
+<p>The Grails Gradle extension now defaults <code>preserveParameterNames</code> to <code>true</code>, so application Groovy compilation preserves method parameter names for features such as typed method TagLib arguments.</p>
+</div>
+<div class="paragraph">
+<p>Tag library unit tests also clean up and rebuild TagLib metadata automatically between features.
+Tests that use <code>TagLibUnitTest</code> no longer need to manage <code>purgeTagLibMetaClass</code>, and specs that mock additional tag libraries continue to work across feature methods.</p>
 </div>
 </div>
 </div>
@@ -3243,7 +3251,222 @@ The Spring annotations still work, so this is non-blocking, but new code should
 </div>
 </div>
 <div class="sect3">
-<h4 id="_20_known_plugin_incompatibilities">20. Known Plugin Incompatibilities</h4>
+<h4 id="_20_tag_library_test_cleanup_changes">20. Tag Library Test Cleanup Changes</h4>
+<div class="paragraph">
+<p>Grails 8 removes the <code>purgeTagLibMetaClass</code> test hook used by some web and TagLib unit tests.
+TagLib metaclass cleanup now happens automatically as part of the web test infrastructure, so test specs should delete any custom <code>purgeTagLibMetaClass</code> property or getter.</p>
+</div>
+<div class="paragraph">
+<p>If your tests use <code>TagLibUnitTest</code> and mock additional tag libraries with <code>mockTagLib(&#8230;&#8203;)</code> or <code>mockTagLibs(&#8230;&#8203;)</code>, those mocked tag libraries are rebuilt automatically between feature methods.
+No replacement flag is required.</p>
+</div>
+<div class="admonitionblock important">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-important" title="Important"></i>
+</td>
+<td class="content">
+Mocked tag libraries are cleared after each feature method.
+If your tests call <code>mockTagLib</code> directly (for example, when implementing <code>GrailsWebUnitTest</code> instead of <code>TagLibUnitTest</code>), move the call from <code>setupSpec()</code> to <code>setup()</code> so the mock is re-applied before every feature.
+<code>TagLibUnitTest</code> handles this automatically, but <code>GrailsWebUnitTest</code> does not.
+</td>
+</tr>
+</table>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="comment">// Before</span>
+<span class="type">class</span> <span class="class">MyTagLibSpec</span> <span class="directive">extends</span> Specification <span class="directive">implements</span> TagLibUnitTest&lt;MyTagLib&gt; {
+    <span class="type">boolean</span> getPurgeTagLibMetaClass() {
+        <span class="predefined-constant">true</span>
+    }
+}
+
+<span class="comment">// After</span>
+<span class="type">class</span> <span class="class">MyTagLibSpec</span> <span class="directive">extends</span> Specification <span class="directive">implements</span> TagLibUnitTest&lt;MyTagLib&gt; {
+}</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_21_method_based_taglib_handlers">21. Method-based TagLib Handlers</h4>
+<div class="paragraph">
+<p>Grails 8 introduces method-based tag handler syntax as the recommended way to define tags. Closure-based handlers are still supported for backward compatibility.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
+<span class="type">class</span> <span class="class">DemoTagLib</span> {
+    <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">demo</span><span class="delimiter">'</span></span>
+
+    <span class="keyword">def</span> <span class="function">greet</span>(<span class="predefined-type">Map</span> attrs) {
+        out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Hello, </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="content">!</span><span class="delimiter">&quot;</span></span>
+    }
+
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">greeting</span>(<span class="predefined-type">String</span> name) {
+        out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Hello, </span><span class="inline"><span class="inline-delimiter">${</span>name<span class="inline-delimiter">}</span></span><span class="content">!</span><span class="delimiter">&quot;</span></span>
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Method tags with the conventional signatures <code>def tag(Map attrs)</code>, <code>def tag(Closure body)</code>, and <code>def tag(Map attrs, Closure body)</code> are discovered automatically. Zero-argument method tags and method tags that bind named attributes directly to method parameters must use <code>@grails.gsp.Tag</code>; this avoids exposing ordinary public helper methods as tags.</p>
+</div>
+<div class="paragraph">
+<p>Grails Gradle application builds preserve Java and Groovy method parameter names by default (see §21.3 below). If you compile TagLib classes outside those plugins, enable Java <code>-parameters</code> and Groovy <code>groovyOptions.parameters = true</code> so <code>@Tag</code> methods can bind attributes by parameter name.</p>
+</div>
+<div class="paragraph">
+<p>To exclude a conventional public method from being exposed as a tag (for example, a helper that must remain public to satisfy an interface), annotate it with <code>@grails.gsp.NotATag</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.NotATag</span>
+
+<span class="type">class</span> <span class="class">DemoTagLib</span> {
+    <span class="keyword">def</span> <span class="function">greet</span>(<span class="predefined-type">Map</span> attrs) {
+        out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Hello, </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="content">!</span><span class="delimiter">&quot;</span></span>
+    }
+
+    <span class="annotation">@NotATag</span>
+    <span class="keyword">def</span> <span class="function">helper</span>(<span class="predefined-type">Map</span> attrs) { <span class="comment">/* ... */</span> }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The compile-time deprecation warning emitted for closure-based tag fields can be silenced by setting the system property <code>grails.taglib.warnDeprecatedClosures=false</code>.</p>
+</div>
+<div class="sect4">
+<h5 id="_21_1_behavior_change_tag_method_registration">21.1 Behavior change: tag method registration</h5>
+<div class="paragraph">
+<p>In Grails 7, the metaclass tag dispatchers registered for the taglib&#8217;s own namespace did not override existing methods. Because method-based tags are now real methods on the TagLib class, those dispatchers must override methods of the same name so that function-style invocation (for example <code>tagLib.myTag(attrs)</code>) returns captured tag output rather than writing directly to <code>out</code>.</p>
+</div>
+<div class="paragraph">
+<p>If a TagLib intentionally defines a method that shares a name with a default-namespace tag in another TagLib, the locally defined method will be shadowed by the tag dispatcher. Rename the helper method or move it behind a different namespace if the previous behavior is required.</p>
+</div>
+<div class="paragraph">
+<p>This shadowing is not reported at runtime by default. To audit which TagLib methods are being overridden by tag dispatchers, enable <code>DEBUG</code> logging for <code>org.grails.taglib.TagLibraryMetaUtils</code> in <code>logback.xml</code> (or <code>logback-spring.xml</code>):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;logger</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">org.grails.taglib.TagLibraryMetaUtils</span><span class="delimiter">&quot;</span></span> <span class="attribute-name">level</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">DEBUG</span><span class="delimiter">&quot;</span></span><span class="ta [...]
+</div>
+</div>
+<div class="paragraph">
+<p>Each override is logged as <code>Registering tag dispatcher &lt;namespace&gt;:&lt;tagName&gt; over existing method &lt;Class&gt;.&lt;method&gt;(&lt;paramTypes&gt;)</code>. Inspect the output after application startup; any entry whose <code>&lt;Class&gt;</code> is one of your own TagLibs identifies a method that has been replaced by the dispatcher.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_21_2_behavior_change_parameter_name_binding_for_map_and_closure_parameters">21.2 Behavior change: parameter-name binding for <code>Map</code> and <code>Closure</code> parameters</h5>
+<div class="paragraph">
+<p>Method-based tag handlers bind attributes to method parameters by parameter name. Two reserved names participate in this resolution:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>A <code>Map</code>-typed parameter named <code>attrs</code> receives the full attributes map.</p>
+</li>
+<li>
+<p>A <code>Closure</code>-typed parameter named <code>body</code> receives the tag body.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>In earlier iterations of the method-based handler implementation, a <code>Closure</code>-typed parameter was bound to the body regardless of its parameter name, while a <code>Map</code>-typed parameter required the literal name <code>attrs</code>. That asymmetry has been removed. Both reserved names are now applied consistently: a <code>Closure</code> parameter named anything other than <code>body</code> is treated as a normal named attribute (and must be supplied by name), just as a  [...]
+</div>
+<div class="paragraph">
+<p>If you have method-based tag handlers whose <code>Closure</code> parameter uses a name other than <code>body</code>, rename the parameter so the body binds as expected:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
+<span class="type">class</span> <span class="class">DemoTagLib</span> {
+
+    <span class="comment">// Will NOT receive the tag body; `renderer` is treated as a named attribute.</span>
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">before</span>(Closure renderer) {
+        out &lt;&lt; renderer.call()
+    }
+
+    <span class="comment">// Receives the tag body.</span>
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">after</span>(Closure body) {
+        out &lt;&lt; body.call()
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If parameter names are not preserved at compile time (see §21.3 below for the <code>preserveParameterNames</code> Gradle extension property), the first <code>Map</code> parameter is bound to <code>attrs</code> and the first <code>Closure</code> parameter is bound to <code>body</code> regardless of declared names, matching the behavior of closure-based tag handlers.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_21_3_grails_gradle_extension_preserves_parameter_names_by_default">21.3 Grails Gradle Extension Preserves Parameter Names By Default</h5>
+<div class="paragraph">
+<p>In Grails 8, the Grails Gradle extension defaults <code>preserveParameterNames</code> to <code>true</code>.
+This configures Groovy compilation to retain method and constructor parameter names in generated class files.</p>
+</div>
+<div class="paragraph">
+<p>This behavior supports framework features that bind by parameter name, including method-based TagLib handlers annotated with <code>@grails.gsp.Tag</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
+<span class="type">class</span> <span class="class">DemoTagLib</span> {
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">greeting</span>(<span class="predefined-type">String</span> name) {
+        out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Hello, </span><span class="inline"><span class="inline-delimiter">${</span>name<span class="inline-delimiter">}</span></span><span class="content">!</span><span class="delimiter">&quot;</span></span>
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If you need the previous Groovy compiler behavior, disable it in <code>build.gradle</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+    preserveParameterNames = <span class="predefined-constant">false</span>
+}</code></pre>
+</div>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+This Gradle extension property controls Groovy compilation only (<code>groovyOptions.parameters</code>). Java parameter-name preservation is enabled by the Spring Boot Gradle plugin, which adds <code>-parameters</code> to every <code>JavaCompile</code> task by default since Spring Boot 3.2. Grails 8 applications inherit this through the Spring Boot Gradle plugin and require no additional configuration for Java sources.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>If you compile TagLib classes outside the Grails Gradle plugin (for example, in a standalone Groovy module, a plain Spring Boot application that does not apply <code>org.springframework.boot</code>, or a build that disables the Spring Boot plugin&#8217;s compiler configuration), enable parameter-name preservation explicitly so <code>@grails.gsp.Tag</code> methods can bind attributes by parameter name:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">tasks.withType(JavaCompile).configureEach {
+    options.compilerArgs.add(<span class="string"><span class="delimiter">'</span><span class="content">-parameters</span><span class="delimiter">'</span></span>)
+}
+
+tasks.withType(GroovyCompile).configureEach {
+    groovyOptions.parameters = <span class="predefined-constant">true</span>
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Without these flags, <code>Parameter.getName()</code> returns synthetic names such as <code>arg0</code>, the attribute lookup misses, and the call surfaces as <code>MissingMethodException</code> at runtime. The <code>@Tag</code>-annotated method itself produces no compile-time warning, because preservation is a property of the build, not of the source file.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_22_known_plugin_incompatibilities">22. Known Plugin Incompatibilities</h4>
 <div class="paragraph">
 <p>Some third-party plugins have not yet been updated for Spring Boot 4 / Spring Framework 7 compatibility.
 The following are known blockers at this time:</p>
@@ -3264,7 +3487,7 @@ Applications using <code>grails-sitemesh3</code> should remain on the <code>grai
 <p>Check the <a href="https://github.com/apache/grails-core/issues">Grails issue tracker</a> for the latest status of plugin compatibility.</p>
 </div>
 <div class="sect4">
-<h5 id="_21_custom_json_view_converters">21. Custom JSON View Converters</h5>
+<h5 id="_23_custom_json_view_converters">23. Custom JSON View Converters</h5>
 <div class="paragraph">
 <p>JSON views now use Groovy&#8217;s <code>groovy.json.JsonGenerator</code> implementation instead of the previous Grails-specific
 JSON generator infrastructure.
@@ -3293,7 +3516,7 @@ for <code>render &#8230;&#8203; as JSON</code> and related converter-based rende
 </div>
 </div>
 <div class="sect4">
-<h5 id="_22_rendering_enum_values_as_json">22 Rendering Enum values as JSON</h5>
+<h5 id="_23_rendering_enum_values_as_json">23 Rendering Enum values as JSON</h5>
 <div class="paragraph">
 <p>It is no longer possible to render a single enum value as JSON using the <code>render(Number.ONE as JSON)</code> syntax.
 Previously, rendering an enum value would produce a JSON string with the type and name of the enum value like:</p>
@@ -17956,30 +18179,95 @@ cp -R grails-app/views/* /var/www/grails/my-app/grails-app/views</pre>
 </div>
 </div>
 <div class="paragraph">
-<p>Now to create a tag create a Closure property that takes two arguments: the tag attributes and the body content:</p>
+<p>Now create tags using methods. Methods with the conventional <code>Map attrs</code>, <code>Closure body</code>, and <code>Map attrs, Closure body</code> signatures are discovered as tags automatically:</p>
 </div>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">SimpleTagLib</span> {
-    <span class="keyword">def</span> simple = { attrs, body -&gt;
-
+    <span class="keyword">def</span> <span class="function">simple</span>(<span class="predefined-type">Map</span> attrs) {
+        out &lt;&lt; attrs.name
     }
 }</code></pre>
 </div>
 </div>
 <div class="paragraph">
-<p>The <code>attrs</code> argument is a Map of the attributes of the tag, whilst the <code>body</code> argument is a Closure that returns the body content when invoked:</p>
+<p>Closure field-style tags are still supported for backward compatibility, but method-based tags are the recommended syntax.</p>
+</div>
+<div class="paragraph">
+<p>The <code>attrs</code> parameter is a <code>Map</code> of the tag attributes, while the <code>body</code> parameter is the tag body closure:</p>
 </div>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">SimpleTagLib</span> {
-    <span class="keyword">def</span> emoticon = { attrs, body -&gt;
+    <span class="keyword">def</span> <span class="function">emoticon</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
        out &lt;&lt; body() &lt;&lt; (attrs.happy == <span class="string"><span class="delimiter">'</span><span class="content">true</span><span class="delimiter">'</span></span> ? <span class="string"><span class="delimiter">&quot;</span><span class="content"> :-)</span><span class="delimiter">&quot;</span></span> : <span class="string"><span class="delimiter">&quot;</span><span class="content"> :-(</span><span class="delimiter">&quot;</span></span>)
     }
 }</code></pre>
 </div>
 </div>
 <div class="paragraph">
+<p>For method-based tags, named attributes can also bind directly to method signature arguments when the method is explicitly marked with <code>@Tag</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
+<span class="type">class</span> <span class="class">SimpleTagLib</span> {
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">greeting</span>(<span class="predefined-type">String</span> name) {
+        out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Hello, </span><span class="inline"><span class="inline-delimiter">${</span>name<span class="inline-delimiter">}</span></span><span class="content">!</span><span class="delimiter">&quot;</span></span>
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Used as:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;g:greeting</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">Graeme</span><span class="delimiter">&quot;</span></span> <span class="tag">/&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For tags with strict validation/error handling, keep a <code>Map attrs</code> handler and add typed overloads that delegate to it:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
+<span class="keyword">def</span> <span class="function">field</span>(<span class="predefined-type">Map</span> attrs) {
+    <span class="comment">// existing validation + rendering path</span>
+}
+
+<span class="annotation">@Tag</span>
+<span class="keyword">def</span> <span class="function">field</span>(<span class="predefined-type">String</span> type, <span class="predefined-type">Map</span> attrs) {
+    attrs.type = type
+    field(attrs)
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Without <code>@Tag</code>, Grails discovers method tags only for the conventional tag signatures <code>def tag(Map attrs)</code>, <code>def tag(Closure body)</code>, and <code>def tag(Map attrs, Closure body)</code>. Zero-argument method tags and typed-parameter method tags must use <code>@Tag</code>. This prevents ordinary helper methods from being exposed as tags accidentally.</p>
+</div>
+<div class="paragraph">
+<p>If a conventional public method should not be exposed as a tag, annotate it with <code>@NotATag</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.NotATag</span>
+
+<span class="type">class</span> <span class="class">SimpleTagLib</span> {
+    <span class="annotation">@NotATag</span>
+    <span class="keyword">def</span> <span class="function">helper</span>(<span class="predefined-type">Map</span> attrs) {
+        <span class="comment">// not a tag</span>
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Grails applications generated with the Grails Gradle plugins preserve Java and Groovy method parameter names by default. If you compile tag libraries outside the Grails Gradle plugins, enable Java <code>-parameters</code> and Groovy <code>groovyOptions.parameters = true</code> so <code>@Tag</code> methods can bind attributes by parameter name.</p>
+</div>
+<div class="paragraph">
 <p>As demonstrated above there is an implicit <code>out</code> variable that refers to the output <code>Writer</code> which you can use to append content to the response. Then you can reference the tag inside your GSP; no imports are necessary:</p>
 </div>
 <div class="listingblock">
@@ -17994,7 +18282,7 @@ cp -R grails-app/views/* /var/www/grails/my-app/grails-app/views</pre>
 <i class="fa icon-note" title="Note"></i>
 </td>
 <td class="content">
-To help IDEs autocomplete tag attributes, you should add Javadoc comments to your tag closures with <code>@attr</code> descriptions. Since taglibs use Groovy code it can be difficult to reliably detect all usable attributes.
+To help IDEs autocomplete tag attributes, add Javadoc comments with <code>@attr</code> descriptions to your tag methods. Since taglibs use Groovy code it can be difficult to reliably detect all usable attributes.
 </td>
 </tr>
 </table>
@@ -18012,7 +18300,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
      * @attr happy whether to show a happy emoticon ('true') or
      * a sad emoticon ('false')
      */</span>
-    <span class="keyword">def</span> emoticon = { attrs, body -&gt;
+    <span class="keyword">def</span> <span class="function">emoticon</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
        out &lt;&lt; body() &lt;&lt; (attrs.happy == <span class="string"><span class="delimiter">'</span><span class="content">true</span><span class="delimiter">'</span></span> ? <span class="string"><span class="delimiter">&quot;</span><span class="content"> :-)</span><span class="delimiter">&quot;</span></span> : <span class="string"><span class="delimiter">&quot;</span><span class="content"> :-(</span><span class="delimiter">&quot;</span></span>)
     }
 }</code></pre>
@@ -18031,7 +18319,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
      * @attr name REQUIRED the field name
      * @attr value the field value
      */</span>
-    <span class="keyword">def</span> passwordField = { attrs -&gt;
+    <span class="keyword">def</span> <span class="function">passwordField</span>(<span class="predefined-type">Map</span> attrs) {
         attrs.type = <span class="string"><span class="delimiter">&quot;</span><span class="content">password</span><span class="delimiter">&quot;</span></span>
         attrs.tagName = <span class="string"><span class="delimiter">&quot;</span><span class="content">passwordField</span><span class="delimiter">&quot;</span></span>
         fieldImpl(out, attrs)
@@ -18109,7 +18397,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> dateFormat = { attrs, body -&gt;
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">dateFormat</span>(<span class="predefined-type">Map</span> attrs) {
     out &lt;&lt; <span class="keyword">new</span> java.text.SimpleDateFormat(attrs.format).format(attrs.date)
 }</code></pre>
 </div>
@@ -18123,11 +18411,24 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
 </div>
 </div>
 <div class="paragraph">
+<p>With method-based tags, attributes may also bind directly to method parameters by name when the method is explicitly marked with <code>@Tag</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
+<span class="annotation">@Tag</span>
+<span class="keyword">def</span> <span class="function">dateFormat</span>(<span class="predefined-type">String</span> format, <span class="predefined-type">Date</span> date) {
+    out &lt;&lt; <span class="keyword">new</span> java.text.SimpleDateFormat(format).format(date)
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
 <p>With simple tags sometimes you need to write HTML mark-up to the response. One approach would be to embed the content directly:</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> formatBook = { attrs, body -&gt;
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">formatBook</span>(<span class="predefined-type">Map</span> attrs) {
     out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">&lt;div id=</span><span class="char">\&quot;</span><span class="inline"><span class="inline-delimiter">${</span>attrs.book.id<span class="inline-delimiter">}</span></span><span class="char">\&quot;</span><span class="content">&gt;</span><span class="delimiter">&quot;</span></span>
     out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Title : </span><span class="inline"><span class="inline-delimiter">${</span>attrs.book.title<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
     out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">&lt;/div&gt;</span><span class="delimiter">&quot;</span></span>
@@ -18139,7 +18440,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> formatBook = { attrs, body -&gt;
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">formatBook</span>(<span class="predefined-type">Map</span> attrs) {
     out &lt;&lt; render(<span class="key">template</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">bookTemplate</span><span class="delimiter">&quot;</span></span>, <span class="key">model</span>: [<span class="key">book</span>: attrs.book])
 }</code></pre>
 </div>
@@ -18163,7 +18464,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> isAdmin = { attrs, body -&gt;
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">isAdmin</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
     <span class="keyword">def</span> user = attrs.user
     <span class="keyword">if</span> (user &amp;&amp; checkUserPrivs(user)) {
         out &lt;&lt; body()
@@ -18197,7 +18498,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> repeat = { attrs, body -&gt;
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">repeat</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
     attrs.times?.toInteger()?.times { num -&gt;
         out &lt;&lt; body(num)
     }
@@ -18227,7 +18528,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> repeat = { attrs, body -&gt;
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">repeat</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
     <span class="keyword">def</span> <span class="type">var</span> = attrs.var ?: <span class="string"><span class="delimiter">&quot;</span><span class="content">num</span><span class="delimiter">&quot;</span></span>
     attrs.times?.toInteger()?.times { num -&gt;
         out &lt;&lt; body((<span class="type">var</span>):num)
@@ -18287,8 +18588,8 @@ Note the usage of the parenthesis around the variable name. If you omit these Gr
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">SimpleTagLib</span> {
     <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">&quot;</span><span class="content">my</span><span class="delimiter">&quot;</span></span>
 
-    <span class="keyword">def</span> example = { attrs -&gt;
-        <span class="comment">//...</span>
+    <span class="keyword">def</span> <span class="function">example</span>(<span class="predefined-type">Map</span> attrs) {
+        out &lt;&lt; attrs.name
     }
 }</code></pre>
 </div>
@@ -18408,14 +18709,14 @@ This is configured with the <code>grails.gsp.tldScanPattern</code> setting. It a
 <p>A taglib can be used in a GSP as an ordinary tag, or it might be used as a function in other taglibs or GSP expressions.</p>
 </div>
 <div class="paragraph">
-<p>Internally Grails intercepts calls to taglib closures.
+<p>Internally Grails intercepts calls to tag handlers (method-based or closure-based).
 The "out" that is available in a taglib is mapped to a <code>java.io.Writer</code> implementation that writes to a buffer
 that "captures" the output of the taglib call. This buffer is the return value of a tag library call when it&#8217;s
 used as a function.</p>
 </div>
 <div class="paragraph">
 <p>If the tag is listed in the library&#8217;s static <code>returnObjectForTags</code> array, then its return value will be written to
-the output when it&#8217;s used as a normal tag. The return value of the tag lib closure will be returned as-is
+the output when it&#8217;s used as a normal tag. The return value of the tag method/closure will be returned as-is
 if it&#8217;s used as a function in GSP expressions or other taglibs.</p>
 </div>
 <div class="paragraph">
@@ -18428,11 +18729,11 @@ Using "out" to write output in returnObjectForTags is not supported.</p>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">ObjectReturningTagLib</span> {
-        <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">&quot;</span><span class="content">cms</span><span class="delimiter">&quot;</span></span>
-        <span class="directive">static</span> returnObjectForTags = [<span class="string"><span class="delimiter">'</span><span class="content">content</span><span class="delimiter">'</span></span>]
+    <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">&quot;</span><span class="content">cms</span><span class="delimiter">&quot;</span></span>
+    <span class="directive">static</span> returnObjectForTags = [<span class="string"><span class="delimiter">'</span><span class="content">content</span><span class="delimiter">'</span></span>]
 
-        <span class="keyword">def</span> content = { attrs, body -&gt;
-                CmsContent.findByCode(attrs.code)?.content
+    <span class="keyword">def</span> <span class="function">content</span>(<span class="predefined-type">Map</span> attrs) {
+        CmsContent.findByCode(attrs.code)?.content
     }
 }</code></pre>
 </div>
@@ -30993,13 +31294,16 @@ be automatically created for the Service class under test.</p>
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">package</span> demo
 
+<span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
 <span class="type">class</span> <span class="class">SampleTagLib</span> {
 
     <span class="directive">static</span> defaultEncodeAs = [<span class="key">taglib</span>:<span class="string"><span class="delimiter">'</span><span class="content">html</span><span class="delimiter">'</span></span>]
 
     <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">demo</span><span class="delimiter">'</span></span>
 
-    <span class="keyword">def</span> helloWorld = { attrs -&gt;
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">helloWorld</span>() {
         out &lt;&lt; <span class="string"><span class="delimiter">'</span><span class="content">Hello, World!</span><span class="delimiter">'</span></span>
     }
 }</code></pre>
@@ -31027,7 +31331,7 @@ be automatically created for the Service class under test.</p>
 automatically created for the TagLib class under test.  The <code>tagLib</code> property can
 be used to test calling tags as function calls. The return value of a function
 call is either a <code>org.grails.buffer,StreamCharBuffer</code>
-instance or the object returned from the tag closure when
+instance or the object returned from the tag handler when
 <code>returnObjectForTags</code> feature is used.</p>
 </div>
 <div class="paragraph">
@@ -31039,13 +31343,16 @@ arguments to the method call.</p>
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">package</span> demo
 
+<span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
 <span class="type">class</span> <span class="class">SampleTagLib</span> {
 
     <span class="directive">static</span> defaultEncodeAs = [<span class="key">taglib</span>:<span class="string"><span class="delimiter">'</span><span class="content">html</span><span class="delimiter">'</span></span>]
 
     <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">demo</span><span class="delimiter">'</span></span>
 
-    <span class="keyword">def</span> sayHello = { attrs -&gt;
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">sayHello</span>() {
         out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Hello, </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="content">!</span><span class="delimiter">&quot;</span></span>
     }
 }</code></pre>
@@ -31100,13 +31407,16 @@ past as the first argument to <code>applyTemplate</code> as shown below.</p>
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">package</span> demo
 
+<span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
 <span class="type">class</span> <span class="class">SampleTagLib</span> {
 
     <span class="directive">static</span> defaultEncodeAs = [<span class="key">taglib</span>:<span class="string"><span class="delimiter">'</span><span class="content">html</span><span class="delimiter">'</span></span>]
 
     <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">demo</span><span class="delimiter">'</span></span>
 
-    <span class="keyword">def</span> renderSomeNumber = { attrs -&gt;
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">renderSomeNumber</span>() {
         <span class="type">int</span> number = attrs.int(<span class="string"><span class="delimiter">'</span><span class="content">value</span><span class="delimiter">'</span></span>, -<span class="integer">1</span>)
         out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">The Number Is </span><span class="inline"><span class="inline-delimiter">${</span>number<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
     }
@@ -31156,17 +31466,36 @@ quotes.  <code>'&lt;demo:renderSomeNumber value="${x + y}"/&gt;'</code> works.
 the second tag library needs to be explicitly mocked by invoking the
 <code>mockTagLib</code> method.</p>
 </div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+Mocked tag libraries are cleared after each feature method as part of the
+web test cleanup lifecycle. Call <code>mockTagLib</code> in <code>setup()</code> rather than
+<code>setupSpec()</code> to ensure the mock is active for every feature. Tests that
+implement <code>TagLibUnitTest</code> handle this automatically, but tests that use
+<code>GrailsWebUnitTest</code> directly must re-mock in each feature or in <code>setup()</code>.
+</td>
+</tr>
+</table>
+</div>
 <div class="listingblock">
 <div class="title">grails-app/taglib/demo/FirstTagLib.groovy</div>
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">package</span> demo
 
+<span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
 <span class="type">class</span> <span class="class">FirstTagLib</span> {
     <span class="directive">static</span> defaultEncodeAs = [<span class="key">taglib</span>:<span class="string"><span class="delimiter">'</span><span class="content">html</span><span class="delimiter">'</span></span>]
 
     <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">one</span><span class="delimiter">'</span></span>
 
-    <span class="keyword">def</span> sayHello = { attrs -&gt;
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">sayHello</span>() {
         out &lt;&lt; <span class="string"><span class="delimiter">'</span><span class="content">BEFORE </span><span class="delimiter">'</span></span>
 
         <span class="comment">// this is invoking a tag from another tag library</span>
@@ -31182,12 +31511,15 @@ the second tag library needs to be explicitly mocked by invoking the
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">package</span> demo
 
+<span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
 <span class="type">class</span> <span class="class">SecondTagLib</span> {
     <span class="directive">static</span> defaultEncodeAs = [<span class="key">taglib</span>:<span class="string"><span class="delimiter">'</span><span class="content">html</span><span class="delimiter">'</span></span>]
 
     <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">two</span><span class="delimiter">'</span></span>
 
-    <span class="keyword">def</span> sayHello = { attrs -&gt;
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">sayHello</span>() {
         out &lt;&lt; <span class="string"><span class="delimiter">'</span><span class="content">Hello From SecondTagLib</span><span class="delimiter">'</span></span>
     }
 }</code></pre>
@@ -31203,7 +31535,7 @@ the second tag library needs to be explicitly mocked by invoking the
 
 <span class="type">class</span> <span class="class">FirstTagLibSpec</span> <span class="directive">extends</span> Specification <span class="directive">implements</span> TagLibUnitTest&lt;FirstTagLib&gt; {
 
-    <span class="type">void</span> setupSpec() {
+    <span class="type">void</span> setup() {
         mockTagLib SecondTagLib
     }
 
diff --git a/docs/snapshot/guide/testing.html b/docs/snapshot/guide/testing.html
index f63d8730200..a77fb7bc48b 100644
--- a/docs/snapshot/guide/testing.html
+++ b/docs/snapshot/guide/testing.html
@@ -1184,13 +1184,16 @@ be automatically created for the Service class under test.</p>
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">package</span> demo
 
+<span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
 <span class="type">class</span> <span class="class">SampleTagLib</span> {
 
     <span class="directive">static</span> defaultEncodeAs = [<span class="key">taglib</span>:<span class="string"><span class="delimiter">'</span><span class="content">html</span><span class="delimiter">'</span></span>]
 
     <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">demo</span><span class="delimiter">'</span></span>
 
-    <span class="keyword">def</span> helloWorld = { attrs -&gt;
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">helloWorld</span>() {
         out &lt;&lt; <span class="string"><span class="delimiter">'</span><span class="content">Hello, World!</span><span class="delimiter">'</span></span>
     }
 }</code></pre>
@@ -1218,7 +1221,7 @@ be automatically created for the Service class under test.</p>
 automatically created for the TagLib class under test.  The <code>tagLib</code> property can
 be used to test calling tags as function calls. The return value of a function
 call is either a <code>org.grails.buffer,StreamCharBuffer</code>
-instance or the object returned from the tag closure when
+instance or the object returned from the tag handler when
 <code>returnObjectForTags</code> feature is used.</p>
 </div>
 <div class="paragraph">
@@ -1230,13 +1233,16 @@ arguments to the method call.</p>
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">package</span> demo
 
+<span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
 <span class="type">class</span> <span class="class">SampleTagLib</span> {
 
     <span class="directive">static</span> defaultEncodeAs = [<span class="key">taglib</span>:<span class="string"><span class="delimiter">'</span><span class="content">html</span><span class="delimiter">'</span></span>]
 
     <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">demo</span><span class="delimiter">'</span></span>
 
-    <span class="keyword">def</span> sayHello = { attrs -&gt;
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">sayHello</span>() {
         out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Hello, </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="content">!</span><span class="delimiter">&quot;</span></span>
     }
 }</code></pre>
@@ -1291,13 +1297,16 @@ past as the first argument to <code>applyTemplate</code> as shown below.</p>
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">package</span> demo
 
+<span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
 <span class="type">class</span> <span class="class">SampleTagLib</span> {
 
     <span class="directive">static</span> defaultEncodeAs = [<span class="key">taglib</span>:<span class="string"><span class="delimiter">'</span><span class="content">html</span><span class="delimiter">'</span></span>]
 
     <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">demo</span><span class="delimiter">'</span></span>
 
-    <span class="keyword">def</span> renderSomeNumber = { attrs -&gt;
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">renderSomeNumber</span>() {
         <span class="type">int</span> number = attrs.int(<span class="string"><span class="delimiter">'</span><span class="content">value</span><span class="delimiter">'</span></span>, -<span class="integer">1</span>)
         out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">The Number Is </span><span class="inline"><span class="inline-delimiter">${</span>number<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
     }
@@ -1347,17 +1356,36 @@ quotes.  <code>'&lt;demo:renderSomeNumber value="${x + y}"/&gt;'</code> works.
 the second tag library needs to be explicitly mocked by invoking the
 <code>mockTagLib</code> method.</p>
 </div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+Mocked tag libraries are cleared after each feature method as part of the
+web test cleanup lifecycle. Call <code>mockTagLib</code> in <code>setup()</code> rather than
+<code>setupSpec()</code> to ensure the mock is active for every feature. Tests that
+implement <code>TagLibUnitTest</code> handle this automatically, but tests that use
+<code>GrailsWebUnitTest</code> directly must re-mock in each feature or in <code>setup()</code>.
+</td>
+</tr>
+</table>
+</div>
 <div class="listingblock">
 <div class="title">grails-app/taglib/demo/FirstTagLib.groovy</div>
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">package</span> demo
 
+<span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
 <span class="type">class</span> <span class="class">FirstTagLib</span> {
     <span class="directive">static</span> defaultEncodeAs = [<span class="key">taglib</span>:<span class="string"><span class="delimiter">'</span><span class="content">html</span><span class="delimiter">'</span></span>]
 
     <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">one</span><span class="delimiter">'</span></span>
 
-    <span class="keyword">def</span> sayHello = { attrs -&gt;
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">sayHello</span>() {
         out &lt;&lt; <span class="string"><span class="delimiter">'</span><span class="content">BEFORE </span><span class="delimiter">'</span></span>
 
         <span class="comment">// this is invoking a tag from another tag library</span>
@@ -1373,12 +1401,15 @@ the second tag library needs to be explicitly mocked by invoking the
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">package</span> demo
 
+<span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
 <span class="type">class</span> <span class="class">SecondTagLib</span> {
     <span class="directive">static</span> defaultEncodeAs = [<span class="key">taglib</span>:<span class="string"><span class="delimiter">'</span><span class="content">html</span><span class="delimiter">'</span></span>]
 
     <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">two</span><span class="delimiter">'</span></span>
 
-    <span class="keyword">def</span> sayHello = { attrs -&gt;
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">sayHello</span>() {
         out &lt;&lt; <span class="string"><span class="delimiter">'</span><span class="content">Hello From SecondTagLib</span><span class="delimiter">'</span></span>
     }
 }</code></pre>
@@ -1394,7 +1425,7 @@ the second tag library needs to be explicitly mocked by invoking the
 
 <span class="type">class</span> <span class="class">FirstTagLibSpec</span> <span class="directive">extends</span> Specification <span class="directive">implements</span> TagLibUnitTest&lt;FirstTagLib&gt; {
 
-    <span class="type">void</span> setupSpec() {
+    <span class="type">void</span> setup() {
         mockTagLib SecondTagLib
     }
 
diff --git a/docs/snapshot/guide/theWebLayer.html b/docs/snapshot/guide/theWebLayer.html
index f48ff65f648..5cbffc3b499 100644
--- a/docs/snapshot/guide/theWebLayer.html
+++ b/docs/snapshot/guide/theWebLayer.html
@@ -4741,30 +4741,95 @@ cp -R grails-app/views/* /var/www/grails/my-app/grails-app/views</pre>
 </div>
 </div>
 <div class="paragraph">
-<p>Now to create a tag create a Closure property that takes two arguments: the tag attributes and the body content:</p>
+<p>Now create tags using methods. Methods with the conventional <code>Map attrs</code>, <code>Closure body</code>, and <code>Map attrs, Closure body</code> signatures are discovered as tags automatically:</p>
 </div>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">SimpleTagLib</span> {
-    <span class="keyword">def</span> simple = { attrs, body -&gt;
-
+    <span class="keyword">def</span> <span class="function">simple</span>(<span class="predefined-type">Map</span> attrs) {
+        out &lt;&lt; attrs.name
     }
 }</code></pre>
 </div>
 </div>
 <div class="paragraph">
-<p>The <code>attrs</code> argument is a Map of the attributes of the tag, whilst the <code>body</code> argument is a Closure that returns the body content when invoked:</p>
+<p>Closure field-style tags are still supported for backward compatibility, but method-based tags are the recommended syntax.</p>
+</div>
+<div class="paragraph">
+<p>The <code>attrs</code> parameter is a <code>Map</code> of the tag attributes, while the <code>body</code> parameter is the tag body closure:</p>
 </div>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">SimpleTagLib</span> {
-    <span class="keyword">def</span> emoticon = { attrs, body -&gt;
+    <span class="keyword">def</span> <span class="function">emoticon</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
        out &lt;&lt; body() &lt;&lt; (attrs.happy == <span class="string"><span class="delimiter">'</span><span class="content">true</span><span class="delimiter">'</span></span> ? <span class="string"><span class="delimiter">&quot;</span><span class="content"> :-)</span><span class="delimiter">&quot;</span></span> : <span class="string"><span class="delimiter">&quot;</span><span class="content"> :-(</span><span class="delimiter">&quot;</span></span>)
     }
 }</code></pre>
 </div>
 </div>
 <div class="paragraph">
+<p>For method-based tags, named attributes can also bind directly to method signature arguments when the method is explicitly marked with <code>@Tag</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
+<span class="type">class</span> <span class="class">SimpleTagLib</span> {
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">greeting</span>(<span class="predefined-type">String</span> name) {
+        out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Hello, </span><span class="inline"><span class="inline-delimiter">${</span>name<span class="inline-delimiter">}</span></span><span class="content">!</span><span class="delimiter">&quot;</span></span>
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Used as:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;g:greeting</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">Graeme</span><span class="delimiter">&quot;</span></span> <span class="tag">/&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For tags with strict validation/error handling, keep a <code>Map attrs</code> handler and add typed overloads that delegate to it:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
+<span class="keyword">def</span> <span class="function">field</span>(<span class="predefined-type">Map</span> attrs) {
+    <span class="comment">// existing validation + rendering path</span>
+}
+
+<span class="annotation">@Tag</span>
+<span class="keyword">def</span> <span class="function">field</span>(<span class="predefined-type">String</span> type, <span class="predefined-type">Map</span> attrs) {
+    attrs.type = type
+    field(attrs)
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Without <code>@Tag</code>, Grails discovers method tags only for the conventional tag signatures <code>def tag(Map attrs)</code>, <code>def tag(Closure body)</code>, and <code>def tag(Map attrs, Closure body)</code>. Zero-argument method tags and typed-parameter method tags must use <code>@Tag</code>. This prevents ordinary helper methods from being exposed as tags accidentally.</p>
+</div>
+<div class="paragraph">
+<p>If a conventional public method should not be exposed as a tag, annotate it with <code>@NotATag</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.NotATag</span>
+
+<span class="type">class</span> <span class="class">SimpleTagLib</span> {
+    <span class="annotation">@NotATag</span>
+    <span class="keyword">def</span> <span class="function">helper</span>(<span class="predefined-type">Map</span> attrs) {
+        <span class="comment">// not a tag</span>
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Grails applications generated with the Grails Gradle plugins preserve Java and Groovy method parameter names by default. If you compile tag libraries outside the Grails Gradle plugins, enable Java <code>-parameters</code> and Groovy <code>groovyOptions.parameters = true</code> so <code>@Tag</code> methods can bind attributes by parameter name.</p>
+</div>
+<div class="paragraph">
 <p>As demonstrated above there is an implicit <code>out</code> variable that refers to the output <code>Writer</code> which you can use to append content to the response. Then you can reference the tag inside your GSP; no imports are necessary:</p>
 </div>
 <div class="listingblock">
@@ -4779,7 +4844,7 @@ cp -R grails-app/views/* /var/www/grails/my-app/grails-app/views</pre>
 <i class="fa icon-note" title="Note"></i>
 </td>
 <td class="content">
-To help IDEs autocomplete tag attributes, you should add Javadoc comments to your tag closures with <code>@attr</code> descriptions. Since taglibs use Groovy code it can be difficult to reliably detect all usable attributes.
+To help IDEs autocomplete tag attributes, add Javadoc comments with <code>@attr</code> descriptions to your tag methods. Since taglibs use Groovy code it can be difficult to reliably detect all usable attributes.
 </td>
 </tr>
 </table>
@@ -4797,7 +4862,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
      * @attr happy whether to show a happy emoticon ('true') or
      * a sad emoticon ('false')
      */</span>
-    <span class="keyword">def</span> emoticon = { attrs, body -&gt;
+    <span class="keyword">def</span> <span class="function">emoticon</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
        out &lt;&lt; body() &lt;&lt; (attrs.happy == <span class="string"><span class="delimiter">'</span><span class="content">true</span><span class="delimiter">'</span></span> ? <span class="string"><span class="delimiter">&quot;</span><span class="content"> :-)</span><span class="delimiter">&quot;</span></span> : <span class="string"><span class="delimiter">&quot;</span><span class="content"> :-(</span><span class="delimiter">&quot;</span></span>)
     }
 }</code></pre>
@@ -4816,7 +4881,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
      * @attr name REQUIRED the field name
      * @attr value the field value
      */</span>
-    <span class="keyword">def</span> passwordField = { attrs -&gt;
+    <span class="keyword">def</span> <span class="function">passwordField</span>(<span class="predefined-type">Map</span> attrs) {
         attrs.type = <span class="string"><span class="delimiter">&quot;</span><span class="content">password</span><span class="delimiter">&quot;</span></span>
         attrs.tagName = <span class="string"><span class="delimiter">&quot;</span><span class="content">passwordField</span><span class="delimiter">&quot;</span></span>
         fieldImpl(out, attrs)
@@ -4894,7 +4959,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> dateFormat = { attrs, body -&gt;
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">dateFormat</span>(<span class="predefined-type">Map</span> attrs) {
     out &lt;&lt; <span class="keyword">new</span> java.text.SimpleDateFormat(attrs.format).format(attrs.date)
 }</code></pre>
 </div>
@@ -4908,11 +4973,24 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
 </div>
 </div>
 <div class="paragraph">
+<p>With method-based tags, attributes may also bind directly to method parameters by name when the method is explicitly marked with <code>@Tag</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
+<span class="annotation">@Tag</span>
+<span class="keyword">def</span> <span class="function">dateFormat</span>(<span class="predefined-type">String</span> format, <span class="predefined-type">Date</span> date) {
+    out &lt;&lt; <span class="keyword">new</span> java.text.SimpleDateFormat(format).format(date)
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
 <p>With simple tags sometimes you need to write HTML mark-up to the response. One approach would be to embed the content directly:</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> formatBook = { attrs, body -&gt;
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">formatBook</span>(<span class="predefined-type">Map</span> attrs) {
     out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">&lt;div id=</span><span class="char">\&quot;</span><span class="inline"><span class="inline-delimiter">${</span>attrs.book.id<span class="inline-delimiter">}</span></span><span class="char">\&quot;</span><span class="content">&gt;</span><span class="delimiter">&quot;</span></span>
     out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Title : </span><span class="inline"><span class="inline-delimiter">${</span>attrs.book.title<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
     out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">&lt;/div&gt;</span><span class="delimiter">&quot;</span></span>
@@ -4924,7 +5002,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> formatBook = { attrs, body -&gt;
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">formatBook</span>(<span class="predefined-type">Map</span> attrs) {
     out &lt;&lt; render(<span class="key">template</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">bookTemplate</span><span class="delimiter">&quot;</span></span>, <span class="key">model</span>: [<span class="key">book</span>: attrs.book])
 }</code></pre>
 </div>
@@ -4948,7 +5026,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> isAdmin = { attrs, body -&gt;
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">isAdmin</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
     <span class="keyword">def</span> user = attrs.user
     <span class="keyword">if</span> (user &amp;&amp; checkUserPrivs(user)) {
         out &lt;&lt; body()
@@ -4982,7 +5060,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> repeat = { attrs, body -&gt;
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">repeat</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
     attrs.times?.toInteger()?.times { num -&gt;
         out &lt;&lt; body(num)
     }
@@ -5012,7 +5090,7 @@ To help IDEs autocomplete tag attributes, you should add Javadoc comments to you
 </div>
 <div class="listingblock">
 <div class="content">
-<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> repeat = { attrs, body -&gt;
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">repeat</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
     <span class="keyword">def</span> <span class="type">var</span> = attrs.var ?: <span class="string"><span class="delimiter">&quot;</span><span class="content">num</span><span class="delimiter">&quot;</span></span>
     attrs.times?.toInteger()?.times { num -&gt;
         out &lt;&lt; body((<span class="type">var</span>):num)
@@ -5072,8 +5150,8 @@ Note the usage of the parenthesis around the variable name. If you omit these Gr
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">SimpleTagLib</span> {
     <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">&quot;</span><span class="content">my</span><span class="delimiter">&quot;</span></span>
 
-    <span class="keyword">def</span> example = { attrs -&gt;
-        <span class="comment">//...</span>
+    <span class="keyword">def</span> <span class="function">example</span>(<span class="predefined-type">Map</span> attrs) {
+        out &lt;&lt; attrs.name
     }
 }</code></pre>
 </div>
@@ -5193,14 +5271,14 @@ This is configured with the <code>grails.gsp.tldScanPattern</code> setting. It a
 <p>A taglib can be used in a GSP as an ordinary tag, or it might be used as a function in other taglibs or GSP expressions.</p>
 </div>
 <div class="paragraph">
-<p>Internally Grails intercepts calls to taglib closures.
+<p>Internally Grails intercepts calls to tag handlers (method-based or closure-based).
 The "out" that is available in a taglib is mapped to a <code>java.io.Writer</code> implementation that writes to a buffer
 that "captures" the output of the taglib call. This buffer is the return value of a tag library call when it&#8217;s
 used as a function.</p>
 </div>
 <div class="paragraph">
 <p>If the tag is listed in the library&#8217;s static <code>returnObjectForTags</code> array, then its return value will be written to
-the output when it&#8217;s used as a normal tag. The return value of the tag lib closure will be returned as-is
+the output when it&#8217;s used as a normal tag. The return value of the tag method/closure will be returned as-is
 if it&#8217;s used as a function in GSP expressions or other taglibs.</p>
 </div>
 <div class="paragraph">
@@ -5213,11 +5291,11 @@ Using "out" to write output in returnObjectForTags is not supported.</p>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">ObjectReturningTagLib</span> {
-        <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">&quot;</span><span class="content">cms</span><span class="delimiter">&quot;</span></span>
-        <span class="directive">static</span> returnObjectForTags = [<span class="string"><span class="delimiter">'</span><span class="content">content</span><span class="delimiter">'</span></span>]
+    <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">&quot;</span><span class="content">cms</span><span class="delimiter">&quot;</span></span>
+    <span class="directive">static</span> returnObjectForTags = [<span class="string"><span class="delimiter">'</span><span class="content">content</span><span class="delimiter">'</span></span>]
 
-        <span class="keyword">def</span> content = { attrs, body -&gt;
-                CmsContent.findByCode(attrs.code)?.content
+    <span class="keyword">def</span> <span class="function">content</span>(<span class="predefined-type">Map</span> attrs) {
+        CmsContent.findByCode(attrs.code)?.content
     }
 }</code></pre>
 </div>
diff --git a/docs/snapshot/guide/upgrading.html b/docs/snapshot/guide/upgrading.html
index 1c2e5a546e6..4a21f1aa20b 100644
--- a/docs/snapshot/guide/upgrading.html
+++ b/docs/snapshot/guide/upgrading.html
@@ -1173,7 +1173,222 @@ The Spring annotations still work, so this is non-blocking, but new code should
 </div>
 </div>
 <div class="sect3">
-<h4 id="_20_known_plugin_incompatibilities">20. Known Plugin Incompatibilities</h4>
+<h4 id="_20_tag_library_test_cleanup_changes">20. Tag Library Test Cleanup Changes</h4>
+<div class="paragraph">
+<p>Grails 8 removes the <code>purgeTagLibMetaClass</code> test hook used by some web and TagLib unit tests.
+TagLib metaclass cleanup now happens automatically as part of the web test infrastructure, so test specs should delete any custom <code>purgeTagLibMetaClass</code> property or getter.</p>
+</div>
+<div class="paragraph">
+<p>If your tests use <code>TagLibUnitTest</code> and mock additional tag libraries with <code>mockTagLib(&#8230;&#8203;)</code> or <code>mockTagLibs(&#8230;&#8203;)</code>, those mocked tag libraries are rebuilt automatically between feature methods.
+No replacement flag is required.</p>
+</div>
+<div class="admonitionblock important">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-important" title="Important"></i>
+</td>
+<td class="content">
+Mocked tag libraries are cleared after each feature method.
+If your tests call <code>mockTagLib</code> directly (for example, when implementing <code>GrailsWebUnitTest</code> instead of <code>TagLibUnitTest</code>), move the call from <code>setupSpec()</code> to <code>setup()</code> so the mock is re-applied before every feature.
+<code>TagLibUnitTest</code> handles this automatically, but <code>GrailsWebUnitTest</code> does not.
+</td>
+</tr>
+</table>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="comment">// Before</span>
+<span class="type">class</span> <span class="class">MyTagLibSpec</span> <span class="directive">extends</span> Specification <span class="directive">implements</span> TagLibUnitTest&lt;MyTagLib&gt; {
+    <span class="type">boolean</span> getPurgeTagLibMetaClass() {
+        <span class="predefined-constant">true</span>
+    }
+}
+
+<span class="comment">// After</span>
+<span class="type">class</span> <span class="class">MyTagLibSpec</span> <span class="directive">extends</span> Specification <span class="directive">implements</span> TagLibUnitTest&lt;MyTagLib&gt; {
+}</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_21_method_based_taglib_handlers">21. Method-based TagLib Handlers</h4>
+<div class="paragraph">
+<p>Grails 8 introduces method-based tag handler syntax as the recommended way to define tags. Closure-based handlers are still supported for backward compatibility.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
+<span class="type">class</span> <span class="class">DemoTagLib</span> {
+    <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">demo</span><span class="delimiter">'</span></span>
+
+    <span class="keyword">def</span> <span class="function">greet</span>(<span class="predefined-type">Map</span> attrs) {
+        out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Hello, </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="content">!</span><span class="delimiter">&quot;</span></span>
+    }
+
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">greeting</span>(<span class="predefined-type">String</span> name) {
+        out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Hello, </span><span class="inline"><span class="inline-delimiter">${</span>name<span class="inline-delimiter">}</span></span><span class="content">!</span><span class="delimiter">&quot;</span></span>
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Method tags with the conventional signatures <code>def tag(Map attrs)</code>, <code>def tag(Closure body)</code>, and <code>def tag(Map attrs, Closure body)</code> are discovered automatically. Zero-argument method tags and method tags that bind named attributes directly to method parameters must use <code>@grails.gsp.Tag</code>; this avoids exposing ordinary public helper methods as tags.</p>
+</div>
+<div class="paragraph">
+<p>Grails Gradle application builds preserve Java and Groovy method parameter names by default (see §21.3 below). If you compile TagLib classes outside those plugins, enable Java <code>-parameters</code> and Groovy <code>groovyOptions.parameters = true</code> so <code>@Tag</code> methods can bind attributes by parameter name.</p>
+</div>
+<div class="paragraph">
+<p>To exclude a conventional public method from being exposed as a tag (for example, a helper that must remain public to satisfy an interface), annotate it with <code>@grails.gsp.NotATag</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.NotATag</span>
+
+<span class="type">class</span> <span class="class">DemoTagLib</span> {
+    <span class="keyword">def</span> <span class="function">greet</span>(<span class="predefined-type">Map</span> attrs) {
+        out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Hello, </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="content">!</span><span class="delimiter">&quot;</span></span>
+    }
+
+    <span class="annotation">@NotATag</span>
+    <span class="keyword">def</span> <span class="function">helper</span>(<span class="predefined-type">Map</span> attrs) { <span class="comment">/* ... */</span> }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The compile-time deprecation warning emitted for closure-based tag fields can be silenced by setting the system property <code>grails.taglib.warnDeprecatedClosures=false</code>.</p>
+</div>
+<div class="sect4">
+<h5 id="_21_1_behavior_change_tag_method_registration">21.1 Behavior change: tag method registration</h5>
+<div class="paragraph">
+<p>In Grails 7, the metaclass tag dispatchers registered for the taglib&#8217;s own namespace did not override existing methods. Because method-based tags are now real methods on the TagLib class, those dispatchers must override methods of the same name so that function-style invocation (for example <code>tagLib.myTag(attrs)</code>) returns captured tag output rather than writing directly to <code>out</code>.</p>
+</div>
+<div class="paragraph">
+<p>If a TagLib intentionally defines a method that shares a name with a default-namespace tag in another TagLib, the locally defined method will be shadowed by the tag dispatcher. Rename the helper method or move it behind a different namespace if the previous behavior is required.</p>
+</div>
+<div class="paragraph">
+<p>This shadowing is not reported at runtime by default. To audit which TagLib methods are being overridden by tag dispatchers, enable <code>DEBUG</code> logging for <code>org.grails.taglib.TagLibraryMetaUtils</code> in <code>logback.xml</code> (or <code>logback-spring.xml</code>):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;logger</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">org.grails.taglib.TagLibraryMetaUtils</span><span class="delimiter">&quot;</span></span> <span class="attribute-name">level</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">DEBUG</span><span class="delimiter">&quot;</span></span><span class="ta [...]
+</div>
+</div>
+<div class="paragraph">
+<p>Each override is logged as <code>Registering tag dispatcher &lt;namespace&gt;:&lt;tagName&gt; over existing method &lt;Class&gt;.&lt;method&gt;(&lt;paramTypes&gt;)</code>. Inspect the output after application startup; any entry whose <code>&lt;Class&gt;</code> is one of your own TagLibs identifies a method that has been replaced by the dispatcher.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_21_2_behavior_change_parameter_name_binding_for_map_and_closure_parameters">21.2 Behavior change: parameter-name binding for <code>Map</code> and <code>Closure</code> parameters</h5>
+<div class="paragraph">
+<p>Method-based tag handlers bind attributes to method parameters by parameter name. Two reserved names participate in this resolution:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>A <code>Map</code>-typed parameter named <code>attrs</code> receives the full attributes map.</p>
+</li>
+<li>
+<p>A <code>Closure</code>-typed parameter named <code>body</code> receives the tag body.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>In earlier iterations of the method-based handler implementation, a <code>Closure</code>-typed parameter was bound to the body regardless of its parameter name, while a <code>Map</code>-typed parameter required the literal name <code>attrs</code>. That asymmetry has been removed. Both reserved names are now applied consistently: a <code>Closure</code> parameter named anything other than <code>body</code> is treated as a normal named attribute (and must be supplied by name), just as a  [...]
+</div>
+<div class="paragraph">
+<p>If you have method-based tag handlers whose <code>Closure</code> parameter uses a name other than <code>body</code>, rename the parameter so the body binds as expected:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
+<span class="type">class</span> <span class="class">DemoTagLib</span> {
+
+    <span class="comment">// Will NOT receive the tag body; `renderer` is treated as a named attribute.</span>
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">before</span>(Closure renderer) {
+        out &lt;&lt; renderer.call()
+    }
+
+    <span class="comment">// Receives the tag body.</span>
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">after</span>(Closure body) {
+        out &lt;&lt; body.call()
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If parameter names are not preserved at compile time (see §21.3 below for the <code>preserveParameterNames</code> Gradle extension property), the first <code>Map</code> parameter is bound to <code>attrs</code> and the first <code>Closure</code> parameter is bound to <code>body</code> regardless of declared names, matching the behavior of closure-based tag handlers.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_21_3_grails_gradle_extension_preserves_parameter_names_by_default">21.3 Grails Gradle Extension Preserves Parameter Names By Default</h5>
+<div class="paragraph">
+<p>In Grails 8, the Grails Gradle extension defaults <code>preserveParameterNames</code> to <code>true</code>.
+This configures Groovy compilation to retain method and constructor parameter names in generated class files.</p>
+</div>
+<div class="paragraph">
+<p>This behavior supports framework features that bind by parameter name, including method-based TagLib handlers annotated with <code>@grails.gsp.Tag</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.gsp.Tag</span>
+
+<span class="type">class</span> <span class="class">DemoTagLib</span> {
+    <span class="annotation">@Tag</span>
+    <span class="keyword">def</span> <span class="function">greeting</span>(<span class="predefined-type">String</span> name) {
+        out &lt;&lt; <span class="string"><span class="delimiter">&quot;</span><span class="content">Hello, </span><span class="inline"><span class="inline-delimiter">${</span>name<span class="inline-delimiter">}</span></span><span class="content">!</span><span class="delimiter">&quot;</span></span>
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If you need the previous Groovy compiler behavior, disable it in <code>build.gradle</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+    preserveParameterNames = <span class="predefined-constant">false</span>
+}</code></pre>
+</div>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+This Gradle extension property controls Groovy compilation only (<code>groovyOptions.parameters</code>). Java parameter-name preservation is enabled by the Spring Boot Gradle plugin, which adds <code>-parameters</code> to every <code>JavaCompile</code> task by default since Spring Boot 3.2. Grails 8 applications inherit this through the Spring Boot Gradle plugin and require no additional configuration for Java sources.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>If you compile TagLib classes outside the Grails Gradle plugin (for example, in a standalone Groovy module, a plain Spring Boot application that does not apply <code>org.springframework.boot</code>, or a build that disables the Spring Boot plugin&#8217;s compiler configuration), enable parameter-name preservation explicitly so <code>@grails.gsp.Tag</code> methods can bind attributes by parameter name:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">tasks.withType(JavaCompile).configureEach {
+    options.compilerArgs.add(<span class="string"><span class="delimiter">'</span><span class="content">-parameters</span><span class="delimiter">'</span></span>)
+}
+
+tasks.withType(GroovyCompile).configureEach {
+    groovyOptions.parameters = <span class="predefined-constant">true</span>
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Without these flags, <code>Parameter.getName()</code> returns synthetic names such as <code>arg0</code>, the attribute lookup misses, and the call surfaces as <code>MissingMethodException</code> at runtime. The <code>@Tag</code>-annotated method itself produces no compile-time warning, because preservation is a property of the build, not of the source file.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_22_known_plugin_incompatibilities">22. Known Plugin Incompatibilities</h4>
 <div class="paragraph">
 <p>Some third-party plugins have not yet been updated for Spring Boot 4 / Spring Framework 7 compatibility.
 The following are known blockers at this time:</p>
@@ -1194,7 +1409,7 @@ Applications using <code>grails-sitemesh3</code> should remain on the <code>grai
 <p>Check the <a href="https://github.com/apache/grails-core/issues">Grails issue tracker</a> for the latest status of plugin compatibility.</p>
 </div>
 <div class="sect4">
-<h5 id="_21_custom_json_view_converters">21. Custom JSON View Converters</h5>
+<h5 id="_23_custom_json_view_converters">23. Custom JSON View Converters</h5>
 <div class="paragraph">
 <p>JSON views now use Groovy&#8217;s <code>groovy.json.JsonGenerator</code> implementation instead of the previous Grails-specific
 JSON generator infrastructure.
@@ -1223,7 +1438,7 @@ for <code>render &#8230;&#8203; as JSON</code> and related converter-based rende
 </div>
 </div>
 <div class="sect4">
-<h5 id="_22_rendering_enum_values_as_json">22 Rendering Enum values as JSON</h5>
+<h5 id="_23_rendering_enum_values_as_json">23 Rendering Enum values as JSON</h5>
 <div class="paragraph">
 <p>It is no longer possible to render a single enum value as JSON using the <code>render(Number.ONE as JSON)</code> syntax.
 Previously, rendering an enum value would produce a JSON string with the type and name of the enum value like:</p>