diff --git a/bin/sloccount.sh b/bin/sloccount.sh
index 41aed14ea0f8c5c79791e5e73a8d16a9aa995695..7b599e8fc8e9bb77a96b270bfc918c4fc17c1f12 100755
--- a/bin/sloccount.sh
+++ b/bin/sloccount.sh
@@ -21,8 +21,8 @@ fi
 echo "tokei is installed at $TOKEI"
 $TOKEI --version
 mkdir -p $ROOT_DIR/target
-if [ ! -d $ROOT_DIR/www-client ]; then
+if [ ! -d $ROOT_DIR/cli ]; then
 	$TOKEI -f -o json $ROOT_DIR/src | $TOKEI2CLOC > $ROOT_DIR/target/cloc.xml
 	exit
 fi
-$TOKEI -f -o json $ROOT_DIR/www-client/src $ROOT_DIR/www-server/src $ROOT_DIR/www-shared/src | $TOKEI2CLOC > $ROOT_DIR/target/cloc.xml
+$TOKEI -f -o json $ROOT_DIR/cli/src $ROOT_DIR/core/src $ROOT_DIR/core-test/src | $TOKEI2CLOC > $ROOT_DIR/target/cloc.xml
diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/CliHelper.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/CliHelper.java
index 032009b634dbcdb01749a1651181b530574c3924..c93956299d16e057f596a21525a1f039a21e20c6 100644
--- a/cli/src/main/java/fr/inrae/agroclim/season/cli/CliHelper.java
+++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/CliHelper.java
@@ -7,6 +7,8 @@ import jakarta.jms.JMSException;
 import javax.naming.NamingException;
 
 import fr.inrae.agroclim.indicators.model.Evaluation;
+import fr.inrae.agroclim.season.cli.error.EvaluationErrorType;
+import fr.inrae.agroclim.season.cli.error.SeasonCliException;
 import fr.inrae.agroclim.season.cli.jms.Receiver;
 import fr.inrae.agroclim.season.core.InputHelper;
 import fr.inrae.agroclim.season.core.dao.CellDao;
