Repository: gisaia/ARLAS-server (language: python)

Issue:
Tests fail
`./release.sh` breaks on tests execution (i.e. when **not** using `--no-tests`), with following error message:

```
===> start arlas-server stack
Creating network "arlas_default" with the default driver
Pulling elasticsearch (docker.elastic.co/elasticsearch/elasticsearch:6)...
manifest for docker.elastic.co/elasticsearch/elasticsearch:6 not found
```

# Detailed description

- `release.sh` iterates over `ELASTIC_RANGE` to provide `--es=<...>` values for calls to `./scripts/tests-integration.sh`. See [here](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/release.sh#L165-L168).
- `ELASTIC_RANGE` is in fact not an array, but a string, whose value is forced to `6`, see [here](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/release.sh#L87-L96).
- This results in tests being called as follow:

```bash
./scripts/tests-integration.sh --es=6
```

- [scripts/tests-integration.sh](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/scripts/tests-integration.sh) assigns value `6` to variable `ELASTIC_VERSION` (see [here](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/scripts/tests-integration.sh#L22-25)), which is then exported (see [here](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/scripts/tests-integration.sh#L33))
- [scripts/tests-integration.sh](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/scripts/tests-integration.sh) calls [scripts/tests-integration-stage.sh](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/scripts/tests-integration-stage.sh), which in turn calls [scripts/docker-run.sh](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/scripts/docker-run.sh), see [here](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/scripts/tests-integration-stage.sh#L57), [here](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/scripts/tests-integration-stage.sh#L69), [here](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/scripts/tests-integration-stage.sh#L95) & [here](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/scripts/tests-integration-stage.sh#L138).
- [scripts/docker-run.sh](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/scripts/docker-run.sh) calls docker-compose (see [here](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/scripts/docker-run.sh#L27))
- the docker compose file uses variable `ELASTIC_VERSION` (`== 6`) as the tag for elasticsearch docker image, see [here](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/docker-compose.yml#L5)
- image `docker.elastic.co/elasticsearch/elasticsearch:6` does not exist, the tests crash.

# How to reproduce

```bash
time ./release.sh --simulate --api-major-version=0 --elastic-range=6  --arlas-release=0 --arlas-dev=0  --api-minor-version=0 --api-patch-version=0 | tee release_test_logs.txt
```

# Fix

In [this line](https://github.com/gisaia/ARLAS-server/blob/2e4a90c1af2cb560cd1977d603fb9669219feef5/release.sh#L165), replace `ELASTIC_RANGE` with `ELASTIC_VERSIONS`.


Discussion / hints:
ping @MohamedHamouGisaia 
I think I might have fixed it in branch [fix/release_tests](https://github.com/gisaia/ARLAS-server/tree/fix/release_tests) (commit 
c7b8a19), but I cannot perform a full execution of `release.sh` to validate, because of issue #412.

Fix patch:
diff --git a/Dockerfile b/Dockerfile
index 8e18bc41e..71ca27e0c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,7 +1,7 @@
 #####################
 # COMPILATION STAGE #
 #####################
-FROM maven:3.5-jdk-8-alpine as build
+FROM maven:3.8.2-openjdk-17 as build
 WORKDIR /opt/build
 
 # selectively add the POM file
@@ -17,11 +17,11 @@ RUN mvn install \
 ###################
 # PACKAGING STAGE #
 ###################
-FROM gisaia/arlas-openjdk:8-jre-alpine
+FROM gisaia/arlas-openjdk:17
 WORKDIR /opt/app
 
 # install script dependencies
-RUN apk add --update netcat-openbsd curl && rm -rf /var/cache/apk/*
+RUN apt-get update && apt-get install -y netcat-openbsd curl
 
 # application placed into /opt/app
 WORKDIR /opt/app
diff --git a/Dockerfile-package-only b/Dockerfile-package-only
index 48910495b..e8c007e07 100644
--- a/Dockerfile-package-only
+++ b/Dockerfile-package-only
@@ -1,10 +1,10 @@
 ###################
 # PACKAGING STAGE #
 ###################
-FROM gisaia/arlas-openjdk:8-jre-alpine
+FROM gisaia/arlas-openjdk:17
 
 # install script dependencies
-RUN apk add --update netcat-openbsd curl && rm -rf /var/cache/apk/*
+RUN apt-get update && apt-get install -y netcat-openbsd curl
 
 # application placed into /opt/app
 WORKDIR /opt/app
diff --git a/arlas-admin/pom.xml b/arlas-admin/pom.xml
index 09c4c3815..78487082d 100644
--- a/arlas-admin/pom.xml
+++ b/arlas-admin/pom.xml
@@ -1,39 +1,53 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>io.arlas</groupId>
-  <artifactId>arlas-admin</artifactId>
-  <version>19.7.9-SNAPSHOT</version>
-  <packaging>jar</packaging>
-  <name>ARLAS server admin</name>
-
-  <parent>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
     <groupId>io.arlas</groupId>
-    <artifactId>arlas-server-parent</artifactId>
+    <artifactId>arlas-admin</artifactId>
     <version>19.7.9-SNAPSHOT</version>
-  </parent>
+    <packaging>jar</packaging>
+    <name>ARLAS server admin</name>
+
+    <parent>
+        <groupId>io.arlas</groupId>
+        <artifactId>arlas-server-parent</artifactId>
+        <version>19.7.9-SNAPSHOT</version>
+    </parent>
 
-  <distributionManagement>
-    <snapshotRepository>
-      <id>io.arlas.server.admin</id>
-      <url>https://maven.cloudsmith.io/gisaia/public/</url>
-    </snapshotRepository>
-    <repository>
-      <id>io.arlas.server.admin</id>
-      <url>https://maven.cloudsmith.io/gisaia/public/</url>
-    </repository>
-  </distributionManagement>
+    <distributionManagement>
+        <snapshotRepository>
+            <id>io.arlas.server.admin</id>
+            <url>https://maven.cloudsmith.io/gisaia/public/</url>
+        </snapshotRepository>
+        <repository>
+            <id>io.arlas.server.admin</id>
+            <url>https://maven.cloudsmith.io/gisaia/public/</url>
+        </repository>
+    </distributionManagement>
 
-  <dependencies>
-    <dependency>
-      <groupId>io.arlas</groupId>
-      <artifactId>arlas-core</artifactId>
-      <version>19.7.9-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>com.auth0</groupId>
-      <artifactId>java-jwt</artifactId>
-      <version>${java-jwt.version}</version>
-    </dependency>
-  </dependencies>
+    <dependencies>
+        <dependency>
+            <groupId>io.arlas</groupId>
+            <artifactId>arlas-core</artifactId>
+            <version>19.7.9-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>${java-jwt.version}</version>
+        </dependency>
+    </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>17</source>
+                    <target>17</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/arlas-admin/src/main/java/io/arlas/server/admin/task/CollectionAutoDiscover.java b/arlas-admin/src/main/java/io/arlas/server/admin/task/CollectionAutoDiscover.java
index cdc408a2d..a089387b5 100644
--- a/arlas-admin/src/main/java/io/arlas/server/admin/task/CollectionAutoDiscover.java
+++ b/arlas-admin/src/main/java/io/arlas/server/admin/task/CollectionAutoDiscover.java
@@ -19,14 +19,13 @@
 
 package io.arlas.server.admin.task;
 
-import com.google.common.collect.ImmutableMultimap;
 import io.arlas.server.core.app.ArlasServerConfiguration;
 import io.arlas.server.core.app.CollectionAutoDiscoverConfiguration;
-import io.arlas.server.core.services.CollectionReferenceService;
 import io.arlas.server.core.exceptions.ArlasConfigurationException;
 import io.arlas.server.core.model.CollectionReference;
 import io.arlas.server.core.model.response.CollectionReferenceDescription;
 import io.arlas.server.core.model.response.CollectionReferenceDescriptionProperty;
+import io.arlas.server.core.services.CollectionReferenceService;
 import io.arlas.server.core.utils.MapExplorer;
 import io.arlas.server.core.utils.StringUtil;
 import io.dropwizard.servlets.tasks.Task;
@@ -34,15 +33,12 @@
 import org.slf4j.LoggerFactory;
 
 import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 
 public class CollectionAutoDiscover extends Task implements Runnable {
 
-    private CollectionReferenceService collectionReferenceService;
-    private CollectionAutoDiscoverConfiguration configuration;
+    private final CollectionReferenceService collectionReferenceService;
+    private final CollectionAutoDiscoverConfiguration configuration;
 
     Logger LOGGER = LoggerFactory.getLogger(CollectionAutoDiscover.class);
 
@@ -53,7 +49,7 @@ public CollectionAutoDiscover(CollectionReferenceService collectionReferenceServ
     }
 
     @Override
-    public void execute(ImmutableMultimap<String, String> arg0, PrintWriter arg1) throws Exception {
+    public void execute(Map<String,List<String>> arg0, PrintWriter arg1) throws Exception {
         try {
             List<CollectionReferenceDescription> discoveredCollections = collectionReferenceService.getAllIndicesAsCollections();
             List<CollectionReferenceDescription> existingCollections;
diff --git a/arlas-core/pom.xml b/arlas-core/pom.xml
index 13a02cee0..b09d7a8af 100644
--- a/arlas-core/pom.xml
+++ b/arlas-core/pom.xml
@@ -26,6 +26,39 @@
     </distributionManagement>
 
     <dependencies>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
+
+        <!-- ____________________________________________________ -->
+        <!-- DEV -->
+        <!-- ____________________________________________________ -->
+        <dependency>
+            <groupId>com.oath.cyclops</groupId>
+            <artifactId>cyclops</artifactId>
+            <version>${cyclops.version}</version>
+        </dependency>
+        <!-- ____________________________________________________ -->
+        <!-- Tests -->
+        <!-- ____________________________________________________ -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- ____________________________________________________ -->
+        <!-- LOGS -->
+        <!-- ____________________________________________________ -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-core</artifactId>
+            <version>${log4j.version}</version>
+        </dependency>
+
         <!-- ____________________________________________________ -->
         <!-- CACHE -->
         <!-- ____________________________________________________ -->
@@ -35,11 +68,6 @@
             <version>${hazelcast.version}</version>
         </dependency>
 
-        <dependency>
-            <groupId>com.hazelcast</groupId>
-            <artifactId>hazelcast-kubernetes</artifactId>
-            <version>${hazelcast.k8s.version}</version>
-        </dependency>
         <!-- ____________________________________________________ -->
         <!-- DROPWIZARD -->
         <!-- ____________________________________________________ -->
@@ -56,6 +84,12 @@
             <groupId>com.smoketurner.dropwizard</groupId>
             <artifactId>zipkin-core</artifactId>
             <version>${zipkin.dropwizard.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.dropwizard</groupId>
+                    <artifactId>dropwizard-core</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <!-- ____________________________________________________ -->
@@ -66,16 +100,38 @@
             <artifactId>dropwizard-swagger</artifactId>
             <version>${dropwizard.swagger.version}</version>
             <exclusions>
-                <exclusion><groupId>org.glassfish.jersey.containers</groupId><artifactId>jersey-container-servlet-core</artifactId></exclusion>
-                <exclusion><groupId>org.reflections</groupId><artifactId>reflections</artifactId></exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.reflections</groupId>
-            <artifactId>reflections</artifactId>
-            <version>0.9.10</version>
-            <exclusions>
-                <exclusion><groupId>com.google.guava</groupId><artifactId>guava</artifactId></exclusion>
+                <exclusion>
+                    <artifactId>caffeine</artifactId>
+                    <groupId>com.github.ben-manes.caffeine</groupId>
+                </exclusion>
+                <exclusion>
+                    <groupId>io.dropwizard</groupId>
+                    <artifactId>dropwizard-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>io.dropwizard</groupId>
+                    <artifactId>dropwizard-jackson</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>io.dropwizard</groupId>
+                    <artifactId>dropwizard-jersey</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>io.dropwizard</groupId>
+                    <artifactId>dropwizard-jetty</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>io.dropwizard</groupId>
+                    <artifactId>dropwizard-logging</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>io.dropwizard</groupId>
+                    <artifactId>dropwizard-servlets</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>io.dropwizard</groupId>
+                    <artifactId>dropwizard-util</artifactId>
+                </exclusion>
             </exclusions>
         </dependency>
 
@@ -109,54 +165,18 @@
             <groupId>io.dropwizard</groupId>
             <artifactId>dropwizard-jdbi3</artifactId>
             <version>${dropwizard.version}</version>
-            <exclusions>
-                <exclusion>
-                    <artifactId>jdbi3-core</artifactId>
-                    <groupId>org.jdbi</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>jdbi3-guava</artifactId>
-                    <groupId>org.jdbi</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>jdbi3-jodatime2</artifactId>
-                    <groupId>org.jdbi</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>jdbi3-sqlobject</artifactId>
-                    <groupId>org.jdbi</groupId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jdbi</groupId>
-            <artifactId>jdbi3-core</artifactId>
-            <version>${jdbi3.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jdbi</groupId>
-            <artifactId>jdbi3-guava</artifactId>
-            <version>${jdbi3.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jdbi</groupId>
-            <artifactId>jdbi3-jodatime2</artifactId>
-            <version>${jdbi3.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jdbi</groupId>
-            <artifactId>jdbi3-sqlobject</artifactId>
-            <version>${jdbi3.version}</version>
         </dependency>
 
         <dependency>
             <groupId>org.jdbi</groupId>
             <artifactId>jdbi3-jackson2</artifactId>
             <version>${jdbi3.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.fasterxml.jackson.core</groupId>
+                    <artifactId>jackson-databind</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>
@@ -171,12 +191,6 @@
             <version>${postgis-jdbc.version}</version>
         </dependency>
 
-        <dependency>
-            <groupId>org.postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-            <version>${postgresql.version}</version>
-        </dependency>
-
         <!-- ____________________________________________________ -->
         <!-- GEO -->
         <!-- ____________________________________________________ -->
@@ -184,11 +198,27 @@
             <groupId>org.geotools</groupId>
             <artifactId>gt-main</artifactId>
             <version>${geotools.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.commons</groupId>
+                    <artifactId>commons-text</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.commons</groupId>
+                    <artifactId>commons-lang3</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.geotools</groupId>
             <artifactId>gt-geojson</artifactId>
             <version>${geotools.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.commons</groupId>
+                    <artifactId>commons-lang3</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.geotools</groupId>
@@ -205,11 +235,6 @@
             <artifactId>protobuf-java</artifactId>
             <version>${protobuf.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.opengis</groupId>
-            <artifactId>geoapi</artifactId>
-            <version>${geoapi.version}</version>
-        </dependency>
         <dependency>
             <groupId>de.grundid.opendatalab</groupId>
             <artifactId>geojson-jackson</artifactId>
@@ -243,7 +268,28 @@
         <dependency>
             <groupId>com.neovisionaries</groupId>
             <artifactId>nv-i18n</artifactId>
-            <version>1.4</version>
+            <version>${nv-i18n.version}</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-jaxb -->
+        <dependency>
+            <groupId>org.glassfish.jersey.media</groupId>
+            <artifactId>jersey-media-jaxb</artifactId>
+            <version>${jersey-media-jaxb.version}</version>
         </dependency>
+
     </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>17</source>
+                    <target>17</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/arlas-core/src/main/java/io/arlas/server/core/impl/elastic/services/ElasticExploreService.java b/arlas-core/src/main/java/io/arlas/server/core/impl/elastic/services/ElasticExploreService.java
index fa9aa9958..03d68a789 100644
--- a/arlas-core/src/main/java/io/arlas/server/core/impl/elastic/services/ElasticExploreService.java
+++ b/arlas-core/src/main/java/io/arlas/server/core/impl/elastic/services/ElasticExploreService.java
@@ -36,7 +36,7 @@
 import io.arlas.server.core.services.ExploreService;
 import io.arlas.server.core.services.FluidSearchService;
 import io.arlas.server.core.utils.*;
-import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.common.geo.GeoPoint;
diff --git a/arlas-core/src/main/java/io/arlas/server/core/impl/elastic/utils/ElasticTool.java b/arlas-core/src/main/java/io/arlas/server/core/impl/elastic/utils/ElasticTool.java
index e9b767817..accae82f7 100644
--- a/arlas-core/src/main/java/io/arlas/server/core/impl/elastic/utils/ElasticTool.java
+++ b/arlas-core/src/main/java/io/arlas/server/core/impl/elastic/utils/ElasticTool.java
@@ -27,7 +27,6 @@
 import io.arlas.server.core.model.CollectionReference;
 import io.arlas.server.core.utils.CollectionUtil;
 import io.arlas.server.core.utils.StringUtil;
-import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.http.HttpHost;
 import org.apache.http.auth.AuthScope;
@@ -184,10 +183,10 @@ public static boolean isDateField(String field, ElasticClient client, String ind
     }
 
     public static Joda.EpochTimeParser getElasticEpochTimeParser(boolean isMilliSecond) {
-        return new Joda.EpochTimeParser(BooleanUtils.isTrue(isMilliSecond));
+        return new Joda.EpochTimeParser(Boolean.TRUE.equals(isMilliSecond));
     }
 
     public static Joda.EpochTimePrinter getElasticEpochTimePrinter(boolean isMilliSecond) {
-        return new Joda.EpochTimePrinter(BooleanUtils.isTrue(isMilliSecond));
+        return new Joda.EpochTimePrinter(Boolean.TRUE.equals(isMilliSecond));
     }
 }
diff --git a/arlas-core/src/main/java/io/arlas/server/core/impl/jdbi/postgis/PostgisSelectRequest.java b/arlas-core/src/main/java/io/arlas/server/core/impl/jdbi/postgis/PostgisSelectRequest.java
index a40da3022..406741b90 100644
--- a/arlas-core/src/main/java/io/arlas/server/core/impl/jdbi/postgis/PostgisSelectRequest.java
+++ b/arlas-core/src/main/java/io/arlas/server/core/impl/jdbi/postgis/PostgisSelectRequest.java
@@ -27,8 +27,8 @@
 import io.arlas.server.core.impl.jdbi.model.SelectRequest;
 import io.arlas.server.core.model.enumerations.AggregatedGeometryEnum;
 import io.arlas.server.core.services.FluidSearchService;
+import net.postgis.jdbc.PGgeometry;
 import org.locationtech.jts.geom.Geometry;
-import org.postgis.PGgeometry;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/arlas-core/src/main/java/io/arlas/server/core/impl/jdbi/service/JdbiExploreService.java b/arlas-core/src/main/java/io/arlas/server/core/impl/jdbi/service/JdbiExploreService.java
index 0dc5d792a..ee262d312 100644
--- a/arlas-core/src/main/java/io/arlas/server/core/impl/jdbi/service/JdbiExploreService.java
+++ b/arlas-core/src/main/java/io/arlas/server/core/impl/jdbi/service/JdbiExploreService.java
@@ -44,7 +44,7 @@
 import io.arlas.server.core.utils.GeoTileUtil;
 import io.arlas.server.core.utils.GeoUtil;
 import io.arlas.server.core.utils.ParamsParser;
-import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections4.CollectionUtils;
 import org.geojson.*;
 import org.jdbi.v3.core.Jdbi;
 import org.jdbi.v3.core.result.ResultIterable;
diff --git a/arlas-core/src/main/java/io/arlas/server/core/model/CollectionReferenceParameters.java b/arlas-core/src/main/java/io/arlas/server/core/model/CollectionReferenceParameters.java
index 4367d9d40..f8d9702d9 100644
--- a/arlas-core/src/main/java/io/arlas/server/core/model/CollectionReferenceParameters.java
+++ b/arlas-core/src/main/java/io/arlas/server/core/model/CollectionReferenceParameters.java
@@ -24,8 +24,8 @@
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.arlas.server.core.model.enumerations.GeoTypeEnum;
 import io.arlas.server.core.model.request.Filter;
-import org.hibernate.validator.constraints.NotEmpty;
 
+import javax.validation.constraints.NotEmpty;
 import java.io.Serializable;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
diff --git a/arlas-core/src/main/java/io/arlas/server/core/model/response/Hits.java b/arlas-core/src/main/java/io/arlas/server/core/model/response/Hits.java
index 16d1f96ba..665aacded 100644
--- a/arlas-core/src/main/java/io/arlas/server/core/model/response/Hits.java
+++ b/arlas-core/src/main/java/io/arlas/server/core/model/response/Hits.java
@@ -31,13 +31,13 @@ public class Hits {
     public List<Hit> hits;
     public long nbhits;
     public long totalnb;
-    public HashMap<String,Link> links;
+    public HashMap<String, Link> links;
 
     public Hits(String collection) {
         this.collection = collection;
     }
 
-    public Hits(String collection, List<Hit> hits, long totalnb, HashMap<String,Link> links) {
+    public Hits(String collection, List<Hit> hits, long totalnb, HashMap<String, Link> links) {
         this.collection = collection;
         this.hits = hits;
         this.nbhits = hits.size();
diff --git a/arlas-core/src/main/java/io/arlas/server/core/utils/CheckParams.java b/arlas-core/src/main/java/io/arlas/server/core/utils/CheckParams.java
index 2acd650c5..30ffc3a00 100644
--- a/arlas-core/src/main/java/io/arlas/server/core/utils/CheckParams.java
+++ b/arlas-core/src/main/java/io/arlas/server/core/utils/CheckParams.java
@@ -31,7 +31,7 @@
 import io.arlas.server.core.model.enumerations.*;
 import io.arlas.server.core.model.request.*;
 import io.arlas.server.core.model.response.FieldType;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.joda.time.format.DateTimeFormat;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.Polygon;
diff --git a/arlas-core/src/main/java/io/arlas/server/core/utils/CollectionUtil.java b/arlas-core/src/main/java/io/arlas/server/core/utils/CollectionUtil.java
index 7b7451846..a812e1d6f 100644
--- a/arlas-core/src/main/java/io/arlas/server/core/utils/CollectionUtil.java
+++ b/arlas-core/src/main/java/io/arlas/server/core/utils/CollectionUtil.java
@@ -20,7 +20,7 @@
 
 import io.arlas.server.core.exceptions.ArlasException;
 import io.arlas.server.core.exceptions.NotFoundException;
-import org.apache.commons.collections.IteratorUtils;
+import org.apache.commons.collections4.IteratorUtils;
 
 import java.util.LinkedHashMap;
 import java.util.List;
diff --git a/arlas-core/src/main/java/io/arlas/server/core/utils/MapExplorer.java b/arlas-core/src/main/java/io/arlas/server/core/utils/MapExplorer.java
index 7aa6acb00..2b0d45f20 100644
--- a/arlas-core/src/main/java/io/arlas/server/core/utils/MapExplorer.java
+++ b/arlas-core/src/main/java/io/arlas/server/core/utils/MapExplorer.java
@@ -19,7 +19,6 @@
 
 package io.arlas.server.core.utils;
 
-import com.google.common.collect.Streams;
 import cyclops.data.tuple.Tuple2;
 import cyclops.reactive.ReactiveSeq;
 import io.arlas.server.core.model.response.CollectionReferenceDescriptionProperty;
@@ -61,30 +60,29 @@ public static Map<String, Object> flat(Object source, Function<Map<List<String>,
     }
 
     private static void flat(List<String> keyParts, Object source, Map<List<String>, Object> flatted, Set<String> exclude) {
-        if(source==null){
-            flatted.put(keyParts,source);
-        }else if(exclude.stream().anyMatch(donotstartwith->String.join(".",keyParts).startsWith(donotstartwith))){
+        if (source == null) {
+            flatted.put(keyParts, source);
+        } else if (exclude.stream().anyMatch(donotstartwith->String.join(".",keyParts).startsWith(donotstartwith))) {
             // Nothing to do: should not be exported in the map
-        }else if (source instanceof Map) {
+        } else if (source instanceof Map) {
             ((Map) source).forEach((key,value)->{
                 List<String> extendedParts=new ArrayList<>(keyParts);
                 extendedParts.add((String)key);
                 flat(extendedParts,value, flatted, exclude);
             });
-        }else if(source instanceof Collection || source.getClass().isArray()) {
-            Collection collection = source instanceof Collection?(Collection)source:Arrays.asList(source);
-            Streams.mapWithIndex(collection.stream(),(value, i) -> {
+        } else if (source instanceof Collection || source.getClass().isArray()) {
+            Collection<Object> collection = source instanceof Collection?(Collection)source:Arrays.asList(source);
+            ReactiveSeq.fromStream(collection.stream()).zipWithIndex().forEach((tuple) -> {
                 List<String> extendedParts=new ArrayList<>(keyParts);
-                extendedParts.add(""+i);
-                flat(extendedParts,value, flatted, exclude);
-                return value;
-            }).count();
-        }else{
+                extendedParts.add("" + tuple._2());
+                flat(extendedParts,tuple._1(), flatted, exclude);
+            });
+        } else {
             flatted.put(keyParts,source);
         }
     }
 
-    public static class ReduceArrayOnKey implements Function<Map<List<String>, Object>,Map<String, Object>>{
+    public static class ReduceArrayOnKey implements Function<Map<List<String>, Object>,Map<String, Object>> {
         private String separator="/";
         public ReduceArrayOnKey(){}
         public ReduceArrayOnKey(String separator){this.separator = separator;}
diff --git a/arlas-core/src/main/java/io/arlas/server/core/utils/ParamsParser.java b/arlas-core/src/main/java/io/arlas/server/core/utils/ParamsParser.java
index bb3ab1d7a..a5c789c5a 100644
--- a/arlas-core/src/main/java/io/arlas/server/core/utils/ParamsParser.java
+++ b/arlas-core/src/main/java/io/arlas/server/core/utils/ParamsParser.java
@@ -29,7 +29,7 @@
 import io.arlas.server.core.model.request.*;
 import io.arlas.server.core.model.response.FieldType;
 import io.dropwizard.jersey.params.IntParam;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.elasticsearch.common.geo.GeoPoint;
 import org.joda.time.format.DateTimeFormat;
@@ -49,7 +49,6 @@
 import java.util.stream.IntStream;
 
 import static io.arlas.server.core.services.FluidSearchService.*;
-
 import static io.arlas.server.core.utils.CheckParams.GEO_AGGREGATION_TYPE_ENUMS;
 
 public class ParamsParser {
diff --git a/arlas-opensearch/pom.xml b/arlas-opensearch/pom.xml
index 342f942f5..62a3924f0 100644
--- a/arlas-opensearch/pom.xml
+++ b/arlas-opensearch/pom.xml
@@ -1,28 +1,42 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>io.arlas</groupId>
-  <artifactId>arlas-opensearch</artifactId>
-  <version>19.7.9-SNAPSHOT</version>
-  <packaging>jar</packaging>
-  <name>ARLAS server opensearch</name>
-
-  <parent>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
     <groupId>io.arlas</groupId>
-    <artifactId>arlas-server-parent</artifactId>
+    <artifactId>arlas-opensearch</artifactId>
     <version>19.7.9-SNAPSHOT</version>
-  </parent>
+    <packaging>jar</packaging>
+    <name>ARLAS server opensearch</name>
+
+    <parent>
+        <groupId>io.arlas</groupId>
+        <artifactId>arlas-server-parent</artifactId>
+        <version>19.7.9-SNAPSHOT</version>
+    </parent>
 
-  <dependencies>
-    <dependency>
-      <groupId>io.arlas</groupId>
-      <artifactId>arlas-rest</artifactId>
-      <version>19.7.9-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>io.arlas</groupId>
-      <artifactId>ogc-common</artifactId>
-      <version>19.7.9-SNAPSHOT</version>
-    </dependency>
-  </dependencies>
+    <dependencies>
+        <dependency>
+            <groupId>io.arlas</groupId>
+            <artifactId>arlas-rest</artifactId>
+            <version>19.7.9-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>io.arlas</groupId>
+            <artifactId>ogc-common</artifactId>
+            <version>19.7.9-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>17</source>
+                    <target>17</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/arlas-opensearch/src/main/java/io/arlas/server/opensearch/rest/explore/AtomHitsMessageBodyWriter.java b/arlas-opensearch/src/main/java/io/arlas/server/opensearch/rest/explore/AtomHitsMessageBodyWriter.java
index 6e5af47eb..7d812083d 100644
--- a/arlas-opensearch/src/main/java/io/arlas/server/opensearch/rest/explore/AtomHitsMessageBodyWriter.java
+++ b/arlas-opensearch/src/main/java/io/arlas/server/opensearch/rest/explore/AtomHitsMessageBodyWriter.java
@@ -188,6 +188,9 @@ private String toString(Object o) {
     private void writeElement(XMLStreamWriter writer, String namespace, String tag, String value) {
         if (!StringUtil.isNullOrEmpty(value)) {
             try {
+                if (Character.isDigit(tag.charAt(0))) {
+                    tag = "_" + tag; // QNname cannot start with a digit
+                }
                 writer.writeStartElement(namespace, tag);
                 writer.writeCharacters(value);
                 writer.writeEndElement();
diff --git a/arlas-opensearch/src/main/java/io/arlas/server/opensearch/rest/explore/OpenSearchDescriptorService.java b/arlas-opensearch/src/main/java/io/arlas/server/opensearch/rest/explore/OpenSearchDescriptorService.java
index 209ea95e1..68b143184 100644
--- a/arlas-opensearch/src/main/java/io/arlas/server/opensearch/rest/explore/OpenSearchDescriptorService.java
+++ b/arlas-opensearch/src/main/java/io/arlas/server/opensearch/rest/explore/OpenSearchDescriptorService.java
@@ -49,9 +49,6 @@
 
 public class OpenSearchDescriptorService extends ExploreRESTServices {
 
-    @Context
-    UriInfo uri;
-
     public OpenSearchDescriptorService(ExploreService exploreService) {
         super(exploreService);
     }
@@ -65,7 +62,7 @@ public OpenSearchDescriptorService(ExploreService exploreService) {
     @ApiOperation(value = "OpenSearch Description Document", produces = MIME_TYPE_XML, notes = Documentation.OPENSEARCH_OPERATION)
     @ApiResponses(value = {@ApiResponse(code = 200, message = "Successful operation"),
             @ApiResponse(code = 500, message = "Arlas Server Error.", response = Error.class), @ApiResponse(code = 400, message = "Bad request.", response = Error.class)})
-    public Response opensearch(
+    public Response opensearch(@Context UriInfo uri,
             // --------------------------------------------------------
             // ----------------------- PATH -----------------------
             // --------------------------------------------------------
@@ -93,7 +90,7 @@ public Response opensearch(
         }
         ColumnFilterUtil.assertCollectionsAllowed(columnFilter, Collections.singletonList(cr));
         OpenSearchDescription description = new OpenSearchDescription();
-        String prefix = uri.getBaseUri().toURL().toString() + uri.getPath() + "/../_search";
+        String prefix = uri.getBaseUri().toURL() + uri.getPath() + "/../_search";
 
         //[scheme:][//authority][path][?query][#fragment]
         if (cr.params.openSearch != null) {
@@ -146,29 +143,16 @@ private void addURLs(String templatePrefix, List<Url> urls, Map<String, Collecti
                 String fieldPath = String.join(".", new ArrayList<>(namespace));
                 if (property.indexed) {
                     switch (property.type) {
-                        case DATE:
-                        case LONG:
-                            addNumberUrls(urls, templatePrefix, fieldPath, "long");
-                            break;
-                        case DOUBLE:
-                            addNumberUrls(urls, templatePrefix, fieldPath, "double");
-                            break;
-                        case FLOAT:
-                            addNumberUrls(urls, templatePrefix, fieldPath, "float");
-                            break;
-                        case SHORT:
-                            addNumberUrls(urls, templatePrefix, fieldPath, "short");
-                            break;
-                        case INTEGER:
-                            addNumberUrls(urls, templatePrefix, fieldPath, "integer");
-                            break;
-                        case TEXT:
+                        case DATE, LONG -> addNumberUrls(urls, templatePrefix, fieldPath, "long");
+                        case DOUBLE -> addNumberUrls(urls, templatePrefix, fieldPath, "double");
+                        case FLOAT -> addNumberUrls(urls, templatePrefix, fieldPath, "float");
+                        case SHORT -> addNumberUrls(urls, templatePrefix, fieldPath, "short");
+                        case INTEGER -> addNumberUrls(urls, templatePrefix, fieldPath, "integer");
+                        case TEXT -> {
                             urls.add(url(templatePrefix + "?f=" + fieldPath + ":eq:{text?}"));
                             urls.add(url(templatePrefix + "?f=" + fieldPath + ":like:{text?}"));
-                            break;
-                        case KEYWORD:
-                            urls.add(url(templatePrefix + "?f=" + fieldPath + ":eq:{text?}"));
-                            break;
+                        }
+                        case KEYWORD -> urls.add(url(templatePrefix + "?f=" + fieldPath + ":eq:{text?}"));
                     }
                 }
 
diff --git a/arlas-rest/pom.xml b/arlas-rest/pom.xml
index 82fbd434f..62f5eb947 100644
--- a/arlas-rest/pom.xml
+++ b/arlas-rest/pom.xml
@@ -1,23 +1,37 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>io.arlas</groupId>
-  <artifactId>arlas-rest</artifactId>
-  <version>19.7.9-SNAPSHOT</version>
-  <packaging>jar</packaging>
-  <name>ARLAS server rest</name>
-
-  <parent>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
     <groupId>io.arlas</groupId>
-    <artifactId>arlas-server-parent</artifactId>
+    <artifactId>arlas-rest</artifactId>
     <version>19.7.9-SNAPSHOT</version>
-  </parent>
+    <packaging>jar</packaging>
+    <name>ARLAS server rest</name>
+
+    <parent>
+        <groupId>io.arlas</groupId>
+        <artifactId>arlas-server-parent</artifactId>
+        <version>19.7.9-SNAPSHOT</version>
+    </parent>
 
-  <dependencies>
-    <dependency>
-      <groupId>io.arlas</groupId>
-      <artifactId>arlas-core</artifactId>
-      <version>19.7.9-SNAPSHOT</version>
-    </dependency>
-  </dependencies>
+    <dependencies>
+        <dependency>
+            <groupId>io.arlas</groupId>
+            <artifactId>arlas-core</artifactId>
+            <version>19.7.9-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>17</source>
+                    <target>17</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/arlas-rest/src/main/java/io/arlas/server/rest/collections/CollectionService.java b/arlas-rest/src/main/java/io/arlas/server/rest/collections/CollectionService.java
index 82ba73885..689b61ce2 100644
--- a/arlas-rest/src/main/java/io/arlas/server/rest/collections/CollectionService.java
+++ b/arlas-rest/src/main/java/io/arlas/server/rest/collections/CollectionService.java
@@ -66,7 +66,6 @@ public CollectionService(ArlasServerConfiguration configuration, CollectionRefer
     }
 
     @Timed
-    @Path("/")
     @GET
     @Produces(UTF8JSON)
     @Consumes(UTF8JSON)
diff --git a/arlas-rest/src/main/java/io/arlas/server/rest/explore/aggregate/AggregateRESTService.java b/arlas-rest/src/main/java/io/arlas/server/rest/explore/aggregate/AggregateRESTService.java
index de6068ff0..2696f93b3 100644
--- a/arlas-rest/src/main/java/io/arlas/server/rest/explore/aggregate/AggregateRESTService.java
+++ b/arlas-rest/src/main/java/io/arlas/server/rest/explore/aggregate/AggregateRESTService.java
@@ -37,7 +37,6 @@
 import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
-import org.apache.commons.lang3.BooleanUtils;
 
 import javax.ws.rs.*;
 import javax.ws.rs.core.Response;
@@ -139,7 +138,7 @@ public Response aggregate(
         request.headerRequest = aggregationsRequestHeader;
         request.columnFilter = ColumnFilterUtil.getCollectionRelatedColumnFilter(columnFilter, collectionReference);
 
-        AggregationResponse aggregationResponse = getArlasAggregation(request, collectionReference, BooleanUtils.isTrue(flat));
+        AggregationResponse aggregationResponse = getArlasAggregation(request, collectionReference, Boolean.TRUE.equals(flat));
         aggregationResponse.totalTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startArlasTime);
         return cache(Response.ok(aggregationResponse), maxagecache);
     }
@@ -211,7 +210,7 @@ public Response aggregatePost(
         request.headerRequest = aggregationsRequestHeader;
         request.columnFilter = ColumnFilterUtil.getCollectionRelatedColumnFilter(columnFilter, collectionReference);
 
-        AggregationResponse aggregationResponse = getArlasAggregation(request, collectionReference, (aggregationsRequest.form != null && BooleanUtils.isTrue(aggregationsRequest.form.flat)));
+        AggregationResponse aggregationResponse = getArlasAggregation(request, collectionReference, (aggregationsRequest.form != null && Boolean.TRUE.equals(aggregationsRequest.form.flat)));
         aggregationResponse.totalTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startArlasTime);
 
         return cache(Response.ok(aggregationResponse), maxagecache);
diff --git a/arlas-rest/src/main/java/io/arlas/server/rest/explore/aggregate/GeoAggregateRESTService.java b/arlas-rest/src/main/java/io/arlas/server/rest/explore/aggregate/GeoAggregateRESTService.java
index dacc265fa..283433c4d 100644
--- a/arlas-rest/src/main/java/io/arlas/server/rest/explore/aggregate/GeoAggregateRESTService.java
+++ b/arlas-rest/src/main/java/io/arlas/server/rest/explore/aggregate/GeoAggregateRESTService.java
@@ -38,7 +38,7 @@
 import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
-import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.io.FileUtils;
 import org.geojson.Feature;
 import org.geojson.FeatureCollection;
@@ -54,7 +54,7 @@
 
 public class GeoAggregateRESTService extends ExploreRESTServices {
 
-    private static double GEOHASH_EPSILON = 0.00000001;
+    private static final double GEOHASH_EPSILON = 0.00000001;
     public GeoAggregateRESTService(ExploreService exploreService) {
         super(exploreService);
     }
@@ -489,7 +489,7 @@ private List<BoundingBox> getBoundingBoxes(String geohash, List<String> agg, Col
                     new BoundingBox(midLat, bbox.getSouth(), midLon, bbox.getEast()));
         } else {
             LOGGER.debug("interval - geohash <= 2");
-            return Arrays.asList(bbox);
+            return List.of(bbox);
         }
     }
 
@@ -520,7 +520,7 @@ private List<BoundingBox> getBoundingBoxes(Integer z, Integer x, Integer y, List
                     new BoundingBox(midLat, bbox.getSouth(), midLon, bbox.getEast()));
         } else {
             LOGGER.debug("interval - z < 7");
-            return Arrays.asList(bbox);
+            return List.of(bbox);
         }
     }
 
@@ -546,7 +546,8 @@ private AggregationResponse merge(List<AggregationResponse> aggResponses) {
     @Consumes(UTF8JSON)
     @ApiOperation(value = "GeoAggregate", produces = UTF8JSON, notes = Documentation.GEOAGGREGATION_OPERATION, consumes = UTF8JSON, response = FeatureCollection.class)
     @ApiResponses(value = {@ApiResponse(code = 200, message = "Successful operation", response = FeatureCollection.class, responseContainer = "FeatureCollection"),
-            @ApiResponse(code = 500, message = "Arlas Server Error.", response = Error.class), @ApiResponse(code = 400, message = "Bad request.", response = Error.class),
+            @ApiResponse(code = 500, message = "Arlas Server Error.", response = Error.class),
+            @ApiResponse(code = 400, message = "Bad request.", response = Error.class),
             @ApiResponse(code = 501, message = "Not implemented functionality.", response = Error.class)})
     public Response geoaggregatePost(
             // --------------------------------------------------------
@@ -682,7 +683,7 @@ public Response shapeaggregatePost(
         } finally {
             try {
                 FileUtils.forceDeleteOnExit(result);
-            } catch (IOException e) {
+            } catch (IOException ignored) {
             }
         }
     }
@@ -720,7 +721,7 @@ private Response geoaggregate(CollectionReference collectionReference, Filter fi
             } finally {
                 try {
                     FileUtils.forceDeleteOnExit(result);
-                } catch (IOException e) {
+                } catch (IOException ignored) {
                 }
             }
         } else {
@@ -764,7 +765,7 @@ private FeatureCollection toGeoJson(AggregationResponse aggregationResponse, Agg
                            properties.put("key", element.keyAsString);
                        }
                        if (flat) {
-                           exploreService.flat(element, new MapExplorer.ReduceArrayOnKey(ArlasServerConfiguration.FLATTEN_CHAR), s -> (!"elements".equals(s))).forEach(properties::put);
+                           properties.putAll(exploreService.flat(element, new MapExplorer.ReduceArrayOnKey(ArlasServerConfiguration.FLATTEN_CHAR), s -> (!"elements".equals(s))));
                        }else{
                            properties.put("elements", element.elements);
                            properties.put("metrics", element.metrics);
diff --git a/arlas-rest/src/main/java/io/arlas/server/rest/explore/raw/RawRESTService.java b/arlas-rest/src/main/java/io/arlas/server/rest/explore/raw/RawRESTService.java
index 8f013fe8b..511d682cf 100644
--- a/arlas-rest/src/main/java/io/arlas/server/rest/explore/raw/RawRESTService.java
+++ b/arlas-rest/src/main/java/io/arlas/server/rest/explore/raw/RawRESTService.java
@@ -33,7 +33,6 @@
 import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
-import org.apache.commons.lang3.BooleanUtils;
 
 import javax.ws.rs.*;
 import javax.ws.rs.core.Response;
@@ -116,7 +115,7 @@ public Response getArlasHit(
             throw new NotFoundException("Document " + identifier + " not found.");
         }
 
-        Hit hit = new Hit(collectionReference, source, BooleanUtils.isTrue(flat), false);
+        Hit hit = new Hit(collectionReference, source, Boolean.TRUE.equals(flat), false);
         return cache(Response.ok(hit), maxagecache);
     }
 }
diff --git a/arlas-rest/src/main/java/io/arlas/server/rest/explore/search/SearchRESTService.java b/arlas-rest/src/main/java/io/arlas/server/rest/explore/search/SearchRESTService.java
index 0eac891e4..95c234df7 100644
--- a/arlas-rest/src/main/java/io/arlas/server/rest/explore/search/SearchRESTService.java
+++ b/arlas-rest/src/main/java/io/arlas/server/rest/explore/search/SearchRESTService.java
@@ -38,7 +38,6 @@
 import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
-import org.apache.commons.lang3.BooleanUtils;
 
 import javax.ws.rs.*;
 import javax.ws.rs.core.Context;
@@ -193,7 +192,7 @@ public Response search(
         request.headerRequest = searchHeader;
         request.columnFilter = ColumnFilterUtil.getCollectionRelatedColumnFilter(columnFilter, collectionReference);
 
-        Hits hits = exploreService.search(request, collectionReference, BooleanUtils.isTrue(flat), uriInfo,"GET");
+        Hits hits = exploreService.search(request, collectionReference, Boolean.TRUE.equals(flat), uriInfo,"GET");
         return cache(Response.ok(hits), maxagecache);
     }
 
@@ -268,7 +267,7 @@ public Response searchPost(
         request.headerRequest = searchHeader;
         request.columnFilter = ColumnFilterUtil.getCollectionRelatedColumnFilter(columnFilter, collectionReference);
 
-        Hits hits = exploreService.search(request, collectionReference, (search.form != null && BooleanUtils.isTrue(search.form.flat)),uriInfo,"POST");
+        Hits hits = exploreService.search(request, collectionReference, (search.form != null && Boolean.TRUE.equals(search.form.flat)),uriInfo,"POST");
         return cache(Response.ok(hits), maxagecache);
     }
 }
diff --git a/arlas-server/pom.xml b/arlas-server/pom.xml
index a537a871d..4810cd540 100644
--- a/arlas-server/pom.xml
+++ b/arlas-server/pom.xml
@@ -1,4 +1,6 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>io.arlas</groupId>
   <artifactId>arlas-server</artifactId>
@@ -48,11 +50,23 @@
       <groupId>io.swagger.core.v3</groupId>
       <artifactId>swagger-core</artifactId>
       <version>${swaggerv3.version}</version>
+      <exclusions>
+        <exclusion>
+          <artifactId>commons-lang3</artifactId>
+          <groupId>org.apache.commons</groupId>
+        </exclusion>
+      </exclusions>
     </dependency>
     <dependency>
       <groupId>io.swagger.core.v3</groupId>
       <artifactId>swagger-jaxrs2</artifactId>
       <version>${swaggerv3.version}</version>
+      <exclusions>
+        <exclusion>
+          <artifactId>javassist</artifactId>
+          <groupId>org.javassist</groupId>
+        </exclusion>
+      </exclusions>
     </dependency>
     <dependency>
       <groupId>io.swagger.core.v3</groupId>
@@ -63,10 +77,18 @@
 
   <build>
     <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>17</source>
+          <target>17</target>
+        </configuration>
+      </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-shade-plugin</artifactId>
-        <version>3.1.1</version>
+        <version>3.2.4</version>
         <executions>
           <execution>
             <phase>package</phase>
@@ -86,22 +108,22 @@
               </filters>
               <transformers>
                 <transformer
-                  implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
-                  <transformer
-                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                    <mainClass>io/arlas/server/app/ArlasServer</mainClass>
-                    <manifestEntries>
-                      <Specification-Title>Java Advanced Imaging Image I/O Tools</Specification-Title>
-                      <Specification-Version>1.1</Specification-Version>
-                      <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor>
-                      <Implementation-Title>com.sun.media.imageio</Implementation-Title>
-                      <Implementation-Version>1.1</Implementation-Version>
-                      <Implementation-Vendor>Sun Microsystems, Inc.</Implementation-Vendor>
-                    </manifestEntries>
+                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
+                <transformer
+                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                  <mainClass>io/arlas/server/app/ArlasServer</mainClass>
+                  <manifestEntries>
+                    <Specification-Title>Java Advanced Imaging Image I/O Tools</Specification-Title>
+                    <Specification-Version>1.1</Specification-Version>
+                    <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor>
+                    <Implementation-Title>com.sun.media.imageio</Implementation-Title>
+                    <Implementation-Version>1.1</Implementation-Version>
+                    <Implementation-Vendor>Sun Microsystems, Inc.</Implementation-Vendor>
+                  </manifestEntries>
 
-                  </transformer>
-                </transformers>
-              </configuration>
+                </transformer>
+              </transformers>
+            </configuration>
           </execution>
         </executions>
       </plugin>
diff --git a/arlas-server/src/main/java/io/arlas/server/app/ArlasServer.java b/arlas-server/src/main/java/io/arlas/server/app/ArlasServer.java
index eabd78774..dadcf0af0 100644
--- a/arlas-server/src/main/java/io/arlas/server/app/ArlasServer.java
+++ b/arlas-server/src/main/java/io/arlas/server/app/ArlasServer.java
@@ -21,6 +21,7 @@
 
 import brave.http.HttpTracing;
 import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.smoketurner.dropwizard.zipkin.ZipkinBundle;
@@ -108,6 +109,7 @@ public static void main(String... args) throws Exception {
     @Override
     public void initialize(Bootstrap<ArlasServerConfiguration> bootstrap) {
         bootstrap.registerMetrics();
+        bootstrap.getObjectMapper().enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
         bootstrap.setConfigurationSourceProvider(new SubstitutingSourceProvider(
                 bootstrap.getConfigurationSourceProvider(), new EnvironmentVariableSubstitutor(false)));
         bootstrap.addBundle(new SwaggerBundle<ArlasServerConfiguration>() {
@@ -234,8 +236,10 @@ public void run(ArlasServerConfiguration configuration, Environment environment)
             SwaggerConfiguration oasConfig = new SwaggerConfiguration()
                     .openAPI(new OpenAPI().info(info).servers(Collections.singletonList(new Server().url(baseUri))))
                     .prettyPrint(true)
-                    .ignoredRoutes(Arrays.asList("/ogc", "/explore", "/collections", "/swagger", "/swagger.{type}"))
-                    .resourcePackages(Stream.of("io.arlas.server.stac.api")
+                    .resourceClasses(Stream.of("io.arlas.server.stac.api.StacCoreRESTService",
+                                    "io.arlas.server.stac.api.StacCollectionsRESTService",
+                                    "io.arlas.server.stac.api.StacConformanceRESTService",
+                                    "io.arlas.server.stac.api.StacSearchRESTService")
                             .collect(Collectors.toSet()));
             environment.jersey().register(new OpenApiResource().openApiConfiguration(oasConfig));
             //
diff --git a/arlas-server/src/main/resources/swagger-static/custom-request-interceptor.js b/arlas-server/src/main/resources/swagger-static/custom-request-interceptor.js
new file mode 100644
index 000000000..22189599b
--- /dev/null
+++ b/arlas-server/src/main/resources/swagger-static/custom-request-interceptor.js
@@ -0,0 +1,3 @@
+function customRequestInterceptor(request) {
+    return request;
+}
diff --git a/conf/configuration.yaml b/conf/configuration.yaml
index d20315c51..6333a2629 100644
--- a/conf/configuration.yaml
+++ b/conf/configuration.yaml
@@ -4,7 +4,9 @@
 #
 swagger: # Configuration of SWAGGER for generating documentation and APIs
   resourcePackage: io.arlas.server.rest # The java package to process for extracting the APIs
-
+  # temporary patch for bug https://github.com/smoketurner/dropwizard-swagger/issues/206
+  # to be removed when version of dropwizard.swagger.version is upgraded
+  customJavascript: "/arlas/swagger-static/custom-request-interceptor.js"
 
 
 ########################################################
diff --git a/docker-compose-elasticsearch.yml b/docker-compose-elasticsearch.yml
index ae5d20364..fe7861d70 100644
--- a/docker-compose-elasticsearch.yml
+++ b/docker-compose-elasticsearch.yml
@@ -2,7 +2,7 @@ version: '3'
 
 services:
   elasticsearch:
-    image: docker.elastic.co/elasticsearch/elasticsearch:${ELASTIC_VERSION:-7.14.2}
+    image: docker.elastic.co/elasticsearch/elasticsearch:${ELASTIC_VERSION:-7.15.2}
     container_name: elasticsearch
     environment:
       - discovery.type=single-node
diff --git a/docker-resources/wait-for-elasticsearch.sh b/docker-resources/wait-for-elasticsearch.sh
index 526842868..4db9ebc8f 100755
--- a/docker-resources/wait-for-elasticsearch.sh
+++ b/docker-resources/wait-for-elasticsearch.sh
@@ -1,4 +1,4 @@
-#!/bin/sh -ex
+#!/bin/bash
 set -e
 
 script_name="$(basename "$(readlink -f "$0")")"
diff --git a/mkDocs.sh b/mkDocs.sh
index b75ef5f98..83e0a56e6 100755
--- a/mkDocs.sh
+++ b/mkDocs.sh
@@ -96,7 +96,7 @@ docker run --rm \
     -w /opt/maven \
 	-v $PWD:/opt/maven \
 	-v $HOME/.m2:/root/.m2 \
-	maven:3.5.0-jdk-8 \
+	maven:3.8.2-openjdk-17 \
     mvn swagger2markup:convertSwagger2markup post-integration-test
 docker run --rm \
     -v $PWD:/opt/maven \
diff --git a/ogc-common/pom.xml b/ogc-common/pom.xml
index 5da1f1a72..957b4a242 100644
--- a/ogc-common/pom.xml
+++ b/ogc-common/pom.xml
@@ -1,4 +1,6 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>io.arlas</groupId>
   <artifactId>ogc-common</artifactId>
@@ -18,6 +20,12 @@
       <artifactId>arlas-core</artifactId>
       <version>19.7.9-SNAPSHOT</version>
     </dependency>
+
+    <dependency>
+      <groupId>org.glassfish.jaxb</groupId>
+      <artifactId>jaxb-runtime</artifactId>
+      <version>${jaxb.version}</version>
+    </dependency>
   </dependencies>
 
   <build>
@@ -25,7 +33,7 @@
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>jaxb2-maven-plugin</artifactId>
-        <version>2.2</version>
+        <version>2.5.0</version>
         <executions>
           <execution>
             <id>xjc</id>
@@ -41,8 +49,8 @@
           <sources>
             <source>src/main/resources/wfs-2.0.xsd</source>
             <source>src/main/resources/csw/cswAll.xsd</source>
-            <source> src/main/resources/csw/atom/atom.xsd</source>
-            <source> src/main/resources/csw/atom/opensearch.xsd</source>
+            <source>src/main/resources/csw/atom/atom.xsd</source>
+            <source>src/main/resources/csw/atom/opensearch.xsd</source>
           </sources>
           <arguments>
             <argument>-Xannotate</argument>
@@ -60,21 +68,29 @@
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>build-helper-maven-plugin</artifactId>
-        <version>1.8</version>
-        <configuration>
-          <sources>
-            <source>target/generated-sources/jaxb</source>
-          </sources>
-        </configuration>
+        <version>3.2.0</version>
         <executions>
           <execution>
             <phase>generate-sources</phase>
             <goals>
               <goal>add-source</goal>
             </goals>
+            <configuration>
+              <sources>
+                <source>target/generated-sources/jaxb</source>
+              </sources>
+            </configuration>
           </execution>
         </executions>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>17</source>
+          <target>17</target>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 
diff --git a/ogc-common/src/main/java/io/arlas/server/ogc/common/exceptions/OGC/OGCException.java b/ogc-common/src/main/java/io/arlas/server/ogc/common/exceptions/OGC/OGCException.java
index dca3a909c..4a7deb536 100644
--- a/ogc-common/src/main/java/io/arlas/server/ogc/common/exceptions/OGC/OGCException.java
+++ b/ogc-common/src/main/java/io/arlas/server/ogc/common/exceptions/OGC/OGCException.java
@@ -23,7 +23,7 @@
 import io.arlas.server.core.exceptions.ArlasException;
 import io.arlas.server.ogc.common.model.response.OGCError;
 import io.arlas.server.ogc.common.model.Service;
-import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections4.CollectionUtils;
 
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
diff --git a/ogc-common/src/main/java/io/arlas/server/ogc/common/requestfilter/ElasticFilter.java b/ogc-common/src/main/java/io/arlas/server/ogc/common/requestfilter/ElasticFilter.java
index 5c97bdf91..8c7e50bc0 100644
--- a/ogc-common/src/main/java/io/arlas/server/ogc/common/requestfilter/ElasticFilter.java
+++ b/ogc-common/src/main/java/io/arlas/server/ogc/common/requestfilter/ElasticFilter.java
@@ -21,12 +21,12 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import io.arlas.server.core.exceptions.ArlasException;
-import io.arlas.server.ogc.common.exceptions.OGC.OGCException;
 import io.arlas.server.core.model.response.CollectionReferenceDescription;
-import io.arlas.server.ogc.common.model.Service;
-import io.arlas.server.ogc.common.utils.OpenGISFieldsExtractor;
 import io.arlas.server.core.utils.BoundingBox;
 import io.arlas.server.core.utils.ColumnFilterUtil;
+import io.arlas.server.ogc.common.exceptions.OGC.OGCException;
+import io.arlas.server.ogc.common.model.Service;
+import io.arlas.server.ogc.common.utils.OpenGISFieldsExtractor;
 import org.elasticsearch.common.geo.Orientation;
 import org.elasticsearch.common.geo.builders.CoordinatesBuilder;
 import org.elasticsearch.common.geo.builders.PolygonBuilder;
@@ -34,10 +34,11 @@
 import org.elasticsearch.index.query.Operator;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.geotools.filter.v2_0.FESConfiguration;
-import org.geotools.xml.Parser;
+import org.geotools.xsd.Parser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.SAXException;
+
 import javax.xml.parsers.ParserConfigurationException;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
diff --git a/ogc-common/src/main/java/io/arlas/server/ogc/common/requestfilter/FilterToElastic.java b/ogc-common/src/main/java/io/arlas/server/ogc/common/requestfilter/FilterToElastic.java
index 7b9adc8b9..f3b6aa920 100644
--- a/ogc-common/src/main/java/io/arlas/server/ogc/common/requestfilter/FilterToElastic.java
+++ b/ogc-common/src/main/java/io/arlas/server/ogc/common/requestfilter/FilterToElastic.java
@@ -23,12 +23,14 @@
 import com.fasterxml.jackson.databind.ObjectReader;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.vividsolutions.jts.geom.CoordinateSequence;
-import com.vividsolutions.jts.geom.Geometry;
-import com.vividsolutions.jts.geom.GeometryFactory;
-import com.vividsolutions.jts.geom.LinearRing;
 import io.arlas.server.core.app.ArlasServerConfiguration;
 import io.arlas.server.core.exceptions.ArlasException;
+import io.arlas.server.core.model.CollectionReference;
+import io.arlas.server.core.model.response.CollectionReferenceDescription;
+import io.arlas.server.core.model.response.CollectionReferenceDescriptionProperty;
+import io.arlas.server.core.model.response.FieldType;
+import io.arlas.server.core.model.response.TimestampType;
+import io.arlas.server.core.utils.TimestampTypeMapper;
 import io.arlas.server.ogc.common.exceptions.INSPIRE.INSPIREExceptionCode;
 import io.arlas.server.ogc.common.exceptions.OGC.OGCException;
 import io.arlas.server.ogc.common.exceptions.OGC.OGCExceptionCode;
@@ -38,22 +40,20 @@
 import io.arlas.server.ogc.common.inspire.common.enums.SupportedDublinCoreQueryables;
 import io.arlas.server.ogc.common.inspire.common.enums.SupportedISOQueryables;
 import io.arlas.server.ogc.common.inspire.common.utils.InspireCheckParam;
-import io.arlas.server.core.model.CollectionReference;
-import io.arlas.server.core.model.response.CollectionReferenceDescription;
-import io.arlas.server.core.model.response.CollectionReferenceDescriptionProperty;
-import io.arlas.server.core.model.response.FieldType;
-import io.arlas.server.core.model.response.TimestampType;
 import io.arlas.server.ogc.common.model.Service;
 import io.arlas.server.ogc.common.utils.OGCCheckParam;
 import io.arlas.server.ogc.common.utils.XmlUtils;
-import io.arlas.server.core.utils.TimestampTypeMapper;
 import org.geotools.factory.CommonFactoryFinder;
-import org.geotools.factory.Hints;
 import org.geotools.filter.Capabilities;
 import org.geotools.geojson.geom.GeometryJSON;
 import org.geotools.util.ConverterFactory;
 import org.geotools.util.Converters;
+import org.geotools.util.factory.Hints;
 import org.joda.time.format.DateTimeFormatter;
+import org.locationtech.jts.geom.CoordinateSequence;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.geom.LinearRing;
 import org.opengis.feature.simple.SimpleFeatureType;
 import org.opengis.feature.type.AttributeDescriptor;
 import org.opengis.filter.*;
diff --git a/ogc-common/src/main/java/io/arlas/server/ogc/common/requestfilter/FilterToElasticHelper.java b/ogc-common/src/main/java/io/arlas/server/ogc/common/requestfilter/FilterToElasticHelper.java
index 4b717ebd5..d0d88738a 100644
--- a/ogc-common/src/main/java/io/arlas/server/ogc/common/requestfilter/FilterToElasticHelper.java
+++ b/ogc-common/src/main/java/io/arlas/server/ogc/common/requestfilter/FilterToElasticHelper.java
@@ -20,18 +20,18 @@
 package io.arlas.server.ogc.common.requestfilter;
 
 import com.google.common.collect.ImmutableMap;
-import com.vividsolutions.jts.geom.*;
 import io.arlas.server.core.exceptions.ArlasException;
+import io.arlas.server.core.impl.elastic.utils.GeoTypeMapper;
+import io.arlas.server.core.utils.CheckParams;
 import io.arlas.server.ogc.common.exceptions.OGC.OGCException;
 import io.arlas.server.ogc.common.exceptions.OGC.OGCExceptionCode;
 import io.arlas.server.ogc.common.exceptions.OGC.OGCExceptionMessage;
-import io.arlas.server.core.impl.elastic.utils.GeoTypeMapper;
 import io.arlas.server.ogc.common.model.Service;
 import io.arlas.server.ogc.common.utils.XmlUtils;
-import io.arlas.server.core.utils.CheckParams;
 import org.geojson.GeoJsonObject;
 import org.geotools.factory.CommonFactoryFinder;
 import org.geotools.geometry.jts.JTS;
+import org.locationtech.jts.geom.*;
 import org.locationtech.spatial4j.shape.SpatialRelation;
 import org.opengis.filter.expression.Expression;
 import org.opengis.filter.expression.Literal;
diff --git a/ogc-common/src/main/java/io/arlas/server/ogc/common/utils/XmlUtils.java b/ogc-common/src/main/java/io/arlas/server/ogc/common/utils/XmlUtils.java
index 642c70830..7f20b6c0e 100644
--- a/ogc-common/src/main/java/io/arlas/server/ogc/common/utils/XmlUtils.java
+++ b/ogc-common/src/main/java/io/arlas/server/ogc/common/utils/XmlUtils.java
@@ -28,7 +28,7 @@
 import io.arlas.server.core.utils.FilterMatcherUtil;
 import io.arlas.server.core.utils.MapExplorer;
 import io.arlas.server.core.utils.TimestampTypeMapper;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/ogc-csw/pom.xml b/ogc-csw/pom.xml
index 12296ec9e..48012d383 100644
--- a/ogc-csw/pom.xml
+++ b/ogc-csw/pom.xml
@@ -1,23 +1,37 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>io.arlas</groupId>
-  <artifactId>ogc-csw</artifactId>
-  <version>19.7.9-SNAPSHOT</version>
-  <packaging>jar</packaging>
-  <name>ARLAS ogc csw</name>
-
-  <parent>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
     <groupId>io.arlas</groupId>
-    <artifactId>arlas-server-parent</artifactId>
+    <artifactId>ogc-csw</artifactId>
     <version>19.7.9-SNAPSHOT</version>
-  </parent>
+    <packaging>jar</packaging>
+    <name>ARLAS ogc csw</name>
+
+    <parent>
+        <groupId>io.arlas</groupId>
+        <artifactId>arlas-server-parent</artifactId>
+        <version>19.7.9-SNAPSHOT</version>
+    </parent>
 
-  <dependencies>
-    <dependency>
-      <groupId>io.arlas</groupId>
-      <artifactId>ogc-common</artifactId>
-      <version>19.7.9-SNAPSHOT</version>
-    </dependency>
-  </dependencies>
+    <dependencies>
+        <dependency>
+            <groupId>io.arlas</groupId>
+            <artifactId>ogc-common</artifactId>
+            <version>19.7.9-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>17</source>
+                    <target>17</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/ogc-csw/src/main/java/io/arlas/server/ogc/csw/CSWRESTService.java b/ogc-csw/src/main/java/io/arlas/server/ogc/csw/CSWRESTService.java
index bd13159b3..6138187a3 100644
--- a/ogc-csw/src/main/java/io/arlas/server/ogc/csw/CSWRESTService.java
+++ b/ogc-csw/src/main/java/io/arlas/server/ogc/csw/CSWRESTService.java
@@ -49,7 +49,7 @@
 import net.opengis.cat.csw._3.AbstractRecordType;
 import net.opengis.cat.csw._3.CapabilitiesType;
 import net.opengis.cat.csw._3.GetRecordsResponseType;
-import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections4.CollectionUtils;
 
 import javax.ws.rs.*;
 import javax.ws.rs.core.*;
@@ -78,9 +78,6 @@ public CSWRESTService(CSWHandler cswHandler) {
         this.serverBaseUri = cswHandler.baseUri;
     }
 
-    @Context
-    UriInfo uri;
-
     @Timed
     @Path("/csw")
     @GET
diff --git a/ogc-wfs/pom.xml b/ogc-wfs/pom.xml
index 05400ac06..b188f8901 100644
--- a/ogc-wfs/pom.xml
+++ b/ogc-wfs/pom.xml
@@ -1,23 +1,37 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>io.arlas</groupId>
-  <artifactId>ogc-wfs</artifactId>
-  <version>19.7.9-SNAPSHOT</version>
-  <packaging>jar</packaging>
-  <name>ARLAS ogc wfs</name>
-
-  <parent>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
     <groupId>io.arlas</groupId>
-    <artifactId>arlas-server-parent</artifactId>
+    <artifactId>ogc-wfs</artifactId>
     <version>19.7.9-SNAPSHOT</version>
-  </parent>
+    <packaging>jar</packaging>
+    <name>ARLAS ogc wfs</name>
+
+    <parent>
+        <groupId>io.arlas</groupId>
+        <artifactId>arlas-server-parent</artifactId>
+        <version>19.7.9-SNAPSHOT</version>
+    </parent>
 
-  <dependencies>
-    <dependency>
-      <groupId>io.arlas</groupId>
-      <artifactId>ogc-common</artifactId>
-      <version>19.7.9-SNAPSHOT</version>
-    </dependency>
-  </dependencies>
+    <dependencies>
+        <dependency>
+            <groupId>io.arlas</groupId>
+            <artifactId>ogc-common</artifactId>
+            <version>19.7.9-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>17</source>
+                    <target>17</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/pom.xml b/pom.xml
index 47efaeaf1..779ae9f3b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
@@ -34,50 +35,50 @@
 
   <properties>
     <!-- PROJECT-->
-    <log4j.version>2.15.0</log4j.version>
+    <log4j.version>2.17.1</log4j.version>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <skipTests>true</skipTests>
-    <surefire.version>2.20.1</surefire.version>
+    <surefire.version>2.22.2</surefire.version>
 
     <!-- DEV TOOLS -->
-    <cyclops.version>10.0.0-M7</cyclops.version>
+    <cyclops.version>10.4.0</cyclops.version>
 
     <!-- TESTS -->
-    <junit.version>4.13.1</junit.version>
-    <org.hamcrest.version>1.3</org.hamcrest.version>
-    <io.rest-assured.version>3.3.0</io.rest-assured.version>
+    <junit.version>4.13.2</junit.version>
+    <org.hamcrest.version>2.2</org.hamcrest.version>
+    <io.rest-assured.version>4.4.0</io.rest-assured.version>
 
     <!-- REST AND DROPWIZARD-->
-    <dropwizard.version>1.3.9</dropwizard.version>
-    <dropwizard.swagger.version>1.3.9-1</dropwizard.swagger.version>
-    <zipkin.dropwizard.version>1.3.9-1</zipkin.dropwizard.version>
-    <jackson.version>2.9.8</jackson.version>
-    <swaggerv3.version>2.0.10</swaggerv3.version>
+    <dropwizard.version>2.0.28</dropwizard.version>
+    <dropwizard.swagger.version>2.0.12-1</dropwizard.swagger.version>
+    <zipkin.dropwizard.version>2.0.16-1</zipkin.dropwizard.version>
+    <jackson.version>2.13.1</jackson.version>
+    <swaggerv3.version>2.1.12</swaggerv3.version>
+    <jaxb.version>2.3.5</jaxb.version>
+    <jersey-media-jaxb.version>2.35</jersey-media-jaxb.version>
 
     <!-- CACHE-->
-    <hazelcast.version>4.2.2</hazelcast.version>
-    <hazelcast.k8s.version>2.2.3</hazelcast.k8s.version>
+    <hazelcast.version>5.0.2</hazelcast.version>
 
     <!-- ELASTICSEARCH-->
-    <elastic.version>7.14.2</elastic.version>
-    <elastic-apm.version>1.20.0</elastic-apm.version>
+    <elastic.version>7.15.2</elastic.version>
+    <elastic-apm.version>1.28.4</elastic-apm.version>
 
-    <postgresql.version>42.2.19</postgresql.version>
-    <postgis-jdbc.version>2.5.0</postgis-jdbc.version>
-    <!-- do not upgrade jdbi3-core to 3.19.0 because it needs java 11 to compile -->
-    <jdbi3.version>3.18.1</jdbi3.version>
+    <postgis-jdbc.version>2021.1.0</postgis-jdbc.version>
+    <jdbi3.version>3.26.1</jdbi3.version>
 
     <!-- GEO-->
-    <geotools.version>18.0</geotools.version>
-    <protobuf.version>3.4.0</protobuf.version>
-    <geoapi.version>3.0.1</geoapi.version>
-    <geojson.jackson.version>1.8.1</geojson.jackson.version>
-    <spatial4j.version>0.7</spatial4j.version>
-    <jts.version>1.18.1</jts.version>
+    <geotools.version>26.1</geotools.version>
+    <protobuf.version>3.19.1</protobuf.version>
+    <geojson.jackson.version>1.14</geojson.jackson.version>
+    <spatial4j.version>0.8</spatial4j.version>
+    <jts.version>1.18.2</jts.version>
     <h3.version>3.7.0</h3.version>
 
     <!-- AUTH -->
-    <java-jwt.version>3.8.2</java-jwt.version>
+    <java-jwt.version>3.18.2</java-jwt.version>
+
+    <nv-i18n.version>1.29</nv-i18n.version>
 
     <!-- DOCUMENTATION GENERATION-->
     <swagger2markup.version>1.3.3</swagger2markup.version>
@@ -89,58 +90,32 @@
   </properties>
 
   <dependencies>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-core</artifactId>
-      <version>${jackson.version}</version>
-    </dependency>
-
-    <!-- ____________________________________________________ -->
-    <!-- DEV -->
-    <!-- ____________________________________________________ -->
-    <dependency>
-      <groupId>com.oath.cyclops</groupId>
-      <artifactId>cyclops</artifactId>
-      <version>${cyclops.version}</version>
-    </dependency>
-    <!-- ____________________________________________________ -->
-    <!-- Tests -->
-    <!-- ____________________________________________________ -->
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>${junit.version}</version>
       <scope>test</scope>
     </dependency>
-
-    <!-- ____________________________________________________ -->
-    <!-- LOGS -->
-    <!-- ____________________________________________________ -->
-    <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-core</artifactId>
-      <version>${log4j.version}</version>
-    </dependency>
   </dependencies>
-
   <build>
     <plugins>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.7.0</version>
+        <version>3.8.1</version>
         <configuration>
-          <source>1.8</source>
-          <target>1.8</target>
+          <release>17</release>
+          <source>17</source>
+          <target>17</target>
         </configuration>
       </plugin>
 
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.20.1</version>
+        <version>2.22.2</version>
         <configuration>
-          <argLine>-Xmx2048m -XX:MaxPermSize=1024m</argLine>
+          <argLine>-Xmx2048m</argLine>
           <skipITs>${skipTests}</skipITs>
         </configuration>
         <executions>
@@ -224,7 +199,7 @@
     <pluginRepository>
       <id>jcenter-snapshots</id>
       <name>jcenter</name>
-      <url>http://oss.jfrog.org/artifactory/oss-snapshot-local/</url>
+      <url>https://oss.jfrog.org/artifactory/oss-snapshot-local/</url>
     </pluginRepository>
     <pluginRepository>
       <snapshots>
@@ -240,7 +215,7 @@
     <repository>
       <id>maven2-repository.dev.java.net</id>
       <name>Java.net repository</name>
-      <url>http://download.java.net/maven/2</url>
+      <url>https://download.java.net/maven/2</url>
     </repository>
     <repository>
       <id>osgeo</id>
diff --git a/release.sh b/release.sh
index 0a0eb8814..30ca0f159 100755
--- a/release.sh
+++ b/release.sh
@@ -1,6 +1,5 @@
 #!/bin/bash
 set -o errexit -o pipefail
-
 SCRIPT_DIRECTORY="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
 PROJECT_ROOT_DIRECTORY="$SCRIPT_DIRECTORY"
 
@@ -93,7 +92,21 @@ case $i in
 esac
 done
 
-ELASTIC_VERSIONS_7=("7.0.1","7.1.0","7.2.1","7.3.2","7.4.2","7.5.2","7.6.2","7.7.1","7.8.1","7.9.2","7.12.1","7.14.2")
+ELASTIC_VERSIONS_7=(
+  7.2.1
+  7.3.2
+  7.4.2
+  7.5.2
+  7.6.2
+  7.7.1
+  7.8.1
+  7.9.2
+  7.12.1
+  7.14.2
+  7.15.2
+  7.16.0
+)
+
 case $ELASTIC_RANGE in
     "7")
         ELASTIC_VERSIONS=( "${ELASTIC_VERSIONS_7[@]}" )
@@ -156,7 +169,7 @@ else
         --mount dst=/mnt/.m2,src="$HOME/.m2/",type=bind \
         --mount dst=/opt/maven,src="$PWD",type=bind \
         --rm \
-        gisaia/maven-3.5-jdk8-alpine \
+        maven:3.8.2-openjdk-17 \
             clean install
 fi
 
@@ -186,7 +199,7 @@ docker-compose -f docker-compose.yml -f docker-compose-elasticsearch.yml --proje
 
 itests() {
 	echo "=> Run integration tests with several elasticsearch versions (${ELASTIC_VERSIONS[*]})"
-	for i in "${ELASTIC_RANGE[@]}"
+	for i in "${ELASTIC_VERSIONS[@]}"
     do
 	    ./scripts/tests-integration.sh --es=$i
     done
diff --git a/scripts/build-artifact.sh b/scripts/build-artifact.sh
index 93ff35043..4ea92aa58 100755
--- a/scripts/build-artifact.sh
+++ b/scripts/build-artifact.sh
@@ -7,7 +7,7 @@ function clean_maven {
 		-w /opt/maven \
 		-v $PWD:/opt/maven \
 		-v $HOME/.m2:/root/.m2 \
-		maven:3.5.0-jdk-8 \
+		maven:3.8.2-openjdk-17 \
 		mvn clean -B
 }
 
@@ -29,7 +29,7 @@ docker run --rm \
     -w /opt/maven \
 	-v $PWD:/opt/maven \
 	-v $HOME/.m2:/root/.m2 \
-	maven:3.5.0-jdk-8 \
+	maven:3.8.2-openjdk-17 \
 	mvn clean install -B
 
 echo "===> prepare arlas-server artifact"
diff --git a/scripts/docker-run.sh b/scripts/docker-run.sh
index ca70b2553..e5d52ecfe 100755
--- a/scripts/docker-run.sh
+++ b/scripts/docker-run.sh
@@ -39,7 +39,7 @@ docker run --rm \
     -w /opt/maven \
 	-v $PWD:/opt/maven \
 	-v $HOME/.m2:/root/.m2 \
-	maven:3.5.0-jdk-8 \
+	maven:3.8.2-openjdk-17 \
 	mvn clean install -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
 echo "arlas-server:${ARLAS_VERSION}"
 
diff --git a/stac-api/pom.xml b/stac-api/pom.xml
index 55f65c13d..266af7537 100644
--- a/stac-api/pom.xml
+++ b/stac-api/pom.xml
@@ -1,4 +1,6 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>io.arlas</groupId>
     <artifactId>stac-api</artifactId>
@@ -29,6 +31,18 @@
             <artifactId>swagger-annotations</artifactId>
             <version>${swaggerv3.version}</version>
         </dependency>
-
     </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>17</source>
+                    <target>17</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>


Test patch:
diff --git a/arlas-tests/pom.xml b/arlas-tests/pom.xml
index 99f514c7c..de4559079 100644
--- a/arlas-tests/pom.xml
+++ b/arlas-tests/pom.xml
@@ -1,4 +1,6 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>io.arlas</groupId>
   <artifactId>arlas-tests</artifactId>
@@ -35,6 +37,10 @@
           <artifactId>httpclient</artifactId>
           <groupId>org.apache.httpcomponents</groupId>
         </exclusion>
+        <exclusion>
+          <artifactId>commons-lang3</artifactId>
+          <groupId>org.apache.commons</groupId>
+        </exclusion>
       </exclusions>
       <scope>test</scope>
     </dependency>
@@ -51,7 +57,15 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-failsafe-plugin</artifactId>
-        <version>2.20.1</version>
+        <version>2.22.2</version>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>17</source>
+          <target>17</target>
+        </configuration>
       </plugin>
     </plugins>
   </build>
diff --git a/arlas-tests/src/test/java/io/arlas/server/tests/data/PostgisDataInjector.java b/arlas-tests/src/test/java/io/arlas/server/tests/data/PostgisDataInjector.java
index d9c64c0ab..37f6dea69 100644
--- a/arlas-tests/src/test/java/io/arlas/server/tests/data/PostgisDataInjector.java
+++ b/arlas-tests/src/test/java/io/arlas/server/tests/data/PostgisDataInjector.java
@@ -23,6 +23,9 @@
 import io.arlas.server.tests.Data;
 import io.dropwizard.db.DataSourceFactory;
 import io.dropwizard.db.ManagedDataSource;
+import net.postgis.jdbc.PGgeometry;
+import net.postgis.jdbc.geometry.LinearRing;
+import net.postgis.jdbc.geometry.Point;
 import org.geojson.Polygon;
 import org.jdbi.v3.core.Jdbi;
 import org.jdbi.v3.guava.GuavaPlugin;
@@ -33,9 +36,6 @@
 import org.jdbi.v3.sqlobject.customizer.BindBean;
 import org.jdbi.v3.sqlobject.customizer.Define;
 import org.jdbi.v3.sqlobject.statement.SqlUpdate;
-import org.postgis.LinearRing;
-import org.postgis.PGgeometry;
-import org.postgis.Point;
 
 import java.time.Instant;
 
@@ -146,7 +146,7 @@ public FlattenedData(Data data) {
 
         private PGgeometry getPGgeometry(Polygon polygon) {
             Point[] coords = polygon.getExteriorRing().stream().map(coord -> new Point(coord.getLongitude(), coord.getLatitude())).toArray(Point[]::new);
-            org.postgis.Polygon geo = new org.postgis.Polygon(new LinearRing[] {new LinearRing(coords)});
+            net.postgis.jdbc.geometry.Polygon geo = new net.postgis.jdbc.geometry.Polygon(new LinearRing[] {new LinearRing(coords)});
             return new PGgeometry(geo);
         }
 
diff --git a/arlas-tests/src/test/java/io/arlas/server/tests/rest/plugins/eo/TileServiceIT.java b/arlas-tests/src/test/java/io/arlas/server/tests/rest/plugins/eo/TileServiceIT.java
index b82fa8186..9892fcac5 100644
--- a/arlas-tests/src/test/java/io/arlas/server/tests/rest/plugins/eo/TileServiceIT.java
+++ b/arlas-tests/src/test/java/io/arlas/server/tests/rest/plugins/eo/TileServiceIT.java
@@ -80,7 +80,7 @@ public static void beforeClass() throws IOException, InterruptedException, Arlas
 
         data.geo_params.geometry = new Polygon(coords);
         data.geo_params.wktgeometry = wktGeometry;
-        String indexName=DataSetTool.ALIASED_COLLECTION?DataSetTool.DATASET_INDEX_NAME+"_original":DataSetTool.DATASET_INDEX_NAME;
+        String indexName = DataSetTool.ALIASED_COLLECTION ? DataSetTool.DATASET_INDEX_NAME+"_original" : DataSetTool.DATASET_INDEX_NAME;
         DataSetTool.client.index(indexName, "ES_ID_TEST" + data.id, mapper.writer().writeValueAsString(data));
 
         data.id = String.valueOf("ID_" + i + "_" + j + "DI_top").replace("-", "_");
diff --git a/scripts/start-test-docker-stack.sh b/scripts/start-test-docker-stack.sh
index 6f4286663..800ef8242 100755
--- a/scripts/start-test-docker-stack.sh
+++ b/scripts/start-test-docker-stack.sh
@@ -35,7 +35,7 @@ docker run --rm \
     -e ARLAS_ELASTIC_NODES="elasticsearch:9200" \
     -e ALIASED_COLLECTION=${ALIASED_COLLECTION:-false} \
     --net arlas_default \
-    maven:3.5.0-jdk-8 \
+    maven:3.8.2-openjdk-17 \
     mvn exec:java -Dexec.mainClass="io.arlas.server.CollectionTool" -Dexec.classpathScope=test -Dexec.args="load" -pl arlas-tests -B
 
 echo "===> Enjoy arlas-server API on http://${DOCKER_IP}:19999/arlas/swagger"
\ No newline at end of file
diff --git a/scripts/tests-integration-elasticsearch.sh b/scripts/tests-integration-elasticsearch.sh
index 7a3386140..cfa5986b4 100755
--- a/scripts/tests-integration-elasticsearch.sh
+++ b/scripts/tests-integration-elasticsearch.sh
@@ -1,6 +1,19 @@
 #!/bin/bash
 
-ELASTIC_RANGE=("7.0.1","7.1.0","7.2.1","7.3.2","7.4.2","7.5.2","7.6.2","7.7.1","7.8.1","7.9.2","7.12.1","7.14.2")
+ELASTIC_RANGE=(
+  7.2.1
+  7.3.2
+  7.4.2
+  7.5.2
+  7.6.2
+  7.7.1
+  7.8.1
+  7.9.2
+  7.12.1
+  7.14.2
+  7.15.2
+  7.16.0
+)
 
 for i in "${ELASTIC_RANGE[@]}"
 do
diff --git a/scripts/tests-integration-stage.sh b/scripts/tests-integration-stage.sh
index 8eeb58a2b..40ec97b10 100755
--- a/scripts/tests-integration-stage.sh
+++ b/scripts/tests-integration-stage.sh
@@ -13,23 +13,23 @@ function clean_docker {
 		-w /opt/maven \
 		-v $PWD:/opt/maven \
 		-v $HOME/.m2:/root/.m2 \
-		maven:3.5.0-jdk-8 \
+		maven:3.8.2-openjdk-17 \
 		mvn clean -B
 }
 
 function clean_exit {
-    ARG=$?
+  ARG=$?
   # Allow errors on cleanup
-    set +e
+  set +e
 
-    if [[ "$ARG" != 0 ]]; then
-        # In case of error, print containers logs (if any)
-        docker logs elasticsearch
-        docker logs arlas-server
-    fi
+  if [[ "$ARG" != 0 ]]; then
+    # In case of error, print containers logs (if any)
+    docker logs elasticsearch
+    docker logs arlas-server
+  fi
 	echo "===> Exit stage ${STAGE} = ${ARG}"
-    clean_docker
-    exit $ARG
+  clean_docker
+  exit $ARG
 }
 trap clean_exit EXIT
 
@@ -97,7 +97,7 @@ function test_rest() {
         -e ALIASED_COLLECTION=${ALIASED_COLLECTION} \
         -e WKT_GEOMETRIES=${WKT_GEOMETRIES} \
         --net arlas_default \
-        maven:3.5.0-jdk-8 \
+        maven:3.8.2-openjdk-17 \
         mvn "-Dit.test=*,!AuthServiceIT,!CollectionTool,!CollectionInjector,!CSWServiceIT,!WFSService*IT" verify -DskipTests=false -DfailIfNoTests=false -B
 }
 
@@ -128,7 +128,7 @@ function test_auth() {
         -e ARLAS_ELASTIC_NODES="elasticsearch:9200" \
         -e ALIASED_COLLECTION=${ALIASED_COLLECTION} \
         --net arlas_default \
-        maven:3.5.0-jdk-8 \
+        maven:3.8.2-openjdk-17 \
         mvn -Dit.test=AuthServiceIT verify -DskipTests=false -DfailIfNoTests=false -B
 }
 
@@ -152,7 +152,7 @@ function test_wfs() {
         -e ARLAS_ELASTIC_NODES="elasticsearch:9200" \
         -e ALIASED_COLLECTION=${ALIASED_COLLECTION} \
         --net arlas_default \
-        maven:3.5.0-jdk-8 \
+        maven:3.8.2-openjdk-17 \
         mvn "-Dit.test=WFSService*IT" verify -DskipTests=false -DfailIfNoTests=false -B
     docker run --rm \
         -w /opt/maven \
@@ -166,7 +166,7 @@ function test_wfs() {
         -e ARLAS_ELASTIC_NODES="elasticsearch:9200" \
         -e ALIASED_COLLECTION=${ALIASED_COLLECTION} \
         --net arlas_default \
-        maven:3.5.0-jdk-8 \
+        maven:3.8.2-openjdk-17 \
         mvn exec:java -Dexec.mainClass="io.arlas.server.tests.CollectionTool" -Dexec.classpathScope=test -Dexec.args="load" -pl arlas-tests -B
 
     docker run --rm \
@@ -186,7 +186,7 @@ function test_wfs() {
         -e ARLAS_ELASTIC_NODES="elasticsearch:9200" \
         -e ALIASED_COLLECTION=${ALIASED_COLLECTION} \
         --net arlas_default \
-        maven:3.5.0-jdk-8 \
+        maven:3.8.2-openjdk-17 \
         mvn exec:java -Dexec.mainClass="io.arlas.server.tests.CollectionTool" -Dexec.classpathScope=test -Dexec.args="delete" -pl arlas-tests -B
 }
 
@@ -210,7 +210,7 @@ function test_stac() {
         -e ARLAS_ELASTIC_NODES="elasticsearch:9200" \
         -e ALIASED_COLLECTION=${ALIASED_COLLECTION} \
         --net arlas_default \
-        maven:3.5.0-jdk-8 \
+        maven:3.8.2-openjdk-17 \
         mvn exec:java -Dexec.mainClass="io.arlas.server.tests.CollectionTool" -Dexec.classpathScope=test -Dexec.args="load" -pl arlas-tests -B
 
     docker run --rm \
@@ -234,7 +234,7 @@ function test_stac() {
         -e ARLAS_ELASTIC_NODES="elasticsearch:9200" \
         -e ALIASED_COLLECTION=${ALIASED_COLLECTION} \
         --net arlas_default \
-        maven:3.5.0-jdk-8 \
+        maven:3.8.2-openjdk-17 \
         mvn exec:java -Dexec.mainClass="io.arlas.server.tests.CollectionTool" -Dexec.classpathScope=test -Dexec.args="delete" -pl arlas-tests -B
 }
 
@@ -259,7 +259,7 @@ function test_csw() {
         -e ARLAS_ELASTIC_NODES="elasticsearch:9200" \
         -e ALIASED_COLLECTION=${ALIASED_COLLECTION} \
         --net arlas_default \
-        maven:3.5.0-jdk-8 \
+        maven:3.8.2-openjdk-17 \
         mvn "-Dit.test=CSWServiceIT" verify -DskipTests=false -DfailIfNoTests=false -B
 
     docker run --rm \
@@ -274,7 +274,7 @@ function test_csw() {
         -e ARLAS_ELASTIC_NODES="elasticsearch:9200" \
         -e ALIASED_COLLECTION=${ALIASED_COLLECTION} \
         --net arlas_default \
-        maven:3.5.0-jdk-8 \
+        maven:3.8.2-openjdk-17 \
         mvn exec:java -Dexec.mainClass="io.arlas.server.tests.CollectionTool" -Dexec.classpathScope=test -Dexec.args="loadcsw" -pl arlas-tests -B
 
     docker run --rm \
@@ -293,7 +293,7 @@ function test_csw() {
         -e ARLAS_ELASTIC_NODES="elasticsearch:9200" \
         -e ALIASED_COLLECTION=${ALIASED_COLLECTION} \
         --net arlas_default \
-        maven:3.5.0-jdk-8 \
+        maven:3.8.2-openjdk-17 \
         mvn exec:java -Dexec.mainClass="io.arlas.server.tests.CollectionTool" -Dexec.classpathScope=test -Dexec.args="deletecsw" -pl arlas-tests -B
 }
 
diff --git a/scripts/tests-integration.sh b/scripts/tests-integration.sh
index 339cf2788..07ddf22d0 100755
--- a/scripts/tests-integration.sh
+++ b/scripts/tests-integration.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 set -e
 
-export ELASTIC_VERSION="7.14.2"
+export ELASTIC_VERSION="7.15.2"
 
 function clean_exit {
   ARG=$?