diff --git a/pom.xml b/pom.xml
index f68afa3232fb7776c8a750bac7fb22a5adc51148..46e0faa73adfbcefe190a858838735dc791c6b9b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>fr.inrae.agroclim</groupId>
 	<artifactId>gwtexpe</artifactId>
-	<version>2.11.0.0</version>
+	<version>2.12.1.0-SNAPSHOT</version>
 	<packaging>war</packaging>
 	<name>GWT Experiments</name>
 	<description>Experiments with GWT 2.11.0</description>
@@ -32,7 +32,7 @@
 	</issueManagement>
 	<properties>
 		<!-- Dependencies versions -->
-		<gwt.version>2.11.0</gwt.version>
+		<gwt.version>2.12.1</gwt.version>
 		<jackson.version>2.17.1</jackson.version>
 		<jersey.version>2.45</jersey.version>
 		<junit.version>4.13.2</junit.version>
@@ -46,10 +46,10 @@
 		<build.date>${maven.build.timestamp}</build.date>
 		<maven.compiler.showDeprecation>true</maven.compiler.showDeprecation>
 		<maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
-		<maven.compiler.source>11</maven.compiler.source>
-		<maven.compiler.target>11</maven.compiler.target>
-		<maven.compiler.testSource>11</maven.compiler.testSource>
-		<maven.compiler.testTarget>11</maven.compiler.testTarget>
+		<maven.compiler.source>17</maven.compiler.source>
+		<maven.compiler.target>17</maven.compiler.target>
+		<maven.compiler.testSource>17</maven.compiler.testSource>
+		<maven.compiler.testTarget>17</maven.compiler.testTarget>
 
 		<!-- other properties -->
 		<analytics.tracking.id></analytics.tracking.id>
diff --git a/readme.md b/readme.md
index a47816e35935a9c19cf429768ae32504cec40eb4..a45c7fdb0d118d5f84b7f677719569ee039462b3 100644
--- a/readme.md
+++ b/readme.md
@@ -2,9 +2,9 @@
 
 Ce projet vise à :
 