@@ -63,13 +65,14 @@ public final class CliHelper {
      * @param computation computation details
      * @return treatment with evaluation without data
      * @throws IndicatorsException while loading XML.
+     * @throws SeasonCliException if evaluation is null after loading
      */
     public static Treatment loadTreatment(
             final CellDao cellDao,
             final VarietyParameterDao varietyParameterDao,
             final SimulationProperties props,
             final int cell, final Computation computation)
-                    throws IndicatorsException {
+                    throws IndicatorsException, SeasonCliException {
         final String filePath;
         try {
             filePath = props.getEvaluationPath();
@@ -80,7 +83,7 @@ public final class CliHelper {
         }
         final Evaluation evaluation = InputHelper.loadEvaluation(filePath);
         if (evaluation == null) {
-            throw new RuntimeException("Evaluation is null from " + filePath);
+            throw new SeasonCliException(EvaluationErrorType.LOAD, filePath);
         }
 
         return InputHelper.loadTreatment(cellDao, varietyParameterDao, evaluation, props, cell, computation);
diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/Main.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/Main.java
index 7dfe45a079b16a6c23af2fa461100bd198063510..ee65a55ad61085d30c16cc8183dffdf91ca7be04 100644
--- a/cli/src/main/java/fr/inrae/agroclim/season/cli/Main.java
+++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/Main.java
@@ -4,8 +4,6 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.Callable;
 
-import org.apache.logging.log4j.Level;
-
 import fr.inrae.agroclim.indicators.resources.I18n;
 import fr.inrae.agroclim.season.cli.clioptionhandlers.CancelCliOptionHandler;
 import fr.inrae.agroclim.season.cli.clioptionhandlers.ConfigCliOptionHandler;
@@ -32,6 +30,7 @@ import fr.inrae.agroclim.season.core.model.PhenologicalModel;
 import fr.inrae.agroclim.season.core.service.SimulationService;
 import lombok.Setter;
 import lombok.extern.log4j.Log4j2;
+import org.apache.logging.log4j.Level;
 import picocli.CommandLine;
 import picocli.CommandLine.Command;
 import picocli.CommandLine.IVersionProvider;
@@ -288,12 +287,6 @@ public final class Main implements Callable<Integer>, IVersionProvider {
         if (receivers == null) {
             PersistenceManager.getINSTANCE().close();
         } else {
-/*-
-                LOGGER.info("Waiting for treatments...");
-Thread t = new Thread(() -> {Thread.currentThread().interrupt(); System.out.println("ok");});
-t.setDaemon(true);
-t.start();
-            */
             try {
                 LOGGER.info("Waiting for treatments...");
                 // Sleep forever, waiting for ourselves to finish
diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/PurgeCliOptionHandler.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/PurgeCliOptionHandler.java
index bf29b4ca4bd9684797b24d3e79134e25d17fdc4b..d1a0cfeeb4fdffd8a836ffcd63a5cb64d5d125f7 100644
--- a/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/PurgeCliOptionHandler.java
+++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/PurgeCliOptionHandler.java
@@ -50,7 +50,7 @@ public final class PurgeCliOptionHandler implements Runnable {
     public void run() {
         final List<Simulation> sims = simulationDao.findExpired();
         LOGGER.info("{} simulations to purge", sims.size());
-        sims.forEach((sim) -> {
+        sims.forEach(sim -> {
             boolean deletion = simulationErrorDao.delete(sim);
             if (!deletion) {
                 return;
diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/SimulationCliOptionHandler.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/SimulationCliOptionHandler.java
index c97749097cb8d54608772656c61115eb2092fea4..0c26574ae9dd116ab36649c13764d257c810eca5 100644
--- a/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/SimulationCliOptionHandler.java
+++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/SimulationCliOptionHandler.java
@@ -214,7 +214,8 @@ public final class SimulationCliOptionHandler implements Consumer<String> {
             final Treatment treatment;
             try {
                 treatment = CliHelper.loadTreatment(cellDao, varietyParameterDao, props, cell, computation);
-            } catch (IndicatorsException ex) {
+            } catch (final IndicatorsException | SeasonCliException ex) {
+                LOGGER.fatal("Failed to load treatment", ex);
                 System.exit(1);
                 return;
             }
diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/VerboseCliOptionHandler.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/VerboseCliOptionHandler.java
index 198aaec3113de8fa56fbc6e46c60b04cdf963803..be5b6697821613b780d0558c8d19d436f4efd4fa 100644
--- a/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/VerboseCliOptionHandler.java
+++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/VerboseCliOptionHandler.java
@@ -1,7 +1,7 @@
 package fr.inrae.agroclim.season.cli.clioptionhandlers;
 
 import java.util.function.Consumer;
-
+import lombok.extern.log4j.Log4j2;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.LoggerContext;
@@ -9,11 +9,9 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.util.Strings;
 
-import lombok.extern.log4j.Log4j2;
-
 /**
  * Handler for the option "--verbose" of the command line interface.
- *
+ * 
  * @author Olivier Maury
  */
 @Log4j2
diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/di/GeneralModule.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/di/GeneralModule.java
index 527aaf18bb67e4a1d5075a47328ab0b7b1843259..bc328bdff7180afe26c11d2749f05c5e002f28bf 100644
--- a/cli/src/main/java/fr/inrae/agroclim/season/cli/di/GeneralModule.java
+++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/di/GeneralModule.java
@@ -44,7 +44,7 @@ public final class GeneralModule {
             }
         });
         // Override default config from "-D" arguments
-        config.getKeys().forEach((conf) -> {
+        config.getKeys().forEach(conf -> {
             final String val = System.getProperty(conf);
             if (val != null && !val.isEmpty()) {
                 config.set(conf, val);
diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/jms/Receiver.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/jms/Receiver.java
index 6ab3158717e7780cd7107bfd9d48fe413a7244b8..bdad449c51d962e2b4159169b7edbbd86b054a7d 100644
--- a/cli/src/main/java/fr/inrae/agroclim/season/cli/jms/Receiver.java
+++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/jms/Receiver.java
@@ -1,19 +1,15 @@
 package fr.inrae.agroclim.season.cli.jms;
 
+import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
 
-import jakarta.jms.Destination;
-import jakarta.jms.JMSConsumer;
-import jakarta.jms.JMSContext;
-import jakarta.jms.JMSException;
-import jakarta.jms.Message;
-import jakarta.jms.MessageListener;
-import jakarta.jms.ObjectMessage;
-import jakarta.jms.TextMessage;
 import javax.naming.NamingException;
 
+import org.semver4j.Semver;
+
 import fr.inrae.agroclim.indicators.exception.ErrorMessageException;
+import fr.inrae.agroclim.indicators.exception.IndicatorsException;
 import fr.inrae.agroclim.indicators.model.Evaluation;
 import fr.inrae.agroclim.indicators.model.result.EvaluationResult;
 import fr.inrae.agroclim.season.cli.CliConfiguration;
@@ -31,12 +27,18 @@ import fr.inrae.agroclim.season.core.dao.SimulationSoilDao;
 import fr.inrae.agroclim.season.core.jms.JMSUtils;
 import fr.inrae.agroclim.season.core.model.Simulation;
 import fr.inrae.agroclim.season.core.model.Treatment;
-import java.time.LocalDate;
+import jakarta.jms.Destination;
+import jakarta.jms.JMSConsumer;
+import jakarta.jms.JMSContext;
+import jakarta.jms.JMSException;
+import jakarta.jms.Message;
+import jakarta.jms.MessageListener;
+import jakarta.jms.ObjectMessage;
+import jakarta.jms.TextMessage;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.Setter;
 import lombok.extern.log4j.Log4j2;
-import org.semver4j.Semver;
 
 /**
  * JMS message receiver to handle Treatment.
@@ -266,10 +268,10 @@ public final class Receiver implements MessageListener, Runnable {
             return;
         }
         try {
-            if (message instanceof TextMessage textMessage) {
+            if (message instanceof final TextMessage textMessage) {
                 // test with message containing only text
                 onTextMessage(textMessage);
-            } else if (message instanceof ObjectMessage objectMessage) {
+            } else if (message instanceof final ObjectMessage objectMessage) {
                 // The message contains treatment.
                 onObjectMessage(objectMessage);
             } else {
diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/mail/MailService.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/mail/MailService.java
index ea5a2a8b2bb039bb1a4ee8bcd9bd973a50f62fcd..bc54575dfc656d9dfb50e691818afcd7260cc7d5 100644
--- a/cli/src/main/java/fr/inrae/agroclim/season/cli/mail/MailService.java
+++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/mail/MailService.java
@@ -7,6 +7,8 @@ import java.util.Date;
 import java.util.List;
 import java.util.Properties;
 
+import fr.inrae.agroclim.season.cli.CliConfiguration;
+import fr.inrae.agroclim.season.cli.di.GeneralModule;
 import jakarta.activation.DataHandler;
 import jakarta.activation.DataSource;
 import jakarta.activation.FileDataSource;
@@ -24,9 +26,6 @@ import jakarta.mail.internet.InternetAddress;
 import jakarta.mail.internet.MimeBodyPart;
 import jakarta.mail.internet.MimeMessage;
 import jakarta.mail.internet.MimeMultipart;
-
-import fr.inrae.agroclim.season.cli.CliConfiguration;
-import fr.inrae.agroclim.season.cli.di.GeneralModule;
 import lombok.NonNull;
 import lombok.extern.log4j.Log4j2;
 
@@ -38,6 +37,30 @@ import lombok.extern.log4j.Log4j2;
  */
 @Log4j2
 public final class MailService {
+    /**
+     * SMTP property.
+     */
+    private static final String PROPERTY_PASSWORD = "mail.smtp.auth.password";
+
+    /**
+     * SMTP property.
+     */
+    private static final String PROPERTY_USER = "mail.smtp.auth.user";
+
+    /**
+     * SMTP property.
+     */
+    private static final String PROPERTY_ENVIRONMENT = "mail.header.environment";
+
+    /**
+     * SMTP property.
+     */
+    private static final String PROPERTY_FROM = "mail.smtp.from";
+
+    /**
+     * SMTP property.
+     */
+    private static final String PROPERTY_TO = "mail.smtp.to";
 
     /**
      * Handle exception occured while sending message.
@@ -49,12 +72,12 @@ public final class MailService {
         LOGGER.error(mex);
         Exception ex = mex;
         do {
-            if (ex instanceof AddressException ae) {
+            if (ex instanceof final AddressException ae) {
                 throw new SendMailException("send : Invalid Address : "
                         + ae.getRef() + " : " + ex.getMessage());
             } else if (ex instanceof AuthenticationFailedException) {
                 throw new SendMailException("send : wrong credentials : " + ex.getMessage());
-            } else if (ex instanceof SendFailedException sfex) {
+            } else if (ex instanceof final SendFailedException sfex) {
                 final Address[] invalid = sfex.getInvalidAddresses();
                 final StringBuilder messageException = new StringBuilder();
                 if (invalid != null) {
@@ -80,7 +103,7 @@ public final class MailService {
                     throw new SendMailException(ex, "send : Valid Sent Addresses : " + messageException.toString());
                 }
             }
-            if (ex instanceof MessagingException messagingException) {
+            if (ex instanceof final MessagingException messagingException) {
                 ex = messagingException.getNextException();
             } else if (ex instanceof java.net.SocketException) {
                 LOGGER.error(ex);
@@ -101,12 +124,12 @@ public final class MailService {
      */
     public static void main(final String[] args) throws SendMailException {
         final CliConfiguration config = GeneralModule.provideCliConfiguration();
-        if (!config.getKeys().contains("mail.smtp.auth.password")) {
+        if (!config.getKeys().contains(PROPERTY_PASSWORD)) {
             final BufferedReader prompt = new BufferedReader(new InputStreamReader(System.in));
             System.out.println("SMTP password:\n");
             try {
                 final String pwd = prompt.readLine();
-                config.set("mail.smtp.auth.password", pwd);
+                config.set(PROPERTY_PASSWORD, pwd);
             } catch (final IOException ex) {
                 LOGGER.fatal(ex);
                 return;
@@ -153,20 +176,20 @@ public final class MailService {
         final boolean sendCopyToSupport = mail.getSendCopytoSupport();
 
         if (mail.getTo() == null) {
-            to = props.getProperty("mail.smtp.to");
+            to = props.getProperty(PROPERTY_TO);
         } else {
             to = mail.getTo();
         }
         if (mail.getFrom() == null) {
-            from = props.getProperty("mail.smtp.from");
+            from = props.getProperty(PROPERTY_FROM);
             if (from == null) {
-                from = props.getProperty("mail.smtp.to");
+                from = props.getProperty(PROPERTY_TO);
             }
         } else {
             from = mail.getFrom();
         }
         if (from == null) {
-            throw new RuntimeException("from not set!");
+            throw new SendMailException("configuration: from not set!");
         }
         final Session session = Session.getInstance(props, null);
 
@@ -225,20 +248,19 @@ public final class MailService {
                 // Send the complete message parts
                 msg.setContent(multipart);
             }
-            final String environment = props.getProperty("mail.header.environment");
+            final String environment = props.getProperty(PROPERTY_ENVIRONMENT);
             if (environment != null) {
                 msg.setHeader("X-Environment", environment);
             }
 
-            final String user = props.getProperty("mail.smtp.auth.user");
-            final String password = props.getProperty("mail.smtp.auth.password");
+            final String user = props.getProperty(PROPERTY_USER);
+            final String password = props.getProperty(PROPERTY_PASSWORD);
             if (user != null && password != null) {
                 LOGGER.trace("user with password : " + user);
                 Transport.send(msg, user, password);
             } else if (user != null && password == null) {
-                LOGGER.warn("mail.smtp.auth.user is set but "
-                        + "mail.smtp.auth.password is not set! "
-                        + "E-mail won't be sent!");
+                LOGGER.warn(PROPERTY_USER + " is set but "
+                        + PROPERTY_PASSWORD + " is not set! E-mail won't be sent!");
             } else {
                 Transport.send(msg);
             }
diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/output/AbstractOutput.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/output/AbstractOutput.java
index d97940a0ac7853bd11c880273f4f9accebdc9b91..228bb33e8c45cb1b47f600cdb5e357fa568e63f3 100644
--- a/cli/src/main/java/fr/inrae/agroclim/season/cli/output/AbstractOutput.java
+++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/output/AbstractOutput.java
@@ -162,7 +162,7 @@ public abstract class AbstractOutput {
         final LocalDate lastDate = results.keySet().stream().sorted().reduce((first, second) -> second).get();
         final List<AnnualPhase> computedPhases = results.get(lastDate).values().stream() //
             .flatMap(r -> r.getPhaseResults().stream()) //
-            .map(r -> r.getAnnualPhase()) //
+            .map(PhaseResult::getAnnualPhase) //
             .toList();
         beforeLoopOnResults(computedPhases);
         final long startTime = System.currentTimeMillis();
diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/output/LogOutput.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/output/LogOutput.java
index 2b52ef386940e3fd33f182354f54cbb12db30130..a101dd902ee355ce4189a29bee3f9c8ebabbe48c 100644
--- a/cli/src/main/java/fr/inrae/agroclim/season/cli/output/LogOutput.java
+++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/output/LogOutput.java
@@ -1,9 +1,9 @@
 package fr.inrae.agroclim.season.cli.output;
 
 import fr.inrae.agroclim.indicators.model.AnnualPhase;
-import fr.inrae.agroclim.season.core.model.Treatment;
 import fr.inrae.agroclim.indicators.model.result.IndicatorResult;
 import fr.inrae.agroclim.indicators.model.result.PhaseResult;
+import fr.inrae.agroclim.season.core.model.Treatment;
 import java.util.List;
 import lombok.extern.log4j.Log4j2;
 
@@ -27,6 +27,7 @@ public final class LogOutput extends AbstractOutput {
 
     @Override
     public void clear() {
+        // no temporary files to clear in log output.
     }
 
     @Override
@@ -51,7 +52,7 @@ public final class LogOutput extends AbstractOutput {
         if (!indicator.getIndicatorResults().isEmpty()) {
             nbOfResults += indicator.getIndicatorResults()
                     .stream()
-                    .map((res) -> handleIndicator(year, res))
+                    .map(res -> handleIndicator(year, res))
                     .reduce(nbOfResults, Integer::sum);
         }
         return nbOfResults;
diff --git a/core/src/main/java/fr/inrae/agroclim/season/core/climate/PhenologyCalculatorBuilder.java b/core/src/main/java/fr/inrae/agroclim/season/core/climate/PhenologyCalculatorBuilder.java
index a3e79a020d0b95aa366fb11f4d1dca675f63932c..cbac45ffa34fa5f696ae0ac3b2ce6dfcf62a2a0f 100644
--- a/core/src/main/java/fr/inrae/agroclim/season/core/climate/PhenologyCalculatorBuilder.java
+++ b/core/src/main/java/fr/inrae/agroclim/season/core/climate/PhenologyCalculatorBuilder.java
@@ -2,14 +2,13 @@ package fr.inrae.agroclim.season.core.climate;
 
 import java.util.Map;
 
-import javax.inject.Inject;
-
 import fr.inrae.agroclim.indicators.model.data.phenology.PhenologicalModelType;
 import fr.inrae.agroclim.indicators.model.data.phenology.PhenologyCalculator;
 import fr.inrae.agroclim.indicators.model.data.phenology.Stage;
 import fr.inrae.agroclim.season.core.dao.CellDao;
 import fr.inrae.agroclim.season.core.model.Cell;
 import fr.inrae.agroclim.season.core.model.ClimaticBase;
+import javax.inject.Inject;
 import lombok.Setter;
 import lombok.extern.log4j.Log4j2;
 
@@ -124,7 +123,6 @@ public final class PhenologyCalculatorBuilder {
         //-
         for (final String param : varietyParameters.keySet()) {
             final double value = varietyParameters.get(param);
-            // LOGGER.trace("{}={}", param, value);
             if (isWb) {
                 switch (param) {
                 case "ST_Phase_bh_1":
diff --git a/core/src/main/java/fr/inrae/agroclim/season/core/dao/CellDaoHibernate.java b/core/src/main/java/fr/inrae/agroclim/season/core/dao/CellDaoHibernate.java
index ae293b4938529305aab93a65be98737dd3c944f2..ec8dc695466b10496a5c203684dc92a8ab6e1854 100644
--- a/core/src/main/java/fr/inrae/agroclim/season/core/dao/CellDaoHibernate.java
+++ b/core/src/main/java/fr/inrae/agroclim/season/core/dao/CellDaoHibernate.java
@@ -43,13 +43,13 @@ public final class CellDaoHibernate extends DaoHibernate implements CellDao {
     @Override
     public List<Cell> findAllByClimaticbaseName(final String baseName) {
         final String stmt = "SELECT t FROM Cell t WHERE t.climaticbaseName = :baseName";
-        return findAllByJPQL(stmt, Map.of("baseName", baseName), Cell.class);
+        return findAllByJPQL(stmt, Map.of(PROPERTY_BASENAME, baseName), Cell.class);
     }
 
     @Override
     public Cell findAllByClimaticbaseNameAndCellNumber(final String baseName, final Integer cellNumber) {
         final String stmt = "SELECT t FROM Cell t WHERE t.climaticbaseName = :baseName AND t.cellNumber = :cellNumber";
-        return findOneByJPQL(stmt, Map.of("baseName", baseName, "cellNumber", cellNumber), Cell.class);
+        return findOneByJPQL(stmt, Map.of(PROPERTY_BASENAME, baseName, "cellNumber", cellNumber), Cell.class);
     }
 
     @Override
@@ -59,7 +59,7 @@ public final class CellDaoHibernate extends DaoHibernate implements CellDao {
         cellNumbers.forEach(n -> sj.add(String.valueOf(n)));
         final String stmt = "SELECT t FROM Cell t WHERE t.climaticbaseName = :baseName AND t.cellNumber IN ("
                 + sj.toString() + ")";
-        return findAllByJPQL(stmt, Map.of("baseName", baseName), Cell.class);
+        return findAllByJPQL(stmt, Map.of(PROPERTY_BASENAME, baseName), Cell.class);
     }
 
     @Override
@@ -71,7 +71,7 @@ public final class CellDaoHibernate extends DaoHibernate implements CellDao {
     @Override
     public List<Cell> findByClimaticbaseNameAndCellNumberIsNotNull(final String baseName) {
         final String stmt = "SELECT t FROM Cell t WHERE t.climaticbaseName = :baseName AND t.cellNumber IS NOT NULL";
-        return findAllByJPQL(stmt, Map.of("baseName", baseName), Cell.class);
+        return findAllByJPQL(stmt, Map.of(PROPERTY_BASENAME, baseName), Cell.class);
     }
 
     @Override
diff --git a/core/src/main/java/fr/inrae/agroclim/season/core/dao/ClimaticScenarioDaoHibernate.java b/core/src/main/java/fr/inrae/agroclim/season/core/dao/ClimaticScenarioDaoHibernate.java
index 446658389edf71944e7ba28b55f1ec7a7ab27e51..b23525cd8f4100696e9d87c15373c71fd84c44c7 100644
--- a/core/src/main/java/fr/inrae/agroclim/season/core/dao/ClimaticScenarioDaoHibernate.java
+++ b/core/src/main/java/fr/inrae/agroclim/season/core/dao/ClimaticScenarioDaoHibernate.java
@@ -31,8 +31,9 @@ public final class ClimaticScenarioDaoHibernate extends DaoHibernate implements
 
     @Override
     public List<ClimaticScenario> findAll() {
-        final String stmt = "SELECT t FROM ClimaticScenario t "
-                + "ORDER BY t.climaticModel.climaticBase.name ASC, t.climaticModel.name ASC, t.name ASC";
+        final String stmt = """
+                            SELECT t FROM ClimaticScenario t
+                            ORDER BY t.climaticModel.climaticBase.name ASC, t.climaticModel.name ASC, t.name ASC""";
         return findAllByJPQL(stmt, null, ClimaticScenario.class);
     }
 
@@ -45,8 +46,9 @@ public final class ClimaticScenarioDaoHibernate extends DaoHibernate implements
     @Override
     public ClimaticScenario findByBaseCodeAndModelCodeAndScenarioName(final String baseCode, final String modelCode,
             final String name) {
-        final String stmt = "SELECT s FROM ClimaticScenario s JOIN s.climaticModel m JOIN m.climaticBase b "
-                + "WHERE s.name = :name AND b.code = :baseCode AND m.code = :modelCode";
+        final String stmt = """
+                            SELECT s FROM ClimaticScenario s JOIN s.climaticModel m JOIN m.climaticBase b
+                            WHERE s.name = :name AND b.code = :baseCode AND m.code = :modelCode""";
         return findOneByJPQL(stmt, Map.of("name", name, "baseCode", baseCode, "modelCode", modelCode),
                 ClimaticScenario.class);
     }
@@ -54,9 +56,10 @@ public final class ClimaticScenarioDaoHibernate extends DaoHibernate implements
     @Override
     public ClimaticScenario findByBaseNameAndModelNameAndName(final String baseName, final String modelName,
             final String scenarioName) {
-        final String stmt = "SELECT s FROM ClimaticScenario s JOIN s.climaticModel m JOIN m.climaticBase b "
-                + "WHERE s.name = :name AND b.name = :baseName AND m.name = :modelName";
-        return findOneByJPQL(stmt, Map.of("name", scenarioName, "baseName", baseName, "modelName", modelName),
+        final String stmt = """
+                            SELECT s FROM ClimaticScenario s JOIN s.climaticModel m JOIN m.climaticBase b
+                            WHERE s.name = :name AND b.name = :baseName AND m.name = :modelName""";
+        return findOneByJPQL(stmt, Map.of("name", scenarioName, PROPERTY_BASENAME, baseName, "modelName", modelName),
                 ClimaticScenario.class);
     }
 
diff --git a/core/src/main/java/fr/inrae/agroclim/season/core/dao/DaoHibernate.java b/core/src/main/java/fr/inrae/agroclim/season/core/dao/DaoHibernate.java
index 97bb1e7b70a97202d62e8b1441190731c5b2babc..d083346439d334a051f2b969b13db59cf7054af7 100644
--- a/core/src/main/java/fr/inrae/agroclim/season/core/dao/DaoHibernate.java
+++ b/core/src/main/java/fr/inrae/agroclim/season/core/dao/DaoHibernate.java
@@ -16,11 +16,10 @@ import jakarta.persistence.criteria.CriteriaQuery;
 import jakarta.persistence.criteria.Predicate;
 import jakarta.persistence.criteria.Root;
 
-import org.hibernate.Session;
-
 import fr.inrae.agroclim.season.core.DatabaseRoles;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
+import org.hibernate.Session;
 
 /**
  * Managing transactions in database.
@@ -30,6 +29,16 @@ import lombok.extern.log4j.Log4j2;
 @Log4j2
 @RequiredArgsConstructor
 public class DaoHibernate implements Dao {
+    /**
+     * Column schema.
+     */
+    private static final String COLUMN_SCHEMA = "schema";
+
+    /**
+     * Property baseName for Cell, ClimaticScenario.
+     */
+    protected static final String PROPERTY_BASENAME = "baseName";
+
     /**
      * Generate the SQL statement for the database driver.
      *
@@ -96,7 +105,7 @@ public class DaoHibernate implements Dao {
             throw new UnsupportedOperationException("Database driver not handled: " + getDriver(em));
         }
         final Query query = em.createNativeQuery(sb.toString());
-        query.setParameter("schema", schema);
+        query.setParameter(COLUMN_SCHEMA, schema);
         query.setParameter("index", index);
         final Object result = query.getSingleResult();
         return result != null && (Boolean) result;
@@ -543,7 +552,7 @@ public class DaoHibernate implements Dao {
                         FROM pg_catalog.pg_tables WHERE schemaname=:schema
                         """;
                 final Query query = em.createNativeQuery(sql);
-                query.setParameter("schema", schema);
+                query.setParameter(COLUMN_SCHEMA, schema);
                 return (BigDecimal) query.getSingleResult();
             } else {
                 throw new UnsupportedOperationException("Database driver not handled!");
@@ -588,7 +597,7 @@ public class DaoHibernate implements Dao {
                 FROM information_schema.tables
                 WHERE table_schema = :schema AND LOWER(table_name) = :table
                 """;
-        return findFirstScalarWithNamedParameters(sql, Map.of("schema", schema, "table", table.toLowerCase()));
+        return findFirstScalarWithNamedParameters(sql, Map.of(COLUMN_SCHEMA, schema, "table", table.toLowerCase()));
     }
 
     @Override
@@ -598,6 +607,6 @@ public class DaoHibernate implements Dao {
                 FROM information_schema.views
                 WHERE table_schema = :schema AND LOWER(table_name) = :view
                 """;
-        return findFirstScalarWithNamedParameters(sql, Map.of("schema", schema, "view", view.toLowerCase()));
+        return findFirstScalarWithNamedParameters(sql, Map.of(COLUMN_SCHEMA, schema, "view", view.toLowerCase()));
     }
 }