diff --git a/modules/unsupported/cql2-text/pom.xml b/modules/unsupported/cql2-text/pom.xml
index 30a47a8f0d5..4b70353c8a6 100644
--- a/modules/unsupported/cql2-text/pom.xml
+++ b/modules/unsupported/cql2-text/pom.xml
@@ -32,6 +32,17 @@
tests
test
+
+ commons-io
+ commons-io
+ test
+
+
+ org.geotools
+ gt-geopkg
+ ${project.version}
+ test
+
diff --git a/modules/unsupported/cql2-text/src/test/java/org/geotools/filter/text/cql_2/conformance/ATSOnlineTest.java b/modules/unsupported/cql2-text/src/test/java/org/geotools/filter/text/cql_2/conformance/ATSOnlineTest.java
new file mode 100644
index 00000000000..65942f0f3fa
--- /dev/null
+++ b/modules/unsupported/cql2-text/src/test/java/org/geotools/filter/text/cql_2/conformance/ATSOnlineTest.java
@@ -0,0 +1,57 @@
+package org.geotools.filter.text.cql_2.conformance;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TimeZone;
+import org.apache.commons.io.FileUtils;
+import org.geotools.api.data.DataStore;
+import org.geotools.api.data.DataStoreFinder;
+import org.geotools.http.HTTPResponse;
+import org.geotools.http.SimpleHttpClient;
+import org.junit.BeforeClass;
+
+/**
+ * Base class for tests issued from the Abstract Test Suite (ATS). See
+ * https://docs.ogc.org/is/21-065r2/21-065r2.html#ats for the context.
+ *
+ *
This class will download the official Natural Earth dataset and store it into the default
+ * temporary directory.
+ */
+public abstract class ATSOnlineTest {
+
+ private static String NE_DATA_URL =
+ "https://github.com/opengeospatial/ogcapi-features/raw/refs/heads/master/cql2/standard/data/ne110m4cql2.gpkg";
+
+ protected final File neGpkg = Path.of(System.getProperty("java.io.tmpdir"), "ne.gpkg").toFile();
+
+ @BeforeClass
+ public static void forceGMT() {
+ TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
+ }
+
+ private void downloadNaturalEarthData() throws IOException {
+ if (neGpkg.exists()) {
+ return;
+ }
+ neGpkg.createNewFile();
+ SimpleHttpClient client = new SimpleHttpClient();
+ HTTPResponse r = client.get(new URL(NE_DATA_URL));
+ FileUtils.copyInputStreamToFile(r.getResponseStream(), neGpkg);
+ }
+
+ protected DataStore naturalEarthData() throws IOException {
+ downloadNaturalEarthData();
+ Map params = new HashMap();
+ params.put("dbtype", "geopkg");
+ params.put("database", neGpkg.getAbsolutePath());
+ params.put("read-only", true);
+
+ DataStore datastore = DataStoreFinder.getDataStore(params);
+
+ return datastore;
+ }
+}
diff --git a/modules/unsupported/cql2-text/src/test/java/org/geotools/filter/text/cql_2/conformance/ConformanceTest13OnlineTest.java b/modules/unsupported/cql2-text/src/test/java/org/geotools/filter/text/cql_2/conformance/ConformanceTest13OnlineTest.java
new file mode 100644
index 00000000000..6d3413b4697
--- /dev/null
+++ b/modules/unsupported/cql2-text/src/test/java/org/geotools/filter/text/cql_2/conformance/ConformanceTest13OnlineTest.java
@@ -0,0 +1,65 @@
+package org.geotools.filter.text.cql_2.conformance;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import org.geootols.filter.text.cql_2.CQL2;
+import org.geotools.api.data.DataStore;
+import org.geotools.api.filter.Filter;
+import org.geotools.filter.text.cql2.CQLException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+/** See table 9 from section A.4.4 Conformance test 13. */
+@RunWith(Parameterized.class)
+public class ConformanceTest13OnlineTest extends ATSOnlineTest {
+
+ private final String criteria;
+ private final int expectedFeatures;
+
+ public ConformanceTest13OnlineTest(String criteria, int expectedFeatures) {
+ this.criteria = criteria;
+ this.expectedFeatures = expectedFeatures;
+ }
+
+ @Parameterized.Parameters(name = "{index} {0}")
+ public static Collection