-* définir une configuration minimale pour commencer un projet GWT, version [2.11.0](https://www.gwtproject.org/release-notes.html#Release_Notes_2_11_0), sur Tomcat 9 et Java 11,
-* définir l'outillage (Checkstyle, CPD, PMD, Spotbugs),
-* tester quelques technologies (Hibernate, JWT, Leaflet, MVP, OpenAPI, REST, SOAP, SSE, websockets).
+- définir une configuration minimale pour commencer un projet GWT, version [2.12.1](https://www.gwtproject.org/release-notes.html#Release_Notes_2_11_0), sur Tomcat 9 et Java 11,
+- définir l'outillage (Checkstyle, CPD, PMD, Spotbugs),
+- tester quelques technologies (Hibernate, JWT, Leaflet, MVP, OpenAPI, REST, SOAP, SSE, websockets).
 
 Ajouter et configurer ces paramètres dans le fichier `context.xml` de Tomcat :
 
@@ -38,9 +38,9 @@ Cette application a été enregistrée sur le serveur de développement de B2Acc
 
 Sur ce serveur de développement B2Access :
 
-* l'authentification par le CAS INRA n'est pas disponible,
-* l'authentification par GitHub ne fonctionne pas,
-* passer par ORCID permet d'utiliser le CAS INRA.
+- l'authentification par le CAS INRA n'est pas disponible,
+- l'authentification par GitHub ne fonctionne pas,
+- passer par ORCID permet d'utiliser le CAS INRA.
 
 ## Tests de JWT
 
@@ -51,7 +51,7 @@ Sur ce serveur de développement B2Access :
 ## Problème de dépendance lors du lancement dans Eclipse
 
 Parfois Eclipse perd les dépendances (Log4j non trouvé au lancement).
-Clic droit sur **le projet**, choisir **Properties**, puis **Deployment Assembly** et vérifier que dans la colonne *Source* il y a *Maven Dependencies*.
+Clic droit sur **le projet**, choisir **Properties**, puis **Deployment Assembly** et vérifier que dans la colonne _Source_ il y a _Maven Dependencies_.
 Si ce n'est pas le cas, cliquer sur **Add...**, **Java Build Path Entries** et **Maven Dependencies**, **Apply and close**.
 
 ## Avertissements de Tomcat
diff --git a/src/main/java/fr/inrae/agroclim/gwtexpe/client/Gwtexpe.java b/src/main/java/fr/inrae/agroclim/gwtexpe/client/Gwtexpe.java
index 82978e97d0226b871b7037af42dab7ab3bff0004..6f6475e6b2432db82b34325cd3934dfd8446d16f 100644
--- a/src/main/java/fr/inrae/agroclim/gwtexpe/client/Gwtexpe.java
+++ b/src/main/java/fr/inrae/agroclim/gwtexpe/client/Gwtexpe.java
@@ -22,10 +22,6 @@ package fr.inrae.agroclim.gwtexpe.client;
  * #L%
  */
 
-import org.cleanlogic.sse.EventSource;
-import org.peimari.gleaflet.client.resources.LeafletDrawResourceInjector;
-import org.peimari.gleaflet.client.resources.LeafletResourceInjector;
-
 import com.google.gwt.activity.shared.ActivityManager;
 import com.google.gwt.activity.shared.ActivityMapper;
 import com.google.gwt.core.client.EntryPoint;
@@ -39,9 +35,11 @@ import com.google.gwt.place.shared.PlaceHistoryHandler;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.google.gwt.user.client.ui.RootPanel;
 import com.google.web.bindery.event.shared.EventBus;
-
 import fr.inrae.agroclim.gwtexpe.client.hello.HelloPlace;
 import fr.inrae.agroclim.gwtexpe.shared.PersonDTO;
+import org.cleanlogic.sse.EventSource;
+import org.peimari.gleaflet.client.resources.LeafletDrawResourceInjector;
+import org.peimari.gleaflet.client.resources.LeafletResourceInjector;
 
 /**
  * Entry point classes define <code>onModuleLoad()</code>.
@@ -117,62 +115,38 @@ public class Gwtexpe implements EntryPoint {
 
         // Server-Send Event
         final EventSource sse = new EventSource("/gwtexpe/rs/sse/persons");
-        sse.onOpen = new EventSource.Listener() {
-            @Override
-            public void function(final org.cleanlogic.sse.Event event) {
-                mainPage.displayLogMessage("sse/persons Open readyState: " + event.target.readyState());
-                mainPage.displayLogMessage("sse/persons Open lastEventId: " + event.lastEventId);
-            }
+        sse.onOpen = (final org.cleanlogic.sse.Event event) -> {
+            mainPage.displayLogMessage("sse/persons Open readyState: " + event.target.readyState());
+            mainPage.displayLogMessage("sse/persons Open lastEventId: " + event.lastEventId);
         };
-        sse.onError = new EventSource.Listener() {
-            @Override
-            public void function(final org.cleanlogic.sse.Event event) {
-                mainPage.displayLogMessage("sse/persons Error: " + event.target.readyState());
-            }
+        sse.onError = (final org.cleanlogic.sse.Event event) -> {
+            mainPage.displayLogMessage("sse/persons Error: " + event.target.readyState());
         };
-        sse.onMessage = new EventSource.Listener() {
-            @Override
-            public void function(final org.cleanlogic.sse.Event event) {
-                mainPage.displayLogMessage("sse/persons data: " + event.data);
-            }
+        sse.onMessage = (final org.cleanlogic.sse.Event event) -> {
+            mainPage.displayLogMessage("sse/persons data: " + event.data);
         };
         // Custom listener
-        sse.addEventListener("person", new EventSource.Listener() {
-            @Override
-            public void function(final org.cleanlogic.sse.Event event) {
-                final PersonDTO dto = JSON.parse(event.data);
-                mainPage.displayLogMessage(
-                        "sse/persons personDTO: " + dto.id + ", " + dto.name + ", " + dto.getCreatedDate());
-            }
+        sse.addEventListener("person", (final org.cleanlogic.sse.Event event) -> {
+            final PersonDTO dto = JSON.parse(event.data);
+            mainPage.displayLogMessage(
+                    "sse/persons personDTO: " + dto.id + ", " + dto.name + ", " + dto.getCreatedDate());
         });
         // Server-Send Event broadcast
         // Launch with http://localhost:8080/gwtexpe/rs/sse/publish
         final EventSource broadcastSse = new EventSource("/gwtexpe/rs/sse/subscribe");
-        broadcastSse.onOpen = new EventSource.Listener() {
-            @Override
-            public void function(final org.cleanlogic.sse.Event event) {
-                mainPage.displayLogMessage("sse/subscribe Open readyState: " + event.target.readyState());
-                mainPage.displayLogMessage("sse/subscribe Open lastEventId: " + event.lastEventId);
-            }
+        broadcastSse.onOpen = (final org.cleanlogic.sse.Event event) -> {
+            mainPage.displayLogMessage("sse/subscribe Open readyState: " + event.target.readyState());
+            mainPage.displayLogMessage("sse/subscribe Open lastEventId: " + event.lastEventId);
         };
-        broadcastSse.onError = new EventSource.Listener() {
-            @Override
-            public void function(final org.cleanlogic.sse.Event event) {
-                mainPage.displayLogMessage("sse/subscribe Error: " + event.target.readyState());
-            }
+        broadcastSse.onError = (final org.cleanlogic.sse.Event event) -> {
+            mainPage.displayLogMessage("sse/subscribe Error: " + event.target.readyState());
         };
-        broadcastSse.onMessage = new EventSource.Listener() {
-            @Override
-            public void function(final org.cleanlogic.sse.Event event) {
-                mainPage.displayLogMessage("sse/subscribe subscribed data: " + event.data);
-            }
+        broadcastSse.onMessage = (final org.cleanlogic.sse.Event event) -> {
+            mainPage.displayLogMessage("sse/subscribe subscribed data: " + event.data);
         };
         // Custom listener
-        broadcastSse.addEventListener("message", new EventSource.Listener() {
-            @Override
-            public void function(final org.cleanlogic.sse.Event event) {
-                mainPage.displayLogMessage("sse/subscribe subscribed message: " + event.data);
-            }
+        broadcastSse.addEventListener("message", (final org.cleanlogic.sse.Event event) -> {
+            mainPage.displayLogMessage("sse/subscribe subscribed message: " + event.data);
         });
     }
 }
diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html
index 82a2b10c3be4edbe3efabe3ae433ae0ffe4c14ce..acb5b0e23b85441163bb89a0eed107cf3ce70453 100644
--- a/src/main/webapp/index.html
+++ b/src/main/webapp/index.html
@@ -1,3 +1,4 @@
+<!doctype html>
 <!--
   #%L
   GWT Experiments
@@ -19,7 +20,6 @@
   <http://www.gnu.org/licenses/gpl-3.0.html>.
   #L%
   -->
-<!doctype html>
 <!-- The DOCTYPE declaration above will set the     -->
 <!-- browser's rendering engine into                -->
 <!-- "Standards Mode". Replacing this declaration   -->