diff --git a/Documentation_fichier_Yaml.md b/Documentation_fichier_Yaml.md
index 5c2b34118ed926e0c1cabf59c9a27a1cf81e62ec..1294b70a7700b016cc4d8f843793f8826c14fb42 100644
--- a/Documentation_fichier_Yaml.md
+++ b/Documentation_fichier_Yaml.md
@@ -131,21 +131,21 @@ Elle comporte une description et un checker (Reference, Integer, Float, RegularE
           name: Reference #Le checker à utiliser
           params: #liste de paramètres (dépend du checker choisi)
             refType: projet #pour le checker référence la donnée référencée
-            columns: nom du projet #liste des colonnes sur lequel s'applique le checker
+        columns: [nom du projet] #liste des colonnes sur lequel s'applique le checker
       sitesRef:
         description: "référence au site"
         checker:
           name: Reference
           params:
             refType: sites
-            columns: nom du site
+        columns: [nom du site]
       themesRef:
         description: "référence au theme"
         checker:
           name: Reference
           params:
             refType: themes
-            columns: nom du thème
+        columns: [nom du thème]
 
       checkDatatype:
         description: "test"
@@ -164,16 +164,19 @@ Elle comporte une description et un checker (Reference, Integer, Float, RegularE
 | columns | X | X | X |  | X | La colonne dans laquelle on prend la valeur | 
 | refTypes | X | |  |  |  | Le référentiels de jointure | 
 | pattern |  | |  |  | X | Le pattern pour une expression régulière | 
-| codify | X | X | X |  | X | Le contenu de la colonne est codifié | 
 | required | X | X | X |  | X | Le contenu de la colonne ne peut être vide | 
-| groovy |  | |  | X |  | une section pour le traitement d'une expression groovy | 
 | replace |  | |  | X |  | l'expression groovy renvoie un résultat au lieu d'un booléen | 
 
 
 La section groovy accepte trois paramètres
-expression : une expression groovy (pour le checker GroovyExpression doit renvoyer true. Ou remplace la valeur actuelle pour les autres checkers)
+expression : une expression groovy (pour le checker GroovyExpression doit renvoyer true si la valeur est valide)
 references : une liste de référentiels pour lesquels on veut disposer des valeurs dans l'expression
 datatypes : une liste de datatypes pour lesquels on veut disposer des valeurs dans l'expression
+transformation: la configuration de la transformation à appliquer avant le contrôle 
+
+Cette transformation peut être configurée avec
+- codify : la valeur sera alors échappée pour être transformée en clé naturelle
+- groovy : permet de déclarer une transformation de la valeur avec une expression Groovy (qui doit retourner une chaîne de caractère)
 
 
 Pour les checkers GroovyExpression, on récupère dans le script des informations :
@@ -308,7 +311,7 @@ references:
           name: Reference
           params:
             refType: modalites
-            columns: modalites
+        columns: [ modalites ]
             codify: true
             multiplicity: MANY
 ```
@@ -392,8 +395,9 @@ On décrit un format pour stocker les données sous la forment
         components:
           datetime:
             #calcul d'une valeur par défaut date+time avec une expression groovy
-            defaultValue: >
-              return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
+            defaultValue:
+              expression: >
+                return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
           day:
             checker:
               name: Date
@@ -441,8 +445,8 @@ Les *variables/components* sont passés dans la map *datum*. On récupère la va
           name: GroovyExpression
           params:
           	groovy:
-	            expression: >
-	              Set.of("", "0", "1", "2").contains(datum.get("SWC").get("qualité"))
+	          expression: >
+	            Set.of("", "0", "1", "2").contains(datum.get("SWC").get("qualité"))
 ```
 
 Cette formulation vérifie que la valeur du component qualité de la variable SWC est vide ou égale à 0,1 ou 2
@@ -471,18 +475,18 @@ Pour les checkers GroovyExpression, on récupère dans le script des information
         checker:
           name: GroovyExpression
           params:
-          groovy:
-            expression: >
-	            String datatype= "piegeage_en_montee"
-	            String variable= "Nombre d'individus"
-	            String codeVariable= "nombre_d_individus"
-	            String component= "unit"
-	              return referencesValues.get("variables_et_unites_par_types_de_donnees")
-	              .findAll{it.get("nom du type de données").equals(datatype)}
-	              .find{it.get("nom de la variable").equals(codeVariable)}
-	              .get("nom de l'unité").equals(datum.variable.component);
-            references: 
-            	- variables_et_unites_par_types_de_donnees
+            groovy:
+              expression: >
+  	            String datatype= "piegeage_en_montee"
+  	            String variable= "Nombre d'individus"
+  	            String codeVariable= "nombre_d_individus"
+  	            String component= "unit"
+  	              return referencesValues.get("variables_et_unites_par_types_de_donnees")
+  	              .findAll{it.get("nom du type de données").equals(datatype)}
+  	              .find{it.get("nom de la variable").equals(codeVariable)}
+  	              .get("nom de l'unité").equals(datum.variable.component);
+              references: 
+              	- variables_et_unites_par_types_de_donnees
 ``` 
 Des valeurs peuvent être définies dans l'expression.
 
@@ -773,7 +777,8 @@ On declare cette variable dans la section data
               params:
                 required: false
           unit:
-            defaultValue: return "percentage"
+            defaultValue:
+              expression: return "percentage"
             checker:
               name: Reference
               params:
diff --git a/src/main/java/fr/inra/oresing/checker/CheckerFactory.java b/src/main/java/fr/inra/oresing/checker/CheckerFactory.java
index f41576066d0ed8342fce3bca4d68ac27401b3a46..7781e9f25dc77a5e7f4b2aef74b95b37444efec1 100644
--- a/src/main/java/fr/inra/oresing/checker/CheckerFactory.java
+++ b/src/main/java/fr/inra/oresing/checker/CheckerFactory.java
@@ -1,7 +1,7 @@
 package fr.inra.oresing.checker;
 
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import fr.inra.oresing.groovy.GroovyContextHelper;
@@ -13,23 +13,19 @@ import fr.inra.oresing.persistence.DataRepository;
 import fr.inra.oresing.persistence.Ltree;
 import fr.inra.oresing.persistence.OreSiRepository;
 import fr.inra.oresing.persistence.ReferenceValueRepository;
-import fr.inra.oresing.rest.ApplicationResult;
 import fr.inra.oresing.transformer.LineTransformer;
 import fr.inra.oresing.transformer.TransformerFactory;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Locale;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
 import java.util.function.Function;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 @Component
 @Slf4j
@@ -54,14 +50,24 @@ public class CheckerFactory {
         return getLineCheckers(app, dataType).stream()
                 .filter(lineChecker -> lineChecker instanceof ReferenceLineChecker)
                 .map(lineChecker -> (ReferenceLineChecker) lineChecker)
-                .collect(ImmutableMap.toImmutableMap(rlc -> (VariableComponentKey) rlc.getTarget().getTarget(), Function.identity()));
+                .collect(ImmutableMap.toImmutableMap(rlc -> (VariableComponentKey) rlc.getTarget(), Function.identity()));
     }
 
     public ImmutableSet<LineChecker> getReferenceValidationLineCheckers(Application app, String reference) {
         Preconditions.checkArgument(app.getConfiguration().getReferences().containsKey(reference), "Pas de référence " + reference + " dans " + app);
         Configuration.ReferenceDescription referenceDescription = app.getConfiguration().getReferences().get(reference);
         ImmutableSet.Builder<LineChecker> checkersBuilder = ImmutableSet.builder();
-        addCheckersFromLineValidationDescriptions(app, referenceDescription.getValidations(), checkersBuilder, Type.REFERENCE.getParam()); //Configuration.DataTypeDescription dataTypeDescription,
+        for (Map.Entry<String, Configuration.ReferenceStaticColumnDescription> variableEntry : referenceDescription.doGetStaticColumnDescriptions().entrySet()) {
+            String column = variableEntry.getKey();
+            ReferenceColumn referenceColumn = new ReferenceColumn(column);
+            Configuration.ReferenceStaticColumnDescription variableDescription = variableEntry.getValue();
+            Optional.ofNullable(variableEntry.getValue())
+                    .map(Configuration.ReferenceStaticColumnDescription::getChecker)
+                    .map(checkerDescription -> newChecker(app, checkerDescription, referenceColumn))
+                    .ifPresent(checkersBuilder::add);
+        }
+        ImmutableMap<String, Configuration.LineValidationRuleDescription> validations = ImmutableMap.copyOf(referenceDescription.getValidations());
+        checkersBuilder.addAll(validationRulesToLineCheckers(app, validations));
         ImmutableSet<LineChecker> lineCheckers = checkersBuilder.build();
         if (log.isTraceEnabled()) {
             log.trace("pour " + app.getName() + ", " + reference + ", on validera avec " + lineCheckers);
@@ -70,21 +76,23 @@ public class CheckerFactory {
     }
 
     public ImmutableSet<LineChecker> getLineCheckers(Application app, String dataType) {
-        return getLineCheckers(app, dataType, null);
-    }
-
-    public ImmutableSet<LineChecker> getLineCheckers(Application app, String dataType, Locale locale) {
         Preconditions.checkArgument(app.getConfiguration().getDataTypes().containsKey(dataType), "Pas de type de données " + dataType + " dans " + app);
         Configuration.DataTypeDescription dataTypeDescription = app.getConfiguration().getDataTypes().get(dataType);
         ImmutableSet.Builder<LineChecker> checkersBuilder = ImmutableSet.builder();
-        for (Map.Entry<String, Configuration.ColumnDescription> variableEntry : dataTypeDescription.getData().entrySet()) {
+        for (Map.Entry<String, Configuration.VariableDescription> variableEntry : dataTypeDescription.getData().entrySet()) {
             String variable = variableEntry.getKey();
-            Configuration.ColumnDescription variableDescription = variableEntry.getValue();
-            for (Map.Entry<String, Configuration.VariableComponentDescription> componentEntry : variableDescription.getComponents().entrySet()) {
-                parseVariableComponentdescription(app, dataType, locale, checkersBuilder, variable, variableDescription, componentEntry);
+            Configuration.VariableDescription variableDescription = variableEntry.getValue();
+            for (Map.Entry<String, Configuration.VariableComponentDescription> componentEntry : variableDescription.doGetAllComponentDescriptions().entrySet()) {
+                String component = componentEntry.getKey();
+                VariableComponentKey variableComponentKey = new VariableComponentKey(variable, component);
+                Optional.ofNullable(componentEntry.getValue())
+                        .map(Configuration.VariableComponentDescription::getChecker)
+                        .map(checkerDescription -> newChecker(app, checkerDescription, variableComponentKey))
+                        .ifPresent(checkersBuilder::add);
             }
         }
-        addCheckersFromLineValidationDescriptions(app, dataTypeDescription.getValidations(), checkersBuilder, Type.DATATYPE.getParam()); //Configuration.DataTypeDescription dataTypeDescription,
+        ImmutableMap<String, Configuration.LineValidationRuleDescription> validations = ImmutableMap.copyOf(dataTypeDescription.getValidations());
+        checkersBuilder.addAll(validationRulesToLineCheckers(app, validations));
         ImmutableSet<LineChecker> lineCheckers = checkersBuilder.build();
         if (log.isTraceEnabled()) {
             log.trace("pour " + app.getName() + ", " + dataType + ", on validera avec " + lineCheckers);
@@ -92,152 +100,79 @@ public class CheckerFactory {
         return lineCheckers;
     }
 
-    private void parseVariableComponentdescription(Application app, String dataType, Locale locale, ImmutableSet.Builder<LineChecker> checkersBuilder, String variable, Configuration.ColumnDescription variableDescription, Map.Entry<String, Configuration.VariableComponentDescription> componentEntry) {
-        String component = componentEntry.getKey();
-        VariableComponentKey variableComponentKey = new VariableComponentKey(variable, component);
-        if (variableDescription.getComponents().get(component) == null) {
-            if (log.isDebugEnabled()) {
-                //log.debug("pas de règle de validation pour " + variableComponentKey);
-            }
-        } else {
-            Configuration.CheckerDescription checkerDescription = variableDescription.getComponents().get(component).getChecker();
-            CheckerOnOneVariableComponentLineChecker variableComponentChecker;
-            CheckerTarget checkerTarget = CheckerTarget.getInstance(variableComponentKey, app, repository.getRepository(app));
-            LineTransformer transformer = Optional.ofNullable(checkerDescription.getParams())
-                    .map(transformationConfiguration -> transformerFactory.newTransformer(transformationConfiguration, app, checkerTarget))
-                    .orElseGet(transformerFactory::getNullTransformer);
-            if ("Reference".equals(checkerDescription.getName())) {
-                variableComponentChecker = getCheckerOnReferenceChecker(app, dataType, locale, checkerDescription, checkerTarget, transformer);
-            } else {
-                final Configuration.CheckerConfigurationDescription configuration = checkerDescription.getParams();
-                if ("Date".equals(checkerDescription.getName())) {
-                    String pattern = configuration.getPattern();
-                    variableComponentChecker = new DateLineChecker(checkerTarget, pattern, configuration, transformer);
-                } else if ("Integer".equals(checkerDescription.getName())) {
-                    Preconditions.checkState(configuration == null || !configuration.isCodify(), "codify avec checker " + checkerDescription.getName() + " sur le composant " + component + " de la variable " + variable + " du type de données " + dataType + " de l'application " + app.getName());
-                    variableComponentChecker = new IntegerChecker(checkerTarget, configuration, transformer);
-                } else if ("Float".equals(checkerDescription.getName())) {
-                    Preconditions.checkState(configuration == null || !configuration.isCodify(), "codify avec checker " + checkerDescription.getName() + " sur le composant " + component + " de la variable " + variable + " du type de données " + dataType + " de l'application " + app.getName());
-                    variableComponentChecker = new FloatChecker(checkerTarget, configuration, transformer);
-                } else if ("RegularExpression".equals(checkerDescription.getName())) {
-                    String pattern = configuration.getPattern();
-                    variableComponentChecker = new RegularExpressionChecker(checkerTarget, pattern, configuration, transformer);
-                } else {
-                    throw new IllegalArgumentException("checker inconnu " + checkerDescription.getName());
-                }
-            }
-            Preconditions.checkState(variableComponentChecker.getTarget().getTarget().equals(variableComponentKey));
-            checkersBuilder.add(variableComponentChecker);
-        }
-    }
-
-    private CheckerOnOneVariableComponentLineChecker getCheckerOnReferenceChecker(Application app, String dataType, Locale locale, Configuration.CheckerDescription checkerDescription, CheckerTarget checkerTarget, LineTransformer transformer) {
-        CheckerOnOneVariableComponentLineChecker variableComponentChecker;
-        String refType = checkerDescription.getParams().getRefType();
-        ReferenceValueRepository referenceValueRepository = repository.getRepository(app).referenceValue();
-        ImmutableMap<Ltree, UUID> referenceValues;
-        if (locale == null) {
-            referenceValues = referenceValueRepository.getReferenceIdPerKeys(refType);
-        } else {
-            ImmutableMap<Ltree, ApplicationResult.Reference.ReferenceUUIDAndDisplay> referenceIdAndDisplayPerKeys = referenceValueRepository.getReferenceIdAndDisplayPerKeys(refType, locale);
-            referenceValues = ImmutableMap.copyOf(
-                    referenceIdAndDisplayPerKeys.entrySet().stream()
-                            .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().getUuid()))
-            );
-        }
-        variableComponentChecker = new ReferenceLineChecker(checkerTarget, refType, referenceValues, checkerDescription.getParams(), transformer);
-        return variableComponentChecker;
-    }
-
-    private void addCheckersFromLineValidationDescriptions(Application app, LinkedHashMap<String, Configuration.LineValidationRuleDescription> lineValidationDescriptions, ImmutableSet.Builder<LineChecker> checkersBuilder, String param) {
-        ReferenceValueRepository referenceValueRepository = repository.getRepository(app).referenceValue();
-        DataRepository dataRepository = repository.getRepository(app).data();
-        for (Map.Entry<String, Configuration.LineValidationRuleDescription> validationEntry : lineValidationDescriptions.entrySet()) {
-            Configuration.LineValidationRuleDescription lineValidationRuleDescription = validationEntry.getValue();
-            Configuration.CheckerDescription checkerDescription = lineValidationRuleDescription.getChecker();
-            LineChecker lineChecker;
-            Configuration.CheckerConfigurationDescription configurationDescription = checkerDescription.getParams();
-            if (GroovyLineChecker.NAME.equals(checkerDescription.getName())) {
-                String expression = configurationDescription.getGroovy().getExpression();
-                Set<String> references = configurationDescription.getGroovy().getReferences();
-                Set<String> dataTypes = configurationDescription.getGroovy().getDatatypes();
-                ImmutableMap<String, Object> groovyContextForReferences = groovyContextHelper.getGroovyContextForReferences(referenceValueRepository, references);
-                ImmutableMap<String, Object> groovyContextForDataTypes = groovyContextHelper.getGroovyContextForDataTypes(dataRepository, dataTypes, app);
-                ImmutableMap<String, Object> context = ImmutableMap.<String, Object>builder()
-                        .putAll(groovyContextForReferences)
-                        .putAll(groovyContextForDataTypes)
-                        .put("application", app)
-                        .build();
-                lineChecker = GroovyLineChecker.forExpression(expression, context, configurationDescription);
-                checkersBuilder.add(lineChecker);
-            } else {
-                List<CheckerTarget> checkerTargets = buildCheckerTarget(configurationDescription, app);
-                if (checkerTargets != null) {
-                    checkerTargets.forEach(checkerTarget -> buildCheckers(app, checkerDescription, checkerTarget, checkersBuilder));
-                } else {
-                    throw new IllegalArgumentException(String.format("Pour le checker de ligne %s, le paramètre %s doit être fourni.", checkerDescription.getName(), param));
-                }
-            }
-            checkersBuilder.build();
-        }
-    }
-
-    private void buildCheckers(Application app, Configuration.CheckerDescription checkerDescription, CheckerTarget target, ImmutableSet.Builder<LineChecker> checkersBuilder) {
-        LineTransformer transformer = transformerFactory.newTransformer(checkerDescription.getParams(), app, target);
-        Configuration.CheckerConfigurationDescription checkerConfigurationDescription = checkerDescription.getParams();
+    private CheckerOnOneVariableComponentLineChecker newChecker(Application app, Configuration.CheckerDescription checkerDescription, CheckerTarget target) {
+        Configuration.CheckerConfigurationDescription configuration =
+                MoreObjects.firstNonNull(
+                        checkerDescription.getParams(),
+                        new Configuration.CheckerConfigurationDescription()
+                );
+        LineTransformer transformer = transformerFactory.newTransformer(configuration.getTransformation(), app, target);
+        CheckerOnOneVariableComponentLineChecker lineChecker;
         switch (checkerDescription.getName()) {
             case "Date":
-                checkersBuilder.add(new DateLineChecker(target, checkerConfigurationDescription.getPattern(), checkerConfigurationDescription, transformer));
+                lineChecker = new DateLineChecker(target, configuration.getPattern(), configuration, transformer);
                 break;
             case "Integer":
-                checkersBuilder.add(new IntegerChecker(target, checkerConfigurationDescription, transformer));
+                lineChecker = new IntegerChecker(target, configuration, transformer);
                 break;
             case "Float":
-                checkersBuilder.add(new FloatChecker(target, checkerConfigurationDescription, transformer));
+                lineChecker = new FloatChecker(target, configuration, transformer);
                 break;
             case "RegularExpression":
-                checkersBuilder.add(new RegularExpressionChecker(target, checkerConfigurationDescription.getPattern(), checkerConfigurationDescription, transformer));
+                lineChecker = new RegularExpressionChecker(target, configuration.getPattern(), configuration, transformer);
                 break;
             case "Reference":
-                String refType = checkerConfigurationDescription.getRefType();
+                String refType = configuration.getRefType();
                 ReferenceValueRepository referenceValueRepository = repository.getRepository(app).referenceValue();
                 ImmutableMap<Ltree, UUID> referenceValues = referenceValueRepository.getReferenceIdPerKeys(refType);
-                checkersBuilder.add(new ReferenceLineChecker(target, refType, referenceValues, checkerConfigurationDescription, transformer));
+                lineChecker = new ReferenceLineChecker(target, refType, referenceValues, configuration, transformer);
                 break;
             default:
                 throw new IllegalArgumentException("checker inconnu " + checkerDescription.getName());
         }
+        Preconditions.checkState(lineChecker.getTarget().equals(target));
+        return lineChecker;
     }
 
-    private List<CheckerTarget> buildCheckerTarget(Configuration.CheckerConfigurationDescription params, Application application) {
-        String columnsString = params.getColumns();
-        String variableComponentKeyParam = params.getVariableComponentKey();
-        if (!Strings.isNullOrEmpty(columnsString)) {
-            return Stream.of(columnsString.split(","))
-                    .map(ReferenceColumn::new)
-                    .map(referenceColumn -> CheckerTarget.getInstance(referenceColumn, application, repository.getRepository(application)))
-                    .collect(Collectors.toList());
-        } else if (!Strings.isNullOrEmpty(variableComponentKeyParam) || !variableComponentKeyParam.matches("_")) {
-            String[] split = variableComponentKeyParam.split("_");
-            Stream.of(new VariableComponentKey(split[0], split[1]))
-                    .map(variableComponentKey -> CheckerTarget.getInstance(variableComponentKey, application, repository.getRepository(application)))
-                    .collect(Collectors.toList());
-
+    private LineChecker newLineChecker(Application app, Configuration.LineValidationRuleDescription lineValidationRuleDescription) {
+        Configuration.CheckerDescription checkerDescription = lineValidationRuleDescription.getChecker();
+        Configuration.CheckerConfigurationDescription configurationDescription = checkerDescription.getParams();
+        LineChecker lineChecker;
+        if (GroovyLineChecker.NAME.equals(checkerDescription.getName())) {
+            String expression = configurationDescription.getGroovy().getExpression();
+            Set<String> references = configurationDescription.getGroovy().getReferences();
+            Set<String> dataTypes = configurationDescription.getGroovy().getDatatypes();
+            ReferenceValueRepository referenceValueRepository = repository.getRepository(app).referenceValue();
+            ImmutableMap<String, Object> groovyContextForReferences = groovyContextHelper.getGroovyContextForReferences(referenceValueRepository, references);
+            DataRepository dataRepository = repository.getRepository(app).data();
+            ImmutableMap<String, Object> groovyContextForDataTypes = groovyContextHelper.getGroovyContextForDataTypes(dataRepository, dataTypes, app);
+            ImmutableMap<String, Object> context = ImmutableMap.<String, Object>builder()
+                    .putAll(groovyContextForReferences)
+                    .putAll(groovyContextForDataTypes)
+                    .put("application", app)
+                    .build();
+            lineChecker = GroovyLineChecker.forExpression(expression, context, configurationDescription);
+        } else {
+            throw new IllegalArgumentException("checker " + checkerDescription.getName());
         }
-        return null;
+        return lineChecker;
     }
 
-    enum Type {
-        REFERENCE(COLUMNS), DATATYPE(VARIABLE_COMPONENT_KEY);
-
-        private final String param;
-
-        Type(String requiredAttributeForCheckerOnOneVariableComponentLineChecker) {
-            this.param = requiredAttributeForCheckerOnOneVariableComponentLineChecker;
-        }
-
-        public String getParam() {
-            return param;
+    private ImmutableSet<LineChecker> validationRulesToLineCheckers(Application app, ImmutableMap<String, Configuration.LineValidationRuleDescription> validations) {
+        ImmutableSet.Builder<LineChecker> checkersBuilder = ImmutableSet.builder();
+        for (Map.Entry<String, Configuration.LineValidationRuleDescription> validationEntry : validations.entrySet()) {
+            Configuration.LineValidationRuleDescription lineValidationRuleDescription = validationEntry.getValue();
+            Configuration.CheckerDescription checkerDescription = lineValidationRuleDescription.getChecker();
+            if (GroovyLineChecker.NAME.equals(checkerDescription.getName())) {
+                LineChecker lineChecker = newLineChecker(app, lineValidationRuleDescription);
+                checkersBuilder.add(lineChecker);
+            } else {
+                List<CheckerOnOneVariableComponentLineChecker> lineCheckers = lineValidationRuleDescription.doGetCheckerTargets().stream()
+                        .map(checkerTarget -> newChecker(app, checkerDescription, checkerTarget))
+                        .collect(Collectors.toList());
+                checkersBuilder.addAll(lineCheckers);
+            }
         }
+        return checkersBuilder.build();
     }
 }
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/checker/CheckerOnOneVariableComponentLineChecker.java b/src/main/java/fr/inra/oresing/checker/CheckerOnOneVariableComponentLineChecker.java
index 893df7e61c8a902c64a83e191ce66de6d4609dd0..e4445fa66e7d31235f726617396f0c2e5ef83d47 100644
--- a/src/main/java/fr/inra/oresing/checker/CheckerOnOneVariableComponentLineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/CheckerOnOneVariableComponentLineChecker.java
@@ -23,13 +23,13 @@ public interface CheckerOnOneVariableComponentLineChecker<C extends LineCheckerC
 
     default ValidationCheckResult check(Datum datum) {
         Datum transformedDatum = getTransformer().transform(datum);
-        VariableComponentKey variableComponentKey = (VariableComponentKey) getTarget().getTarget();
+        VariableComponentKey variableComponentKey = (VariableComponentKey) getTarget();
         String value = transformedDatum.get(variableComponentKey);
         ValidationCheckResult validationCheckResult;
         if (Strings.isNullOrEmpty(value)) {
             if (getConfiguration().isRequired()) {
                 CheckerTarget target = getTarget();
-                validationCheckResult = DefaultValidationCheckResult.error(target.getInternationalizedKey("requiredValue"), ImmutableMap.of("target", target.getTarget()));
+                validationCheckResult = DefaultValidationCheckResult.error(target.getInternationalizedKey("requiredValue"), ImmutableMap.of("target", target));
             } else {
                 validationCheckResult = DefaultValidationCheckResult.success();
             }
@@ -42,7 +42,7 @@ public interface CheckerOnOneVariableComponentLineChecker<C extends LineCheckerC
     @Override
     default Set<ValidationCheckResult> checkReference(ReferenceDatum referenceDatum) {
         ReferenceDatum transformedReferenceDatum = getTransformer().transform(referenceDatum);
-        final ReferenceColumn column = (ReferenceColumn) getTarget().getTarget();
+        final ReferenceColumn column = (ReferenceColumn) getTarget();
         final Collection<String> valuesToCheck = transformedReferenceDatum.getValuesToCheck(column);
         final Set<ValidationCheckResult> validationCheckResults = valuesToCheck.stream()
                 .map(this::checkRequiredThenCheck)
@@ -55,7 +55,7 @@ public interface CheckerOnOneVariableComponentLineChecker<C extends LineCheckerC
         if (Strings.isNullOrEmpty(value)) {
             if (getConfiguration().isRequired()) {
                 CheckerTarget target = getTarget();
-                validationCheckResult = DefaultValidationCheckResult.error(target.getInternationalizedKey("requiredValue"), ImmutableMap.of("target", target.getTarget()));
+                validationCheckResult = DefaultValidationCheckResult.error(target.getInternationalizedKey("requiredValue"), ImmutableMap.of("target", target));
             } else {
                 validationCheckResult = DefaultValidationCheckResult.success();
             }
diff --git a/src/main/java/fr/inra/oresing/checker/CheckerTarget.java b/src/main/java/fr/inra/oresing/checker/CheckerTarget.java
index 7950d40c0bdbfe680037d80caeb40396c4a4e5b7..128f941096ce056a580ed003593d125cba07d692 100644
--- a/src/main/java/fr/inra/oresing/checker/CheckerTarget.java
+++ b/src/main/java/fr/inra/oresing/checker/CheckerTarget.java
@@ -1,47 +1,18 @@
 package fr.inra.oresing.checker;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import fr.inra.oresing.model.Application;
-import fr.inra.oresing.model.ReferenceColumn;
-import fr.inra.oresing.model.VariableComponentKey;
-import fr.inra.oresing.persistence.OreSiRepository;
-import lombok.Getter;
-import lombok.Setter;
+public interface CheckerTarget {
 
-import java.util.Objects;
+    String getInternationalizedKey(String key);
 
-@Getter
-@Setter
-abstract public class CheckerTarget<T>{
-    private T target;
-    @JsonIgnore
-    private Application application;
-    @JsonIgnore
-    private OreSiRepository.RepositoryForApplication repository;
-    private CheckerTargetType type;
+    /**
+     * @deprecated utilisé dans le front? On devrait plutôt utilisé l'héritage.
+     */
+    @Deprecated
+    CheckerTargetType getType();
 
-    public static CheckerTarget getInstance(VariableComponentKey target, Application application, OreSiRepository.RepositoryForApplication repository){
-        CheckerTarget checkerTarget = new VariableComponentKeyCheckerTarget(target);
-        checkerTarget.application = application;
-        checkerTarget.repository = repository;
-        return checkerTarget;
-    }
-
-    public static CheckerTarget getInstance(ReferenceColumn target, Application application, OreSiRepository.RepositoryForApplication repository){
-        CheckerTarget checkerTarget = new ColumnCheckerTarget(target);
-        checkerTarget.application = application;
-        checkerTarget.repository = repository;
-        return checkerTarget;
-    }
-
-    public abstract String getInternationalizedKey(String key);
-
-    public CheckerTarget(CheckerTargetType type, T target) {
-        this.type = type;
-        this.target = target;
-    }
+    String toHumanReadableString();
 
-    public enum CheckerTargetType{
+    enum CheckerTargetType {
         PARAM_VARIABLE_COMPONENT_KEY("variableComponentKey"),PARAM_COLUMN("column");
 
         private final String type;
@@ -50,7 +21,7 @@ abstract public class CheckerTarget<T>{
             this.type = type;
         }
 
-        String getType(){
+        String getType() {
             return this.type;
         }
 
@@ -59,40 +30,4 @@ abstract public class CheckerTarget<T>{
             return type;
         }
     }
-
-    public static class ColumnCheckerTarget extends CheckerTarget<ReferenceColumn> {
-
-        private ColumnCheckerTarget(ReferenceColumn column) {
-            super(CheckerTargetType.PARAM_COLUMN, column);
-        }
-
-        @Override
-        public String getInternationalizedKey(String key){
-            return key+"WithColumn";
-        }
-    }
-    public static class VariableComponentKeyCheckerTarget extends CheckerTarget<VariableComponentKey> {
-
-        private VariableComponentKeyCheckerTarget(VariableComponentKey variableComponentKey) {
-            super(CheckerTargetType.PARAM_VARIABLE_COMPONENT_KEY, variableComponentKey);
-        }
-
-        @Override
-        public String getInternationalizedKey(String key){
-            return key;
-        }
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        CheckerTarget<?> that = (CheckerTarget<?>) o;
-        return Objects.equals(target, that.target) && type == that.type;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(target, type);
-    }
 }
diff --git a/src/main/java/fr/inra/oresing/checker/DateLineChecker.java b/src/main/java/fr/inra/oresing/checker/DateLineChecker.java
index c2565d47f04cc9691fc6e70c40291c9225d9653c..18bb0cf3a1ed99b53372ccb6152c991a737cf914 100644
--- a/src/main/java/fr/inra/oresing/checker/DateLineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/DateLineChecker.java
@@ -6,6 +6,7 @@ import fr.inra.oresing.persistence.SqlPrimitiveType;
 import fr.inra.oresing.rest.ValidationCheckResult;
 import fr.inra.oresing.rest.validationcheckresults.DateValidationCheckResult;
 import fr.inra.oresing.transformer.LineTransformer;
+import org.apache.commons.lang3.StringUtils;
 
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
@@ -19,6 +20,22 @@ public class DateLineChecker implements CheckerOnOneVariableComponentLineChecker
     @JsonIgnore
     private final LineTransformer transformer;
 
+    public static boolean isValidPattern(String pattern) {
+        if (StringUtils.isBlank(pattern)) {
+            return false;
+        }
+        try {
+            newDateTimeFormatter(pattern);
+            return true;
+        } catch (IllegalArgumentException e) {
+            return false;
+        }
+    }
+
+    private static DateTimeFormatter newDateTimeFormatter(String pattern) {
+        return DateTimeFormatter.ofPattern(pattern);
+    }
+
     public CheckerTarget getTarget(){
         return this.target;
     }
@@ -33,7 +50,7 @@ public class DateLineChecker implements CheckerOnOneVariableComponentLineChecker
     public DateLineChecker(CheckerTarget target, String pattern, DateLineCheckerConfiguration configuration, LineTransformer transformer) {
         this.configuration = configuration;
         this.target = target;
-        this.dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
+        this.dateTimeFormatter = newDateTimeFormatter(pattern);
         this.pattern = pattern;
         this.transformer = transformer;
     }
@@ -53,7 +70,7 @@ public class DateLineChecker implements CheckerOnOneVariableComponentLineChecker
             validationCheckResult = DateValidationCheckResult.error(
                     target,
                     getTarget().getInternationalizedKey("invalidDate"), ImmutableMap.of(
-                            "target", target.getTarget(),
+                            "target", target,
                             "pattern", pattern,
                             "value", value));
         }
diff --git a/src/main/java/fr/inra/oresing/checker/FloatChecker.java b/src/main/java/fr/inra/oresing/checker/FloatChecker.java
index 7038e6b8b89949f0f40b126cace2589b94ab01d5..93757d83af8992ff80e83c056f1d74e854bf59b1 100644
--- a/src/main/java/fr/inra/oresing/checker/FloatChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/FloatChecker.java
@@ -33,7 +33,7 @@ public class FloatChecker implements CheckerOnOneVariableComponentLineChecker<Fl
         } catch (NumberFormatException e) {
             validationCheckResult = DefaultValidationCheckResult.error(
                     getTarget().getInternationalizedKey("invalidFloat"), ImmutableMap.of(
-                            "target", target.getTarget(),
+                            "target", target,
                             "value", value));
         }
         return validationCheckResult;
diff --git a/src/main/java/fr/inra/oresing/checker/IntegerChecker.java b/src/main/java/fr/inra/oresing/checker/IntegerChecker.java
index d5693c1efe45573b0daac0ed9a4aa019b1eac3b2..44a4c33eda68c926f1b67242c0bc31398e147cdf 100644
--- a/src/main/java/fr/inra/oresing/checker/IntegerChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/IntegerChecker.java
@@ -30,9 +30,13 @@ public class IntegerChecker implements CheckerOnOneVariableComponentLineChecker<
             Integer.parseInt(value);
             validationCheckResult = DefaultValidationCheckResult.success();
         } catch (NumberFormatException e) {
-            validationCheckResult = DefaultValidationCheckResult.error(getTarget().getInternationalizedKey("invalidInteger"),
-                    ImmutableMap.of("target",target.getTarget(),
-                            "value", value));
+            validationCheckResult = DefaultValidationCheckResult.error(
+                    getTarget().getInternationalizedKey("invalidInteger"),
+                    ImmutableMap.of(
+                            "target", target,
+                            "value", value
+                    )
+            );
         }
         return validationCheckResult;
     }
diff --git a/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java
index 3460a2e2bce8a04bdecd4f40e4323471d2d795d8..c42730d997137f2b75bfe0ef171272647b233e9b 100644
--- a/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java
@@ -5,10 +5,15 @@ import fr.inra.oresing.transformer.TransformationConfiguration;
 /**
  * Indique qu'un objet a vocation à contenir des paramètres de configuration pour configurer un {@link LineChecker}
  */
-public interface LineCheckerConfiguration extends TransformationConfiguration {
+public interface LineCheckerConfiguration {
 
     /**
      * Indique la valeur est obligatoire.
      */
     boolean isRequired();
+
+    /**
+     * Les transformation à appliquer avant de faire le contrôle
+     */
+    TransformationConfiguration getTransformation();
 }
diff --git a/src/main/java/fr/inra/oresing/checker/ReferenceLineChecker.java b/src/main/java/fr/inra/oresing/checker/ReferenceLineChecker.java
index 87d2f5b2c056ca24e1be3cc2692ea7dc0748dd09..0daaefac4e5dcf43c63fd747d50d13e2353e6f25 100644
--- a/src/main/java/fr/inra/oresing/checker/ReferenceLineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/ReferenceLineChecker.java
@@ -2,7 +2,6 @@ package fr.inra.oresing.checker;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.common.collect.ImmutableMap;
-import fr.inra.oresing.model.ReferenceDatum;
 import fr.inra.oresing.persistence.Ltree;
 import fr.inra.oresing.persistence.SqlPrimitiveType;
 import fr.inra.oresing.rest.validationcheckresults.ReferenceValidationCheckResult;
@@ -48,7 +47,7 @@ public class ReferenceLineChecker implements CheckerOnOneVariableComponentLineCh
             validationCheckResult = ReferenceValidationCheckResult.success(target, rawValue, valueAsLtree, referenceValues.get(valueAsLtree));
         } else {
             validationCheckResult = ReferenceValidationCheckResult.error(target, rawValue, getTarget().getInternationalizedKey("invalidReference"), ImmutableMap.of(
-                    "target", target.getTarget(),
+                    "target", target,
                     "referenceValues", referenceValues,
                     "refType", reference,
                     "value", rawValue));
diff --git a/src/main/java/fr/inra/oresing/checker/RegularExpressionChecker.java b/src/main/java/fr/inra/oresing/checker/RegularExpressionChecker.java
index e0cd07418f62ee69bfc9b2ed5c29a374a2221b65..b230a87d5d40cf62a960d6ec3eb262851df4d732 100644
--- a/src/main/java/fr/inra/oresing/checker/RegularExpressionChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/RegularExpressionChecker.java
@@ -2,13 +2,15 @@ package fr.inra.oresing.checker;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.common.collect.ImmutableMap;
-import fr.inra.oresing.rest.validationcheckresults.DefaultValidationCheckResult;
 import fr.inra.oresing.persistence.SqlPrimitiveType;
 import fr.inra.oresing.rest.ValidationCheckResult;
+import fr.inra.oresing.rest.validationcheckresults.DefaultValidationCheckResult;
 import fr.inra.oresing.transformer.LineTransformer;
+import org.apache.commons.lang3.StringUtils;
 
 import java.util.function.Predicate;
 import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
 
 public class RegularExpressionChecker implements CheckerOnOneVariableComponentLineChecker<RegularExpressionCheckerConfiguration> {
 
@@ -20,6 +22,18 @@ public class RegularExpressionChecker implements CheckerOnOneVariableComponentLi
     private final CheckerTarget target;
     private final RegularExpressionCheckerConfiguration configuration;
 
+    public static boolean isValid(String pattern) {
+        if (StringUtils.isBlank(pattern)) {
+            return false;
+        }
+        try {
+            compile(pattern);
+            return true;
+        } catch (PatternSyntaxException e) {
+            return false;
+        }
+    }
+
     public CheckerTarget getTarget(){
         return this.target;
     }
@@ -28,10 +42,14 @@ public class RegularExpressionChecker implements CheckerOnOneVariableComponentLi
         this.configuration = configuration;
         this.target = target;
         this.patternString = patternString;
-        predicate = Pattern.compile(patternString).asMatchPredicate();
+        this.predicate = compile(patternString).asMatchPredicate();
         this.transformer = transformer;
     }
 
+    private static Pattern compile(String patternString) {
+        return Pattern.compile(patternString);
+    }
+
     @Override
     public ValidationCheckResult check(String value) {
         ValidationCheckResult validationCheckResult;
@@ -40,7 +58,7 @@ public class RegularExpressionChecker implements CheckerOnOneVariableComponentLi
         } else {
             validationCheckResult = DefaultValidationCheckResult.error(
                     getTarget().getInternationalizedKey("patternNotMatched"), ImmutableMap.of(
-                            "target", target.getTarget(),
+                            "target", target,
                             "pattern", patternString,
                             "value", value));
         }
diff --git a/src/main/java/fr/inra/oresing/groovy/StringSetGroovyExpression.java b/src/main/java/fr/inra/oresing/groovy/StringSetGroovyExpression.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ef751147ae72568c45aa8701a0a1ff1283038d3
--- /dev/null
+++ b/src/main/java/fr/inra/oresing/groovy/StringSetGroovyExpression.java
@@ -0,0 +1,53 @@
+package fr.inra.oresing.groovy;
+
+import com.google.common.base.MoreObjects;
+import fr.inra.oresing.OreSiTechnicalException;
+
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+public class StringSetGroovyExpression implements Expression<Set<String>> {
+
+    private final GroovyExpression expression;
+
+    private StringSetGroovyExpression(GroovyExpression expression) {
+        this.expression = expression;
+    }
+
+    public static StringSetGroovyExpression forExpression(String expression) {
+        return new StringSetGroovyExpression(GroovyExpression.forExpression(expression));
+    }
+
+    @Override
+    public Set<String> evaluate(Map<String, Object> context) {
+        Object evaluation = expression.evaluate(context);
+        if (evaluation == null) {
+            return null;
+        } else if (evaluation instanceof String) {
+            return Collections.singleton((String) evaluation);
+        } else if (evaluation instanceof Iterable) {
+            Set<String> result = new LinkedHashSet<>();
+            for (Object unknownElement : (Iterable) evaluation) {
+                if (unknownElement instanceof String) {
+                    result.add((String) evaluation);
+                } else if (unknownElement instanceof Number) {
+                    result.add(unknownElement.toString());
+                } else {
+                    throw new OreSiTechnicalException("L'évaluation de l’expression a bien retourné une collection mais elle contient un élément " + unknownElement + " qui n'est pas de type chaîne de caractères. Expression = " + expression + ", donnée = " + context);
+                }
+            }
+            return result;
+        } else {
+            throw new OreSiTechnicalException("L'évaluation de l’expression n'a pas retourné une collection de chaîne de caractères mais " + evaluation + ". Expression = " + expression + ", donnée = " + context);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("expression", expression)
+                .toString();
+    }
+}
diff --git a/src/main/java/fr/inra/oresing/model/ColumnPresenceConstraint.java b/src/main/java/fr/inra/oresing/model/ColumnPresenceConstraint.java
index 2c6b226da41ade06eefc56e5514ae90e0322e8f9..731d9a7f85d7883700643c91acdca548e3c5f061 100644
--- a/src/main/java/fr/inra/oresing/model/ColumnPresenceConstraint.java
+++ b/src/main/java/fr/inra/oresing/model/ColumnPresenceConstraint.java
@@ -13,9 +13,21 @@ public enum ColumnPresenceConstraint {
     /**
      * Facultatif, la colonne peut être absente du fichier CSV.
      */
-    OPTIONAL;
+    OPTIONAL,
+
+    /**
+     * La colonne doit être absente, c'est une donnée calculée.
+     */
+    ABSENT;
 
     public boolean isMandatory() {
         return MANDATORY == this;
     }
+
+    /**
+     * Si une colonne est attendue dans le fichier CSV
+     */
+    public boolean isExpected() {
+        return ABSENT != this;
+    }
 }
diff --git a/src/main/java/fr/inra/oresing/model/ComputedValueUsage.java b/src/main/java/fr/inra/oresing/model/ComputedValueUsage.java
new file mode 100644
index 0000000000000000000000000000000000000000..5253f984cdaa164f708879264de2443c87d84a67
--- /dev/null
+++ b/src/main/java/fr/inra/oresing/model/ComputedValueUsage.java
@@ -0,0 +1,14 @@
+package fr.inra.oresing.model;
+
+/**
+ * Exprime s'il est possible de calculer une valeur pour une donnée et si oui, qu'en faire.
+ */
+public enum ComputedValueUsage {
+
+    NOT_COMPUTED,
+
+    USE_COMPUTED_AS_DEFAULT_VALUE,
+
+    USE_COMPUTED_VALUE;
+
+}
diff --git a/src/main/java/fr/inra/oresing/model/Configuration.java b/src/main/java/fr/inra/oresing/model/Configuration.java
index f9e87074a9e29e0e72beab5b0143dd734f96c69c..c87f26ae4195764436d98a1b7ab21d14ca73e3f7 100644
--- a/src/main/java/fr/inra/oresing/model/Configuration.java
+++ b/src/main/java/fr/inra/oresing/model/Configuration.java
@@ -1,43 +1,78 @@
 package fr.inra.oresing.model;
 
-import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
 import com.google.common.collect.MoreCollectors;
-import fr.inra.oresing.checker.*;
-import fr.inra.oresing.model.internationalization.*;
+import fr.inra.oresing.checker.CheckerTarget;
+import fr.inra.oresing.checker.DateLineCheckerConfiguration;
+import fr.inra.oresing.checker.FloatCheckerConfiguration;
+import fr.inra.oresing.checker.GroovyLineCheckerConfiguration;
+import fr.inra.oresing.checker.IntegerCheckerConfiguration;
+import fr.inra.oresing.checker.Multiplicity;
+import fr.inra.oresing.checker.ReferenceLineCheckerConfiguration;
+import fr.inra.oresing.checker.RegularExpressionCheckerConfiguration;
+import fr.inra.oresing.model.internationalization.Internationalization;
+import fr.inra.oresing.model.internationalization.InternationalizationApplicationMap;
+import fr.inra.oresing.model.internationalization.InternationalizationAuthorisationMap;
+import fr.inra.oresing.model.internationalization.InternationalizationAuthorisationName;
+import fr.inra.oresing.model.internationalization.InternationalizationDataTypeMap;
+import fr.inra.oresing.model.internationalization.InternationalizationDisplayImpl;
+import fr.inra.oresing.model.internationalization.InternationalizationImpl;
+import fr.inra.oresing.model.internationalization.InternationalizationMap;
+import fr.inra.oresing.model.internationalization.InternationalizationMapDisplayImpl;
+import fr.inra.oresing.model.internationalization.InternationalizationReferenceMap;
+import fr.inra.oresing.transformer.TransformationConfiguration;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
-import org.assertj.core.util.Streams;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.util.CollectionUtils;
-import org.springframework.util.StringUtils;
 
 import javax.annotation.Nullable;
-import java.util.*;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
 
 @Getter
 @Setter
 @ToString
 public class Configuration {
+
     @ApiModelProperty(notes = "The set of requiredAuthorization of data.authorization section. Fill by aplication", required = false, hidden = true)
     private List<String> requiredAuthorizationsAttributes;
-    @ApiModelProperty(notes = "The version number of the yaml schema used to read the deposited yaml",required = true, example = "1")
+
+    @ApiModelProperty(notes = "The version number of the yaml schema used to read the deposited yaml", required = true, example = "1")
     private int version;
+
     @ApiModelProperty(notes = "The internationalization description from other sections. Fill by application", required = false, hidden = true)
     private InternationalizationMap internationalization;
-    @ApiModelProperty(notes = "A comment about this yaml",required = false, example = "Adding sites section")
+
+    @ApiModelProperty(notes = "A comment about this yaml", required = false, example = "Adding sites section")
     private String comment;
-    @ApiModelProperty(notes = "An Application description",required = true)
+
+    @ApiModelProperty(notes = "An Application description", required = true)
     private ApplicationDescription application;
-    @ApiModelProperty(notes = "A list of references indexed by name. A reference is used to describe other references or data..",required = true)
+
+    @ApiModelProperty(notes = "A list of references indexed by name. A reference is used to describe other references or data..", required = true)
     private LinkedHashMap<String, ReferenceDescription> references = new LinkedHashMap<>();
-   @ApiModelProperty(notes = "A composite reference allows you to link references according to an ''is in'' link. For example between a city and country reference.\n" +
-           "You can define several composite references, and a composite reference can contain only one reference or contain a recursion.\n" +
-           "All references used in a datatype.authorization.authorizationscope section must be composite.",required = true)
-     private LinkedHashMap<String, CompositeReferenceDescription> compositeReferences = new LinkedHashMap<>();
-    @ApiModelProperty(notes = "A data type describes a set of data representing a cohesive set of measurements or observations. (values can be stored in one csv file format).",required = false)
+
+    @ApiModelProperty(notes = "A composite reference allows you to link references according to an ''is in'' link. For example between a city and country reference.\n" +
+            "You can define several composite references, and a composite reference can contain only one reference or contain a recursion.\n" +
+            "All references used in a datatype.authorization.authorizationscope section must be composite.", required = true)
+    private LinkedHashMap<String, CompositeReferenceDescription> compositeReferences = new LinkedHashMap<>();
+
+    @ApiModelProperty(notes = "A data type describes a set of data representing a cohesive set of measurements or observations. (values can be stored in one csv file format).", required = false)
     private LinkedHashMap<String, DataTypeDescription> dataTypes = new LinkedHashMap<>();
 
     public InternationalizationMap getInternationalization() {
@@ -70,16 +105,13 @@ public class Configuration {
 
     private void addDependencyNodesForReference(Map<String, DependencyNode> nodes, Map.Entry<String, ReferenceDescription> reference) {
         DependencyNode dependencyNode = nodes.computeIfAbsent(reference.getKey(), k -> new DependencyNode(reference.getKey()));
-        LinkedHashMap<String, LineValidationRuleDescription> validations = reference.getValue().getValidations();
+        LinkedHashMap<String, LineValidationRuleWithColumnsDescription> validations = reference.getValue().getValidations();
         if (!CollectionUtils.isEmpty(validations)) {
-            for (Map.Entry<String, LineValidationRuleDescription> validation : validations.entrySet()) {
+            for (Map.Entry<String, LineValidationRuleWithColumnsDescription> validation : validations.entrySet()) {
                 CheckerDescription checker = validation.getValue().getChecker();
                 if (checker != null) {
-                    String refType = Optional.of(checker)
-                            .map(CheckerDescription::getParams)
-                            .map(CheckerConfigurationDescription::getRefType)
-                            .orElse(null);
-                    if ("Reference".equals(checker.getName()) && refType != null) {
+                    String refType = checker.getParams().getRefType();
+                    if ("Reference".equals(checker.getName()) && StringUtils.isNotEmpty(refType)) {
                         DependencyNode node = nodes.computeIfAbsent(refType, k -> new DependencyNode(refType));
                         dependencyNode.addDependance(node);
                     }
@@ -107,18 +139,52 @@ public class Configuration {
     @Setter
     @ToString
     public static class ReferenceDescription extends InternationalizationDisplayImpl {
+
         @ApiModelProperty(notes = "The separator in csv files", required = false)
         private char separator = ';';
+
         @ApiModelProperty(notes = "The list of columns composing the natural key of a row.", required = true)
         private List<String> keyColumns = new LinkedList<>();
+
         @ApiModelProperty(notes = "The list of columns descriptions.", required = true)
-        private LinkedHashMap<String, ReferenceColumnDescription> columns = new LinkedHashMap<>();
-        @ApiModelProperty(notes = "The list of dynamic columns descriptions. Dynamic columns names reffers to an other reference.", required = true)
+        private LinkedHashMap<String, ReferenceStaticNotComputedColumnDescription> columns = new LinkedHashMap<>();
+
+        @ApiModelProperty(notes = "The list of computed columns descriptions. Computed columns are not provided in the CSV but computed line by line when importing.", required = false)
+        private LinkedHashMap<String, ReferenceStaticComputedColumnDescription> computedColumns = new LinkedHashMap<>();
+
+        @ApiModelProperty(notes = "The list of dynamic columns descriptions. Dynamic columns names refers to an other reference.", required = true)
         private LinkedHashMap<String, ReferenceDynamicColumnDescription> dynamicColumns = new LinkedHashMap<>();
+
         @ApiModelProperty(notes = "The list of validations to perform on this reference.", required = false)
-        private LinkedHashMap<String, LineValidationRuleDescription> validations = new LinkedHashMap<>();
+        private LinkedHashMap<String, LineValidationRuleWithColumnsDescription> validations = new LinkedHashMap<>();
+
+        public Set<String> doGetAllColumns() {
+            return doGetAllColumnDescriptions().keySet();
+        }
 
-        public static Map<String, InternationalizationReferenceMap>  getInternationalization(LinkedHashMap<String, ReferenceDescription> referenceDescriptionMap) {
+        public Set<String> doGetStaticColumns() {
+            return doGetStaticColumnDescriptions().keySet();
+        }
+
+        public Map<String, ReferenceColumnDescription> doGetAllColumnDescriptions() {
+            Map<String, ReferenceColumnDescription> allColumnDescriptions = new LinkedHashMap<>();
+            allColumnDescriptions.putAll(doGetStaticColumnDescriptions());
+            allColumnDescriptions.putAll(dynamicColumns);
+            return allColumnDescriptions;
+        }
+
+        public Map<String, ReferenceStaticColumnDescription> doGetStaticColumnDescriptions() {
+            Map<String, ReferenceStaticColumnDescription> staticColumnDescriptions = new LinkedHashMap<>();
+            staticColumnDescriptions.putAll(columns);
+            staticColumnDescriptions.putAll(computedColumns);
+            return staticColumnDescriptions;
+        }
+
+        public boolean hasStaticColumn(String column) {
+            return doGetStaticColumns().contains(column);
+        }
+
+        public static Map<String, InternationalizationReferenceMap> getInternationalization(LinkedHashMap<String, ReferenceDescription> referenceDescriptionMap) {
             Map<String, InternationalizationReferenceMap> internationalizationReferenceMap = new HashMap<>();
             for (Map.Entry<String, ReferenceDescription> entry : referenceDescriptionMap.entrySet()) {
                 final String reference = entry.getKey();
@@ -127,38 +193,71 @@ public class Configuration {
                 internationalizationReference.setInternationalizationDisplay(referenceDescription.getInternationalizationDisplay());
                 internationalizationReference.setInternationalizationName(referenceDescription.getInternationalizationName());
                 internationalizationReference.setInternationalizedColumns(referenceDescription.getInternationalizedColumns());
+                Map<String, Internationalization> internationalizedValidations =
+                        Maps.transformValues(referenceDescription.getValidations(), InternationalizationImpl::getInternationalizationName);
+                internationalizationReference.setInternationalizedValidations(internationalizedValidations);
                 internationalizationReferenceMap.put(reference, internationalizationReference);
             }
             return internationalizationReferenceMap;
         }
     }
 
+    @Getter
+    @Setter
+    public static abstract class ReferenceColumnDescription {
+
+        @ApiModelProperty(notes = "If the column is mandatory or not", required = true, example = "MANDATORY", allowableValues = "MANDATORY,OPTIONAL")
+        ColumnPresenceConstraint presenceConstraint = ColumnPresenceConstraint.MANDATORY;
+    }
+
+    @Getter
+    @Setter
+    public static abstract class ReferenceStaticColumnDescription extends ReferenceColumnDescription {
+
+        @ApiModelProperty(notes = "Define a checker to apply for this column on each line of the CSV at import", required = false)
+        @Nullable
+        CheckerDescription checker;
+    }
+
+    @Getter
+    @Setter
+    @ToString
+    public static class ReferenceStaticNotComputedColumnDescription extends ReferenceStaticColumnDescription {
+
+        @ApiModelProperty(notes = "Define a default value for this column: it will be computed if the CSV contains an empty cell", required = false)
+        @Nullable
+        GroovyConfiguration defaultValue;
+    }
+
     @Getter
     @Setter
     @ToString
-    public static class ReferenceColumnDescription {
-        @ApiModelProperty(notes = "If the column is or not mandatory", required = true, example = "MANDATORY", allowableValues = "MANDATORY,OPTIONAL")
-        private ColumnPresenceConstraint presenceConstraint = ColumnPresenceConstraint.MANDATORY;
+    public static class ReferenceStaticComputedColumnDescription extends ReferenceStaticColumnDescription {
+
+        @ApiModelProperty(notes = "Explain how to compute the value for this column given other columns", required = false)
+        GroovyConfiguration computation;
     }
 
     @Getter
     @Setter
     @ToString
-    public static class ReferenceDynamicColumnDescription {
-        @ApiModelProperty(notes = "The header prefix. All culumnsthat startswith this prefix use this description", example = "rt_", required = true)
+    public static class ReferenceDynamicColumnDescription extends ReferenceColumnDescription {
+
+        @ApiModelProperty(notes = "The header prefix. All columns that starts with this prefix use this description", example = "rt_", required = true)
         private String headerPrefix = "";
+
         @ApiModelProperty(notes = "The reference that contains the column names", required = true, example = "proprietes_taxon")
         private String reference;
-        @ApiModelProperty(notes = "The column in this reference that contains the column names", required = true, example = "name")
+
+        @ApiModelProperty(notes = "The column in 'reference' that contains the column names", required = true, example = "name")
         private String referenceColumnToLookForHeader;
-        @ApiModelProperty(notes = "If the column is or not mandatory", required = true, example = "MANDATORY", allowableValues = "MANDATORY,OPTIONAL")
-        private ColumnPresenceConstraint presenceConstraint = ColumnPresenceConstraint.MANDATORY;
     }
 
     @Getter
     @Setter
     @ToString
     public static class CompositeReferenceDescription extends InternationalizationImpl {
+        @ApiModelProperty(notes = "A 'composite reference' is a hierarchy of references from largest entity to the smallest", required = false)
         List<CompositeReferenceComponentDescription> components = new LinkedList<>();
 
         public boolean isDependentOfReference(String reference) {
@@ -172,11 +271,14 @@ public class Configuration {
     @Setter
     @ToString
     public static class CompositeReferenceComponentDescription extends InternationalizationImpl {
-        @ApiModelProperty(notes = "The reference composing the composite reference", required = true, example = "types_sites")
+
+        @ApiModelProperty(notes = "A reference composing the composite reference", required = true, example = "types_sites")
         String reference;
-        @ApiModelProperty(notes = "The reference where this reference refers to", required = false, example = "name")
+
+        @ApiModelProperty(notes = "The column of 'reference' where we can find the natural key the find the parent for this line", required = false, example = "name")
         String parentKeyColumn;
-        @ApiModelProperty(notes = "For recursive composite reference : the reference column that's contains parent key", required = false, example = "parent_key")
+
+        @ApiModelProperty(notes = "For recursive composite reference: the reference column that contains parent key", required = false, example = "parent_key")
         String parentRecursiveKey;
     }
 
@@ -184,19 +286,26 @@ public class Configuration {
     @Setter
     @ToString
     public static class DataTypeDescription extends InternationalizationMapDisplayImpl {
+
         @ApiModelProperty(notes = "This section describes a binding between a file and the data", required = true)
         FormatDescription format;
-        @ApiModelProperty(notes = "This section describes the data model", required = true)
-        LinkedHashMap<String, ColumnDescription> data = new LinkedHashMap<>();
-        @ApiModelProperty(notes = "This section validate the data format", required = true)
-        LinkedHashMap<String, LineValidationRuleDescription> validations = new LinkedHashMap<>();
-        @ApiModelProperty(notes = "This section defines the natural key of a line", required = false)
+
+        @ApiModelProperty(notes = "This section describes the data model, splitting each line of data in variable/components", required = true)
+        LinkedHashMap<String, VariableDescription> data = new LinkedHashMap<>();
+
+        @ApiModelProperty(notes = "Some validations rules that will be checked at import. It will allow to make sure a line we import is consistent.", required = true)
+        LinkedHashMap<String, LineValidationRuleWithVariableComponentsDescription> validations = new LinkedHashMap<>();
+
+        @ApiModelProperty(notes = "This section defines the variable/components that compose the natural key of a line", required = false)
         List<VariableComponentKey> uniqueness = new LinkedList<>();
-        @ApiModelProperty(notes = "This section defines how to migrate the data when a new version of yaml is registred", required = false)
+
+        @ApiModelProperty(notes = "This section defines how to migrate the data when a new version of yaml is registered", required = false)
         TreeMap<Integer, List<MigrationDescription>> migrations = new TreeMap<>();
-        @ApiModelProperty(notes = "This section defines the autorizations for this dataType", required = true)
+
+        @ApiModelProperty(notes = "This section defines the autorization model for this dataType, how we define who can access what", required = true)
         AuthorizationDescription authorization;
-        @ApiModelProperty(notes = "If this section existe, the data file will be store on a repository tree", required = false)
+
+        @ApiModelProperty(notes = "If this section exists, the data file will be store on a repository tree", required = false)
         LinkedHashMap<String, String> repository = null;
 
         public static Map<String, InternationalizationDataTypeMap> getInternationalization(LinkedHashMap<String, DataTypeDescription> dataTypeDescriptionMap) {
@@ -209,31 +318,79 @@ public class Configuration {
                 internationalizationDataTypeMap.setInternationalizationName(dataTypeDescription.getInternationalizationName());
                 internationalizationDataTypeMap.setInternationalizedColumns(dataTypeDescription.getInternationalizedColumns());
                 internationalizationDataTypeMap.setAuthorization(Optional.ofNullable(dataTypeDescription.getAuthorization()).map(AuthorizationDescription::getInternationalization).orElse(null));
+                Map<String, Internationalization> internationalizedValidations =
+                        Maps.transformValues(dataTypeDescription.getValidations(), InternationalizationImpl::getInternationalizationName);
+                internationalizationDataTypeMap.setInternationalizedValidations(internationalizedValidations);
                 internationalizationDataTypeMapMap.put(datatype, internationalizationDataTypeMap);
             }
             return internationalizationDataTypeMapMap;
         }
+
+        public ImmutableSet<VariableComponentKey> doGetAllVariableComponents() {
+            return getData().entrySet().stream().flatMap(
+                    variableEntry -> {
+                        String variable = variableEntry.getKey();
+                        return variableEntry.getValue().doGetAllComponents().stream()
+                                .map(component -> new VariableComponentKey(variable, component));
+            }).collect(ImmutableSet.toImmutableSet());
+        }
     }
 
     @Getter
     @Setter
-    @ToString
-    public static class LineValidationRuleDescription {
-        @ApiModelProperty(notes = "A description of the validation", required = false)
-        String description;
-        @ApiModelProperty(notes = "A checker that can validate one or some columns. Can also build new values from other values.", required = true)
+    public static abstract class LineValidationRuleDescription extends InternationalizationImpl {
+
+        @ApiModelProperty(notes = "The checker to apply to ensure that the rule is respected", required = true)
         CheckerDescription checker;
+
+        /**
+         * Si le checker est un {@link fr.inra.oresing.checker.CheckerOnOneVariableComponentLineChecker}, les {@link CheckerTarget} sur lesquelles il s'applique
+         */
+        public abstract Set<CheckerTarget> doGetCheckerTargets();
+    }
+
+    @Getter
+    @Setter
+    @ToString
+    public static class LineValidationRuleWithColumnsDescription extends LineValidationRuleDescription {
+
+        @ApiModelProperty(notes = "The set of columns to check", required = false)
+        Set<String> columns;
+
+        @Override
+        public Set<CheckerTarget> doGetCheckerTargets() {
+            return columns.stream()
+                    .map(ReferenceColumn::new)
+                    .collect(Collectors.toUnmodifiableSet());
+        }
+    }
+
+    @Getter
+    @Setter
+    @ToString
+    public static class LineValidationRuleWithVariableComponentsDescription extends LineValidationRuleDescription {
+
+        @ApiModelProperty(notes = "The set of variable/components to check", required = false, hidden = true)
+        Set<VariableComponentKey> variableComponents;
+
+        @Override
+        public Set<CheckerTarget> doGetCheckerTargets() {
+            return Set.copyOf(variableComponents);
+        }
     }
 
     @Getter
     @Setter
     @ToString
     public static class AuthorizationDescription {
-        @ApiModelProperty(notes = "The variable component with a checker date that identify the time scope of the line", required = true)
+
+        @ApiModelProperty(notes = "The variable component that identifies the time scope of the line (must be a variable/component with a checker of type 'Date')", required = true)
         VariableComponentKey timeScope;
-        @ApiModelProperty(notes = "A list of authorization scopes. An authorization scope is for example a an authorization on a location", required = true)
+
+        @ApiModelProperty(notes = "A list of authorization scopes. An authorization scope is for example the location, the project, or both.", required = true)
         LinkedHashMap<String, AuthorizationScopeDescription> authorizationScopes = new LinkedHashMap<>();
-        @ApiModelProperty(notes = "A list of datagroups. A line wil be split into as many lines as there are data groups. Datagroups is partition of variables", required = true)
+
+        @ApiModelProperty(notes = "The list of 'data groups'. Each data group contains variables. People will be given a right on one or more data-group.", required = true)
         LinkedHashMap<String, DataGroupDescription> dataGroups = new LinkedHashMap<>();
 
         public InternationalizationAuthorisationMap getInternationalization() {
@@ -260,9 +417,11 @@ public class Configuration {
     @Setter
     @ToString
     public static class AuthorizationScopeDescription extends InternationalizationImpl {
-        @ApiModelProperty(notes = "The variable name", required = true, example = "temperature")
+
+        @ApiModelProperty(notes = "This autorization scope is defined by a variable/component, this is the variable name", required = true, example = "localization")
         String variable;
-        @ApiModelProperty(notes = "The component name. A component is an information about a variable", required = true, example = "unit")
+
+        @ApiModelProperty(notes = "This autorization scope is defined by a variable/component, this is the component name", required = true, example = "zone")
         String component;
 
         public VariableComponentKey getVariableComponentKey() {
@@ -274,16 +433,22 @@ public class Configuration {
     @Setter
     @ToString
     public static class FormatDescription {
+
         @ApiModelProperty(notes = "The line with columns names", required = true, example = "1")
         private int headerLine = 1;
-        @ApiModelProperty(notes = "The first line with data", required = true, example = "2")
+
+        @ApiModelProperty(notes = "The number of the line that contain the first row of data", required = true, example = "2")
         private int firstRowLine = 2;
-        @ApiModelProperty(notes = "The csv separator", required = false, example = ";")
+
+        @ApiModelProperty(notes = "The CSV separator", required = false, example = ";")
         private char separator = ';';
-        @ApiModelProperty(notes = "The description for binding columns content to variable component", required = true)
+
+        @ApiModelProperty(notes = "The description for binding columns content to variable/components", required = true)
         private List<ColumnBindingDescription> columns = new LinkedList<>();
-        @ApiModelProperty(notes = "The description for binding repeated columns content to variable component", required = false)
+
+        @ApiModelProperty(notes = "The description of repeated colulmns patterns and their binding to variable/components", required = false)
         private List<RepeatedColumnBindingDescription> repeatedColumns = new LinkedList<>();
+
         @ApiModelProperty(notes = "The description of some values in header to bind to variable component", required = false)
         private List<HeaderConstantDescription> constants = new LinkedList<>();
     }
@@ -292,14 +457,19 @@ public class Configuration {
     @Setter
     @ToString
     public static class HeaderConstantDescription {
+
         @ApiModelProperty(notes = "The row where is the constant value", required = true, example = "1")
         int rowNumber;
-        @ApiModelProperty(notes = "The column where is the constant value. Id empty headerName is required", required = false, example = "2")
+
+        @ApiModelProperty(notes = "The column where is the constant value. If empty, 'headerName' must be provided", required = false, example = "2")
         int columnNumber;
-        @ApiModelProperty(notes = "The header column name of column where is the constant value. Id empty columnNumber is required", required = false, example = "CO2")
+
+        @ApiModelProperty(notes = "The header column name of column where is the constant value. If empty, 'columnNumber' must be provided", required = false, example = "CO2")
         String headerName;
-        @ApiModelProperty(notes = "The variable component to bound to", required = true)
+
+        @ApiModelProperty(notes = "The variable/component to bound to", required = true)
         VariableComponentKey boundTo;
+
         @ApiModelProperty(notes = "The export header name", required = true, example = "CO2_unit")
         String exportHeader;
 
@@ -316,9 +486,11 @@ public class Configuration {
     @Setter
     @ToString
     public static class ColumnBindingDescription {
-        @ApiModelProperty(notes = "The  header name of column that contains the value to bind", required = true, example = "CO2")
+
+        @ApiModelProperty(notes = "The header name of column that contains the value to bind", required = true, example = "CO2")
         String header;
-        @ApiModelProperty(notes = "The  variable component to bind to", required = true)
+
+        @ApiModelProperty(notes = "The variable/component to bind to. The content of the cell from the CSV will be pushed in this variable/component", required = true)
         VariableComponentKey boundTo;
     }
 
@@ -326,13 +498,17 @@ public class Configuration {
     @Setter
     @ToString
     public static class RepeatedColumnBindingDescription {
+
         @ApiModelProperty(notes = "The regexp pattern to find repeated columns to bind", required = true, example = "(.*)_([0-9]*)_([0-9]*)")
         String headerPattern;
+
         @ApiModelProperty(notes = "The export header (for value) of these columns", required = true, example = "SMP")
         String exportHeader;
+
         @ApiModelProperty(notes = "How bind the result of regexp parenthesis. $1 to first pattern, $2 is the second ...", required = false)
         List<HeaderPatternToken> tokens = new LinkedList<>();
-        @ApiModelProperty(notes = "How bind the value column", required = true)
+
+        @ApiModelProperty(notes = "The variable/component to bind to. The content of the cell from the CSV will be pushed in this variable/component", required = true)
         VariableComponentKey boundTo;
     }
 
@@ -340,27 +516,49 @@ public class Configuration {
     @Setter
     @ToString
     public static class HeaderPatternToken {
-        @ApiModelProperty(notes = "The variable component to bind to", required = true)
+
+        @ApiModelProperty(notes = "The variable/component to bind to. The content of the cell from the CSV will be pushed in this variable/component", required = true)
         VariableComponentKey boundTo;
-        @ApiModelProperty(notes = "The export header(for pattern) name", required = true, example = "profondeur")
+
+        @ApiModelProperty(notes = "When this data will be exported as CSV, the header of the column that will contain the value", required = true, example = "profondeur")
         String exportHeader;
     }
 
     @Getter
     @Setter
     @ToString
-    public static class ColumnDescription {
-        @ApiModelProperty(notes = "A description to create disponibility charts", required = false)
+    public static class VariableDescription {
+
+        @ApiModelProperty(notes = "A description to create disponibilité charts", required = false)
         Chart chartDescription;
-        @ApiModelProperty(notes = "A list of variable component", required = true)
-        LinkedHashMap<String, VariableComponentDescription> components = new LinkedHashMap<>();
+
+        @ApiModelProperty(notes = "The list of components for this variable", required = true)
+        LinkedHashMap<String, VariableComponentWithDefaultValueDescription> components = new LinkedHashMap<>();
+
+        @ApiModelProperty(notes = "The list of computed components for this variable", required = true)
+        LinkedHashMap<String, ComputedVariableComponentDescription> computedComponents = new LinkedHashMap<>();
+
+        public Set<String> doGetAllComponents() {
+            return doGetAllComponentDescriptions().keySet();
+        }
+
+        public Map<String, VariableComponentDescription> doGetAllComponentDescriptions() {
+            Map<String, VariableComponentDescription> allComponentDescriptions = new LinkedHashMap<>();
+            allComponentDescriptions.putAll(components);
+            allComponentDescriptions.putAll(computedComponents);
+            return allComponentDescriptions;
+        }
+
+        public boolean hasComponent(String component) {
+            return doGetAllComponents().contains(component);
+        }
     }
 
     @Getter
     @Setter
     @ToString
     public static class Chart {
-        public static String VAR_SQL_TEMPLATE =  "(\n" +
+        public static String VAR_SQL_TEMPLATE = "(\n" +
                 "\t   Array['%1$s','%2$s'],-- aggrégation\n" +
                 "\t   Array['%3$s','%4$s'], -- value\n" +
                 "\t   '%5$s',-- datatype\n" +
@@ -369,14 +567,19 @@ public class Configuration {
         public static String VAR_SQL_DEFAULT_TEMPLATE = " (\n" +
                 "\t   '%s' -- datatype\n" +
                 "   )\n";
-        @ApiModelProperty(notes = "The component contening value", required = true)
+
+        @ApiModelProperty(notes = "The component containing value", required = true)
         String value;
+
         @ApiModelProperty(notes = "A variable component for aggregate values", required = false)
         VariableComponentKey aggregation = null;
-        @ApiModelProperty(notes = "A variable component for unit", required = false)
+
+        @ApiModelProperty(notes = "A variable/component for unit", required = false)
         String unit = null;
-        @ApiModelProperty(notes = "An sql expression for max gap between consecutives values", required = false)
+
+        @ApiModelProperty(notes = "An sql expression for max gap between consecutive values", required = false)
         String gap = null;
+
         @ApiModelProperty(notes = "A component for standardDeviation", required = false)
         String standardDeviation = null;
 
@@ -392,7 +595,8 @@ public class Configuration {
             );
             return sql;
         }
-        public static String toSQL( String dataType) {
+
+        public static String toSQL(String dataType) {
             String sql = String.format(
                     VAR_SQL_DEFAULT_TEMPLATE,
                     dataType
@@ -403,37 +607,41 @@ public class Configuration {
 
     @Getter
     @Setter
-    @ToString
-    public static class VariableComponentDescription {
+    public abstract static class VariableComponentDescription {
+
         @ApiModelProperty(notes = "A checker description", required = false)
         CheckerDescription checker;
+    }
+
+    @Getter
+    @Setter
+    @ToString
+    public static class VariableComponentWithDefaultValueDescription extends VariableComponentDescription {
+
+        @ApiModelProperty(notes = "A default value if the cell in the imported CSV is empty", required = false)
         @Nullable
-        @ApiModelProperty(notes = "A default value if ciolumn is empty. This is a groovy expression", required = false, example = "-9999")
-        String defaultValue;
-        @ApiModelProperty(notes = "The params of the  checker. Required for some checkers. params depends of checker name", required = false)
-        VariableComponentDescriptionConfiguration params;
+        GroovyConfiguration defaultValue;
     }
 
     @Getter
     @Setter
     @ToString
-    public static class VariableComponentDescriptionConfiguration implements GroovyDataInjectionConfiguration {
-        @ApiModelProperty(notes = "The list of references values in database to add in groovy context", required = false)
-        Set<String> references = new LinkedHashSet<>();
-        @ApiModelProperty(notes = "The list of datatypes values in database to add in groovy context", required = false)
-        Set<String> datatypes = new LinkedHashSet<>();
-        @ApiModelProperty(notes = "If true the result of grrovy expression replace the value of the column", required = false, example = "true", allowableValues = "true,false")
-        boolean replace;
+    public static class ComputedVariableComponentDescription extends VariableComponentDescription {
+
+        @ApiModelProperty(notes = "Explain how to compute the value for this computed component given other columns", required = false)
+        GroovyConfiguration computation;
     }
 
     @Getter
     @Setter
     @ToString
     public static class CheckerDescription {
-        @ApiModelProperty(notes = "The name of the checker that must be used", required = true, allowableValues = "RegularExpression,Reference,Float,Integer,Date,GroovyExpression")
+
+        @ApiModelProperty(notes = "The name of the checker that must be used", required = true)
         String name;
+
         @ApiModelProperty(notes = "The params of the checker to configure it. Required for some checkers", required = false)
-        CheckerConfigurationDescription params;
+        CheckerConfigurationDescription params = new CheckerConfigurationDescription();
     }
 
     @Getter
@@ -446,36 +654,46 @@ public class Configuration {
             DateLineCheckerConfiguration,
             ReferenceLineCheckerConfiguration,
             GroovyLineCheckerConfiguration {
+
         @ApiModelProperty(notes = "The pattern of a regular expression for RegularExpression checker\nthe pattern of a date for Date checker", required = false, example = "dd/MM/yyyy")
         String pattern;
+
         @ApiModelProperty(notes = "the name of the reference for Reference checker", required = false, example = "units")
         String refType;
+
         @ApiModelProperty(notes = "A groovy expression for Reference checker, GroovyChecker", required = false)
         GroovyConfiguration groovy;
-        @ApiModelProperty(notes = "The list of columns to build natural key of reference for Reference checker", required = false)
-        String columns;
-        @ApiModelProperty(notes = "the variable component key for this checkern filled by application", required = false, hidden = true)
-        String variableComponentKey;
+
         String duration;
-        @ApiModelProperty(notes = "If true codifies the column value", required = false, example = "true", allowableValues = "true,false")
-        boolean codify;
+
+        @ApiModelProperty(notes = "How to transform the value before checking it", required = false)
+        @Nullable
+        TransformationConfigurationDescription transformation = new TransformationConfigurationDescription();
+
         @ApiModelProperty(notes = "If true the value can't be null", required = false, example = "true", allowableValues = "true,false")
-        boolean required;
-        @ApiModelProperty(notes = "If MANY the value is a list of references for Reference checker", required = false, example ="MANY", allowableValues = "MANY,ONE")
+        boolean required = true;
+
+        @ApiModelProperty(notes = "If MANY the value is a list of references for Reference checker", required = false, example = "MANY", allowableValues = "MANY,ONE")
         Multiplicity multiplicity = Multiplicity.ONE;
+    }
 
-        public ImmutableSet<String> doGetColumnsAsCollection() {
-            if (StringUtils.isEmpty(getColumns())) {
-                return ImmutableSet.of();
-            }
-            return Streams.stream(Splitter.on(",").split(getColumns())).collect(ImmutableSet.toImmutableSet());
-        }
+    @Getter
+    @Setter
+    @ToString
+    public static class TransformationConfigurationDescription implements TransformationConfiguration {
+
+        @ApiModelProperty(notes = "If true, codifies the column value. The value will be escaped to a format suitable for a naturel key. Will be applied after 'groovy' expression if both are active.", required = false, example = "true", allowableValues = "true,false")
+        boolean codify;
+
+        @ApiModelProperty(notes = "A groovy expression to transform the value before the checker checks it", required = false)
+        GroovyConfiguration groovy;
     }
 
     @Getter
     @Setter
     @ToString
     public static class GroovyConfiguration implements fr.inra.oresing.checker.GroovyConfiguration {
+
         @ApiModelProperty(notes = "A groovy expression", required = false, example = ">\n" +
                 "                String dataType = Arrays.stream(datum.dataType)\n" +
                 "                  .split(\"_\"))\n" +
@@ -483,9 +701,11 @@ public class Configuration {
                 "                  .join(); " +
                 "                return application.dataType.contains(dataType);")
         String expression;
+
         @ApiModelProperty(notes = "The list of references values in database to add to groovy context", required = false)
         Set<String> references = new LinkedHashSet<>();
-        @ApiModelProperty(notes = "The list of datatypes values in database to add to groovy context", required = false)
+
+        @ApiModelProperty(notes = "The list of data types values in database to add to groovy context", required = false)
         Set<String> datatypes = new LinkedHashSet<>();
     }
 
@@ -493,9 +713,11 @@ public class Configuration {
     @Setter
     @ToString
     public static class DataGroupDescription extends InternationalizationImpl {
-        @ApiModelProperty(notes = "The name of the datagroup", required = true, example = "localizations")
+
+        @ApiModelProperty(notes = "The name of the data group", required = true, example = "localizations")
         String label;
-        @ApiModelProperty(notes = "The list of variable in this datagroup", required = true)
+
+        @ApiModelProperty(notes = "The list of variables in this data group", required = true)
         Set<String> data = new LinkedHashSet<>();
     }
 
@@ -503,11 +725,14 @@ public class Configuration {
     @Setter
     @ToString
     public static class ApplicationDescription extends InternationalizationImpl {
-        @ApiModelProperty(notes = "The unique name of the application",required = true, example = "ACBB")
+
+        @ApiModelProperty(notes = "The unique name of the application", required = true, example = "ACBB")
         String name;
-        @ApiModelProperty(notes = "The version incremental version number of this yaml description of this application",required = true, example = "1")
+
+        @ApiModelProperty(notes = "The version incremental version number of this yaml description of this application", required = true, example = "1")
         int version;
-        @ApiModelProperty(notes = "The default language if none is provided",required = false, example = "fr")
+
+        @ApiModelProperty(notes = "The default language if none is provided", required = false, example = "fr")
         Locale defaultLanguage;
 
         public InternationalizationApplicationMap getInternationalization() {
@@ -521,12 +746,16 @@ public class Configuration {
     @Setter
     @ToString
     public static class MigrationDescription {
+
         @ApiModelProperty(notes = "The migration strategy", required = true, example = "ADD_VARIABLE", allowableValues = "ADD_VARIABLE")
         MigrationStrategy strategy;
-        @ApiModelProperty(notes = "A datagroup name", required = true, example = "variables")
+
+        @ApiModelProperty(notes = "A data group name", required = true, example = "variables")
         String dataGroup;
-        @ApiModelProperty(notes = "A variable in this datagroup", required = true, example = "CO2")
+
+        @ApiModelProperty(notes = "A variable in this data group", required = true, example = "CO2")
         String variable;
+
         @ApiModelProperty(notes = "A list of component migration description for this variable", required = true)
         Map<String, AddVariableMigrationDescription> components = new LinkedHashMap<>();
     }
@@ -535,6 +764,7 @@ public class Configuration {
     @Setter
     @ToString
     public static class AddVariableMigrationDescription {
+
         @ApiModelProperty(notes = "The value by default if the variable component is empty after migration", required = true, example = "-9999")
         String defaultValue;
     }
diff --git a/src/main/java/fr/inra/oresing/model/Duration.java b/src/main/java/fr/inra/oresing/model/Duration.java
index d83e0971c48e5c7806ee9686bdf3d0e3f48ba5e1..18c50694a75ab669ed4e05214d21449d5586ee9e 100644
--- a/src/main/java/fr/inra/oresing/model/Duration.java
+++ b/src/main/java/fr/inra/oresing/model/Duration.java
@@ -19,6 +19,11 @@ public class Duration {
             this.temporalUnit = ChronoUnit.valueOf(matcher.group(2).toUpperCase());
         }
     }
+
+    public static boolean isValid(String duration) {
+        return PATTERN.matcher(duration).matches();
+    }
+
     LocalDateTimeRange getLocalDateTimeRange(LocalDateTime date){
         return LocalDateTimeRange.between(LocalDateTime.from(date), date.plus(amount, temporalUnit));
     }
diff --git a/src/main/java/fr/inra/oresing/model/ReferenceColumn.java b/src/main/java/fr/inra/oresing/model/ReferenceColumn.java
index 0b942eb010714b3d8dddb5970820759f4a3ceaba..f6172478a62c5fcf1ffc015997bb69cc92cb66f4 100644
--- a/src/main/java/fr/inra/oresing/model/ReferenceColumn.java
+++ b/src/main/java/fr/inra/oresing/model/ReferenceColumn.java
@@ -1,11 +1,12 @@
 package fr.inra.oresing.model;
 
+import fr.inra.oresing.checker.CheckerTarget;
 import lombok.Value;
 
 import java.util.Locale;
 
 @Value
-public class ReferenceColumn implements SomethingToBeStoredAsJsonInDatabase<String> {
+public class ReferenceColumn implements CheckerTarget, SomethingToBeStoredAsJsonInDatabase<String> {
     String column;
 
     public static ReferenceColumn forDisplay(Locale locale) {
@@ -20,4 +21,19 @@ public class ReferenceColumn implements SomethingToBeStoredAsJsonInDatabase<Stri
     public String toJsonForDatabase() {
         return column;
     }
+
+    @Override
+    public String getInternationalizedKey(String key) {
+        return key + "WithColumn";
+    }
+
+    @Override
+    public CheckerTargetType getType() {
+        return CheckerTargetType.PARAM_COLUMN;
+    }
+
+    @Override
+    public String toHumanReadableString() {
+        return column;
+    }
 }
diff --git a/src/main/java/fr/inra/oresing/model/VariableComponentKey.java b/src/main/java/fr/inra/oresing/model/VariableComponentKey.java
index 45612c25242423b86e940ed17a0972fc5cc70832..319ba0c79bf4d5ecfdbd82da36aa1ae587150c97 100644
--- a/src/main/java/fr/inra/oresing/model/VariableComponentKey.java
+++ b/src/main/java/fr/inra/oresing/model/VariableComponentKey.java
@@ -1,10 +1,11 @@
 package fr.inra.oresing.model;
 
+import fr.inra.oresing.checker.CheckerTarget;
 import lombok.Value;
 import org.apache.commons.lang3.StringUtils;
 
 @Value
-public class VariableComponentKey {
+public class VariableComponentKey implements CheckerTarget {
 
     private static final String SEPARATOR = "_";
 
@@ -20,6 +21,22 @@ public class VariableComponentKey {
     public String getId() {
         return variable + SEPARATOR + component;
     }
+
+    @Override
+    public String getInternationalizedKey(String key) {
+        return key;
+    }
+
+    @Override
+    public CheckerTargetType getType() {
+        return CheckerTargetType.PARAM_VARIABLE_COMPONENT_KEY;
+    }
+
+    @Override
+    public String toHumanReadableString() {
+        return String.format("%s/%s", variable, component);
+    }
+
     public String toSqlExtractPattern(){
         return String.format("aggreg.datavalues #>> '{%s,%s}'%n",variable.replaceAll("'", "''"), component.replaceAll("'", "''"));
     }
diff --git a/src/main/java/fr/inra/oresing/model/internationalization/InternationalizationDataTypeMap.java b/src/main/java/fr/inra/oresing/model/internationalization/InternationalizationDataTypeMap.java
index 28410175eb88735411ad9b1dca5faa8332614a0e..37f46e28c38bc8d2fc6b738d07a95db2e885ddd6 100644
--- a/src/main/java/fr/inra/oresing/model/internationalization/InternationalizationDataTypeMap.java
+++ b/src/main/java/fr/inra/oresing/model/internationalization/InternationalizationDataTypeMap.java
@@ -12,4 +12,5 @@ public class  InternationalizationDataTypeMap {
     Map<String, Internationalization> internationalizedColumns;
     InternationalizationAuthorisationMap authorization;
     Map<String, InternationalizationDisplay> internationalizationDisplay;
+    Map<String, Internationalization> internationalizedValidations;
 }
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/model/internationalization/InternationalizationReferenceMap.java b/src/main/java/fr/inra/oresing/model/internationalization/InternationalizationReferenceMap.java
index 3046d6af677b677d91ab3847a6d9430a67d8d568..d8625d9a324ffd4d561795eff5d14ca40be3bcec 100644
--- a/src/main/java/fr/inra/oresing/model/internationalization/InternationalizationReferenceMap.java
+++ b/src/main/java/fr/inra/oresing/model/internationalization/InternationalizationReferenceMap.java
@@ -11,4 +11,5 @@ public class InternationalizationReferenceMap {
     Internationalization internationalizationName;
     Map<String, Internationalization> internationalizedColumns;
     InternationalizationDisplay internationalizationDisplay;
+    Map<String, Internationalization> internationalizedValidations;
 }
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/persistence/ReferenceValueRepository.java b/src/main/java/fr/inra/oresing/persistence/ReferenceValueRepository.java
index 948ddd348d3ea08c68c7d7d99770191cd74ba7f4..2fad2065be466c7cc64d14f16a1a225d2cbedca0 100644
--- a/src/main/java/fr/inra/oresing/persistence/ReferenceValueRepository.java
+++ b/src/main/java/fr/inra/oresing/persistence/ReferenceValueRepository.java
@@ -200,4 +200,4 @@ public class ReferenceValueRepository extends JsonTableInApplicationSchemaReposi
         Iterators.partition(uuids.stream().iterator(), Short.MAX_VALUE - 1)
                 .forEachRemaining(uuidsByBatch -> getNamedParameterJdbcTemplate().execute(sql, ImmutableMap.of("ids", uuidsByBatch), PreparedStatement::execute));
     }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/fr/inra/oresing/rest/ApplicationConfigurationService.java b/src/main/java/fr/inra/oresing/rest/ApplicationConfigurationService.java
index 50a56dcebba561eb99a9f798e3424de20529449e..bced293dab9cd3465a96ddada54c0e71d1142834 100644
--- a/src/main/java/fr/inra/oresing/rest/ApplicationConfigurationService.java
+++ b/src/main/java/fr/inra/oresing/rest/ApplicationConfigurationService.java
@@ -5,17 +5,22 @@ import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.exc.InvalidFormatException;
 import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;
 import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
-import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multiset;
 import com.google.common.collect.Sets;
 import com.google.common.collect.TreeMultiset;
 import fr.inra.oresing.OreSiTechnicalException;
+import fr.inra.oresing.checker.CheckerTarget;
+import fr.inra.oresing.checker.DateLineChecker;
 import fr.inra.oresing.checker.GroovyConfiguration;
 import fr.inra.oresing.checker.GroovyLineChecker;
+import fr.inra.oresing.checker.RegularExpressionChecker;
 import fr.inra.oresing.groovy.GroovyExpression;
 import fr.inra.oresing.model.Configuration;
+import fr.inra.oresing.model.Duration;
 import fr.inra.oresing.model.LocalDateTimeRange;
+import fr.inra.oresing.model.ReferenceColumn;
 import fr.inra.oresing.model.VariableComponentKey;
 import fr.inra.oresing.model.internationalization.InternationalizationDataTypeMap;
 import fr.inra.oresing.model.internationalization.InternationalizationDisplay;
@@ -26,20 +31,32 @@ import lombok.Setter;
 import lombok.ToString;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
-import org.assertj.core.util.Strings;
 import org.springframework.stereotype.Component;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.util.*;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 @Component
 @Slf4j
 public class ApplicationConfigurationService {
-    public static final List INTERNATIONALIZED_FIELDS = List.of("internationalization", "internationalizationName", "internationalizedColumns", "internationalizationDisplay");
 
+    private static final ImmutableSet<String> CHECKER_ON_TARGET_NAMES =
+            ImmutableSet.of("Date", "Float", "Integer", "RegularExpression", "Reference");
+
+    private static final ImmutableSet<String> ALL_CHECKER_NAMES = ImmutableSet.<String>builder()
+            .addAll(CHECKER_ON_TARGET_NAMES)
+            .add(GroovyLineChecker.NAME)
+            .build();
 
     ConfigurationParsingResult unzipConfiguration(MultipartFile file){
         return null;
@@ -48,10 +65,9 @@ public class ApplicationConfigurationService {
     ConfigurationParsingResult parseConfigurationBytes(byte[] bytes) {
         if (bytes.length == 0) {
             return ConfigurationParsingResult.builder()
-                    .recordEmptyFile()
+                    .emptyFile()
                     .build();
         }
-        Map<String, Map> internationalizedSections = new HashMap<>();
         try {
             YAMLMapper mapper = new YAMLMapper();
             mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
@@ -60,7 +76,7 @@ public class ApplicationConfigurationService {
             int expectedVersion = 0;
             if (actualVersion != expectedVersion) {
                 return ConfigurationParsingResult.builder()
-                        .recordUnsupportedVersion(actualVersion, expectedVersion)
+                        .unsupportedVersion(actualVersion, expectedVersion)
                         .build();
             }
         } catch (UnrecognizedPropertyException e) {
@@ -104,25 +120,26 @@ public class ApplicationConfigurationService {
             verifyReferenceKeyColumns( builder, referenceEntry);
             verifyInternationalizedColumnsExists(configuration, builder, referenceEntry);
             verifyInternationalizedColumnsExistsForPattern(configuration, builder, referenceEntry);
-            verifyValidationCheckersAreValids( builder, referenceEntry, references);
+            verifyReferenceColumnsDeclarations(builder, referenceEntry, references);
+            verifyReferenceValidationRules(builder, referenceEntry, references);
         }
 
         for (Map.Entry<String, Configuration.DataTypeDescription> entry : configuration.getDataTypes().entrySet()) {
             String dataType = entry.getKey();
             Configuration.DataTypeDescription dataTypeDescription = entry.getValue();
-            verifyDatatypeCheckersExists(builder, dataTypeDescription, dataType);
-            verifyDatatypeCheckerReferenceRefersToExistingReference(builder, references, dataType, dataTypeDescription);
-            verifyDatatypeCheckerGroovyExpressionExistsAndCanCompile(builder, dataTypeDescription);
+            verifyDataTypeVariableComponentDeclarations(builder, references, dataType, dataTypeDescription);
+            verifyDataTypeValidationRules(builder, dataType, dataTypeDescription, references);
             verifyInternationalizedColumnsExistsForPatternInDatatype(configuration, builder, dataType);
             verifyUniquenessComponentKeysInDatatype(dataType, dataTypeDescription, builder);
 
             Configuration.AuthorizationDescription authorization = dataTypeDescription.getAuthorization();
             Set<String> variables = dataTypeDescription.getData().keySet();
-            if (authorization == null) {
-                /**
-                 * to decomment if authorization section is required
-                 */
-                //builder.missingAuthorizationsForDatatype(dataType);
+
+            // FIXME
+            boolean authorizationSectionIsRequired = false;
+
+            if (authorizationSectionIsRequired && authorization == null) {
+                builder.missingAuthorizationForDatatype(dataType);
             } else {
                 VariableComponentKey timeScopeVariableComponentKey = authorization.getTimeScope();
                 verifyDatatypeTimeScopeExistsAndIsValid(builder, dataType, dataTypeDescription, variables, timeScopeVariableComponentKey);
@@ -151,29 +168,29 @@ public class ApplicationConfigurationService {
                     final Configuration.Chart chartDescription = entry.getValue().getChartDescription();
                     if (chartDescription != null) {
                         final String valueComponent = chartDescription.getValue();
-                        final LinkedHashMap<String, Configuration.VariableComponentDescription> components = entry.getValue().getComponents();
+                        final Map<String, Configuration.VariableComponentDescription> components = entry.getValue().doGetAllComponentDescriptions();
                         if (Strings.isNullOrEmpty(valueComponent)) {
-                            builder.recordUndeclaredValueForChart(datatype, variable, components.keySet());
+                            builder.unDeclaredValueForChart(datatype, variable, components.keySet());
                         } else {
                             if (!components.containsKey(valueComponent)) {
-                                builder.recordMissingValueComponentForChart(datatype, variable, valueComponent, components.keySet());
+                                builder.missingValueComponentForChart(datatype, variable, valueComponent, components.keySet());
                             }
                             final VariableComponentKey aggregation = chartDescription.getAggregation();
                             if (aggregation != null) {
                                 if (!dataTypeDescription.getData().containsKey(aggregation.getVariable())) {
-                                    builder.recordMissingAggregationVariableForChart(datatype, variable, aggregation, dataTypeDescription.getData().keySet());
-                                } else if (!dataTypeDescription.getData().get(aggregation.getVariable()).getComponents().containsKey(aggregation.getComponent())) {
-                                    builder.recordMissingAggregationComponentForChart(datatype, variable, aggregation, components.keySet());
+                                    builder.missingAggregationVariableForChart(datatype, variable, aggregation, dataTypeDescription.getData().keySet());
+                                } else if (!dataTypeDescription.getData().get(aggregation.getVariable()).hasComponent(aggregation.getComponent())) {
+                                    builder.missingAggregationComponentForChart(datatype, variable, aggregation, components.keySet());
                                 }
 
                             }
                             final String standardDeviation = chartDescription.getStandardDeviation();
                             if (standardDeviation != null && !components.containsKey(standardDeviation)) {
-                                builder.recordMissingStandardDeviationComponentForChart(datatype, variable, standardDeviation, components.keySet());
+                                builder.missingStandardDeviationComponentForChart(datatype, variable, standardDeviation, components.keySet());
                             }
                             final String unit = chartDescription.getUnit();
                             if (standardDeviation != null && !components.containsKey(unit)) {
-                                builder.recordMissingUnitComponentForChart(datatype, variable, unit, components.keySet());
+                                builder.missingUnitComponentForChart(datatype, variable, unit, components.keySet());
                             }
                         }
                     }
@@ -188,7 +205,7 @@ public class ApplicationConfigurationService {
                 .map(Configuration.CompositeReferenceComponentDescription::getReference)
                 .filter(ref -> {
                     if (ref == null) {
-                        builder.recordMissingReferenceInCompositereference(compositeReferenceName);
+                        builder.missingReferenceInCompositereference(compositeReferenceName);
                     }
                     return ref != null;
                 })
@@ -196,7 +213,7 @@ public class ApplicationConfigurationService {
         Set<String> existingReferences = configuration.getReferences().keySet();
         ImmutableSet<String> unknownReferences = Sets.difference(expectingReferences, existingReferences).immutableCopy();
         if (!unknownReferences.isEmpty()) {
-            builder.recordUnknownReferenceInCompositeReference(compositeReferenceName, unknownReferences, existingReferences);
+            builder.unknownReferenceInCompositeReference(compositeReferenceName, unknownReferences, existingReferences);
         }
     }
 
@@ -210,13 +227,13 @@ public class ApplicationConfigurationService {
             }
             String parentKeyColumn = component.getParentKeyColumn();
             if (previousReference == null && parentKeyColumn != null) {
-                builder.recordRequiredReferenceInCompositeReferenceForParentKeyColumn(compositeReferenceName, parentKeyColumn);
+                builder.requiredReferenceInCompositeReferenceForParentKeyColumn(compositeReferenceName, parentKeyColumn);
             } else if (previousReference != null) {
                 String reference = component.getReference();
                 if (parentKeyColumn == null) {
-                    builder.recordRequiredParentKeyColumnInCompositeReferenceForReference(compositeReferenceName, reference, previousReference);
-                } else if (!configuration.getReferences().get(reference).getColumns().containsKey(parentKeyColumn)) {
-                    builder.recordMissingParentColumnForReferenceInCompositeReferenceFor(compositeReferenceName, reference, parentKeyColumn);
+                    builder.requiredParentKeyColumnInCompositeReferenceForReference(compositeReferenceName, reference, previousReference);
+                } else if (!configuration.getReferences().get(reference).hasStaticColumn(parentKeyColumn)) {
+                    builder.missingParentColumnForReferenceInCompositeReference(compositeReferenceName, reference, parentKeyColumn);
                 }
             }
             previousReference = component.getReference();
@@ -232,8 +249,8 @@ public class ApplicationConfigurationService {
                 continue;
             }
             String parentRecursiveKey = component.getParentRecursiveKey();
-            if (parentRecursiveKey != null && !configuration.getReferences().get(reference).getColumns().containsKey(parentRecursiveKey)) {
-                builder.recordMissingParentRecursiveKeyColumnForReferenceInCompositeReference(compositeReferenceName, reference, parentRecursiveKey);
+            if (parentRecursiveKey != null && !configuration.getReferences().get(reference).hasStaticColumn(parentRecursiveKey)) {
+                builder.missingParentRecursiveKeyColumnForReferenceInCompositeReference(compositeReferenceName, reference, parentRecursiveKey);
             }
         }
     }
@@ -251,10 +268,10 @@ public class ApplicationConfigurationService {
                 if (components.contains(component)) {
                     // OK
                 } else {
-                    builder.recordCsvBoundToUnknownVariableComponent(columnBindingDescription.getHeader(), variable, component, components);
+                    builder.csvBoundToUnknownVariableComponent(columnBindingDescription.getHeader(), variable, component, components);
                 }
             } else {
-                builder.recordCsvBoundToUnknownVariable(columnBindingDescription.getHeader(), variable, variables);
+                builder.csvBoundToUnknownVariable(columnBindingDescription.getHeader(), variable, variables);
             }
         }
     }
@@ -267,25 +284,25 @@ public class ApplicationConfigurationService {
                     final int rowNumber = headerConstantDescription.getRowNumber();
                     final int headerLine = format.getHeaderLine();
                     if (rowNumber == headerLine) {
-                        builder.recordCsvSameHeaderLineAndFirstRowLineForConstantDescription(dataType);
+                        builder.sameHeaderLineAndFirstRowLineForConstantDescription(dataType);
                     }
                     final int firstRowLine = format.getFirstRowLine();
                     if (rowNumber >= firstRowLine) {
-                        builder.recordCsvTooBigRowLineForConstantDescription(dataType);
+                        builder.tooBigRowLineForConstantDescription(dataType);
                     }
                     if (rowNumber < 1) {
-                        builder.recordCsvTooLittleRowLineForConstantDescription(dataType);
+                        builder.tooLittleRowLineForConstantDescription(dataType);
                     }
                     if (rowNumber < headerLine && rowNumber < 1) {
-                        builder.recordCsvMissingRowLineForConstantDescription(dataType);
+                        builder.missingRowLineForConstantDescription(dataType);
                     } else if (rowNumber > headerLine && columnNumber < 1 && headerName == null) {
-                        builder.recordCsvMissingColumnNumberOrHeaderNameForConstantDescription(dataType);
+                        builder.missingColumnNumberOrHeaderNameForConstantDescription(dataType);
                     } else {
                         final VariableComponentKey boundTo = headerConstantDescription.getBoundTo();
                         if (boundTo == null) {
-                            builder.recordCsvMissingBoundToForConstantDescription(dataType);
+                            builder.missingBoundToForConstantDescription(dataType);
                         } else if (headerConstantDescription.getExportHeader() == null) {
-                            builder.recordCsvMissingExportHeaderNameForConstantDescription(dataType);
+                            builder.missingExportHeaderNameForConstantDescription(dataType);
                         }
                     }
                 });
@@ -295,9 +312,9 @@ public class ApplicationConfigurationService {
         variables.forEach(variable -> {
             int count = variableOccurrencesInDataGroups.count(variable);
             if (count == 0) {
-                builder.recordUndeclaredDataGroupForVariable(variable);
+                builder.undeclaredDataGroupForVariable(variable);
             } else if (count > 1) {
-                builder.recordVariableInMultipleDataGroup(variable);
+                builder.variableInMultipleDataGroup(variable);
             }
         });
     }
@@ -310,14 +327,14 @@ public class ApplicationConfigurationService {
             variableOccurrencesInDataGroups.addAll(dataGroupVariables);
             ImmutableSet<String> unknownVariables = Sets.difference(dataGroupVariables, variables).immutableCopy();
             if (!unknownVariables.isEmpty()) {
-                builder.recordUnknownVariablesInDataGroup(dataGroup, unknownVariables, variables);
+                builder.unknownVariablesInDataGroup(dataGroup, unknownVariables, variables);
             }
         }
     }
 
     private void verifyDatatypeAuthorizationScopeExistsAndIsValid(ConfigurationParsingResult.Builder builder, String dataType, Configuration configuration, Set<String> variables, LinkedHashMap<String, Configuration.AuthorizationScopeDescription> authorizationScopesVariableComponentKey) {
         if (authorizationScopesVariableComponentKey == null || authorizationScopesVariableComponentKey.isEmpty()) {
-            builder.recordMissingAuthorizationScopeVariableComponentKey(dataType);
+            builder.missingAuthorizationScopeVariableComponentKey(dataType);
         } else {
             Configuration.DataTypeDescription dataTypeDescription = configuration.getDataTypes().get(dataType);
             authorizationScopesVariableComponentKey.entrySet().stream().forEach(authorizationScopeVariableComponentKeyEntry -> {
@@ -325,24 +342,24 @@ public class ApplicationConfigurationService {
                 Configuration.AuthorizationScopeDescription authorizationScopeDescription = authorizationScopeVariableComponentKeyEntry.getValue();
                 VariableComponentKey authorizationScopeVariableComponentKey = authorizationScopeDescription.getVariableComponentKey();
                 if (authorizationScopeVariableComponentKey.getVariable() == null) {
-                    builder.recordAuthorizationScopeVariableComponentKeyMissingVariable(dataType, authorizationScopeName, variables);
+                    builder.authorizationScopeVariableComponentKeyMissingVariable(dataType, authorizationScopeName, variables);
                 } else {
                     String variable = authorizationScopeVariableComponentKey.getVariable();
-                    Configuration.ColumnDescription variableInDescription = dataTypeDescription.getData().get(variable);
+                    Configuration.VariableDescription variableInDescription = dataTypeDescription.getData().get(variable);
                     if (!dataTypeDescription.getData().containsKey(variable)) {
-                        builder.recordAuthorizationScopeVariableComponentKeyUnknownVariable(authorizationScopeVariableComponentKey, variables);
+                        builder.authorizationScopeVariableComponentKeyUnknownVariable(authorizationScopeVariableComponentKey, variables);
                     } else {
                         String component = authorizationScopeVariableComponentKey.getComponent();
-                        LinkedHashMap<String, Configuration.VariableComponentDescription> componentsInDescription = variableInDescription.getComponents();
+                        Map<String, Configuration.VariableComponentDescription> componentsInDescription = variableInDescription.doGetAllComponentDescriptions();
                         if (component == null) {
-                            builder.recordAuthorizationVariableComponentKeyMissingComponent(dataType, authorizationScopeName, variable, componentsInDescription.keySet());
+                            builder.authorizationVariableComponentKeyMissingComponent(dataType, authorizationScopeName, variable, componentsInDescription.keySet());
                         } else {
                             if (!componentsInDescription.containsKey(component)) {
-                                builder.recordAuthorizationVariableComponentKeyUnknownComponent(authorizationScopeVariableComponentKey, componentsInDescription.keySet());
+                                builder.authorizationVariableComponentKeyUnknownComponent(authorizationScopeVariableComponentKey, componentsInDescription.keySet());
                             } else {
-                                Configuration.CheckerDescription authorizationScopeVariableComponentChecker = dataTypeDescription.getData().get(variable).getComponents().get(authorizationScopeVariableComponentKey.getComponent()).getChecker();
+                                Configuration.CheckerDescription authorizationScopeVariableComponentChecker = dataTypeDescription.getData().get(variable).doGetAllComponentDescriptions().get(authorizationScopeVariableComponentKey.getComponent()).getChecker();
                                 if (authorizationScopeVariableComponentChecker == null || !"Reference".equals(authorizationScopeVariableComponentChecker.getName())) {
-                                    builder.recordAuthorizationScopeVariableComponentWrongChecker(authorizationScopeVariableComponentKey, "Date");
+                                    builder.authorizationScopeVariableComponentWrongChecker(authorizationScopeVariableComponentKey, "Date");
                                 }
                                 String refType;
                                 Configuration.CheckerConfigurationDescription checkerConfigurationDescription = null;
@@ -350,11 +367,11 @@ public class ApplicationConfigurationService {
                                     checkerConfigurationDescription = authorizationScopeVariableComponentChecker.getParams();
                                 }
                                 if (checkerConfigurationDescription == null) {
-                                    builder.recordAuthorizationScopeVariableComponentReftypeNull(authorizationScopeVariableComponentKey, configuration.getReferences().keySet());
+                                    builder.authorizationScopeVariableComponentReftypeNull(authorizationScopeVariableComponentKey, configuration.getReferences().keySet());
                                 } else {
                                     refType = checkerConfigurationDescription.getRefType();
                                     if (refType == null || !configuration.getReferences().containsKey(refType)) {
-                                        builder.recordAuthorizationScopeVariableComponentReftypeUnknown(authorizationScopeVariableComponentKey, refType, configuration.getReferences().keySet());
+                                        builder.authorizationScopeVariableComponentReftypeUnknown(authorizationScopeVariableComponentKey, refType, configuration.getReferences().keySet());
                                     } else {
                                         Set<String> compositesReferences = configuration.getCompositeReferences().values().stream()
                                                 .map(Configuration.CompositeReferenceDescription::getComponents)
@@ -362,7 +379,7 @@ public class ApplicationConfigurationService {
                                                 .map(Configuration.CompositeReferenceComponentDescription::getReference)
                                                 .collect(Collectors.toSet());
                                         if (!compositesReferences.contains(refType)) {
-                                            builder.recordAuthorizationVariableComponentMustReferToCompositereference(dataType, authorizationScopeName, refType, compositesReferences);
+                                            builder.authorizationScopeVariableComponentReftypeUnknown(dataType, authorizationScopeName, refType, compositesReferences);
                                         }
                                     }
                                 }
@@ -377,30 +394,30 @@ public class ApplicationConfigurationService {
 
     private void verifyDatatypeTimeScopeExistsAndIsValid(ConfigurationParsingResult.Builder builder, String dataType, Configuration.DataTypeDescription dataTypeDescription, Set<String> variables, VariableComponentKey timeScopeVariableComponentKey) {
         if (timeScopeVariableComponentKey == null) {
-            builder.recordMissingTimeScopeVariableComponentKey(dataType);
+            builder.missingTimeScopeVariableComponentKey(dataType);
         } else {
             if (timeScopeVariableComponentKey.getVariable() == null) {
-                builder.recordTimeScopeVariableComponentKeyMissingVariable(dataType, variables);
+                builder.timeScopeVariableComponentKeyMissingVariable(dataType, variables);
             } else {
                 if (!dataTypeDescription.getData().containsKey(timeScopeVariableComponentKey.getVariable())) {
-                    builder.recordTimeScopeVariableComponentKeyUnknownVariable(timeScopeVariableComponentKey, variables);
+                    builder.timeScopeVariableComponentKeyUnknownVariable(timeScopeVariableComponentKey, variables);
                 } else {
                     if (timeScopeVariableComponentKey.getComponent() == null) {
-                        builder.recordTimeVariableComponentKeyMissingComponent(dataType, timeScopeVariableComponentKey.getVariable(), dataTypeDescription.getData().get(timeScopeVariableComponentKey.getVariable()).getComponents().keySet());
+                        builder.timeVariableComponentKeyMissingComponent(dataType, timeScopeVariableComponentKey.getVariable(), dataTypeDescription.getData().get(timeScopeVariableComponentKey.getVariable()).doGetAllComponents());
                     } else {
-                        if (!dataTypeDescription.getData().get(timeScopeVariableComponentKey.getVariable()).getComponents().containsKey(timeScopeVariableComponentKey.getComponent())) {
-                            builder.recordTimeVariableComponentKeyUnknownComponent(timeScopeVariableComponentKey, dataTypeDescription.getData().get(timeScopeVariableComponentKey.getVariable()).getComponents().keySet());
+                        if (!dataTypeDescription.getData().get(timeScopeVariableComponentKey.getVariable()).hasComponent(timeScopeVariableComponentKey.getComponent())) {
+                            builder.timeVariableComponentKeyUnknownComponent(timeScopeVariableComponentKey, dataTypeDescription.getData().get(timeScopeVariableComponentKey.getVariable()).doGetAllComponents());
                         } else {
-                            Configuration.CheckerDescription timeScopeVariableComponentChecker = dataTypeDescription.getData().get(timeScopeVariableComponentKey.getVariable()).getComponents().get(timeScopeVariableComponentKey.getComponent()).getChecker();
+                            Configuration.CheckerDescription timeScopeVariableComponentChecker = dataTypeDescription.getData().get(timeScopeVariableComponentKey.getVariable()).doGetAllComponentDescriptions().get(timeScopeVariableComponentKey.getComponent()).getChecker();
                             if (timeScopeVariableComponentChecker == null || !"Date".equals(timeScopeVariableComponentChecker.getName())) {
-                                builder.recordTimeScopeVariableComponentWrongChecker(timeScopeVariableComponentKey, "Date");
+                                builder.timeScopeVariableComponentWrongChecker(timeScopeVariableComponentKey, "Date");
                             }
                             Optional.ofNullable(timeScopeVariableComponentChecker)
                                     .map(Configuration.CheckerDescription::getParams)
                                     .map(Configuration.CheckerConfigurationDescription::getPattern)
                                     .ifPresent(pattern -> {
                                         if (!LocalDateTimeRange.getKnownPatterns().contains(pattern)) {
-                                            builder.recordTimeScopeVariableComponentPatternUnknown(timeScopeVariableComponentKey, pattern, LocalDateTimeRange.getKnownPatterns());
+                                            builder.timeScopeVariableComponentPatternUnknown(timeScopeVariableComponentKey, pattern, LocalDateTimeRange.getKnownPatterns());
                                         }
                                     });
                         }
@@ -410,73 +427,243 @@ public class ApplicationConfigurationService {
         }
     }
 
-    private void verifyDatatypeCheckersExists(ConfigurationParsingResult.Builder builder, Configuration.DataTypeDescription dataTypeDescription, String dataType) {
-        for (Map.Entry<String, Configuration.ColumnDescription> columnDescriptionEntry : dataTypeDescription.getData().entrySet()) {
-            Configuration.ColumnDescription columnDescription = columnDescriptionEntry.getValue();
-            String variable = columnDescriptionEntry.getKey();
-            for (Map.Entry<String, Configuration.VariableComponentDescription> variableComponentDescriptionEntry : columnDescription.getComponents().entrySet()) {
-                Configuration.VariableComponentDescription variableComponentDescription = variableComponentDescriptionEntry.getValue();
-                if (variableComponentDescription == null) {
-                    continue;
-                }
-                String component = variableComponentDescriptionEntry.getKey();
-                Configuration.CheckerDescription checker = variableComponentDescription.getChecker();
-                if (checker == null) {
-                    continue;
-                }
-                ImmutableSet<String> variableComponentCheckers = ImmutableSet.of("Date", "Float", "Integer", "RegularExpression", "Reference");
+    private void verifyDataTypeValidationRules(ConfigurationParsingResult.Builder builder, final String dataType, Configuration.DataTypeDescription dataTypeDescription, final Set<String> references) {
+        LineValidationRuleDescriptionValidationContext lineValidationRuleDescriptionValidationContext = new LineValidationRuleDescriptionValidationContext() {
 
-                if (!variableComponentCheckers.contains(checker.getName())) {
-                    builder.recordUnknownCheckerNameForVariableComponentChecker(dataType, variable, component, checker.getName(), variableComponentCheckers);
-                }
+            @Override
+            public Set<String> getReferences() {
+                return references;
             }
-        }
-    }
 
-    private void verifyDatatypeCheckerGroovyExpressionExistsAndCanCompile(ConfigurationParsingResult.Builder builder, Configuration.DataTypeDescription dataTypeDescription) {
-        for (Map.Entry<String, Configuration.LineValidationRuleDescription> validationEntry : dataTypeDescription.getValidations().entrySet()) {
-            Configuration.LineValidationRuleDescription lineValidationRuleDescription = validationEntry.getValue();
-            String lineValidationRuleKey = validationEntry.getKey();
-            Configuration.CheckerDescription checker = lineValidationRuleDescription.getChecker();
-            if (GroovyLineChecker.NAME.equals(checker.getName())) {
-                String expression = Optional.of(checker)
-                        .map(Configuration.CheckerDescription::getParams)
-                        .map(Configuration.CheckerConfigurationDescription::getGroovy)
-                        .map(GroovyConfiguration::getExpression)
-                        .orElse(null);
-                if (StringUtils.isBlank(expression)) {
-                    builder.recordMissingRequiredExpression(lineValidationRuleKey);
-                } else {
-                    Optional<GroovyExpression.CompilationError> compileResult = GroovyLineChecker.validateExpression(expression);
-                    compileResult.ifPresent(compilationError -> builder.recordIllegalGroovyExpression(lineValidationRuleKey, expression, compilationError));
-                }
-            } else {
-                builder.recordUnknownCheckerName(lineValidationRuleKey, checker.getName());
+            @Override
+            public Set<CheckerTarget> getAcceptableCheckerTargets() {
+                return ImmutableSet.copyOf(dataTypeDescription.doGetAllVariableComponents());
+            }
+
+            @Override
+            public void unknownCheckerNameForVariableComponentChecker(String validationRuleDescriptionEntryKey, String checkerName, ImmutableSet<String> checkerOnTargetNames) {
+                builder.unknownCheckerNameForVariableComponentCheckerInDataType(validationRuleDescriptionEntryKey, dataType, checkerName, checkerOnTargetNames);
+            }
+
+            @Override
+            public void unknownReferenceForChecker(String validationRuleDescriptionEntryKey, String refType, Set<String> references) {
+                builder.unknownReferenceForCheckerInDataType(validationRuleDescriptionEntryKey, dataType, refType, references);
             }
+
+            @Override
+            public void missingReferenceForChecker(String validationRuleDescriptionEntryKey, Set<String> references) {
+                builder.missingReferenceForCheckerInDataType(validationRuleDescriptionEntryKey, dataType, references);
+            }
+
+            @Override
+            public void missingRequiredExpression(String validationRuleDescriptionEntryKey) {
+                builder.missingRequiredExpressionForValidationRuleInDataType(validationRuleDescriptionEntryKey, dataType);
+            }
+
+            @Override
+            public void illegalGroovyExpression(String validationRuleDescriptionEntryKey, String expression, GroovyExpression.CompilationError compilationError) {
+                builder.illegalGroovyExpressionForValidationRuleInDataType(validationRuleDescriptionEntryKey, dataType, expression, compilationError);
+            }
+
+            @Override
+            public void missingParamColumnReferenceForChecker(String validationRuleDescriptionEntryKey) {
+                builder.missingParamColumnReferenceForCheckerInDataType(validationRuleDescriptionEntryKey, dataType);
+            }
+
+            @Override
+            public void missingColumnReferenceForChecker(String validationRuleDescriptionEntryKey, String checkerName, Set<CheckerTarget> knownColumns, ImmutableSet<CheckerTarget> missingColumns) {
+                builder.missingColumnReferenceForCheckerInDataType(
+                        validationRuleDescriptionEntryKey,
+                        knownColumns.stream().map(CheckerTarget::toHumanReadableString).collect(ImmutableSet.toImmutableSet()),
+                        checkerName,
+                        missingColumns.stream().map(CheckerTarget::toHumanReadableString).collect(ImmutableSet.toImmutableSet()),
+                        dataType);
+            }
+
+            @Override
+            public void unknownCheckerNameForValidationRule(String validationRuleDescriptionEntryKey, String checkerName, ImmutableSet<String> allCheckerNames) {
+                builder.unknownCheckerNameForValidationRuleInDataType(validationRuleDescriptionEntryKey, dataType, checkerName, allCheckerNames);
+            }
+
+            @Override
+            public void invalidPatternForDateChecker(String validationRuleDescriptionEntryKey, String pattern) {
+                builder.invalidPatternForDateCheckerForValidationRuleInDataType(validationRuleDescriptionEntryKey, dataType, pattern);
+            }
+
+            @Override
+            public void invalidDurationForDateChecker(String validationRuleDescriptionEntryKey, String duration) {
+                builder.invalidDurationForDateCheckerForValidationRuleInDataType(validationRuleDescriptionEntryKey, dataType, duration);
+            }
+
+            @Override
+            public void invalidPatternForRegularExpressionChecker(String validationRuleDescriptionEntryKey, String pattern) {
+                builder.invalidPatternForRegularExpressionCheckerForValidationRuleInDataType(validationRuleDescriptionEntryKey, dataType, pattern);
+            }
+        };
+        for (Map.Entry<String, Configuration.LineValidationRuleWithVariableComponentsDescription> validationRuleDescriptionEntry : dataTypeDescription.getValidations().entrySet()) {
+            String validationRuleDescriptionEntryKey = validationRuleDescriptionEntry.getKey();
+            Configuration.LineValidationRuleWithVariableComponentsDescription lineValidationRuleDescription = validationRuleDescriptionEntry.getValue();
+            verifyLineValidationRuleDescription(lineValidationRuleDescriptionValidationContext, validationRuleDescriptionEntryKey, lineValidationRuleDescription);
         }
     }
 
-    private void verifyDatatypeCheckerReferenceRefersToExistingReference(ConfigurationParsingResult.Builder builder, Set<String> references, String dataType, Configuration.DataTypeDescription dataTypeDescription) {
-        for (Map.Entry<String, Configuration.ColumnDescription> dataEntry : dataTypeDescription.getData().entrySet()) {
+    private void verifyDataTypeVariableComponentDeclarations(ConfigurationParsingResult.Builder builder, Set<String> references, String dataType, Configuration.DataTypeDescription dataTypeDescription) {
+        for (Map.Entry<String, Configuration.VariableDescription> dataEntry : dataTypeDescription.getData().entrySet()) {
             String datum = dataEntry.getKey();
-            Configuration.ColumnDescription datumDescription = dataEntry.getValue();
-            for (Map.Entry<String, Configuration.VariableComponentDescription> componentEntry : datumDescription.getComponents().entrySet()) {
+            Configuration.VariableDescription datumDescription = dataEntry.getValue();
+            for (Map.Entry<String, Configuration.VariableComponentDescription> componentEntry : datumDescription.doGetAllComponentDescriptions().entrySet()) {
                 String component = componentEntry.getKey();
                 Configuration.VariableComponentDescription variableComponentDescription = componentEntry.getValue();
                 if (variableComponentDescription != null) {
                     Configuration.CheckerDescription checkerDescription = variableComponentDescription.getChecker();
-                    if ("Reference".equals(checkerDescription.getName())) {
-                        if (checkerDescription.getParams() != null && checkerDescription.getParams().getRefType() != null) {
-                            String refType = checkerDescription.getParams().getRefType();
-                            if (!references.contains(refType)) {
+                    if (checkerDescription != null) {
+                        verifyCheckerOnOneTarget(new CheckerOnOneTargetValidationContext() {
+                            @Override
+                            public Set<String> getReferences() {
+                                return references;
+                            }
+
+                            @Override
+                            public void unknownReferenceForChecker(String refType, Set<String> references) {
+                                // OK
                                 builder.unknownReferenceForChecker(dataType, datum, component, refType, references);
                             }
-                        } else {
-                            builder.missingReferenceForChecker(dataType, datum, component, references);
+
+                            @Override
+                            public void missingReferenceForChecker(Set<String> references) {
+                                // OK
+                                builder.missingReferenceForChecker(dataType, datum, component, references);
+                            }
+
+                            @Override
+                            public void unknownCheckerOnOneTargetName(String checkerName, ImmutableSet<String> knownCheckerNames) {
+                                // OK
+                                builder.unknownCheckerNameForVariableComponent(dataType, datum, component, checkerName, knownCheckerNames);
+                            }
+
+                            @Override
+                            public void invalidPatternForDateChecker(String pattern) {
+                                builder.invalidPatternForVariableComponentDateChecker(dataType, datum, component, pattern);
+                            }
+
+                            @Override
+                            public void invalidDurationForDateChecker(String duration) {
+                                builder.invalidDurationForVariableComponentDateChecker(dataType, datum, component, duration);
+                            }
+
+                            @Override
+                            public void invalidPatternForRegularExpressionChecker(String pattern) {
+                                builder.invalidPatternForVariableComponentRegularExpressionChecker(dataType, datum, component, pattern);
+                            }
+                        }, checkerDescription);
+                    }
+                }
+            }
+        }
+    }
+
+    private void verifyReferenceColumnsDeclarations(ConfigurationParsingResult.Builder builder, Map.Entry<String, Configuration.ReferenceDescription> referenceEntry, Set<String> references) {
+        String referenceToValidate = referenceEntry.getKey();
+        Configuration.ReferenceDescription referenceDescription = referenceEntry.getValue();
+        for (Map.Entry<String, Configuration.ReferenceStaticColumnDescription> columnEntry : referenceDescription.doGetStaticColumnDescriptions().entrySet()) {
+            String column = columnEntry.getKey();
+            Configuration.ReferenceStaticColumnDescription referenceStaticColumnDescription = columnEntry.getValue();
+            if (referenceStaticColumnDescription != null) {
+                Configuration.CheckerDescription checkerDescription = referenceStaticColumnDescription.getChecker();
+                if (checkerDescription != null) {
+                    verifyCheckerOnOneTarget(new CheckerOnOneTargetValidationContext() {
+                        @Override
+                        public Set<String> getReferences() {
+                            return references;
                         }
+
+                        @Override
+                        public void unknownReferenceForChecker(String refType, Set<String> knownReferences) {
+                            // OK
+                            builder.unknownReferenceForCheckerInReferenceColumn(referenceToValidate, column, refType, knownReferences);
+                        }
+
+                        @Override
+                        public void missingReferenceForChecker(Set<String> knownReferences) {
+                            // OK
+                            builder.missingReferenceForCheckerInReferenceColumn(referenceToValidate, column, knownReferences);
+                        }
+
+                        @Override
+                        public void unknownCheckerOnOneTargetName(String checkerName, ImmutableSet<String> knownCheckerNames) {
+                            // OK
+                            builder.unknownCheckerNameInReferenceColumn(referenceToValidate, column, checkerName, knownCheckerNames);
+                        }
+
+                        @Override
+                        public void invalidPatternForDateChecker(String pattern) {
+                            builder.invalidPatternForReferenceColumnDateChecker(referenceToValidate, column, pattern);
+                        }
+
+                        @Override
+                        public void invalidDurationForDateChecker(String duration) {
+                            builder.invalidDurationForReferenceColumnDateChecker(referenceToValidate, column, duration);
+                        }
+
+                        @Override
+                        public void invalidPatternForRegularExpressionChecker(String pattern) {
+                            builder.invalidPatternForReferenceColumnRegularExpressionChecker(referenceToValidate, column, pattern);
+                        }
+                    }, checkerDescription);
+                }
+            }
+        }
+    }
+
+    private interface CheckerOnOneTargetValidationContext {
+
+        Set<String> getReferences();
+
+        void unknownReferenceForChecker(String refType, Set<String> references);
+
+        void missingReferenceForChecker(Set<String> references);
+
+        void unknownCheckerOnOneTargetName(String checkerName, ImmutableSet<String> validCheckerNames);
+
+        void invalidPatternForDateChecker(String pattern);
+
+        void invalidDurationForDateChecker(String duration);
+
+        void invalidPatternForRegularExpressionChecker(String pattern);
+    }
+
+    private void verifyCheckerOnOneTarget(CheckerOnOneTargetValidationContext builder, Configuration.CheckerDescription checkerDescription) {
+        String checkerName = checkerDescription.getName();
+        if (CHECKER_ON_TARGET_NAMES.contains(checkerName)) {
+            if ("Reference".equals(checkerName)) {
+                if (checkerDescription.getParams() != null && checkerDescription.getParams().getRefType() != null) {
+                    String refType = checkerDescription.getParams().getRefType();
+                    if (!builder.getReferences().contains(refType)) {
+                        builder.unknownReferenceForChecker(refType, builder.getReferences());
+                    }
+                } else {
+                    builder.missingReferenceForChecker(builder.getReferences());
+                }
+            } else if ("Date".equals(checkerName)) {
+                String datePattern = checkerDescription.getParams().getPattern();
+                if (DateLineChecker.isValidPattern(datePattern)) {
+                    String duration = checkerDescription.getParams().getDuration();
+                    if (StringUtils.isBlank(duration)) {
+                        // OK, champs facultatif
+                    } else if (!Duration.isValid(duration)) {
+                        builder.invalidDurationForDateChecker(duration);
                     }
+                } else {
+                    builder.invalidPatternForDateChecker(datePattern);
+                }
+            } else if ("RegularExpression".equals(checkerName)) {
+                String regularExpressionPattern = checkerDescription.getParams().getPattern();
+                if (!RegularExpressionChecker.isValid(regularExpressionPattern)) {
+                    builder.invalidPatternForRegularExpressionChecker(regularExpressionPattern);
                 }
             }
+        } else {
+            builder.unknownCheckerOnOneTargetName(checkerName, CHECKER_ON_TARGET_NAMES);
         }
     }
 
@@ -485,13 +672,13 @@ public class ApplicationConfigurationService {
         Configuration.ReferenceDescription referenceDescription = referenceEntry.getValue();
         List<String> keyColumns = referenceDescription.getKeyColumns();
         if (keyColumns.isEmpty()) {
-            builder.recordMissingKeyColumnsForReference(reference);
+            builder.missingKeyColumnsForReference(reference);
         } else {
-            Set<String> columns = referenceDescription.getColumns().keySet();
+            Set<String> columns = referenceDescription.doGetStaticColumns();
             ImmutableSet<String> keyColumnsSet = ImmutableSet.copyOf(keyColumns);
             ImmutableSet<String> unknownUsedAsKeyElementColumns = Sets.difference(keyColumnsSet, columns).immutableCopy();
             if (!unknownUsedAsKeyElementColumns.isEmpty()) {
-                builder.recordInvalidKeyColumns(reference, unknownUsedAsKeyElementColumns, columns);
+                builder.invalidKeyColumns(reference, unknownUsedAsKeyElementColumns, columns);
             }
         }
     }
@@ -522,7 +709,7 @@ public class ApplicationConfigurationService {
         }
         Set<String> internationalizedColumns = getInternationalizedColumns(configuration, reference);
         Set<String> columns = Optional.ofNullable(referenceDescription)
-                .map(Configuration.ReferenceDescription::getColumns)
+                .map(Configuration.ReferenceDescription::doGetStaticColumnDescriptions)
                 .map(c -> new LinkedHashSet(c.keySet()))
                 .orElseGet(LinkedHashSet::new);
         columns.addAll(internationalizedColumns);
@@ -530,7 +717,7 @@ public class ApplicationConfigurationService {
 
         ImmutableSet<String> unknownUsedAsInternationalizedColumnsSetColumns = Sets.difference(internationalizedColumnsForDisplay, columns).immutableCopy();
         if (!unknownUsedAsInternationalizedColumnsSetColumns.isEmpty()) {
-            builder.recordInvalidInternationalizedColumns(reference, unknownUsedAsInternationalizedColumnsSetColumns, columns);
+            builder.invalidInternationalizedColumns(reference, unknownUsedAsInternationalizedColumnsSetColumns, columns);
         }
     }
 
@@ -568,7 +755,7 @@ public class ApplicationConfigurationService {
             Map<String, Configuration.ReferenceDescription> references = Optional.ofNullable(configuration.getReferences())
                     .orElse(new LinkedHashMap<>());
             if (!references.containsKey(reference)) {
-                builder.recordUnknownReferenceInDatatypeReferenceDisplay(dataType, reference, references.keySet());
+                builder.unknownReferenceInDatatypeReferenceDisplay(dataType, reference, references.keySet());
                 return;
             }
 
@@ -576,7 +763,7 @@ public class ApplicationConfigurationService {
             Set<String> internationalizedColumns = getInternationalizedColumns(configuration, reference);
             Configuration.ReferenceDescription referenceDescription = configuration.getReferences().getOrDefault(reference, null);
             LinkedHashSet columns = Optional.ofNullable(referenceDescription)
-                    .map(Configuration.ReferenceDescription::getColumns)
+                    .map(Configuration.ReferenceDescription::doGetStaticColumnDescriptions)
                     .map(c -> new LinkedHashSet(c.keySet()))
                     .orElseGet(LinkedHashSet::new);
             columns.addAll(internationalizedColumns);
@@ -584,7 +771,7 @@ public class ApplicationConfigurationService {
 
             ImmutableSet<String> unknownUsedAsInternationalizedColumnsSetColumns = Sets.difference(internationalizedColumnsForDisplay, columns).immutableCopy();
             if (!unknownUsedAsInternationalizedColumnsSetColumns.isEmpty()) {
-                builder.recordInvalidInternationalizedColumnsForDataType(dataType, reference, unknownUsedAsInternationalizedColumnsSetColumns, columns);
+                builder.invalidInternationalizedColumnsForDataType(dataType, reference, unknownUsedAsInternationalizedColumnsSetColumns, columns);
             }
         }
     }
@@ -592,7 +779,7 @@ public class ApplicationConfigurationService {
     private void verifyUniquenessComponentKeysInDatatype(String dataType, Configuration.DataTypeDescription dataTypeDescription, ConfigurationParsingResult.Builder builder) {
         final List<VariableComponentKey> uniqueness = dataTypeDescription.getUniqueness();
         final Set<String> availableVariableComponents = dataTypeDescription.getData().entrySet().stream()
-                .flatMap(entry -> entry.getValue().getComponents().keySet().stream()
+                .flatMap(entry -> entry.getValue().doGetAllComponents().stream()
                         .map(componentName -> new VariableComponentKey(entry.getKey(), componentName).getId()))
                 .collect(Collectors.<String>toSet());
         Set<String> variableComponentsKeyInUniqueness = new HashSet<>();
@@ -602,7 +789,7 @@ public class ApplicationConfigurationService {
         }
         ImmutableSet<String> unknownUsedAsVariableComponentUniqueness = Sets.difference(variableComponentsKeyInUniqueness, availableVariableComponents).immutableCopy();
         if (!unknownUsedAsVariableComponentUniqueness.isEmpty()) {
-            builder.recordUnknownUsedAsVariableComponentUniqueness(dataType, unknownUsedAsVariableComponentUniqueness, availableVariableComponents);
+            builder.unknownUsedAsVariableComponentUniqueness(dataType, unknownUsedAsVariableComponentUniqueness, availableVariableComponents);
         }
     }
 
@@ -611,84 +798,200 @@ public class ApplicationConfigurationService {
         Configuration.ReferenceDescription referenceDescription = referenceEntry.getValue();
         Set<String> internationalizedColumns = getInternationalizedColumns(configuration, reference);
         Set<String> columns = Optional.ofNullable(referenceDescription)
-                .map(Configuration.ReferenceDescription::getColumns)
-                .map(LinkedHashMap::keySet)
+                .map(Configuration.ReferenceDescription::doGetStaticColumnDescriptions)
+                .map(Map::keySet)
                 .orElse(new HashSet<>());
 
         ImmutableSet<String> internationalizedColumnsSet = ImmutableSet.copyOf(internationalizedColumns);
         ImmutableSet<String> unknownUsedAsInternationalizedColumnsSetColumns = Sets.difference(internationalizedColumnsSet, columns).immutableCopy();
         if (!unknownUsedAsInternationalizedColumnsSetColumns.isEmpty()) {
-            builder.recordInvalidInternationalizedColumns(reference, unknownUsedAsInternationalizedColumnsSetColumns, columns);
+            builder.invalidInternationalizedColumns(reference, unknownUsedAsInternationalizedColumnsSetColumns, columns);
         }
     }
 
-    private void verifyValidationCheckersAreValids(ConfigurationParsingResult.Builder builder, Map.Entry<String, Configuration.ReferenceDescription> referenceEntry, Set<String> references) {
+    private void verifyReferenceValidationRules(ConfigurationParsingResult.Builder builder, Map.Entry<String, Configuration.ReferenceDescription> referenceEntry, Set<String> references) {
         String reference = referenceEntry.getKey();
         Configuration.ReferenceDescription referenceDescription = referenceEntry.getValue();
-        for (Map.Entry<String, Configuration.LineValidationRuleDescription> validationRuleDescriptionEntry : referenceDescription.getValidations().entrySet()) {
+        LineValidationRuleDescriptionValidationContext lineValidationRuleDescriptionValidationContext = new LineValidationRuleDescriptionValidationContext() {
+
+            @Override
+            public Set<String> getReferences() {
+                return references;
+            }
+
+            @Override
+            public Set<CheckerTarget> getAcceptableCheckerTargets() {
+                return referenceDescription.doGetStaticColumns().stream()
+                        .map(ReferenceColumn::new)
+                        .collect(ImmutableSet.toImmutableSet());
+            }
+
+            @Override
+            public void unknownCheckerNameForVariableComponentChecker(String validationRuleDescriptionEntryKey, String checkerName, ImmutableSet<String> checkerOnTargetNames) {
+                // OK
+                builder.unknownCheckerNameForVariableComponentCheckerInReference(validationRuleDescriptionEntryKey, reference, checkerName, checkerOnTargetNames);
+            }
+
+            @Override
+            public void unknownReferenceForChecker(String validationRuleDescriptionEntryKey, String refType, Set<String> references) {
+                // OK
+                builder.unknownReferenceForCheckerInReference(validationRuleDescriptionEntryKey, reference, refType, references);
+            }
+
+            @Override
+            public void missingReferenceForChecker(String validationRuleDescriptionEntryKey, Set<String> references) {
+                // OK
+                builder.missingReferenceForCheckerInReference(validationRuleDescriptionEntryKey, reference, references);
+            }
+
+            @Override
+            public void missingRequiredExpression(String validationRuleDescriptionEntryKey) {
+                // OK
+                builder.missingRequiredExpressionForValidationRuleInReference(validationRuleDescriptionEntryKey, reference);
+            }
+
+            @Override
+            public void illegalGroovyExpression(String validationRuleDescriptionEntryKey, String expression, GroovyExpression.CompilationError compilationError) {
+                // OK
+                builder.illegalGroovyExpressionForValidationRuleInReference(validationRuleDescriptionEntryKey, reference, expression, compilationError);
+            }
+
+            @Override
+            public void missingParamColumnReferenceForChecker(String validationRuleDescriptionEntryKey) {
+                // OK
+                builder.missingParamColumnReferenceForCheckerInReference(validationRuleDescriptionEntryKey, reference);
+            }
+
+            @Override
+            public void missingColumnReferenceForChecker(String validationRuleDescriptionEntryKey, String checkerName, Set<CheckerTarget> knownColumns, ImmutableSet<CheckerTarget> missingColumns) {
+                builder.missingColumnReferenceForCheckerInReference(
+                        validationRuleDescriptionEntryKey,
+                        knownColumns.stream().map(CheckerTarget::toHumanReadableString).collect(ImmutableSet.toImmutableSet()),
+                        checkerName,
+                        missingColumns.stream().map(CheckerTarget::toHumanReadableString).collect(ImmutableSet.toImmutableSet()),
+                        reference);
+            }
+
+            @Override
+            public void unknownCheckerNameForValidationRule(String validationRuleDescriptionEntryKey, String checkerName, ImmutableSet<String> allCheckerNames) {
+                // OK
+                builder.unknownCheckerNameForValidationRuleInReference(validationRuleDescriptionEntryKey, reference, checkerName, allCheckerNames);
+            }
+
+            @Override
+            public void invalidPatternForDateChecker(String validationRuleDescriptionEntryKey, String pattern) {
+                builder.invalidPatternForDateCheckerForValidationRuleInReference(validationRuleDescriptionEntryKey, reference, pattern);
+            }
+
+            @Override
+            public void invalidDurationForDateChecker(String validationRuleDescriptionEntryKey, String duration) {
+                builder.invalidDurationForDateCheckerForValidationRuleInReference(validationRuleDescriptionEntryKey, reference, duration);
+            }
+
+            @Override
+            public void invalidPatternForRegularExpressionChecker(String validationRuleDescriptionEntryKey, String pattern) {
+                builder.invalidPatternForRegularExpressionCheckerForValidationRuleInReference(validationRuleDescriptionEntryKey, reference, pattern);
+            }
+        };
+        for (Map.Entry<String, Configuration.LineValidationRuleWithColumnsDescription> validationRuleDescriptionEntry : referenceDescription.getValidations().entrySet()) {
             String validationRuleDescriptionEntryKey = validationRuleDescriptionEntry.getKey();
-            Configuration.LineValidationRuleDescription lineValidationRuleDescription = validationRuleDescriptionEntry.getValue();
-            Configuration.CheckerDescription checker = lineValidationRuleDescription.getChecker();
-            if (checker == null) {
-                continue;
+            Configuration.LineValidationRuleWithColumnsDescription lineValidationRuleDescription = validationRuleDescriptionEntry.getValue();
+            verifyLineValidationRuleDescription(lineValidationRuleDescriptionValidationContext, validationRuleDescriptionEntryKey, lineValidationRuleDescription);
+        }
+    }
+
+    private interface LineValidationRuleDescriptionValidationContext {
+
+        Set<String> getReferences();
+
+        Set<CheckerTarget> getAcceptableCheckerTargets();
+
+        void missingRequiredExpression(String validationRuleDescriptionEntryKey);
+
+        void illegalGroovyExpression(String validationRuleDescriptionEntryKey, String expression, GroovyExpression.CompilationError compilationError);
+
+        void missingParamColumnReferenceForChecker(String validationRuleDescriptionEntryKey);
+
+        void missingColumnReferenceForChecker(String validationRuleDescriptionEntryKey, String checkerName, Set<CheckerTarget> knownColumns, ImmutableSet<CheckerTarget> missingColumns);
+
+        void unknownCheckerNameForVariableComponentChecker(String validationRuleDescriptionEntryKey, String name, ImmutableSet<String> checkerOnTargetNames);
+
+        void unknownReferenceForChecker(String validationRuleDescriptionEntryKey, String refType, Set<String> references);
+
+        void missingReferenceForChecker(String validationRuleDescriptionEntryKey, Set<String> references);
+
+        void unknownCheckerNameForValidationRule(String validationRuleDescriptionEntryKey, String checkerName, ImmutableSet<String> allCheckerNames);
+
+        void invalidPatternForDateChecker(String validationRuleDescriptionEntryKey, String pattern);
+
+        void invalidDurationForDateChecker(String validationRuleDescriptionEntryKey, String duration);
+
+        void invalidPatternForRegularExpressionChecker(String validationRuleDescriptionEntryKey, String pattern);
+    }
+
+    private void verifyLineValidationRuleDescription(LineValidationRuleDescriptionValidationContext builder, String validationRuleDescriptionEntryKey, Configuration.LineValidationRuleDescription lineValidationRuleDescription) {
+        Configuration.CheckerDescription checker = lineValidationRuleDescription.getChecker();
+        if (GroovyLineChecker.NAME.equals(checker.getName())) {
+            String expression = Optional.of(checker)
+                    .map(Configuration.CheckerDescription::getParams)
+                    .map(Configuration.CheckerConfigurationDescription::getGroovy)
+                    .map(GroovyConfiguration::getExpression)
+                    .orElse(null);
+            if (StringUtils.isBlank(expression)) {
+                builder.missingRequiredExpression(validationRuleDescriptionEntryKey);
+            } else {
+                Optional<GroovyExpression.CompilationError> compileResult = GroovyLineChecker.validateExpression(expression);
+                compileResult.ifPresent(compilationError -> builder.illegalGroovyExpression(validationRuleDescriptionEntryKey, expression, compilationError));
             }
-            ImmutableSet<String> variableComponentCheckers = ImmutableSet.of("Date", "Float", "Integer", "RegularExpression", "Reference");
-            String columns = checker.getParams().getColumns();
-            // autant mettre une collection dans le YAML directement
-            Set<String> groovyColumn = Set.of();
-            Configuration.CheckerConfigurationDescription params = checker.getParams();
-            if (params != null && params.getGroovy() != null) {
-                String values = MoreObjects.firstNonNull(params.getColumns(), "");
-                if (values != null) {
-                    String[] split = values.split(",");
-                    groovyColumn = Arrays.stream(split).collect(Collectors.toSet());
+        } else if (CHECKER_ON_TARGET_NAMES.contains(checker.getName())) {
+            if (lineValidationRuleDescription.doGetCheckerTargets().isEmpty()) {
+                builder.missingParamColumnReferenceForChecker(validationRuleDescriptionEntryKey);
+            } else {
+                Set<CheckerTarget> columnsDeclaredInCheckerConfiguration = lineValidationRuleDescription.doGetCheckerTargets();
+                Set<CheckerTarget> knownColumns = builder.getAcceptableCheckerTargets();
+                ImmutableSet<CheckerTarget> missingColumns = Sets.difference(columnsDeclaredInCheckerConfiguration, knownColumns).immutableCopy();
+                if (!missingColumns.isEmpty()) {
+                    builder.missingColumnReferenceForChecker(validationRuleDescriptionEntryKey, checker.getName(), knownColumns, missingColumns);
                 }
             }
+            verifyCheckerOnOneTarget(new CheckerOnOneTargetValidationContext() {
+                @Override
+                public Set<String> getReferences() {
+                    return builder.getReferences();
+                }
 
-            if (GroovyLineChecker.NAME.equals(checker.getName())) {
-                String expression = Optional.of(checker)
-                        .map(Configuration.CheckerDescription::getParams)
-                        .map(Configuration.CheckerConfigurationDescription::getGroovy)
-                        .map(GroovyConfiguration::getExpression)
-                        .orElse(null);
-                if (StringUtils.isBlank(expression)) {
-                    builder.recordMissingRequiredExpression(validationRuleDescriptionEntryKey);
-                } else {
-                    Optional<GroovyExpression.CompilationError> compileResult = GroovyLineChecker.validateExpression(expression);
-                    compileResult.ifPresent(compilationError -> builder.recordIllegalGroovyExpression(validationRuleDescriptionEntryKey, expression, compilationError));
+                @Override
+                public void unknownReferenceForChecker(String refType, Set<String> references) {
+                    builder.unknownReferenceForChecker(validationRuleDescriptionEntryKey, refType, references);
                 }
-            } else if (variableComponentCheckers.contains(checker.getName())) {
-                if (Strings.isNullOrEmpty(columns))
-                    builder.missingParamColumnReferenceForCheckerInReference(validationRuleDescriptionEntryKey, reference);
-                else {
-                    List<String> columnsList = Stream.of(columns.split(",")).collect(Collectors.toList());
-                    Set<String> referencesColumns = referenceDescription.getColumns().keySet();
-                    ImmutableSet availablesColumns = new ImmutableSet.Builder<>()
-                            .addAll(referencesColumns)
-                            .addAll(groovyColumn)
-                            .build();
-
-                    List<String> missingColumns = columnsList.stream()
-                            .filter(c -> !availablesColumns.contains(c))
-                            .collect(Collectors.toList());
-
-                    if (!missingColumns.isEmpty()) {
-                        builder.missingColumnReferenceForCheckerInReference(validationRuleDescriptionEntryKey, availablesColumns, checker.getName(), missingColumns, reference);
-                    }
+
+                @Override
+                public void missingReferenceForChecker(Set<String> references) {
+                    builder.missingReferenceForChecker(validationRuleDescriptionEntryKey, references);
                 }
-                if ("Reference".equals(checker.getName())) {
-                    if (checker.getParams() != null && checker.getParams().getRefType() != null) {
-                        String refType = checker.getParams().getRefType();
-                        if (!references.contains(refType)) {
-                            builder.unknownReferenceForCheckerInReference(validationRuleDescriptionEntryKey, reference, refType, references);
-                        }
-                    } else {
-                        builder.missingReferenceForCheckerInReference(validationRuleDescriptionEntryKey, reference, references);
-                    }
+
+                @Override
+                public void unknownCheckerOnOneTargetName(String checkerName, ImmutableSet<String> validCheckerNames) {
+                    builder.unknownCheckerNameForVariableComponentChecker(validationRuleDescriptionEntryKey, checkerName, validCheckerNames);
                 }
-            } else {
-                builder.recordUnknownCheckerNameForVariableComponentCheckerInReference(validationRuleDescriptionEntryKey, reference, checker.getName(), variableComponentCheckers);
-            }
+
+                @Override
+                public void invalidPatternForDateChecker(String pattern) {
+                    builder.invalidPatternForDateChecker(validationRuleDescriptionEntryKey, pattern);
+                }
+
+                @Override
+                public void invalidDurationForDateChecker(String duration) {
+                    builder.invalidDurationForDateChecker(validationRuleDescriptionEntryKey, duration);
+                }
+
+                @Override
+                public void invalidPatternForRegularExpressionChecker(String pattern) {
+                    builder.invalidPatternForRegularExpressionChecker(validationRuleDescriptionEntryKey, pattern);
+                }
+            }, checker);
+        } else {
+            builder.unknownCheckerNameForValidationRule(validationRuleDescriptionEntryKey, checker.getName(), ALL_CHECKER_NAMES);
         }
     }
 
@@ -701,38 +1004,13 @@ public class ApplicationConfigurationService {
                 .build();
     }
 
-    private ConfigurationParsingResult onMappingExceptions(List<IllegalArgumentException> exceptions) {
-        ConfigurationParsingResult.Builder builder = ConfigurationParsingResult.builder();
-        exceptions
-                .forEach(exception -> {
-                    if (exception.getCause() instanceof UnrecognizedPropertyException) {
-                        UnrecognizedPropertyException e = (UnrecognizedPropertyException) exception.getCause();
-                        int lineNumber = e.getLocation().getLineNr();
-                        int columnNumber = e.getLocation().getColumnNr();
-                        String unknownPropertyName = e.getPropertyName();
-                        Collection<String> knownProperties = (Collection) e.getKnownPropertyIds();
-                        builder.recordUnrecognizedProperty(lineNumber, columnNumber, unknownPropertyName, knownProperties);
-                    } else if (exception.getCause() instanceof InvalidFormatException) {
-                        InvalidFormatException e = (InvalidFormatException) exception.getCause();
-                        int lineNumber = e.getLocation().getLineNr();
-                        int columnNumber = e.getLocation().getColumnNr();
-                        String value = e.getValue().toString();
-                        String targetTypeName = e.getTargetType().getName();
-                        builder.recordInvalidFormat(lineNumber, columnNumber, value, targetTypeName);
-                    } else {
-                        builder.unknownIllegalException(exception.getCause().getLocalizedMessage());
-                    }
-                });
-        return builder.build();
-    }
-
     private ConfigurationParsingResult onUnrecognizedPropertyException(UnrecognizedPropertyException e) {
         int lineNumber = e.getLocation().getLineNr();
         int columnNumber = e.getLocation().getColumnNr();
         String unknownPropertyName = e.getPropertyName();
         Collection<String> knownProperties = (Collection) e.getKnownPropertyIds();
         return ConfigurationParsingResult.builder()
-                .recordUnrecognizedProperty(lineNumber, columnNumber, unknownPropertyName, knownProperties)
+                .unrecognizedProperty(lineNumber, columnNumber, unknownPropertyName, knownProperties)
                 .build();
     }
 
@@ -742,7 +1020,7 @@ public class ApplicationConfigurationService {
         String value = e.getValue().toString();
         String targetTypeName = e.getTargetType().getName();
         return ConfigurationParsingResult.builder()
-                .recordInvalidFormat(lineNumber, columnNumber, value, targetTypeName)
+                .invalidFormat(lineNumber, columnNumber, value, targetTypeName)
                 .build();
     }
 
diff --git a/src/main/java/fr/inra/oresing/rest/ConfigurationParsingResult.java b/src/main/java/fr/inra/oresing/rest/ConfigurationParsingResult.java
index 8f6946fbbc33cae65e2afe62babdf6338e6771c9..69365259dd8528dc1c288606f7c128f44ca07cd6 100644
--- a/src/main/java/fr/inra/oresing/rest/ConfigurationParsingResult.java
+++ b/src/main/java/fr/inra/oresing/rest/ConfigurationParsingResult.java
@@ -56,7 +56,7 @@ public class ConfigurationParsingResult {
             return new ConfigurationParsingResult(validationCheckResults, null);
         }
 
-        public Builder recordEmptyFile() {
+        public Builder emptyFile() {
             return recordError("emptyFile");
         }
 
@@ -64,95 +64,110 @@ public class ConfigurationParsingResult {
             return recordError(message);
         }
 
-        public Builder recordUnsupportedVersion(int actualVersion, int expectedVersion) {
+        public Builder unsupportedVersion(int actualVersion, int expectedVersion) {
             return recordError("unsupportedVersion", ImmutableMap.of("actualVersion", actualVersion, "expectedVersion", expectedVersion));
         }
 
-        public Builder unknownIllegalException(String cause)  {
-            return recordError("unknownIllegalException", ImmutableMap.of(
+        public void unknownIllegalException(String cause)  {
+            recordError("unknownIllegalException", ImmutableMap.of(
                     "cause", cause));
         }
 
-        public Builder missingReferenceForCheckerInReference(String validationKey, String reference, Set<String> references)  {
-            return recordError("missingReferenceForCheckerInReference", ImmutableMap.of(
+        public void missingReferenceForCheckerInReference(String validationKey, String reference, Set<String> references)  {
+            recordError("missingReferenceForCheckerInReference", ImmutableMap.of(
                     "validationKey", validationKey,
                     "reference", reference,
                     "references", references));
         }
 
-        public Builder missingReferenceForChecker(String dataType, String datum, String component, Set<String> references) {
-            return recordError("missingReferenceForChecker", ImmutableMap.of("dataType", dataType,
+        public void missingReferenceForCheckerInDataType(String validationKey, String dataType, Set<String> references)  {
+            recordError("missingReferenceForCheckerInDataType", ImmutableMap.of(
+                    "validationKey", validationKey,
+                    "dataType", dataType,
+                    "references", references));
+        }
+
+        public void missingReferenceForChecker(String dataType, String datum, String component, Set<String> references) {
+            recordError("missingReferenceForChecker", ImmutableMap.of("dataType", dataType,
                     "datum", datum,
                     "component", component,
                     "references", references));
         }
 
-        public Builder unknownReferenceForCheckerInReference(String validationKey, String reference, String refType, Set<String> references) {
-            return recordError("unknownReferenceForCheckerInReference", ImmutableMap.of(
+        public void unknownReferenceForCheckerInReference(String validationKey, String reference, String refType, Set<String> references) {
+            recordError("unknownReferenceForCheckerInReference", ImmutableMap.of(
                     "validationKey", validationKey,
                     "refType", refType,
                     "reference", reference,
                     "references", references));
         }
 
-        public Builder unknownReferenceForChecker(String dataType, String datum, String component, String refType, Set<String> references) {
-            return recordError("unknownReferenceForChecker", ImmutableMap.of("dataType", dataType,
+        public void unknownReferenceForCheckerInDataType(String validationKey, String dataType, String refType, Set<String> references) {
+            recordError("unknownReferenceForCheckerInDataType", ImmutableMap.of(
+                    "validationKey", validationKey,
+                    "refType", refType,
+                    "dataType", dataType,
+                    "references", references));
+        }
+
+        public void unknownReferenceForChecker(String dataType, String datum, String component, String refType, Set<String> references) {
+            recordError("unknownReferenceForChecker", ImmutableMap.of("dataType", dataType,
                     "datum", datum,
                     "refType", refType,
                     "component", component,
                     "references", references));
         }
 
-        public Builder recordUndeclaredDataGroupForVariable(String variable) {
-            return recordError("undeclaredDataGroupForVariable", ImmutableMap.of("variable", variable));
+        public void undeclaredDataGroupForVariable(String variable) {
+            recordError("undeclaredDataGroupForVariable", ImmutableMap.of("variable", variable));
         }
 
-        public Builder recordVariableInMultipleDataGroup(String variable) {
-            return recordError("variableInMultipleDataGroup", ImmutableMap.of("variable", variable));
+        public void variableInMultipleDataGroup(String variable) {
+            recordError("variableInMultipleDataGroup", ImmutableMap.of("variable", variable));
         }
 
-        public Builder recordUnknownVariablesInDataGroup(String dataGroup, Set<String> unknownVariables, Set<String> variables) {
-            return recordError("unknownVariablesInDataGroup", ImmutableMap.of(
+        public void unknownVariablesInDataGroup(String dataGroup, Set<String> unknownVariables, Set<String> variables) {
+            recordError("unknownVariablesInDataGroup", ImmutableMap.of(
                     "dataGroup", dataGroup,
                     "unknownVariables", unknownVariables,
                     "variables", variables)
             );
         }
 
-        public Builder recordMissingTimeScopeVariableComponentKey(String dataType) {
-            return recordError("missingTimeScopeVariableComponentKey", ImmutableMap.of("dataType", dataType));
+        public void missingTimeScopeVariableComponentKey(String dataType) {
+            recordError("missingTimeScopeVariableComponentKey", ImmutableMap.of("dataType", dataType));
         }
 
-        public Builder recordMissingAuthorizationScopeVariableComponentKey(String dataType) {
-            return recordError("missingAuthorizationScopeVariableComponentKey", ImmutableMap.of("dataType", dataType));
+        public void missingAuthorizationScopeVariableComponentKey(String dataType) {
+            recordError("missingAuthorizationScopeVariableComponentKey", ImmutableMap.of("dataType", dataType));
         }
 
-        public Builder recordTimeScopeVariableComponentKeyMissingVariable(String dataType, Set<String> variables) {
-            return recordError("timeScopeVariableComponentKeyMissingVariable", ImmutableMap.of("dataType", dataType, "variables", variables));
+        public void timeScopeVariableComponentKeyMissingVariable(String dataType, Set<String> variables) {
+            recordError("timeScopeVariableComponentKeyMissingVariable", ImmutableMap.of("dataType", dataType, "variables", variables));
         }
 
-        public Builder recordAuthorizationScopeVariableComponentKeyMissingVariable(String dataType, String authorizationScopeName, Set<String> variables) {
-            return recordError("authorizationScopeVariableComponentKeyMissingVariable", ImmutableMap.of("dataType", dataType, "authorizationScopeName", authorizationScopeName, "variables", variables));
+        public void authorizationScopeVariableComponentKeyMissingVariable(String dataType, String authorizationScopeName, Set<String> variables) {
+            recordError("authorizationScopeVariableComponentKeyMissingVariable", ImmutableMap.of("dataType", dataType, "authorizationScopeName", authorizationScopeName, "variables", variables));
         }
 
-        public Builder recordTimeScopeVariableComponentKeyUnknownVariable(VariableComponentKey timeScopeVariableComponentKey, Set<String> knownVariables) {
-            return recordError("timeScopeVariableComponentKeyUnknownVariable", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "knownVariables", knownVariables));
+        public void timeScopeVariableComponentKeyUnknownVariable(VariableComponentKey timeScopeVariableComponentKey, Set<String> knownVariables) {
+            recordError("timeScopeVariableComponentKeyUnknownVariable", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "knownVariables", knownVariables));
         }
 
-        public Builder recordAuthorizationScopeVariableComponentKeyUnknownVariable(VariableComponentKey timeScopeVariableComponentKey, Set<String> knownVariables) {
-            return recordError("authorizationScopeVariableComponentKeyUnknownVariable", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "knownVariables", knownVariables));
+        public void authorizationScopeVariableComponentKeyUnknownVariable(VariableComponentKey timeScopeVariableComponentKey, Set<String> knownVariables) {
+            recordError("authorizationScopeVariableComponentKeyUnknownVariable", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "knownVariables", knownVariables));
         }
 
-        public Builder recordTimeVariableComponentKeyMissingComponent(String dataType, String variable, Set<String> knownComponents) {
-            return recordError("timeVariableComponentKeyMissingComponent", ImmutableMap.of(
+        public void timeVariableComponentKeyMissingComponent(String dataType, String variable, Set<String> knownComponents) {
+            recordError("timeVariableComponentKeyMissingComponent", ImmutableMap.of(
                     "dataType", dataType,
                     "variable", variable,
                     "knownComponents", knownComponents
             ));
         }
 
-        public Builder recordAuthorizationVariableComponentKeyMissingComponent(String dataType, String authorizationName, String variable, Set<String> knownComponents) {
-            return recordError("authorizationVariableComponentKeyMissingComponent", ImmutableMap.of(
+        public void authorizationVariableComponentKeyMissingComponent(String dataType, String authorizationName, String variable, Set<String> knownComponents) {
+            recordError("authorizationVariableComponentKeyMissingComponent", ImmutableMap.of(
                     "dataType", dataType,
                     "authorizationName", authorizationName,
                     "variable", variable,
@@ -160,39 +175,39 @@ public class ConfigurationParsingResult {
             ));
         }
 
-        public Builder recordTimeVariableComponentKeyUnknownComponent(VariableComponentKey timeScopeVariableComponentKey, Set<String> knownComponents) {
-            return recordError("timeVariableComponentKeyUnknownComponent", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "knownComponents", knownComponents));
+        public void timeVariableComponentKeyUnknownComponent(VariableComponentKey timeScopeVariableComponentKey, Set<String> knownComponents) {
+            recordError("timeVariableComponentKeyUnknownComponent", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "knownComponents", knownComponents));
         }
 
-        public Builder recordAuthorizationVariableComponentKeyUnknownComponent(VariableComponentKey timeScopeVariableComponentKey, Set<String> knownComponents) {
-            return recordError("authorizationVariableComponentKeyUnknownComponent", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "knownComponents", knownComponents));
+        public void authorizationVariableComponentKeyUnknownComponent(VariableComponentKey timeScopeVariableComponentKey, Set<String> knownComponents) {
+            recordError("authorizationVariableComponentKeyUnknownComponent", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "knownComponents", knownComponents));
         }
 
-        public Builder recordTimeScopeVariableComponentWrongChecker(VariableComponentKey timeScopeVariableComponentKey, String expectedChecker) {
-            return recordError("timeScopeVariableComponentWrongChecker", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "expectedChecker", expectedChecker));
+        public void timeScopeVariableComponentWrongChecker(VariableComponentKey timeScopeVariableComponentKey, String expectedChecker) {
+            recordError("timeScopeVariableComponentWrongChecker", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "expectedChecker", expectedChecker));
         }
 
-        public Builder recordAuthorizationScopeVariableComponentWrongChecker(VariableComponentKey timeScopeVariableComponentKey, String expectedChecker) {
-            return recordError("authorizationScopeVariableComponentWrongChecker", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "expectedChecker", expectedChecker));
+        public void authorizationScopeVariableComponentWrongChecker(VariableComponentKey timeScopeVariableComponentKey, String expectedChecker) {
+            recordError("authorizationScopeVariableComponentWrongChecker", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "expectedChecker", expectedChecker));
         }
 
-        public Builder recordTimeScopeVariableComponentPatternUnknown(VariableComponentKey timeScopeVariableComponentKey, String pattern, Set<String> knownPatterns) {
-            return recordError("timeScopeVariableComponentPatternUnknown", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "pattern", pattern, "knownPatterns", knownPatterns));
+        public void timeScopeVariableComponentPatternUnknown(VariableComponentKey timeScopeVariableComponentKey, String pattern, Set<String> knownPatterns) {
+            recordError("timeScopeVariableComponentPatternUnknown", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "pattern", pattern, "knownPatterns", knownPatterns));
         }
 
-        public Builder recordAuthorizationScopeVariableComponentReftypeUnknown(VariableComponentKey timeScopeVariableComponentKey, String refType, Set<String> knownPatterns) {
-            return recordError("authorizationScopeVariableComponentReftypeUnknown", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "refType", refType, "knownPatterns", knownPatterns));
+        public void authorizationScopeVariableComponentReftypeUnknown(VariableComponentKey timeScopeVariableComponentKey, String refType, Set<String> knownPatterns) {
+            recordError("authorizationScopeVariableComponentReftypeUnknown", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "refType", refType, "knownPatterns", knownPatterns));
         }
 
-        public Builder recordAuthorizationScopeVariableComponentReftypeNull(VariableComponentKey timeScopeVariableComponentKey, Set<String> knownPatterns) {
-            return recordError("authorizationScopeVariableComponentReftypeNull", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "knownPatterns", knownPatterns));
+        public void authorizationScopeVariableComponentReftypeNull(VariableComponentKey timeScopeVariableComponentKey, Set<String> knownPatterns) {
+            recordError("authorizationScopeVariableComponentReftypeNull", ImmutableMap.of("variable", timeScopeVariableComponentKey.getVariable(), "component", timeScopeVariableComponentKey.getComponent(), "knownPatterns", knownPatterns));
         }
 
-        public Builder recordAuthorizationVariableComponentMustReferToCompositereference(String dataType, String authorizationName, String refType, Set<String> knownCompositesReferences) {
-            return recordError("authorizationScopeVariableComponentReftypeUnknown", ImmutableMap.of("dataType", dataType, "authorizationName", authorizationName, "refType", refType, "knownCompositesReferences", knownCompositesReferences));
+        public void authorizationScopeVariableComponentReftypeUnknown(String dataType, String authorizationName, String refType, Set<String> knownCompositesReferences) {
+            recordError("authorizationScopeVariableComponentReftypeUnknown", ImmutableMap.of("dataType", dataType, "authorizationName", authorizationName, "refType", refType, "knownCompositesReferences", knownCompositesReferences));
         }
 
-        public Builder recordUnrecognizedProperty(int lineNumber, int columnNumber, String unknownPropertyName, Collection<String> knownProperties) {
+        public Builder unrecognizedProperty(int lineNumber, int columnNumber, String unknownPropertyName, Collection<String> knownProperties) {
             return recordError("unrecognizedProperty", ImmutableMap.of(
                     "lineNumber", lineNumber,
                     "columnNumber", columnNumber,
@@ -201,7 +216,7 @@ public class ConfigurationParsingResult {
             ));
         }
 
-        public Builder recordInvalidFormat(int lineNumber, int columnNumber, String value, String targetTypeName) {
+        public Builder invalidFormat(int lineNumber, int columnNumber, String value, String targetTypeName) {
             return recordError("invalidFormat", ImmutableMap.of(
                     "lineNumber", lineNumber,
                     "columnNumber", columnNumber,
@@ -210,47 +225,76 @@ public class ConfigurationParsingResult {
             ));
         }
 
-        public Builder recordMissingRequiredExpression(String lineValidationRuleKey) {
-            return recordError("missingRequiredExpression", ImmutableMap.of(
-                    "lineValidationRuleKey", lineValidationRuleKey
+        public void missingRequiredExpressionForValidationRuleInDataType(String lineValidationRuleKey, String dataType) {
+            recordError("missingRequiredExpressionForValidationRuleInDataType", ImmutableMap.of(
+                    "lineValidationRuleKey", lineValidationRuleKey,
+                    "dataType", dataType
             ));
         }
 
-        public Builder recordIllegalGroovyExpression(String lineValidationRuleKey, String expression, GroovyExpression.CompilationError compilationError) {
-            return recordError("illegalGroovyExpression", ImmutableMap.of(
+        public void missingRequiredExpressionForValidationRuleInReference(String lineValidationRuleKey, String reference) {
+            recordError("missingRequiredExpressionForValidationRuleInReference", ImmutableMap.of(
                     "lineValidationRuleKey", lineValidationRuleKey,
+                    "reference", reference
+            ));
+        }
+
+        public void illegalGroovyExpressionForValidationRuleInDataType(String lineValidationRuleKey, String dataType, String expression, GroovyExpression.CompilationError compilationError) {
+            recordError("illegalGroovyExpressionForValidationRuleInDataType", ImmutableMap.of(
+                    "lineValidationRuleKey", lineValidationRuleKey,
+                    "dataType", dataType,
+                    "expression", expression,
+                    "compilationError", compilationError
+            ));
+        }
+
+        public void illegalGroovyExpressionForValidationRuleInReference(String lineValidationRuleKey, String reference, String expression, GroovyExpression.CompilationError compilationError) {
+            recordError("illegalGroovyExpressionForValidationRuleInReference", ImmutableMap.of(
+                    "lineValidationRuleKey", lineValidationRuleKey,
+                    "reference", reference,
                     "expression", expression,
                     "compilationError", compilationError
             ));
         }
 
-        public Builder recordUnknownCheckerName(String lineValidationRuleKey, String checkerName) {
-            return recordError("unknownCheckerName", ImmutableMap.of(
+        public void unknownCheckerNameForValidationRuleInReference(String lineValidationRuleKey, String reference, String checkerName, ImmutableSet<String> allCheckerNames) {
+            recordError("unknownCheckerNameForValidationRuleInReference", ImmutableMap.of(
+                    "lineValidationRuleKey", lineValidationRuleKey,
+                    "reference", reference,
+                    "allCheckerNames", allCheckerNames,
+                    "checkerName", checkerName
+            ));
+        }
+
+        public void unknownCheckerNameForValidationRuleInDataType(String lineValidationRuleKey, String dataType, String checkerName, ImmutableSet<String> allCheckerNames) {
+            recordError("unknownCheckerNameForValidationRuleInDataType", ImmutableMap.of(
                     "lineValidationRuleKey", lineValidationRuleKey,
+                    "dataType", dataType,
+                    "allCheckerNames", allCheckerNames,
                     "checkerName", checkerName
             ));
         }
 
-        public Builder recordUnknownCheckerNameForVariableComponentChecker(String dataType, String variable, String component, String checkerName, ImmutableSet<String> variableComponentCheckers) {
-            return recordError("unknownCheckerNameForVariableComponent", ImmutableMap.of(
+        public void unknownCheckerNameForVariableComponent(String dataType, String variable, String component, String checkerName, ImmutableSet<String> knownCheckerNames) {
+            recordError("unknownCheckerNameForVariableComponent", ImmutableMap.of(
                     "datatype", dataType,
                     "variable", variable,
                     "component", component,
                     "checkerName", checkerName,
-                    "knownsCheckers", variableComponentCheckers
+                    "knownCheckerNames", knownCheckerNames
             ));
         }
 
-        public Builder recordCsvBoundToUnknownVariable(String header, String variable, Set<String> variables) {
-            return recordError("csvBoundToUnknownVariable", ImmutableMap.of(
+        public void csvBoundToUnknownVariable(String header, String variable, Set<String> variables) {
+            recordError("csvBoundToUnknownVariable", ImmutableMap.of(
                     "header", header,
                     "variable", variable,
                     "variables", variables
             ));
         }
 
-        public Builder recordCsvBoundToUnknownVariableComponent(String header, String variable, String component, Set<String> components) {
-            return recordError("csvBoundToUnknownVariableComponent", ImmutableMap.of(
+        public void csvBoundToUnknownVariableComponent(String header, String variable, String component, Set<String> components) {
+            recordError("csvBoundToUnknownVariableComponent", ImmutableMap.of(
                     "header", header,
                     "variable", variable,
                     "component", component,
@@ -258,32 +302,32 @@ public class ConfigurationParsingResult {
             ));
         }
 
-        public Builder recordInvalidKeyColumns(String reference, Set<String> unknownUsedAsKeyElementColumns, Set<String> knownColumns) {
-            return recordError("invalidKeyColumns", ImmutableMap.of(
+        public void invalidKeyColumns(String reference, Set<String> unknownUsedAsKeyElementColumns, Set<String> knownColumns) {
+            recordError("invalidKeyColumns", ImmutableMap.of(
                     "reference", reference,
                     "unknownUsedAsKeyElementColumns", unknownUsedAsKeyElementColumns,
                     "knownColumns", knownColumns
             ));
         }
 
-        public Builder recordInvalidInternationalizedColumns(String reference, Set<String> unknownUsedAsKeyInternationalizedColumns, Set<String> knownColumns) {
-            return recordError("invalidInternationalizedColumns", ImmutableMap.of(
+        public void invalidInternationalizedColumns(String reference, Set<String> unknownUsedAsKeyInternationalizedColumns, Set<String> knownColumns) {
+            recordError("invalidInternationalizedColumns", ImmutableMap.of(
                     "reference", reference,
                     "unknownUsedAsInternationalizedColumns", unknownUsedAsKeyInternationalizedColumns,
                     "knownColumns", knownColumns
             ));
         }
 
-        public Builder recordUnknownUsedAsVariableComponentUniqueness(String dataType, Set<String> unknownUsedAsVariableComponentUniqueness,Set<String>  availableVariableComponents) {
-            return recordError("unknownUsedAsVariableComponentUniqueness", ImmutableMap.of(
+        public void unknownUsedAsVariableComponentUniqueness(String dataType, Set<String> unknownUsedAsVariableComponentUniqueness,Set<String>  availableVariableComponents) {
+            recordError("unknownUsedAsVariableComponentUniqueness", ImmutableMap.of(
                     "dataType", dataType,
                     "unknownUsedAsVariableComponentUniqueness", unknownUsedAsVariableComponentUniqueness,
                     "availableVariableComponents", availableVariableComponents
             ));
         }
 
-        public Builder recordInvalidInternationalizedColumnsForDataType(String dataType, String reference, Set<String> unknownUsedAsKeyInternationalizedColumns, Set<String> knownColumns) {
-            return recordError("invalidInternationalizedColumnsForDataType", ImmutableMap.of(
+        public void invalidInternationalizedColumnsForDataType(String dataType, String reference, Set<String> unknownUsedAsKeyInternationalizedColumns, Set<String> knownColumns) {
+            recordError("invalidInternationalizedColumnsForDataType", ImmutableMap.of(
                     "dataType", dataType,
                     "reference", reference,
                     "unknownUsedAsInternationalizedColumns", unknownUsedAsKeyInternationalizedColumns,
@@ -291,101 +335,127 @@ public class ConfigurationParsingResult {
             ));
         }
 
-        public Builder missingColumnReferenceForCheckerInReference(String validationRuleDescriptionEntryKey, Set<String> availablesColumns, String name, List<String> missingColumns, String reference) {
-            return recordError("missingColumnReferenceForCheckerInReference", ImmutableMap.of(
+        public void missingColumnReferenceForCheckerInReference(String validationRuleDescriptionEntryKey, Set<String> knownColumns, String name, ImmutableSet<String> missingColumns, String reference) {
+            recordError("missingColumnReferenceForCheckerInReference", ImmutableMap.of(
                     "reference", reference,
                     "validationRuleDescriptionEntryKey", validationRuleDescriptionEntryKey,
-                    "knownColumns", availablesColumns,
+                    "knownColumns", knownColumns,
                     "checkerName", name,
                     "missingColumns", missingColumns
             ));
         }
 
-        public Builder recordUnknownCheckerNameForVariableComponentCheckerInReference(String validationRuleDescriptionEntryKey, String reference, String name, ImmutableSet<String> variableComponentCheckers) {
-            return recordError("unknownCheckerNameForVariableComponentCheckerInReference", ImmutableMap.of(
+        public void missingColumnReferenceForCheckerInDataType(String validationRuleDescriptionEntryKey, Set<String> knownVariableComponents, String name, ImmutableSet<String> missingVariableComponents, String dataType) {
+            recordError("missingColumnReferenceForCheckerInDataType", ImmutableMap.of(
+                    "dataType", dataType,
+                    "validationRuleDescriptionEntryKey", validationRuleDescriptionEntryKey,
+                    "knownVariableComponents", knownVariableComponents,
+                    "checkerName", name,
+                    "missingVariableComponents", missingVariableComponents
+            ));
+        }
+
+        public void unknownCheckerNameForVariableComponentCheckerInReference(String validationRuleDescriptionEntryKey, String reference, String name, ImmutableSet<String> checkerOnTargetNames) {
+            recordError("unknownCheckerNameForVariableComponentCheckerInReference", ImmutableMap.of(
                     "reference", reference,
                     "validationRuleDescriptionEntryKey", validationRuleDescriptionEntryKey,
                     "name", name,
-                    "variableComponentCheckers", variableComponentCheckers
+                    "checkerOnTargetNames", checkerOnTargetNames
+            ));
+        }
+
+        public void unknownCheckerNameForVariableComponentCheckerInDataType(String validationRuleDescriptionEntryKey, String dataType, String name, ImmutableSet<String> checkerOnTargetNames) {
+            recordError("unknownCheckerNameForVariableComponentCheckerInDataType", ImmutableMap.of(
+                    "dataType", dataType,
+                    "validationRuleDescriptionEntryKey", validationRuleDescriptionEntryKey,
+                    "name", name,
+                    "checkerOnTargetNames", checkerOnTargetNames
             ));
         }
 
-        public Builder missingParamColumnReferenceForCheckerInReference(String validationRuleDescriptionEntryKey, String reference) {
-            return recordError("missingParamColumnReferenceForCheckerInReference", ImmutableMap.of(
+        public void missingParamColumnReferenceForCheckerInReference(String validationRuleDescriptionEntryKey, String reference) {
+            recordError("missingParamColumnReferenceForCheckerInReference", ImmutableMap.of(
                     "reference", reference,
                     "validationRuleDescriptionEntryKey", validationRuleDescriptionEntryKey
             ));
         }
 
-        public Builder missingAuthorizationsForDatatype(String dataType) {
-            return recordError("missingAuthorizationForDatatype", ImmutableMap.of(
+        public void missingParamColumnReferenceForCheckerInDataType(String validationRuleDescriptionEntryKey, String dataType) {
+            recordError("missingParamColumnReferenceForCheckerInDataType", ImmutableMap.of(
+                    "dataType", dataType,
+                    "validationRuleDescriptionEntryKey", validationRuleDescriptionEntryKey
+            ));
+        }
+
+        public void missingAuthorizationForDatatype(String dataType) {
+            recordError("missingAuthorizationForDatatype", ImmutableMap.of(
                     "datatype", dataType
             ));
         }
 
-        public Builder recordUnknownReferenceInCompositeReference(String compositeReferenceName, ImmutableSet<String> unknownReferences, Set<String> existingReferences) {
-            return recordError("unknownReferenceInCompositereference", ImmutableMap.of(
+        public void unknownReferenceInCompositeReference(String compositeReferenceName, ImmutableSet<String> unknownReferences, Set<String> existingReferences) {
+            recordError("unknownReferenceInCompositeReference", ImmutableMap.of(
                     "compositeReference", compositeReferenceName,
                     "unknownReferences", unknownReferences,
                     "references", existingReferences)
             );
         }
 
-        public Builder recordMissingReferenceInCompositereference(String compositeReferenceName) {
-            return recordError("missingReferenceInCompositereference", ImmutableMap.of(
+        public void missingReferenceInCompositereference(String compositeReferenceName) {
+            recordError("missingReferenceInCompositereference", ImmutableMap.of(
                     "compositeReference", compositeReferenceName)
             );
         }
 
-        public Builder recordRequiredReferenceInCompositeReferenceForParentKeyColumn(String compositeReferenceName, String parentKeyColumn) {
-            return recordError("requiredReferenceInCompositeReferenceForParentKeyColumn", ImmutableMap.of(
+        public void requiredReferenceInCompositeReferenceForParentKeyColumn(String compositeReferenceName, String parentKeyColumn) {
+            recordError("requiredReferenceInCompositeReferenceForParentKeyColumn", ImmutableMap.of(
                     "compositeReference", compositeReferenceName,
                     "parentKeyColumn", parentKeyColumn)
             );
         }
 
-        public Builder recordRequiredParentKeyColumnInCompositeReferenceForReference(String compositeReferenceName, String reference, String referenceTo) {
-            return recordError("requiredParentKeyColumnInCompositeReferenceForReference", ImmutableMap.of(
+        public void requiredParentKeyColumnInCompositeReferenceForReference(String compositeReferenceName, String reference, String referenceTo) {
+            recordError("requiredParentKeyColumnInCompositeReferenceForReference", ImmutableMap.of(
                     "compositeReference", compositeReferenceName,
                     "reference", reference,
                     "referenceTo", referenceTo)
             );
         }
 
-        public Builder recordMissingParentColumnForReferenceInCompositeReferenceFor(String compositeReferenceName, String reference, String parentKeyColumn) {
-            return recordError("missingParentColumnForReferenceInCompositeReference", ImmutableMap.of(
+        public void missingParentColumnForReferenceInCompositeReference(String compositeReferenceName, String reference, String parentKeyColumn) {
+            recordError("missingParentColumnForReferenceInCompositeReference", ImmutableMap.of(
                     "compositeReference", compositeReferenceName,
                     "reference", reference,
                     "parentKeyColumn", parentKeyColumn)
             );
         }
 
-        public Builder recordMissingParentRecursiveKeyColumnForReferenceInCompositeReference(String compositeReferenceName, String reference, String parentRecursiveKey) {
-            return recordError("missingParentRecursiveKeyColumnForReferenceInCompositeReference", ImmutableMap.of(
+        public void missingParentRecursiveKeyColumnForReferenceInCompositeReference(String compositeReferenceName, String reference, String parentRecursiveKey) {
+            recordError("missingParentRecursiveKeyColumnForReferenceInCompositeReference", ImmutableMap.of(
                     "compositeReference", compositeReferenceName,
                     "reference", reference,
                     "parentRecursiveKey", parentRecursiveKey)
             );
         }
 
-        public Builder recordUnknownReferenceInDatatypeReferenceDisplay(String dataType, String reference, Set<String> references) {
-            return recordError("unknownReferenceInDatatypeReferenceDisplay", ImmutableMap.of(
+        public void unknownReferenceInDatatypeReferenceDisplay(String dataType, String reference, Set<String> references) {
+            recordError("unknownReferenceInDatatypeReferenceDisplay", ImmutableMap.of(
                     "dataType", dataType,
                     "reference", reference,
                     "references", references)
             );
         }
 
-        public Builder recordUndeclaredValueForChart(String datatype, String variable, Set<String> components) {
-            return recordError("unDeclaredValueForChart", ImmutableMap.of(
+        public void unDeclaredValueForChart(String datatype, String variable, Set<String> components) {
+            recordError("unDeclaredValueForChart", ImmutableMap.of(
                     "variable", variable,
                     "dataType", datatype,
                     "components", components
             ));
         }
 
-        public Builder recordMissingValueComponentForChart(String datatype, String variable, String valueComponent, Set<String> components) {
-            return recordError("missingValueComponentForChart", ImmutableMap.of(
+        public void missingValueComponentForChart(String datatype, String variable, String valueComponent, Set<String> components) {
+            recordError("missingValueComponentForChart", ImmutableMap.of(
                     "variable", variable,
                     "valueComponent", valueComponent,
                     "dataType", datatype,
@@ -393,8 +463,8 @@ public class ConfigurationParsingResult {
             ));
         }
 
-        public Builder recordMissingAggregationVariableForChart(String datatype, String variable, VariableComponentKey aggregation, Set<String> variables) {
-            return recordError("missingAggregationVariableForChart", ImmutableMap.of(
+        public void missingAggregationVariableForChart(String datatype, String variable, VariableComponentKey aggregation, Set<String> variables) {
+            recordError("missingAggregationVariableForChart", ImmutableMap.of(
                     "variable", variable,
                     "aggregationVariable", aggregation.getVariable(),
                     "aggregationComponent", aggregation.getComponent(),
@@ -403,8 +473,8 @@ public class ConfigurationParsingResult {
             ));
         }
 
-        public Builder recordMissingAggregationComponentForChart(String datatype, String variable, VariableComponentKey aggregation, Set<String> components) {
-            return recordError("missingAggregationComponentForChart", ImmutableMap.of(
+        public void missingAggregationComponentForChart(String datatype, String variable, VariableComponentKey aggregation, Set<String> components) {
+            recordError("missingAggregationComponentForChart", ImmutableMap.of(
                     "variable", variable,
                     "aggregationVariable", aggregation.getVariable(),
                     "aggregationComponent", aggregation.getComponent(),
@@ -413,8 +483,8 @@ public class ConfigurationParsingResult {
             ));
         }
 
-        public Builder recordMissingStandardDeviationComponentForChart(String datatype, String variable, String standardDeviation, Set<String> components) {
-            return recordError("missingStandardDeviationComponentForChart", ImmutableMap.of(
+        public void missingStandardDeviationComponentForChart(String datatype, String variable, String standardDeviation, Set<String> components) {
+            recordError("missingStandardDeviationComponentForChart", ImmutableMap.of(
                     "variable", variable,
                     "standardDeviation",standardDeviation,
                     "dataType", datatype,
@@ -422,8 +492,8 @@ public class ConfigurationParsingResult {
             ));
         }
 
-        public Builder recordMissingUnitComponentForChart(String datatype, String variable, String unit, Set<String> components) {
-            return recordError("missingUnitComponentForChart", ImmutableMap.of(
+        public void missingUnitComponentForChart(String datatype, String variable, String unit, Set<String> components) {
+            recordError("missingUnitComponentForChart", ImmutableMap.of(
                     "variable", variable,
                     "unit",unit,
                     "dataType", datatype,
@@ -431,52 +501,177 @@ public class ConfigurationParsingResult {
             ));
         }
 
-        public Builder recordMissingKeyColumnsForReference(String reference) {
-            return recordError("missingKeyColumnsForReference", ImmutableMap.of(
+        public void missingKeyColumnsForReference(String reference) {
+            recordError("missingKeyColumnsForReference", ImmutableMap.of(
                     "reference", reference)
             );
         }
 
-        public Builder recordCsvSameHeaderLineAndFirstRowLineForConstantDescription(String dataType) {
-            return recordError("sameHeaderLineAndFirstRowLineForConstantDescription", ImmutableMap.of(
+        public void sameHeaderLineAndFirstRowLineForConstantDescription(String dataType) {
+            recordError("sameHeaderLineAndFirstRowLineForConstantDescription", ImmutableMap.of(
                     "dataType", dataType
             ));
         }
 
-        public Builder recordCsvTooBigRowLineForConstantDescription(String dataType) {
-            return recordError("tooBigRowLineForConstantDescription", ImmutableMap.of(
+        public void tooBigRowLineForConstantDescription(String dataType) {
+            recordError("tooBigRowLineForConstantDescription", ImmutableMap.of(
                     "dataType", dataType
             ));
         }
 
-        public Builder recordCsvTooLittleRowLineForConstantDescription(String dataType) {
-            return recordError("tooLittleRowLineForConstantDescription", ImmutableMap.of(
+        public void tooLittleRowLineForConstantDescription(String dataType) {
+            recordError("tooLittleRowLineForConstantDescription", ImmutableMap.of(
                     "dataType", dataType
             ));
         }
 
-        public Builder recordCsvMissingRowLineForConstantDescription(String dataType) {
-            return recordError("missingRowLineForConstantDescription", ImmutableMap.of(
+        public void missingRowLineForConstantDescription(String dataType) {
+            recordError("missingRowLineForConstantDescription", ImmutableMap.of(
                     "dataType", dataType
             ));
         }
 
-        public Builder recordCsvMissingColumnNumberOrHeaderNameForConstantDescription(String dataType) {
-            return recordError("missingColumnNumberOrHeaderNameForConstantDescription", ImmutableMap.of(
+        public void missingColumnNumberOrHeaderNameForConstantDescription(String dataType) {
+            recordError("missingColumnNumberOrHeaderNameForConstantDescription", ImmutableMap.of(
                     "dataType", dataType
             ));
         }
 
-        public Builder recordCsvMissingBoundToForConstantDescription(String dataType) {
-            return recordError("missingBoundToForConstantDescription", ImmutableMap.of(
+        public void missingBoundToForConstantDescription(String dataType) {
+            recordError("missingBoundToForConstantDescription", ImmutableMap.of(
                     "dataType", dataType
             ));
         }
 
-        public Builder recordCsvMissingExportHeaderNameForConstantDescription(String dataType) {
-            return recordError("missingExportHeaderNameForConstantDescription", ImmutableMap.of(
+        public void missingExportHeaderNameForConstantDescription(String dataType) {
+            recordError("missingExportHeaderNameForConstantDescription", ImmutableMap.of(
                     "dataType", dataType
             ));
         }
+
+        public void unknownReferenceForCheckerInReferenceColumn(String referenceToValidate, String column, String refType, Set<String> knownReferences) {
+            recordError("unknownReferenceForCheckerInReferenceColumn", ImmutableMap.of(
+                    "referenceToValidate", referenceToValidate,
+                    "column", column,
+                    "refType", refType,
+                    "knownReferences", knownReferences
+            ));
+        }
+
+        public void missingReferenceForCheckerInReferenceColumn(String referenceToValidate, String column, Set<String> knownReferences) {
+            recordError("missingReferenceForCheckerInReferenceColumn", ImmutableMap.of(
+                    "referenceToValidate", referenceToValidate,
+                    "column", column,
+                    "knownReferences", knownReferences
+            ));
+        }
+
+        public void unknownCheckerNameInReferenceColumn(String referenceToValidate, String column, String checkerName, ImmutableSet<String> knownCheckerNames) {
+            recordError("unknownCheckerNameInReferenceColumn", ImmutableMap.of(
+                    "referenceToValidate", referenceToValidate,
+                    "column", column,
+                    "checkerName", checkerName,
+                    "knownCheckerNames", knownCheckerNames
+            ));
+        }
+
+        public void invalidPatternForVariableComponentDateChecker(String dataType, String variable, String component, String pattern) {
+            recordError("invalidPatternForVariableComponentDateChecker", ImmutableMap.of(
+                    "dataType", dataType,
+                    "variable", variable,
+                    "component", component,
+                    "pattern", pattern
+            ));
+        }
+
+        public void invalidPatternForReferenceColumnDateChecker(String referenceToValidate, String column, String pattern) {
+            recordError("invalidPatternForReferenceColumnDateChecker", ImmutableMap.of(
+                    "referenceToValidate", referenceToValidate,
+                    "column", column,
+                    "pattern", pattern
+            ));
+        }
+
+        public void invalidPatternForDateCheckerForValidationRuleInDataType(String validationRuleDescriptionEntryKey, String dataType, String pattern) {
+            recordError("invalidPatternForDateCheckerForValidationRuleInDataType", ImmutableMap.of(
+                    "validationRuleDescriptionEntryKey", validationRuleDescriptionEntryKey,
+                    "dataType", dataType,
+                    "pattern", pattern
+            ));
+        }
+
+        public void invalidPatternForDateCheckerForValidationRuleInReference(String validationRuleDescriptionEntryKey, String reference, String pattern) {
+            recordError("invalidPatternForDateCheckerForValidationRuleInReference", ImmutableMap.of(
+                    "validationRuleDescriptionEntryKey", validationRuleDescriptionEntryKey,
+                    "reference", reference,
+                    "pattern", pattern
+            ));
+        }
+
+        public void invalidDurationForVariableComponentDateChecker(String dataType, String variable, String component, String duration) {
+            recordError("invalidDurationForVariableComponentDateChecker", ImmutableMap.of(
+                    "dataType", dataType,
+                    "variable", variable,
+                    "component", component,
+                    "duration", duration
+            ));
+        }
+
+        public void invalidDurationForReferenceColumnDateChecker(String referenceToValidate, String column, String duration) {
+            recordError("invalidDurationForReferenceColumnDateChecker", ImmutableMap.of(
+                    "referenceToValidate", referenceToValidate,
+                    "column", column,
+                    "duration", duration
+            ));
+        }
+
+        public void invalidDurationForDateCheckerForValidationRuleInDataType(String validationRuleDescriptionEntryKey, String dataType, String duration) {
+            recordError("invalidDurationForDateCheckerForValidationRuleInDataType", ImmutableMap.of(
+                    "validationRuleDescriptionEntryKey", validationRuleDescriptionEntryKey,
+                    "dataType", dataType,
+                    "duration", duration
+            ));
+        }
+
+        public void invalidDurationForDateCheckerForValidationRuleInReference(String validationRuleDescriptionEntryKey, String reference, String duration) {
+            recordError("invalidDurationForDateCheckerForValidationRuleInReference", ImmutableMap.of(
+                    "validationRuleDescriptionEntryKey", validationRuleDescriptionEntryKey,
+                    "reference", reference,
+                    "duration", duration
+            ));
+        }
+        
+        public void invalidPatternForVariableComponentRegularExpressionChecker(String dataType, String variable, String component, String pattern) {
+            recordError("invalidPatternForVariableComponentRegularExpressionChecker", ImmutableMap.of(
+                    "dataType", dataType,
+                    "variable", variable,
+                    "component", component,
+                    "pattern", pattern
+            ));
+        }
+
+        public void invalidPatternForReferenceColumnRegularExpressionChecker(String referenceToValidate, String column, String pattern) {
+            recordError("invalidPatternForReferenceColumnRegularExpressionChecker", ImmutableMap.of(
+                    "referenceToValidate", referenceToValidate,
+                    "column", column,
+                    "pattern", pattern
+            ));
+        }
+
+        public void invalidPatternForRegularExpressionCheckerForValidationRuleInDataType(String validationRuleDescriptionEntryKey, String dataType, String pattern) {
+            recordError("invalidPatternForRegularExpressionCheckerForValidationRuleInDataType", ImmutableMap.of(
+                    "validationRuleDescriptionEntryKey", validationRuleDescriptionEntryKey,
+                    "dataType", dataType,
+                    "pattern", pattern
+            ));
+        }
+
+        public void invalidPatternForRegularExpressionCheckerForValidationRuleInReference(String validationRuleDescriptionEntryKey, String reference, String pattern) {
+            recordError("invalidPatternForRegularExpressionCheckerForValidationRuleInReference", ImmutableMap.of(
+                    "validationRuleDescriptionEntryKey", validationRuleDescriptionEntryKey,
+                    "reference", reference,
+                    "pattern", pattern
+            ));
+        }
     }
 }
diff --git a/src/main/java/fr/inra/oresing/rest/DownloadDatasetQuery.java b/src/main/java/fr/inra/oresing/rest/DownloadDatasetQuery.java
index 3521d45ac1bbaff5740dc86e83f3679821d89f18..bb2e6faf9a1d9ffdeefe4909eaa32e38f119aaac 100644
--- a/src/main/java/fr/inra/oresing/rest/DownloadDatasetQuery.java
+++ b/src/main/java/fr/inra/oresing/rest/DownloadDatasetQuery.java
@@ -1,6 +1,5 @@
 package fr.inra.oresing.rest;
 
-import fr.inra.oresing.checker.CheckerTarget;
 import fr.inra.oresing.checker.DateLineChecker;
 import fr.inra.oresing.model.Application;
 import fr.inra.oresing.model.Configuration;
@@ -159,7 +158,7 @@ public class DownloadDatasetQuery {
         } else if (vck.intervalValues != null && List.of("date", "time", "datetime").contains(vck.type)) {
             if (!Strings.isNullOrEmpty(vck.intervalValues.from) || !Strings.isNullOrEmpty(vck.intervalValues.to)) {
                 DateLineChecker dateLineChecker = new DateLineChecker(
-                        CheckerTarget.getInstance(vck.variableComponentKey, null, null),
+                        vck.variableComponentKey,
                         vck.format, null, null);
                 filters.add(
                         String.format(
diff --git a/src/main/java/fr/inra/oresing/rest/OreSiResources.java b/src/main/java/fr/inra/oresing/rest/OreSiResources.java
index a72d179fe0f0d9374f110bf2db29d9925563408e..93181ce63529dcec484be0dc57cb52c71eaf9657 100644
--- a/src/main/java/fr/inra/oresing/rest/OreSiResources.java
+++ b/src/main/java/fr/inra/oresing/rest/OreSiResources.java
@@ -119,13 +119,13 @@ public class OreSiResources {
             });
         });
         Map<String, ApplicationResult.Reference> references = Maps.transformEntries(application.getConfiguration().getReferences(), (reference, referenceDescription) -> {
-            Map<String, ApplicationResult.Reference.Column> columns = Maps.transformEntries(referenceDescription.getColumns(), (column, columnDescription) -> new ApplicationResult.Reference.Column(column, column, referenceDescription.getKeyColumns().contains(column), null));
+            Map<String, ApplicationResult.Reference.Column> columns = Maps.transformEntries(referenceDescription.doGetStaticColumnDescriptions(), (column, columnDescription) -> new ApplicationResult.Reference.Column(column, column, referenceDescription.getKeyColumns().contains(column), null));
             Set<String> children = childrenPerReferences.get(reference);
             return new ApplicationResult.Reference(reference, reference, children, columns);
         });
         Map<String, ApplicationResult.DataType> dataTypes = Maps.transformEntries(application.getConfiguration().getDataTypes(), (dataType, dataTypeDescription) -> {
             Map<String, ApplicationResult.DataType.Variable> variables = Maps.transformEntries(dataTypeDescription.getData(), (variable, variableDescription) -> {
-                Map<String, ApplicationResult.DataType.Variable.Component> components = Maps.transformEntries(variableDescription.getComponents(), (component, componentDescription) -> {
+                Map<String, ApplicationResult.DataType.Variable.Component> components = Maps.transformEntries(variableDescription.doGetAllComponentDescriptions(), (component, componentDescription) -> {
                     return new ApplicationResult.DataType.Variable.Component(component, component);
                 });
                 Configuration.Chart chartDescription = variableDescription.getChartDescription();
@@ -285,7 +285,7 @@ public class OreSiResources {
                 })
                 .collect(ImmutableSet.toImmutableSet());
         Long totalRows = list.stream().limit(1).map(dataRow -> dataRow.getTotalRows()).findFirst().orElse(-1L);
-        Map<String, Map<String, LineChecker>> checkedFormatVariableComponents = service.getcheckedFormatVariableComponents(nameOrId, dataType, locale);
+        Map<String, Map<String, LineChecker>> checkedFormatVariableComponents = service.getcheckedFormatVariableComponents(nameOrId, dataType);
         Map<String, Map<String, Map<String, String>>> entitiesTranslation = service.getEntitiesTranslation(nameOrId, locale, dataType, checkedFormatVariableComponents);
         return ResponseEntity.ok(new GetDataResult(variables, list, totalRows, checkedFormatVariableComponents, entitiesTranslation));
     }
diff --git a/src/main/java/fr/inra/oresing/rest/OreSiService.java b/src/main/java/fr/inra/oresing/rest/OreSiService.java
index 20cb24524ed3505410768b83ade9c0b990f3172a..7c74ceacf2bc6b472095869c321e3773538cb38f 100644
--- a/src/main/java/fr/inra/oresing/rest/OreSiService.java
+++ b/src/main/java/fr/inra/oresing/rest/OreSiService.java
@@ -1,23 +1,68 @@
 package fr.inra.oresing.rest;
 
-import com.google.common.base.*;
-import com.google.common.collect.*;
+import com.google.common.base.Charsets;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMultiset;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Maps;
+import com.google.common.collect.MoreCollectors;
+import com.google.common.collect.Ordering;
+import com.google.common.collect.SetMultimap;
+import com.google.common.collect.Sets;
 import com.google.common.primitives.Ints;
 import fr.inra.oresing.OreSiTechnicalException;
-import fr.inra.oresing.checker.*;
-import fr.inra.oresing.groovy.CommonExpression;
+import fr.inra.oresing.checker.CheckerFactory;
+import fr.inra.oresing.checker.DateLineChecker;
+import fr.inra.oresing.checker.FloatChecker;
+import fr.inra.oresing.checker.IntegerChecker;
+import fr.inra.oresing.checker.InvalidDatasetContentException;
+import fr.inra.oresing.checker.LineChecker;
+import fr.inra.oresing.checker.ReferenceLineChecker;
+import fr.inra.oresing.checker.ReferenceLineCheckerConfiguration;
 import fr.inra.oresing.groovy.Expression;
 import fr.inra.oresing.groovy.GroovyContextHelper;
 import fr.inra.oresing.groovy.StringGroovyExpression;
-import fr.inra.oresing.model.*;
+import fr.inra.oresing.model.Application;
+import fr.inra.oresing.model.Authorization;
+import fr.inra.oresing.model.BinaryFile;
+import fr.inra.oresing.model.BinaryFileDataset;
+import fr.inra.oresing.model.Configuration;
+import fr.inra.oresing.model.Data;
+import fr.inra.oresing.model.Datum;
+import fr.inra.oresing.model.LocalDateTimeRange;
+import fr.inra.oresing.model.ReferenceColumn;
+import fr.inra.oresing.model.ReferenceColumnSingleValue;
+import fr.inra.oresing.model.ReferenceColumnValue;
+import fr.inra.oresing.model.ReferenceDatum;
+import fr.inra.oresing.model.ReferenceValue;
+import fr.inra.oresing.model.VariableComponentKey;
 import fr.inra.oresing.model.chart.OreSiSynthesis;
-import fr.inra.oresing.persistence.*;
+import fr.inra.oresing.persistence.AuthenticationService;
+import fr.inra.oresing.persistence.BinaryFileInfos;
+import fr.inra.oresing.persistence.DataRepository;
+import fr.inra.oresing.persistence.DataRow;
+import fr.inra.oresing.persistence.DataSynthesisRepository;
+import fr.inra.oresing.persistence.Ltree;
+import fr.inra.oresing.persistence.OreSiRepository;
+import fr.inra.oresing.persistence.ReferenceValueRepository;
+import fr.inra.oresing.persistence.SqlPolicy;
+import fr.inra.oresing.persistence.SqlSchema;
+import fr.inra.oresing.persistence.SqlSchemaForApplication;
+import fr.inra.oresing.persistence.SqlService;
 import fr.inra.oresing.persistence.roles.OreSiRightOnApplicationRole;
 import fr.inra.oresing.persistence.roles.OreSiUserRole;
 import fr.inra.oresing.rest.validationcheckresults.DateValidationCheckResult;
 import fr.inra.oresing.rest.validationcheckresults.DefaultValidationCheckResult;
 import fr.inra.oresing.rest.validationcheckresults.ReferenceValidationCheckResult;
-import fr.inra.oresing.transformer.TransformerFactory;
 import lombok.Value;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.csv.CSVFormat;
@@ -43,12 +88,28 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringWriter;
 import java.time.Duration;
-import java.time.*;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.UUID;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.Consumer;
 import java.util.function.Function;
@@ -71,9 +132,6 @@ public class OreSiService {
     @Autowired
     private AuthenticationService authenticationService;
 
-    @Autowired
-    private TransformerFactory transformerFactory;
-
     @Autowired
     private CheckerFactory checkerFactory;
 
@@ -95,6 +153,9 @@ public class OreSiService {
     @Autowired
     private GroovyContextHelper groovyContextHelper;
 
+    @Autowired
+    private ReferenceService referenceService;
+
     /**
      * @deprecated utiliser directement {@link Ltree#escapeToLabel(String)}
      */
@@ -311,116 +372,12 @@ public class OreSiService {
     }
 
     public UUID addReference(Application app, String refType, MultipartFile file) throws IOException {
-        ReferenceValueRepository referenceValueRepository = repo.getRepository(app).referenceValue();
         authenticationService.setRoleForClient();
         UUID fileId = storeFile(app, file, "");
-        final ReferenceImporterContext referenceImporterContext = getReferenceImporterContext(app, refType);
-        ReferenceImporter referenceImporter = new ReferenceImporter(referenceImporterContext) {
-            @Override
-            void storeAll(Stream<ReferenceValue> stream) {
-                final List<UUID> uuids = referenceValueRepository.storeAll(stream);
-                referenceValueRepository.updateConstraintForeignReferences(uuids);
-            }
-        };
-        referenceImporter.doImport(file, fileId);
+        referenceService.addReference(app, refType, file, fileId);
         return fileId;
     }
 
-    private ReferenceImporterContext getReferenceImporterContext(Application app, String refType) {
-        ReferenceValueRepository referenceValueRepository = repo.getRepository(app).referenceValue();
-        Configuration conf = app.getConfiguration();
-        ImmutableSet<LineChecker> lineCheckers = checkerFactory.getReferenceValidationLineCheckers(app, refType);
-        final ImmutableMap<Ltree, UUID> storedReferences = referenceValueRepository.getReferenceIdPerKeys(refType);
-
-        ImmutableMap<ReferenceColumn, Multiplicity> multiplicityPerColumns = lineCheckers.stream()
-                .filter(lineChecker -> lineChecker instanceof ReferenceLineChecker)
-                .map(lineChecker -> (ReferenceLineChecker) lineChecker)
-                .collect(ImmutableMap.toImmutableMap(referenceLineChecker -> (ReferenceColumn) referenceLineChecker.getTarget().getTarget(), referenceLineChecker -> referenceLineChecker.getConfiguration().getMultiplicity()));
-
-        Configuration.ReferenceDescription referenceDescription = conf.getReferences().get(refType);
-
-        Stream<ReferenceImporterContext.Column> staticColumns = referenceDescription.getColumns().entrySet().stream()
-                .map(entry -> {
-                    ReferenceColumn referenceColumn = new ReferenceColumn(entry.getKey());
-                    Multiplicity multiplicity = multiplicityPerColumns.getOrDefault(referenceColumn, Multiplicity.ONE);
-                    ColumnPresenceConstraint presenceConstraint = MoreObjects.firstNonNull(entry.getValue(), new Configuration.ReferenceColumnDescription()).getPresenceConstraint();
-                    ReferenceImporterContext.Column column;
-                    if (multiplicity == Multiplicity.ONE) {
-                        column = new ReferenceImporterContext.OneValueStaticColumn(referenceColumn, presenceConstraint);
-                    } else if (multiplicity == Multiplicity.MANY) {
-                        column = new ReferenceImporterContext.ManyValuesStaticColumn(referenceColumn, presenceConstraint);
-                    } else {
-                        throw new IllegalStateException("multiplicity = " + multiplicity);
-                    }
-                    return column;
-                });
-
-        Stream<ReferenceImporterContext.Column> dynamicColumns = referenceDescription.getDynamicColumns().entrySet().stream()
-                .flatMap(entry -> {
-                    ReferenceColumn referenceColumn = new ReferenceColumn(entry.getKey());
-                    Configuration.ReferenceDynamicColumnDescription value = entry.getValue();
-                    String reference = value.getReference();
-                    ReferenceColumn referenceColumnToLookForHeader = new ReferenceColumn(value.getReferenceColumnToLookForHeader());
-                    List<ReferenceValue> allByReferenceType = referenceValueRepository.findAllByReferenceType(reference);
-                    Stream<ReferenceImporterContext.Column> valuedDynamicColumns = allByReferenceType.stream()
-                            .map(referenceValue -> {
-                                ReferenceDatum referenceDatum = referenceValue.getRefValues();
-                                Ltree hierarchicalKey = referenceValue.getHierarchicalKey();
-                                ReferenceColumnSingleValue referenceColumnValue = (ReferenceColumnSingleValue) referenceDatum.get(referenceColumnToLookForHeader);
-                                String header = referenceColumnValue.getValue();
-                                String fullHeader = value.getHeaderPrefix() + header;
-                                ColumnPresenceConstraint presenceConstraint = value.getPresenceConstraint();
-                                return new ReferenceImporterContext.DynamicColumn(
-                                        referenceColumn,
-                                        fullHeader,
-                                        presenceConstraint,
-                                        hierarchicalKey,
-                                        Map.entry(reference, referenceValue.getId())
-                                );
-                            });
-                    return valuedDynamicColumns;
-                });
-
-        ImmutableMap<String, ReferenceImporterContext.Column> columns =
-                Stream.concat(staticColumns, dynamicColumns)
-                        .collect(ImmutableMap.toImmutableMap(
-                                ReferenceImporterContext.Column::getExpectedHeader,
-                                Function.identity()
-                        ));
-        final ReferenceImporterContext.Constants constants = new ReferenceImporterContext.Constants(
-                app.getId(),
-                conf,
-                refType,
-                repo.getRepository(app).referenceValue());
-    /*    final Set<Object> patternColumns = constants.getPatternColumns()
-                .map(pt -> pt.values())
-                .flatMap(Collection::stream)
-                .stream().collect(Collectors.toSet());*/
-        Set<String> patternColumns = constants.getPatternColumns()
-                .map(m->m.values().stream().flatMap(List::stream).collect(Collectors.toSet()))
-                .orElseGet(HashSet::new);
-        final Map<String, String> referenceToColumnName = lineCheckers.stream()
-                .filter(ReferenceLineChecker.class::isInstance)
-                .map(ReferenceLineChecker.class::cast)
-                .collect(Collectors.toMap(ReferenceLineChecker::getRefType, referenceLineChecker -> ((ReferenceColumn) referenceLineChecker.getTarget().getTarget()).getColumn()));
-        final Map<String, Map<String, Map<String, String>>> displayByReferenceAndNaturalKey =
-                lineCheckers.stream()
-                .filter(ReferenceLineChecker.class::isInstance)
-                .map(ReferenceLineChecker.class::cast)
-                .map(ReferenceLineChecker::getRefType)
-                .filter(rt -> patternColumns.contains(rt))
-                .collect(Collectors.toMap(ref -> referenceToColumnName.getOrDefault(ref, ref), ref -> repo.getRepository(app).referenceValue().findDisplayByNaturalKey(ref)));
-        final ReferenceImporterContext referenceImporterContext =
-                new ReferenceImporterContext(
-                        constants,
-                        lineCheckers,
-                        storedReferences,
-                        columns,
-                        displayByReferenceAndNaturalKey
-                );
-        return referenceImporterContext;
-    }
-
     HierarchicalReferenceAsTree getHierarchicalReferenceAsTree(Application application, String lowestLevelReference) {
         ReferenceValueRepository referenceValueRepository = repo.getRepository(application).referenceValue();
         Configuration.CompositeReferenceDescription compositeReferenceDescription = application
@@ -673,7 +630,7 @@ public class OreSiService {
         DateLineChecker timeScopeDateLineChecker = lineCheckers.stream()
                 .filter(lineChecker -> lineChecker instanceof DateLineChecker)
                 .map(lineChecker -> (DateLineChecker) lineChecker)
-                .filter(dateLineChecker -> dateLineChecker.getTarget().getTarget().equals(dataTypeDescription.getAuthorization().getTimeScope()))
+                .filter(dateLineChecker -> dateLineChecker.getTarget().equals(dataTypeDescription.getAuthorization().getTimeScope()))
                 .collect(MoreCollectors.onlyElement());
 
 
@@ -687,16 +644,16 @@ public class OreSiService {
                 ValidationCheckResult validationCheckResult = lineChecker.check(datum);
                 if (validationCheckResult.isSuccess()) {
                     if (validationCheckResult instanceof DateValidationCheckResult) {
-                        VariableComponentKey variableComponentKey = (VariableComponentKey) ((DateValidationCheckResult) validationCheckResult).getTarget().getTarget();
+                        VariableComponentKey variableComponentKey = (VariableComponentKey) ((DateValidationCheckResult) validationCheckResult).getTarget();
                         dateValidationCheckResultImmutableMap.put(variableComponentKey, (DateValidationCheckResult) validationCheckResult);
                     }
                     if (validationCheckResult instanceof ReferenceValidationCheckResult) {
                         ReferenceLineCheckerConfiguration configuration = (ReferenceLineCheckerConfiguration) lineChecker.getConfiguration();
-                        if (configuration.getGroovy() != null) {
-                            datum.put((VariableComponentKey) ((ReferenceValidationCheckResult) validationCheckResult).getTarget().getTarget(), ((ReferenceValidationCheckResult) validationCheckResult).getMatchedReferenceHierarchicalKey().getSql());
+                        if (configuration.getTransformation().getGroovy() != null) {
+                            datum.put((VariableComponentKey) ((ReferenceValidationCheckResult) validationCheckResult).getTarget(), ((ReferenceValidationCheckResult) validationCheckResult).getMatchedReferenceHierarchicalKey().getSql());
                         }
                         ReferenceValidationCheckResult referenceValidationCheckResult = (ReferenceValidationCheckResult) validationCheckResult;
-                        VariableComponentKey variableComponentKey = (VariableComponentKey) referenceValidationCheckResult.getTarget().getTarget();
+                        VariableComponentKey variableComponentKey = (VariableComponentKey) referenceValidationCheckResult.getTarget();
                         UUID referenceId = referenceValidationCheckResult.getMatchedReferenceId();
                         refsLinkedTo.put(variableComponentKey, referenceId);
                     }
@@ -826,41 +783,13 @@ public class OreSiService {
      * Si des valeurs par défaut ont été définies dans le YAML, la donnée doit les avoir.
      */
     private Function<RowWithData, RowWithData> buildReplaceMissingValuesByDefaultValuesFn(Application app, String dataType, Map<String, String> requiredAuthorizations) {
-        ReferenceValueRepository referenceValueRepository = repo.getRepository(app).referenceValue();
-        Configuration.DataTypeDescription dataTypeDescription = app.getConfiguration().getDataTypes().get(dataType);
-        ImmutableMap<VariableComponentKey, Expression<String>> defaultValueExpressions = getDefaultValueExpressions(dataTypeDescription, requiredAuthorizations);
-        Map<String, Configuration.ColumnDescription> data = dataTypeDescription.getData();
-        Map<VariableComponentKey, Function<Datum, String>> defaultValueFns = new LinkedHashMap<>();
-        Set<VariableComponentKey> replaceEnabled = new LinkedHashSet<>();
-        for (Map.Entry<VariableComponentKey, Expression<String>> entry : defaultValueExpressions.entrySet()) {
-            VariableComponentKey variableComponentKey = entry.getKey();
-            Expression<String> expression = entry.getValue();
-            Configuration.VariableComponentDescriptionConfiguration params = Optional.ofNullable(data)
-                    .map(columnDescriptionLinkedHashMap -> columnDescriptionLinkedHashMap.get(variableComponentKey.getVariable()))
-                    .map(columnDescription -> columnDescription.getComponents())
-                    .map(variableComponentDescriptionLinkedHashMap -> variableComponentDescriptionLinkedHashMap.get(variableComponentKey.getComponent()))
-                    .map(variableComponentDescription -> variableComponentDescription.getParams())
-                    .orElseGet(Configuration.VariableComponentDescriptionConfiguration::new);
-            Set<String> configurationReferences = params.getReferences();
-            ImmutableMap<String, Object> contextForExpression = groovyContextHelper.getGroovyContextForReferences(referenceValueRepository, configurationReferences);
-            Preconditions.checkState(params.getDatatypes().isEmpty(), "à ce stade, on ne gère pas la chargement de données");
-            Function<Datum, String> computeDefaultValueFn = datum -> {
-                ImmutableMap<String, Object> evaluationContext = ImmutableMap.<String, Object>builder()
-                        .putAll(contextForExpression)
-                        .putAll(datum.getEvaluationContext())
-                        .build();
-                String evaluate = expression.evaluate(evaluationContext);
-                return evaluate;
-            };
-            defaultValueFns.put(variableComponentKey, computeDefaultValueFn);
-            if (params.isReplace()) {
-                replaceEnabled.add(variableComponentKey);
-            }
-        }
+        ComputedValuesContext computedValuesContext = getComputedValuesContext(app, dataType, requiredAuthorizations);
+        ImmutableMap<VariableComponentKey, Function<Datum, String>> defaultValueFns = computedValuesContext.getDefaultValueFns();
+        ImmutableSet<VariableComponentKey> replaceEnabled = computedValuesContext.getReplaceEnabled();
         return rowWithData -> {
             Map<VariableComponentKey, String> rowWithDefaults = new LinkedHashMap<>();
             Map<VariableComponentKey, String> rowWithValues = new LinkedHashMap<>(rowWithData.getDatum().asMap());
-            defaultValueFns.entrySet().stream()
+            defaultValueFns.entrySet()
                     .forEach(variableComponentKeyExpressionEntry -> {
                         VariableComponentKey variableComponentKey = variableComponentKeyExpressionEntry.getKey();
                         Function<Datum, String> computeDefaultValueFn = variableComponentKeyExpressionEntry.getValue();
@@ -1108,48 +1037,74 @@ public class OreSiService {
         }
     }
 
-    private ImmutableMap<VariableComponentKey, Expression<String>> getDefaultValueExpressions(Configuration.DataTypeDescription dataTypeDescription, Map<String, String> requiredAuthorizations) {
-        ImmutableMap.Builder<VariableComponentKey, Expression<String>> defaultValueExpressionsBuilder = ImmutableMap.builder();
-
-        List<String> variableComponentsFromRepository = new LinkedList<>();
+    private ComputedValuesContext getComputedValuesContext(Application app, String dataType, Map<String, String> requiredAuthorizations) {
+        Configuration.DataTypeDescription dataTypeDescription = app.getConfiguration().getDataTypes().get(dataType);
+        ImmutableMap.Builder<VariableComponentKey, Function<Datum, String>> defaultValueFnsBuilder = ImmutableMap.builder();
+        ImmutableSet.Builder<VariableComponentKey> replaceEnabledBuilder = ImmutableSet.builder();
+        Set<VariableComponentKey> variableComponentsFromRepository = new LinkedHashSet<>();
         if (requiredAuthorizations != null) {
             for (Map.Entry<String, String> entry : requiredAuthorizations.entrySet()) {
                 Configuration.AuthorizationScopeDescription authorizationScopeDescription = dataTypeDescription.getAuthorization().getAuthorizationScopes().get(entry.getKey());
                 VariableComponentKey variableComponentKey = authorizationScopeDescription.getVariableComponentKey();
                 String value = entry.getValue();
-                defaultValueExpressionsBuilder.put(variableComponentKey, StringGroovyExpression.forExpression("\"" + value + "\""));
-                variableComponentsFromRepository.add(variableComponentKey.getId());
+                defaultValueFnsBuilder.put(variableComponentKey, datum -> value);
+                variableComponentsFromRepository.add(variableComponentKey);
             }
         }
-        for (Map.Entry<String, Configuration.ColumnDescription> variableEntry : dataTypeDescription.getData().entrySet()) {
+        for (Map.Entry<String, Configuration.VariableDescription> variableEntry : dataTypeDescription.getData().entrySet()) {
             String variable = variableEntry.getKey();
-            Configuration.ColumnDescription variableDescription = variableEntry.getValue();
-            for (Map.Entry<String, Configuration.VariableComponentDescription> componentEntry : variableDescription.getComponents().entrySet()) {
+            Configuration.VariableDescription variableDescription = variableEntry.getValue();
+            for (Map.Entry<String, Configuration.VariableComponentWithDefaultValueDescription> componentEntry : variableDescription.getComponents().entrySet()) {
                 String component = componentEntry.getKey();
-                Configuration.VariableComponentDescription componentDescription = componentEntry.getValue();
+                Configuration.VariableComponentWithDefaultValueDescription componentDescription = componentEntry.getValue();
                 VariableComponentKey variableComponentKey = new VariableComponentKey(variable, component);
-                if (variableComponentsFromRepository.contains(variableComponentKey.getId())) {
+                if (variableComponentsFromRepository.contains(variableComponentKey)) {
                     continue;
                 }
-                Expression<String> defaultValueExpression;
-                if (componentDescription == null) {
-                    defaultValueExpression = CommonExpression.EMPTY_STRING;
-                } else {
-                    String defaultValue = componentDescription.getDefaultValue();
-                    if (StringUtils.isEmpty(defaultValue)) {
-                        defaultValueExpression = CommonExpression.EMPTY_STRING;
-                    } else {
-                        defaultValueExpression = StringGroovyExpression.forExpression(defaultValue);
-                    }
+                Optional.ofNullable(componentDescription)
+                        .map(Configuration.VariableComponentWithDefaultValueDescription::getDefaultValue)
+                        .map(defaultValueConfiguration -> getEvaluateGroovyWithContextFunction(app, defaultValueConfiguration))
+                        .ifPresent(computeDefaultValueFn -> defaultValueFnsBuilder.put(variableComponentKey, computeDefaultValueFn));
+            }
+            for (Map.Entry<String, Configuration.ComputedVariableComponentDescription> computedComponentEntry : variableDescription.getComputedComponents().entrySet()) {
+                String component = computedComponentEntry.getKey();
+                Configuration.ComputedVariableComponentDescription componentDescription = computedComponentEntry.getValue();
+                VariableComponentKey variableComponentKey = new VariableComponentKey(variable, component);
+                if (variableComponentsFromRepository.contains(variableComponentKey)) {
+                    continue;
                 }
-                defaultValueExpressionsBuilder.put(variableComponentKey, defaultValueExpression);
+                Configuration.GroovyConfiguration computation = Optional.ofNullable(componentDescription)
+                        .map(Configuration.ComputedVariableComponentDescription::getComputation)
+                        .orElseThrow();
+                Function<Datum, String> computeDefaultValueFn = getEvaluateGroovyWithContextFunction(app, computation);
+                defaultValueFnsBuilder.put(variableComponentKey, computeDefaultValueFn);
+                replaceEnabledBuilder.add(variableComponentKey);
             }
         }
-        ImmutableMap<VariableComponentKey, Expression<String>> defaultValueExpressions = defaultValueExpressionsBuilder.build();
-        if (log.isDebugEnabled()) {
-            //log.debug("expressions des valeurs par défaut détectées pour " + dataTypeDescription + " = " + defaultValueExpressions);
-        }
-        return defaultValueExpressions;
+        return new ComputedValuesContext(defaultValueFnsBuilder.build(), replaceEnabledBuilder.build());
+    }
+
+    private Function<Datum, String> getEvaluateGroovyWithContextFunction(Application app, Configuration.GroovyConfiguration computation) {
+        ReferenceValueRepository referenceValueRepository = repo.getRepository(app).referenceValue();
+        Expression<String> defaultValueExpression = StringGroovyExpression.forExpression(computation.getExpression());
+        Set<String> configurationReferences = computation.getReferences();
+        ImmutableMap<String, Object> contextForExpression = groovyContextHelper.getGroovyContextForReferences(referenceValueRepository, configurationReferences);
+        Preconditions.checkState(computation.getDatatypes().isEmpty(), "à ce stade, on ne gère pas la chargement de données");
+        Function<Datum, String> computeDefaultValueFn = datum -> {
+            ImmutableMap<String, Object> evaluationContext = ImmutableMap.<String, Object>builder()
+                    .putAll(contextForExpression)
+                    .putAll(datum.getEvaluationContext())
+                    .build();
+            String evaluate = defaultValueExpression.evaluate(evaluationContext);
+            return evaluate;
+        };
+        return computeDefaultValueFn;
+    }
+
+    @Value
+    private static class ComputedValuesContext {
+        ImmutableMap<VariableComponentKey, Function<Datum, String>> defaultValueFns;
+        ImmutableSet<VariableComponentKey> replaceEnabled;
     }
 
     public String getDataCsv(DownloadDatasetQuery downloadDatasetQuery, String nameOrId, String dataType, String locale) {
@@ -1169,7 +1124,7 @@ public class OreSiService {
         List<String> dateLineCheckerVariableComponentKeyIdList = checkerFactory.getLineCheckers(getApplication(nameOrId), dataType).stream()
                 .filter(ch -> ch instanceof DateLineChecker)
                 .map(ch -> (DateLineChecker) ch)
-                .map(ch -> ((VariableComponentKey) ch.getTarget().getTarget()).getId())
+                .map(ch -> ((VariableComponentKey) ch.getTarget()).getId())
                 .collect(Collectors.toList());
         if (CollectionUtils.isEmpty(downloadDatasetQueryCopy.getVariableComponentOrderBy())) {
             columns = allColumns;
@@ -1226,8 +1181,8 @@ public class OreSiService {
                 .build();
     }
 
-    public Map<String, Map<String, LineChecker>> getcheckedFormatVariableComponents(String nameOrId, String dataType, Locale locale) {
-        return checkerFactory.getLineCheckers(getApplication(nameOrId), dataType, locale)
+    public Map<String, Map<String, LineChecker>> getcheckedFormatVariableComponents(String nameOrId, String dataType) {
+        return checkerFactory.getLineCheckers(getApplication(nameOrId), dataType)
                 .stream()
                 .filter(c -> (c instanceof DateLineChecker) || (c instanceof IntegerChecker) || (c instanceof FloatChecker) || (c instanceof ReferenceLineChecker))
                 .collect(
@@ -1237,13 +1192,13 @@ public class OreSiService {
                                         c -> {
                                             VariableComponentKey vc;
                                             if (c instanceof DateLineChecker) {
-                                                vc = (VariableComponentKey) ((DateLineChecker) c).getTarget().getTarget();
+                                                vc = (VariableComponentKey) ((DateLineChecker) c).getTarget();
                                             } else if (c instanceof IntegerChecker) {
-                                                vc = (VariableComponentKey) ((IntegerChecker) c).getTarget().getTarget();
+                                                vc = (VariableComponentKey) ((IntegerChecker) c).getTarget();
                                             } else if (c instanceof FloatChecker) {
-                                                vc = (VariableComponentKey) ((FloatChecker) c).getTarget().getTarget();
+                                                vc = (VariableComponentKey) ((FloatChecker) c).getTarget();
                                             } else {
-                                                vc = (VariableComponentKey) ((ReferenceLineChecker) c).getTarget().getTarget();
+                                                vc = (VariableComponentKey) ((ReferenceLineChecker) c).getTarget();
                                             }
                                             return vc.getId();
                                         },
@@ -1278,50 +1233,12 @@ public class OreSiService {
         return repo.application().tryFindApplication(nameOrId);
     }
 
-    /**
-     * @param nameOrId l'id de l'application
-     * @param refType  le type du referenciel
-     * @param params   les parametres query de la requete http. 'ANY' est utiliser pour dire n'importe quelle colonne
-     * @return la liste qui satisfont aux criteres
-     */
     public List<ReferenceValue> findReference(String nameOrId, String refType, MultiValueMap<String, String> params) {
-        authenticationService.setRoleForClient();
-        List<ReferenceValue> list = repo.getRepository(nameOrId).referenceValue().findAllByReferenceType(refType, params);
-        return list;
+        return referenceService.findReference(nameOrId, refType, params);
     }
 
     public String getReferenceValuesCsv(String applicationNameOrId, String referenceType, MultiValueMap<String, String> params) {
-        Application application = getApplication(applicationNameOrId);
-        ReferenceImporterContext referenceImporterContext = getReferenceImporterContext(application, referenceType);
-        ReferenceValueRepository referenceValueRepository = repo.getRepository(applicationNameOrId).referenceValue();
-        Stream<ImmutableList<String>> recordsStream = referenceValueRepository.findAllByReferenceType(referenceType, params).stream()
-                .map(ReferenceValue::getRefValues)
-                .map(referenceDatum -> {
-                    ImmutableList<String> rowAsRecord = referenceImporterContext.getExpectedHeaders().stream()
-                            .map(header -> referenceImporterContext.getCsvCellContent(referenceDatum, header))
-                            .collect(ImmutableList.toImmutableList());
-                    return rowAsRecord;
-                });
-        ImmutableSet<String> headers = referenceImporterContext.getExpectedHeaders();
-        CSVFormat csvFormat = CSVFormat.DEFAULT
-                .withDelimiter(referenceImporterContext.getCsvSeparator())
-                .withSkipHeaderRecord();
-        StringWriter out = new StringWriter();
-        try {
-            CSVPrinter csvPrinter = new CSVPrinter(out, csvFormat);
-            csvPrinter.printRecord(headers);
-            recordsStream.forEach(record -> {
-                try {
-                    csvPrinter.printRecord(record);
-                } catch (IOException e) {
-                    throw new OreSiTechnicalException("erreur lors de la génération du fichier CSV", e);
-                }
-            });
-        } catch (IOException e) {
-            throw new OreSiTechnicalException("erreur lors de la génération du fichier CSV", e);
-        }
-        String csv = out.toString();
-        return csv;
+        return referenceService.getReferenceValuesCsv(applicationNameOrId, referenceType, params);
     }
 
     public Optional<BinaryFile> getFile(String name, UUID id) {
@@ -1510,8 +1427,8 @@ public class OreSiService {
             }
         }
 
-        private Stream<VariableComponentKey> getVariableComponentKeys(Map.Entry<String, Configuration.ColumnDescription> entry) {
-            return entry.getValue().getComponents().keySet().stream()
+        private Stream<VariableComponentKey> getVariableComponentKeys(Map.Entry<String, Configuration.VariableDescription> entry) {
+            return entry.getValue().doGetAllComponents().stream()
                     .map(componentName -> new VariableComponentKey(entry.getKey(), componentName));
         }
 
diff --git a/src/main/java/fr/inra/oresing/rest/ReferenceImporter.java b/src/main/java/fr/inra/oresing/rest/ReferenceImporter.java
index 37ad672228d691d9625d1f39a94af74f1234ad63..98369d9a93cf2c9377f1b9302f8dfa81c48a039e 100644
--- a/src/main/java/fr/inra/oresing/rest/ReferenceImporter.java
+++ b/src/main/java/fr/inra/oresing/rest/ReferenceImporter.java
@@ -20,6 +20,7 @@ import fr.inra.oresing.checker.DateLineChecker;
 import fr.inra.oresing.checker.InvalidDatasetContentException;
 import fr.inra.oresing.checker.Multiplicity;
 import fr.inra.oresing.checker.ReferenceLineChecker;
+import fr.inra.oresing.model.ComputedValueUsage;
 import fr.inra.oresing.model.ReferenceColumn;
 import fr.inra.oresing.model.ReferenceColumnMultipleValue;
 import fr.inra.oresing.model.ReferenceColumnSingleValue;
@@ -44,7 +45,18 @@ import org.springframework.web.multipart.MultipartFile;
 import java.io.IOException;
 import java.io.InputStream;
 import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.UUID;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -97,7 +109,9 @@ abstract class ReferenceImporter {
             checkHeader(columns, Ints.checkedCast(headerRow.getRecordNumber()));
             Stream<CSVRecord> csvRecordsStream = Streams.stream(csvParser);
             Function<CSVRecord, RowWithReferenceDatum> csvRecordToReferenceDatumFn = csvRecord -> csvRecordToRowWithReferenceDatum(columns, csvRecord);
-            final Stream<RowWithReferenceDatum> recordStreamBeforePreloading = csvRecordsStream.map(csvRecordToReferenceDatumFn);
+            final Stream<RowWithReferenceDatum> recordStreamBeforePreloading =
+                    csvRecordsStream.map(csvRecordToReferenceDatumFn)
+                            .map(this::computeComputedColumns);
             final Stream<RowWithReferenceDatum> recordStream = recursionStrategy.firstPass(recordStreamBeforePreloading);
             Stream<ReferenceValue> referenceValuesStream = recordStream
                     .map(this::check)
@@ -120,6 +134,28 @@ abstract class ReferenceImporter {
         InvalidDatasetContentException.checkErrorsIsEmpty(allErrors);
     }
 
+    private RowWithReferenceDatum computeComputedColumns(RowWithReferenceDatum rowWithReferenceDatum) {
+        ReferenceDatum rowWithDefaults = new ReferenceDatum();
+        ReferenceDatum rowWithValues = ReferenceDatum.copyOf(rowWithReferenceDatum.getReferenceDatum());
+        referenceImporterContext.getColumns().stream()
+                .filter(column -> column.getComputedValueUsage() != ComputedValueUsage.NOT_COMPUTED)
+                .forEach(column -> {
+                    ReferenceColumn referenceColumn = column.getReferenceColumn();
+                    Optional<ReferenceColumnValue> evaluate = column.computeValue(rowWithReferenceDatum.getReferenceDatum());
+                    evaluate.ifPresent(presentEvaluate -> {
+                        if (column.getComputedValueUsage() == ComputedValueUsage.USE_COMPUTED_VALUE) {
+                            rowWithValues.put(referenceColumn, presentEvaluate);
+                        } else if (column.getComputedValueUsage() == ComputedValueUsage.USE_COMPUTED_AS_DEFAULT_VALUE){
+                            rowWithDefaults.put(referenceColumn, presentEvaluate);
+                        } else {
+                            throw new IllegalArgumentException("on ne sait comment utiliser la valeur calculée de " + referenceColumn + " → " + column.getComputedValueUsage());
+                        }
+                    });
+        });
+        rowWithDefaults.putAll(rowWithValues);
+        return new RowWithReferenceDatum(rowWithReferenceDatum.getLineNumber(), rowWithDefaults, rowWithReferenceDatum.getRefsLinkedTo());
+    }
+
     private void checkHeader(ImmutableList<String> columns, int headerLineNumber) {
         ImmutableSet<String> expectedHeaders = referenceImporterContext.getExpectedHeaders();
         ImmutableSet<String> mandatoryHeaders = referenceImporterContext.getMandatoryHeaders();
@@ -201,7 +237,7 @@ abstract class ReferenceImporter {
                         .filter(DateValidationCheckResult.class::isInstance)
                         .map(DateValidationCheckResult.class::cast)
                         .forEach(dateValidationCheckResult -> {
-                            ReferenceColumn referenceColumn = (ReferenceColumn) dateValidationCheckResult.getTarget().getTarget();
+                            ReferenceColumn referenceColumn = (ReferenceColumn) dateValidationCheckResult.getTarget();
                             ReferenceColumnValue referenceColumnRawValue = referenceDatumBeforeChecking.get(referenceColumn);
                             ReferenceColumnValue valueToStoreInDatabase = referenceColumnRawValue
                                     .transform(rawValue ->
@@ -211,7 +247,7 @@ abstract class ReferenceImporter {
                         });
             } else if (lineChecker instanceof ReferenceLineChecker) {
                 ReferenceLineChecker referenceLineChecker = (ReferenceLineChecker) lineChecker;
-                ReferenceColumn referenceColumn = (ReferenceColumn) referenceLineChecker.getTarget().getTarget();
+                ReferenceColumn referenceColumn = (ReferenceColumn) referenceLineChecker.getTarget();
                 SetMultimap<ReferenceColumn, String> rawValueReplacedByKeys = HashMultimap.create();
                 String reference = referenceLineChecker.getRefType();
                 validationCheckResults.stream()
diff --git a/src/main/java/fr/inra/oresing/rest/ReferenceImporterContext.java b/src/main/java/fr/inra/oresing/rest/ReferenceImporterContext.java
index 9bf8885d6771803b2df07135a93defcb83febbb4..7be81fc9a0192b4898e8f03a2b8349539c814f60 100644
--- a/src/main/java/fr/inra/oresing/rest/ReferenceImporterContext.java
+++ b/src/main/java/fr/inra/oresing/rest/ReferenceImporterContext.java
@@ -15,6 +15,7 @@ import fr.inra.oresing.persistence.ReferenceValueRepository;
 import lombok.AllArgsConstructor;
 
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -37,7 +38,8 @@ public class ReferenceImporterContext {
      */
     private final ImmutableMap<Ltree, UUID> storedReferences;
 
-    private final ImmutableMap<String, Column> columnsPerHeader;
+    private final ImmutableSet<Column> columns;
+
     Map<String, Map<String, Map<String, String>>> displayByReferenceAndNaturalKey;
 
     public String getDisplayByReferenceAndNaturalKey(String referencedColumn, String naturalKey, String locale){
@@ -152,24 +154,42 @@ public class ReferenceImporterContext {
         return Optional.ofNullable(storedReferences.get(hierarchicalKey));
     }
 
+    /**
+     * @deprecated ne devrait pas être exposé
+     */
+    @Deprecated
+    public ImmutableSet<Column> getColumns() {
+        return columns;
+    }
+
+    private ImmutableMap<String, Column> getExpectedColumnsPerHeaders() {
+        ImmutableMap<String, ReferenceImporterContext.Column> expectedColumnsPerHeaders = columns.stream()
+                .filter(Column::isExpected)
+                .collect(ImmutableMap.toImmutableMap(
+                        ReferenceImporterContext.Column::getExpectedHeader,
+                        Function.identity()
+                ));
+        return expectedColumnsPerHeaders;
+    }
+
     public void pushValue(ReferenceDatum referenceDatum, String header, String cellContent, SetMultimap<String, UUID> refsLinkedTo) {
-        Column column = columnsPerHeader.get(header);
+        Column column = getExpectedColumnsPerHeaders().get(header);
         column.pushValue(cellContent, referenceDatum, refsLinkedTo);
     }
 
     public ImmutableSet<String> getExpectedHeaders() {
-        return columnsPerHeader.keySet();
+        return getExpectedColumnsPerHeaders().keySet();
     }
 
     public ImmutableSet<String> getMandatoryHeaders() {
-        return columnsPerHeader.values().stream()
+        return getExpectedColumnsPerHeaders().values().stream()
                 .filter(Column::isMandatory)
                 .map(Column::getExpectedHeader)
                 .collect(ImmutableSet.toImmutableSet());
     }
 
     public String getCsvCellContent(ReferenceDatum referenceDatum, String header) {
-        Column column = columnsPerHeader.get(header);
+        Column column = getExpectedColumnsPerHeaders().get(header);
         return column.getCsvCellContent(referenceDatum);
     }
 
@@ -401,20 +421,20 @@ public class ReferenceImporterContext {
 
     public abstract static class Column {
 
-        private final String expectedHeader;
-
         private final ReferenceColumn referenceColumn;
 
         private final ColumnPresenceConstraint presenceConstraint;
 
-        public Column(ReferenceColumn referenceColumn, String expectedHeader, ColumnPresenceConstraint presenceConstraint) {
+        private final ComputedValueUsage computedValueUsage;
+
+        public Column(ReferenceColumn referenceColumn, ColumnPresenceConstraint presenceConstraint, ComputedValueUsage computedValueUsage) {
             this.referenceColumn = referenceColumn;
-            this.expectedHeader = expectedHeader;
             this.presenceConstraint = presenceConstraint;
+            this.computedValueUsage = computedValueUsage;
         }
 
         public boolean canHandle(String header) {
-            return expectedHeader.equals(header);
+            return isExpected() && getExpectedHeader().equals(header);
         }
 
         abstract void pushValue(String cellContent, ReferenceDatum referenceDatum, SetMultimap<String, UUID> refsLinkedTo);
@@ -425,9 +445,7 @@ public class ReferenceImporterContext {
             return referenceColumn;
         }
 
-        public String getExpectedHeader() {
-            return expectedHeader;
-        }
+        abstract String getExpectedHeader();
 
         public ColumnPresenceConstraint getPresenceConstraint() {
             return presenceConstraint;
@@ -436,12 +454,22 @@ public class ReferenceImporterContext {
         public boolean isMandatory() {
             return getPresenceConstraint().isMandatory();
         }
+
+        public boolean isExpected() {
+            return getPresenceConstraint().isExpected();
+        }
+
+        abstract Optional<ReferenceColumnValue> computeValue(ReferenceDatum referenceDatum);
+
+        public ComputedValueUsage getComputedValueUsage() {
+            return computedValueUsage;
+        }
     }
 
-    public static class OneValueStaticColumn extends Column {
+    public static abstract class OneValueStaticColumn extends Column {
 
-        public OneValueStaticColumn(ReferenceColumn referenceColumn, ColumnPresenceConstraint presenceConstraint) {
-            super(referenceColumn, referenceColumn.getColumn(), presenceConstraint);
+        public OneValueStaticColumn(ReferenceColumn referenceColumn, ColumnPresenceConstraint presenceConstraint, ComputedValueUsage computedValueUsage) {
+            super(referenceColumn, presenceConstraint, computedValueUsage);
         }
 
         @Override
@@ -457,12 +485,12 @@ public class ReferenceImporterContext {
         }
     }
 
-    public static class ManyValuesStaticColumn extends Column {
+    public static abstract class ManyValuesStaticColumn extends Column {
 
         private static final String CSV_CELL_SEPARATOR = ",";
 
-        public ManyValuesStaticColumn(ReferenceColumn referenceColumn, ColumnPresenceConstraint presenceConstraint) {
-            super(referenceColumn, referenceColumn.getColumn(), presenceConstraint);
+        public ManyValuesStaticColumn(ReferenceColumn referenceColumn, ColumnPresenceConstraint presenceConstraint, ComputedValueUsage computedValueUsage) {
+            super(referenceColumn, presenceConstraint, computedValueUsage);
         }
 
         @Override
@@ -484,7 +512,7 @@ public class ReferenceImporterContext {
         }
     }
 
-    public static class DynamicColumn extends Column {
+    public static abstract class DynamicColumn extends Column {
 
         /**
          * Les colonnes dynamiques sont représentées sous forme de Map dont la clé est la clé hiérarchique correspondant au référentiel qui décrit cette colonne dynamique
@@ -496,8 +524,8 @@ public class ReferenceImporterContext {
          */
         private final Map.Entry<String, UUID> refsLinkedToEntryToAdd;
 
-        public DynamicColumn(ReferenceColumn referenceColumn, String expectedHeader, ColumnPresenceConstraint presenceConstraint, Ltree expectedHierarchicalKey, Map.Entry<String, UUID> refsLinkedToEntryToAdd) {
-            super(referenceColumn, expectedHeader, presenceConstraint);
+        public DynamicColumn(ReferenceColumn referenceColumn, ColumnPresenceConstraint presenceConstraint, Ltree expectedHierarchicalKey, Map.Entry<String, UUID> refsLinkedToEntryToAdd, ComputedValueUsage computedValueUsage) {
+            super(referenceColumn, presenceConstraint, computedValueUsage);
             this.expectedHierarchicalKey = expectedHierarchicalKey;
             this.refsLinkedToEntryToAdd = refsLinkedToEntryToAdd;
         }
diff --git a/src/main/java/fr/inra/oresing/rest/ReferenceService.java b/src/main/java/fr/inra/oresing/rest/ReferenceService.java
new file mode 100644
index 0000000000000000000000000000000000000000..45ce4667288460e5c7b0dcd9be78c4216b8a8654
--- /dev/null
+++ b/src/main/java/fr/inra/oresing/rest/ReferenceService.java
@@ -0,0 +1,397 @@
+package fr.inra.oresing.rest;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import fr.inra.oresing.OreSiTechnicalException;
+import fr.inra.oresing.checker.CheckerFactory;
+import fr.inra.oresing.checker.LineChecker;
+import fr.inra.oresing.checker.Multiplicity;
+import fr.inra.oresing.checker.ReferenceLineChecker;
+import fr.inra.oresing.groovy.Expression;
+import fr.inra.oresing.groovy.GroovyContextHelper;
+import fr.inra.oresing.groovy.StringGroovyExpression;
+import fr.inra.oresing.groovy.StringSetGroovyExpression;
+import fr.inra.oresing.model.Application;
+import fr.inra.oresing.model.ColumnPresenceConstraint;
+import fr.inra.oresing.model.ComputedValueUsage;
+import fr.inra.oresing.model.Configuration;
+import fr.inra.oresing.model.GroovyDataInjectionConfiguration;
+import fr.inra.oresing.model.ReferenceColumn;
+import fr.inra.oresing.model.ReferenceColumnMultipleValue;
+import fr.inra.oresing.model.ReferenceColumnSingleValue;
+import fr.inra.oresing.model.ReferenceColumnValue;
+import fr.inra.oresing.model.ReferenceDatum;
+import fr.inra.oresing.model.ReferenceValue;
+import fr.inra.oresing.persistence.AuthenticationService;
+import fr.inra.oresing.persistence.Ltree;
+import fr.inra.oresing.persistence.OreSiRepository;
+import fr.inra.oresing.persistence.ReferenceValueRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVPrinter;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Slf4j
+@Component
+@Transactional
+public class ReferenceService {
+
+    @Autowired
+    private AuthenticationService authenticationService;
+
+    @Autowired
+    private GroovyContextHelper groovyContextHelper;
+
+    @Autowired
+    private CheckerFactory checkerFactory;
+
+    @Autowired
+    private OreSiRepository repo;
+
+    void addReference(Application app, String refType, MultipartFile file, UUID fileId) throws IOException {
+        ReferenceValueRepository referenceValueRepository = repo.getRepository(app).referenceValue();
+        final ReferenceImporterContext referenceImporterContext = getReferenceImporterContext(app, refType);
+        ReferenceImporter referenceImporter = new ReferenceImporter(referenceImporterContext) {
+            @Override
+            void storeAll(Stream<ReferenceValue> stream) {
+                final List<UUID> uuids = referenceValueRepository.storeAll(stream);
+                referenceValueRepository.updateConstraintForeignReferences(uuids);
+            }
+        };
+        referenceImporter.doImport(file, fileId);
+    }
+
+    private ReferenceImporterContext getReferenceImporterContext(Application app, String refType) {
+        ReferenceValueRepository referenceValueRepository = repo.getRepository(app).referenceValue();
+        Configuration conf = app.getConfiguration();
+        ImmutableSet<LineChecker> lineCheckers = checkerFactory.getReferenceValidationLineCheckers(app, refType);
+        final ImmutableMap<Ltree, UUID> storedReferences = referenceValueRepository.getReferenceIdPerKeys(refType);
+
+        ImmutableMap<ReferenceColumn, Multiplicity> multiplicityPerColumns = lineCheckers.stream()
+                .filter(lineChecker -> lineChecker instanceof ReferenceLineChecker)
+                .map(lineChecker -> (ReferenceLineChecker) lineChecker)
+                .collect(ImmutableMap.toImmutableMap(referenceLineChecker -> (ReferenceColumn) referenceLineChecker.getTarget(), referenceLineChecker -> referenceLineChecker.getConfiguration().getMultiplicity()));
+
+        Configuration.ReferenceDescription referenceDescription = conf.getReferences().get(refType);
+
+        ImmutableSet<ReferenceImporterContext.Column> staticColumns = referenceDescription.getColumns().entrySet().stream()
+                .map(entry -> {
+                    ReferenceColumn referenceColumn = new ReferenceColumn(entry.getKey());
+                    Multiplicity multiplicity = multiplicityPerColumns.getOrDefault(referenceColumn, Multiplicity.ONE);
+                    Configuration.ReferenceStaticNotComputedColumnDescription referenceStaticNotComputedColumnDescription = MoreObjects.firstNonNull(entry.getValue(), new Configuration.ReferenceStaticNotComputedColumnDescription());
+                    ColumnPresenceConstraint presenceConstraint = referenceStaticNotComputedColumnDescription.getPresenceConstraint();
+                    ReferenceImporterContext.Column column = Optional.ofNullable(referenceStaticNotComputedColumnDescription.getDefaultValue())
+                            .map(defaultValueConfiguration -> staticColumnDescriptionToColumn(referenceColumn, presenceConstraint, multiplicity, referenceValueRepository, defaultValueConfiguration))
+                            .orElseGet(() -> staticColumnDescriptionToColumn(referenceColumn, presenceConstraint, multiplicity));
+                    return column;
+                }).collect(ImmutableSet.toImmutableSet());
+
+        ImmutableSet<ReferenceImporterContext.Column> computedColumns = referenceDescription.getComputedColumns().entrySet().stream()
+                .map(entry -> {
+                    ReferenceColumn referenceColumn = new ReferenceColumn(entry.getKey());
+                    Configuration.ReferenceStaticComputedColumnDescription referenceStaticComputedColumnDescription = entry.getValue();
+                    Multiplicity multiplicity = multiplicityPerColumns.getOrDefault(referenceColumn, Multiplicity.ONE);
+                    return computedColumnDescriptionToColumn(referenceValueRepository, referenceColumn, multiplicity, referenceStaticComputedColumnDescription);
+                }).collect(ImmutableSet.toImmutableSet());
+
+        ImmutableSet<ReferenceImporterContext.Column> dynamicColumns = referenceDescription.getDynamicColumns().entrySet().stream()
+                .flatMap(entry -> {
+                    ReferenceColumn referenceColumn = new ReferenceColumn(entry.getKey());
+                    Configuration.ReferenceDynamicColumnDescription referenceDynamicColumnDescription = entry.getValue();
+                    ImmutableSet<ReferenceImporterContext.Column> valuedDynamicColumns = dynamicColumnDescriptionToColumns(referenceValueRepository, referenceColumn, referenceDynamicColumnDescription);
+                    return valuedDynamicColumns.stream();
+                }).collect(ImmutableSet.toImmutableSet());
+
+        ImmutableSet<ReferenceImporterContext.Column> columns = ImmutableSet.<ReferenceImporterContext.Column>builder()
+                .addAll(staticColumns)
+                .addAll(computedColumns)
+                .addAll(dynamicColumns)
+                .build();
+
+        final ReferenceImporterContext.Constants constants = new ReferenceImporterContext.Constants(
+                app.getId(),
+                conf,
+                refType,
+                repo.getRepository(app).referenceValue());
+    /*    final Set<Object> patternColumns = constants.getPatternColumns()
+                .map(pt -> pt.values())
+                .flatMap(Collection::stream)
+                .stream().collect(Collectors.toSet());*/
+        Set<String> patternColumns = constants.getPatternColumns()
+                .map(m->m.values().stream().flatMap(List::stream).collect(Collectors.toSet()))
+                .orElseGet(HashSet::new);
+        final Map<String, String> referenceToColumnName = lineCheckers.stream()
+                .filter(ReferenceLineChecker.class::isInstance)
+                .map(ReferenceLineChecker.class::cast)
+                .collect(Collectors.toMap(ReferenceLineChecker::getRefType, referenceLineChecker -> ((ReferenceColumn) referenceLineChecker.getTarget()).getColumn()));
+        final Map<String, Map<String, Map<String, String>>> displayByReferenceAndNaturalKey =
+                lineCheckers.stream()
+                        .filter(ReferenceLineChecker.class::isInstance)
+                        .map(ReferenceLineChecker.class::cast)
+                        .map(ReferenceLineChecker::getRefType)
+                        .filter(rt -> patternColumns.contains(rt))
+                        .collect(Collectors.toMap(ref -> referenceToColumnName.getOrDefault(ref, ref), ref -> repo.getRepository(app).referenceValue().findDisplayByNaturalKey(ref)));
+        final ReferenceImporterContext referenceImporterContext =
+                new ReferenceImporterContext(
+                        constants,
+                        lineCheckers,
+                        storedReferences,
+                        columns,
+                        displayByReferenceAndNaturalKey
+                );
+        return referenceImporterContext;
+    }
+
+    private ImmutableSet<ReferenceImporterContext.Column> dynamicColumnDescriptionToColumns(ReferenceValueRepository referenceValueRepository, ReferenceColumn referenceColumn, Configuration.ReferenceDynamicColumnDescription referenceDynamicColumnDescription) {
+        String reference = referenceDynamicColumnDescription.getReference();
+        ReferenceColumn referenceColumnToLookForHeader = new ReferenceColumn(referenceDynamicColumnDescription.getReferenceColumnToLookForHeader());
+        List<ReferenceValue> allByReferenceType = referenceValueRepository.findAllByReferenceType(reference);
+        ImmutableSet<ReferenceImporterContext.Column> valuedDynamicColumns = allByReferenceType.stream()
+                .map(referenceValue -> {
+                    ReferenceDatum referenceDatum = referenceValue.getRefValues();
+                    Ltree hierarchicalKey = referenceValue.getHierarchicalKey();
+                    ReferenceColumnSingleValue referenceColumnValue = (ReferenceColumnSingleValue) referenceDatum.get(referenceColumnToLookForHeader);
+                    String header = referenceColumnValue.getValue();
+                    String fullHeader = referenceDynamicColumnDescription.getHeaderPrefix() + header;
+                    ColumnPresenceConstraint presenceConstraint = referenceDynamicColumnDescription.getPresenceConstraint();
+                    return new ReferenceImporterContext.DynamicColumn(
+                            referenceColumn,
+                            presenceConstraint,
+                            hierarchicalKey,
+                            Map.entry(reference, referenceValue.getId()),
+                            ComputedValueUsage.NOT_COMPUTED
+                    ) {
+                        @Override
+                        String getExpectedHeader() {
+                            return fullHeader;
+                        }
+
+                        @Override
+                        Optional<ReferenceColumnValue> computeValue(ReferenceDatum referenceDatum) {
+                            throw new UnsupportedOperationException("pas de valeur calculable pour " + referenceColumn);
+                        }
+                    };
+                }).collect(ImmutableSet.toImmutableSet());
+        return valuedDynamicColumns;
+    }
+
+    private ReferenceImporterContext.Column staticColumnDescriptionToColumn(ReferenceColumn referenceColumn, ColumnPresenceConstraint presenceConstraint, Multiplicity multiplicity) {
+        ReferenceImporterContext.Column column;
+        if (multiplicity == Multiplicity.ONE) {
+            column = new ReferenceImporterContext.OneValueStaticColumn(referenceColumn, presenceConstraint, ComputedValueUsage.NOT_COMPUTED) {
+                @Override
+                String getExpectedHeader() {
+                    return referenceColumn.getColumn();
+                }
+
+                @Override
+                Optional<ReferenceColumnValue> computeValue(ReferenceDatum referenceDatum) {
+                    throw new UnsupportedOperationException("pas de valeur par défaut pour " + referenceColumn);
+                }
+            };
+        } else if (multiplicity == Multiplicity.MANY) {
+            column = new ReferenceImporterContext.ManyValuesStaticColumn(referenceColumn, presenceConstraint, ComputedValueUsage.NOT_COMPUTED) {
+                @Override
+                String getExpectedHeader() {
+                    return referenceColumn.getColumn();
+                }
+
+                @Override
+                Optional<ReferenceColumnValue> computeValue(ReferenceDatum referenceDatum) {
+                    throw new UnsupportedOperationException("pas de valeur par défaut pour " + referenceColumn);
+                }
+            };
+        } else {
+            throw new IllegalStateException("multiplicity = " + multiplicity);
+        }
+        return column;
+    }
+
+    private ReferenceImporterContext.Column staticColumnDescriptionToColumn(ReferenceColumn referenceColumn, ColumnPresenceConstraint presenceConstraint, Multiplicity multiplicity, ReferenceValueRepository referenceValueRepository, Configuration.GroovyConfiguration defaultValueConfiguration) {
+        ImmutableMap<String, Object> contextForExpression = computeGroovyContext(referenceValueRepository, defaultValueConfiguration);
+        ReferenceImporterContext.Column column;
+        if (multiplicity == Multiplicity.ONE) {
+            Expression<String> computationExpression = StringGroovyExpression.forExpression(defaultValueConfiguration.getExpression());
+            column = new ReferenceImporterContext.OneValueStaticColumn(referenceColumn, presenceConstraint, ComputedValueUsage.USE_COMPUTED_AS_DEFAULT_VALUE) {
+                @Override
+                String getExpectedHeader() {
+                    return referenceColumn.getColumn();
+                }
+
+                @Override
+                Optional<ReferenceColumnValue> computeValue(ReferenceDatum referenceDatum) {
+                    ImmutableMap<String, Object> evaluationContext = ImmutableMap.<String, Object>builder()
+                            .putAll(contextForExpression)
+                            .putAll(referenceDatum.getEvaluationContext())
+                            .build();
+                    String evaluate = computationExpression.evaluate(evaluationContext);
+                    Optional<ReferenceColumnValue> computedValue = Optional.ofNullable(evaluate)
+                            .filter(StringUtils::isNotEmpty)
+                            .map(ReferenceColumnSingleValue::new);
+                    return computedValue;
+                }
+            };
+        } else if (multiplicity == Multiplicity.MANY) {
+            Expression<Set<String>> computationExpression = StringSetGroovyExpression.forExpression(defaultValueConfiguration.getExpression());
+            column = new ReferenceImporterContext.ManyValuesStaticColumn(referenceColumn, presenceConstraint, ComputedValueUsage.USE_COMPUTED_AS_DEFAULT_VALUE) {
+                @Override
+                String getExpectedHeader() {
+                    return referenceColumn.getColumn();
+                }
+
+                @Override
+                Optional<ReferenceColumnValue> computeValue(ReferenceDatum referenceDatum) {
+                    ImmutableMap<String, Object> evaluationContext = ImmutableMap.<String, Object>builder()
+                            .putAll(contextForExpression)
+                            .putAll(referenceDatum.getEvaluationContext())
+                            .build();
+                    Set<String> evaluate = computationExpression.evaluate(evaluationContext);
+                    Optional<ReferenceColumnValue> computedValue = Optional.ofNullable(evaluate)
+                            .map(ReferenceColumnMultipleValue::new);
+                    return computedValue;
+                }
+            };
+        } else {
+            throw new IllegalStateException("multiplicity = " + multiplicity);
+        }
+        return column;
+    }
+
+    private ReferenceImporterContext.Column computedColumnDescriptionToColumn(ReferenceValueRepository referenceValueRepository, ReferenceColumn referenceColumn, Multiplicity multiplicity, Configuration.ReferenceStaticComputedColumnDescription referenceStaticComputedColumnDescription) {
+        ReferenceImporterContext.Column column;
+        if (multiplicity == Multiplicity.ONE) {
+            column = newComputedColumn(referenceColumn, referenceStaticComputedColumnDescription, referenceValueRepository);
+        } else if (multiplicity == Multiplicity.MANY) {
+            column = newComputedManyColumn(referenceColumn, referenceStaticComputedColumnDescription, referenceValueRepository);
+        } else {
+            throw new IllegalStateException("multiplicity = " + multiplicity);
+        }
+        return column;
+    }
+
+    private ReferenceImporterContext.Column newComputedManyColumn(ReferenceColumn referenceColumn, Configuration.ReferenceStaticComputedColumnDescription referenceStaticComputedColumnDescription, ReferenceValueRepository referenceValueRepository) {
+        Configuration.GroovyConfiguration computation = referenceStaticComputedColumnDescription.getComputation();
+        ImmutableMap<String, Object> contextForExpression = computeGroovyContext(referenceValueRepository, computation);
+        Expression<Set<String>> computationExpression = StringSetGroovyExpression.forExpression(computation.getExpression());
+        return new ReferenceImporterContext.ManyValuesStaticColumn(referenceColumn, ColumnPresenceConstraint.ABSENT, ComputedValueUsage.USE_COMPUTED_VALUE) {
+            @Override
+            String getExpectedHeader() {
+                throw new UnsupportedOperationException("la colonne " + referenceColumn + " est calculée, il n'y a pas d'entête spécifié car elle ne doit pas être dans le CSV");
+            }
+
+            @Override
+            Optional<ReferenceColumnValue> computeValue(ReferenceDatum referenceDatum) {
+                ImmutableMap<String, Object> evaluationContext = ImmutableMap.<String, Object>builder()
+                        .putAll(contextForExpression)
+                        .putAll(referenceDatum.getEvaluationContext())
+                        .build();
+                Set<String> evaluate = computationExpression.evaluate(evaluationContext);
+                Optional<ReferenceColumnValue> computedValue = Optional.ofNullable(evaluate)
+                        .map(ReferenceColumnMultipleValue::new);
+                return computedValue;
+            }
+        };
+    }
+
+    private ReferenceImporterContext.Column newComputedColumn(ReferenceColumn referenceColumn, Configuration.ReferenceStaticComputedColumnDescription referenceStaticComputedColumnDescription, ReferenceValueRepository referenceValueRepository) {
+        Configuration.GroovyConfiguration computation = referenceStaticComputedColumnDescription.getComputation();
+        ImmutableMap<String, Object> contextForExpression = computeGroovyContext(referenceValueRepository, computation);
+        Expression<String> computationExpression = StringGroovyExpression.forExpression(computation.getExpression());
+        return new ReferenceImporterContext.OneValueStaticColumn(referenceColumn, ColumnPresenceConstraint.ABSENT, ComputedValueUsage.USE_COMPUTED_VALUE) {
+            @Override
+            String getExpectedHeader() {
+                throw new UnsupportedOperationException("la colonne " + referenceColumn + " est calculée, il n'y a pas d'entête spécifié");
+            }
+
+            @Override
+            Optional<ReferenceColumnValue> computeValue(ReferenceDatum referenceDatum) {
+                ImmutableMap<String, Object> evaluationContext = ImmutableMap.<String, Object>builder()
+                        .putAll(contextForExpression)
+                        .putAll(referenceDatum.getEvaluationContext())
+                        .build();
+                String evaluate = computationExpression.evaluate(evaluationContext);
+                Optional<ReferenceColumnValue> computedValue = Optional.ofNullable(evaluate)
+                        .filter(StringUtils::isNotEmpty)
+                        .map(ReferenceColumnSingleValue::new);
+                return computedValue;
+            }
+        };
+    }
+
+    private ImmutableMap<String, Object> computeGroovyContext(ReferenceValueRepository referenceValueRepository, GroovyDataInjectionConfiguration groovyDataInjectionConfiguration) {
+        Set<String> configurationReferences = groovyDataInjectionConfiguration.getReferences();
+        ImmutableMap<String, Object> contextForExpression = groovyContextHelper.getGroovyContextForReferences(referenceValueRepository, configurationReferences);
+        Preconditions.checkState(groovyDataInjectionConfiguration.getDatatypes().isEmpty(), "à ce stade, on ne gère pas le chargement de données. Les référentiels ne doivent pas dépendre des données expérimentales.");
+        return contextForExpression;
+    }
+
+    /**
+     * @param nameOrId l'id de l'application
+     * @param refType  le type du referenciel
+     * @param params   les parametres query de la requete http. 'ANY' est utiliser pour dire n'importe quelle colonne
+     * @return la liste qui satisfont aux criteres
+     */
+    List<ReferenceValue> findReference(String nameOrId, String refType, MultiValueMap<String, String> params) {
+        authenticationService.setRoleForClient();
+        List<ReferenceValue> list = repo.getRepository(nameOrId).referenceValue().findAllByReferenceType(refType, params);
+        return list;
+    }
+
+    String getReferenceValuesCsv(String applicationNameOrId, String referenceType, MultiValueMap<String, String> params) {
+        Application application = getApplication(applicationNameOrId);
+        ReferenceImporterContext referenceImporterContext = getReferenceImporterContext(application, referenceType);
+        ReferenceValueRepository referenceValueRepository = repo.getRepository(applicationNameOrId).referenceValue();
+        Stream<ImmutableList<String>> recordsStream = referenceValueRepository.findAllByReferenceType(referenceType, params).stream()
+                .map(ReferenceValue::getRefValues)
+                .map(referenceDatum -> {
+                    ImmutableList<String> rowAsRecord = referenceImporterContext.getExpectedHeaders().stream()
+                            .map(header -> referenceImporterContext.getCsvCellContent(referenceDatum, header))
+                            .collect(ImmutableList.toImmutableList());
+                    return rowAsRecord;
+                });
+        ImmutableSet<String> headers = referenceImporterContext.getExpectedHeaders();
+        CSVFormat csvFormat = CSVFormat.DEFAULT
+                .withDelimiter(referenceImporterContext.getCsvSeparator())
+                .withSkipHeaderRecord();
+        StringWriter out = new StringWriter();
+        try {
+            CSVPrinter csvPrinter = new CSVPrinter(out, csvFormat);
+            csvPrinter.printRecord(headers);
+            recordsStream.forEach(record -> {
+                try {
+                    csvPrinter.printRecord(record);
+                } catch (IOException e) {
+                    throw new OreSiTechnicalException("erreur lors de la génération du fichier CSV", e);
+                }
+            });
+        } catch (IOException e) {
+            throw new OreSiTechnicalException("erreur lors de la génération du fichier CSV", e);
+        }
+        String csv = out.toString();
+        return csv;
+    }
+
+    private Application getApplication(String nameOrId) {
+        authenticationService.setRoleForClient();
+        return repo.application().findApplication(nameOrId);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/rest/RelationalService.java b/src/main/java/fr/inra/oresing/rest/RelationalService.java
index 524421912aff5f9bdc0688d9a3cdff71772a4199..5c88dec0918ac62b4584f4a5d0f25b90c045f060 100644
--- a/src/main/java/fr/inra/oresing/rest/RelationalService.java
+++ b/src/main/java/fr/inra/oresing/rest/RelationalService.java
@@ -2,7 +2,6 @@ package fr.inra.oresing.rest;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSetMultimap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -186,7 +185,7 @@ public class RelationalService implements InitializingBean, DisposableBean {
             ImmutableMap<VariableComponentKey, CheckerOnOneVariableComponentLineChecker> checkerPerVariableComponentKeys = checkerFactory.getLineCheckers(application, dataType).stream()
                     .filter(lineChecker -> lineChecker instanceof CheckerOnOneVariableComponentLineChecker)
                     .map(lineChecker -> (CheckerOnOneVariableComponentLineChecker) lineChecker)
-                    .collect(ImmutableMap.toImmutableMap(rlc -> (VariableComponentKey) rlc.getTarget().getTarget(), Function.identity()));
+                    .collect(ImmutableMap.toImmutableMap(rlc -> (VariableComponentKey) rlc.getTarget(), Function.identity()));
             Map<VariableComponentKey, ReferenceLineChecker> referenceCheckers =
                     Maps.transformValues(
                             Maps.filterValues(checkerPerVariableComponentKeys, checker -> checker instanceof ReferenceLineChecker),
@@ -203,7 +202,7 @@ public class RelationalService implements InitializingBean, DisposableBean {
             String dataAfterDataGroupsMergingQuery = repository.getRepository(application).data().getSqlToMergeData(DownloadDatasetQuery.buildDownloadDatasetQuery(null, appId.toString(), dataType, application));
             String withClause = "WITH " + dataTableName + " AS (" + dataAfterDataGroupsMergingQuery + ")";
 
-            for (VariableComponentKey variableComponentKey : getVariableComponentKeys(dataTypeDescription)) {
+            for (VariableComponentKey variableComponentKey : dataTypeDescription.doGetAllVariableComponents()) {
                 String variable = variableComponentKey.getVariable();
                 String component = variableComponentKey.getComponent();
                 String escapedVariableName = StringUtils.replace(variable, "'", "''");
@@ -250,17 +249,6 @@ public class RelationalService implements InitializingBean, DisposableBean {
         return views;
     }
 
-    private ImmutableSet<VariableComponentKey> getVariableComponentKeys(Configuration.DataTypeDescription dataTypeDescription) {
-        Set<VariableComponentKey> references = new LinkedHashSet<>();
-        for (Map.Entry<String, Configuration.ColumnDescription> variableEntry : dataTypeDescription.getData().entrySet()) {
-            String variable = variableEntry.getKey();
-            for (String component : variableEntry.getValue().getComponents().keySet()) {
-                references.add(new VariableComponentKey(variable, component));
-            }
-        }
-        return ImmutableSet.copyOf(references);
-    }
-
     private List<ViewCreationCommand> getDenormalizedViewsForDataTypes(SqlSchemaForRelationalViewsForApplication sqlSchema, Application application) {
         List<ViewCreationCommand> views = new LinkedList<>();
         for (Map.Entry<String, Configuration.DataTypeDescription> entry : application.getConfiguration().getDataTypes().entrySet()) {
@@ -275,13 +263,13 @@ public class RelationalService implements InitializingBean, DisposableBean {
 
             for (ReferenceLineChecker referenceChecker : referenceCheckers.values()) {
                 String referenceType = referenceChecker.getRefType();  // especes
-                VariableComponentKey variableComponentKey = (VariableComponentKey) referenceChecker.getTarget().getTarget();
+                VariableComponentKey variableComponentKey = (VariableComponentKey) referenceChecker.getTarget();
                 String quotedViewName = sqlSchema.forReferenceType(referenceType).getSqlIdentifier();
 
                 String foreignKeyColumnName = getTechnicalIdColumnName(variableComponentKey);
                 String alias = getAliasForColumnName(variableComponentKey);
 
-                application.getConfiguration().getReferences().get(referenceType).getColumns().keySet().stream()
+                application.getConfiguration().getReferences().get(referenceType).doGetStaticColumns().stream()
                         .map(referenceColumn -> alias + "." + quoteSqlIdentifier(referenceColumn) + " as " + getColumnName("ref", variableComponentKey.getVariable(), variableComponentKey.getComponent(), referenceColumn))
                         .forEach(selectClauseReferenceElements::add);
                 fromClauseJoinElements.add("left outer join " + quotedViewName + " " + alias + " on " + dataTableName + "." + foreignKeyColumnName + "::uuid = " + alias + "." + quoteSqlIdentifier(referenceType + "_id") + "::uuid");
@@ -289,7 +277,7 @@ public class RelationalService implements InitializingBean, DisposableBean {
 
             Set<String> selectClauseElements = new LinkedHashSet<>(selectClauseReferenceElements);
 
-            getVariableComponentKeys(dataTypeDescription).stream()
+            dataTypeDescription.doGetAllVariableComponents().stream()
                     .map(this::getColumnName)
                     .map(columnName -> dataTableName + "." + columnName)
                     .forEach(selectClauseElements::add);
@@ -336,14 +324,14 @@ public class RelationalService implements InitializingBean, DisposableBean {
             ImmutableMap<ReferenceColumn, SqlPrimitiveType> sqlTypePerColumns = checkerFactory.getReferenceValidationLineCheckers(app, referenceType).stream()
                     .filter(CheckerOnOneVariableComponentLineChecker.class::isInstance)
                     .map(CheckerOnOneVariableComponentLineChecker.class::cast)
-                    .collect(ImmutableMap.toImmutableMap(rlc -> (ReferenceColumn) rlc.getTarget().getTarget(), CheckerOnOneVariableComponentLineChecker::getSqlType));
+                    .collect(ImmutableMap.toImmutableMap(rlc -> (ReferenceColumn) rlc.getTarget(), CheckerOnOneVariableComponentLineChecker::getSqlType));
 
             ImmutableMap<ReferenceColumn, Multiplicity> declaredMultiplicityPerReferenceColumns = checkerFactory.getReferenceValidationLineCheckers(app, referenceType).stream()
                     .filter(ReferenceLineChecker.class::isInstance)
                     .map(ReferenceLineChecker.class::cast)
-                    .collect(ImmutableMap.toImmutableMap(rlc -> (ReferenceColumn) rlc.getTarget().getTarget(), referenceLineChecker -> referenceLineChecker.getConfiguration().getMultiplicity()));
+                    .collect(ImmutableMap.toImmutableMap(rlc -> (ReferenceColumn) rlc.getTarget(), referenceLineChecker -> referenceLineChecker.getConfiguration().getMultiplicity()));
 
-            ImmutableSetMultimap<Multiplicity, ReferenceColumn> allReferenceColumnsPerMultiplicity = referenceDescription.getColumns().keySet().stream()
+            ImmutableSetMultimap<Multiplicity, ReferenceColumn> allReferenceColumnsPerMultiplicity = referenceDescription.doGetStaticColumns().stream()
                     .map(ReferenceColumn::new)
                     .collect(ImmutableSetMultimap.toImmutableSetMultimap(referenceColumn -> declaredMultiplicityPerReferenceColumns.getOrDefault(referenceColumn, Multiplicity.ONE), Function.identity()));
 
diff --git a/src/main/java/fr/inra/oresing/transformer/TransformOneLineElementTransformer.java b/src/main/java/fr/inra/oresing/transformer/TransformOneLineElementTransformer.java
index 8044177a21654a3e4bd15b2b6146d5ea350e6e16..2b58ee1d748d41934b11a83bda3e307a9c5d1f06 100644
--- a/src/main/java/fr/inra/oresing/transformer/TransformOneLineElementTransformer.java
+++ b/src/main/java/fr/inra/oresing/transformer/TransformOneLineElementTransformer.java
@@ -17,7 +17,7 @@ public interface TransformOneLineElementTransformer extends LineTransformer {
 
     @Override
     default Datum transform(Datum datum) {
-        VariableComponentKey variableComponentKey = (VariableComponentKey) getTarget().getTarget();
+        VariableComponentKey variableComponentKey = (VariableComponentKey) getTarget();
         String value = datum.get(variableComponentKey);
         String transformedValue = transform(datum, value);
         Datum transformedDatum = Datum.copyOf(datum);
@@ -27,7 +27,7 @@ public interface TransformOneLineElementTransformer extends LineTransformer {
 
     @Override
     default ReferenceDatum transform(ReferenceDatum referenceDatum) {
-        ReferenceColumn referenceColumn = (ReferenceColumn) getTarget().getTarget();
+        ReferenceColumn referenceColumn = (ReferenceColumn) getTarget();
         ReferenceColumnValue referenceColumnValue;
         if (referenceDatum.contains(referenceColumn)) {
             referenceColumnValue = referenceDatum.get(referenceColumn);
diff --git a/src/test/java/fr/inra/oresing/checker/CheckerTargetTest.java b/src/test/java/fr/inra/oresing/checker/CheckerTargetTest.java
index e17722fde5df2177fbfd5789163a28414122f612..bc76d49b8b5807cf88b0a5e27219be736da6dfd0 100644
--- a/src/test/java/fr/inra/oresing/checker/CheckerTargetTest.java
+++ b/src/test/java/fr/inra/oresing/checker/CheckerTargetTest.java
@@ -9,18 +9,18 @@ public class CheckerTargetTest {
     @Test
     public void testBuildColumnChecker(){
         ReferenceColumn referenceColumn = new ReferenceColumn("bonjour");
-        CheckerTarget checkerTarget= CheckerTarget.getInstance(referenceColumn,null, null);
+        CheckerTarget checkerTarget= referenceColumn;
         Assert.assertEquals(CheckerTarget.CheckerTargetType.PARAM_COLUMN, checkerTarget.getType());
-        Assert.assertEquals(referenceColumn, checkerTarget.getTarget());
+        Assert.assertEquals(referenceColumn, checkerTarget);
         String key = checkerTarget.getInternationalizedKey("key");
         Assert.assertEquals("keyWithColumn", key);
     }
     @Test
     public void testBuildVariableComponentChecker(){
         VariableComponentKey variableComponentKey = new VariableComponentKey("Variable", "component");
-        CheckerTarget checkerTarget= CheckerTarget.getInstance( variableComponentKey, null, null);
+        CheckerTarget checkerTarget= variableComponentKey;
         Assert.assertEquals(CheckerTarget.CheckerTargetType.PARAM_VARIABLE_COMPONENT_KEY, checkerTarget.getType());
-        Assert.assertEquals(variableComponentKey, checkerTarget.getTarget());
+        Assert.assertEquals(variableComponentKey, checkerTarget);
         String key = checkerTarget.getInternationalizedKey("key");
         Assert.assertEquals("key", key);
     }
diff --git a/src/test/java/fr/inra/oresing/checker/DateLineCheckerTest.java b/src/test/java/fr/inra/oresing/checker/DateLineCheckerTest.java
index 014bbc073f426b68e8f932c019de5bf0fb5d4ede..1d21fe06278ae8086b83c3b18441fdb7f71e901c 100644
--- a/src/test/java/fr/inra/oresing/checker/DateLineCheckerTest.java
+++ b/src/test/java/fr/inra/oresing/checker/DateLineCheckerTest.java
@@ -9,7 +9,7 @@ public class DateLineCheckerTest {
 
     @Test
     public void testCheck() {
-        DateLineChecker dateLineChecker = new DateLineChecker(CheckerTarget.getInstance(new VariableComponentKey("ignored", "ignored"), null, null), "dd/MM/yyyy", null, null);
+        DateLineChecker dateLineChecker = new DateLineChecker(new VariableComponentKey("ignored", "ignored"), "dd/MM/yyyy", null, null);
         Assert.assertTrue(dateLineChecker.check("12/01/2021").isSuccess());
         Assert.assertFalse(dateLineChecker.check("06/21").isSuccess());
         Assert.assertFalse(dateLineChecker.check("04/03/10").isSuccess());
diff --git a/src/test/java/fr/inra/oresing/checker/GroovyLineCheckerTest.java b/src/test/java/fr/inra/oresing/checker/GroovyLineCheckerTest.java
index 5e59a5c86e619e313f3f1a6680f8587ff255aacd..6cd7292da2d048d182fa3d94a1b6b410d255b621 100644
--- a/src/test/java/fr/inra/oresing/checker/GroovyLineCheckerTest.java
+++ b/src/test/java/fr/inra/oresing/checker/GroovyLineCheckerTest.java
@@ -6,6 +6,7 @@ import fr.inra.oresing.groovy.GroovyExpression;
 import fr.inra.oresing.model.Datum;
 import fr.inra.oresing.model.VariableComponentKey;
 import fr.inra.oresing.rest.ValidationCheckResult;
+import fr.inra.oresing.transformer.TransformationConfiguration;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.Assert;
 import org.junit.Test;
@@ -98,9 +99,8 @@ public class GroovyLineCheckerTest {
 
     private GroovyLineCheckerConfiguration getConfiguration(String expression) {
         return new GroovyLineCheckerConfiguration() {
-
             @Override
-            public boolean isCodify() {
+            public TransformationConfiguration getTransformation() {
                 throw new UnsupportedOperationException("doublure de test");
             }
 
diff --git a/src/test/java/fr/inra/oresing/model/LocalDateTimeRangeTest.java b/src/test/java/fr/inra/oresing/model/LocalDateTimeRangeTest.java
index 225b46a8814dd6493d8cdb263fcc9e149a2a5f32..702dd91196c58394246a6cbc65747e2484a792a5 100644
--- a/src/test/java/fr/inra/oresing/model/LocalDateTimeRangeTest.java
+++ b/src/test/java/fr/inra/oresing/model/LocalDateTimeRangeTest.java
@@ -2,7 +2,7 @@ package fr.inra.oresing.model;
 
 import fr.inra.oresing.checker.DateLineChecker;
 import fr.inra.oresing.checker.DateLineCheckerConfiguration;
-import fr.inra.oresing.checker.GroovyConfiguration;
+import fr.inra.oresing.transformer.TransformationConfiguration;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -61,18 +61,13 @@ public class LocalDateTimeRangeTest {
                 return duration;
             }
 
-            @Override
-            public boolean isCodify() {
-                throw new UnsupportedOperationException("doublure de test");
-            }
-
             @Override
             public boolean isRequired() {
                 throw new UnsupportedOperationException("doublure de test");
             }
 
             @Override
-            public GroovyConfiguration getGroovy() {
+            public TransformationConfiguration getTransformation() {
                 throw new UnsupportedOperationException("doublure de test");
             }
         };
diff --git a/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java b/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java
index 519004526edd850101d9bf56cade97d912644ca2..657cae5770e68dcd107671fb77c70ff45b5d7531 100644
--- a/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java
+++ b/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java
@@ -157,12 +157,12 @@ public class ApplicationConfigurationServiceTest {
     }
 
     @Test
-    public void testUnknownReferenceInCompositereference() {
+    public void testUnknownReferenceInCompositeReference() {
         ConfigurationParsingResult configurationParsingResult = parseYaml("- reference: typeSites", "- reference: typeDeSites");
         Assert.assertFalse(configurationParsingResult.isValid());
         ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults());
         log.debug(onlyError.getMessage());
-        Assert.assertEquals("unknownReferenceInCompositereference", onlyError.getMessage());
+        Assert.assertEquals("unknownReferenceInCompositeReference", onlyError.getMessage());
     }
 
     @Test
@@ -385,7 +385,7 @@ public class ApplicationConfigurationServiceTest {
         Assert.assertFalse(configurationParsingResult.isValid());
         ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults());
         log.debug(onlyError.getMessage());
-        Assert.assertEquals("missingRequiredExpression", onlyError.getMessage());
+        Assert.assertEquals("missingRequiredExpressionForValidationRuleInDataType", onlyError.getMessage());
     }
 
     @Test
@@ -394,7 +394,7 @@ public class ApplicationConfigurationServiceTest {
         Assert.assertFalse(configurationParsingResult.isValid());
         ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults());
         log.debug(onlyError.getMessage());
-        Assert.assertEquals("illegalGroovyExpression", onlyError.getMessage());
+        Assert.assertEquals("illegalGroovyExpressionForValidationRuleInDataType", onlyError.getMessage());
     }
 
     @Test
@@ -403,7 +403,7 @@ public class ApplicationConfigurationServiceTest {
         Assert.assertFalse(configurationParsingResult.isValid());
         ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults());
         log.debug(onlyError.getMessage());
-        Assert.assertEquals("unknownCheckerName", onlyError.getMessage());
+        Assert.assertEquals("unknownCheckerNameForValidationRuleInDataType", onlyError.getMessage());
     }
 
     @Test
diff --git a/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java b/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java
index 2bff3689f4d6d9551e68cd49328a49c7176a125e..304026d5a2b0cdc5ebf3f9242ea2766f7515689a 100644
--- a/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java
+++ b/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java
@@ -49,13 +49,21 @@ import java.io.InputStream;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.UUID;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = OreSiNg.class)
@@ -285,9 +293,9 @@ public class OreSiResourcesTest {
                     //     .andExpect(content().string(expectedCsv))
                     .andReturn().getResponse().getContentAsString();
             log.debug(StringUtils.abbreviate(actualCsv, 50));
-            List<String> actualCsvToList = Arrays.stream(actualCsv.split("\r+\n"))
+            List<String> actualCsvToList = Arrays.stream(actualCsv.split("\r?\n"))
                     .collect(Collectors.toList());
-            List<String> expectedCsvToList = Arrays.stream(expectedCsv.split("\r+\n"))
+            List<String> expectedCsvToList = Arrays.stream(expectedCsv.split("\r?\n"))
                     .collect(Collectors.toList());
             Assert.assertEquals(expectedCsvToList.size(), actualCsvToList.size());
             actualCsvToList.forEach(expectedCsvToList::remove);
diff --git a/src/test/resources/data/acbb/acbb.yaml b/src/test/resources/data/acbb/acbb.yaml
index ade5a22f564d8a765d12c62be50523ba798b5b58..f39f9286011f0364ee27d591773da9c60f4bd311 100644
--- a/src/test/resources/data/acbb/acbb.yaml
+++ b/src/test/resources/data/acbb/acbb.yaml
@@ -15,19 +15,21 @@ references:
     keyColumns: [nom du site_key]
     validations:
       agroecosystemRef:
-        description: "référence à l'agroécosystème"
+        internationalizationName:
+          fr: "référence à l'agroécosystème"
         checker:
           name: Reference
           params:
             refType: agroecosystemes
-            columns: Agroécosystème
+        columns: [ Agroécosystème ]
       checkDateMiseEnService:
-        description: "validation de date"
+        internationalizationName:
+          fr: "validation de date"
         checker:
           name: Date
           params:
             pattern : "dd/MM/yyyy"
-            columns  : "date mise en service du dispositif"
+        columns: [ "date mise en service du dispositif" ]
     columns:
       Agroécosystème:
       nom du site_key:
@@ -62,12 +64,13 @@ references:
   blocs:
     validations:
       creationDate:
-        description: "date de création"
+        internationalizationName:
+          fr: "date de création"
         checker:
           name: Date
           params:
             pattern: dd/MM/yyyy
-            columns: date creation
+        columns: [ date creation ]
     keyColumns: [site,nom_du_bloc,répétition]
     columns:
       site:
@@ -119,13 +122,15 @@ references:
       modalites:
     validations:
       modalitesRef:
-        description: "référence aux modalités"
+        internationalizationName:
+          fr: "référence aux modalités"
+        columns: [ modalites ]
         checker:
           name: Reference
           params:
             refType: modalites
-            columns: modalites
-            codify: true
+            transformation:
+              codify: true
             multiplicity: MANY
 compositeReferences:
   localizations:
@@ -144,7 +149,8 @@ dataTypes:
         component: datetime
     validations:
       check_CO2_value:
-        description: check value in range
+        internationalizationName:
+          fr: check value in range
         checker:
           name: GroovyExpression
           params:
@@ -173,10 +179,11 @@ dataTypes:
       parcelle:
         components:
           chemin:
-            defaultValue: >
-              String site = datumByVariableAndComponent.get("site").get("chemin");
-              String parcelle = datumByVariableAndComponent.get("parcelle").get("name");
-              return site+"."+site+"__"+parcelle;
+            defaultValue:
+              expression: >
+                String site = datumByVariableAndComponent.get("site").get("chemin");
+                String parcelle = datumByVariableAndComponent.get("parcelle").get("name");
+                return site+"."+site+"__"+parcelle;
             checker:
               name: Reference
               params:
@@ -184,8 +191,8 @@ dataTypes:
       date:
         components:
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.date.day +" " +datumByVariableAndComponent.date.time
+            defaultValue:
+              expression: return datumByVariableAndComponent.date.day +" " +datumByVariableAndComponent.date.time
             checker:
               name: Date
               params:
@@ -208,7 +215,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"micromole_par_mole\""
+            defaultValue:
+              expression: "\"micromole_par_mole\""
             checker:
               name: Reference
               params:
@@ -227,7 +235,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"millimole_par_mole\""
+            defaultValue:
+              expression: "\"millimole_par_mole\""
             checker:
               name: Reference
               params:
@@ -246,7 +255,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"pas_d_unite\""
+            defaultValue:
+              expression: "\"pas_d_unite\""
             checker:
               name: Reference
               params:
@@ -259,7 +269,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"micromole_par_mettre_carre_et_par_seconde\""
+            defaultValue:
+              expression: "\"micromole_par_mettre_carre_et_par_seconde\""
             checker:
               name: Reference
               params:
@@ -277,7 +288,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"watt_par_metre_carre\""
+            defaultValue:
+              expression: "\"watt_par_metre_carre\""
             checker:
               name: Reference
               params:
@@ -295,7 +307,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"watt_par_metre_carre\""
+            defaultValue:
+              expression: "\"watt_par_metre_carre\""
             checker:
               name: Reference
               params:
@@ -313,7 +326,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"kilogramme_par_metre_et_par_seconde\""
+            defaultValue:
+              expression: "\"kilogramme_par_metre_et_par_seconde\""
             checker:
               name: Reference
               params:
@@ -331,7 +345,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"metre_par_seconde\""
+            defaultValue:
+              expression: "\"metre_par_seconde\""
             checker:
               name: Reference
               params:
@@ -349,7 +364,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"micromole_par_mettre_carre_et_par_seconde\""
+            defaultValue:
+              expression: "\"micromole_par_mettre_carre_et_par_seconde\""
             checker:
               name: Reference
               params:
@@ -545,7 +561,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"gramme_par_kilo\""
+            defaultValue:
+              expression: "\"gramme_par_kilo\""
             checker:
               name: Reference
               params:
@@ -578,7 +595,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"gramme_par_kilo\""
+            defaultValue:
+              expression: "\"gramme_par_kilo\""
             checker:
               name: Reference
               params:
@@ -611,7 +629,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"pourcentage\""
+            defaultValue:
+              expression: "\"pourcentage\""
             checker:
               name: Reference
               params:
@@ -644,7 +663,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"gramme_par_kilo\""
+            defaultValue:
+              expression: "\"gramme_par_kilo\""
             checker:
               name: Reference
               params:
@@ -677,7 +697,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"gramme_par_kilo\""
+            defaultValue:
+              expression: "\"gramme_par_kilo\""
             checker:
               name: Reference
               params:
@@ -710,7 +731,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"gramme_par_kilo\""
+            defaultValue:
+              expression: "\"gramme_par_kilo\""
             checker:
               name: Reference
               params:
@@ -743,7 +765,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"gramme_par_kilo\""
+            defaultValue:
+              expression: "\"gramme_par_kilo\""
             checker:
               name: Reference
               params:
@@ -776,7 +799,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"milligramme_par_kilogramme\""
+            defaultValue:
+              expression: "\"milligramme_par_kilogramme\""
             checker:
               name: Reference
               params:
@@ -809,7 +833,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"milligramme_par_kilogramme\""
+            defaultValue:
+              expression: "\"milligramme_par_kilogramme\""
             checker:
               name: Reference
               params:
@@ -842,7 +867,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"milligramme_par_kilogramme\""
+            defaultValue:
+              expression: "\"milligramme_par_kilogramme\""
             checker:
               name: Reference
               params:
@@ -875,7 +901,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"milligramme_par_kilogramme\""
+            defaultValue:
+              expression: "\"milligramme_par_kilogramme\""
             checker:
               name: Reference
               params:
@@ -908,7 +935,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"milligramme_par_kilogramme\""
+            defaultValue:
+              expression: "\"milligramme_par_kilogramme\""
             checker:
               name: Reference
               params:
@@ -941,7 +969,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"gramme_par_kilo\""
+            defaultValue:
+              expression: "\"gramme_par_kilo\""
             checker:
               name: Reference
               params:
@@ -974,7 +1003,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"milligramme_par_kilogramme\""
+            defaultValue:
+              expression: "\"milligramme_par_kilogramme\""
             checker:
               name: Reference
               params:
@@ -1007,7 +1037,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"pourcentage\""
+            defaultValue:
+              expression: "\"pourcentage\""
             checker:
               name: Reference
               params:
@@ -1040,7 +1071,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"pourcentage\""
+            defaultValue:
+              expression: "\"pourcentage\""
             checker:
               name: Reference
               params:
@@ -1073,7 +1105,8 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"pourcentage\""
+            defaultValue:
+              expression: "\"pourcentage\""
             checker:
               name: Reference
               params:
@@ -1556,8 +1589,9 @@ dataTypes:
               params:
                 pattern: HH:mm:ss
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.get("Date").get("day") +" " +datumByVariableAndComponent.get("Date").get("time")
+            defaultValue:
+              expression: >
+                return datumByVariableAndComponent.get("Date").get("day") +" " +datumByVariableAndComponent.get("Date").get("time")
             checker:
               name: Date
               params:
@@ -1586,14 +1620,16 @@ dataTypes:
               params:
                 required: false
           unite:
-            defaultValue: "\"pourcentage\""
+            defaultValue:
+              expression: "\"pourcentage\""
             checker:
               name: Reference
               params:
                 refType: unites
     validations:
       swcQualityEnumeration:
-        description: "Si renseignée, la qualité du taux d'humidité vaut 1, 2 ou 3"
+        internationalizationName:
+          fr: "Si renseignée, la qualité du taux d'humidité vaut 1, 2 ou 3"
         checker:
           name: GroovyExpression
           params:
diff --git a/src/test/resources/data/acbb/acbb_v2.yaml b/src/test/resources/data/acbb/acbb_v2.yaml
index a22cf8f31d2a703d9713027593dad4e88860e15a..d83c935bf81f751a9534677aa3091776166b2e33 100644
--- a/src/test/resources/data/acbb/acbb_v2.yaml
+++ b/src/test/resources/data/acbb/acbb_v2.yaml
@@ -844,7 +844,8 @@ dataTypes:
           qualité:
     validations:
       swcQualityEnumeration:
-        description: "Si renseignée, la qualité du taux d'humidité vaut 1, 2 ou 3"
+        internationalizationName:
+          fr: "Si renseignée, la qualité du taux d'humidité vaut 1, 2 ou 3"
         checker:
           name: GroovyExpression
           params:
diff --git a/src/test/resources/data/duplication/duplication.yaml b/src/test/resources/data/duplication/duplication.yaml
index 25d05b2ed343a695ca43dd1a679f1bb3a715405a..805d61d41ddfda430b80e929228e72492234d263 100644
--- a/src/test/resources/data/duplication/duplication.yaml
+++ b/src/test/resources/data/duplication/duplication.yaml
@@ -15,14 +15,16 @@ references:
   zones_etudes:
     validations:
       parent_ref:
-        description: référence au parent
+        internationalizationName:
+          fr: référence au parent
+        columns: [ parent ]
         checker:
           name: Reference
           params:
             refType: zones_etudes
-            columns: parent
             required: false
-            codify: true
+            transformation:
+              codify: true
     keyColumns: [nom]
     columns:
       nom:
diff --git a/src/test/resources/data/foret/foret_essai.yaml b/src/test/resources/data/foret/foret_essai.yaml
index b41b67846f323a53c6e4a02be4df8bc93d74a970..5a146dbc6725dbd6b933b45033e1b818b88b1187 100644
--- a/src/test/resources/data/foret/foret_essai.yaml
+++ b/src/test/resources/data/foret/foret_essai.yaml
@@ -33,37 +33,44 @@ references:
   zones_etudes:
     validations:
       typeSitesRef:
-        description: référence au type de site
+        internationalizationName:
+          fr: référence au type de site
+        columns: [ type de site ]
         checker:
           name: Reference
           params:
             refType: types_de_zones_etudes
-            columns: type de site
             required: true
-            codify: true
+            transformation:
+              codify: true
       parent_ref:
-        description: référence au parent
+        internationalizationName:
+          fr: référence au parent
+        columns: [ parent ]
         checker:
           name: Reference
           params:
             refType: zones_etudes
-            columns: parent
             required: false
-            codify: true
+            transformation:
+              codify: true
       date début:
-        description: date de début
+        internationalizationName:
+          fr: date de début
         checker:
           name: Date
           params:
             pattern: dd/MM/yyyy
-            columns: date début
+        columns: [ date début ]
       date fin:
-        description: date de fin
+        internationalizationName:
+          fr: date de fin
         checker:
           name: Date
           params:
             pattern: dd/MM/yyyy
-            columns: date fin
+            required: false
+        columns: [ date fin ]
     internationalizationName:
       fr: Zones d'études
       en: Study areas
@@ -129,19 +136,21 @@ references:
   theme_types_de_donnees_par_zone_etudes:
     validations:
       siteRef:
-        description: référence au site
+        internationalizationName:
+          fr: référence au site
+        columns: [ nom du site ]
         checker:
           name: Reference
           params:
             refType: zones_etudes
-            columns: nom du site
       themeRef:
-        description: référence au thème
+        internationalizationName:
+          fr: référence au thème
+        columns: [ nom du thème ]
         checker:
           name: Reference
           params:
             refType: themes
-            columns: nom du thème
     internationalizationName:
       fr: Thèmes et types de données par zone d'étude
       en: Thematics and data types by study area
@@ -202,23 +211,27 @@ references:
   variables_par_types_de_donnees:
     validations:
       variableRef:
-        description: référence à la variable
+        internationalizationName:
+          fr: référence à la variable
+        columns: [ nom de la variable ]
         checker:
           name: Reference
           params:
             refType: variables
-            columns: nom de la variable
             required: true
-            codify: true
+            transformation:
+              codify: true
       uniteRef:
-        description: référence à l'unité'
+        internationalizationName:
+          fr: référence à l'unité'
+        columns: [ nom de l'unité ]
         checker:
           name: Reference
           params:
             refType: unites
-            columns: nom de l'unité
             required: true
-            codify: true
+            transformation:
+              codify: true
     internationalizationName:
       fr: Thèmes et types de données par zone d'étude
       en: Thematics and data types by study area
@@ -238,14 +251,16 @@ references:
   traitements:
     validations:
       siteRef:
-        description: référence au site
+        internationalizationName:
+          fr: référence au site
+        columns: [ nom du site ]
         checker:
           name: Reference
           params:
             refType: zones_etudes
-            columns: nom du site
             required: true
-            codify: false
+            transformation:
+              codify: false
     internationalizationName:
       fr: Traitements
       en: Treatments
@@ -319,23 +334,27 @@ references:
   instruments_references:
     validations:
       instrumentRef:
-        description: référence à l'instrument
+        internationalizationName:
+          fr: référence à l'instrument
+        columns: [ code de l'instrument ]
         checker:
           name: Reference
           params:
             refType: instruments
-            columns: code de l'instrument
             required: true
-            codify: true
+            transformation:
+              codify: true
       DOIRef:
-        description: référence à la référence
+        internationalizationName:
+          fr: référence à la référence
+        columns: [ doi de la référence ]
         checker:
           name: Reference
           params:
             refType: reference
-            columns: doi de la référence
             required: true
-            codify: true
+            transformation:
+              codify: true
     internationalizationName:
       fr: Références des instruments
       en: Instruments references
@@ -350,72 +369,57 @@ references:
       code de l'instrument: null
       doi de la référence: null
   instruments_periodes:
-    validations:
-      instrumentRef:
-        description: référence à l'instrument
-        checker:
-          name: Reference
-          params:
-            refType: instruments
-            columns: Code de l'instrument
-            required: true
-            codify: true
-      checkSiteThemeDatatype:
-        description: référence au siteThemeDatatype
+    computedColumns:
+      theme_types_de_donnees_par_zone_etudes:
+        computation:
+          expression: >
+            String[] tab = datum.get("Nom du Thème-Type de
+            données-Variable").split("-"); String site = tab[0].strip();
+            String theme = tab[1].strip(); String datatype = tab[2].strip();
+            return references["theme_types_de_donnees_par_zone_etudes"]
+            .findAll {it.refValues["nom du site"].equals(site)} .findAll
+            {it.refValues["nom du thème"].equals(theme)} .find
+            {it.refValues["nom du type de données"].equals(datatype)}
+            .naturalKey
+          references:
+            - theme_types_de_donnees_par_zone_etudes
         checker:
           name: Reference
           params:
             refType: theme_types_de_donnees_par_zone_etudes
-            columns: theme_types_de_donnees_par_zone_etudes
-            groovy:
-              expression: >
-                String[] tab = datum.get("Nom du Thème-Type de
-                données-Variable").split("-"); String site = tab[0].strip();
-                String theme = tab[1].strip(); String datatype = tab[2].strip();
-                return references["theme_types_de_donnees_par_zone_etudes"]
-                .findAll {it.refValues["nom du site"].equals(site)} .findAll
-                {it.refValues["nom du thème"].equals(theme)} .find
-                {it.refValues["nom du type de données"].equals(datatype)}
-                .naturalKey
-              references:
-                - theme_types_de_donnees_par_zone_etudes
-      checkDataypeVariableUnite:
-        description: référence au DataypeVariableUnite
+      variables_par_types_de_donnees:
+        computation:
+          expression: >
+            String[] tab = datum.get("Nom du Thème-Type de
+            données-Variable").split("-"); String datatype =
+            fr.inra.oresing.rest.OreSiService.escapeKeyComponent(
+            tab[2].strip()); String variable =
+            fr.inra.oresing.rest.OreSiService.escapeKeyComponent(
+            tab[3].strip()); return
+            references.find{it.key.equals("variables_par_types_de_donnees")}.value
+                    .findAll {it.refValues["nom de la variable"].equals(variable)}
+                    .find {it.refValues["nom du type de données"].equals(datatype)}
+              .naturalKey
+          references:
+            - variables_par_types_de_donnees
         checker:
           name: Reference
           params:
             refType: variables_par_types_de_donnees
-            columns: variables_par_types_de_donnees
-            required: true
-            groovy:
-              expression: >
-                String[] tab = datum.get("Nom du Thème-Type de
-                données-Variable").split("-"); String datatype =
-                fr.inra.oresing.rest.OreSiService.escapeKeyComponent(
-                tab[2].strip()); String variable =
-                fr.inra.oresing.rest.OreSiService.escapeKeyComponent(
-                tab[3].strip()); return
-                references.find{it.key.equals("variables_par_types_de_donnees")}.value
-                        .findAll {it.refValues["nom de la variable"].equals(variable)}
-                        .find {it.refValues["nom du type de données"].equals(datatype)}
-                  .naturalKey
-              references:
-                - variables_par_types_de_donnees
-            codify: true
-      date début:
-        description: date de début
-        checker:
-          name: Date
-          params:
-            pattern: dd/MM/yyyy
-            columns: Date de début
-      date fin:
-        description: date de fin
+            transformation:
+              codify: true
+    validations:
+      instrumentRef:
+        internationalizationName:
+          fr: référence à l'instrument
+        columns: [ Code de l'instrument ]
         checker:
-          name: Date
+          name: Reference
           params:
-            pattern: dd/MM/yyyy
-            columns: Date de fin
+            refType: instruments
+            required: true
+            transformation:
+              codify: true
     internationalizationName:
       fr: Périodes d'application des instruments
       en: Application periods of the instruments
@@ -428,8 +432,16 @@ references:
     columns:
       Nom du Thème-Type de données-Variable: null
       Code de l'instrument: null
-      Date de début: null
-      Date de fin: null
+      Date de début:
+        checker:
+          name: Date
+          params:
+            pattern: dd/MM/yyyy
+      Date de fin:
+        checker:
+          name: Date
+          params:
+            pattern: dd/MM/yyyy
   methodes:
     internationalizationName:
       fr: Méthodes
@@ -456,23 +468,27 @@ references:
   methodes_references:
     validations:
       instrumentRef:
-        description: référence à la méthode
+        internationalizationName:
+          fr: référence à la méthode
+        columns: [ code de la méthode de calcul ]
         checker:
           name: Reference
           params:
             refType: methodes
-            columns: code de la méthode de calcul
             required: true
-            codify: true
+            transformation:
+              codify: true
       DOIRef:
-        description: référence à la référence
+        internationalizationName:
+          fr: référence à la référence
+        columns: [ doi de la référence ]
         checker:
           name: Reference
           params:
             refType: reference
-            columns: doi de la référence
             required: true
-            codify: true
+            transformation:
+              codify: true
     internationalizationName:
       fr: Références des méthodes
       en: Methods references
@@ -487,72 +503,66 @@ references:
       code de la méthode de calcul: null
       doi de la référence: null
   methodes_periodes:
-    validations:
-      methodeRef:
-        description: référence à la méthode
-        checker:
-          name: Reference
-          params:
-            refType: methodes
-            columns: Code de la méthode de calcul
-            required: true
-            codify: true
-      checkSiteThemeDatatype:
-        description: référence au siteThemeDatatype
+    computedColumns:
+      theme_types_de_donnees_par_zone_etudes:
+        computation:
+          expression: >
+            String[] tab = datum.get("Nom du Thème-Type de
+            données-Variable").split("-"); String site = tab[0].strip();
+            String theme = tab[1].strip(); String datatype = tab[2].strip();
+            return references["theme_types_de_donnees_par_zone_etudes"]
+            .findAll {it.refValues["nom du site"].equals(site)} .findAll
+            {it.refValues["nom du thème"].equals(theme)} .find
+            {it.refValues["nom du type de données"].equals(datatype)}
+            .naturalKey
+          references:
+            - theme_types_de_donnees_par_zone_etudes
         checker:
           name: Reference
           params:
             refType: theme_types_de_donnees_par_zone_etudes
-            columns: theme_types_de_donnees_par_zone_etudes
-            groovy:
-              expression: >
-                String[] tab = datum.get("Nom du Thème-Type de
-                données-Variable").split("-"); String site = tab[0].strip();
-                String theme = tab[1].strip(); String datatype = tab[2].strip();
-                return references["theme_types_de_donnees_par_zone_etudes"]
-                .findAll {it.refValues["nom du site"].equals(site)} .findAll
-                {it.refValues["nom du thème"].equals(theme)} .find
-                {it.refValues["nom du type de données"].equals(datatype)}
-                .naturalKey
-              references:
-                - theme_types_de_donnees_par_zone_etudes
-      checkDataypeVariableUnite:
-        description: référence au DataypeVariableUnite
+      variables_par_types_de_donnees:
+        computation:
+          expression: >
+            String[] tab = datum.get("Nom du Thème-Type de
+            données-Variable").split("-"); String datatype =
+            fr.inra.oresing.rest.OreSiService.escapeKeyComponent(
+            tab[2].strip()); String variable =
+            fr.inra.oresing.rest.OreSiService.escapeKeyComponent(
+            tab[3].strip()); return
+            references.find{it.key.equals("variables_par_types_de_donnees")}.value
+                    .findAll {it.refValues["nom de la variable"].equals(variable)}
+                    .find {it.refValues["nom du type de données"].equals(datatype)}
+              .naturalKey
+          references:
+            - variables_par_types_de_donnees
         checker:
           name: Reference
           params:
             refType: variables_par_types_de_donnees
-            columns: variables_par_types_de_donnees
             required: true
-            groovy:
-              expression: >
-                String[] tab = datum.get("Nom du Thème-Type de
-                données-Variable").split("-"); String datatype =
-                fr.inra.oresing.rest.OreSiService.escapeKeyComponent(
-                tab[2].strip()); String variable =
-                fr.inra.oresing.rest.OreSiService.escapeKeyComponent(
-                tab[3].strip()); return
-                references.find{it.key.equals("variables_par_types_de_donnees")}.value
-                        .findAll {it.refValues["nom de la variable"].equals(variable)}
-                        .find {it.refValues["nom du type de données"].equals(datatype)}
-                  .naturalKey
-              references:
-                - variables_par_types_de_donnees
-            codify: true
-      date début:
-        description: date de début
+            transformation:
+              codify: true
+    validations:
+      methodeRef:
+        internationalizationName:
+          fr: référence à la méthode
+        columns: [ Code de la méthode de calcul ]
         checker:
-          name: Date
+          name: Reference
           params:
-            pattern: dd/MM/yyyy
-            columns: Date de début
-      date fin:
-        description: date de fin
+            refType: methodes
+            required: true
+            transformation:
+              codify: true
+      dates:
+        internationalizationName:
+          fr: Les dates sont des jours
+        columns: [ Date de début, Date de fin ]
         checker:
           name: Date
           params:
             pattern: dd/MM/yyyy
-            columns: Date de fin
     internationalizationName:
       fr: Périodes d'application des méthodes
       en: Application periods of methods
@@ -598,13 +608,15 @@ references:
         en: '{libellé d''une valeur_fr}'
     validations:
       listeRef:
-        description: référence à la liste de valeurs d'informations complémentaires
+        internationalizationName:
+          fr: référence à la liste de valeurs d'informations complémentaires
+        columns: [ nom de la liste ]
         checker:
           name: Reference
           params:
             refType: listes_infos_complementaires
-            columns: nom de la liste
-            codify: true
+            transformation:
+              codify: true
     keyColumns:
       - nom de la liste
       - libellé d'une valeur_fr
@@ -616,13 +628,15 @@ references:
   informations_complementaires:
     validations:
       methodeRef:
-        description: référence à la liste de valeurs d'informations complémentaires
+        internationalizationName:
+          fr: référence à la liste de valeurs d'informations complémentaires
+        columns: [ nom de la liste de valeurs d'informations complémentaires ]
         checker:
           name: Reference
           params:
             refType: listes_infos_complementaires
-            columns: nom de la liste de valeurs d'informations complémentaires
-            codify: true
+            transformation:
+              codify: true
             required: false
     internationalizationName:
       fr: Informations complementaires
@@ -648,49 +662,45 @@ references:
       description de l'information complémentaire_en: null
       nom de la liste de valeurs d'informations complémentaires: null
   ic_site_theme_dataype_variable:
-    validations:
-      checkSiteThemeDatatype:
-        description: référence au siteThemeDatatype
+    computedColumns:
+      theme_types_de_donnees_par_zone_etudes:
+        computation:
+          expression: >
+            String[] tab = datum.get("Nom du Thème-Type de
+            données-Variable").split("-"); String site = tab[0].strip();
+            String theme = tab[1].strip(); String datatype = tab[2].strip();
+            return references["theme_types_de_donnees_par_zone_etudes"]
+            .findAll {it.refValues["nom du site"].equals(site)} .findAll
+            {it.refValues["nom du thème"].equals(theme)} .find
+            {it.refValues["nom du type de données"].equals(datatype)}
+            .naturalKey
+          references:
+            - theme_types_de_donnees_par_zone_etudes
         checker:
           name: Reference
           params:
             refType: theme_types_de_donnees_par_zone_etudes
-            columns: theme_types_de_donnees_par_zone_etudes
-            groovy:
-              expression: >
-                String[] tab = datum.get("Nom du Thème-Type de
-                données-Variable").split("-"); String site = tab[0].strip();
-                String theme = tab[1].strip(); String datatype = tab[2].strip();
-                return references["theme_types_de_donnees_par_zone_etudes"]
-                .findAll {it.refValues["nom du site"].equals(site)} .findAll
-                {it.refValues["nom du thème"].equals(theme)} .find
-                {it.refValues["nom du type de données"].equals(datatype)}
-                .naturalKey
-              references:
-                - theme_types_de_donnees_par_zone_etudes
-      checkDataypeVariableUnite:
-        description: référence au DataypeVariableUnite
+      variables_par_types_de_donnees:
+        computation:
+          expression: >
+            String[] tab = datum.get("Nom du Thème-Type de
+            données-Variable").split("-"); String datatype =
+            fr.inra.oresing.rest.OreSiService.escapeKeyComponent(
+            tab[2].strip()); String variable =
+            fr.inra.oresing.rest.OreSiService.escapeKeyComponent(
+            tab[3].strip()); return
+            references.find{it.key.equals("variables_par_types_de_donnees")}.value
+                    .findAll {it.refValues["nom de la variable"].equals(variable)}
+                    .find {it.refValues["nom du type de données"].equals(datatype)}
+              .naturalKey
+          references:
+            - variables_par_types_de_donnees
         checker:
           name: Reference
           params:
             refType: variables_par_types_de_donnees
-            columns: variables_par_types_de_donnees
-            required: true
-            groovy:
-              expression: >
-                String[] tab = datum.get("Nom du Thème-Type de
-                données-Variable").split("-"); String datatype =
-                fr.inra.oresing.rest.OreSiService.escapeKeyComponent(
-                tab[2].strip()); String variable =
-                fr.inra.oresing.rest.OreSiService.escapeKeyComponent(
-                tab[3].strip()); return
-                references.find{it.key.equals("variables_par_types_de_donnees")}.value
-                        .findAll {it.refValues["nom de la variable"].equals(variable)}
-                        .find {it.refValues["nom du type de données"].equals(datatype)}
-                  .naturalKey
-              references:
-                - variables_par_types_de_donnees
-            codify: true
+            transformation:
+              codify: true
     internationalizationName:
       fr: >-
         Informations complémentaires par site, thème, type de données et
@@ -722,7 +732,8 @@ references:
       - nom
     columns:
       nom: null
-      description: null
+      internationalizationName:
+        fr: null
 dataTypes:
   ts_infraj:
     internationalizationName:
@@ -762,60 +773,57 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "climat du sol"
+            defaultValue:
+              expression: return "climat du sol"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: infrajournalier
                 required: true
-                codify: true
-          start date:
-            checker:
-              name: Date
-              params:
-                pattern: dd/MM/yyyy
-          end date:
-            checker:
-              name: Date
-              params:
-                pattern: dd/MM/yyyy
+                transformation:
+                  codify: true
+          start date: null
+          end date: null
           comment: null
           profondeur max:
             checker:
@@ -840,8 +848,9 @@ dataTypes:
               params:
                 pattern: HH:mm
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
+            defaultValue:
+              expression: >
+                return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
             checker:
               name: Date
               params:
@@ -862,20 +871,23 @@ dataTypes:
               params:
                 refType: variables
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           value:
             checker:
               name: Float
               params:
                 required: false
           unit:
-            defaultValue: return "degre celcius"
+            defaultValue:
+              expression: return "degre celcius"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           profondeur:
             checker:
               name: Float
@@ -886,6 +898,26 @@ dataTypes:
               name: Integer
               params:
                 required: true
+    validations:
+      controle du format des dates en jours:
+        variableComponents:
+          - variable: informations
+            component: start date
+          - variable: informations
+            component: end date
+        checker:
+          name: Date
+          params:
+            pattern: dd/MM/yyyy
+      controle de la chronologie:
+        checker:
+          name: GroovyExpression
+          params:
+            groovy:
+              expression: >
+                Date start = DateUtils.parseDate(datum.get("informations").get("start date"), "dd/MM/yyyy");
+                Date end = DateUtils.parseDate(datum.get("informations").get("end date"), "dd/MM/yyyy");
+                return start.before(end);
     format:
       constants:
         - rowNumber: 1
@@ -1004,50 +1036,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "climat du sol"
+            defaultValue:
+              expression: return "climat du sol"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: infrajournalier
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           start date:
             checker:
               name: Date
@@ -1082,8 +1119,9 @@ dataTypes:
               params:
                 pattern: HH:mm
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
+            defaultValue:
+              expression: >
+                return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
             checker:
               name: Date
               params:
@@ -1104,20 +1142,23 @@ dataTypes:
               params:
                 refType: variables
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           value:
             checker:
               name: Float
               params:
                 required: false
           unit:
-            defaultValue: return "kilopascal"
+            defaultValue:
+              expression: return "kilopascal"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           profondeur:
             checker:
               name: Float
@@ -1246,50 +1287,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "climat du sol"
+            defaultValue:
+              expression: return "climat du sol"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: infrajournalier
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           start date:
             checker:
               name: Date
@@ -1324,8 +1370,9 @@ dataTypes:
               params:
                 pattern: HH:mm
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
+            defaultValue:
+              expression: >
+                return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
             checker:
               name: Date
               params:
@@ -1346,20 +1393,23 @@ dataTypes:
               params:
                 refType: variables
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           value:
             checker:
               name: Float
               params:
                 required: false
           unit:
-            defaultValue: return "mètre"
+            defaultValue:
+              expression: return "mètre"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           profondeur:
             checker:
               name: Float
@@ -1488,50 +1538,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "climat du sol"
+            defaultValue:
+              expression: return "climat du sol"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: infrajournalier
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           start date:
             checker:
               name: Date
@@ -1566,8 +1621,9 @@ dataTypes:
               params:
                 pattern: HH:mm
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
+            defaultValue:
+              expression: >
+                return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
             checker:
               name: Date
               params:
@@ -1588,20 +1644,23 @@ dataTypes:
               params:
                 refType: variables
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           value:
             checker:
               name: Float
               params:
                 required: false
           unit:
-            defaultValue: return "watt_par_metre_carre"
+            defaultValue:
+              expression: return "watt_par_metre_carre"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           profondeur:
             checker:
               name: Float
@@ -1730,50 +1789,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "climat du sol"
+            defaultValue:
+              expression: return "climat du sol"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: infrajournalier
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           start date:
             checker:
               name: Date
@@ -1808,8 +1872,9 @@ dataTypes:
               params:
                 pattern: HH:mm
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
+            defaultValue:
+              expression: >
+                return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
             checker:
               name: Date
               params:
@@ -1830,20 +1895,23 @@ dataTypes:
               params:
                 refType: variables
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           value:
             checker:
               name: Float
               params:
                 required: false
           unit:
-            defaultValue: return "percentage"
+            defaultValue:
+              expression: return "percentage"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           profondeur:
             checker:
               name: Float
@@ -1972,50 +2040,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "climat du sol"
+            defaultValue:
+              expression: return "climat du sol"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: journalier
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           start date:
             checker:
               name: Date
@@ -2059,20 +2132,23 @@ dataTypes:
               params:
                 refType: variables
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           value:
             checker:
               name: Float
               params:
                 required: false
           unit:
-            defaultValue: return "degre celcius"
+            defaultValue:
+              expression: return "degre celcius"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           profondeur:
             checker:
               name: Float
@@ -2197,50 +2273,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "climat du sol"
+            defaultValue:
+              expression: return "climat du sol"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: journalier
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           start date:
             checker:
               name: Date
@@ -2284,20 +2365,23 @@ dataTypes:
               params:
                 refType: variables
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           value:
             checker:
               name: Float
               params:
                 required: false
           unit:
-            defaultValue: return "kilopascal"
+            defaultValue:
+              expression: return "kilopascal"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           profondeur:
             checker:
               name: Float
@@ -2422,50 +2506,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "climat du sol"
+            defaultValue:
+              expression: return "climat du sol"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: journalier
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           start date:
             checker:
               name: Date
@@ -2509,20 +2598,23 @@ dataTypes:
               params:
                 refType: variables
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           value:
             checker:
               name: Float
               params:
                 required: false
           unit:
-            defaultValue: return "mètre"
+            defaultValue:
+              expression: return "mètre"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           profondeur:
             checker:
               name: Float
@@ -2647,50 +2739,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "climat du sol"
+            defaultValue:
+              expression: return "climat du sol"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: journalier
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           start date:
             checker:
               name: Date
@@ -2734,20 +2831,23 @@ dataTypes:
               params:
                 refType: variables
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           value:
             checker:
               name: Float
               params:
                 required: false
           unit:
-            defaultValue: return "watt_par_metre_carre"
+            defaultValue:
+              expression: return "watt_par_metre_carre"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           profondeur:
             checker:
               name: Float
@@ -2872,50 +2972,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "climat du sol"
+            defaultValue:
+              expression: return "climat du sol"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: journalier
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           start date:
             checker:
               name: Date
@@ -2958,20 +3063,23 @@ dataTypes:
               params:
                 refType: variables
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           value:
             checker:
               name: Float
               params:
                 required: false
           unit:
-            defaultValue: return "percentage"
+            defaultValue:
+              expression: return "percentage"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           profondeur:
             checker:
               name: Float
@@ -3097,50 +3205,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "flux gazeux"
+            defaultValue:
+              expression: return "flux gazeux"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: Infra-journalier
                 required: true
-                codify: false
+                transformation:
+                  codify: false
           start date:
             checker:
               name: Date
@@ -3158,7 +3271,8 @@ dataTypes:
               params:
                 refType: traitements
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           no_chamber:
             checker:
               name: Integer
@@ -3180,8 +3294,9 @@ dataTypes:
             checker:
               name: Integer
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
+            defaultValue:
+              expression: >
+                return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
             checker:
               name: Date
               params:
@@ -3204,13 +3319,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par seconde"
+            defaultValue:
+              expression: return "micromole par mètre carré et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       FCH4:
         chartDescription:
           value: value
@@ -3228,13 +3345,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "nanomole par mètre carré et par seconde"
+            defaultValue:
+              expression: return "nanomole par mètre carré et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
     format:
       constants:
         - rowNumber: 1
@@ -3351,50 +3470,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "flux gazeux"
+            defaultValue:
+              expression: return "flux gazeux"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: journalier
                 required: true
-                codify: false
+                transformation:
+                  codify: false
           start date:
             checker:
               name: Date
@@ -3412,7 +3536,8 @@ dataTypes:
               params:
                 refType: traitements
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           no_chamber:
             checker:
               name: Integer
@@ -3458,13 +3583,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par seconde"
+            defaultValue:
+              expression: return "micromole par mètre carré et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Ta:
         chartDescription:
           value: value
@@ -3483,13 +3610,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mole"
+            defaultValue:
+              expression: return "micromole par mole"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
     format:
       constants:
         - rowNumber: 1
@@ -3609,50 +3738,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "flux gazeux"
+            defaultValue:
+              expression: return "flux gazeux"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: mensuel
                 required: true
-                codify: false
+                transformation:
+                  codify: false
           start date:
             checker:
               name: Date
@@ -3670,7 +3804,8 @@ dataTypes:
               params:
                 refType: traitements
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           no_chamber:
             checker:
               name: Integer
@@ -3706,13 +3841,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par seconde"
+            defaultValue:
+              expression: return "micromole par mètre carré et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
     format:
       constants:
         - rowNumber: 1
@@ -3829,50 +3966,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    -  zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      -  zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "Tour à flux"
+            defaultValue:
+              expression: return "Tour à flux"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: semi-horaire
                 required: true
-                codify: false
+                transformation:
+                  codify: false
           start date:
             checker:
               name: Date
@@ -3897,8 +4039,9 @@ dataTypes:
               params:
                 pattern: HH:mm
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
+            defaultValue:
+              expression: >
+                return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
             checker:
               name: Date
               params:
@@ -3916,13 +4059,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mole"
+            defaultValue:
+              expression: return "micromole par mole"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       H2O:
         chartDescription:
           value: value
@@ -3935,13 +4080,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mole"
+            defaultValue:
+              expression: return "micromole par mole"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       ZL:
         chartDescription:
           value: value
@@ -3954,13 +4101,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "sans unité"
+            defaultValue:
+              expression: return "sans unité"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       FCO2:
         chartDescription:
           value: value
@@ -3978,15 +4127,18 @@ dataTypes:
               params:
                 pattern: "0|1|2"
                 required: true
-                codify: false
+                transformation:
+                  codify: false
           unit:
-            defaultValue: return "micromole par mètre carré et par seconde"
+            defaultValue:
+              expression: return "micromole par mètre carré et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       H:
         chartDescription:
           value: value
@@ -4004,15 +4156,18 @@ dataTypes:
               params:
                 pattern: "0|1|2"
                 required: true
-                codify: false
+                transformation:
+                  codify: false
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       LE:
         chartDescription:
           value: value
@@ -4030,15 +4185,18 @@ dataTypes:
               params:
                 pattern: "0|1|2"
                 required: true
-                codify: false
+                transformation:
+                  codify: false
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       T:
         chartDescription:
           value: value
@@ -4056,15 +4214,18 @@ dataTypes:
               params:
                 pattern: "0|1|2"
                 required: true
-                codify: false
+                transformation:
+                  codify: false
           unit:
-            defaultValue: return "kilogramme par mètre et par seconde"
+            defaultValue:
+              expression: return "kilogramme par mètre et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       u*:
         chartDescription:
           value: value
@@ -4077,13 +4238,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "mètre par seconde"
+            defaultValue:
+              expression: return "mètre par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       TR:
         chartDescription:
           value: value
@@ -4096,13 +4259,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "millimètre par demi-heure"
+            defaultValue:
+              expression: return "millimètre par demi-heure"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Sb:
         chartDescription:
           value: value
@@ -4115,13 +4280,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Sc:
         chartDescription:
           value: value
@@ -4134,13 +4301,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par seconde"
+            defaultValue:
+              expression: return "micromole par mètre carré et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Sw:
         chartDescription:
           value: value
@@ -4153,13 +4322,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Sa:
         chartDescription:
           value: value
@@ -4172,13 +4343,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       FCO2_gf:
         chartDescription:
           value: value
@@ -4191,13 +4364,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par seconde"
+            defaultValue:
+              expression: return "micromole par mètre carré et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
     format:
       constants:
         - rowNumber: 1
@@ -4370,50 +4545,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "Tour à flux"
+            defaultValue:
+              expression: return "Tour à flux"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: journalier
                 required: true
-                codify: false
+                transformation:
+                  codify: false
           start date:
             checker:
               name: Date
@@ -4444,13 +4624,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mole"
+            defaultValue:
+              expression: return "micromole par mole"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       H2O:
         chartDescription:
           value: value
@@ -4463,13 +4645,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "millimole par mole"
+            defaultValue:
+              expression: return "millimole par mole"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       ZL:
         chartDescription:
           value: value
@@ -4482,13 +4666,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "sans unité"
+            defaultValue:
+              expression: return "sans unité"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       FCO2:
         chartDescription:
           value: value
@@ -4501,13 +4687,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "gramme de carbone par mètre carré et par jour"
+            defaultValue:
+              expression: return "gramme de carbone par mètre carré et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       H:
         chartDescription:
           value: value
@@ -4520,13 +4708,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par jour"
+            defaultValue:
+              expression: return "mégajoule par mètre et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       LE:
         chartDescription:
           value: value
@@ -4539,13 +4729,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "mégajoule par mètre et par jour"
+            defaultValue:
+              expression: return "mégajoule par mètre et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       T:
         chartDescription:
           value: value
@@ -4558,13 +4750,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "kilogramme par mètre et par seconde"
+            defaultValue:
+              expression: return "kilogramme par mètre et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       u*:
         chartDescription:
           value: value
@@ -4577,13 +4771,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "mètre par seconde"
+            defaultValue:
+              expression: return "mètre par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       TR:
         chartDescription:
           value: value
@@ -4596,13 +4792,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "millilitre par jour"
+            defaultValue:
+              expression: return "millilitre par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Sb:
         chartDescription:
           value: value
@@ -4615,13 +4813,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par jour"
+            defaultValue:
+              expression: return "mégajoule par mètre et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Sc:
         chartDescription:
           value: value
@@ -4634,13 +4834,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "gramme de carbone par mètre carré et par jour"
+            defaultValue:
+              expression: return "gramme de carbone par mètre carré et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Sw:
         chartDescription:
           value: value
@@ -4653,13 +4855,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par jour"
+            defaultValue:
+              expression: return "mégajoule par mètre et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Sa:
         chartDescription:
           value: value
@@ -4672,13 +4876,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par jour"
+            defaultValue:
+              expression: return "mégajoule par mètre et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       FCO2_gf:
         chartDescription:
           value: value
@@ -4691,13 +4897,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "gramme de carbone par mètre carré et par jour"
+            defaultValue:
+              expression: return "gramme de carbone par mètre carré et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
     format:
       constants:
         - rowNumber: 1
@@ -4850,50 +5058,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "Tour à flux"
+            defaultValue:
+              expression: return "Tour à flux"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: mensuel
                 required: true
-                codify: false
+                transformation:
+                  codify: false
           start date:
             checker:
               name: Date
@@ -4924,13 +5137,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mole"
+            defaultValue:
+              expression: return "micromole par mole"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       H2O:
         chartDescription:
           value: value
@@ -4943,13 +5158,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "millimole par mole"
+            defaultValue:
+              expression: return "millimole par mole"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       ZL:
         chartDescription:
           value: value
@@ -4962,13 +5179,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "sans unité"
+            defaultValue:
+              expression: return "sans unité"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       FCO2:
         chartDescription:
           value: value
@@ -4981,13 +5200,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "gramme de carbone par mètre carré et par mois"
+            defaultValue:
+              expression: return "gramme de carbone par mètre carré et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       H:
         chartDescription:
           value: value
@@ -5000,13 +5221,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par mois"
+            defaultValue:
+              expression: return "mégajoule par mètre et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       LE:
         chartDescription:
           value: value
@@ -5019,13 +5242,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "mégajoule par mètre et par mois"
+            defaultValue:
+              expression: return "mégajoule par mètre et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       T:
         chartDescription:
           value: value
@@ -5038,13 +5263,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "kilogramme par mètre et par seconde"
+            defaultValue:
+              expression: return "kilogramme par mètre et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       u*:
         chartDescription:
           value: value
@@ -5057,13 +5284,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "mètre par seconde"
+            defaultValue:
+              expression: return "mètre par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       TR:
         chartDescription:
           value: value
@@ -5076,13 +5305,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "litre par mois"
+            defaultValue:
+              expression: return "litre par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Sb:
         chartDescription:
           value: value
@@ -5095,13 +5326,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par mois"
+            defaultValue:
+              expression: return "mégajoule par mètre et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Sc:
         chartDescription:
           value: value
@@ -5114,13 +5347,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "gramme de carbone par mètre carré et par mois"
+            defaultValue:
+              expression: return "gramme de carbone par mètre carré et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Sw:
         chartDescription:
           value: value
@@ -5133,13 +5368,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par mois"
+            defaultValue:
+              expression: return "mégajoule par mètre et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Sa:
         chartDescription:
           value: value
@@ -5152,13 +5389,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par mois"
+            defaultValue:
+              expression: return "mégajoule par mètre et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       FCO2_gf:
         components:
           value:
@@ -5167,13 +5406,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "gramme de carbone par mètre carré et par mois"
+            defaultValue:
+              expression: return "gramme de carbone par mètre carré et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
     format:
       constants:
         - rowNumber: 1
@@ -5332,50 +5573,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "meteorologie"
+            defaultValue:
+              expression: return "meteorologie"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: semi-horaire
                 required: true
-                codify: false
+                transformation:
+                  codify: false
           start date:
             checker:
               name: Date
@@ -5400,8 +5646,9 @@ dataTypes:
               params:
                 pattern: HH:mm
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
+            defaultValue:
+              expression: >
+                return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
             checker:
               name: Date
               params:
@@ -5419,13 +5666,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "millimètre"
+            defaultValue:
+              expression: return "millimètre"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rg:
         chartDescription:
           value: value
@@ -5438,13 +5687,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rr:
         chartDescription:
           value: value
@@ -5457,13 +5708,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       LWin:
         chartDescription:
           value: value
@@ -5476,13 +5729,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       LWout:
         chartDescription:
           value: value
@@ -5495,13 +5750,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rn:
         chartDescription:
           value: value
@@ -5514,13 +5771,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rd:
         chartDescription:
           value: value
@@ -5533,13 +5792,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       PPFD:
         chartDescription:
           value: value
@@ -5552,13 +5813,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "micromole par mètre carré et par seconde"
+            defaultValue:
+              expression: return "micromole par mètre carré et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       PPFDd:
         chartDescription:
           value: value
@@ -5571,13 +5834,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "micromole par mètre carré et par seconde"
+            defaultValue:
+              expression: return "micromole par mètre carré et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       PPFDr:
         chartDescription:
           value: value
@@ -5590,13 +5855,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par seconde"
+            defaultValue:
+              expression: return "micromole par mètre carré et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       PPFDbc:
         chartDescription:
           value: value
@@ -5609,13 +5876,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par seconde"
+            defaultValue:
+              expression: return "micromole par mètre carré et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       APAR:
         chartDescription:
           value: value
@@ -5628,13 +5897,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par seconde"
+            defaultValue:
+              expression: return "micromole par mètre carré et par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Ta:
         chartDescription:
           value: value
@@ -5647,13 +5918,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "degré Celsius"
+            defaultValue:
+              expression: return "degré Celsius"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Pa:
         chartDescription:
           value: value
@@ -5666,13 +5939,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "kilopascal"
+            defaultValue:
+              expression: return "kilopascal"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Tc:
         chartDescription:
           value: value
@@ -5685,13 +5960,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "degré Celsius"
+            defaultValue:
+              expression: return "degré Celsius"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Tarbre:
         chartDescription:
           value: value
@@ -5704,13 +5981,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "degré Celsius"
+            defaultValue:
+              expression: return "degré Celsius"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       G:
         chartDescription:
           value: value
@@ -5723,13 +6002,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rh:
         chartDescription:
           value: value
@@ -5742,13 +6023,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "percentage"
+            defaultValue:
+              expression: return "percentage"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       WD:
         chartDescription:
           value: value
@@ -5761,13 +6044,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "degré"
+            defaultValue:
+              expression: return "degré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       WS:
         chartDescription:
           value: value
@@ -5780,13 +6065,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mètre par seconde"
+            defaultValue:
+              expression: return "mètre par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
     format:
       constants:
         - rowNumber: 1
@@ -5973,50 +6260,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "meteorologie"
+            defaultValue:
+              expression: return "meteorologie"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: journalier
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           start date:
             checker:
               name: Date
@@ -6047,13 +6339,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "millimètre"
+            defaultValue:
+              expression: return "millimètre"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rg:
         chartDescription:
           value: value
@@ -6066,13 +6360,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rr:
         chartDescription:
           value: value
@@ -6085,13 +6381,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Lwin:
         chartDescription:
           value: value
@@ -6104,13 +6402,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Lwout:
         chartDescription:
           value: value
@@ -6123,13 +6423,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rn:
         chartDescription:
           value: value
@@ -6142,13 +6444,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rd:
         chartDescription:
           value: value
@@ -6161,13 +6465,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "watt par mètre carré"
+            defaultValue:
+              expression: return "watt par mètre carré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       PPFD:
         chartDescription:
           value: value
@@ -6180,13 +6486,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "micromole par mètre carré et par jour"
+            defaultValue:
+              expression: return "micromole par mètre carré et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       PPFDd:
         chartDescription:
           value: value
@@ -6199,13 +6507,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "micromole par mètre carré et par jour"
+            defaultValue:
+              expression: return "micromole par mètre carré et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       PPFDr:
         chartDescription:
           value: value
@@ -6218,13 +6528,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par jour"
+            defaultValue:
+              expression: return "micromole par mètre carré et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       PPFDbc:
         chartDescription:
           value: value
@@ -6237,13 +6549,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par jour"
+            defaultValue:
+              expression: return "micromole par mètre carré et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       APAR:
         chartDescription:
           value: value
@@ -6256,13 +6570,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par jour"
+            defaultValue:
+              expression: return "micromole par mètre carré et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Ta:
         chartDescription:
           value: value
@@ -6275,13 +6591,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "degré"
+            defaultValue:
+              expression: return "degré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Pa:
         chartDescription:
           value: value
@@ -6294,13 +6612,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "kilopascal"
+            defaultValue:
+              expression: return "kilopascal"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Tc:
         chartDescription:
           value: value
@@ -6313,13 +6633,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "degré Celsius"
+            defaultValue:
+              expression: return "degré Celsius"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Tarbre:
         chartDescription:
           value: value
@@ -6332,13 +6654,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "degré Celsius"
+            defaultValue:
+              expression: return "degré Celsius"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       G:
         chartDescription:
           value: value
@@ -6351,13 +6675,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par jour"
+            defaultValue:
+              expression: return "mégajoule par mètre et par jour"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rh:
         chartDescription:
           value: value
@@ -6370,13 +6696,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "percentage"
+            defaultValue:
+              expression: return "percentage"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       WD:
         chartDescription:
           value: value
@@ -6389,13 +6717,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "degré"
+            defaultValue:
+              expression: return "degré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       WS:
         chartDescription:
           value: value
@@ -6408,13 +6738,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mètre par seconde"
+            defaultValue:
+              expression: return "mètre par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
     format:
       constants:
         - rowNumber: 1
@@ -6597,50 +6929,55 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
               params:
-                groovy:
-                  expression: >
-                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                    String nom = datumByVariableAndComponent.localization.zones_etudes;
-                    String hierarchicalKey = ""; 
-                    if ("".equals(nom)){
-                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                    }else{
-                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                    }
-                    
-                    return references
-                    .find{it.key.equals("zones_etudes")}.value
-                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                  references:
-                    - zones_etudes
-                codify: true
+                transformation:
+                  groovy:
+                    expression: >
+                      String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                      String nom = datumByVariableAndComponent.localization.zones_etudes;
+                      String hierarchicalKey = ""; 
+                      if ("".equals(nom)){
+                        hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                      }else{
+                        parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                        nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                        hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                      }
+                      
+                      return references
+                      .find{it.key.equals("zones_etudes")}.value
+                      .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                    references:
+                      - zones_etudes
+                  codify: true
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "meteorologie"
+            defaultValue:
+              expression: return "meteorologie"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: mensuel
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           start date:
             checker:
               name: Date
@@ -6671,13 +7008,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mètre"
+            defaultValue:
+              expression: return "mètre"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rg:
         chartDescription:
           value: value
@@ -6690,13 +7029,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par mois"
+            defaultValue:
+              expression: return "mégajoule par mètre et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rr:
         chartDescription:
           value: value
@@ -6709,13 +7050,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par mois"
+            defaultValue:
+              expression: return "mégajoule par mètre et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Lwin:
         chartDescription:
           value: value
@@ -6728,13 +7071,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par mois"
+            defaultValue:
+              expression: return "mégajoule par mètre et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Lwout:
         chartDescription:
           value: value
@@ -6747,13 +7092,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par mois"
+            defaultValue:
+              expression: return "mégajoule par mètre et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rn:
         chartDescription:
           value: value
@@ -6766,13 +7113,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "mégajoule par mètre et par mois"
+            defaultValue:
+              expression: return "mégajoule par mètre et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rd:
         chartDescription:
           value: value
@@ -6785,13 +7134,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "mégajoule par mètre et par mois"
+            defaultValue:
+              expression: return "mégajoule par mètre et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       PPFD:
         chartDescription:
           value: value
@@ -6804,13 +7155,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "micromole par mètre carré et par mois"
+            defaultValue:
+              expression: return "micromole par mètre carré et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       PPFDd:
         chartDescription:
           value: value
@@ -6823,13 +7176,15 @@ dataTypes:
               params:
                 required: true
           unit:
-            defaultValue: return "micromole par mètre carré et par mois"
+            defaultValue:
+              expression: return "micromole par mètre carré et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       PPFDr:
         chartDescription:
           value: value
@@ -6842,13 +7197,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par mois"
+            defaultValue:
+              expression: return "micromole par mètre carré et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       PPFDbc:
         chartDescription:
           value: value
@@ -6861,13 +7218,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par mois"
+            defaultValue:
+              expression: return "micromole par mètre carré et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       APAR:
         chartDescription:
           value: value
@@ -6880,13 +7239,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "micromole par mètre carré et par mois"
+            defaultValue:
+              expression: return "micromole par mètre carré et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Ta:
         chartDescription:
           value: value
@@ -6899,13 +7260,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "degré Celsius"
+            defaultValue:
+              expression: return "degré Celsius"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Pa:
         chartDescription:
           value: value
@@ -6918,13 +7281,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "kilopascal"
+            defaultValue:
+              expression: return "kilopascal"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Tc:
         chartDescription:
           value: value
@@ -6937,13 +7302,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "degré Celsius"
+            defaultValue:
+              expression: return "degré Celsius"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Tarbre:
         chartDescription:
           value: value
@@ -6956,13 +7323,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "degré Celsius"
+            defaultValue:
+              expression: return "degré Celsius"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       G:
         chartDescription:
           value: value
@@ -6975,13 +7344,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mégajoule par mètre et par mois"
+            defaultValue:
+              expression: return "mégajoule par mètre et par mois"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       Rh:
         chartDescription:
           value: value
@@ -6994,13 +7365,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "percentage"
+            defaultValue:
+              expression: return "percentage"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       WD:
         chartDescription:
           value: value
@@ -7013,13 +7386,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "degré"
+            defaultValue:
+              expression: return "degré"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
       WS:
         chartDescription:
           value: value
@@ -7032,13 +7407,15 @@ dataTypes:
               params:
                 required: null
           unit:
-            defaultValue: return "mètre par seconde"
+            defaultValue:
+              expression: return "mètre par seconde"
             checker:
               name: Reference
               params:
                 refType: unites
                 required: true
-                codify: true
+                transformation:
+                  codify: true
     format:
       constants:
         - rowNumber: 1
diff --git a/src/test/resources/data/foret/multiyaml/configuration.yaml b/src/test/resources/data/foret/multiyaml/configuration.yaml
index e05d84efad45336610cffd445fb21e5f21fc9b2b..e77bf13a9c36bad32b78e2ed0b01e86b57da3530 100644
--- a/src/test/resources/data/foret/multiyaml/configuration.yaml
+++ b/src/test/resources/data/foret/multiyaml/configuration.yaml
@@ -22,34 +22,40 @@ dataTypes:
           ${variable}:
             components:
               variable:
-                defaultValue: return "GWD"
+                defaultValue:
+                  expression: return "GWD"
                 checker:
                   name: Reference
                   params:
                     refType: variables
                     required: true
-                    codify: true
+                    transformation:
+                      codify: true
               value:
                 checker:
                   name: Float
                   params:
                     required: false
               unit:
-                defaultValue: return "degre celcius"
+                defaultValue:
+                  expression: return "degre celcius"
                 checker:
                   name: Reference
                   params:
                     refType: unites
                     required: true
-                    codify: true
+                    transformation:
+                      codify: true
               profondeur:
-                defaultValue: return "${profondeur}"
+                defaultValue:
+                  expression: return "${profondeur}"
                 checker:
                   name: Float
                   params:
                     required: false
               repetition:
-                defaultValue: return "${répétition}"
+                defaultValue:
+                  expression: return "${répétition}"
                 checker:
                   name: Integer
                   params:
@@ -66,7 +72,7 @@ dataTypes:
         informations:
           label: "Informations"
           data:
-          - informations
+            - informations
         referentiel:
           label: "Référentiel"
           data:
@@ -82,48 +88,54 @@ dataTypes:
             checker:
               name: Reference
               params:
-                codify: true
+                transformation:
+                  codify: true
                 refType: zones_etudes
                 required: false
           zones_etudes:
             checker:
               name: Reference
-              params:
-                groovy: >
-                  String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                  String nom = datumByVariableAndComponent.localization.zones_etudes;
-                  String hierarchicalKey = ""; 
-                  if ("".equals(nom)){
-                    hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                  }else{
-                    parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                    nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                    hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                  }
-                  
-                  return references
-                  .find{it.key.equals("zones_etudes")}.value
-                  .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-                references: zones_etudes
+              transformation:
+                groovy:
+                  expression: >
+                    String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                    String nom = datumByVariableAndComponent.localization.zones_etudes;
+                    String hierarchicalKey = ""; 
+                    if ("".equals(nom)){
+                      hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                    }else{
+                      parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                      nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                      hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                    }
+                    
+                    return references
+                    .find{it.key.equals("zones_etudes")}.value
+                    .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                  references: zones_etudes
                 codify: true
+              params:
                 refType: zones_etudes
                 required: true
       informations:
         components:
           thematic:
-            defaultValue: return "climat du sol"
+            defaultValue:
+              expression: return "climat du sol"
             checker:
               name: Reference
               params:
                 refType: themes
-                codify: true
+                transformation:
+                  codify: true
           frequency:
             checker:
               name: RegularExpression
               params:
                 pattern: infrajournalier
                 required: true
-                codify: true
+                transformation:
+                  codify: true
           start date:
             checker:
               name: Date
@@ -158,8 +170,9 @@ dataTypes:
               params:
                 pattern: HH:mm
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
+            defaultValue:
+              expression: >
+                return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
             checker:
               name: Date
               params:
@@ -225,4 +238,4 @@ dataTypes:
         - header: Time
           boundTo:
             variable: date
-            component: tim
\ No newline at end of file
+            component: time
\ No newline at end of file
diff --git a/src/test/resources/data/foret/multiyaml/dataTypes/smp_infraj.yaml b/src/test/resources/data/foret/multiyaml/dataTypes/smp_infraj.yaml
index 5a5b8138562a0fb64c6c789456f93a0f23a0d6d7..582c3da9501118fe1afd7879a393bb0acb42997c 100644
--- a/src/test/resources/data/foret/multiyaml/dataTypes/smp_infraj.yaml
+++ b/src/test/resources/data/foret/multiyaml/dataTypes/smp_infraj.yaml
@@ -19,34 +19,40 @@
         ${variable}:
           components:
             variable:
-              defaultValue: return "SMP"
+              defaultValue:
+                expression: return "SMP"
               checker:
                 name: Reference
                 params:
                   refType: variables
                   required: true
-                  codify: true
+                  transformation:
+                    codify: true
             value:
               checker:
                 name: Float
                 params:
                   required: false
             unit:
-              defaultValue: return "kilopascal"
+              defaultValue:
+                expression: return "kilopascal"
               checker:
                 name: Reference
                 params:
                   refType: unites
                   required: true
-                  codify: true
+                  transformation:
+                    codify: true
             profondeur:
-              defaultValue: return "${profondeur}"
+              defaultValue:
+                expression: return "${profondeur}"
               checker:
                 name: Float
                 params:
                   required: false
             repetition:
-              defaultValue: return "${répétition}"
+              defaultValue:
+                expression: return "${répétition}"
               checker:
                 name: Integer
                 params:
@@ -79,48 +85,53 @@
           checker:
             name: Reference
             params:
-              codify: true
+              transformation:
+                codify: true
               refType: zones_etudes
               required: false
         zones_etudes:
           checker:
             name: Reference
             params:
-              groovy: >
-                String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                String nom = datumByVariableAndComponent.localization.zones_etudes;
-                String hierarchicalKey = ""; 
-                if ("".equals(nom)){
-                  hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                }else{
-                  parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                  nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                  hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                }
-                
-                return references
-                .find{it.key.equals("zones_etudes")}.value
-                .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-              references: zones_etudes
-              codify: true
+              transformation:
+                groovy: >
+                  String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                  String nom = datumByVariableAndComponent.localization.zones_etudes;
+                  String hierarchicalKey = ""; 
+                  if ("".equals(nom)){
+                    hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                  }else{
+                    parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                    nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                    hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                  }
+                  
+                  return references
+                  .find{it.key.equals("zones_etudes")}.value
+                  .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                references: zones_etudes
+                codify: true
               refType: zones_etudes
               required: true
     informations:
       components:
         thematic:
-          defaultValue: return "climat du sol"
+          defaultValue:
+            expression: return "climat du sol"
           checker:
             name: Reference
             params:
               refType: themes
-              codify: true
+              transformation:
+                codify: true
         frequency:
           checker:
             name: RegularExpression
             params:
               pattern: infrajournalier
               required: true
-              codify: true
+              transformation:
+                codify: true
         start date:
           checker:
             name: Date
@@ -155,8 +166,9 @@
             params:
               pattern: HH:mm
         datetime:
-          defaultValue: >
-            return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
+          defaultValue:
+            expression: >
+              return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
           checker:
             name: Date
             params:
diff --git a/src/test/resources/data/foret/multiyaml/dataTypes/ts_infraj.yaml b/src/test/resources/data/foret/multiyaml/dataTypes/ts_infraj.yaml
index f2ab721751d12dcd7dc8090cb642df0a89fb1354..449d9534fb90c3cad3e5c866f13df6f3529fc5c5 100644
--- a/src/test/resources/data/foret/multiyaml/dataTypes/ts_infraj.yaml
+++ b/src/test/resources/data/foret/multiyaml/dataTypes/ts_infraj.yaml
@@ -19,34 +19,40 @@
         ${variable}:
           components:
             variable:
-              defaultValue: return "TS"
+              defaultValue:
+                expression: return "TS"
               checker:
                 name: Reference
                 params:
                   refType: variables
                   required: true
-                  codify: true
+                  transformation:
+                    codify: true
             value:
               checker:
                 name: Float
                 params:
                   required: false
             unit:
-              defaultValue: return "degre celcius"
+              defaultValue:
+                expression: return "degre celcius"
               checker:
                 name: Reference
                 params:
                   refType: unites
                   required: true
-                  codify: true
+                  transformation:
+                    codify: true
             profondeur:
-              defaultValue: return "${profondeur}"
+              defaultValue:
+                expression: return "${profondeur}"
               checker:
                 name: Float
                 params:
                   required: false
             repetition:
-              defaultValue: return "${répétition}"
+              defaultValue:
+                expression: return "${répétition}"
               checker:
                 name: Integer
                 params:
@@ -79,48 +85,53 @@
           checker:
             name: Reference
             params:
-              codify: true
+              transformation:
+                codify: true
               refType: zones_etudes
               required: false
         zones_etudes:
           checker:
             name: Reference
             params:
-              groovy: >
-                String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
-                String nom = datumByVariableAndComponent.localization.zones_etudes;
-                String hierarchicalKey = ""; 
-                if ("".equals(nom)){
-                  hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
-                }else{
-                  parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
-                  nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
-                  hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
-                }
-                
-                return references
-                .find{it.key.equals("zones_etudes")}.value
-                .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
-              references: zones_etudes
-              codify: true
+              transformation:
+                groovy: >
+                  String parent = datumByVariableAndComponent.localization.zones_etudes_parent;
+                  String nom = datumByVariableAndComponent.localization.zones_etudes;
+                  String hierarchicalKey = ""; 
+                  if ("".equals(nom)){
+                    hierarchicalKey = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent);
+                  }else{
+                    parent = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(parent)
+                    nom = fr.inra.oresing.rest.OreSiService.escapeKeyComponent(nom)
+                    hierarchicalKey = String.format("%s.%s__%s", parent, parent, nom)
+                  }
+                  
+                  return references
+                  .find{it.key.equals("zones_etudes")}.value
+                  .find {it.hierarchicalKey.equals(hierarchicalKey)} .hierarchicalKey
+                references: zones_etudes
+                codify: true
               refType: zones_etudes
               required: true
     informations:
       components:
         thematic:
-          defaultValue: return "climat du sol"
+          defaultValue:
+            expression: return "climat du sol"
           checker:
             name: Reference
             params:
               refType: themes
-              codify: true
+              transformation:
+                codify: true
         frequency:
           checker:
             name: RegularExpression
             params:
               pattern: infrajournalier
               required: true
-              codify: true
+              transformation:
+                codify: true
         start date:
           checker:
             name: Date
@@ -155,8 +166,9 @@
             params:
               pattern: HH:mm
         datetime:
-          defaultValue: >
-            return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
+          defaultValue:
+            expression: >
+              return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
           checker:
             name: Date
             params:
diff --git a/src/test/resources/data/foret/multiyaml/references/zones_etudes.yaml b/src/test/resources/data/foret/multiyaml/references/zones_etudes.yaml
index cca65af77746d679832f087631283f861daf2f87..93f4982741e6259097a8fac153e8c0f79cba8156 100644
--- a/src/test/resources/data/foret/multiyaml/references/zones_etudes.yaml
+++ b/src/test/resources/data/foret/multiyaml/references/zones_etudes.yaml
@@ -1,31 +1,37 @@
 validations:
   typeSitesRef:
-    description: référence au type de site
+    internationalizationName:
+      fr: référence au type de site
     checker:
       name: Reference
       params:
         refType: types_de_zones_etudes
         columns: type de site
         required: true
-        codify: true
+        transformation:
+          codify: true
   parent_ref:
-    description: référence au parent
+    internationalizationName:
+      fr: référence au parent
     checker:
       name: Reference
       params:
         refType: zones_etudes
         columns: parent
         required: false
-        codify: true
+        transformation:
+          codify: true
   date début:
-    description: date de début
+    internationalizationName:
+      fr: date de début
     checker:
       name: Date
       params:
         pattern: dd/MM/yyyy
         columns: date début
   date fin:
-    description: date de fin
+    internationalizationName:
+      fr: date de fin
     checker:
       name: Date
       params:
diff --git a/src/test/resources/data/hautefrequence/hautefrequence.yaml b/src/test/resources/data/hautefrequence/hautefrequence.yaml
index 953b1a827d0e41234d0d7337edb49b178d1146b6..c9ef7e59405a52a1aea418151ea3559ab2e51100 100644
--- a/src/test/resources/data/hautefrequence/hautefrequence.yaml
+++ b/src/test/resources/data/hautefrequence/hautefrequence.yaml
@@ -61,8 +61,8 @@ dataTypes:
       date: 
         components:
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.date.day +" " +datumByVariableAndComponent.date.time
+            defaultValue:
+              expression: return datumByVariableAndComponent.date.day +" " +datumByVariableAndComponent.date.time
             checker:
               name: Date
               params:
diff --git a/src/test/resources/data/monsore/compare/export.csv b/src/test/resources/data/monsore/compare/export.csv
index 5eba68c29519877a8ca67a54fa0f5fa0cd7ab1c8..2e03525e734dedfe6e6ce0890e3647180273c075 100644
--- a/src/test/resources/data/monsore/compare/export.csv
+++ b/src/test/resources/data/monsore/compare/export.csv
@@ -1,273 +1,273 @@
-date;site;projet;espece;Nombre d'individus;plateforme;Couleur des individus
-01/01/1984;bassin_versant.nivelle;projet_atlantique;sat;39;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.nivelle;projet_atlantique;alo;15;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.nivelle;projet_atlantique;ang;38;p1;couleur_des_individus__vert
-01/01/1984;bassin_versant.nivelle;projet_atlantique;trf;18;p1;couleur_des_individus__rouge
-01/01/1984;bassin_versant.nivelle;projet_atlantique;lpm;27;p1;couleur_des_individus__rouge
-01/01/1984;bassin_versant.nivelle;projet_atlantique;lpf;54;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.nivelle;projet_atlantique;trm;25;p1;couleur_des_individus__vert
-01/01/1984;plateforme.oir.oir__p1;projet_atlantique;lpm;27;a;couleur_des_individus__rouge
-01/01/1984;plateforme.oir.oir__p1;projet_atlantique;trf;18;a;couleur_des_individus__rouge
-01/01/1984;plateforme.oir.oir__p1;projet_atlantique;sat;39;a;couleur_des_individus__bleu
-01/01/1984;plateforme.oir.oir__p1;projet_atlantique;ang;38;a;couleur_des_individus__vert
-01/01/1984;plateforme.oir.oir__p1;projet_atlantique;alo;15;a;couleur_des_individus__bleu
-01/01/1984;plateforme.oir.oir__p1;projet_atlantique;trm;25;a;couleur_des_individus__vert
-01/01/1984;plateforme.oir.oir__p1;projet_atlantique;lpf;54;a;couleur_des_individus__bleu
-01/01/1984;bassin_versant.oir;projet_atlantique;trm;25;p2;couleur_des_individus__vert
-01/01/1984;bassin_versant.oir;projet_atlantique;trf;18;p2;couleur_des_individus__rouge
-01/01/1984;bassin_versant.oir;projet_atlantique;ang;38;p2;couleur_des_individus__vert
-01/01/1984;bassin_versant.oir;projet_atlantique;lpf;54;p2;couleur_des_individus__bleu
-01/01/1984;bassin_versant.oir;projet_atlantique;alo;15;p2;couleur_des_individus__bleu
-01/01/1984;bassin_versant.oir;projet_atlantique;sat;39;p2;couleur_des_individus__bleu
-01/01/1984;bassin_versant.oir;projet_atlantique;lpm;27;p2;couleur_des_individus__rouge
-01/01/1984;bassin_versant.scarff;projet_atlantique;sat;39;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.scarff;projet_atlantique;lpf;54;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.scarff;projet_atlantique;ang;38;p1;couleur_des_individus__vert
-01/01/1984;bassin_versant.scarff;projet_atlantique;trm;25;p1;couleur_des_individus__vert
-01/01/1984;bassin_versant.scarff;projet_atlantique;lpm;27;p1;couleur_des_individus__rouge
-01/01/1984;bassin_versant.scarff;projet_atlantique;trf;18;p1;couleur_des_individus__rouge
-01/01/1984;bassin_versant.scarff;projet_atlantique;alo;15;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.nivelle;projet_manche;trf;18;p1;couleur_des_individus__rouge
-01/01/1984;bassin_versant.nivelle;projet_manche;alo;15;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.nivelle;projet_manche;lpf;54;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.nivelle;projet_manche;lpm;27;p1;couleur_des_individus__rouge
-01/01/1984;bassin_versant.nivelle;projet_manche;sat;39;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.nivelle;projet_manche;trm;25;p1;couleur_des_individus__vert
-01/01/1984;bassin_versant.nivelle;projet_manche;ang;38;p1;couleur_des_individus__vert
-01/01/1984;bassin_versant.oir;projet_manche;lpm;27;p1;couleur_des_individus__rouge
-01/01/1984;bassin_versant.oir;projet_manche;lpf;54;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.oir;projet_manche;sat;39;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.oir;projet_manche;trf;18;p1;couleur_des_individus__rouge
-01/01/1984;bassin_versant.oir;projet_manche;alo;15;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.oir;projet_manche;ang;38;p1;couleur_des_individus__vert
-01/01/1984;bassin_versant.oir;projet_manche;trm;25;p1;couleur_des_individus__vert
-01/01/1984;bassin_versant.oir;projet_manche;lpf;54;p2;couleur_des_individus__bleu
-01/01/1984;bassin_versant.oir;projet_manche;alo;15;p2;couleur_des_individus__bleu
-01/01/1984;bassin_versant.oir;projet_manche;trf;18;p2;couleur_des_individus__rouge
-01/01/1984;bassin_versant.oir;projet_manche;sat;39;p2;couleur_des_individus__bleu
-01/01/1984;bassin_versant.oir;projet_manche;lpm;27;p2;couleur_des_individus__rouge
-01/01/1984;bassin_versant.oir;projet_manche;ang;38;p2;couleur_des_individus__vert
-01/01/1984;bassin_versant.oir;projet_manche;trm;25;p2;couleur_des_individus__vert
-01/01/1984;bassin_versant.scarff;projet_manche;ang;38;p1;couleur_des_individus__vert
-01/01/1984;bassin_versant.scarff;projet_manche;lpm;27;p1;couleur_des_individus__rouge
-01/01/1984;bassin_versant.scarff;projet_manche;trm;25;p1;couleur_des_individus__vert
-01/01/1984;bassin_versant.scarff;projet_manche;alo;15;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.scarff;projet_manche;trf;18;p1;couleur_des_individus__rouge
-01/01/1984;bassin_versant.scarff;projet_manche;lpf;54;p1;couleur_des_individus__bleu
-01/01/1984;bassin_versant.scarff;projet_manche;sat;39;p1;couleur_des_individus__bleu
-02/01/1984;bassin_versant.nivelle;projet_atlantique;alo;18;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.nivelle;projet_atlantique;lpm;32;p1;couleur_des_individus__bleu
-02/01/1984;bassin_versant.nivelle;projet_atlantique;ang;25;p1;couleur_des_individus__rouge
-02/01/1984;bassin_versant.nivelle;projet_atlantique;lpf;;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.nivelle;projet_atlantique;trm;25;p1;couleur_des_individus__rouge
-02/01/1984;bassin_versant.nivelle;projet_atlantique;sat;15;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.nivelle;projet_atlantique;trf;14;p1;couleur_des_individus__bleu
-02/01/1984;plateforme.oir.oir__p1;projet_atlantique;sat;15;a;couleur_des_individus__vert
-02/01/1984;plateforme.oir.oir__p1;projet_atlantique;alo;18;a;couleur_des_individus__vert
-02/01/1984;plateforme.oir.oir__p1;projet_atlantique;ang;25;a;couleur_des_individus__rouge
-02/01/1984;plateforme.oir.oir__p1;projet_atlantique;trf;14;a;couleur_des_individus__bleu
-02/01/1984;plateforme.oir.oir__p1;projet_atlantique;lpm;32;a;couleur_des_individus__bleu
-02/01/1984;plateforme.oir.oir__p1;projet_atlantique;lpf;;a;couleur_des_individus__vert
-02/01/1984;plateforme.oir.oir__p1;projet_atlantique;trm;25;a;couleur_des_individus__rouge
-02/01/1984;bassin_versant.oir;projet_atlantique;trm;25;p2;couleur_des_individus__rouge
-02/01/1984;bassin_versant.oir;projet_atlantique;trf;14;p2;couleur_des_individus__bleu
-02/01/1984;bassin_versant.oir;projet_atlantique;lpf;;p2;couleur_des_individus__vert
-02/01/1984;bassin_versant.oir;projet_atlantique;ang;25;p2;couleur_des_individus__rouge
-02/01/1984;bassin_versant.oir;projet_atlantique;lpm;32;p2;couleur_des_individus__bleu
-02/01/1984;bassin_versant.oir;projet_atlantique;alo;18;p2;couleur_des_individus__vert
-02/01/1984;bassin_versant.oir;projet_atlantique;sat;15;p2;couleur_des_individus__vert
-02/01/1984;bassin_versant.scarff;projet_atlantique;alo;18;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.scarff;projet_atlantique;trf;14;p1;couleur_des_individus__bleu
-02/01/1984;bassin_versant.scarff;projet_atlantique;ang;25;p1;couleur_des_individus__rouge
-02/01/1984;bassin_versant.scarff;projet_atlantique;lpf;;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.scarff;projet_atlantique;lpm;32;p1;couleur_des_individus__bleu
-02/01/1984;bassin_versant.scarff;projet_atlantique;sat;15;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.scarff;projet_atlantique;trm;25;p1;couleur_des_individus__rouge
-02/01/1984;bassin_versant.nivelle;projet_manche;ang;25;p1;couleur_des_individus__rouge
-02/01/1984;bassin_versant.nivelle;projet_manche;alo;18;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.nivelle;projet_manche;sat;15;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.nivelle;projet_manche;trf;14;p1;couleur_des_individus__bleu
-02/01/1984;bassin_versant.nivelle;projet_manche;lpm;32;p1;couleur_des_individus__bleu
-02/01/1984;bassin_versant.nivelle;projet_manche;trm;25;p1;couleur_des_individus__rouge
-02/01/1984;bassin_versant.nivelle;projet_manche;lpf;;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.oir;projet_manche;ang;25;p1;couleur_des_individus__rouge
-02/01/1984;bassin_versant.oir;projet_manche;trm;25;p1;couleur_des_individus__rouge
-02/01/1984;bassin_versant.oir;projet_manche;trf;14;p1;couleur_des_individus__bleu
-02/01/1984;bassin_versant.oir;projet_manche;lpf;50;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.oir;projet_manche;lpm;32;p1;couleur_des_individus__bleu
-02/01/1984;bassin_versant.oir;projet_manche;sat;15;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.oir;projet_manche;alo;18;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.oir;projet_manche;trf;14;p2;couleur_des_individus__bleu
-02/01/1984;bassin_versant.oir;projet_manche;sat;15;p2;couleur_des_individus__vert
-02/01/1984;bassin_versant.oir;projet_manche;lpm;32;p2;couleur_des_individus__bleu
-02/01/1984;bassin_versant.oir;projet_manche;alo;18;p2;couleur_des_individus__vert
-02/01/1984;bassin_versant.oir;projet_manche;ang;25;p2;couleur_des_individus__rouge
-02/01/1984;bassin_versant.oir;projet_manche;lpf;;p2;couleur_des_individus__vert
-02/01/1984;bassin_versant.oir;projet_manche;trm;25;p2;couleur_des_individus__rouge
-02/01/1984;bassin_versant.scarff;projet_manche;trf;14;p1;couleur_des_individus__bleu
-02/01/1984;bassin_versant.scarff;projet_manche;sat;15;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.scarff;projet_manche;lpf;;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.scarff;projet_manche;lpm;32;p1;couleur_des_individus__bleu
-02/01/1984;bassin_versant.scarff;projet_manche;ang;25;p1;couleur_des_individus__rouge
-02/01/1984;bassin_versant.scarff;projet_manche;alo;18;p1;couleur_des_individus__vert
-02/01/1984;bassin_versant.scarff;projet_manche;trm;25;p1;couleur_des_individus__rouge
-03/01/1984;bassin_versant.nivelle;projet_atlantique;ang;;p1;couleur_des_individus__bleu
-03/01/1984;bassin_versant.nivelle;projet_atlantique;alo;16;p1;couleur_des_individus__rouge
-03/01/1984;bassin_versant.nivelle;projet_atlantique;lpm;41;p1;couleur_des_individus__vert
-03/01/1984;bassin_versant.nivelle;projet_atlantique;trf;;p1;couleur_des_individus__vert
-03/01/1984;bassin_versant.nivelle;projet_atlantique;lpf;45;p1;couleur_des_individus__rouge
-03/01/1984;bassin_versant.nivelle;projet_atlantique;trm;27;p1;couleur_des_individus__bleu
-03/01/1984;plateforme.oir.oir__p1;projet_atlantique;lpf;45;a;couleur_des_individus__rouge
-03/01/1984;plateforme.oir.oir__p1;projet_atlantique;ang;;a;couleur_des_individus__bleu
-03/01/1984;plateforme.oir.oir__p1;projet_atlantique;lpm;41;a;couleur_des_individus__vert
-03/01/1984;plateforme.oir.oir__p1;projet_atlantique;trm;27;a;couleur_des_individus__bleu
-03/01/1984;plateforme.oir.oir__p1;projet_atlantique;alo;16;a;couleur_des_individus__rouge
-03/01/1984;plateforme.oir.oir__p1;projet_atlantique;trf;;a;couleur_des_individus__vert
-03/01/1984;bassin_versant.oir;projet_atlantique;ang;;p2;couleur_des_individus__bleu
-03/01/1984;bassin_versant.oir;projet_atlantique;lpm;41;p2;couleur_des_individus__vert
-03/01/1984;bassin_versant.oir;projet_atlantique;lpf;45;p2;couleur_des_individus__rouge
-03/01/1984;bassin_versant.oir;projet_atlantique;trf;;p2;couleur_des_individus__vert
-03/01/1984;bassin_versant.oir;projet_atlantique;alo;16;p2;couleur_des_individus__rouge
-03/01/1984;bassin_versant.oir;projet_atlantique;trm;27;p2;couleur_des_individus__bleu
-03/01/1984;bassin_versant.scarff;projet_atlantique;trm;27;p1;couleur_des_individus__bleu
-03/01/1984;bassin_versant.scarff;projet_atlantique;lpf;45;p1;couleur_des_individus__rouge
-03/01/1984;bassin_versant.scarff;projet_atlantique;alo;16;p1;couleur_des_individus__rouge
-03/01/1984;bassin_versant.scarff;projet_atlantique;ang;;p1;couleur_des_individus__bleu
-03/01/1984;bassin_versant.scarff;projet_atlantique;lpm;41;p1;couleur_des_individus__vert
-03/01/1984;bassin_versant.scarff;projet_atlantique;trf;;p1;couleur_des_individus__vert
-03/01/1984;bassin_versant.nivelle;projet_manche;ang;;p1;couleur_des_individus__bleu
-03/01/1984;bassin_versant.nivelle;projet_manche;lpm;41;p1;couleur_des_individus__vert
-03/01/1984;bassin_versant.nivelle;projet_manche;trm;27;p1;couleur_des_individus__bleu
-03/01/1984;bassin_versant.nivelle;projet_manche;lpf;45;p1;couleur_des_individus__rouge
-03/01/1984;bassin_versant.nivelle;projet_manche;alo;16;p1;couleur_des_individus__rouge
-03/01/1984;bassin_versant.nivelle;projet_manche;trf;;p1;couleur_des_individus__vert
-03/01/1984;bassin_versant.oir;projet_manche;lpf;45;p1;couleur_des_individus__rouge
-03/01/1984;bassin_versant.oir;projet_manche;alo;16;p1;couleur_des_individus__rouge
-03/01/1984;bassin_versant.oir;projet_manche;trf;20;p1;couleur_des_individus__vert
-03/01/1984;bassin_versant.oir;projet_manche;lpm;41;p1;couleur_des_individus__vert
-03/01/1984;bassin_versant.oir;projet_manche;ang;20;p1;couleur_des_individus__bleu
-03/01/1984;bassin_versant.oir;projet_manche;trm;27;p1;couleur_des_individus__bleu
-03/01/1984;bassin_versant.oir;projet_manche;trm;27;p2;couleur_des_individus__bleu
-03/01/1984;bassin_versant.oir;projet_manche;ang;;p2;couleur_des_individus__bleu
-03/01/1984;bassin_versant.oir;projet_manche;trf;;p2;couleur_des_individus__vert
-03/01/1984;bassin_versant.oir;projet_manche;lpf;45;p2;couleur_des_individus__rouge
-03/01/1984;bassin_versant.oir;projet_manche;alo;16;p2;couleur_des_individus__rouge
-03/01/1984;bassin_versant.oir;projet_manche;lpm;41;p2;couleur_des_individus__vert
-03/01/1984;bassin_versant.scarff;projet_manche;trf;;p1;couleur_des_individus__vert
-03/01/1984;bassin_versant.scarff;projet_manche;ang;;p1;couleur_des_individus__bleu
-03/01/1984;bassin_versant.scarff;projet_manche;alo;16;p1;couleur_des_individus__rouge
-03/01/1984;bassin_versant.scarff;projet_manche;trm;27;p1;couleur_des_individus__bleu
-03/01/1984;bassin_versant.scarff;projet_manche;lpf;45;p1;couleur_des_individus__rouge
-03/01/1984;bassin_versant.scarff;projet_manche;lpm;41;p1;couleur_des_individus__vert
-04/01/1984;bassin_versant.nivelle;projet_atlantique;alo;15;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.nivelle;projet_atlantique;sat;24;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.nivelle;projet_atlantique;trf;;p1;couleur_des_individus__rouge
-04/01/1984;bassin_versant.nivelle;projet_atlantique;trm;27;p1;couleur_des_individus__vert
-04/01/1984;bassin_versant.nivelle;projet_atlantique;lpf;51;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.nivelle;projet_atlantique;ang;22;p1;couleur_des_individus__vert
-04/01/1984;bassin_versant.nivelle;projet_atlantique;lpm;43;p1;couleur_des_individus__rouge
-04/01/1984;plateforme.oir.oir__p1;projet_atlantique;lpm;43;a;couleur_des_individus__rouge
-04/01/1984;plateforme.oir.oir__p1;projet_atlantique;sat;24;a;couleur_des_individus__bleu
-04/01/1984;plateforme.oir.oir__p1;projet_atlantique;trf;;a;couleur_des_individus__rouge
-04/01/1984;plateforme.oir.oir__p1;projet_atlantique;lpf;51;a;couleur_des_individus__bleu
-04/01/1984;plateforme.oir.oir__p1;projet_atlantique;ang;22;a;couleur_des_individus__vert
-04/01/1984;plateforme.oir.oir__p1;projet_atlantique;alo;15;a;couleur_des_individus__bleu
-04/01/1984;plateforme.oir.oir__p1;projet_atlantique;trm;27;a;couleur_des_individus__vert
-04/01/1984;bassin_versant.oir;projet_atlantique;trm;27;p2;couleur_des_individus__vert
-04/01/1984;bassin_versant.oir;projet_atlantique;sat;24;p2;couleur_des_individus__bleu
-04/01/1984;bassin_versant.oir;projet_atlantique;alo;15;p2;couleur_des_individus__bleu
-04/01/1984;bassin_versant.oir;projet_atlantique;ang;22;p2;couleur_des_individus__vert
-04/01/1984;bassin_versant.oir;projet_atlantique;lpf;51;p2;couleur_des_individus__bleu
-04/01/1984;bassin_versant.oir;projet_atlantique;trf;;p2;couleur_des_individus__rouge
-04/01/1984;bassin_versant.oir;projet_atlantique;lpm;43;p2;couleur_des_individus__rouge
-04/01/1984;bassin_versant.scarff;projet_atlantique;lpm;43;p1;couleur_des_individus__rouge
-04/01/1984;bassin_versant.scarff;projet_atlantique;trf;;p1;couleur_des_individus__rouge
-04/01/1984;bassin_versant.scarff;projet_atlantique;ang;22;p1;couleur_des_individus__vert
-04/01/1984;bassin_versant.scarff;projet_atlantique;sat;24;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.scarff;projet_atlantique;lpf;51;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.scarff;projet_atlantique;alo;15;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.scarff;projet_atlantique;trm;27;p1;couleur_des_individus__vert
-04/01/1984;bassin_versant.nivelle;projet_manche;sat;24;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.nivelle;projet_manche;alo;15;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.nivelle;projet_manche;lpm;43;p1;couleur_des_individus__rouge
-04/01/1984;bassin_versant.nivelle;projet_manche;trm;27;p1;couleur_des_individus__vert
-04/01/1984;bassin_versant.nivelle;projet_manche;lpf;51;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.nivelle;projet_manche;trf;;p1;couleur_des_individus__rouge
-04/01/1984;bassin_versant.nivelle;projet_manche;ang;22;p1;couleur_des_individus__vert
-04/01/1984;bassin_versant.oir;projet_manche;lpf;51;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.oir;projet_manche;trf;20;p1;couleur_des_individus__rouge
-04/01/1984;bassin_versant.oir;projet_manche;alo;15;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.oir;projet_manche;ang;22;p1;couleur_des_individus__vert
-04/01/1984;bassin_versant.oir;projet_manche;sat;24;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.oir;projet_manche;trm;27;p1;couleur_des_individus__vert
-04/01/1984;bassin_versant.oir;projet_manche;lpm;43;p1;couleur_des_individus__rouge
-04/01/1984;bassin_versant.oir;projet_manche;trm;27;p2;couleur_des_individus__vert
-04/01/1984;bassin_versant.oir;projet_manche;ang;22;p2;couleur_des_individus__vert
-04/01/1984;bassin_versant.oir;projet_manche;alo;15;p2;couleur_des_individus__bleu
-04/01/1984;bassin_versant.oir;projet_manche;lpf;51;p2;couleur_des_individus__bleu
-04/01/1984;bassin_versant.oir;projet_manche;trf;;p2;couleur_des_individus__rouge
-04/01/1984;bassin_versant.oir;projet_manche;lpm;43;p2;couleur_des_individus__rouge
-04/01/1984;bassin_versant.oir;projet_manche;sat;24;p2;couleur_des_individus__bleu
-04/01/1984;bassin_versant.scarff;projet_manche;ang;22;p1;couleur_des_individus__vert
-04/01/1984;bassin_versant.scarff;projet_manche;lpf;51;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.scarff;projet_manche;trf;;p1;couleur_des_individus__rouge
-04/01/1984;bassin_versant.scarff;projet_manche;lpm;43;p1;couleur_des_individus__rouge
-04/01/1984;bassin_versant.scarff;projet_manche;alo;15;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.scarff;projet_manche;sat;24;p1;couleur_des_individus__bleu
-04/01/1984;bassin_versant.scarff;projet_manche;trm;27;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.nivelle;projet_atlantique;lpm;49;p1;couleur_des_individus__bleu
-05/01/1984;bassin_versant.nivelle;projet_atlantique;trm;25;p1;couleur_des_individus__rouge
-05/01/1984;bassin_versant.nivelle;projet_atlantique;alo;17;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.nivelle;projet_atlantique;sat;24;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.nivelle;projet_atlantique;lpf;59;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.nivelle;projet_atlantique;trf;21;p1;couleur_des_individus__bleu
-05/01/1984;bassin_versant.nivelle;projet_atlantique;ang;27;p1;couleur_des_individus__rouge
-05/01/1984;plateforme.oir.oir__p1;projet_atlantique;trf;21;a;couleur_des_individus__bleu
-05/01/1984;plateforme.oir.oir__p1;projet_atlantique;alo;17;a;couleur_des_individus__vert
-05/01/1984;plateforme.oir.oir__p1;projet_atlantique;ang;27;a;couleur_des_individus__rouge
-05/01/1984;plateforme.oir.oir__p1;projet_atlantique;trm;25;a;couleur_des_individus__rouge
-05/01/1984;plateforme.oir.oir__p1;projet_atlantique;lpm;49;a;couleur_des_individus__bleu
-05/01/1984;plateforme.oir.oir__p1;projet_atlantique;lpf;59;a;couleur_des_individus__vert
-05/01/1984;plateforme.oir.oir__p1;projet_atlantique;sat;24;a;couleur_des_individus__vert
-05/01/1984;bassin_versant.oir;projet_atlantique;trf;21;p2;couleur_des_individus__bleu
-05/01/1984;bassin_versant.oir;projet_atlantique;lpf;59;p2;couleur_des_individus__vert
-05/01/1984;bassin_versant.oir;projet_atlantique;trm;25;p2;couleur_des_individus__rouge
-05/01/1984;bassin_versant.oir;projet_atlantique;sat;24;p2;couleur_des_individus__vert
-05/01/1984;bassin_versant.oir;projet_atlantique;lpm;49;p2;couleur_des_individus__bleu
-05/01/1984;bassin_versant.oir;projet_atlantique;alo;17;p2;couleur_des_individus__vert
-05/01/1984;bassin_versant.oir;projet_atlantique;ang;27;p2;couleur_des_individus__rouge
-05/01/1984;bassin_versant.scarff;projet_atlantique;ang;27;p1;couleur_des_individus__rouge
-05/01/1984;bassin_versant.scarff;projet_atlantique;trm;25;p1;couleur_des_individus__rouge
-05/01/1984;bassin_versant.scarff;projet_atlantique;lpm;49;p1;couleur_des_individus__bleu
-05/01/1984;bassin_versant.scarff;projet_atlantique;sat;24;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.scarff;projet_atlantique;trf;21;p1;couleur_des_individus__bleu
-05/01/1984;bassin_versant.scarff;projet_atlantique;alo;17;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.scarff;projet_atlantique;lpf;59;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.nivelle;projet_manche;ang;27;p1;couleur_des_individus__rouge
-05/01/1984;bassin_versant.nivelle;projet_manche;alo;17;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.nivelle;projet_manche;lpf;59;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.nivelle;projet_manche;sat;24;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.nivelle;projet_manche;lpm;49;p1;couleur_des_individus__bleu
-05/01/1984;bassin_versant.nivelle;projet_manche;trf;21;p1;couleur_des_individus__bleu
-05/01/1984;bassin_versant.nivelle;projet_manche;trm;25;p1;couleur_des_individus__rouge
-05/01/1984;bassin_versant.oir;projet_manche;trf;21;p1;couleur_des_individus__bleu
-05/01/1984;bassin_versant.oir;projet_manche;lpm;49;p1;couleur_des_individus__bleu
-05/01/1984;bassin_versant.oir;projet_manche;trm;25;p1;couleur_des_individus__rouge
-05/01/1984;bassin_versant.oir;projet_manche;ang;27;p1;couleur_des_individus__rouge
-05/01/1984;bassin_versant.oir;projet_manche;lpf;59;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.oir;projet_manche;alo;17;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.oir;projet_manche;sat;24;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.oir;projet_manche;alo;17;p2;couleur_des_individus__vert
-05/01/1984;bassin_versant.oir;projet_manche;ang;27;p2;couleur_des_individus__rouge
-05/01/1984;bassin_versant.oir;projet_manche;trf;21;p2;couleur_des_individus__bleu
-05/01/1984;bassin_versant.oir;projet_manche;trm;25;p2;couleur_des_individus__rouge
-05/01/1984;bassin_versant.oir;projet_manche;sat;24;p2;couleur_des_individus__vert
-05/01/1984;bassin_versant.oir;projet_manche;lpm;49;p2;couleur_des_individus__bleu
-05/01/1984;bassin_versant.oir;projet_manche;lpf;59;p2;couleur_des_individus__vert
-05/01/1984;bassin_versant.scarff;projet_manche;lpm;49;p1;couleur_des_individus__bleu
-05/01/1984;bassin_versant.scarff;projet_manche;trm;25;p1;couleur_des_individus__rouge
-05/01/1984;bassin_versant.scarff;projet_manche;alo;17;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.scarff;projet_manche;trf;21;p1;couleur_des_individus__bleu
-05/01/1984;bassin_versant.scarff;projet_manche;lpf;59;p1;couleur_des_individus__vert
-05/01/1984;bassin_versant.scarff;projet_manche;ang;27;p1;couleur_des_individus__rouge
-05/01/1984;bassin_versant.scarff;projet_manche;sat;24;p1;couleur_des_individus__vert
\ No newline at end of file
+date;site;projet;espece;Nombre d'individus;plateforme;Couleur des individus
+01/01/1984;nivelle;projet_atlantique;ang;38;p1;couleur_des_individus__vert
+01/01/1984;nivelle;projet_atlantique;lpm;27;p1;couleur_des_individus__rouge
+01/01/1984;nivelle;projet_atlantique;sat;39;p1;couleur_des_individus__bleu
+01/01/1984;nivelle;projet_atlantique;alo;15;p1;couleur_des_individus__bleu
+01/01/1984;nivelle;projet_atlantique;trf;18;p1;couleur_des_individus__rouge
+01/01/1984;nivelle;projet_atlantique;trm;25;p1;couleur_des_individus__vert
+01/01/1984;nivelle;projet_atlantique;lpf;54;p1;couleur_des_individus__bleu
+01/01/1984;oir__p1;projet_atlantique;ang;38;a;couleur_des_individus__vert
+01/01/1984;oir__p1;projet_atlantique;trf;18;a;couleur_des_individus__rouge
+01/01/1984;oir__p1;projet_atlantique;lpm;27;a;couleur_des_individus__rouge
+01/01/1984;oir__p1;projet_atlantique;trm;25;a;couleur_des_individus__vert
+01/01/1984;oir__p1;projet_atlantique;lpf;54;a;couleur_des_individus__bleu
+01/01/1984;oir__p1;projet_atlantique;sat;39;a;couleur_des_individus__bleu
+01/01/1984;oir__p1;projet_atlantique;alo;15;a;couleur_des_individus__bleu
+01/01/1984;oir;projet_atlantique;lpf;54;p2;couleur_des_individus__bleu
+01/01/1984;oir;projet_atlantique;alo;15;p2;couleur_des_individus__bleu
+01/01/1984;oir;projet_atlantique;trm;25;p2;couleur_des_individus__vert
+01/01/1984;oir;projet_atlantique;ang;38;p2;couleur_des_individus__vert
+01/01/1984;oir;projet_atlantique;sat;39;p2;couleur_des_individus__bleu
+01/01/1984;oir;projet_atlantique;lpm;27;p2;couleur_des_individus__rouge
+01/01/1984;oir;projet_atlantique;trf;18;p2;couleur_des_individus__rouge
+01/01/1984;scarff;projet_atlantique;trf;18;p1;couleur_des_individus__rouge
+01/01/1984;scarff;projet_atlantique;trm;25;p1;couleur_des_individus__vert
+01/01/1984;scarff;projet_atlantique;sat;39;p1;couleur_des_individus__bleu
+01/01/1984;scarff;projet_atlantique;alo;15;p1;couleur_des_individus__bleu
+01/01/1984;scarff;projet_atlantique;ang;38;p1;couleur_des_individus__vert
+01/01/1984;scarff;projet_atlantique;lpm;27;p1;couleur_des_individus__rouge
+01/01/1984;scarff;projet_atlantique;lpf;54;p1;couleur_des_individus__bleu
+01/01/1984;nivelle;projet_manche;trm;25;p1;couleur_des_individus__vert
+01/01/1984;nivelle;projet_manche;lpf;54;p1;couleur_des_individus__bleu
+01/01/1984;nivelle;projet_manche;lpm;27;p1;couleur_des_individus__rouge
+01/01/1984;nivelle;projet_manche;ang;38;p1;couleur_des_individus__vert
+01/01/1984;nivelle;projet_manche;alo;15;p1;couleur_des_individus__bleu
+01/01/1984;nivelle;projet_manche;trf;18;p1;couleur_des_individus__rouge
+01/01/1984;nivelle;projet_manche;sat;39;p1;couleur_des_individus__bleu
+01/01/1984;oir;projet_manche;ang;38;p1;couleur_des_individus__vert
+01/01/1984;oir;projet_manche;alo;15;p1;couleur_des_individus__bleu
+01/01/1984;oir;projet_manche;lpf;54;p1;couleur_des_individus__bleu
+01/01/1984;oir;projet_manche;sat;39;p1;couleur_des_individus__bleu
+01/01/1984;oir;projet_manche;trf;18;p1;couleur_des_individus__rouge
+01/01/1984;oir;projet_manche;trm;25;p1;couleur_des_individus__vert
+01/01/1984;oir;projet_manche;lpm;27;p1;couleur_des_individus__rouge
+01/01/1984;oir;projet_manche;lpf;54;p2;couleur_des_individus__bleu
+01/01/1984;oir;projet_manche;alo;15;p2;couleur_des_individus__bleu
+01/01/1984;oir;projet_manche;sat;39;p2;couleur_des_individus__bleu
+01/01/1984;oir;projet_manche;lpm;27;p2;couleur_des_individus__rouge
+01/01/1984;oir;projet_manche;trm;25;p2;couleur_des_individus__vert
+01/01/1984;oir;projet_manche;trf;18;p2;couleur_des_individus__rouge
+01/01/1984;oir;projet_manche;ang;38;p2;couleur_des_individus__vert
+01/01/1984;scarff;projet_manche;sat;39;p1;couleur_des_individus__bleu
+01/01/1984;scarff;projet_manche;alo;15;p1;couleur_des_individus__bleu
+01/01/1984;scarff;projet_manche;ang;38;p1;couleur_des_individus__vert
+01/01/1984;scarff;projet_manche;lpf;54;p1;couleur_des_individus__bleu
+01/01/1984;scarff;projet_manche;trf;18;p1;couleur_des_individus__rouge
+01/01/1984;scarff;projet_manche;trm;25;p1;couleur_des_individus__vert
+01/01/1984;scarff;projet_manche;lpm;27;p1;couleur_des_individus__rouge
+02/01/1984;nivelle;projet_atlantique;sat;15;p1;couleur_des_individus__vert
+02/01/1984;nivelle;projet_atlantique;lpm;32;p1;couleur_des_individus__bleu
+02/01/1984;nivelle;projet_atlantique;alo;18;p1;couleur_des_individus__vert
+02/01/1984;nivelle;projet_atlantique;ang;25;p1;couleur_des_individus__rouge
+02/01/1984;nivelle;projet_atlantique;trm;25;p1;couleur_des_individus__rouge
+02/01/1984;nivelle;projet_atlantique;lpf;;p1;couleur_des_individus__vert
+02/01/1984;nivelle;projet_atlantique;trf;14;p1;couleur_des_individus__bleu
+02/01/1984;oir__p1;projet_atlantique;lpf;;a;couleur_des_individus__vert
+02/01/1984;oir__p1;projet_atlantique;trf;14;a;couleur_des_individus__bleu
+02/01/1984;oir__p1;projet_atlantique;sat;15;a;couleur_des_individus__vert
+02/01/1984;oir__p1;projet_atlantique;trm;25;a;couleur_des_individus__rouge
+02/01/1984;oir__p1;projet_atlantique;ang;25;a;couleur_des_individus__rouge
+02/01/1984;oir__p1;projet_atlantique;alo;18;a;couleur_des_individus__vert
+02/01/1984;oir__p1;projet_atlantique;lpm;32;a;couleur_des_individus__bleu
+02/01/1984;oir;projet_atlantique;lpm;32;p2;couleur_des_individus__bleu
+02/01/1984;oir;projet_atlantique;alo;18;p2;couleur_des_individus__vert
+02/01/1984;oir;projet_atlantique;trf;14;p2;couleur_des_individus__bleu
+02/01/1984;oir;projet_atlantique;lpf;;p2;couleur_des_individus__vert
+02/01/1984;oir;projet_atlantique;ang;25;p2;couleur_des_individus__rouge
+02/01/1984;oir;projet_atlantique;trm;25;p2;couleur_des_individus__rouge
+02/01/1984;oir;projet_atlantique;sat;15;p2;couleur_des_individus__vert
+02/01/1984;scarff;projet_atlantique;trm;25;p1;couleur_des_individus__rouge
+02/01/1984;scarff;projet_atlantique;alo;18;p1;couleur_des_individus__vert
+02/01/1984;scarff;projet_atlantique;lpm;32;p1;couleur_des_individus__bleu
+02/01/1984;scarff;projet_atlantique;sat;15;p1;couleur_des_individus__vert
+02/01/1984;scarff;projet_atlantique;lpf;;p1;couleur_des_individus__vert
+02/01/1984;scarff;projet_atlantique;ang;25;p1;couleur_des_individus__rouge
+02/01/1984;scarff;projet_atlantique;trf;14;p1;couleur_des_individus__bleu
+02/01/1984;nivelle;projet_manche;ang;25;p1;couleur_des_individus__rouge
+02/01/1984;nivelle;projet_manche;trm;25;p1;couleur_des_individus__rouge
+02/01/1984;nivelle;projet_manche;lpm;32;p1;couleur_des_individus__bleu
+02/01/1984;nivelle;projet_manche;sat;15;p1;couleur_des_individus__vert
+02/01/1984;nivelle;projet_manche;alo;18;p1;couleur_des_individus__vert
+02/01/1984;nivelle;projet_manche;trf;14;p1;couleur_des_individus__bleu
+02/01/1984;nivelle;projet_manche;lpf;;p1;couleur_des_individus__vert
+02/01/1984;oir;projet_manche;ang;25;p1;couleur_des_individus__rouge
+02/01/1984;oir;projet_manche;trm;25;p1;couleur_des_individus__rouge
+02/01/1984;oir;projet_manche;lpm;32;p1;couleur_des_individus__bleu
+02/01/1984;oir;projet_manche;lpf;50;p1;couleur_des_individus__vert
+02/01/1984;oir;projet_manche;sat;15;p1;couleur_des_individus__vert
+02/01/1984;oir;projet_manche;trf;14;p1;couleur_des_individus__bleu
+02/01/1984;oir;projet_manche;alo;18;p1;couleur_des_individus__vert
+02/01/1984;oir;projet_manche;sat;15;p2;couleur_des_individus__vert
+02/01/1984;oir;projet_manche;lpf;;p2;couleur_des_individus__vert
+02/01/1984;oir;projet_manche;ang;25;p2;couleur_des_individus__rouge
+02/01/1984;oir;projet_manche;lpm;32;p2;couleur_des_individus__bleu
+02/01/1984;oir;projet_manche;trm;25;p2;couleur_des_individus__rouge
+02/01/1984;oir;projet_manche;alo;18;p2;couleur_des_individus__vert
+02/01/1984;oir;projet_manche;trf;14;p2;couleur_des_individus__bleu
+02/01/1984;scarff;projet_manche;lpf;;p1;couleur_des_individus__vert
+02/01/1984;scarff;projet_manche;trm;25;p1;couleur_des_individus__rouge
+02/01/1984;scarff;projet_manche;sat;15;p1;couleur_des_individus__vert
+02/01/1984;scarff;projet_manche;lpm;32;p1;couleur_des_individus__bleu
+02/01/1984;scarff;projet_manche;ang;25;p1;couleur_des_individus__rouge
+02/01/1984;scarff;projet_manche;alo;18;p1;couleur_des_individus__vert
+02/01/1984;scarff;projet_manche;trf;14;p1;couleur_des_individus__bleu
+03/01/1984;nivelle;projet_atlantique;ang;;p1;couleur_des_individus__bleu
+03/01/1984;nivelle;projet_atlantique;lpm;41;p1;couleur_des_individus__vert
+03/01/1984;nivelle;projet_atlantique;trm;27;p1;couleur_des_individus__bleu
+03/01/1984;nivelle;projet_atlantique;alo;16;p1;couleur_des_individus__rouge
+03/01/1984;nivelle;projet_atlantique;trf;;p1;couleur_des_individus__vert
+03/01/1984;nivelle;projet_atlantique;lpf;45;p1;couleur_des_individus__rouge
+03/01/1984;oir__p1;projet_atlantique;trm;27;a;couleur_des_individus__bleu
+03/01/1984;oir__p1;projet_atlantique;ang;;a;couleur_des_individus__bleu
+03/01/1984;oir__p1;projet_atlantique;trf;;a;couleur_des_individus__vert
+03/01/1984;oir__p1;projet_atlantique;lpf;45;a;couleur_des_individus__rouge
+03/01/1984;oir__p1;projet_atlantique;lpm;41;a;couleur_des_individus__vert
+03/01/1984;oir__p1;projet_atlantique;alo;16;a;couleur_des_individus__rouge
+03/01/1984;oir;projet_atlantique;lpm;41;p2;couleur_des_individus__vert
+03/01/1984;oir;projet_atlantique;trf;;p2;couleur_des_individus__vert
+03/01/1984;oir;projet_atlantique;trm;27;p2;couleur_des_individus__bleu
+03/01/1984;oir;projet_atlantique;ang;;p2;couleur_des_individus__bleu
+03/01/1984;oir;projet_atlantique;lpf;45;p2;couleur_des_individus__rouge
+03/01/1984;oir;projet_atlantique;alo;16;p2;couleur_des_individus__rouge
+03/01/1984;scarff;projet_atlantique;trf;;p1;couleur_des_individus__vert
+03/01/1984;scarff;projet_atlantique;alo;16;p1;couleur_des_individus__rouge
+03/01/1984;scarff;projet_atlantique;lpm;41;p1;couleur_des_individus__vert
+03/01/1984;scarff;projet_atlantique;trm;27;p1;couleur_des_individus__bleu
+03/01/1984;scarff;projet_atlantique;ang;;p1;couleur_des_individus__bleu
+03/01/1984;scarff;projet_atlantique;lpf;45;p1;couleur_des_individus__rouge
+03/01/1984;nivelle;projet_manche;ang;;p1;couleur_des_individus__bleu
+03/01/1984;nivelle;projet_manche;trf;;p1;couleur_des_individus__vert
+03/01/1984;nivelle;projet_manche;alo;16;p1;couleur_des_individus__rouge
+03/01/1984;nivelle;projet_manche;lpm;41;p1;couleur_des_individus__vert
+03/01/1984;nivelle;projet_manche;trm;27;p1;couleur_des_individus__bleu
+03/01/1984;nivelle;projet_manche;lpf;45;p1;couleur_des_individus__rouge
+03/01/1984;oir;projet_manche;alo;16;p1;couleur_des_individus__rouge
+03/01/1984;oir;projet_manche;lpf;45;p1;couleur_des_individus__rouge
+03/01/1984;oir;projet_manche;trm;27;p1;couleur_des_individus__bleu
+03/01/1984;oir;projet_manche;ang;20;p1;couleur_des_individus__bleu
+03/01/1984;oir;projet_manche;lpm;41;p1;couleur_des_individus__vert
+03/01/1984;oir;projet_manche;trf;20;p1;couleur_des_individus__vert
+03/01/1984;oir;projet_manche;lpf;45;p2;couleur_des_individus__rouge
+03/01/1984;oir;projet_manche;lpm;41;p2;couleur_des_individus__vert
+03/01/1984;oir;projet_manche;trm;27;p2;couleur_des_individus__bleu
+03/01/1984;oir;projet_manche;ang;;p2;couleur_des_individus__bleu
+03/01/1984;oir;projet_manche;trf;;p2;couleur_des_individus__vert
+03/01/1984;oir;projet_manche;alo;16;p2;couleur_des_individus__rouge
+03/01/1984;scarff;projet_manche;trf;;p1;couleur_des_individus__vert
+03/01/1984;scarff;projet_manche;alo;16;p1;couleur_des_individus__rouge
+03/01/1984;scarff;projet_manche;ang;;p1;couleur_des_individus__bleu
+03/01/1984;scarff;projet_manche;lpf;45;p1;couleur_des_individus__rouge
+03/01/1984;scarff;projet_manche;lpm;41;p1;couleur_des_individus__vert
+03/01/1984;scarff;projet_manche;trm;27;p1;couleur_des_individus__bleu
+04/01/1984;nivelle;projet_atlantique;sat;24;p1;couleur_des_individus__bleu
+04/01/1984;nivelle;projet_atlantique;lpm;43;p1;couleur_des_individus__rouge
+04/01/1984;nivelle;projet_atlantique;trm;27;p1;couleur_des_individus__vert
+04/01/1984;nivelle;projet_atlantique;lpf;51;p1;couleur_des_individus__bleu
+04/01/1984;nivelle;projet_atlantique;ang;22;p1;couleur_des_individus__vert
+04/01/1984;nivelle;projet_atlantique;alo;15;p1;couleur_des_individus__bleu
+04/01/1984;nivelle;projet_atlantique;trf;;p1;couleur_des_individus__rouge
+04/01/1984;oir__p1;projet_atlantique;trm;27;a;couleur_des_individus__vert
+04/01/1984;oir__p1;projet_atlantique;trf;;a;couleur_des_individus__rouge
+04/01/1984;oir__p1;projet_atlantique;ang;22;a;couleur_des_individus__vert
+04/01/1984;oir__p1;projet_atlantique;alo;15;a;couleur_des_individus__bleu
+04/01/1984;oir__p1;projet_atlantique;lpm;43;a;couleur_des_individus__rouge
+04/01/1984;oir__p1;projet_atlantique;sat;24;a;couleur_des_individus__bleu
+04/01/1984;oir__p1;projet_atlantique;lpf;51;a;couleur_des_individus__bleu
+04/01/1984;oir;projet_atlantique;lpf;51;p2;couleur_des_individus__bleu
+04/01/1984;oir;projet_atlantique;trm;27;p2;couleur_des_individus__vert
+04/01/1984;oir;projet_atlantique;ang;22;p2;couleur_des_individus__vert
+04/01/1984;oir;projet_atlantique;trf;;p2;couleur_des_individus__rouge
+04/01/1984;oir;projet_atlantique;alo;15;p2;couleur_des_individus__bleu
+04/01/1984;oir;projet_atlantique;sat;24;p2;couleur_des_individus__bleu
+04/01/1984;oir;projet_atlantique;lpm;43;p2;couleur_des_individus__rouge
+04/01/1984;scarff;projet_atlantique;lpm;43;p1;couleur_des_individus__rouge
+04/01/1984;scarff;projet_atlantique;trf;;p1;couleur_des_individus__rouge
+04/01/1984;scarff;projet_atlantique;alo;15;p1;couleur_des_individus__bleu
+04/01/1984;scarff;projet_atlantique;sat;24;p1;couleur_des_individus__bleu
+04/01/1984;scarff;projet_atlantique;lpf;51;p1;couleur_des_individus__bleu
+04/01/1984;scarff;projet_atlantique;ang;22;p1;couleur_des_individus__vert
+04/01/1984;scarff;projet_atlantique;trm;27;p1;couleur_des_individus__vert
+04/01/1984;nivelle;projet_manche;trm;27;p1;couleur_des_individus__vert
+04/01/1984;nivelle;projet_manche;trf;;p1;couleur_des_individus__rouge
+04/01/1984;nivelle;projet_manche;sat;24;p1;couleur_des_individus__bleu
+04/01/1984;nivelle;projet_manche;alo;15;p1;couleur_des_individus__bleu
+04/01/1984;nivelle;projet_manche;ang;22;p1;couleur_des_individus__vert
+04/01/1984;nivelle;projet_manche;lpf;51;p1;couleur_des_individus__bleu
+04/01/1984;nivelle;projet_manche;lpm;43;p1;couleur_des_individus__rouge
+04/01/1984;oir;projet_manche;trf;20;p1;couleur_des_individus__rouge
+04/01/1984;oir;projet_manche;sat;24;p1;couleur_des_individus__bleu
+04/01/1984;oir;projet_manche;lpf;51;p1;couleur_des_individus__bleu
+04/01/1984;oir;projet_manche;trm;27;p1;couleur_des_individus__vert
+04/01/1984;oir;projet_manche;lpm;43;p1;couleur_des_individus__rouge
+04/01/1984;oir;projet_manche;ang;22;p1;couleur_des_individus__vert
+04/01/1984;oir;projet_manche;alo;15;p1;couleur_des_individus__bleu
+04/01/1984;oir;projet_manche;ang;22;p2;couleur_des_individus__vert
+04/01/1984;oir;projet_manche;trm;27;p2;couleur_des_individus__vert
+04/01/1984;oir;projet_manche;alo;15;p2;couleur_des_individus__bleu
+04/01/1984;oir;projet_manche;lpf;51;p2;couleur_des_individus__bleu
+04/01/1984;oir;projet_manche;trf;;p2;couleur_des_individus__rouge
+04/01/1984;oir;projet_manche;sat;24;p2;couleur_des_individus__bleu
+04/01/1984;oir;projet_manche;lpm;43;p2;couleur_des_individus__rouge
+04/01/1984;scarff;projet_manche;lpm;43;p1;couleur_des_individus__rouge
+04/01/1984;scarff;projet_manche;alo;15;p1;couleur_des_individus__bleu
+04/01/1984;scarff;projet_manche;trf;;p1;couleur_des_individus__rouge
+04/01/1984;scarff;projet_manche;trm;27;p1;couleur_des_individus__vert
+04/01/1984;scarff;projet_manche;sat;24;p1;couleur_des_individus__bleu
+04/01/1984;scarff;projet_manche;lpf;51;p1;couleur_des_individus__bleu
+04/01/1984;scarff;projet_manche;ang;22;p1;couleur_des_individus__vert
+05/01/1984;nivelle;projet_atlantique;ang;27;p1;couleur_des_individus__rouge
+05/01/1984;nivelle;projet_atlantique;trf;21;p1;couleur_des_individus__bleu
+05/01/1984;nivelle;projet_atlantique;lpm;49;p1;couleur_des_individus__bleu
+05/01/1984;nivelle;projet_atlantique;alo;17;p1;couleur_des_individus__vert
+05/01/1984;nivelle;projet_atlantique;trm;25;p1;couleur_des_individus__rouge
+05/01/1984;nivelle;projet_atlantique;lpf;59;p1;couleur_des_individus__vert
+05/01/1984;nivelle;projet_atlantique;sat;24;p1;couleur_des_individus__vert
+05/01/1984;oir__p1;projet_atlantique;trm;25;a;couleur_des_individus__rouge
+05/01/1984;oir__p1;projet_atlantique;trf;21;a;couleur_des_individus__bleu
+05/01/1984;oir__p1;projet_atlantique;ang;27;a;couleur_des_individus__rouge
+05/01/1984;oir__p1;projet_atlantique;lpf;59;a;couleur_des_individus__vert
+05/01/1984;oir__p1;projet_atlantique;sat;24;a;couleur_des_individus__vert
+05/01/1984;oir__p1;projet_atlantique;lpm;49;a;couleur_des_individus__bleu
+05/01/1984;oir__p1;projet_atlantique;alo;17;a;couleur_des_individus__vert
+05/01/1984;oir;projet_atlantique;lpm;49;p2;couleur_des_individus__bleu
+05/01/1984;oir;projet_atlantique;sat;24;p2;couleur_des_individus__vert
+05/01/1984;oir;projet_atlantique;lpf;59;p2;couleur_des_individus__vert
+05/01/1984;oir;projet_atlantique;trm;25;p2;couleur_des_individus__rouge
+05/01/1984;oir;projet_atlantique;ang;27;p2;couleur_des_individus__rouge
+05/01/1984;oir;projet_atlantique;alo;17;p2;couleur_des_individus__vert
+05/01/1984;oir;projet_atlantique;trf;21;p2;couleur_des_individus__bleu
+05/01/1984;scarff;projet_atlantique;lpf;59;p1;couleur_des_individus__vert
+05/01/1984;scarff;projet_atlantique;trf;21;p1;couleur_des_individus__bleu
+05/01/1984;scarff;projet_atlantique;trm;25;p1;couleur_des_individus__rouge
+05/01/1984;scarff;projet_atlantique;ang;27;p1;couleur_des_individus__rouge
+05/01/1984;scarff;projet_atlantique;lpm;49;p1;couleur_des_individus__bleu
+05/01/1984;scarff;projet_atlantique;sat;24;p1;couleur_des_individus__vert
+05/01/1984;scarff;projet_atlantique;alo;17;p1;couleur_des_individus__vert
+05/01/1984;nivelle;projet_manche;sat;24;p1;couleur_des_individus__vert
+05/01/1984;nivelle;projet_manche;trf;21;p1;couleur_des_individus__bleu
+05/01/1984;nivelle;projet_manche;lpf;59;p1;couleur_des_individus__vert
+05/01/1984;nivelle;projet_manche;lpm;49;p1;couleur_des_individus__bleu
+05/01/1984;nivelle;projet_manche;ang;27;p1;couleur_des_individus__rouge
+05/01/1984;nivelle;projet_manche;alo;17;p1;couleur_des_individus__vert
+05/01/1984;nivelle;projet_manche;trm;25;p1;couleur_des_individus__rouge
+05/01/1984;oir;projet_manche;sat;24;p1;couleur_des_individus__vert
+05/01/1984;oir;projet_manche;alo;17;p1;couleur_des_individus__vert
+05/01/1984;oir;projet_manche;trm;25;p1;couleur_des_individus__rouge
+05/01/1984;oir;projet_manche;lpf;59;p1;couleur_des_individus__vert
+05/01/1984;oir;projet_manche;trf;21;p1;couleur_des_individus__bleu
+05/01/1984;oir;projet_manche;ang;27;p1;couleur_des_individus__rouge
+05/01/1984;oir;projet_manche;lpm;49;p1;couleur_des_individus__bleu
+05/01/1984;oir;projet_manche;ang;27;p2;couleur_des_individus__rouge
+05/01/1984;oir;projet_manche;lpf;59;p2;couleur_des_individus__vert
+05/01/1984;oir;projet_manche;trf;21;p2;couleur_des_individus__bleu
+05/01/1984;oir;projet_manche;alo;17;p2;couleur_des_individus__vert
+05/01/1984;oir;projet_manche;lpm;49;p2;couleur_des_individus__bleu
+05/01/1984;oir;projet_manche;sat;24;p2;couleur_des_individus__vert
+05/01/1984;oir;projet_manche;trm;25;p2;couleur_des_individus__rouge
+05/01/1984;scarff;projet_manche;lpf;59;p1;couleur_des_individus__vert
+05/01/1984;scarff;projet_manche;sat;24;p1;couleur_des_individus__vert
+05/01/1984;scarff;projet_manche;trf;21;p1;couleur_des_individus__bleu
+05/01/1984;scarff;projet_manche;alo;17;p1;couleur_des_individus__vert
+05/01/1984;scarff;projet_manche;ang;27;p1;couleur_des_individus__rouge
+05/01/1984;scarff;projet_manche;lpm;49;p1;couleur_des_individus__bleu
+05/01/1984;scarff;projet_manche;trm;25;p1;couleur_des_individus__rouge
diff --git a/src/test/resources/data/monsore/monsore-with-repository.yaml b/src/test/resources/data/monsore/monsore-with-repository.yaml
index 13818fc880504757db07b5e23774d344fac908ae..49432b15c6863d650223a2553745ac4a32f13c52 100644
--- a/src/test/resources/data/monsore/monsore-with-repository.yaml
+++ b/src/test/resources/data/monsore/monsore-with-repository.yaml
@@ -63,19 +63,21 @@ references:
   sites:
     validations:
       typeSitesRef:
-        description: référence au type de site
+        internationalizationName:
+          fr: référence au type de site
         checker:
           name: Reference
           params:
             refType: type_de_sites
-            columns: tze_type_nom
+        columns: [ tze_type_nom ]
       siteParentRef:
-        description: référence à la colonne parent
+        internationalizationName:
+          fr: référence à la colonne parent
         checker:
           name: Reference
           params:
             refType: sites
-            columns: zet_chemin_parent
+        columns: [ zet_chemin_parent ]
     keyColumns:
       - zet_chemin_parent
       - zet_nom_key
@@ -185,28 +187,32 @@ references:
           {nom du thème}, data type name : {nom du type de données}
     validations:
       projetRef:
-        description: référence au projet
+        internationalizationName:
+          fr: référence au projet
         checker:
           name: Reference
           params:
             refType: projet
-            columns: nom du projet
+        columns: [ nom du projet ]
       sitesRef:
-        description: référence au site
+        internationalizationName:
+          fr: référence au site
         checker:
           name: Reference
           params:
             refType: sites
-            columns: nom du site
+        columns: [ nom du site ]
       themesRef:
-        description: référence au theme
+        internationalizationName:
+          fr: référence au theme
         checker:
           name: Reference
           params:
             refType: themes
-            columns: nom du thème
+        columns: [ nom du thème ]
       checkDatatype:
-        description: test
+        internationalizationName:
+          fr: test
         checker:
           name: GroovyExpression
           params:
@@ -301,21 +307,24 @@ references:
   variables_et_unites_par_types_de_donnees:
     validations:
       variableRef:
-        description: référence à la variable
+        internationalizationName:
+          fr: référence à la variable
         checker:
           name: Reference
           params:
             refType: variables
-            columns: nom de la variable
+        columns: [ nom de la variable ]
       uniteRef:
-        description: référence à l'unité'
+        internationalizationName:
+          fr: référence à l'unité'
         checker:
           name: Reference
           params:
             refType: unites
-            columns: nom de l'unité
+        columns: [ nom de l'unité ]
       checkDatatype:
-        description: test
+        internationalizationName:
+          fr: test
         checker:
           name: GroovyExpression
           params:
@@ -364,30 +373,31 @@ dataTypes:
                 refType: projet
       site:
         components:
-          bassin:
-            params:
+          bassin: null
+          plateforme: null
+          chemin:
+            defaultValue:
+              expression: >
+                return references.get("sites")
+                .find{it.getRefValues().get("zet_chemin_parent").equals(datumByVariableAndComponent.get("site").get("bassin"))
+                &&
+                it.getRefValues().get("zet_nom_key").equals(datumByVariableAndComponent.get("site").get("plateforme"))}
+                .getHierarchicalKey();
               references:
                 - sites
-              replace: true
-            defaultValue: >
-              return references.get("sites")
-              .find{it.getNaturalKey().equals(datumByVariableAndComponent.get("site").get("bassin"))}
-              .getHierarchicalKey();
             checker:
               name: Reference
               params:
                 refType: sites
-          plateforme: null
-          chemin:
-            params:
+        computedComponents:
+          site_bassin:
+            computation:
+              expression: >
+                return references.get("sites")
+                .find{it.getNaturalKey().equals(datumByVariableAndComponent.get("site").get("bassin"))}
+                .getHierarchicalKey();
               references:
                 - sites
-            defaultValue: >
-              return references.get("sites")
-              .find{it.getRefValues().get("zet_chemin_parent").equals(datumByVariableAndComponent.get("site").get("bassin"))
-              &&
-              it.getRefValues().get("zet_nom_key").equals(datumByVariableAndComponent.get("site").get("plateforme"))}
-              .getHierarchicalKey();
             checker:
               name: Reference
               params:
@@ -415,7 +425,8 @@ dataTypes:
               params:
                 refType: valeurs_qualitatives
           unit:
-            defaultValue: return "sans_unite"
+            defaultValue:
+              expression: return "sans_unite"
             checker:
               name: Reference
               params:
@@ -424,13 +435,15 @@ dataTypes:
       Nombre d'individus:
         components:
           value:
-            defaultValue: return 0
+            defaultValue:
+              expression: return 0
             checker:
               name: Integer
               params:
                 required: null
           unit:
-            defaultValue: return "sans_unite"
+            defaultValue:
+              expression: return "sans_unite"
             checker:
               name: Reference
               params:
@@ -438,7 +451,8 @@ dataTypes:
                 required: null
     validations:
       unitOfColor:
-        description: vérifie l'unité de la couleur des individus
+        internationalizationName:
+          fr: vérifie l'unité de la couleur des individus
         checker:
           name: GroovyExpression
           params:
@@ -455,7 +469,8 @@ dataTypes:
               references:
                 - variables_et_unites_par_types_de_donnees
       unitOfIndividus:
-        description: vérifie l'unité du nombre d'individus
+        internationalizationName:
+          fr: vérifie l'unité du nombre d'individus
         checker:
           name: GroovyExpression
           params:
diff --git a/src/test/resources/data/monsore/monsore.yaml b/src/test/resources/data/monsore/monsore.yaml
index bd9eedb49d8c07ef2c35ec9ea6488c97edad2c06..b2f684fb8b98cda2768ac7b4a129a255b203f7a6 100644
--- a/src/test/resources/data/monsore/monsore.yaml
+++ b/src/test/resources/data/monsore/monsore.yaml
@@ -63,19 +63,22 @@ references:
   sites:
     validations:
       typeSitesRef:
-        description: référence au type de site
+        internationalizationName:
+          fr: référence au type de site
         checker:
           name: Reference
           params:
             refType: type_de_sites
-            columns: tze_type_nom
+        columns: [ tze_type_nom ]
       siteParentRef:
-        description: référence à la colonne parent
+        internationalizationName:
+          fr: référence à la colonne parent
         checker:
           name: Reference
           params:
             refType: sites
-            columns: zet_chemin_parent
+            required: false
+        columns: [ zet_chemin_parent ]
     keyColumns:
       - zet_chemin_parent
       - zet_nom_key
@@ -185,28 +188,32 @@ references:
           {nom du thème}, data type name : {nom du type de données}
     validations:
       projetRef:
-        description: référence au projet
+        internationalizationName:
+          fr: référence au projet
         checker:
           name: Reference
           params:
             refType: projet
-            columns: nom du projet
+        columns: [ nom du projet ]
       sitesRef:
-        description: référence au site
+        internationalizationName:
+          fr: référence au site
         checker:
           name: Reference
           params:
             refType: sites
-            columns: nom du site
+        columns: [ nom du site ]
       themesRef:
-        description: référence au theme
+        internationalizationName:
+          fr: référence au theme
         checker:
           name: Reference
           params:
             refType: themes
-            columns: nom du thème
+        columns: [ nom du thème ]
       checkDatatype:
-        description: test
+        internationalizationName:
+          fr: test
         checker:
           name: GroovyExpression
           params:
@@ -301,21 +308,24 @@ references:
   variables_et_unites_par_types_de_donnees:
     validations:
       variableRef:
-        description: référence à la variable
+        internationalizationName:
+          fr: référence à la variable
         checker:
           name: Reference
           params:
             refType: variables
-            columns: nom de la variable
+        columns: [ nom de la variable ]
       uniteRef:
-        description: référence à l'unité'
+        internationalizationName:
+          fr: référence à l'unité'
         checker:
           name: Reference
           params:
             refType: unites
-            columns: nom de l'unité
+        columns: [ nom de l'unité ]
       checkDatatype:
-        description: test
+        internationalizationName:
+          fr: test
         checker:
           name: GroovyExpression
           params:
@@ -362,30 +372,31 @@ dataTypes:
                 refType: projet
       site:
         components:
-          bassin:
-            params:
+          bassin: null
+          plateforme: null
+          chemin:
+            defaultValue:
+              expression: >
+                return references.get("sites")
+                .find{it.getRefValues().get("zet_chemin_parent").equals(datumByVariableAndComponent.get("site").get("bassin"))
+                &&
+                it.getRefValues().get("zet_nom_key").equals(datumByVariableAndComponent.get("site").get("plateforme"))}
+                .getHierarchicalKey();
               references:
                 - sites
-              replace: true
-            defaultValue: >
-              return references.get("sites")
-              .find{it.getNaturalKey().equals(datumByVariableAndComponent.get("site").get("bassin"))}
-              .getHierarchicalKey();
             checker:
               name: Reference
               params:
                 refType: sites
-          plateforme: null
-          chemin:
-            params:
+        computedComponents:
+          site_bassin:
+            computation:
+              expression: >
+                return references.get("sites")
+                .find{it.getNaturalKey().equals(datumByVariableAndComponent.get("site").get("bassin"))}
+                .getHierarchicalKey();
               references:
                 - sites
-            defaultValue: >
-              return references.get("sites")
-              .find{it.getRefValues().get("zet_chemin_parent").equals(datumByVariableAndComponent.get("site").get("bassin"))
-              &&
-              it.getRefValues().get("zet_nom_key").equals(datumByVariableAndComponent.get("site").get("plateforme"))}
-              .getHierarchicalKey();
             checker:
               name: Reference
               params:
@@ -413,7 +424,8 @@ dataTypes:
               params:
                 refType: valeurs_qualitatives
           unit:
-            defaultValue: return "sans_unite"
+            defaultValue:
+              expression: return "sans_unite"
             checker:
               name: Reference
               params:
@@ -422,13 +434,15 @@ dataTypes:
       Nombre d'individus:
         components:
           value:
-            defaultValue: return 0
+            defaultValue:
+              expression: return 0
             checker:
               name: Integer
               params:
                 required: null
           unit:
-            defaultValue: return "sans_unite"
+            defaultValue:
+              expression: return "sans_unite"
             checker:
               name: Reference
               params:
@@ -436,7 +450,8 @@ dataTypes:
                 required: null
     validations:
       unitOfColor:
-        description: vérifie l'unité de la couleur des individus
+        internationalizationName:
+          fr: vérifie l'unité de la couleur des individus
         checker:
           name: GroovyExpression
           params:
@@ -453,7 +468,8 @@ dataTypes:
               references:
                 - variables_et_unites_par_types_de_donnees
       unitOfIndividus:
-        description: vérifie l'unité du nombre d'individus
+        internationalizationName:
+          fr: vérifie l'unité du nombre d'individus
         checker:
           name: GroovyExpression
           params:
diff --git a/src/test/resources/data/olac/olac.yaml b/src/test/resources/data/olac/olac.yaml
index 740d0f52bb5c3b27a73bd88a829dc501e37c6e17..9e75b59ecb15d5d7393b51c1f4bfe42381a53826 100644
--- a/src/test/resources/data/olac/olac.yaml
+++ b/src/test/resources/data/olac/olac.yaml
@@ -174,8 +174,9 @@ dataTypes:
       date:
         components:
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
+            defaultValue:
+              expression: >
+                return datumByVariableAndComponent.get("date").get("day") +" " +datumByVariableAndComponent.get("date").get("time")+ ":00"
             checker:
               name: Date
               params:
@@ -663,8 +664,8 @@ dataTypes:
       dates:
         components:
           datetime:
-            defaultValue: >
-              return datumByVariableAndComponent.dates.day +" " +datumByVariableAndComponent.dates.time
+            defaultValue:
+              expression: return datumByVariableAndComponent.dates.day +" " +datumByVariableAndComponent.dates.time
             checker:
               name: Date
               params:
diff --git a/src/test/resources/data/recursivite/recusivite.yaml b/src/test/resources/data/recursivite/recusivite.yaml
index 413548f572985f54921bba87d7126462ee2ebf05..89b0eecc372d44f60facec8b0b2facc91847c886 100644
--- a/src/test/resources/data/recursivite/recusivite.yaml
+++ b/src/test/resources/data/recursivite/recusivite.yaml
@@ -29,23 +29,27 @@ references:
     keyColumns: [nom du taxon déterminé]
     validations:
       nom du taxon déterminé:
-        description: "nom du taxon déterminé"
+        internationalizationName:
+          fr: "nom du taxon déterminé"
         checker:
           name: RegularExpression
           params:
             pattern: .*
             required: true
-            codify: true
-            columns: nom du taxon déterminé
+            transformation:
+              codify: true
+        columns: [ nom du taxon déterminé ]
       nom du taxon superieur:
-        description: "nom du taxon superieur"
+        internationalizationName:
+          fr: "nom du taxon superieur"
         checker:
           name: Reference
           params:
             required: false
-            codify: true
+            transformation:
+              codify: true
             refType: taxon
-            columns: nom du taxon superieur
+        columns: [ nom du taxon superieur ]
     columns:
       nom du taxon déterminé:
       theme:
diff --git a/src/test/resources/data/validation/fake-app.yaml b/src/test/resources/data/validation/fake-app.yaml
index 1d5fde143e613bd7a32f0d2a16ea7934a17a9f0c..59cac12707b7908b7adad8e7a040f931ac23491b 100644
--- a/src/test/resources/data/validation/fake-app.yaml
+++ b/src/test/resources/data/validation/fake-app.yaml
@@ -166,11 +166,13 @@ dataTypes:
               name: Reference
               params:
                 refType: units
-                codify: true
+                transformation:
+                  codify: true
           standardDeviation:
     validations:
       exempledeDeRegleDeValidation:
-        description: "Juste un exemple"
+        internationalizationName:
+          fr: "Juste un exemple"
         checker:
           name: GroovyExpression
           params:
diff --git a/ui/src/locales/en.json b/ui/src/locales/en.json
index 282c2c26ad3d9719892c9e511fec1dfdc0f58529..01abc35e38f9ec8aced23b778b078b366a60b5a2 100644
--- a/ui/src/locales/en.json
+++ b/ui/src/locales/en.json
@@ -92,95 +92,118 @@
         "change": "Edit app",
         "version" : "The current version of the application <b class=\"has-text-primary\">{applicationName}</b> is <b class=\"has-text-primary\">{version}.</b>"
     },
-    "errors":{
-        "emptyFile":"File is empty",
-        "missingReferenceForChecker":"For data type <code>{dataType}</code>, datum <code>{datum}</code>, component <code>{component}</code>, you need to one of those references : <code>{references}</code>",
-        "missingReferenceForCheckerInReference":"For reference <code>{reference}</code> and validation <code>{validationKey}</code>, you need to one of those references : <code>{references}</code>",
-        "unknownReferenceForChecker":"For data type <code>{dataType}</code>, datum <code>{datum}</code>, component <code>{component}</code>, the reference <code>{refType}</code> is not in the accepted references which are: <code>{references}</code>",
-        "unknownReferenceForCheckerInReference":"For reference <code>{reference}</code> and validation <code>{validationKey}</code>, the reference <code>{refType}</code> is not in the accepted references which are: <code>{references}</code>",
-        "unsupportedVersion":"YAML files with version <code>{actualVersion}</code> aren't currently managed, expected version : <code>{expectedVersion}</code>",
-        "undeclaredDataGroupForVariable":"Variable <code>{variable}</code> doesn't belong to any data group, it needs to be in one",
-        "variableInMultipleDataGroup":"Variable <code>{variable}</code> is declared in several data groups, it needs to be only in one",
-        "unknownVariablesInDataGroup":"Data group <code>{dataGroup}</code> has undeclared data : <code>{unknownVariables}</code>. <br>Known data : <code>{variables}</code>",
-        "unknownReferenceInCompositereference": "The composite reference <code> {compositeReference} </code> contains references that are not declared <code> {unknownReferences} </code>. Known references <code> {references} </code>" ,
-        "requiredReferenceInCompositeReferenceForParentKeyColumn": "No reference has been declared for the <i>parentKeyColumn</i> <code> {parentKeyColumn} </code> in the composite reference <code> {compositeReference} </code>.",
-        "requiredParentKeyColumnInCompositeReferenceForReference": "In the composite reference <code> {compositeReference} </code> the reference <code> {reference} </code> refers to <code> {referenceTo} </code> but does not declare a < i> parentKeyColumn </i>. ",
-        "missingParentColumnForReferenceInCompositeReference": "In the composite reference <code> {compositeReference} </code> the <i> parentKeyColumn </i> <code> {parentKeyColumn} </code> does not exist in the reference <code> {reference } </code>. ",
-        "missingParentRecursiveKeyColumnForReferenceInCompositeReference": "In the composite reference <code> {compositeReference} </code> the <i> parentRecursiveKey </i> <code> {parentRecursiveKey} </code> does not exist in the reference <code> {reference } </code>. ",
-        "missingTimeScopeVariableComponentKey":"Mandatory indication of the variable (and its component) used for the time period for which we need to attach the data for rights management of data type : <code>{dataType}</code>",
-        "missingReferenceInCompositereference": "All components of the composite reference <code> {compositeReference} </code> must declare a reference.",
-        "timeScopeVariableComponentKeyMissingVariable":"Mandatory indication of the variable in which we collect the time period for which we need to attach the data for rights management of data type : <code>{dataType}</code>. <br>Accepted values : <code>{variables}</code>",
-        "timeScopeVariableComponentKeyUnknownVariable":"<code>{variable}</code> doesn't be along to any of known variables : <code>{knownVariables}</code>",
-        "timeVariableComponentKeyMissingComponent":"Mandatory indication of the component of : <code>{variable}</code> in which we collect the time period for which we need to attach the data for rights management of data type : <code>{dataType}</code>. <br>Accepted values : <code>{knownComponents}</code>",
-        "timeVariableComponentKeyUnknownComponent":"<code>{component}</code> doesn't belong to any of known variables : <code>{variable}</code>. <br>Known components : <code>{knownComponents}</code>",
-        "timeScopeVariableComponentWrongChecker":"The component <code>{component}</code> of variable <code>{variable}</code> can't be used for carrying time information because it's not declared as : <code>{expectedChecker}</code>",
-        "timeScopeVariableComponentPatternUnknown":"The component <code>{component}</code> of variable <code>{variable}</code> can't be used for carrying time information because the date format : <code>{pattern}</code> isn't managed. <br>Accepted formats : <code>{knownPatterns}</code>",
-        "missingAuthorizationForDatatype":"The authorization section must be present in the description of the <code> {datatype} </code> data type",
-        "missingAuthorizationScopeVariableComponentKey":"You must indicate at least one group of variables (and their components) in which (s) we collect the spatial information to be attached to the data for the rights management dataset <code> {dataType } </code> ",
-        "authorizationScopeVariableComponentKeyMissingVariable":"You must indicate the variable in which to collect the spatial information to which to attach the data for the management of the rights dataset <code> {dataType} </code> for the authorization <code> {authorizationName} </code>. Possible values ​​<code> {variables} </code> ",
-        "authorizationScopeVariableComponentKeyUnknownVariable":"<code> {variable} </code> is not one of the known columns <code> {knownVariables} </code>",
-        "authorizationVariableComponentKeyMissingComponent":"You must indicate the component of the variable <code> {variable} </code> in which we collect the spatial information to which to attach the data for the management of rights dataset <code> {dataType} < / code> for authorization <code> {authorizationName} </code>. Possible values ​​<code> {knownComponents} </code> ",
-        "authorizationVariableComponentKeyUnknownComponent":"<code> {component} </code> is not one of the known components for the variable <code> {variable} </code>. Known components: <code> {knownComponents} </code>",
-        "authorizationScopeVariableComponentWrongChecker":"The <code> {component} </code> component of the <code> {variable} </code> variable cannot be used as carrying time information because it is not declared data like <code> {expectedChecker} </code> ",
-        "authorizationScopeVariableComponentReftypeUnknown":"The <code> {refType} </code> reference of the <code> {component} </code> component of the <code> {variable} </code> variable has not been declared. accepted: <code> {knownPatterns} </code> ",
-        "authorizationScopeVariableComponentReftypeNull":"No reference has been defined for the <code> {component} </code> component of the variable <code> {variable} </code>. Accepted references: <code> {knownPatterns} </ code> ",
-        "unrecognizedProperty ":" Error at line <code> {lineNumber} </code> (column <code> {columnNumber} </code>): <code> {unknownPropertyName} </code>, c ' is not a recognized property. Recognized properties are <code> {knownProperties} </code> ",
-        "unrecognizedProperty":"Error in line <code>{lineNumber}</code> (column : <code>{columnNumber}</code>) : <code>{unknownPropertyName}</code>, is not a known property. <br>Known properties : <code>{knownProperties}</code>",
-        "invalidFormat":"Error in line : <code>{lineNumber}</code> (column : <code>{columnNumber}</code>) : <code>{value}</code> doesn't have the right format. <br>Expected format : <code>{targetTypeName}</code>",
-        "missingRequiredExpression":"For the validation rule <code>{lineValidationRuleKey}</code>, you have to write the expression to evaluate in order to verify that the data are following the rules.",
-        "illegalGroovyExpression":"For the validation rule : {lineValidationRuleKey}</code>, the expression : <code>{expression}</code> is not correct. Expression compilation error at line : <code>{compilationError.lineNumber}</code> (column : <code>{compilationError.columnNumber}</code>) message '<code>{compilationError.message}</code>'",
-        "unknownCheckerName":"For the validation rule : <code>{lineValidationRuleKey}</code>, '<code>{checkerName}</code>' is declared but is not a known checker",
-        "unknownCheckerNameForVariableComponentCheckerInReference":"In the reference validation <code> {reference} </code> and the validation rule <code> {validationRuleDescriptionEntryKey} </code>, '<code> {name} </code>' is declared but not a known check: possible values ​​<code> {variableComponentCheckers} </code>. ",
-        "csvBoundToUnknownVariable":"In the CSV format, header <code>{header}</code> is bound to unknown variable <code>{variable}</code>. Known variables: <code>{variables}</code>",
-        "unknownCheckerNameForVariableComponent":"In the description of the data type {datatype} the component <code> {component} </code> of the variable <code> {variable} </code> the value checker <code> {checkerName} </code> is declared but it is not a known control <br /> Known checkers are <code>{variableComponentCheckers}</code>",
-        "missingColumnReferenceForCheckerInReference":"In the reference description {reference} and the validation <code> {validationRuleDescriptionEntryKey} </code> the value checker <code> {checkerName} </code> declares unknown columns <code> {missingColumns } </code>: possible values ​​<code> {knownColumns} </code> ",
-        "missingParamColumnReferenceForCheckerInReference":"In the description of the <code> {reference} </code>, the validation rule <code> {validationRuleDescriptionEntryKey} </code> does not specify on which columns the rule should be executed by declaring a <code> columns </code> parameter ",
-        "csvBoundToUnknownVariableComponent":"In the CSV format, header <code>{header}</code> is bound to <code>{variable}</code> but it has no <code>{component}</code> component. Known components: <code>{components}</code>",
-        "invalidKeyColumns":"In the description of reference <code>{reference}</code>, colomns <code>{unknownUsedAsKeyElementColumns}</code> are declared as components of the key but there are no such columns. Known columns are <code>{knownColumns}</code>",
-        "missingKeyColumnsForReference": "In the description of reference <code>{reference}</code>, you must declare the components (at least one) of the key",
-        "invalidInternationalizedColumns":"In the repository description <code> {reference} </code>, the columns <code> {unknownUsedAsInternationalizedColumns} </code> are declared as part of internationalizable columns when they do not exist. Known columns: <code> {knownColumns} </code> ",
-        "invalidInternationalizedColumnsForDataType": "In the <code> {reference} </code> repository overload of the <code> {dataType} </code> data type description, the <code> {unknownUsedAsInternationalizedColumns} </code> columns are declared as part of internationalizable columns when they do not exist. Known columns: <code> {knownColumns} </code> ",
-        "unknownReferenceInDatatypeReferenceDisplay": "In the repository display overload of the <code> {dataType} </code> datatype description, the <code> {reference} </code> repository is unknown. Known repositories known : <code> {references} </code> ",
-        "unexpectedHeaderColumn":"Unexpected column header. Expected : <code>{expectedHeaderColumn}</code> <br />Actual : <code>{actualHeaderColumn}</code>",
-        "headerColumnPatternNotMatching":"Column header pattern not matching. Pattern to match : <code>{expectedHeaderColumnPattern}</code><br/>Actual header : <code>{actualHeaderColumn}</code>",
-        "unexpectedTokenCount":"Unexpected token count. Expected : <code>{expectedTokenCount}</code><br/>Actual header : <code>{actualHeader}</code> has <code>{actualTokenCount}</code> tokens",
-        "invalidHeaders":"Invalid headers. Expected columns : <code>{expectedColumns}</code><br/>Actual columns : <code>{actualColumns}</code><br/>Missing columns : <code>{missingColumns}</code><br/>Unknown columns : <code>{unknownColumns}</code>",
+    "errors": {
+        "authorizationScopeVariableComponentKeyMissingVariable": "You must indicate the variable in which to collect the spatial information to which to attach the data for the management of the rights dataset <code> {dataType} </code> for the authorization <code> {authorizationName} </code>. Possible values ​​<code> {variables} </code> ",
+        "authorizationScopeVariableComponentKeyUnknownVariable": "<code> {variable} </code> is not one of the known columns <code> {knownVariables} </code>",
+        "authorizationScopeVariableComponentReftypeNull": "No reference has been defined for the <code> {component} </code> component of the variable <code> {variable} </code>. Accepted references: <code> {knownPatterns} </ code> ",
+        "authorizationScopeVariableComponentReftypeUnknown": "The <code> {refType} </code> reference of the <code> {component} </code> component of the <code> {variable} </code> variable has not been declared. accepted: <code> {knownPatterns} </code> ",
+        "authorizationScopeVariableComponentWrongChecker": "The <code> {component} </code> component of the <code> {variable} </code> variable cannot be used as carrying time information because it is not declared data like <code> {expectedChecker} </code> ",
+        "authorizationVariableComponentKeyMissingComponent": "You must indicate the component of the variable <code> {variable} </code> in which we collect the spatial information to which to attach the data for the management of rights dataset <code> {dataType} < / code> for authorization <code> {authorizationName} </code>. Possible values ​​<code> {knownComponents} </code> ",
+        "authorizationVariableComponentKeyUnknownComponent": "<code> {component} </code> is not one of the known components for the variable <code> {variable} </code>. Known components: <code> {knownComponents} </code>",
+        "badauthorizationscopeforrepository": "Authorization <code> {authorization} </code>) must be <code> {expectedValue} / code> and not <code> {givenValue} </code>",
+        "checkerExpressionReturnedFalse": "The following constraint is not respected: <code> {expression} </code>",
+        "csvBoundToUnknownVariable": "In the CSV format, header <code>{header}</code> is bound to unknown variable <code>{variable}</code>. Known variables: <code>{variables}</code>",
+        "csvBoundToUnknownVariableComponent": "In the CSV format, header <code>{header}</code> is bound to <code>{variable}</code> but it has no <code>{component}</code> component. Known components: <code>{components}</code>",
+        "duplicateLineInDatatype": "In data file {file}, line {lineNumber} has the same identifier {duplicateKey} as lines {otherLines}",
+        "duplicateLineInReference": "In the repository file {file}, line {lineNumber} has the same id {duplicateKey} as lines {otherLines}",
+        "duplicatedHeaders": "These headers are duplicated : <code>{duplicatedHeaders}</code>",
+        "emptyFile": "File is empty",
         "emptyHeader": "The file contains a column with an empty header",
-        "duplicatedHeaders":"These headers are duplicated : <code>{duplicatedHeaders}</code>",
-        "patternNotMatched": "For the identified component: <code> {target} </code> the value <code> {value} </code> does not respect the expected format: <code> {pattern} </code>. ",
-        "patternNotMatchedWithColumn": "For column: <code> {target} </code> the value <code> {value} </code> does not respect the expected format: <code> {pattern} </code>." ,
+        "headerColumnPatternNotMatching": "Column header pattern not matching. Pattern to match : <code>{expectedHeaderColumnPattern}</code><br/>Actual header : <code>{actualHeaderColumn}</code>",
+        "illegalGroovyExpressionForValidationRuleInDataType": "For the validation rule <code>{lineValidationRuleKey}</code> in data type <code>{dataType}</code>, the expression : <code>{expression}</code> is not correct. Expression compilation error at line : <code>{compilationError.lineNumber}</code> (column : <code>{compilationError.columnNumber}</code>) message '<code>{compilationError.message}</code>'",
+        "illegalGroovyExpressionForValidationRuleInReference": "For the validation rule <code>{lineValidationRuleKey}</code> in reference <code>{reference}</code>, the expression : <code>{expression}</code> is not correct. Expression compilation error at line : <code>{compilationError.lineNumber}</code> (column : <code>{compilationError.columnNumber}</code>) message '<code>{compilationError.message}</code>'",
         "invalidDate": "For the identified component: <code> {target} </code> the date <code> {value} </code> does not respect the expected format: <code> {pattern} </code>. ",
-        "invalidDateWithColumn": "For column: <code> {column} </code> the date <code> {value} </code> does not respect the expected format: <code> {pattern} </code>." ,
-        "invalidInteger": "For the identified component: <code> {target} </code> the value <code> {value} </code> must be an integer.",
-        "invalidIntegerWithColumn": "For column: <code> {target} </code> the value <code> {value} </code> must be an integer.",
+        "invalidDateWithColumn": "For column: <code> {column} </code> the date <code> {value} </code> does not respect the expected format: <code> {pattern} </code>.",
+        "invalidDurationForDateCheckerForValidationRuleInDataType": "The 'duration' <code>{duration}</code> defined for validation rule <code>{validationRuleDescriptionEntryKey}</code> of data type <code>{dataType}</code> is incorrect",
+        "invalidDurationForDateCheckerForValidationRuleInReference": "The 'duration' <code>{duration}</code> defined for validation rule <code>{validationRuleDescriptionEntryKey}</code> of reference <code>{reference}</code> is incorrect",
+        "invalidDurationForReferenceColumnDateChecker": "The 'duration' <code>{duration}</code> defined for column <code>{column}</code> of reference <code>{referenceToValidate}</code> is incorrect",
+        "invalidDurationForVariableComponentDateChecker": "The 'duration' <code>{duration}</code> defined for component <code>{component}</code> of variable <code>{variable}</code> of data type <code>{dataType}</code> is incorrect",
         "invalidFloat": "For the identified component: <code> {target} </code> the value <code> {value} </code> must be a decimal number.",
         "invalidFloatWithColumn": "For column: <code> {target} </code> the value <code> {value} </code> must be a decimal number.",
+        "invalidFormat": "Error in line : <code>{lineNumber}</code> (column : <code>{columnNumber}</code>) : <code>{value}</code> doesn't have the right format. <br>Expected format : <code>{targetTypeName}</code>",
+        "invalidHeaders": "Invalid headers. Expected columns : <code>{expectedColumns}</code><br/>Actual columns : <code>{actualColumns}</code><br/>Missing columns : <code>{missingColumns}</code><br/>Unknown columns : <code>{unknownColumns}</code>",
+        "invalidInteger": "For the identified component: <code> {target} </code> the value <code> {value} </code> must be an integer.",
+        "invalidIntegerWithColumn": "For column: <code> {target} </code> the value <code> {value} </code> must be an integer.",
+        "invalidInternationalizedColumns": "In the repository description <code> {reference} </code>, the columns <code> {unknownUsedAsInternationalizedColumns} </code> are declared as part of internationalizable columns when they do not exist. Known columns: <code> {knownColumns} </code> ",
+        "invalidInternationalizedColumnsForDataType": "In the <code> {reference} </code> repository overload of the <code> {dataType} </code> data type description, the <code> {unknownUsedAsInternationalizedColumns} </code> columns are declared as part of internationalizable columns when they do not exist. Known columns: <code> {knownColumns} </code> ",
+        "invalidKeyColumns": "In the description of reference <code>{reference}</code>, colomns <code>{unknownUsedAsKeyElementColumns}</code> are declared as components of the key but there are no such columns. Known columns are <code>{knownColumns}</code>",
+        "invalidPatternForDateCheckerForValidationRuleInDataType": "The date pattern <code>{pattern}</code> defined for validation rule <code>{validationRuleDescriptionEntryKey}</code> of data type <code>{dataType}</code> is incorrect",
+        "invalidPatternForDateCheckerForValidationRuleInReference": "The date pattern <code>{pattern}</code> defined for validation rule <code>{validationRuleDescriptionEntryKey}</code> of reference <code>{reference}</code> is incorrect",
+        "invalidPatternForReferenceColumnDateChecker": "The date pattern <code>{pattern}</code> defined for column <code>{column}</code> of reference <code>{referenceToValidate}</code> is incorrect",
+        "invalidPatternForReferenceColumnRegularExpressionChecker": "The regular expression pattern <code>{pattern}</code> defined for column <code>{column}</code> of reference <code>{referenceToValidate}</code> is incorrect",
+        "invalidPatternForRegularExpressionCheckerForValidationRuleInDataType": "The regular expression pattern <code>{pattern}</code> defined for the validation rule <code>{validationRuleDescriptionEntryKey}</code> of data type <code>{dataType}</code> is incorrect",
+        "invalidPatternForRegularExpressionCheckerForValidationRuleInReference": "The regular expression pattern <code>{pattern}</code> defined for the validation rule <code>{validationRuleDescriptionEntryKey}</code> of reference <code>{reference}</code> is incorrect",
+        "invalidPatternForVariableComponentDateChecker": "The date pattern <code>{pattern}</code> defined for component <code>{component}</code> of variable <code>{variable}</code> of data type <code>{dataType}</code> is incorrect",
+        "invalidPatternForVariableComponentRegularExpressionChecker": "The regular expression pattern <code>{pattern}</code> defined for the component <code>{component}</code> of variable <code>{variable}</code> of data type <code>{dataType}</code> is incorrect",
         "invalidReference": "For the identified component: <code> {target} </code> the value <code> {value} </code> does not exist in the reference <code> {refType} </code>. Expected values ​​<code> {referenceValues} </code>. ",
         "invalidReferenceWithColumn": "For column: <code> {target} </code> the value <code> {value} </code> does not exist in the reference <code> {refType} </code>. Values expected <code> {referenceValues} </code>. ",
-        "checkerExpressionReturnedFalse": "The following constraint is not respected: <code> {expression} </code>",
+        "missingAggregationComponentForChart": "In the graph description of variable <code>{variable}</code> of data type <code>{dataType}</code>, component <code>{aggregationComponent}</code> of the aggregation variable <code>{aggregationVariable}</code> is not declared.<br /> Expected Values ​​<code>{components}</code>",
+        "missingAggregationVariableForChart": "In the chart description of variable <code>{variable}</code> of data type <code>{dataType}</code>, aggregation variable <code>{aggregationVariable}< /code> is not declared.<br /> Expected Values ​​<code>{variables}</code>",
+        "missingAuthorizationForDatatype": "The authorization section must be present in the description of the <code> {datatype} </code> data type",
+        "missingAuthorizationScopeVariableComponentKey": "You must indicate at least one group of variables (and their components) in which (s) we collect the spatial information to be attached to the data for the rights management dataset <code> {dataType } </code> ",
+        "missingBoundToForConstantDescription": "In the format->constant section of the dataType {dataType} you must fill in the boundTo section.",
+        "missingColumnNumberOrHeaderNameForConstantDescription": "In the format->constant section of dataType {dataType} you must specify a row number or header name.",
+        "missingColumnReferenceForCheckerInDataType": "For the validation rule : <code>{lineValidationRuleKey}</code> in data type <code>{dataType}</code>, '<code>{checkerName}</code>' is declared but is not a known checker. Known checkers are <code>{checkerOnTargetNames}</code>",
+        "missingColumnReferenceForCheckerInReference": "In the reference description {reference} and the validation <code> {validationRuleDescriptionEntryKey} </code> the value checker <code> {checkerName} </code> declares unknown columns <code> {missingColumns } </code>: possible values ​​<code> {knownColumns} </code> ",
+        "missingExportHeaderNameForConstantDescription": "In the format->constant section of dataType {dataType} you must specify an exportHeaderName.",
+        "missingKeyColumnsForReference": "In the description of reference <code>{reference}</code>, you must declare the components (at least one) of the key",
+        "missingParamColumnReferenceForCheckerInDataType": "In the description of the <code> {dataType} </code>, the validation rule <code> {validationRuleDescriptionEntryKey} </code> does not specify on which variable/components the rule should be executed by declaring a <code> variableComponents </code> parameter ",
+        "missingParamColumnReferenceForCheckerInReference": "In the description of the <code> {reference} </code>, the validation rule <code> {validationRuleDescriptionEntryKey} </code> does not specify on which columns the rule should be executed by declaring a <code> columns </code> parameter ",
+        "missingParentColumnForReferenceInCompositeReference": "In the composite reference <code> {compositeReference} </code> the <i> parentKeyColumn </i> <code> {parentKeyColumn} </code> does not exist in the reference <code> {reference } </code>. ",
+        "missingParentLineInRecursiveReference": "In repository file {references} the id value {missingReferencesKey} for parent does not exist. Accepted values ${knownReferences}",
+        "missingParentRecursiveKeyColumnForReferenceInCompositeReference": "In the composite reference <code> {compositeReference} </code> the <i> parentRecursiveKey </i> <code> {parentRecursiveKey} </code> does not exist in the reference <code> {reference } </code>. ",
+        "missingReferenceForChecker": "For data type <code>{dataType}</code>, datum <code>{datum}</code>, component <code>{component}</code>, you need to one of those references : <code>{references}</code>",
+        "missingReferenceForCheckerInDataType": "For data type <code>{dataType}</code> and validation <code>{validationKey}</code>, you need to one of those references : <code>{references}</code>",
+        "missingReferenceForCheckerInReference": "For reference <code>{reference}</code> and validation <code>{validationKey}</code>, you need to one of those references : <code>{references}</code>",
+        "missingReferenceForCheckerInReferenceColumn": "For reference <code>{referenceToValidate}≤/code>, you must provide the reference to use to check <code>{column}</code> among <code>{knownReferences}</code>",
+        "missingReferenceInCompositereference": "All components of the composite reference <code> {compositeReference} </code> must declare a reference.",
+        "missingRequiredExpressionForValidationRuleInDataType": "For the validation rule <code>{lineValidationRuleKey}</code> of data type <code>{dataType}</code>, you have to write the expression to evaluate in order to verify that the data are following the rules.",
+        "missingRequiredExpressionForValidationRuleInReference": "For the validation rule <code>{lineValidationRuleKey}</code> of reference <code>{reference}</code>, you have to write the expression to evaluate in order to verify that the data are following the rules.",
+        "missingRowLineForConstantDescription": "In the format->constant section of dataType {dataType} you must specify a line number.",
+        "missingStandardDeviationComponentForChart": "In the chart description of variable <code> {variable} </code> of data type <code> {dataType} </code>, the standard deviation <code> {standardDeviation}</ code> is not a declared component.<br /> Expected Values ​​<code>{components}</code>",
+        "missingTimeScopeVariableComponentKey": "Mandatory indication of the variable (and its component) used for the time period for which we need to attach the data for rights management of data type : <code>{dataType}</code>",
+        "missingUnitComponentForChart": "In the chart description of variable <code> {variable} </code> of data type <code> {dataType} </code>, unit <code> {unit}</code > is not a declared component.<br /> Expected Values ​​<code>{components}</code>",
+        "missingValueComponentForChart": "In the chart description of variable <code>{variable}</code> of data type <code>{dataType}</code>, value <code>{valueComponent}</code> is not a declared component.<br /> Expected Values ​​<code>{components}</code>",
+        "overlappingpublishedversion": "There is a deposited version in the deposit dates have an overlapping period with the deposited version. <code> {overlapingFiles] </code>",
+        "patternNotMatched": "For the identified component: <code> {target} </code> the value <code> {value} </code> does not respect the expected format: <code> {pattern} </code>. ",
+        "patternNotMatchedWithColumn": "For column: <code> {target} </code> the value <code> {value} </code> does not respect the expected format: <code> {pattern} </code>.",
+        "requiredParentKeyColumnInCompositeReferenceForReference": "In the composite reference <code> {compositeReference} </code> the reference <code> {reference} </code> refers to <code> {referenceTo} </code> but does not declare a < i> parentKeyColumn </i>. ",
+        "requiredReferenceInCompositeReferenceForParentKeyColumn": "No reference has been declared for the <i>parentKeyColumn</i> <code> {parentKeyColumn} </code> in the composite reference <code> {compositeReference} </code>.",
         "requiredValue": "For the identified component: <code> {target} </code> the value cannot be zero.",
         "requiredValueWithColumn": "For column: <code> {target} </code> the value cannot be zero.",
-        "timerangeoutofinterval":"The date <code> {value} </code> is incompatible with the date range of the deposit. It must be between <code> {from} </code> and <code> {to} </code>. ",
-        "badauthorizationscopeforrepository":"Authorization <code> {authorization} </code>) must be <code> {expectedValue} / code> and not <code> {givenValue} </code>",
-        "overlappingpublishedversion":"There is a deposited version in the deposit dates have an overlapping period with the deposited version. <code> {overlapingFiles] </code>",
-        "unDeclaredValueForChart":"In the chart description of variable <code> {variable} </code> of data type <code> {dataType} </code>, the value is not declared.<br /> Expected values ​​<code>{components}</code>",
-        "missingValueComponentForChart":"In the chart description of variable <code>{variable}</code> of data type <code>{dataType}</code>, value <code>{valueComponent}</code> is not a declared component.<br /> Expected Values ​​<code>{components}</code>",
-        "missingAggregationVariableForChart":"In the chart description of variable <code>{variable}</code> of data type <code>{dataType}</code>, aggregation variable <code>{aggregationVariable}< /code> is not declared.<br /> Expected Values ​​<code>{variables}</code>",
-        "missingAggregationComponentForChart":"In the graph description of variable <code>{variable}</code> of data type <code>{dataType}</code>, component <code>{aggregationComponent}</code> of the aggregation variable <code>{aggregationVariable}</code> is not declared.<br /> Expected Values ​​<code>{components}</code>",
-        "missingStandardDeviationComponentForChart":"In the chart description of variable <code> {variable} </code> of data type <code> {dataType} </code>, the standard deviation <code> {standardDeviation}</ code> is not a declared component.<br /> Expected Values ​​<code>{components}</code>",
-        "missingUnitComponentForChart":"In the chart description of variable <code> {variable} </code> of data type <code> {dataType} </code>, unit <code> {unit}</code > is not a declared component.<br /> Expected Values ​​<code>{components}</code>",
-        "duplicateLineInReference": "In the repository file {file}, line {lineNumber} has the same id {duplicateKey} as lines {otherLines}",
-        "duplicateLineInDatatype": "In data file {file}, line {lineNumber} has the same identifier {duplicateKey} as lines {otherLines}",
-        "missingParentLineInRecursiveReference": "In repository file {references} the id value {missingReferencesKey} for parent does not exist. Accepted values ${knownReferences}",
-        "unknownUsedAsVariableComponentUniqueness": "In the description of data type {dataType} in the <I>uniqueness</i> section component variable descriptions {unknownUsedAsVariableComponentUniqueness} do not exist. Accepted values {availableVariableComponents}",
+        "sameHeaderLineAndFirstRowLineForConstantDescription": "In the format->constant section of dataType {dataType} the header row must not be equal to the data row.",
+        "timeScopeVariableComponentKeyMissingVariable": "Mandatory indication of the variable in which we collect the time period for which we need to attach the data for rights management of data type : <code>{dataType}</code>. <br>Accepted values : <code>{variables}</code>",
+        "timeScopeVariableComponentKeyUnknownVariable": "<code>{variable}</code> doesn't be along to any of known variables : <code>{knownVariables}</code>",
+        "timeScopeVariableComponentPatternUnknown": "The component <code>{component}</code> of variable <code>{variable}</code> can't be used for carrying time information because the date format : <code>{pattern}</code> isn't managed. <br>Accepted formats : <code>{knownPatterns}</code>",
+        "timeScopeVariableComponentWrongChecker": "The component <code>{component}</code> of variable <code>{variable}</code> can't be used for carrying time information because it's not declared as : <code>{expectedChecker}</code>",
+        "timeVariableComponentKeyMissingComponent": "Mandatory indication of the component of : <code>{variable}</code> in which we collect the time period for which we need to attach the data for rights management of data type : <code>{dataType}</code>. <br>Accepted values : <code>{knownComponents}</code>",
+        "timeVariableComponentKeyUnknownComponent": "<code>{component}</code> doesn't belong to any of known variables : <code>{variable}</code>. <br>Known components : <code>{knownComponents}</code>",
+        "timerangeoutofinterval": "The date <code> {value} </code> is incompatible with the date range of the deposit. It must be between <code> {from} </code> and <code> {to} </code>. ",
         "tooBigRowLineForConstantDescription": "In the format->constant section of dataType {dataType} the row number must be less than the data row.",
         "tooLittleRowLineForConstantDescription": "In the format->constant section of dataType {dataType} the row number must be positive.",
-        "missingRowLineForConstantDescription": "In the format->constant section of dataType {dataType} you must specify a line number.",
-        "recordCsvMissingColumnNumberOrHeaderNameForConstantDescription": "In the format->constant section of dataType {dataType} you must specify a row number or header name.",
-        "missingBoundToForConstantDescription": "In the format->constant section of the dataType {dataType} you must fill in the boundTo section.",
-        "missingExportHeaderNameForConstantDescription": "In the format->constant section of dataType {dataType} you must specify an exportHeaderName.",
-        "sameHeaderLineAndFirstRowLineForConstantDescription": "In the format->constant section of dataType {dataType} the header row must not be equal to the data row."
-   },
+        "unDeclaredValueForChart": "In the chart description of variable <code> {variable} </code> of data type <code> {dataType} </code>, the value is not declared.<br /> Expected values ​​<code>{components}</code>",
+        "undeclaredDataGroupForVariable": "Variable <code>{variable}</code> doesn't belong to any data group, it needs to be in one",
+        "unexpectedHeaderColumn": "Unexpected column header. Expected : <code>{expectedHeaderColumn}</code> <br />Actual : <code>{actualHeaderColumn}</code>",
+        "unexpectedTokenCount": "Unexpected token count. Expected : <code>{expectedTokenCount}</code><br/>Actual header : <code>{actualHeader}</code> has <code>{actualTokenCount}</code> tokens",
+        "unknownCheckerNameForValidationRuleInDataType": "For the validation rule : <code>{lineValidationRuleKey}</code> in data type <code>{dataType}</code>, '<code>{checkerName}</code>' is declared but is not a known checker. Known checkers are <code>{checkerOnTargetNames}</code>",
+        "unknownCheckerNameForValidationRuleInReference": "For the validation rule : <code>{lineValidationRuleKey}</code> in reference <code>{reference}</code>, '<code>{checkerName}</code>' is declared but is not a known checker. Known checkers are <code>{checkerOnTargetNames}</code>",
+        "unknownCheckerNameForVariableComponent": "In the description of the data type {datatype} the component <code> {component} </code> of the variable <code> {variable} </code> the value checker <code> {checkerName} </code> is declared but it is not a known control <br /> Known checkers are <code>{knownCheckerNames}</code>",
+        "unknownCheckerNameForVariableComponentCheckerInDataType": "For the data type <code>{dataType}</code> and validation rule <code>{validationRuleDescriptionEntryKey}</code>, '<code>{name}</code>' is declared but it's not a known checker name: possible values are <code>{checkerOnTargetNames}</code>.",
+        "unknownCheckerNameForVariableComponentCheckerInReference": "In the reference validation <code> {reference} </code> and the validation rule <code> {validationRuleDescriptionEntryKey} </code>, '<code> {name} </code>' is declared but not a known check: possible values ​​<code> {variableComponentCheckers} </code>. ",
+        "unknownCheckerNameInReferenceColumn": "For reference <code>{referenceToValidate}</code>, the checker defined for column <code>{column}</code> is <code>{checkerName}</code>. It's not a known checker. Known checkers are <code>{knownCheckerNames}</code>",
+        "unknownIllegalException": "Unexpected error : <code>{cause}</code>",
+        "unknownReferenceForChecker": "For data type <code>{dataType}</code>, datum <code>{datum}</code>, component <code>{component}</code>, the reference <code>{refType}</code> is not in the accepted references which are: <code>{references}</code>",
+        "unknownReferenceForCheckerInDataType": "For data type <code>{dataType}</code> and validation <code>{validationKey}</code>, the reference <code>{refType}</code> is not in the accepted references which are: <code>{references}</code>",
+        "unknownReferenceForCheckerInReference": "For reference <code>{reference}</code> and validation <code>{validationKey}</code>, the reference <code>{refType}</code> is not in the accepted references which are: <code>{references}</code>",
+        "unknownReferenceForCheckerInReferenceColumn": "For reference <code>{referenceToValidate}</code> and column <code>{column}</code>, the reference to use to check the value is <code>{refType}</code> but it's not among known references <code>{knownReferences}</code>",
+        "unknownReferenceInCompositeReference": "The composite reference <code> {compositeReference} </code> contains references that are not declared <code> {unknownReferences} </code>. Known references <code> {references} </code>",
+        "unknownReferenceInDatatypeReferenceDisplay": "In the repository display overload of the <code> {dataType} </code> datatype description, the <code> {reference} </code> repository is unknown. Known repositories known : <code> {references} </code> ",
+        "unknownUsedAsVariableComponentUniqueness": "In the description of data type {dataType} in the <I>uniqueness</i> section component variable descriptions {unknownUsedAsVariableComponentUniqueness} do not exist. Accepted values {availableVariableComponents}",
+        "unknownVariablesInDataGroup": "Data group <code>{dataGroup}</code> has undeclared data : <code>{unknownVariables}</code>. <br>Known data : <code>{variables}</code>",
+        "unrecognizedProperty": "Error in line <code>{lineNumber}</code> (column : <code>{columnNumber}</code>) : <code>{unknownPropertyName}</code>, is not a known property. <br>Known properties : <code>{knownProperties}</code>",
+        "unsupportedVersion": "YAML files with version <code>{actualVersion}</code> aren't currently managed, expected version : <code>{expectedVersion}</code>",
+        "variableInMultipleDataGroup": "Variable <code>{variable}</code> is declared in several data groups, it needs to be only in one"
+    },
     "referencesManagement":{
         "actions":"Actions",
         "consult":"Consult",
diff --git a/ui/src/locales/fr.json b/ui/src/locales/fr.json
index 423c42e8a0bc7e6f16c498dad882d91d4df0d7b7..3605e2772e8147024584f726f7ab095f085c1d54 100644
--- a/ui/src/locales/fr.json
+++ b/ui/src/locales/fr.json
@@ -93,93 +93,116 @@
         "version" : "La version actuelle de l'application <b class=\"has-text-primary\">{applicationName}</b> est la version <b class=\"has-text-primary\">{version}.</b>"
     },
     "errors": {
-        "emptyFile": "Le fichier est vide",
-        "missingReferenceForChecker": "Pour le type de données <code>{dataType}</code>, la donnée <code>{datum}</code>, le composant <code>{component}</code>, il faut préciser le référentiel parmi <code>{references}</code>",
-        "missingReferenceForCheckerInReference": "Pour la reference <code>{reference}</code>, la validation <code>{validationKey}</code>, il faut préciser le référentiel parmi <code>{references}</code>",
-        "unknownReferenceForChecker": "Pour le type de données <code>{dataType}</code>, la donnée <code>{datum}</code>, le composant <code>{component}</code>, la référence <code>{refType}</code> n’est pas dans les références acceptées qui sont : <code>{references}</code>",
-        "unknownReferenceForCheckerInReference": "Pour la référence <code>{reference}</code>, la validation <code>{validationKey}</code>, la référence <code>{refType}</code> n’est pas dans les références acceptées qui sont : <code>{references}</code>",
-        "unsupportedVersion": "Les fichiers YAML de version <code>{actualVersion}</code> ne sont pas gérés, version attendue <code>{expectedVersion}</code>",
-        "undeclaredDataGroupForVariable": "La variable <code>{variable}</code> n’est déclarée appartenir à aucun groupe de données, elle doit être présente dans un groupe",
-        "variableInMultipleDataGroup": "La variable <code>{variable}</code> est déclarée dans plusieurs groupes de données, elle ne doit être présente que dans un groupe",
-        "unknownVariablesInDataGroup": "le groupe de données <code>{dataGroup}</code> contient des données qui ne sont pas déclarées <code>{unknownVariables}</code>. Données connues <code>{variables}</code>",
-        "unknownReferenceInCompositereference": "La reference composite <code>{compositeReference}</code> contient des références qui ne sont pas déclarées <code>{unknownReferences}</code>. Références connues <code>{references}</code>",
-        "missingReferenceInCompositereference": "Tous les composants de la  reference composite <code>{compositeReference}</code> doivent déclarer une référence",
-        "requiredReferenceInCompositeReferenceForParentKeyColumn": "Aucune référence n'a été déclarée  pour la <i>parentKeyColumn</i> <code>{parentKeyColumn}</code> dans la référence composite <code>{compositeReference}</code> .",
-        "requiredParentKeyColumnInCompositeReferenceForReference": "Dans la  référence composite <code>{compositeReference}</code> la référence <code>{reference}</code> fait référence à <code>{referenceTo}</code> mais ne déclare pas de <i>parentKeyColumn</i> .",
-        "missingParentColumnForReferenceInCompositeReference": "Dans la  référence composite <code>{compositeReference}</code> la <i>parentKeyColumn</i> <code>{parentKeyColumn}</code> n'existe pas dans la référence <code>{reference}</code>.",
-        "missingParentRecursiveKeyColumnForReferenceInCompositeReference": "Dans la  référence composite <code>{compositeReference}</code> la <i>parentRecursiveKey</i> <code>{parentRecursiveKey}</code> n'existe pas dans la référence <code>{reference}</code>.",
-        "missingTimeScopeVariableComponentKey": "Il faut indiquer la variable (et son composant) dans laquelle on recueille la période de temps à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code>",
-        "timeScopeVariableComponentKeyMissingVariable": "Il faut indiquer la variable dans laquelle on recueille la période de temps à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code>. Valeurs possibles <code>{variables}</code>",
-        "timeScopeVariableComponentKeyUnknownVariable": "<code>{variable}</code> ne fait pas partie des colonnes connues <code>{knownVariables}</code>",
-        "timeVariableComponentKeyMissingComponent": "Il faut indiquer le composant de la variable <code>{variable}</code> dans laquelle on recueille la période de temps à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code>. Valeurs possibles <code>{knownComponents}</code>",
-        "timeVariableComponentKeyUnknownComponent": "<code>{component}</code> ne fait pas partie des composants connus pour la variable <code>{variable}</code>. Composants connus : <code>{knownComponents}</code>",
-        "timeScopeVariableComponentWrongChecker": "Le composant <code>{component}</code> de la variable <code>{variable}</code> ne peut pas être utilisé comme portant l’information temporelle car ce n’est pas une donnée déclarée comme <code>{expectedChecker}</code>",
-        "timeScopeVariableComponentPatternUnknown": "Le composant <code>{component}</code> de la variable <code>{variable}</code> ne peut pas être utilisé comme portant l’information temporelle car le format de date '<code>{pattern}</code>' n’est pas géré. Formats acceptés : <code>{knownPatterns}</code>",
-        "missingAuthorizationScopeVariableComponentKey": "Il faut indiquer au moins un groupe de variables (et leur composants) dans le(s)quel(s) on recueille les informations spatiales à rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code>",
-        "missingAuthorizationForDatatype": "La section authorization doit être présente dans la description du type de données <code>{datatype}</code>",
         "authorizationScopeVariableComponentKeyMissingVariable": "Il faut indiquer la variable dans laquelle on recueille les informations spatiales à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code> pour l'autorisation <code>{authorizationName}</code>. Valeurs possibles <code>{variables}</code>",
         "authorizationScopeVariableComponentKeyUnknownVariable": "<code>{variable}</code> ne fait pas partie des colonnes connues <code>{knownVariables}</code>",
+        "authorizationScopeVariableComponentReftypeNull": "Aucune référence n'a été définie pour le composant <code>{component}</code> de la variable <code>{variable}</code>. Références acceptées : <code>{knownPatterns}</code>",
+        "authorizationScopeVariableComponentReftypeUnknown": "La référence <code>{refType}</code> du composant <code>{component}</code> de la variable <code>{variable}</code> n'a pas été déclarée. Références acceptées : <code>{knownPatterns}</code>",
+        "authorizationScopeVariableComponentWrongChecker": "Le composant <code>{component}</code> de la variable <code>{variable}</code> ne peut pas être utilisé comme portant l’information temporelle car ce n’est pas une donnée déclarée comme <code>{expectedChecker}</code>",
         "authorizationVariableComponentKeyMissingComponent": "Il faut indiquer le composant de la variable <code>{variable}</code> dans laquelle on recueille les informations spatiales à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code> pour l'autorisation <code>{authorizationName}</code>. Valeurs possibles <code>{knownComponents}</code>",
         "authorizationVariableComponentKeyUnknownComponent": "<code>{component}</code> ne fait pas partie des composants connus pour la variable <code>{variable}</code>. Composants connus : <code>{knownComponents}</code>",
-        "authorizationScopeVariableComponentWrongChecker": "Le composant <code>{component}</code> de la variable <code>{variable}</code> ne peut pas être utilisé comme portant l’information temporelle car ce n’est pas une donnée déclarée comme <code>{expectedChecker}</code>",
-        "authorizationScopeVariableComponentReftypeUnknown": "La référence <code>{refType}</code> du composant <code>{component}</code> de la variable <code>{variable}</code> n'a pas été déclarée. Références acceptées : <code>{knownPatterns}</code>",
-        "authorizationScopeVariableComponentReftypeNull": "Aucune référence n'a été définie pour le composant <code>{component}</code> de la variable <code>{variable}</code>. Références acceptées : <code>{knownPatterns}</code>",
-        "authorizationVariableComponentMustReferToCompositereference": "Pour le type de données <code>{dataType}</code>, la référence <code>{refType}</code> de l'authorisation <code>{authorizationName}</code> doit être définie commme une référence composite <code>compositeReferences</code>. CompositesReferences déclarée : <code>{knownCompositesReferences}</code>",
-        "unrecognizedProperty": "Erreur à la ligne <code>{lineNumber}</code> (colonne <code>{columnNumber}</code>) : <code>{unknownPropertyName}</code>, c’est pas une propriété reconnue. Les propriétés reconnues sont <code>{knownProperties}</code>",
-        "invalidFormat": "Erreur à la ligne <code>{lineNumber}</code> (colonne <code>{columnNumber}</code>) : '<code>{value}</code>' n’a pas le bon format. Le type attendu est <code>{targetTypeName}</code>",
-        "missingRequiredExpression": "Pour la règle de validation <code>{lineValidationRuleKey}</code>, vous devez renseigner l’expression à évaluer pour contrôler que la règle est respectée par les données",
-        "illegalGroovyExpression": "Pour la règle de validation <code>{lineValidationRuleKey}</code>, l’expression renseignée <code>{expression}</code> n’est pas correcte. Erreur de compilation de l’expression à la ligne <code>{compilationError.lineNumber}</code> (colonne <code>{compilationError.columnNumber}</code>) message '<code>{compilationError.message}</code>'",
-        "unknownCheckerName": "Pour la règle de validation <code>{lineValidationRuleKey}</code>, '<code>{checkerName}</code>' est déclaré mais ce n’est pas un contrôle connu",
-        "unknownCheckerNameForVariableComponentCheckerInReference": "Dans la validation de la référence <code>{reference}</code> et la règle de validation <code>{validationRuleDescriptionEntryKey}</code>, '<code>{name}</code>' est déclaré mais ce n’est pas un contrôle connu: valeurs possibles <code>{variableComponentCheckers}</code>.",
+        "badauthorizationscopeforrepository": "L'autorisation <code>{authorization}</code>) doit être <code>{expectedValue}/code> et non <code>{givenValue}</code>",
+        "checkerExpressionReturnedFalse": "La contrainte suivante n'est pas respectée : <code>{expression}</code>",
         "csvBoundToUnknownVariable": "Dans le format CSV, l’entête <code>{header}</code> est lié à la variable <code>{variable}</code> qui n’est pas connue. Variables connues <code>{variables}</code>",
-        "unknownCheckerNameForVariableComponent": "Dans la description du type de données {datatype} le composant <code>{component}</code>  de la variable <code>{variable}</code> le vérificateur de valeur <code>{checkerName}</code> est déclaré mais ce n’est pas un contrôle connu<br /> Vérificateurs connues : <code>{variableComponentCheckers}</code>",
-        "missingColumnReferenceForCheckerInReference": "Dans la description de la référence {reference} et la validation  <code>{validationRuleDescriptionEntryKey}</code> le vérificateur de valeur <code>{checkerName}</code> déclare des colonnes inconnues <code>{missingColumns}</code> : valeurs possible<code>{knownColumns}</code>",
-        "missingParamColumnReferenceForCheckerInReference": "Dans la description de la <code>{reference}</code>, la règle de validation <code>{validationRuleDescriptionEntryKey}</code> ne précise pas sur quelles colonnes la règle doit s'exécuter en déclarant un paramètre <code>columns</code>",
         "csvBoundToUnknownVariableComponent": "Dans le format CSV, l’entête <code>{header}</code> est lié à la variable <code>{variable}</code> mais elle n’a pas de composant <code>{component}</code>. Composants connus <code>{components}</code>",
-        "invalidKeyColumns": "Dans la description du référentiel <code>{reference}</code>, les colonnes <code>{unknownUsedAsKeyElementColumns}</code> sont déclarées comme faisant partie de la clé alors qu’elles n’existent pas. Colonnes connues : <code>{knownColumns}</code>",
-        "missingKeyColumnsForReference": "Dans la description du référentiel <code>{reference}</code>, vous devez déclarer les colonnes (au moins une) qui composent la clé naturelle",
-        "invalidInternationalizedColumns": "Dans la description du référentiel <code>{reference}</code>, les colonnes <code>{unknownUsedAsInternationalizedColumns}</code> sont déclarées comme faisant partie de colonnes internationalisables alors qu’elles n’existent pas. Colonnes connues : <code>{knownColumns}</code>",
-        "invalidInternationalizedColumnsForDataType": "Dans la surcharge du référentiel <code>{reference}</code> de la description du type de donnée <code>{dataType}</code>, les colonnes <code>{unknownUsedAsInternationalizedColumns}</code> sont déclarées comme faisant partie de colonnes internationalisables alors qu’elles n’existent pas. Colonnes connues : <code>{knownColumns}</code>",
-        "unknownReferenceInDatatypeReferenceDisplay": "Dans la surcharge de l'affichage des référentiels de la description du type de donnée <code>{dataType}</code>, le référentiel <code>{reference}</code> est inconnu . Référentiels connus connues : <code>{references}</code>",
-        "unexpectedHeaderColumn": "En-tête de colonne inattendu. En-tête attendu : <code>{expectedHeaderColumn}</code> <br />En-tête actuel : <code>{actualHeaderColumn}</code>",
-        "headerColumnPatternNotMatching": "Erreur dans le format de l'en-tête de colonne. Format à respecter : <code>{expectedHeaderColumnPattern}</code><br/>En-tête actuel : <code>{actualHeaderColumn}</code>",
-        "unexpectedTokenCount": "Le nombre de token est inattendu. Nombre attendu : <code>{expectedTokenCount}</code><br/>L'en-tête actuel : <code>{actualHeader}</code> comprend <code>{actualTokenCount}</code> tokens",
-        "invalidHeaders": "En-têtes de colonne invalides. Les colonnes attendues sont : <code>{expectedColumns}</code><br/>Les colonnes actuelles sont : <code>{actualColumns}</code><br/> Il manque les colonnes : <code>{missingColumns}</code><br/>Les colonnes suivantes sont inconnues : <code>{unknownColumns}</code>",
-        "emptyHeader": "Le fichier contient un en-tête de colonne vide",
         "duplicatedHeaders": "Les en-têtes suivants sont dupliqués : <code>{duplicatedHeaders}</code>",
-        "patternNotMatched": "Pour le composant identifié : <code>{target}</code> la valeur <code>{value}</code> ne respecte pas le format attendu : <code>{pattern}</code>.",
-        "patternNotMatchedWithColumn": "Pour la colonne : <code>{target}</code> la valeur <code>{value}</code> ne respecte pas le format attendu : <code>{pattern}</code>.",
+        "duplicatedLineInDatatype": "Dans le fichier de données {file}, la ligne {lineNumber} a le même identifiant {duplicateKey} que les lignes {otherLines}",
+        "duplicatedLineInReference": "Dans le fichier du référentiel {file}, la ligne {lineNumber} a le même identifiant {duplicateKey} que les lignes {otherLines}",
+        "emptyFile": "Le fichier est vide",
+        "emptyHeader": "Le fichier contient un en-tête de colonne vide",
+        "headerColumnPatternNotMatching": "Erreur dans le format de l'en-tête de colonne. Format à respecter : <code>{expectedHeaderColumnPattern}</code><br/>En-tête actuel : <code>{actualHeaderColumn}</code>",
+        "illegalGroovyExpressionForValidationRuleInDataType": "Pour la règle de validation <code>{lineValidationRuleKey}</code> du type de données <code>{dataType}</code>, l’expression renseignée <code>{expression}</code> n’est pas correcte. Erreur de compilation de l’expression à la ligne <code>{compilationError.lineNumber}</code> (colonne <code>{compilationError.columnNumber}</code>) message '<code>{compilationError.message}</code>'",
+        "illegalGroovyExpressionForValidationRuleInReference": "Pour la règle de validation <code>{lineValidationRuleKey}</code> de la référence {reference}, l’expression renseignée <code>{expression}</code> n’est pas correcte. Erreur de compilation de l’expression à la ligne <code>{compilationError.lineNumber}</code> (colonne <code>{compilationError.columnNumber}</code>) message '<code>{compilationError.message}</code>'",
         "invalidDate": "Pour le composant identifié : <code>{target}</code> la date <code>{value}</code> ne respecte pas le format attendu : <code>{pattern}</code>. ",
         "invalidDateWithColumn": "Pour la colonne : <code>{column}</code> la date <code>{value}</code> ne respecte pas le format attendu : <code>{pattern}</code>. ",
-        "invalidInteger": "Pour le composant identifié : <code>{target}</code> la valeur <code>{value}</code> doit être un entier.",
-        "invalidIntegerWithColumn": "Pour la colonne : <code>{target}</code> la valeur <code>{value}</code> doit être un entier.",
+        "invalidDurationForDateCheckerForValidationRuleInDataType": "La 'duration' <code>{duration}</code> définie pour la règle de validation <code>{validationRuleDescriptionEntryKey}</code> du type de données <code>{dataType}</code> est incorrecte",
+        "invalidDurationForDateCheckerForValidationRuleInReference": "La 'duration' <code>{duration}</code> définie pour la règle de validation <code>{validationRuleDescriptionEntryKey}</code> du référentiel <code>{reference}</code> est incorrecte",
+        "invalidDurationForReferenceColumnDateChecker": "La 'duration' <code>{duration}</code> définie pour la colonne <code>{column}</code> du référentiel <code>{referenceToValidate}</code> est incorrecte",
+        "invalidDurationForVariableComponentDateChecker": "La 'duration' <code>{duration}</code> définie pour le composant <code>{component}</code> de la variable <code>{variable}</code> du type de données <code>{dataType}</code> est incorrecte",
         "invalidFloat": "Pour le composant identifié : <code>{target}</code> la valeur <code>{value}</code> doit être un nombre décimal.",
         "invalidFloatWithColumn": "Pour la colonne : <code>{target}</code> la valeur <code>{value}</code> doit être un nombre décimal.",
+        "invalidFormat": "Erreur à la ligne <code>{lineNumber}</code> (colonne <code>{columnNumber}</code>) : '<code>{value}</code>' n’a pas le bon format. Le type attendu est <code>{targetTypeName}</code>",
+        "invalidHeaders": "En-têtes de colonne invalides. Les colonnes attendues sont : <code>{expectedColumns}</code><br/>Les colonnes actuelles sont : <code>{actualColumns}</code><br/> Il manque les colonnes : <code>{missingColumns}</code><br/>Les colonnes suivantes sont inconnues : <code>{unknownColumns}</code>",
+        "invalidInteger": "Pour le composant identifié : <code>{target}</code> la valeur <code>{value}</code> doit être un entier.",
+        "invalidIntegerWithColumn": "Pour la colonne : <code>{target}</code> la valeur <code>{value}</code> doit être un entier.",
+        "invalidInternationalizedColumns": "Dans la description du référentiel <code>{reference}</code>, les colonnes <code>{unknownUsedAsInternationalizedColumns}</code> sont déclarées comme faisant partie de colonnes internationalisables alors qu’elles n’existent pas. Colonnes connues : <code>{knownColumns}</code>",
+        "invalidInternationalizedColumnsForDataType": "Dans la surcharge du référentiel <code>{reference}</code> de la description du type de donnée <code>{dataType}</code>, les colonnes <code>{unknownUsedAsInternationalizedColumns}</code> sont déclarées comme faisant partie de colonnes internationalisables alors qu’elles n’existent pas. Colonnes connues : <code>{knownColumns}</code>",
+        "invalidKeyColumns": "Dans la description du référentiel <code>{reference}</code>, les colonnes <code>{unknownUsedAsKeyElementColumns}</code> sont déclarées comme faisant partie de la clé alors qu’elles n’existent pas. Colonnes connues : <code>{knownColumns}</code>",
+        "invalidPatternForDateCheckerForValidationRuleInDataType": "Le format de date <code>{pattern}</code> défini pour la règle de validation <code>{validationRuleDescriptionEntryKey}</code> du type de données <code>{dataType}</code> est incorrect",
+        "invalidPatternForDateCheckerForValidationRuleInReference": "Le format de date <code>{pattern}</code> défini pour la règle de validation <code>{validationRuleDescriptionEntryKey}</code> du référentiel <code>{reference}</code> est incorrect",
+        "invalidPatternForReferenceColumnDateChecker": "Le format de date <code>{pattern}</code> défini pour la colonne <code>{column}</code> du référentiel <code>{referenceToValidate}</code> est incorrect",
+        "invalidPatternForReferenceColumnRegularExpressionChecker": "L'expression régulière <code>{pattern}</code> défini pour la colonne <code>{column}</code> du référentiel <code>{referenceToValidate}</code> est incorrect",
+        "invalidPatternForRegularExpressionCheckerForValidationRuleInDataType": "L'expression régulière <code>{pattern}</code> défini pour la règle de validation <code>{validationRuleDescriptionEntryKey}</code> du type de données <code>{dataType}</code> est incorrect",
+        "invalidPatternForRegularExpressionCheckerForValidationRuleInReference": "L'expression régulière <code>{pattern}</code> défini pour la règle de validation <code>{validationRuleDescriptionEntryKey}</code> du référentiel <code>{reference}</code> est incorrect",
+        "invalidPatternForVariableComponentDateChecker": "Le format de date <code>{pattern}</code> défini pour le composant <code>{component}</code> de la variable <code>{variable}</code> du type de données <code>{dataType}</code> est incorrect",
+        "invalidPatternForVariableComponentRegularExpressionChecker": "L'expression régulière <code>{pattern}</code> défini pour le composant <code>{component}</code> de la variable <code>{variable}</code> du type de données <code>{dataType}</code> est incorrect",
         "invalidReference": "Pour le composant identifié : <code>{target}</code> la valeur <code>{value}</code> n'existe pas dans la référence <code>{refType}</code>. Valeurs attendues <code>{referenceValues}</code>.",
         "invalidReferenceWithColumn": "Pour la colonne : <code>{target}</code>  la valeur <code>{value}</code> n'existe pas dans la référence <code>{refType}</code>. Valeurs attendues <code>{referenceValues}</code>.",
-        "checkerExpressionReturnedFalse": "La contrainte suivante n'est pas respectée : <code>{expression}</code>",
+        "missingAggregationComponentForChart": "Dans la description du graphe de la variable <code> {variable} </code> du type de données <code> {dataType} </code>, le componsant <code> {aggregationComponent}</code> de la variable d'aggrégation <code> {aggregationVariable}</code> n'est pas déclarée.<br />  Valeurs attendues <code>{components}</code>",
+        "missingAggregationVariableForChart": "Dans la description du graphe de la variable <code> {variable} </code> du type de données <code> {dataType} </code>, la variable d'aggrégation <code> {aggregationVariable}</code> n'est pas déclarée.<br />  Valeurs attendues <code>{variables}</code>",
+        "missingAuthorizationForDatatype": "La section authorization doit être présente dans la description du type de données <code>{datatype}</code>",
+        "missingAuthorizationScopeVariableComponentKey": "Il faut indiquer au moins un groupe de variables (et leur composants) dans le(s)quel(s) on recueille les informations spatiales à rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code>",
+        "missingBoundToForConstantDescription": "Dans la section format->constant du dataType {dataType} vous devez remplir la section boundTo.",
+        "missingColumnNumberOrHeaderNameForConstantDescription": "Dans la section format->constant du dataType {dataType} vous devez indiquer un numéro de ligne ou un nom d'en-tête.",
+        "missingColumnReferenceForCheckerInDataType": "Dans la description du type de données {dataType} et la validation <code>{validationRuleDescriptionEntryKey}</code> le vérificateur de valeur <code>{checkerName}</code> déclare des variables/composants inconnus <code>{missingVariableComponents}</code> : valeurs possible<code>{knownVariableComponents}</code>",
+        "missingColumnReferenceForCheckerInReference": "Dans la description de la référence {reference} et la validation <code>{validationRuleDescriptionEntryKey}</code> le vérificateur de valeur <code>{checkerName}</code> déclare des colonnes inconnues <code>{missingColumns}</code> : valeurs possible<code>{knownColumns}</code>",
+        "missingExportHeaderNameForConstantDescription": "Dans la section format->constant du dataType {dataType} vous devez spécifier un exportHeaderName.",
+        "missingKeyColumnsForReference": "Dans la description du référentiel <code>{reference}</code>, vous devez déclarer les colonnes (au moins une) qui composent la clé naturelle",
+        "missingParamColumnReferenceForCheckerInDataType": "Dans la description du type de données <code>{dataType}</code>, la règle de validation <code>{validationRuleDescriptionEntryKey}</code> ne précise pas sur quelles variables/composants la règle doit s'exécuter en déclarant un paramètre <code>variableComponents</code>",
+        "missingParamColumnReferenceForCheckerInReference": "Dans la description de la <code>{reference}</code>, la règle de validation <code>{validationRuleDescriptionEntryKey}</code> ne précise pas sur quelles colonnes la règle doit s'exécuter en déclarant un paramètre <code>columns</code>",
+        "missingParentColumnForReferenceInCompositeReference": "Dans la  référence composite <code>{compositeReference}</code> la <i>parentKeyColumn</i> <code>{parentKeyColumn}</code> n'existe pas dans la référence <code>{reference}</code>.",
+        "missingParentLineInRecursiveReference": "Dans le fichier du référentiel {references} la valeur d'identifiant {missingReferencesKey} pour le  parent n'existe pas. Valeurs acceptées {knownReferences}",
+        "missingParentRecursiveKeyColumnForReferenceInCompositeReference": "Dans la  référence composite <code>{compositeReference}</code> la <i>parentRecursiveKey</i> <code>{parentRecursiveKey}</code> n'existe pas dans la référence <code>{reference}</code>.",
+        "missingReferenceForChecker": "Pour le type de données <code>{dataType}</code>, la donnée <code>{datum}</code>, le composant <code>{component}</code>, il faut préciser le référentiel parmi <code>{references}</code>",
+        "missingReferenceForCheckerInDataType": "Pour le type de données <code>{dataType}</code>, la validation <code>{validationKey}</code>, il faut préciser le référentiel parmi <code>{references}</code>",
+        "missingReferenceForCheckerInReference": "Pour la reference <code>{reference}</code>, la validation <code>{validationKey}</code>, il faut préciser le référentiel parmi <code>{references}</code>",
+        "missingReferenceForCheckerInReferenceColumn": "Pour la reference <code>{referenceToValidate}</code>, il faut indiquer le référentiel à utiliser pour le contrôle de la valeur de <code>{column}</code> parmi <code>{knownReferences}</code>",
+        "missingReferenceInCompositereference": "Tous les composants de la  reference composite <code>{compositeReference}</code> doivent déclarer une référence",
+        "missingRequiredExpressionForValidationRuleInDataType": "Pour la règle de validation <code>{lineValidationRuleKey}</code> du type de données <code>{dataType}</code>, vous devez renseigner l’expression à évaluer pour contrôler que la règle est respectée par les données",
+        "missingRequiredExpressionForValidationRuleInReference": "Pour la règle de validation <code>{lineValidationRuleKey}</code> de la référence {reference}, vous devez renseigner l’expression à évaluer pour contrôler que la règle est respectée par les données",
+        "missingRowLineForConstantDescription": "Dans la section format->constant du dataType {dataType} vous devez indiquer un numéro de ligne.",
+        "missingStandardDeviationComponentForChart": "Dans la description du graphe de la variable <code> {variable} </code> du type de données <code> {dataType} </code>, l'écart type  <code> {standardDeviation}</code> n'est pas un composant déclaré.<br /> Valeurs attendues <code>{components}</code>",
+        "missingTimeScopeVariableComponentKey": "Il faut indiquer la variable (et son composant) dans laquelle on recueille la période de temps à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code>",
+        "missingUnitComponentForChart": "Dans la description du graphe de la variable <code> {variable} </code> du type de données <code> {dataType} </code>, l'unité  <code> {unit}</code> n'est pas un composant déclaré.<br /> Valeurs attendues <code>{components}</code>",
+        "missingValueComponentForChart": "Dans la description du graphe de la variable <code> {variable} </code> du type de données <code> {dataType} </code>, la valeur <code> {valueComponent}</code> n'est pas un composant déclaré.<br /> Valeurs attendues <code>{components}</code>",
+        "overlappingpublishedversion": "Il existe une version déposée dans les dates de dépôt ont une période chevauchante avec la version déposée. <code>{overlapingFiles]</code>",
+        "patternNotMatched": "Pour le composant identifié : <code>{target}</code> la valeur <code>{value}</code> ne respecte pas le format attendu : <code>{pattern}</code>.",
+        "patternNotMatchedWithColumn": "Pour la colonne : <code>{target}</code> la valeur <code>{value}</code> ne respecte pas le format attendu : <code>{pattern}</code>.",
+        "requiredParentKeyColumnInCompositeReferenceForReference": "Dans la  référence composite <code>{compositeReference}</code> la référence <code>{reference}</code> fait référence à <code>{referenceTo}</code> mais ne déclare pas de <i>parentKeyColumn</i> .",
+        "requiredReferenceInCompositeReferenceForParentKeyColumn": "Aucune référence n'a été déclarée  pour la <i>parentKeyColumn</i> <code>{parentKeyColumn}</code> dans la référence composite <code>{compositeReference}</code> .",
         "requiredValue": "Pour le composant identifié : <code>{target}</code> la valeur ne peut pas être nulle.",
         "requiredValueWithColumn": "Pour la colonne : <code>{target}</code> la valeur ne peut pas être nulle.",
+        "sameHeaderLineAndFirstRowLineForConstantDescription": "Dans la section format->constant du dataType {dataType} la ligne d'en-tête ne doit pas être egale à la ligne de données.",
+        "timeScopeVariableComponentKeyMissingVariable": "Il faut indiquer la variable dans laquelle on recueille la période de temps à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code>. Valeurs possibles <code>{variables}</code>",
+        "timeScopeVariableComponentKeyUnknownVariable": "<code>{variable}</code> ne fait pas partie des colonnes connues <code>{knownVariables}</code>",
+        "timeScopeVariableComponentPatternUnknown": "Le composant <code>{component}</code> de la variable <code>{variable}</code> ne peut pas être utilisé comme portant l’information temporelle car le format de date '<code>{pattern}</code>' n’est pas géré. Formats acceptés : <code>{knownPatterns}</code>",
+        "timeScopeVariableComponentWrongChecker": "Le composant <code>{component}</code> de la variable <code>{variable}</code> ne peut pas être utilisé comme portant l’information temporelle car ce n’est pas une donnée déclarée comme <code>{expectedChecker}</code>",
+        "timeVariableComponentKeyMissingComponent": "Il faut indiquer le composant de la variable <code>{variable}</code> dans laquelle on recueille la période de temps à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code>. Valeurs possibles <code>{knownComponents}</code>",
+        "timeVariableComponentKeyUnknownComponent": "<code>{component}</code> ne fait pas partie des composants connus pour la variable <code>{variable}</code>. Composants connus : <code>{knownComponents}</code>",
         "timerangeoutofinterval": "La date  <code>{value}</code> est incompatible avec l'intervale de dates du dépôt. Elle doit être comprise entre <code>{from}</code> et <code>{to}</code>.",
-        "badauthorizationscopeforrepository": "L'autorisation <code>{authorization}</code>) doit être <code>{expectedValue}/code> et non <code>{givenValue}</code>",
-        "overlappingpublishedversion": "Il existe une version déposée dans les dates de dépôt ont une période chevauchante avec la version déposée. <code>{overlapingFiles]</code>",
-        "unDeclaredValueForChart":"Dans la description du graphe de la variable <code> {variable} </code> du type de données <code> {dataType} </code>, la valeur n'est pas déclarée.<br />  Valeurs attendues <code>{components}</code>",
-        "missingValueComponentForChart":"Dans la description du graphe de la variable <code> {variable} </code> du type de données <code> {dataType} </code>, la valeur <code> {valueComponent}</code> n'est pas un composant déclaré.<br /> Valeurs attendues <code>{components}</code>",
-        "missingAggregationVariableForChart":"Dans la description du graphe de la variable <code> {variable} </code> du type de données <code> {dataType} </code>, la variable d'aggrégation <code> {aggregationVariable}</code> n'est pas déclarée.<br />  Valeurs attendues <code>{variables}</code>",
-        "missingAggregationComponentForChart":"Dans la description du graphe de la variable <code> {variable} </code> du type de données <code> {dataType} </code>, le componsant <code> {aggregationComponent}</code> de la variable d'aggrégation <code> {aggregationVariable}</code> n'est pas déclarée.<br />  Valeurs attendues <code>{components}</code>",
-        "missingStandardDeviationComponentForChart":"Dans la description du graphe de la variable <code> {variable} </code> du type de données <code> {dataType} </code>, l'écart type  <code> {standardDeviation}</code> n'est pas un composant déclaré.<br /> Valeurs attendues <code>{components}</code>",
-        "missingUnitComponentForChart":"Dans la description du graphe de la variable <code> {variable} </code> du type de données <code> {dataType} </code>, l'unité  <code> {unit}</code> n'est pas un composant déclaré.<br /> Valeurs attendues <code>{components}</code>",
-        "duplicatedLineInReference": "Dans le fichier du référentiel {file}, la ligne {lineNumber} a le même identifiant {duplicateKey} que les lignes {otherLines}",
-        "duplicatedLineInDatatype": "Dans le fichier de données {file}, la ligne {lineNumber} a le même identifiant {duplicateKey} que les lignes {otherLines}",
-        "missingParentLineInRecursiveReference": "Dans le fichier du référentiel {references} la valeur d'identifiant {missingReferencesKey} pour le  parent n'existe pas. Valeurs acceptées {knownReferences}",
-        "unknownUsedAsVariableComponentUniqueness": "Dans la description du type de données {dataType} dans la section <I>uniqueness</i> les descriptions de variable composants {unknownUsedAsVariableComponentUniqueness} n'existent pas. Valeurs acceptées {availableVariableComponents}",
         "tooBigRowLineForConstantDescription": "Dans la section format->constant du dataType {dataType} le numéro de ligne doit être inférieur    à celui de la ligne de données.",
         "tooLittleRowLineForConstantDescription": "Dans la section format->constant du dataType {dataType} le numéro de ligne doit être positif.",
-        "missingRowLineForConstantDescription": "Dans la section format->constant du dataType {dataType} vous devez indiquer un numéro de ligne.",
-        "recordCsvMissingColumnNumberOrHeaderNameForConstantDescription": "Dans la section format->constant du dataType {dataType} vous devez indiquer un numéro de ligne ou un nom d'en-tête.",
-        "missingBoundToForConstantDescription": "Dans la section format->constant du dataType {dataType} vous devez remplir la section boundTo.",
-        "missingExportHeaderNameForConstantDescription": "Dans la section format->constant du dataType {dataType} vous devez spécifier un exportHeaderName.",
-        "sameHeaderLineAndFirstRowLineForConstantDescription": "Dans la section format->constant du dataType {dataType} la ligne d'en-tête ne doit pas être egale à la ligne de données."
+        "unDeclaredValueForChart": "Dans la description du graphe de la variable <code> {variable} </code> du type de données <code> {dataType} </code>, la valeur n'est pas déclarée.<br />  Valeurs attendues <code>{components}</code>",
+        "undeclaredDataGroupForVariable": "La variable <code>{variable}</code> n’est déclarée appartenir à aucun groupe de données, elle doit être présente dans un groupe",
+        "unexpectedHeaderColumn": "En-tête de colonne inattendu. En-tête attendu : <code>{expectedHeaderColumn}</code> <br />En-tête actuel : <code>{actualHeaderColumn}</code>",
+        "unexpectedTokenCount": "Le nombre de token est inattendu. Nombre attendu : <code>{expectedTokenCount}</code><br/>L'en-tête actuel : <code>{actualHeader}</code> comprend <code>{actualTokenCount}</code> tokens",
+        "unknownCheckerNameForValidationRuleInDataType": "Pour la règle de validation <code>{lineValidationRuleKey}</code> du type de données <code>{dataType}</code>, '<code>{checkerName}</code>' est déclaré mais ce n’est pas un contrôle connu. Contrôles connus : {allCheckerNames}",
+        "unknownCheckerNameForValidationRuleInReference": "Pour la règle de validation <code>{lineValidationRuleKey}</code> de la référence <code>{reference}</code>, '<code>{checkerName}</code>' est déclaré mais ce n’est pas un contrôle connu. Contrôles connus : {allCheckerNames}",
+        "unknownCheckerNameForVariableComponent": "Dans la description du type de données {datatype} le composant <code>{component}</code>  de la variable <code>{variable}</code> le vérificateur de valeur <code>{checkerName}</code> est déclaré mais ce n’est pas un contrôle connu<br /> Vérificateurs connues : <code>{knownCheckerNames}</code>",
+        "unknownCheckerNameForVariableComponentCheckerInDataType": "Dans la validation du type de données <code>{dataType}</code> et la règle de validation <code>{validationRuleDescriptionEntryKey}</code>, '<code>{name}</code>' est déclaré mais ce n’est pas un contrôle connu: valeurs possibles <code>{checkerOnTargetNames}</code>.",
+        "unknownCheckerNameForVariableComponentCheckerInReference": "Dans la validation de la référence <code>{reference}</code> et la règle de validation <code>{validationRuleDescriptionEntryKey}</code>, '<code>{name}</code>' est déclaré mais ce n’est pas un contrôle connu: valeurs possibles <code>{checkerOnTargetNames}</code>.",
+        "unknownCheckerNameInReferenceColumn": "Pour le référentiel <code>{referenceToValidate}</code>, le contrôle défini pour la colonne <code>{column}</code> est <code>{checkerName}</code>. Or, ce n'est pas un contrôle connu. Les contrôles connus sont <code>{knownCheckerNames}</code>",
+        "unknownIllegalException": "Erreur inattendue : <code>{cause}</code>",
+        "unknownReferenceForChecker": "Pour le type de données <code>{dataType}</code>, la donnée <code>{datum}</code>, le composant <code>{component}</code>, la référence <code>{refType}</code> n’est pas dans les références acceptées qui sont : <code>{references}</code>",
+        "unknownReferenceForCheckerInDataType": "Pour le type de données <code>{dataType}</code>, la validation <code>{validationKey}</code>, la référence <code>{refType}</code> n’est pas dans les références acceptées qui sont : <code>{references}</code>",
+        "unknownReferenceForCheckerInReference": "Pour la référence <code>{reference}</code>, la validation <code>{validationKey}</code>, la référence <code>{refType}</code> n’est pas dans les références acceptées qui sont : <code>{references}</code>",
+        "unknownReferenceForCheckerInReferenceColumn": "Pour le référentiel <code>{referenceToValidate}</code> et la colonne <code>{column}</code>, le référentiel à utiliser pour le contrôle de valeur est <code>{refType}</code> qui n'est pas connu parmi <code>{knownReferences}</code>",
+        "unknownReferenceInCompositeReference": "La reference composite <code>{compositeReference}</code> contient des références qui ne sont pas déclarées <code>{unknownReferences}</code>. Références connues <code>{references}</code>",
+        "unknownReferenceInDatatypeReferenceDisplay": "Dans la surcharge de l'affichage des référentiels de la description du type de donnée <code>{dataType}</code>, le référentiel <code>{reference}</code> est inconnu . Référentiels connus connues : <code>{references}</code>",
+        "unknownUsedAsVariableComponentUniqueness": "Dans la description du type de données {dataType} dans la section <I>uniqueness</i> les descriptions de variable composants {unknownUsedAsVariableComponentUniqueness} n'existent pas. Valeurs acceptées {availableVariableComponents}",
+        "unknownVariablesInDataGroup": "le groupe de données <code>{dataGroup}</code> contient des données qui ne sont pas déclarées <code>{unknownVariables}</code>. Données connues <code>{variables}</code>",
+        "unrecognizedProperty": "Erreur à la ligne <code>{lineNumber}</code> (colonne <code>{columnNumber}</code>) : <code>{unknownPropertyName}</code>, c’est pas une propriété reconnue. Les propriétés reconnues sont <code>{knownProperties}</code>",
+        "unsupportedVersion": "Les fichiers YAML de version <code>{actualVersion}</code> ne sont pas gérés, version attendue <code>{expectedVersion}</code>",
+        "variableInMultipleDataGroup": "La variable <code>{variable}</code> est déclarée dans plusieurs groupes de données, elle ne doit être présente que dans un groupe"
     },
     "referencesManagement": {
         "actions": "Actions",
diff --git a/ui/src/services/ErrorsService.js b/ui/src/services/ErrorsService.js
index 0c12e7da7d8ede1bbb2660ef98a021f1875776c3..95e2c347f802df31e2ba209e650bf62e8932ea68 100644
--- a/ui/src/services/ErrorsService.js
+++ b/ui/src/services/ErrorsService.js
@@ -2,93 +2,116 @@ import { i18n } from "@/main";
 //prettier-ignore
 
 const ERRORS = {
-  emptyFile: () => i18n.t("errors.emptyFile"),
-  missingReferenceForChecker: (params) => i18n.t("errors.missingReferenceForChecker", params),
-  unknownReferenceForChecker: (params) => i18n.t("errors.unknownReferenceForChecker", params),
-  unsupportedVersion: (params) => i18n.t("errors.unsupportedVersion", params),
-  undeclaredDataGroupForVariable: (params) => i18n.t("errors.undeclaredDataGroupForVariable", params),
-  variableInMultipleDataGroup: (params) => i18n.t("errors.variableInMultipleDataGroup", params),
-  unknownVariablesInDataGroup: (params) => i18n.t("errors.unknownVariablesInDataGroup", params),
-  missingTimeScopeVariableComponentKey: (params) => i18n.t("errors.missingTimeScopeVariableComponentKey", params),
-  timeScopeVariableComponentKeyMissingVariable: (params) => i18n.t("errors.timeScopeVariableComponentKeyMissingVariable", params),
-  timeScopeVariableComponentKeyUnknownVariable: (params) => i18n.t("errors.timeScopeVariableComponentKeyUnknownVariable", params),
-  timeVariableComponentKeyMissingComponent: (params) => i18n.t("errors.timeVariableComponentKeyMissingComponent", params),
-  timeVariableComponentKeyUnknownComponent: (params) => i18n.t("errors.timeVariableComponentKeyUnknownComponent", params),
-  timeScopeVariableComponentWrongChecker: (params) => i18n.t("errors.timeScopeVariableComponentWrongChecker", params),
-  timeScopeVariableComponentPatternUnknown: (params) => i18n.t("errors.timeScopeVariableComponentPatternUnknown", params),
-  unrecognizedProperty: (params) => i18n.t("errors.unrecognizedProperty", params),
-  invalidFormat: (params) => i18n.t("errors.invalidFormat", params),
-  missingRequiredExpression: (params) => i18n.t("errors.missingRequiredExpression", params),
-  illegalGroovyExpression: (params) => i18n.t("errors.illegalGroovyExpression", params),
-  unknownCheckerName: (params) => i18n.t("errors.unknownCheckerName", params),
+  authorizationScopeVariableComponentKeyMissingVariable: (params) => i18n.t("errors.authorizationScopeVariableComponentKeyMissingVariable", params),
+  authorizationScopeVariableComponentKeyUnknownVariable: (params) => i18n.t("errors.authorizationScopeVariableComponentKeyUnknownVariable", params),
+  authorizationScopeVariableComponentReftypeNull: (params) => i18n.t("errors.authorizationScopeVariableComponentReftypeNull", params),
+  authorizationScopeVariableComponentReftypeUnknown: (params) => i18n.t("errors.authorizationScopeVariableComponentReftypeUnknown", params),
+  authorizationScopeVariableComponentWrongChecker: (params) => i18n.t("errors.authorizationScopeVariableComponentWrongChecker", params),
+  authorizationVariableComponentKeyMissingComponent: (params) => i18n.t("errors.authorizationVariableComponentKeyMissingComponent", params),
+  authorizationVariableComponentKeyUnknownComponent: (params) => i18n.t("errors.authorizationVariableComponentKeyUnknownComponent", params),
+  badauthorizationscopeforrepository: (params) => i18n.t("errors.badauthorizationscopeforrepository", params),
+  checkerExpressionReturnedFalse: (params) => i18n.t("errors.checkerExpressionReturnedFalse", params),
   csvBoundToUnknownVariable: (params) => i18n.t("errors.csvBoundToUnknownVariable", params),
   csvBoundToUnknownVariableComponent: (params) => i18n.t("errors.csvBoundToUnknownVariableComponent", params),
-  invalidKeyColumns: (params) => i18n.t("errors.invalidKeyColumns", params),
+  duplicateLineInDatatype: (params) => i18n.t("errors.duplicateLineInDatatype", params),
+  duplicateLineInReference: (params) => i18n.t("errors.duplicateLineInReference", params),
+  duplicatedHeaders: (params) => i18n.t("errors.duplicatedHeaders", params),
+  emptyFile: (params) => i18n.t("errors.emptyFile", params),
+  emptyHeader: (params) => i18n.t("errors.emptyHeader", params),
+  headerColumnPatternNotMatching: (params) => i18n.t("errors.headerColumnPatternNotMatching", params),
+  illegalGroovyExpressionForValidationRuleInDataType: (params) => i18n.t("errors.illegalGroovyExpressionForValidationRuleInDataType", params),
+  illegalGroovyExpressionForValidationRuleInReference: (params) => i18n.t("errors.illegalGroovyExpressionForValidationRuleInReference", params),
+  invalidDate: (params) => i18n.t("errors.invalidDate", params),
+  invalidDateWithColumn: (params) => i18n.t("errors.invalidDateWithColumn", params),
+  invalidDurationForDateCheckerForValidationRuleInDataType: (params) => i18n.t("errors.invalidDurationForDateCheckerForValidationRuleInDataType", params),
+  invalidDurationForDateCheckerForValidationRuleInReference: (params) => i18n.t("errors.invalidDurationForDateCheckerForValidationRuleInReference", params),
+  invalidDurationForReferenceColumnDateChecker: (params) => i18n.t("errors.invalidDurationForReferenceColumnDateChecker", params),
+  invalidDurationForVariableComponentDateChecker: (params) => i18n.t("errors.invalidDurationForVariableComponentDateChecker", params),
+  invalidFloat: (params) => i18n.t("errors.invalidFloat", params),
+  invalidFloatWithColumn: (params) => i18n.t("errors.invalidFloatWithColumn", params),
+  invalidFormat: (params) => i18n.t("errors.invalidFormat", params),
+  invalidHeaders: (params) => i18n.t("errors.invalidHeaders", params),
+  invalidInteger: (params) => i18n.t("errors.invalidInteger", params),
+  invalidIntegerWithColumn: (params) => i18n.t("errors.invalidIntegerWithColumn", params),
   invalidInternationalizedColumns: (params) => i18n.t("errors.invalidInternationalizedColumns", params),
-  unexpectedHeaderColumn : (params) => i18n.t("errors.unexpectedHeaderColumn", params),
-  headerColumnPatternNotMatching :(params) => i18n.t("errors.headerColumnPatternNotMatching", params),
-  unexpectedTokenCount : (params) => i18n.t("errors.unexpectedTokenCount", params),
-  invalidHeaders : (params) => i18n.t("errors.invalidHeaders", params),
-  emptyHeader : (params) => i18n.t("errors.emptyHeader", params),
-  duplicatedHeaders : (params) => i18n.t("errors.duplicatedHeaders", params),
-  patternNotMatched : (params) => i18n.t("errors.patternNotMatched", params),
-  invalidDate : (params) => i18n.t("errors.invalidDate", params),
-  invalidInteger : (params) => i18n.t("errors.invalidInteger", params),
-  invalidFloat : (params) => i18n.t("errors.invalidFloat", params),
-  checkerExpressionReturnedFalse : (params) => i18n.t("errors.checkerExpressionReturnedFalse", params),
-  missingReferenceForCheckerInReference: (params) => i18n.t("errors.missingReferenceForCheckerInReference", params),
-  unknownReferenceForCheckerInReference: (params) => i18n.t("errors.unknownReferenceForCheckerInReference", params),
-  unknownReferenceInCompositereference: (params) => i18n.t("errors.unknownReferenceInCompositereference", params),
-  missingReferenceInCompositereference: (params) => i18n.t("errors.missingReferenceInCompositereference", params),
-  requiredReferenceInCompositeReferenceForParentKeyColumn: (params) => i18n.t("errors.requiredReferenceInCompositeReferenceForParentKeyColumn", params),
-  requiredParentKeyColumnInCompositeReferenceForReference: (params) => i18n.t("errors.requiredParentKeyColumnInCompositeReferenceForReference", params),
-  missingParentColumnForReferenceInCompositeReference: (params) => i18n.t("errors.missingParentColumnForReferenceInCompositeReference", params),
-  missingParentRecursiveKeyColumnForReferenceInCompositeReference: (params) => i18n.t("errors.missingParentRecursiveKeyColumnForReferenceInCompositeReference", params),
-  missingAuthorizationScopeVariableComponentKey: (params) => i18n.t("errors.missingAuthorizationScopeVariableComponentKey", params),
+  invalidInternationalizedColumnsForDataType: (params) => i18n.t("errors.invalidInternationalizedColumnsForDataType", params),
+  invalidKeyColumns: (params) => i18n.t("errors.invalidKeyColumns", params),
+  invalidPatternForDateCheckerForValidationRuleInDataType: (params) => i18n.t("errors.invalidPatternForDateCheckerForValidationRuleInDataType", params),
+  invalidPatternForDateCheckerForValidationRuleInReference: (params) => i18n.t("errors.invalidPatternForDateCheckerForValidationRuleInReference", params),
+  invalidPatternForReferenceColumnDateChecker: (params) => i18n.t("errors.invalidPatternForReferenceColumnDateChecker", params),
+  invalidPatternForReferenceColumnRegularExpressionChecker: (params) => i18n.t("errors.invalidPatternForReferenceColumnRegularExpressionChecker", params),
+  invalidPatternForRegularExpressionCheckerForValidationRuleInDataType: (params) => i18n.t("errors.invalidPatternForRegularExpressionCheckerForValidationRuleInDataType", params),
+  invalidPatternForRegularExpressionCheckerForValidationRuleInReference: (params) => i18n.t("errors.invalidPatternForRegularExpressionCheckerForValidationRuleInReference", params),
+  invalidPatternForVariableComponentDateChecker: (params) => i18n.t("errors.invalidPatternForVariableComponentDateChecker", params),
+  invalidPatternForVariableComponentRegularExpressionChecker: (params) => i18n.t("errors.invalidPatternForVariableComponentRegularExpressionChecker", params),
+  invalidReference: (params) => i18n.t("errors.invalidReference", params),
+  invalidReferenceWithColumn: (params) => i18n.t("errors.invalidReferenceWithColumn", params),
+  missingAggregationComponentForChart: (params) => i18n.t("errors.missingAggregationComponentForChart", params),
+  missingAggregationVariableForChart: (params) => i18n.t("errors.missingAggregationVariableForChart", params),
   missingAuthorizationForDatatype: (params) => i18n.t("errors.missingAuthorizationForDatatype", params),
-  authorizationScopeVariableComponentKeyMissingVariable:  (params) => i18n.t("errors.authorizationScopeVariableComponentKeyMissingVariable", params),
-  authorizationScopeVariableComponentKeyUnknownVariable:  (params) => i18n.t("errors.authorizationScopeVariableComponentKeyUnknownVariable", params),
-  authorizationVariableComponentKeyMissingComponent: (params) => i18n.t("errors.authorizationVariableComponentKeyMissingComponent", params),
-  authorizationVariableComponentKeyUnknownComponent:  (params) => i18n.t("errors.authorizationVariableComponentKeyUnknownComponent", params),
-  authorizationScopeVariableComponentWrongChecker: (params) => i18n.t("errors.authorizationScopeVariableComponentWrongChecker", params),
-  authorizationScopeVariableComponentReftypeUnknown: (params) => i18n.t("errors.authorizationScopeVariableComponentReftypeUnknown", params),
-  authorizationScopeVariableComponentReftypeNull: (params) => i18n.t("errors.authorizationScopeVariableComponentReftypeNull", params),
-  authorizationVariableComponentMustReferToCompositereference: (params) => i18n.t("errors.authorizationVariableComponentMustReferToCompositereference", params),
-  unknownCheckerNameForVariableComponentCheckerInReference: (params) => i18n.t("errors.unknownCheckerNameForVariableComponentCheckerInReference", params),
-  unknownCheckerNameForVariableComponent: (params) => i18n.t("errors.unknownCheckerNameForVariableComponent", params),
+  missingAuthorizationScopeVariableComponentKey: (params) => i18n.t("errors.missingAuthorizationScopeVariableComponentKey", params),
+  missingBoundToForConstantDescription: (params) => i18n.t("errors.missingBoundToForConstantDescription", params),
+  missingColumnNumberOrHeaderNameForConstantDescription: (params) => i18n.t("errors.missingColumnNumberOrHeaderNameForConstantDescription", params),
+  missingColumnReferenceForCheckerInDataType: (params) => i18n.t("errors.missingColumnReferenceForCheckerInDataType", params),
   missingColumnReferenceForCheckerInReference: (params) => i18n.t("errors.missingColumnReferenceForCheckerInReference", params),
-  missingParamColumnReferenceForCheckerInReference: (params) => i18n.t("errors.missingParamColumnReferenceForCheckerInReference", params),
+  missingExportHeaderNameForConstantDescription: (params) => i18n.t("errors.missingExportHeaderNameForConstantDescription", params),
   missingKeyColumnsForReference: (params) => i18n.t("errors.missingKeyColumnsForReference", params),
-  invalidInternationalizedColumnsForDataType: (params) => i18n.t("errors.invalidInternationalizedColumnsForDataType", params),
-  unknownReferenceInDatatypeReferenceDisplay: (params) => i18n.t("errors.unknownReferenceInDatatypeReferenceDisplay", params),
+  missingParamColumnReferenceForCheckerInDataType: (params) => i18n.t("errors.missingParamColumnReferenceForCheckerInDataType", params),
+  missingParamColumnReferenceForCheckerInReference: (params) => i18n.t("errors.missingParamColumnReferenceForCheckerInReference", params),
+  missingParentColumnForReferenceInCompositeReference: (params) => i18n.t("errors.missingParentColumnForReferenceInCompositeReference", params),
+  missingParentLineInRecursiveReference: (params) => i18n.t("errors.missingParentLineInRecursiveReference", params),
+  missingParentRecursiveKeyColumnForReferenceInCompositeReference: (params) => i18n.t("errors.missingParentRecursiveKeyColumnForReferenceInCompositeReference", params),
+  missingReferenceForChecker: (params) => i18n.t("errors.missingReferenceForChecker", params),
+  missingReferenceForCheckerInDataType: (params) => i18n.t("errors.missingReferenceForCheckerInDataType", params),
+  missingReferenceForCheckerInReference: (params) => i18n.t("errors.missingReferenceForCheckerInReference", params),
+  missingReferenceForCheckerInReferenceColumn: (params) => i18n.t("errors.missingReferenceForCheckerInReferenceColumn", params),
+  missingReferenceInCompositereference: (params) => i18n.t("errors.missingReferenceInCompositereference", params),
+  missingRequiredExpressionForValidationRuleInDataType: (params) => i18n.t("errors.missingRequiredExpressionForValidationRuleInDataType", params),
+  missingRequiredExpressionForValidationRuleInReference: (params) => i18n.t("errors.missingRequiredExpressionForValidationRuleInReference", params),
+  missingRowLineForConstantDescription: (params) => i18n.t("errors.missingRowLineForConstantDescription", params),
+  missingStandardDeviationComponentForChart: (params) => i18n.t("errors.missingStandardDeviationComponentForChart", params),
+  missingTimeScopeVariableComponentKey: (params) => i18n.t("errors.missingTimeScopeVariableComponentKey", params),
+  missingUnitComponentForChart: (params) => i18n.t("errors.missingUnitComponentForChart", params),
+  missingValueComponentForChart: (params) => i18n.t("errors.missingValueComponentForChart", params),
+  overlappingpublishedversion: (params) => i18n.t("errors.overlappingpublishedversion", params),
+  patternNotMatched: (params) => i18n.t("errors.patternNotMatched", params),
   patternNotMatchedWithColumn: (params) => i18n.t("errors.patternNotMatchedWithColumn", params),
-  invalidDateWithColumn: (params) => i18n.t("errors.invalidDateWithColumn", params),
-  invalidIntegerWithColumn: (params) => i18n.t("errors.invalidIntegerWithColumn", params),
-  invalidFloatWithColumn: (params) => i18n.t("errors.invalidFloatWithColumn", params),
-  invalidReference: (params) => i18n.t("errors.invalidReference", params),
-  invalidReferenceWithColumn: (params) => i18n.t("errors.invalidReferenceWithColumn", params),
+  requiredParentKeyColumnInCompositeReferenceForReference: (params) => i18n.t("errors.requiredParentKeyColumnInCompositeReferenceForReference", params),
+  requiredReferenceInCompositeReferenceForParentKeyColumn: (params) => i18n.t("errors.requiredReferenceInCompositeReferenceForParentKeyColumn", params),
   requiredValue: (params) => i18n.t("errors.requiredValue", params),
   requiredValueWithColumn: (params) => i18n.t("errors.requiredValueWithColumn", params),
+  sameHeaderLineAndFirstRowLineForConstantDescription: (params) => i18n.t("errors.sameHeaderLineAndFirstRowLineForConstantDescription", params),
+  timeScopeVariableComponentKeyMissingVariable: (params) => i18n.t("errors.timeScopeVariableComponentKeyMissingVariable", params),
+  timeScopeVariableComponentKeyUnknownVariable: (params) => i18n.t("errors.timeScopeVariableComponentKeyUnknownVariable", params),
+  timeScopeVariableComponentPatternUnknown: (params) => i18n.t("errors.timeScopeVariableComponentPatternUnknown", params),
+  timeScopeVariableComponentWrongChecker: (params) => i18n.t("errors.timeScopeVariableComponentWrongChecker", params),
+  timeVariableComponentKeyMissingComponent: (params) => i18n.t("errors.timeVariableComponentKeyMissingComponent", params),
+  timeVariableComponentKeyUnknownComponent: (params) => i18n.t("errors.timeVariableComponentKeyUnknownComponent", params),
   timerangeoutofinterval: (params) => i18n.t("errors.timerangeoutofinterval", params),
-  badauthorizationscopeforrepository: (params) => i18n.t("errors.badauthorizationscopeforrepository", params),
-  overlappingpublishedversion: (params) => i18n.t("errors.overlappingpublishedversion", params),
-  unDeclaredValueForChart: (params) => i18n.t("errors.unDeclaredValueForChart", params),
-  missingValueComponentForChart: (params) => i18n.t("errors.missingValueComponentForChart", params),
-  missingAggregationVariableForChart: (params) => i18n.t("errors.missingAggregationVariableForChart", params),
-  missingAggregationComponentForChart: (params) => i18n.t("errors.missingAggregationComponentForChart", params),
-  missingStandardDeviationComponentForChart: (params) => i18n.t("errors.missingStandardDeviationComponentForChart", params),
-  missingUnitComponentForChart: (params) => i18n.t("errors.missingUnitComponentForChart", params),
-  duplicatedLineInReference: (params) => i18n.t("errors.duplicatedLineInReference", params),
-  duplicatedLineInDatatype: (params) => i18n.t("errors.duplicatedLineInDatatype", params),
-  missingParentLineInRecursiveReference: (params) => i18n.t("errors.missingParentLineInRecursiveReference", params),
-  unknownUsedAsVariableComponentUniqueness: (params) => i18n.t("errors.unknownUsedAsVariableComponentUniqueness", params),
   tooBigRowLineForConstantDescription: (params) => i18n.t("errors.tooBigRowLineForConstantDescription", params),
   tooLittleRowLineForConstantDescription: (params) => i18n.t("errors.tooLittleRowLineForConstantDescription", params),
-  missingRowLineForConstantDescription: (params) => i18n.t("errors.missingRowLineForConstantDescription", params),
-  recordCsvMissingColumnNumberOrHeaderNameForConstantDescription: (params) => i18n.t("errors.recordCsvMissingColumnNumberOrHeaderNameForConstantDescription", params),
-  missingBoundToForConstantDescription: (params) => i18n.t("errors.missingBoundToForConstantDescription", params),
-  missingExportHeaderNameForConstantDescription: (params) => i18n.t("errors.missingExportHeaderNameForConstantDescription", params),
-  sameHeaderLineAndFirstRowLineForConstantDescription: (params) => i18n.t("errors.sameHeaderLineAndFirstRowLineForConstantDescription", params)
+  unDeclaredValueForChart: (params) => i18n.t("errors.unDeclaredValueForChart", params),
+  undeclaredDataGroupForVariable: (params) => i18n.t("errors.undeclaredDataGroupForVariable", params),
+  unexpectedHeaderColumn: (params) => i18n.t("errors.unexpectedHeaderColumn", params),
+  unexpectedTokenCount: (params) => i18n.t("errors.unexpectedTokenCount", params),
+  unknownCheckerNameForValidationRuleInDataType: (params) => i18n.t("errors.unknownCheckerNameForValidationRuleInDataType", params),
+  unknownCheckerNameForValidationRuleInReference: (params) => i18n.t("errors.unknownCheckerNameForValidationRuleInReference", params),
+  unknownCheckerNameForVariableComponent: (params) => i18n.t("errors.unknownCheckerNameForVariableComponent", params),
+  unknownCheckerNameForVariableComponentCheckerInDataType: (params) => i18n.t("errors.unknownCheckerNameForVariableComponentCheckerInDataType", params),
+  unknownCheckerNameForVariableComponentCheckerInReference: (params) => i18n.t("errors.unknownCheckerNameForVariableComponentCheckerInReference", params),
+  unknownCheckerNameInReferenceColumn: (params) => i18n.t("errors.unknownCheckerNameInReferenceColumn", params),
+  unknownIllegalException: (params) => i18n.t("errors.unknownIllegalException", params),
+  unknownReferenceForChecker: (params) => i18n.t("errors.unknownReferenceForChecker", params),
+  unknownReferenceForCheckerInDataType: (params) => i18n.t("errors.unknownReferenceForCheckerInDataType", params),
+  unknownReferenceForCheckerInReference: (params) => i18n.t("errors.unknownReferenceForCheckerInReference", params),
+  unknownReferenceForCheckerInReferenceColumn: (params) => i18n.t("errors.unknownReferenceForCheckerInReferenceColumn", params),
+  unknownReferenceInCompositeReference: (params) => i18n.t("errors.unknownReferenceInCompositeReference", params),
+  unknownReferenceInDatatypeReferenceDisplay: (params) => i18n.t("errors.unknownReferenceInDatatypeReferenceDisplay", params),
+  unknownUsedAsVariableComponentUniqueness: (params) => i18n.t("errors.unknownUsedAsVariableComponentUniqueness", params),
+  unknownVariablesInDataGroup: (params) => i18n.t("errors.unknownVariablesInDataGroup", params),
+  unrecognizedProperty: (params) => i18n.t("errors.unrecognizedProperty", params),
+  unsupportedVersion: (params) => i18n.t("errors.unsupportedVersion", params),
+  variableInMultipleDataGroup: (params) => i18n.t("errors.variableInMultipleDataGroup", params),
 };
 
 export class ErrorsService {