diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 579dec6d07041fa310ff7af72dd8cc91382198fa..22e131ba492ee76c0da98b629cc2f49b229fda99 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -41,7 +41,15 @@ stages:
 maven_build:
   image: maven:3.9.4-amazoncorretto-21
   stage: build
-  script: mvn --batch-mode clean compile
+  script:
+    - mvn --batch-mode clean compile test-compile -DskipTests
+  cache:
+    key: ${CI_COMMIT_REF_SLUG}
+    paths:
+      - .m2/repository/
+  artifacts:
+    paths:
+      - target/
   tags:
     - docker
   rules:
@@ -53,6 +61,8 @@ include:
   # - local: .gitlab_package.yml
   - local: .gitlab_build_doc.yml
     path: .
+  - local: .gitlab_test_mvn.yml
+    path: .
   - local: .gitlab-ci_docker.yml
     path: .
   #- local: .gitlab-ci_sonar.yml
@@ -60,15 +70,3 @@ include:
 # - local: .gitlab_build_doc2.yml
 
 
-maven_test_configuration_build:
-  image: maven:3.9.4-amazoncorretto-21
-  stage: test
-  script: mvn --batch-mode clean test -Ptest_configuration_build
-  tags:
-    - docker
-  artifacts:
-    reports:
-      junit:
-        - target/surefire-reports/TEST-*.xml
-  rules:
-    - if: $CI_JOB_MANUAL!= "true"
diff --git a/.gitlab_test_mvn.yml b/.gitlab_test_mvn.yml
index bec71a4546488478fe51fb59c41b03d237351b93..fd402432e2361a793a1a4e05d944afe0998cedb8 100644
--- a/.gitlab_test_mvn.yml
+++ b/.gitlab_test_mvn.yml
@@ -1,118 +1,71 @@
-maven_test_rest_1:
+.st_test_template: &test_template
   image: maven:3.9.4-amazoncorretto-21
   stage: test
-  script: mvn --batch-mode clean test -Ptest_rest_1
-  tags:
-    - docker
   artifacts:
+    when: always
     reports:
-      junit:
-        - target/surefire-reports/TEST-*.xml
-  rules:
-    - if: $CI_JOB_MANUAL!= "true"
+      junit: target/surefire-reports/*.xml
+    paths:
+      - target/surefire-reports/
+  script:
+    - |
+      # Par défaut, si le job est nommé "test_all" on ne filtre pas (profil all-tests)
+      # Sinon, on retire le préfixe "test_" et on remplace le premier underscore par un point.
+      if [[ "$CI_JOB_NAME" == "test_all" ]]; then
+          export MAVEN_PROFILE=all-tests
+      else
+          export MAVEN_PROFILE=$(echo "$CI_JOB_NAME" | sed -e 's/^test_//' -e 's/_/./')
+      fi
+      echo "Utilisation du profil Maven: $MAVEN_PROFILE"
+    - mvn test -P$MAVEN_PROFILE
 
-maven_test_rest_1_ACBB:
-  image: maven:3.9.4-amazoncorretto-21
-  stage: test
-  script: mvn --batch-mode clean test -Ptest_rest_1_ACBB
-  tags:
-    - docker
-  artifacts:
-    reports:
-      junit:
-        - target/surefire-reports/TEST-*.xml
-  rules:
-    - if: $CI_JOB_MANUAL!= "true"
+test_core_basic:
+  <<: *test_template
 
-maven_test_rest_1_Haute_Frequence:
-  image: maven:3.9.4-amazoncorretto-21
-  stage: test
-  script: mvn --batch-mode clean test -Ptest_rest_1_Haute_Frequence
-  tags:
-    - docker
-  artifacts:
-    reports:
-      junit:
-        - target/surefire-reports/TEST-*.xml
-  rules:
-    - if: $CI_JOB_MANUAL!= "true"
+test_core_config:
+  <<: *test_template
 
-maven_test_rest_2:
-  image: maven:3.9.4-amazoncorretto-21
-  stage: test
-  script: mvn --batch-mode clean test -Ptest_rest_2
-  tags:
-    - docker
-  artifacts:
-    reports:
-      junit:
-        - target/surefire-reports/TEST-*.xml
-  rules:
-    - if: $CI_JOB_MANUAL!= "true"
+test_core_auth:
+  <<: *test_template
 
-maven_test_rest_others:
-  image: maven:3.9.4-amazoncorretto-21
-  stage: test
-  script: mvn --batch-mode clean test -Ptest_rest_others
-  tags:
-    - docker
-  artifacts:
-    reports:
-      junit:
-        - target/surefire-reports/TEST-*.xml
-  rules:
-    - if: $CI_JOB_MANUAL!= "true"
+test_domain_model:
+  <<: *test_template
 
-maven_test_checker:
-  image: maven:3.9.4-amazoncorretto-21
-  stage: test
-  script: mvn --batch-mode clean test -Ptest_checker
-  tags:
-    - docker
-  artifacts:
-    reports:
-      junit:
-        - target/surefire-reports/TEST-*.xml
-  rules:
-    - if: $CI_JOB_MANUAL!= "true"
+test_domain_checker:
+  <<: *test_template
 
-maven_test_model:
-  image: maven:3.9.4-amazoncorretto-21
-  stage: test
-  script: mvn --batch-mode clean test -Ptest_model
-  tags:
-    - docker
-  artifacts:
-    reports:
-      junit:
-        - target/surefire-reports/TEST-*.xml
-  rules:
-    - if: $CI_JOB_MANUAL!= "true"
+test_domain_i18n:
+  <<: *test_template
 
-maven_test_persistence:
-  image: maven:3.9.4-amazoncorretto-21
-  stage: test
-  script: mvn --batch-mode clean test -Ptest_persistence
-  tags:
-    - docker
-  artifacts:
-    reports:
-      junit:
-        - target/surefire-reports/TEST-*.xml
-  rules:
-    - if: $CI_JOB_MANUAL!= "true"
+test_integration_rest:
+  <<: *test_template
 
+test_integration_persistence:
+  <<: *test_template
 
+test_app_monsoere:
+  <<: *test_template
 
-maven_swagger_build:
-  image: maven:3.9.4-amazoncorretto-21
-  stage: test
-  script:
-    - mvn --batch-mode clean test -Pswagger_build
-  tags:
-    - docker
-  artifacts:
-    paths:
-      - documentations/
-  rules:
-    - if: $CI_JOB_MANUAL!= "true"
+test_app_haute_frequence:
+  <<: *test_template
+
+test_app_acbb:
+  <<: *test_template
+
+test_app_olac:
+  <<: *test_template
+
+test_app_foret:
+  <<: *test_template
+
+test_app_pattern:
+  <<: *test_template
+
+test_app_recursivity:
+  <<: *test_template
+
+test_app_teledetection:
+  <<: *test_template
+
+test_no-tags:
+  <<: *test_template
diff --git a/pom.xml b/pom.xml
index e61894860d06009dd0495c6ed6e6c434b840b0f7..721908f22616ec5c7f88a0773fd4abfa02ace313 100644
--- a/pom.xml
+++ b/pom.xml
@@ -88,7 +88,8 @@
         <!--sonar-->
         <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
         <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
-        <sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/site/jacoco.exec</sonar.coverage.jacoco.xmlReportPaths>
+        <sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/site/jacoco.exec
+        </sonar.coverage.jacoco.xmlReportPaths>
         <sonar.language>java</sonar.language>
         <sonar.projectKey>anaee-dev_openadom_backend_caf3d282-990e-4907-8f15-44424cf3c8b0</sonar.projectKey>
         <sonar.projectName>openADOM-backend</sonar.projectName>
@@ -400,6 +401,12 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <!-- Utilisez une version récente pour être certain du support adéquat de JUnit 5 -->
+                <version>3.0.0-M5</version>
+            </plugin>
         </plugins>
     </build>
     <profiles>
@@ -442,224 +449,345 @@
                 </plugins>
             </build>
         </profile>
+        <profile>
+            <id>core.basic</id>
+            <properties>
+                <junit.jupiter.tags>core.basic</junit.jupiter.tags>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
+                        <configuration>
+                            <groups>${junit.jupiter.tags}</groups>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
 
+        <!-- Profil pour les tests tagués "core.config" -->
         <profile>
-            <id>test_checker</id>
+            <id>core.config</id>
+            <properties>
+                <junit.jupiter.tags>core.config</junit.jupiter.tags>
+            </properties>
             <build>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
                         <configuration>
-                            <forkCount>4</forkCount>
-                            <parallel>classesAndMethods</parallel>
-                            <threadCount>4</threadCount>
-                            <perCoreThreadCount>true</perCoreThreadCount>
-                            <parallelTestsTimeoutInSeconds>300</parallelTestsTimeoutInSeconds>
-                            <parallelTestsTimeoutForcedInSeconds>600</parallelTestsTimeoutForcedInSeconds>
-                            <parallelOptimized>true</parallelOptimized>
-
-                            <reuseForks>false</reuseForks>
-                            <testSourceDirectory>src/test</testSourceDirectory>
-                            <testFailureIgnore>false</testFailureIgnore>
-                            <includes>
-                                <include>fr/inra/oresing/checker/**.java</include>
-                            </includes>
+                            <groups>${junit.jupiter.tags}</groups>
                         </configuration>
                     </plugin>
                 </plugins>
             </build>
         </profile>
+
+        <!-- Profil pour les tests tagués "core.auth" -->
         <profile>
-            <id>test_model</id>
+            <id>core.auth</id>
+            <properties>
+                <junit.jupiter.tags>core.auth</junit.jupiter.tags>
+            </properties>
             <build>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
                         <configuration>
-                            <forkCount>4</forkCount>
-                            <reuseForks>false</reuseForks>
-                            <testSourceDirectory>src/test</testSourceDirectory>
-                            <testFailureIgnore>false</testFailureIgnore>
-                            <includes>
-                                <include>fr/inra/oresing/model/**Test.java</include>
-                                <include>fr/inra/oresing/model/**/**Test.java</include>
-                            </includes>
+                            <groups>${junit.jupiter.tags}</groups>
                         </configuration>
                     </plugin>
                 </plugins>
             </build>
         </profile>
+
+        <!-- Profil pour les tests tagués "domain.model" -->
         <profile>
-            <id>test_persistence</id>
+            <id>domain.model</id>
+            <properties>
+                <junit.jupiter.tags>domain.model</junit.jupiter.tags>
+            </properties>
             <build>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
                         <configuration>
-                            <forkCount>4</forkCount>
-                            <reuseForks>false</reuseForks>
-                            <testSourceDirectory>src/test</testSourceDirectory>
-                            <testFailureIgnore>false</testFailureIgnore>
-                            <includes>
-                                <include>fr/inra/oresing/persistence/**Test.java</include>
-                            </includes>
+                            <groups>${junit.jupiter.tags}</groups>
                         </configuration>
                     </plugin>
                 </plugins>
             </build>
         </profile>
+
+        <!-- Profil pour les tests tagués "domain.checker" -->
         <profile>
-            <id>test_rest_1</id>
+            <id>domain.checker</id>
+            <properties>
+                <junit.jupiter.tags>domain.checker</junit.jupiter.tags>
+            </properties>
             <build>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
                         <configuration>
-                            <forkCount>4</forkCount>
-                            <reuseForks>false</reuseForks>
-                            <testSourceDirectory>src/test</testSourceDirectory>
-                            <testFailureIgnore>false</testFailureIgnore>
-                            <includes>
-                                <include>fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java</include>
-                                <include>fr/inra/oresing/rest/Migration.java</include>
-                                <include>fr/inra/oresing/rest/MultiYaml.java</include>
-                                <include>fr/inra/oresing/rest/RelationalService.java</include>
-                                <include>fr/inra/oresing/rest/TestReferencesErrors.java</include>
-                            </includes>
+                            <groups>${junit.jupiter.tags}</groups>
                         </configuration>
                     </plugin>
                 </plugins>
             </build>
         </profile>
+
+        <!-- Profil pour les tests tagués "domain.i18n" -->
         <profile>
-            <id>test_rest_1_Haute_Frequence</id>
+            <id>domain.i18n</id>
+            <properties>
+                <junit.jupiter.tags>domain.i18n</junit.jupiter.tags>
+            </properties>
             <build>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
                         <configuration>
-                            <forkCount>4</forkCount>
-                            <reuseForks>false</reuseForks>
-                            <testSourceDirectory>src/test</testSourceDirectory>
-                            <testFailureIgnore>false</testFailureIgnore>
-                            <groups>HAUTE_FREQUENCE_TEST</groups>
+                            <groups>${junit.jupiter.tags}</groups>
                         </configuration>
                     </plugin>
                 </plugins>
             </build>
         </profile>
+
+        <!-- Profil pour les tests tagués "integration.rest" -->
         <profile>
-            <id>test_rest_1_ACBB</id>
+            <id>integration.rest</id>
+            <properties>
+                <junit.jupiter.tags>integration.rest</junit.jupiter.tags>
+            </properties>
             <build>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
                         <configuration>
-                            <forkCount>4</forkCount>
-                            <reuseForks>false</reuseForks>
-                            <testSourceDirectory>src/test</testSourceDirectory>
-                            <testFailureIgnore>false</testFailureIgnore>
-                            <groups>ACBB_TEST</groups>
+                            <groups>${junit.jupiter.tags}</groups>
                         </configuration>
                     </plugin>
                 </plugins>
             </build>
         </profile>
+
+        <!-- Profil pour les tests tagués "integration.persistence" -->
         <profile>
-            <id>test_rest_2</id>
+            <id>integration.persistence</id>
+            <properties>
+                <junit.jupiter.tags>integration.persistence</junit.jupiter.tags>
+            </properties>
             <build>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
                         <configuration>
-                            <forkCount>4</forkCount>
-                            <reuseForks>false</reuseForks>
-                            <testSourceDirectory>src/test</testSourceDirectory>
-                            <testFailureIgnore>false</testFailureIgnore>
-                            <includes>
-                            </includes>
+                            <groups>${junit.jupiter.tags}</groups>
                         </configuration>
                     </plugin>
                 </plugins>
             </build>
         </profile>
+
+        <!-- Profils pour les tests applicatifs -->
         <profile>
-            <id>swagger_build</id>
+            <id>app.monsoere</id>
+            <properties>
+                <junit.jupiter.tags>app.monsoere</junit.jupiter.tags>
+            </properties>
             <build>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
                         <configuration>
-                            <forkCount>4</forkCount>
-                            <reuseForks>false</reuseForks>
-                            <testSourceDirectory>src/test</testSourceDirectory>
-                            <testFailureIgnore>false</testFailureIgnore>
-                            <groups>SWAGGER_BUILD</groups>
+                            <groups>${junit.jupiter.tags}</groups>
                         </configuration>
                     </plugin>
                 </plugins>
             </build>
         </profile>
+
         <profile>
-            <id>test_rest_others</id>
+            <id>app.haute_frequence</id>
+            <properties>
+                <junit.jupiter.tags>app.haute_frequence</junit.jupiter.tags>
+            </properties>
             <build>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
                         <configuration>
-                            <forkCount>4</forkCount>
-                            <reuseForks>false</reuseForks>
-                            <testSourceDirectory>src/test</testSourceDirectory>
-                            <testFailureIgnore>false</testFailureIgnore>
-                            <groups>OTHERS_TEST</groups>
+                            <groups>${junit.jupiter.tags}</groups>
                         </configuration>
                     </plugin>
                 </plugins>
             </build>
         </profile>
+
         <profile>
-            <id>test_rest_model_request_test</id>
+            <id>app.acbb</id>
+            <properties>
+                <junit.jupiter.tags>app.acbb</junit.jupiter.tags>
+            </properties>
             <build>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
                         <configuration>
-                            <forkCount>4</forkCount>
-                            <reuseForks>false</reuseForks>
-                            <testSourceDirectory>src/test</testSourceDirectory>
-                            <testFailureIgnore>false</testFailureIgnore>
-                            <groups>MODEL_REQUEST_TEST</groups>
+                            <groups>${junit.jupiter.tags}</groups>
                         </configuration>
                     </plugin>
                 </plugins>
             </build>
         </profile>
+
         <profile>
-            <id>test_configuration_build</id>
+            <id>app.olac</id>
+            <properties>
+                <junit.jupiter.tags>app.olac</junit.jupiter.tags>
+            </properties>
             <build>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
                         <configuration>
-                            <includes>
-                                <include>TestConfigurationSuite</include>
-                            </includes>
+                            <groups>${junit.jupiter.tags}</groups>
                         </configuration>
                     </plugin>
                 </plugins>
             </build>
         </profile>
+
+        <profile>
+            <id>app.foret</id>
+            <properties>
+                <junit.jupiter.tags>app.foret</junit.jupiter.tags>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
+                        <configuration>
+                            <groups>${junit.jupiter.tags}</groups>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <profile>
+            <id>app.pattern</id>
+            <properties>
+                <junit.jupiter.tags>app.pattern</junit.jupiter.tags>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
+                        <configuration>
+                            <groups>${junit.jupiter.tags}</groups>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <profile>
+            <id>app.recursivity</id>
+            <properties>
+                <junit.jupiter.tags>app.recursivity</junit.jupiter.tags>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
+                        <configuration>
+                            <groups>${junit.jupiter.tags}</groups>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <profile>
+            <id>app.teledetection</id>
+            <properties>
+                <junit.jupiter.tags>app.teledetection</junit.jupiter.tags>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
+                        <configuration>
+                            <groups>${junit.jupiter.tags}</groups>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>no-tags</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <version>3.0.0-M5</version>
+                        <configuration>
+                            <argLine>-XX:+EnableDynamicAgentLoading</argLine>
+                            <excludedGroups>
+                                SUITE,core.basic,core.config,core.auth,
+                                domain.model,domain.checker,domain.i18n,
+                                integration.rest,integration.persistence,
+                                app.monsoere,app.haute_frequence,app.acbb,
+                                app.olac,app.foret,app.pattern,app.recursivity,app.teledetection
+                            </excludedGroups>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>all-tests</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
     </profiles>
 
 </project>
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/domain/application/Application.java b/src/main/java/fr/inra/oresing/domain/application/Application.java
index a09d0dbb0661640b4941c54f37a2e810c47b6158..5cc8eee73f2a145afb9eac1cca06ebfda5fee4fa 100644
--- a/src/main/java/fr/inra/oresing/domain/application/Application.java
+++ b/src/main/java/fr/inra/oresing/domain/application/Application.java
@@ -187,7 +187,7 @@ public class Application extends OreSiEntity {
                 .filter(Optional::isPresent)
                 .map(Optional::get)
                 .map(Node::depends)
-                .flatMap(List::stream)
+                .flatMap(Set::stream)
                 .collect(Collectors.toSet());
     }
 
diff --git a/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java b/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java
index cf36ccf89ce0efe84eb6bd2c12efe139fcfa646d..954126526d1bc47401ed75733887ed2227f2218a 100644
--- a/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java
+++ b/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java
@@ -1,59 +1,85 @@
 package fr.inra.oresing.domain.application.configuration;
 
+import fr.inra.oresing.domain.exceptions.OreSiTechnicalException;
+import fr.inra.oresing.domain.exceptions.configuration.BadApplicationConfigurationException;
+import fr.inra.oresing.domain.exceptions.configuration.ConfigurationException;
+import lombok.Getter;
 import org.apache.commons.collections4.CollectionUtils;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 public record BuilderNode(
+        int level,
         String nodeName,
         String componentKey,
         String columnToLookUpForRecursive,
         BuilderNode parent,
-        List<String> children,
-        List<String> depends,
+        Set<String> children,
+        Set<String> depends,
         Integer order,
         boolean isRecursive) implements WithDepends {
-    public BuilderNode(final String nodeName, final String componentKey, String columnToLookUpForRecursive, final BuilderNode parent, final List<String> children, final List<String> depends, final Integer order, final boolean isRecursive) {
+    public BuilderNode(final int level, final String nodeName, final String componentKey, String columnToLookUpForRecursive, final BuilderNode parent, final Set<String> children, final Set<String> depends, final Integer order, final boolean isRecursive) {
+        this.level = level;
         this.nodeName = nodeName;
         this.componentKey = componentKey;
         this.columnToLookUpForRecursive = columnToLookUpForRecursive;
         this.parent = parent;
         this.children = children;
-        this.depends = depends.stream().filter(depend->!depend.equals(nodeName)).collect(Collectors.toCollection(ArrayList::new));
+        this.depends = depends.stream().filter(depend -> !depend.equals(nodeName)).collect(Collectors.toCollection(TreeSet::new));
         this.order = order;
         this.isRecursive = isRecursive;
     }
 
     public static List<BuilderNode> getNodeLeaves(final Collection<BuilderNode> builderNodes) {
         return builderNodes.stream()
-                .filter(node -> node.parent() != null || node.depends().isEmpty() )
+                .filter(node -> node.parent() != null || node.depends().isEmpty())
                 .filter(node -> CollectionUtils.isEmpty(node.children()))
                 .toList();
     }
 
     public BuilderNode withAllDepends(final Collection<? extends WithDepends> nodes) {
-        final List<String> depends = depends();
+        final Set<String> depends = new HashSet<>(depends());
+        int level = 0;
+
         if (CollectionUtils.isEmpty(depends)) {
             return this;
         }
-        List<String> childDepends = depends();
+
+        Set<String> processedDependencies = new HashSet<>(depends);
+        List<String> childDepends = new ArrayList<>(depends);
         while (CollectionUtils.isNotEmpty(childDepends)) {
-            childDepends = childDepends.stream()
-                    .map(name -> nodes.stream().filter(node -> node.nodeName().equals(name)).findFirst().orElse(null)).filter(Objects::nonNull)
+            level++;
+
+            List<String> newChildDepends = childDepends.stream()
+                    .map(name -> nodes.stream()
+                            .filter(node -> node.nodeName().equals(name))
+                            .findFirst()
+                            .orElse(null))
+                    .filter(Objects::nonNull)
                     .map(WithDepends::depends)
-                    .flatMap(List::stream)
+                    .flatMap(Set::stream)
+                    .filter(dep -> !processedDependencies.contains(dep)) // Éviter les cycles
                     .toList();
-            depends.addAll(childDepends);
+
+            if (newChildDepends.contains(nodeName())) {
+                throw new BadApplicationConfigurationException(
+                        nodeName(), ConfigurationException.CYCLIC_DEPENDANCIES
+                );
+            }
+            depends.addAll(newChildDepends);
+            processedDependencies.addAll(newChildDepends);
+            childDepends = newChildDepends;
         }
-        return new BuilderNode(nodeName(), componentKey(), columnToLookUpForRecursive(), parent(), children(), depends, order(), isRecursive);
+
+
+        return new BuilderNode(level, nodeName(), componentKey(), columnToLookUpForRecursive(), parent(), children(), depends, order(), isRecursive);
     }
 
+
     public BuilderNode withComponentKeyAndRecursive(final String componentKey) {
         return new BuilderNode(
+                level(),
                 nodeName(),
                 componentKey,
                 componentKey,
@@ -67,8 +93,9 @@ public record BuilderNode(
 
     public BuilderNode withComponentKeyAndNotRecursive(final String componentKey, Boolean isParent) {
         return new BuilderNode(
+                level(),
                 nodeName(),
-                isParent?componentKey:componentKey(),
+                isParent ? componentKey : componentKey(),
                 columnToLookUpForRecursive(),
                 parent(),
                 children(),
@@ -80,6 +107,7 @@ public record BuilderNode(
 
     public BuilderNode withComponentKey(String componentKey) {
         return new BuilderNode(
+                level(),
                 nodeName(),
                 componentKey,
                 columnToLookUpForRecursive(),
diff --git a/src/main/java/fr/inra/oresing/domain/application/configuration/Node.java b/src/main/java/fr/inra/oresing/domain/application/configuration/Node.java
index bbfbb1a7a1e613870200aa5ea55c7c54f1553282..7660a3d08370ae39151c51a0c11fdf4525831b9e 100644
--- a/src/main/java/fr/inra/oresing/domain/application/configuration/Node.java
+++ b/src/main/java/fr/inra/oresing/domain/application/configuration/Node.java
@@ -5,15 +5,21 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 
 public record Node(
+        Integer level,
         String nodeName,
         String componentKey,
         String columnToLookUpForRecursive,
         String parent,
         SortedSet<Node> children,
-        List<String> depends,
+        Set<String> depends,
         Integer order,
         boolean isRecursive
 ) implements Comparable<Node> {
+    public Node {
+        if(level==null){
+            level = 0;
+        }
+    }
 
     public static SortedSet<Node> buildNode(final Collection<BuilderNode> nodes, final Validation validation) {
         record Builder(Collection<BuilderNode> fromNodes, Set<Node> buildedNodes, Set<Node> currentParentsNodes,
@@ -24,6 +30,7 @@ public record Node(
                         .collect(Collectors.toMap(BuilderNode::nodeName, Function.identity()));
                 final Set<Node> buildedNodes = BuilderNode.getNodeLeaves(nodesWithAllDepends.values()).stream()
                         .map(node -> new Node(
+                                node.level(),
                                 node.nodeName(),
                                 node.componentKey(),
                                 node.columnToLookUpForRecursive(),
@@ -41,6 +48,7 @@ public record Node(
                         );
                 return buildNodesRecursively(buildedNodes, notBuildedNodes.values());
             }
+
             private static SortedSet<Node> buildNodesRecursively(Set<Node> buildedNodes, Collection<BuilderNode> notBuildedNodes) {
                 Map<Boolean, List<Node>> nodesByNoParent = buildedNodes.stream()
                         .collect(Collectors.partitioningBy(Node::isRoot));
@@ -48,6 +56,7 @@ public record Node(
                 Map<String, List<Node>> nodeWithParent = nodesByNoParent.get(false).stream()
                         .collect(Collectors.groupingBy(Node::parent));
                 Function<BuilderNode, Node> findNode = node -> new Node(
+                        node.level(),
                         node.nodeName(),
                         node.componentKey(),
                         node.columnToLookUpForRecursive(),
@@ -67,7 +76,7 @@ public record Node(
                                 .filter(node -> node.nodeName().equals(parentName))
                                 .findFirst()
                                 .orElse(null);
-                        if(parent ==null) {
+                        if (parent == null) {
                             parent = notBuildedNodes.stream()
                                     .filter(node -> node.nodeName().equals(parentName))
                                     .map(findNode)
@@ -89,20 +98,21 @@ public record Node(
 
                     }
                     nodesByNoParent = parentNodes.stream()
-                        .collect(Collectors.partitioningBy(Node::isRoot));
+                            .collect(Collectors.partitioningBy(Node::isRoot));
 
                     nodeWithParent = nodesByNoParent.get(false).stream()
                             .collect(Collectors.groupingBy(Node::parent));
                 }
                 notBuildedNodes.stream()
-                                .map(findNode)
-                                        .forEach(rootNodes::add);
+                        .map(findNode)
+                        .forEach(rootNodes::add);
                 return rootNodes;
             }
 
             private Node findNode(final String nodeName) {
                 return buildedNodes().stream().filter(node -> node.nodeName().equals(nodeName)).findFirst().orElse(null);
             }
+
             private Node findOrCreateNode(final String childNodeName) {
                 final Node childNode = findNode(childNodeName);
                 if (childNode != null) {
@@ -113,6 +123,7 @@ public record Node(
                         .findFirst()
                         .orElseThrow(() -> new IllegalArgumentException("pas ici"));
                 return new Node(
+                        builderNode.level(),
                         builderNode.nodeName(),
                         builderNode.componentKey(),
                         builderNode.columnToLookUpForRecursive(),
@@ -130,11 +141,11 @@ public record Node(
     }
 
 
-
     private boolean isRoot() {
         return Optional.ofNullable(parent()).map(String::isEmpty).orElse(true);
     }
-    private List<String> dependsRecursively(){
+
+    private List<String> dependsRecursively() {
         Set<String> result = new HashSet<>(depends());
         children().forEach(child -> result.addAll(child.dependsRecursively()));
         return new ArrayList<>(result);
@@ -145,17 +156,18 @@ public record Node(
         if (o == null) {
             return 1;
         }
-        if (o.dependsRecursively().contains(nodeName()) ) {
-            return -o.dependsRecursively().size();
-        }
-        if (dependsRecursively().contains(o.nodeName())) {
-            return dependsRecursively().size();
+        int compareLevel = level().compareTo(o.level());
+        if (compareLevel != 0) {
+            return compareLevel;
         }
+
+        if (depends().contains(o.nodeName())) return 1;
+        if (o.depends().contains(nodeName())) return -1;
         int compareOrder = Optional.ofNullable(order()).orElse(9999).compareTo(Optional.ofNullable(o.order()).orElse(9999));
-        if(compareOrder == 0){
-            return nodeName().compareTo(o.nodeName());
+        if (compareOrder != 0) {
+            return compareOrder;
         }
-        return compareOrder;
+        return nodeName().compareTo(o.nodeName());
     }
 
     public Node findNode(final String refType) {
diff --git a/src/main/java/fr/inra/oresing/domain/application/configuration/WithDepends.java b/src/main/java/fr/inra/oresing/domain/application/configuration/WithDepends.java
index da6abab36efa0617e21d2d7a6a72dcd244f41fc4..1f3ab80fc65c27c9f0491a4df9334c1d12b8d10a 100644
--- a/src/main/java/fr/inra/oresing/domain/application/configuration/WithDepends.java
+++ b/src/main/java/fr/inra/oresing/domain/application/configuration/WithDepends.java
@@ -1,9 +1,9 @@
 package fr.inra.oresing.domain.application.configuration;
 
 import java.util.List;
+import java.util.Set;
 
 interface WithDepends {
-    List<String> depends();
-
+    Set<String> depends();
     String nodeName();
 }
diff --git a/src/main/java/fr/inra/oresing/domain/exceptions/configuration/BadApplicationConfigurationException.java b/src/main/java/fr/inra/oresing/domain/exceptions/configuration/BadApplicationConfigurationException.java
index 4279f32b2117e90ed558ce9a66a900490a3947b0..4959a36d294291506d779384b0300b8b8dbb321b 100644
--- a/src/main/java/fr/inra/oresing/domain/exceptions/configuration/BadApplicationConfigurationException.java
+++ b/src/main/java/fr/inra/oresing/domain/exceptions/configuration/BadApplicationConfigurationException.java
@@ -8,7 +8,7 @@ public class BadApplicationConfigurationException extends OreSiTechnicalExceptio
 
     private final ConfigurationException configurationException;
 
-    private BadApplicationConfigurationException(final String message, final ConfigurationException configurationException) {
+    public BadApplicationConfigurationException(final String message, final ConfigurationException configurationException) {
         super(message);
         this.configurationException = configurationException;
     }
diff --git a/src/main/java/fr/inra/oresing/domain/exceptions/configuration/ConfigurationException.java b/src/main/java/fr/inra/oresing/domain/exceptions/configuration/ConfigurationException.java
index a664cabc60015aeaa3c6dcceb6c7102ccc3edb8b..568b8a5ba0aa533bec482b01e6bc68a447557817 100644
--- a/src/main/java/fr/inra/oresing/domain/exceptions/configuration/ConfigurationException.java
+++ b/src/main/java/fr/inra/oresing/domain/exceptions/configuration/ConfigurationException.java
@@ -180,6 +180,7 @@ public enum ConfigurationException {
     UNSUPPORTED_NAME_APPLICATION,
     MISSING_NAME_APPLICATION,
     UNSUPPORTED_VERSION_APPLICATION,
+    CYCLIC_DEPENDANCIES,
     MISSING_VERSION_APPLICATION,
     UNSUPPORTED_OPENADOM_VERSION,
     EXISTING_OPENADOM_VERSION,
diff --git a/src/main/java/fr/inra/oresing/rest/model/configuration/builder/HierarchicalDependancesBuilder.java b/src/main/java/fr/inra/oresing/rest/model/configuration/builder/HierarchicalDependancesBuilder.java
index 196790bffeb13b432c0a31318ae7dba52ebf4450..a99f0bf5d905044cf4ae898061c53d3bfcaca8d2 100644
--- a/src/main/java/fr/inra/oresing/rest/model/configuration/builder/HierarchicalDependancesBuilder.java
+++ b/src/main/java/fr/inra/oresing/rest/model/configuration/builder/HierarchicalDependancesBuilder.java
@@ -7,6 +7,7 @@ import fr.inra.oresing.domain.application.configuration.checker.ReferenceChecker
 import java.util.*;
 import java.util.function.Consumer;
 import java.util.function.Function;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 public record HierarchicalDependancesBuilder(
@@ -64,16 +65,16 @@ public record HierarchicalDependancesBuilder(
                         if (dataName.equals(refType)) {
                             Objects.requireNonNull(nodes.put(refType, nodes.containsKey(refType) ?
                                     nodes.get(refType).withComponentKeyAndRecursive(componentKey) :
-                                    new BuilderNode(refType, componentKey, componentKey, null, new LinkedList<>(), new LinkedList<>(), orderTags.get(refType), isRecursive)
+                                    new BuilderNode(0,refType, componentKey, componentKey, null, new TreeSet<>(), new TreeSet<>(), orderTags.get(refType), isRecursive)
                             )).withComponentKeyAndRecursive(componentKey);
                         } else {
                             ParentChildRelation relation = new ParentChildRelation(
-                                    nodes.containsKey(refType)?
-                                      nodes.get(refType):
-                                      new BuilderNode(refType, componentKey, null, null, new LinkedList<>(), new LinkedList<>(), orderTags.get(refType), isRecursive).withComponentKeyAndNotRecursive(componentKey, isParent),
-                                    nodes.containsKey(dataName)?
-                                            nodes.get(dataName).withComponentKey(componentKey):
-                                            new BuilderNode(dataName, componentKey, null,null, new LinkedList<>(), new LinkedList<>(), orderTags.get(dataName), isRecursive),
+                                    nodes.containsKey(refType) ?
+                                            nodes.get(refType) :
+                                            new BuilderNode(0, refType, componentKey, null, null, new TreeSet<>(), new TreeSet<>(), orderTags.get(refType), isRecursive).withComponentKeyAndNotRecursive(componentKey, isParent),
+                                    nodes.containsKey(dataName) ?
+                                            nodes.get(dataName).withComponentKey(componentKey) :
+                                            new BuilderNode(0, dataName, componentKey, null, null, new TreeSet<>(), new TreeSet<>(), orderTags.get(dataName), isRecursive),
                                     orderTags.get(dataName)
                             );
                             if (isParent) {
@@ -84,18 +85,50 @@ public record HierarchicalDependancesBuilder(
                         }
                     });
         }
+        //addRecursivlyDepends(nodes.values());
         return Node.buildNode(
                 nodes.values(),
                 new Validation(buildErrorWithValidationParams, null, Map.of("domainTags", domainTags)));
     }
 
+    protected static void addRecursivlyDepends(Collection<BuilderNode> nodes) {
+        Map<String, BuilderNode> nodeMap = nodes.stream()
+                .collect(Collectors.toMap(BuilderNode::nodeName, node -> node));
+        Map<String, Set<String>> dependsByNodeNames = new HashMap<>();
+        for (String nodeName : nodeMap.keySet()) {
+            collectDependencies(nodeName, nodeMap, dependsByNodeNames);
+        }
+        nodes.stream()
+                .forEach(node -> {
+                    node.depends().clear();
+                    String nodeName = node.nodeName();
+                    dependsByNodeNames.get(nodeName).stream()
+                            .filter(Predicate.not(nodeName::equals))
+                            .forEach(node.depends()::add);
+                });
+    }
+
+    private static void collectDependencies(String nodeName, Map<String, BuilderNode> nodeMap, Map<String, Set<String>> dependsByNodeNames) {
+        BuilderNode node = nodeMap.get(nodeName);
+        if (node == null) return;
+        dependsByNodeNames.putIfAbsent(nodeName, new HashSet<>());
+        Set<String> dependencies = dependsByNodeNames.get(nodeName);
+        dependencies.addAll(node.depends());
+        for (String childName : node.children()) {
+            if (!dependsByNodeNames.containsKey(childName)) {
+                collectDependencies(childName, nodeMap, dependsByNodeNames);
+            }
+            dependencies.addAll(dependsByNodeNames.get(childName));
+        }
+    }
+
     public SortedSet<Node> build(Consumer<ValidationParams> buildErrorWithValidationParams) {
         return buildHierchicalDependances(
                 buildErrorWithValidationParams,
                 checkerdescriptions,
                 orders,
                 data.keySet().stream()
-                        .map(name -> new BuilderNode(name, null, null, null,  new LinkedList<>(), new LinkedList<>(), orders.get(name), false))
+                        .map(name -> new BuilderNode(0, name, null, null, null, new TreeSet<>(), new TreeSet<>(), orders.get(name), false))
                         .collect(Collectors.toMap(BuilderNode::nodeName, Function.identity())),
                 domainTags
         );
diff --git a/src/main/java/fr/inra/oresing/rest/model/configuration/builder/ParentChildRelation.java b/src/main/java/fr/inra/oresing/rest/model/configuration/builder/ParentChildRelation.java
index 4afc4017a34aee3a6a82ce93ac2abebc58ec220b..2540b0ef50e46568ca9de7a146dbf5f433160a47 100644
--- a/src/main/java/fr/inra/oresing/rest/model/configuration/builder/ParentChildRelation.java
+++ b/src/main/java/fr/inra/oresing/rest/model/configuration/builder/ParentChildRelation.java
@@ -1,16 +1,16 @@
 package fr.inra.oresing.rest.model.configuration.builder;
 
 import fr.inra.oresing.domain.application.configuration.BuilderNode;
+import groovyjarjarantlr4.runtime.tree.Tree;
 import org.apache.commons.collections4.CollectionUtils;
 
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 
 record ParentChildRelation(BuilderNode parent, BuilderNode child,
                            Integer order) {
     ParentChildRelation(final BuilderNode parent, final BuilderNode child, final Integer order) {
         final BuilderNode parentNode = new BuilderNode(
+                parent.level(),
                 parent.nodeName(),
                 parent.componentKey(),
                 parent.columnToLookUpForRecursive(),
@@ -20,6 +20,7 @@ record ParentChildRelation(BuilderNode parent, BuilderNode child,
                 parent.order(),
                 parent.isRecursive());
         final BuilderNode childNode = new BuilderNode(
+                child.level(),
                 child.nodeName(),
                 child.componentKey(),
                 child.columnToLookUpForRecursive(),
@@ -33,30 +34,27 @@ record ParentChildRelation(BuilderNode parent, BuilderNode child,
         this.order = Optional.ofNullable(order).orElse(child.order());
     }
 
-    private static List<String> addDependance(final BuilderNode child, final BuilderNode parent) {
-        final List<String> dependances = new LinkedList<>();
+    private static Set<String> addDependance(final BuilderNode child, final BuilderNode parent) {
+        final Set<String> dependances = new TreeSet<>();
         if (CollectionUtils.isNotEmpty(child.depends())) {
             dependances.addAll(child.depends());
         }
-        if (!dependances.contains(parent.nodeName())) {
-            dependances.add(parent.nodeName());
-        }
+        dependances.add(parent.nodeName());
         return dependances;
     }
 
-    private static List<String> addChildren(final BuilderNode child, final BuilderNode parent) {
-        final List<String> children = new LinkedList<>();
+    private static Set<String> addChildren(final BuilderNode child, final BuilderNode parent) {
+        final Set<String> children = new TreeSet<>();
         if (CollectionUtils.isNotEmpty(parent.children())) {
             children.addAll(parent.children());
         }
-        if (!children.contains(child.nodeName())) {
-            children.add(child.nodeName());
-        }
+        children.add(child.nodeName());
         return children;
     }
 
     ParentChildRelation setParent() {
         final BuilderNode parentNode = new BuilderNode(
+                parent().level(),
                 parent().nodeName(),
                 parent().componentKey(),
                 parent().columnToLookUpForRecursive(),
@@ -66,6 +64,7 @@ record ParentChildRelation(BuilderNode parent, BuilderNode child,
                 parent().order(),
                 parent().isRecursive());
         final BuilderNode childNode = new BuilderNode(
+                child().level(),
                 child().nodeName(),
                 child().componentKey(),
                 child.columnToLookUpForRecursive(),
diff --git a/src/main/java/fr/inra/oresing/rest/model/configuration/builder/RootBuilder.java b/src/main/java/fr/inra/oresing/rest/model/configuration/builder/RootBuilder.java
index 5fa9cedf9a86a3e8fedb057bcf845bd879005edb..c2309f1463eb8c9323e529be53be3e0a15f04127 100644
--- a/src/main/java/fr/inra/oresing/rest/model/configuration/builder/RootBuilder.java
+++ b/src/main/java/fr/inra/oresing/rest/model/configuration/builder/RootBuilder.java
@@ -12,6 +12,7 @@ import fr.inra.oresing.domain.application.configuration.internationalization.Int
 import fr.inra.oresing.domain.application.configuration.internationalization.Internationalizations;
 import fr.inra.oresing.domain.application.configuration.type.RootType;
 import fr.inra.oresing.domain.exceptions.SiOreIllegalArgumentException;
+import fr.inra.oresing.domain.exceptions.configuration.BadApplicationConfigurationException;
 import fr.inra.oresing.domain.exceptions.configuration.ConfigurationException;
 import fr.inra.oresing.rest.reactive.ReactiveProgression;
 import lombok.Getter;
@@ -133,13 +134,20 @@ public class RootBuilder {
         i18n = rightRequest.i18n();
         final Parsing<Map<String, AdditionalFileDescription>> aditionnalFiles = additionalFilesBuilder.buildAdditionalFiles(rootNode.findPath(OA_ADDITIONAL_FILES), i18n);
         i18n = aditionnalFiles.i18n();
-
-        final SortedSet<Node> hierarchicalNodes = HierarchicalDependancesBuilder.of(
-                        checkers,
-                        data.result(),
-                        domainTags
-                )
-                .build(buildErrorWithValidationParams);
+        SortedSet<Node> hierarchicalNodes = new TreeSet<>();
+        try {
+            hierarchicalNodes = HierarchicalDependancesBuilder.of(
+                            checkers,
+                            data.result(),
+                            domainTags
+                    )
+                    .build(buildErrorWithValidationParams);
+        } catch (BadApplicationConfigurationException badApplicationConfigurationException) {
+            buildError(
+                    badApplicationConfigurationException.getConfigurationException(),
+                    Map.of("nodeName", badApplicationConfigurationException.getMessage()),
+                    OA_DATA);
+        }
         final Internationalizations internationalizations = mapper
                 .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
                 .convertValue(
diff --git a/src/test/java/TestConfigurationSuite.java b/src/test/java/TestConfigurationSuite.java
deleted file mode 100644
index 43754ee420f17d08036b1735c660b18df20624dc..0000000000000000000000000000000000000000
--- a/src/test/java/TestConfigurationSuite.java
+++ /dev/null
@@ -1,10 +0,0 @@
-import org.junit.jupiter.api.Tag;
-import org.junit.platform.suite.api.*;
-
-@Suite
-@SelectPackages("fr.inra.oresing")
-@SuiteDisplayName("Tests for BrokenAdom")
-@Tag("MODEL_REQUEST_TEST")
-@IncludeTags({"UPLOAD_BUNDLE", "SUITE"})
-public class TestConfigurationSuite {
-}
diff --git a/src/test/java/fr/inra/oresing/ApplicationTest.java b/src/test/java/fr/inra/oresing/ApplicationTest.java
index f5f2ec4ba112cf8fb6d5994ff39cb941f03bc236..c7398cf621c7c4a4a7093be5719c6867493af51d 100644
--- a/src/test/java/fr/inra/oresing/ApplicationTest.java
+++ b/src/test/java/fr/inra/oresing/ApplicationTest.java
@@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test;
 
 import java.util.UUID;
 
-@org.junit.jupiter.api.Tag("SUITE")
+@org.junit.jupiter.api.Tag("core.basic")
 public class ApplicationTest {
     @Test
     public void test() {
diff --git a/src/test/java/fr/inra/oresing/domain/LocalDateTimeRangeTest.java b/src/test/java/fr/inra/oresing/domain/LocalDateTimeRangeTest.java
index d649aff31f15570b67ec06161d5caf09cb2b281d..964b7a6b688c266077158401119752bb4d9fdaee 100644
--- a/src/test/java/fr/inra/oresing/domain/LocalDateTimeRangeTest.java
+++ b/src/test/java/fr/inra/oresing/domain/LocalDateTimeRangeTest.java
@@ -10,7 +10,7 @@ import org.junit.jupiter.api.Test;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.TemporalAccessor;
 
-@org.junit.jupiter.api.Tag("SUITE")
+@org.junit.jupiter.api.Tag("domain.model")
 public class LocalDateTimeRangeTest {
 
     /*@Test
diff --git a/src/test/java/fr/inra/oresing/domain/application/BrokenConfigurationTest.java b/src/test/java/fr/inra/oresing/domain/application/BrokenConfigurationTest.java
index de3f49362842f0fa3897994a7b58ede22fe23312..a2775708d7d146f3e3a3052fd955e2041444417c 100644
--- a/src/test/java/fr/inra/oresing/domain/application/BrokenConfigurationTest.java
+++ b/src/test/java/fr/inra/oresing/domain/application/BrokenConfigurationTest.java
@@ -8,7 +8,8 @@ import java.util.List;
 import java.util.Optional;
 
 import static org.junit.jupiter.api.Assertions.*;
-@org.junit.jupiter.api.Tag("SUITE")
+
+@org.junit.jupiter.api.Tag("core.config")
 
 class ConfigurationTest {
 
diff --git a/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java b/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java
index d500f50ce6ef7cb8fc59e30dbf93638f85df7e0c..0f765ff354abc6f91211f69e49b38b737e5fceab 100644
--- a/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java
+++ b/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java
@@ -12,7 +12,7 @@ import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
-@org.junit.jupiter.api.Tag("SUITE")
+@org.junit.jupiter.api.Tag("core.config")
 class BuilderNodeTest {
     final Map<String, BuilderNode> builderNodes = Arrays.stream(new JsonRowMapper<BuilderNode>().readValue("""
             [
@@ -150,12 +150,12 @@ class BuilderNodeTest {
     public void TestBuildAllDepends() {
         final List<BuilderNode> withAllDepends = builderNodes.values().stream().map(node -> node.withAllDepends(builderNodes.values())).toList();
         Assertions.assertArrayEquals(
-                List.of("sites", "especes", "valeurs_qualitative", "unites", "type_de_sites", "variables").toArray(),
+                List.of("especes", "sites", "type_de_sites", "unites", "valeurs_qualitative", "variables").toArray(),
                 withAllDepends.stream()
                         .filter(n -> "pem".equals(n.nodeName()))
                         .findFirst()
                         .map(BuilderNode::depends)
-                        .orElse(List.of()).toArray()
+                        .orElse(Set.of()).toArray()
         );
         Assertions.assertArrayEquals(
                 List.of("projet", "sites", "themes", "type_de_sites").toArray(),
@@ -163,7 +163,7 @@ class BuilderNodeTest {
                         .filter(n -> "site_theme_datatype".equals(n.nodeName()))
                         .findFirst()
                         .map(BuilderNode::depends)
-                        .orElse(List.of()).toArray()
+                        .orElse(Set.of()).toArray()
         );
     }
 
@@ -182,15 +182,15 @@ class BuilderNodeTest {
                         projet
                         themes
                         type_de_sites
-                        site_theme_datatype
                         unites
                         variables
-                        variables_et_unites_par_types_de_donnees
-                        especes
                         valeurs_qualitative
                         valeurs_qualitatives
-                        pem
-                        type_de_fichiers""",
+                        type_de_fichiers
+                        variables_et_unites_par_types_de_donnees
+                        especes
+                        site_theme_datatype
+                        pem""",
                 orderedNodes.stream().map(Node::nodeName).collect(Collectors.joining("\n"))
         );
     }
diff --git a/src/test/java/fr/inra/oresing/domain/application/configuration/BuilderNodeTest.java b/src/test/java/fr/inra/oresing/domain/application/configuration/BuilderNodeTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..cba204e9449ccbc93892282ec0235ef4cb7e7fb1
--- /dev/null
+++ b/src/test/java/fr/inra/oresing/domain/application/configuration/BuilderNodeTest.java
@@ -0,0 +1,70 @@
+package fr.inra.oresing.domain.application.configuration;
+
+import fr.inra.oresing.domain.exceptions.configuration.BadApplicationConfigurationException;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+class BuilderNodeTest {
+
+    @Test
+    void withAllDepends_shouldAddTransitiveDependencies() {
+        // Arrange
+        // Créer un nœud A qui dépend de B
+        BuilderNode nodeA = new BuilderNode(0, "A", null, null, null, Set.of(), Set.of("B"), null, false);
+
+        // Créer un nœud B qui dépend de C
+        WithDepends nodeB = mock(WithDepends.class);
+        when(nodeB.nodeName()).thenReturn("B");
+        when(nodeB.depends()).thenReturn(Set.of("C"));
+
+        // Créer un nœud C qui ne dépend de rien
+        WithDepends nodeC = mock(WithDepends.class);
+        when(nodeC.nodeName()).thenReturn("C");
+        when(nodeC.depends()).thenReturn(Set.of());
+
+        Collection<WithDepends> allNodes = List.of(nodeB, nodeC);
+
+        // Act
+        BuilderNode result = nodeA.withAllDepends(allNodes);
+
+        // Assert
+        assertEquals(2, result.level()); // Le niveau devrait être 1 car il y a une dépendance transitive
+        assertTrue(result.depends().contains("B")); // Dépendance directe
+        assertTrue(result.depends().contains("C")); // Dépendance transitive
+        assertEquals(2, result.depends().size()); // Total des dépendances
+    }
+
+    @Test
+    void withAllDepends_shouldThrowExceptionOnCyclicDependency() {
+        // Arrange
+        // Créer un nœud A qui dépend de B
+        BuilderNode nodeA = new BuilderNode(0, "A", null, null, null, Set.of(), Set.of("B"), null, false);
+
+        // Créer un nœud B qui dépend de C
+        WithDepends nodeB = mock(WithDepends.class);
+        when(nodeB.nodeName()).thenReturn("B");
+        when(nodeB.depends()).thenReturn(Set.of("C"));
+
+        // Créer un nœud C qui dépend de A (créant un cycle)
+        WithDepends nodeC = mock(WithDepends.class);
+        when(nodeC.nodeName()).thenReturn("C");
+        when(nodeC.depends()).thenReturn(Set.of("A"));
+
+        Collection<WithDepends> allNodes = List.of(nodeB, nodeC);
+
+        // Act & Assert
+        assertThrows(BadApplicationConfigurationException.class, () -> {
+            nodeA.withAllDepends(allNodes);
+        });
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/fr/inra/oresing/domain/application/configuration/ConfigurationTest.java b/src/test/java/fr/inra/oresing/domain/application/configuration/ConfigurationTest.java
index 6ba94dcc68f41c50a961d8c64c5e33af913f3103..82fb90cbce04b332951cd051c1a63f298db52a5b 100644
--- a/src/test/java/fr/inra/oresing/domain/application/configuration/ConfigurationTest.java
+++ b/src/test/java/fr/inra/oresing/domain/application/configuration/ConfigurationTest.java
@@ -12,7 +12,7 @@ import org.mockito.Mockito;
 
 import java.util.*;
 
-@org.junit.jupiter.api.Tag("SUITE")
+@org.junit.jupiter.api.Tag("core.config")
 class ConfigurationTest {
 
     public static final JsonRowMapper MAPPER = new JsonRowMapper<ComponentDescription>();
diff --git a/src/test/java/fr/inra/oresing/domain/application/configuration/LtreeTest.java b/src/test/java/fr/inra/oresing/domain/application/configuration/LtreeTest.java
index 80e5897677b8a8cf58d982fb2e2e7615df90e4a9..1de2049bd18aaf71c9586e812084751dd975ac46 100644
--- a/src/test/java/fr/inra/oresing/domain/application/configuration/LtreeTest.java
+++ b/src/test/java/fr/inra/oresing/domain/application/configuration/LtreeTest.java
@@ -7,7 +7,7 @@ import org.junit.jupiter.params.provider.ValueSource;
 
 import static org.junit.jupiter.api.Assertions.*;
 
-@Tag("SUITE")
+@Tag("core.config")
 class LtreeTest {
     @Test
     void assertThatAStringWithInvalidCharactersCanBeEncodedTwice(){
diff --git a/src/test/java/fr/inra/oresing/domain/application/configuration/SubmissionTest.java b/src/test/java/fr/inra/oresing/domain/application/configuration/SubmissionTest.java
index 5955b26012109260595e1a213776b83832552b9b..b171d491036d6e399b203b5972e9e332818d1295 100644
--- a/src/test/java/fr/inra/oresing/domain/application/configuration/SubmissionTest.java
+++ b/src/test/java/fr/inra/oresing/domain/application/configuration/SubmissionTest.java
@@ -3,9 +3,7 @@ package fr.inra.oresing.domain.application.configuration;
 import fr.inra.oresing.domain.BinaryFileDataset;
 import fr.inra.oresing.domain.exceptions.authorization.AuthorizationRequestException;
 import fr.inra.oresing.domain.exceptions.authorization.SiOreAuthorizationRequestException;
-import groovy.lang.Tuple;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 
 import java.util.LinkedList;
@@ -13,6 +11,7 @@ import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.*;
 
+@Tag("domain.model")
 class SubmissionTest {
     final Submission submission = new Submission(
             SubmissionType.OA_VERSIONING,
diff --git a/src/test/java/fr/inra/oresing/domain/application/configuration/date/DatePatternTest.java b/src/test/java/fr/inra/oresing/domain/application/configuration/date/DatePatternTest.java
index 10962c535236c448aafb9521cb2d130024653784..dd5c0b3cbd847c25a0aa35db7289e09c8099e7d2 100644
--- a/src/test/java/fr/inra/oresing/domain/application/configuration/date/DatePatternTest.java
+++ b/src/test/java/fr/inra/oresing/domain/application/configuration/date/DatePatternTest.java
@@ -10,7 +10,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.Objects;
 
-@org.junit.jupiter.api.Tag("SUITE")
+@org.junit.jupiter.api.Tag("domain.model")
 class DatePatternTest {
     public static final String DATE = "12/01/1925";
     public static final String TIME = "12:23:56";
diff --git a/src/test/java/fr/inra/oresing/domain/checker/type/ReferenceTypeTest.java b/src/test/java/fr/inra/oresing/domain/checker/type/ReferenceTypeTest.java
index d9a27bb45304d462320a1c274bab563874baf834..80dc060ce5017cb3c87e29bf45825fb2deddf382 100644
--- a/src/test/java/fr/inra/oresing/domain/checker/type/ReferenceTypeTest.java
+++ b/src/test/java/fr/inra/oresing/domain/checker/type/ReferenceTypeTest.java
@@ -15,6 +15,7 @@ import org.mockito.Mockito;
 
 import java.util.UUID;
 
+@Tag("domain.checker")
 class ReferenceTypeTest {
     LineChecker.Transformer transformer;
     ImmutableMap<DataValue.LineIdentityColumnName, ImmutableSet<UUID>> referenceValues;
diff --git a/src/test/java/fr/inra/oresing/domain/data/read/DataHeaderReaderTest.java b/src/test/java/fr/inra/oresing/domain/data/read/DataHeaderReaderTest.java
index 17efa81b2e75597df6aab13291dcd8d2cd5ca3bd..b1867ba32b70c574e18ac7504b3312978415ae31 100644
--- a/src/test/java/fr/inra/oresing/domain/data/read/DataHeaderReaderTest.java
+++ b/src/test/java/fr/inra/oresing/domain/data/read/DataHeaderReaderTest.java
@@ -32,6 +32,7 @@ import java.util.Map;
 import java.util.stream.Collectors;
 
 @Tag("SUITE")
+@Tag("domain.model")
 class DataHeaderReaderTest {
     Iterator<CSVRecord> lineIterator;
     DataHeaderReader reader;
diff --git a/src/test/java/fr/inra/oresing/domain/groovy/GroovyExpressionTest.java b/src/test/java/fr/inra/oresing/domain/groovy/GroovyExpressionTest.java
index d5c2119b30039b77b27367386e2b54233032ee52..2d44f518a7a996109d73a3587352fb5fab5003e5 100644
--- a/src/test/java/fr/inra/oresing/domain/groovy/GroovyExpressionTest.java
+++ b/src/test/java/fr/inra/oresing/domain/groovy/GroovyExpressionTest.java
@@ -17,7 +17,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
-@Tag("SUITE")
+@Tag("domain.model")
 class GroovyExpressionTest {
 
     private Map<String, Object> context;
diff --git a/src/test/java/fr/inra/oresing/domain/internationalization/InternationalizationDisplayTest.java b/src/test/java/fr/inra/oresing/domain/internationalization/InternationalizationDisplayTest.java
index f388752fa5f04c7d5e9bce2bc6890d10e5b1608f..1e2c26eb431aa9abfe6d8401df005e259f9d9f9e 100644
--- a/src/test/java/fr/inra/oresing/domain/internationalization/InternationalizationDisplayTest.java
+++ b/src/test/java/fr/inra/oresing/domain/internationalization/InternationalizationDisplayTest.java
@@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test;
 
 import java.util.List;
 
-@org.junit.jupiter.api.Tag("SUITE")
+@org.junit.jupiter.api.Tag("domain.i18n")
 public class InternationalizationDisplayTest {
     final String pattern = "column 1 {column1} column 2 {column2} column 3 {column3} end";
 
diff --git a/src/test/java/fr/inra/oresing/domain/massimport/BuildFileHeaderTest.java b/src/test/java/fr/inra/oresing/domain/massimport/BuildFileHeaderTest.java
index 32a14e1bbe8c82524fe425d5ca07b63dbc06e871..7b967bfba35a9e6896198f143f376c22e22c5ce3 100644
--- a/src/test/java/fr/inra/oresing/domain/massimport/BuildFileHeaderTest.java
+++ b/src/test/java/fr/inra/oresing/domain/massimport/BuildFileHeaderTest.java
@@ -5,6 +5,7 @@ import fr.inra.oresing.domain.ConfigurationBuiderTestBuilder;
 import fr.inra.oresing.domain.application.configuration.*;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.slf4j.Logger;
@@ -15,6 +16,7 @@ import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.util.function.Function;
 
+@Tag("domain.model")
 public class BuildFileHeaderTest {
     private static final Logger log = LoggerFactory.getLogger(BuildFileHeaderTest.class);
     static final String RESOURCE_PATH = "fr/inra/oresing/domain/massimport/massimport.yaml";
diff --git a/src/test/java/fr/inra/oresing/persistence/AuthenticationServiceTest.java b/src/test/java/fr/inra/oresing/persistence/AuthenticationServiceTest.java
index 8c129eb0f9bf92c9346a72fa5431d59f7ad83e84..5778b074042dcfd46ebc2e2fa2de088f7160e609 100644
--- a/src/test/java/fr/inra/oresing/persistence/AuthenticationServiceTest.java
+++ b/src/test/java/fr/inra/oresing/persistence/AuthenticationServiceTest.java
@@ -45,13 +45,14 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
 
 @ActiveProfiles("testmail")
-@SpringBootTest(classes = {OreSiNg.class, OreSiNg.MailSenderForTest.class, TestDatabaseConfig.class})
+@SpringBootTest(classes = {OreSiNg.class, OreSiNg.MailSenderForTest.class, TestDatabaseConfig.class, OreSiNg.class, TestDatabaseConfig.class})
 
 @TestPropertySource(locations = "classpath:/application-tests.properties")
 @AutoConfigureWebMvc
 @AutoConfigureMockMvc(print = MockMvcPrint.NONE)
 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
 @Tag("SUITE")
+@Tag("core.auth")
 public class AuthenticationServiceTest {
     @Value("${spring.mail.from}")
     String mailFrom;
diff --git a/src/test/java/fr/inra/oresing/persistence/data/read/bundle/FileContentTest.java b/src/test/java/fr/inra/oresing/persistence/data/read/bundle/FileContentTest.java
index d0dd6935dff2db83e84db6730a228bd82fb979d7..2ae6fd8b5778b3131eab2d92c4ddf992db938c5e 100644
--- a/src/test/java/fr/inra/oresing/persistence/data/read/bundle/FileContentTest.java
+++ b/src/test/java/fr/inra/oresing/persistence/data/read/bundle/FileContentTest.java
@@ -5,6 +5,7 @@ import fr.inra.oresing.domain.application.configuration.Submission;
 import fr.inra.oresing.domain.application.configuration.SubmissionType;
 import org.assertj.core.api.AssertJProxySetup;
 import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
@@ -14,6 +15,7 @@ import java.util.Optional;
 
 import static org.junit.jupiter.api.Assertions.*;
 
+@Tag("domain.model")
 class FileContentTest {
     final Submission submission = new Submission(
             SubmissionType.OA_VERSIONING,
diff --git a/src/test/java/fr/inra/oresing/persistence/index/AuthorizationIndexTest.java b/src/test/java/fr/inra/oresing/persistence/index/AuthorizationIndexTest.java
index df59246407d0c435ef98a641d0f8041f5c424227..9861401daa90239f79f0de92b7016e430e45064d 100644
--- a/src/test/java/fr/inra/oresing/persistence/index/AuthorizationIndexTest.java
+++ b/src/test/java/fr/inra/oresing/persistence/index/AuthorizationIndexTest.java
@@ -18,6 +18,7 @@ import java.util.*;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+@org.junit.jupiter.api.Tag("core.auth")
 class AuthorizationIndexTest {
 
     private AuthorizationIndex authorizationIndex;
diff --git a/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java b/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java
index 30b034e23cd56fc6d0c3f928b724ffcd4b6efa61..c22327b65ab4b3482e45a063f01f9b99fb9aaad4 100644
--- a/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java
+++ b/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java
@@ -16,7 +16,6 @@ import fr.inra.oresing.rest.services.ApplicationConfigurationService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
 import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -47,6 +46,7 @@ import static org.junit.jupiter.api.Assertions.*;
 @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
 @Slf4j
 @org.junit.jupiter.api.Tag("SUITE")
+@org.junit.jupiter.api.Tag("core.config")
 public class ApplicationConfigurationServiceTest {
 
     public static final Map<String, List<ReactiveResult>> errors = new HashMap<>();
diff --git a/src/test/java/fr/inra/oresing/rest/AuthorizationResourcesTest.java b/src/test/java/fr/inra/oresing/rest/AuthorizationResourcesTest.java
index a51eee54d13b2d573444185cf7d2cb8b2d9bcc03..9c3923f58458af6812b275a40b1f2d966e67f78b 100644
--- a/src/test/java/fr/inra/oresing/rest/AuthorizationResourcesTest.java
+++ b/src/test/java/fr/inra/oresing/rest/AuthorizationResourcesTest.java
@@ -19,6 +19,7 @@ import org.hamcrest.core.IsEqual;
 import static org.junit.jupiter.api.Assertions.*;
 
 import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
@@ -53,6 +54,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 @AutoConfigureMockMvc(print = MockMvcPrint.NONE)
 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
 @Slf4j
+@Tag("core.auth")
 public class AuthorizationResourcesTest {
 
     @Autowired
diff --git a/src/test/java/fr/inra/oresing/rest/MigrationTest.java b/src/test/java/fr/inra/oresing/rest/MigrationTest.java
index 6612694fb3085c3b7ebce8c92b554754de8b1039..58d3b684c70391f4ae2d37d8101719ae291cc6bd 100644
--- a/src/test/java/fr/inra/oresing/rest/MigrationTest.java
+++ b/src/test/java/fr/inra/oresing/rest/MigrationTest.java
@@ -5,6 +5,7 @@ import fr.inra.oresing.TestDatabaseConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
@@ -25,12 +26,13 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
 @ActiveProfiles("testmail")
+@Tag("integration.persistence")
 @SpringBootTest(classes = {OreSiNg.class, TestDatabaseConfig.class})
 
 @TestPropertySource(locations = "classpath:/application-tests.properties")
 @AutoConfigureWebMvc
 @AutoConfigureMockMvc(print = MockMvcPrint.NONE)
-@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
+@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
 @Slf4j
 public class MigrationTest {
 
diff --git a/src/test/java/fr/inra/oresing/rest/MultiYamlTest.java b/src/test/java/fr/inra/oresing/rest/MultiYamlTest.java
index 662994b3f77dff68d47d33eae023924e41265ddb..c0e6d38532034e0b3c1a95124a9a9552812089c5 100644
--- a/src/test/java/fr/inra/oresing/rest/MultiYamlTest.java
+++ b/src/test/java/fr/inra/oresing/rest/MultiYamlTest.java
@@ -12,7 +12,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.Map;
 
-@org.junit.jupiter.api.Tag("SUITE")
+@org.junit.jupiter.api.Tag("core.basic")
 public class MultiYamlTest {
     @Test
     public void testYaml() throws IOException {
diff --git a/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java b/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java
index 98a25f93b4217b110e17b41a47d486cec7c73fb5..e00c830905f46f3ed3d47829b3e4bbeb236814d4 100644
--- a/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java
+++ b/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java
@@ -90,6 +90,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 @AutoConfigureWebMvc
 @AutoConfigureMockMvc(print = MockMvcPrint.NONE)
 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
+@Tag("integration.rest")
 @Slf4j
 public class OreSiResourcesTest {
 
@@ -168,7 +169,7 @@ public class OreSiResourcesTest {
     }
 
     @Test
-    @Tag("SUITE")
+    @Tag("core.basic")
     public void testDatabaseUser() throws SQLException {
         String currentUser = getCurrentDatabaseUser();
         Assertions.assertEquals("openAdomTechUser", currentUser, "Le test devrait être exécuté en tant qu'openadomTechUser");
@@ -187,7 +188,7 @@ public class OreSiResourcesTest {
 
     @Test
     @Tag("SWAGGER_BUILD")
-    @Tag("SUITE")
+    @Tag("integration.rest")
     public void services_model() throws Exception {
         final String services_model = mockMvc.perform(get("/api-docs")
                         .accept(MediaType.APPLICATION_JSON_VALUE)
@@ -248,7 +249,7 @@ public class OreSiResourcesTest {
 
     @Test
     @Tag("OTHERS_TEST")
-    @Tag("SUITE")
+    @Tag("app.monsoere")
     @Tag("MONSOERE")
     public void addApplicationMonsore() throws Exception {
         final String appId;
@@ -808,14 +809,14 @@ public class OreSiResourcesTest {
 
     @Test
     @Tag("OTHERS_TEST")
-    @Tag("SUITE")
+    @Tag("integration.rest")
     public void buildSwaggerApi() throws Exception {
         mockMvc.perform(get("/v2/api-docs"));
     }
 
     @Test
     @Tag("OTHERS_TEST")
-    @Tag("SUITE")
+    @Tag("domain.model")
     public void testMultiplicityMany() throws Exception {
         final URL resource = getClass().getResource(Fixtures.getMultiplicityMany());
         try (final InputStream in = Objects.requireNonNull(resource).openStream()) {
@@ -887,7 +888,7 @@ public class OreSiResourcesTest {
     }
 
     @Test
-    @Tag("OTHERS_TEST")
+    @Tag("core.config")
     @Disabled
     public void addApplicationWithComputedComponentsWithReferences() throws Exception {
         final URL resource = getClass().getResource(Fixtures.getApplicationWithComputedComponentsWithReferences());
@@ -950,7 +951,7 @@ public class OreSiResourcesTest {
 
     @Test
     @Tag("OTHERS_TEST")
-    @Tag("SUITE")
+    @Tag("app.monsoere")
     @Tag("MONSOERE")
     public void addApplicationMonsoreWithRepository() throws Exception {
         URL resource = getClass().getResource(Fixtures.getMonsoreApplicationConfigurationWithRepositoryResourceName());
@@ -1733,6 +1734,7 @@ public class OreSiResourcesTest {
     }
 
     @Test
+    @Tag("app.teledetection")
     @Disabled
     public void addApplicationTeledetection() throws Exception {
         final URL resource = getClass().getResource(Fixtures.getTeledetectionConfigurationResourceName());
@@ -1993,6 +1995,7 @@ public class OreSiResourcesTest {
      * The only authorizations that can be put on are on none or all values.
      */
     @Test
+    @Tag("core.config")
     @Disabled
     public void testProgressiveYamlWithoutAuthorization() throws Exception {
         final String authorizationId;
@@ -2099,6 +2102,7 @@ public class OreSiResourcesTest {
 
     @Test
     @Disabled
+    @Tag("core.config")
     public void testProgressiveYamlWithEmptyDatagroup() throws Exception {
 
         final URL resource = getClass().getResource(Fixtures.getProgressiveYaml().get("yamlWithEmptyDatagroup"));
@@ -2121,6 +2125,7 @@ public class OreSiResourcesTest {
      */
     @Test
     @Disabled
+    @Tag("core.config")
     public void testProgressiveYamlWithNoReference() throws Exception {
 
         final URL resource = getClass().getResource(Fixtures.getProgressiveYaml().get("testAuthorizationScopeWithoutReference"));
@@ -2146,6 +2151,7 @@ public class OreSiResourcesTest {
 
     @Test
     @Disabled
+    @Tag("core.config")
     public void testProgressiveYamlWithoutAuthorizationScope() {
 
         final URL resource = getClass().getResource(Fixtures.getProgressiveYaml().get("testProgressiveYamlWithoutAuthorizationScope"));
@@ -2165,6 +2171,7 @@ public class OreSiResourcesTest {
 
     @Test
     @Disabled
+    @Tag("core.config")
     public void testProgressiveYamlWithoutTimescopeScope() {
 
         final URL resource = getClass().getResource(Fixtures.getProgressiveYaml().get("testProgressiveYamlWithoutTimescopeScope"));
@@ -2188,6 +2195,7 @@ public class OreSiResourcesTest {
      */
     @Test
     @Disabled
+    @Tag("core.config")
     public void testProgressiveWithReferenceAndNoHierarchicalReferenceYaml() throws Exception {
 
         final URL resource = getClass().getResource(Fixtures.getProgressiveYaml().get("testAuthorizationScopeWithReferenceAndNoHierarchicalReference"));
@@ -2242,8 +2250,7 @@ public class OreSiResourcesTest {
 
     @Test
     @Tag("SUITE")
-
-
+    @Tag("app.recursivity")
     public void testRecursivity() throws Exception {
 
         final URL resource = getClass().getResource(Fixtures.getRecursivityApplicationConfigurationResourceName());
@@ -2329,6 +2336,7 @@ public class OreSiResourcesTest {
 
     @Test
     @Tag("SUITE")
+    @Tag("app.pattern")
     public void testPattern() throws Exception {
 
         final URL resource = getClass().getResource(Fixtures.getPatternApplicationConfigurationResourceName());
@@ -2443,6 +2451,7 @@ public class OreSiResourcesTest {
 
     @Test
     @Tag("SUITE")
+    @Tag("core.config")
     public void testComputedWithNaturalKeyColumns() throws Exception {
 
         final URL resource = getClass().getResource(Fixtures.getComputedWithNaturalKeyColumns());
@@ -2539,7 +2548,7 @@ public class OreSiResourcesTest {
     }
 
     @Test
-    @Tag("ACBB_TEST")
+    @Tag("app.acbb")
     public void addApplicationAcbb() throws Exception {
         addUserRightCreateApplication(authUserId, "acbb");
         final URL resource = getClass().getResource(Fixtures.getAcbbApplicationConfigurationResourceName());
@@ -2772,7 +2781,7 @@ public class OreSiResourcesTest {
     }
 
     @Test
-    @Tag("HAUTE_FREQUENCE_TEST")
+    @Tag("app.haute_frequence")
     @Disabled
     public void addApplicationHauteFrequence() throws Throwable {
         addUserRightCreateApplication(authUserId, "hautefrequence");
@@ -2803,7 +2812,7 @@ public class OreSiResourcesTest {
     }
 
     @Test
-    @Tag("OTHERS_TEST")
+    @Tag("domain.model")
     @Disabled
     public void addDuplicatedTest() throws Throwable {
         addUserRightCreateApplication(authUserId, "duplicated");
@@ -3056,7 +3065,7 @@ on test le dépôt d'un fichier récursif
     }
 
     @Test
-    @Tag("OTHERS_TEST")
+    @Tag("app.olac")
     @Disabled
     public void addApplicationOLAC() throws Exception {
         addUserRightCreateApplication(authUserId, "olac");
@@ -3151,7 +3160,7 @@ on test le dépôt d'un fichier récursif
     }
 
     @Test
-    @Tag("OTHERS_TEST")
+    @Tag("app.foret")
     @Disabled
     public void addApplicationFORET_essai() throws Exception {
         addUserRightCreateApplication(authUserId, "foret");
@@ -3201,7 +3210,7 @@ on test le dépôt d'un fichier récursif
     }
 
     @Test
-    @Tag("OTHERS_TEST")
+    @Tag("app.foret")
     @Disabled
     public void addApplicationFORET() throws Exception {
         addUserRightCreateApplication(authUserId, "foret");
@@ -3236,6 +3245,7 @@ on test le dépôt d'un fichier récursif
 
     @Test
     @Disabled("utile comme benchmark, ne vérifie rien")
+    @Tag("integration.persistence")
     public void benchmarkImportData() throws Exception {
         addApplicationAcbb();
         try (final InputStream in = fixtures.openSwcDataResourceName(false)) {
@@ -3252,6 +3262,7 @@ on test le dépôt d'un fichier récursif
     @Test
     @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
     @Disabled
+    @Tag("integration.rest")
     public void testGetUploadBundle() throws Exception {
         URL resource = getClass().getResource(Fixtures.getMonsoreApplicationConfigurationWithRepositoryResourceName());
         try (final InputStream in = Objects.requireNonNull(resource).openStream()) {
diff --git a/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java b/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java
index 31cb2f222a7b82eeed3b7bf2d5292c8abe387378..2147929f095fd30d93f9aa76acbef95df94a1cad 100644
--- a/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java
+++ b/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java
@@ -4,8 +4,10 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.jayway.jsonpath.JsonPath;
 import fr.inra.oresing.OreSiNg;
 import fr.inra.oresing.TestDatabaseConfig;
+import fr.inra.oresing.persistence.AuthenticationFailure;
 import fr.inra.oresing.persistence.AuthenticationService;
 import fr.inra.oresing.persistence.JsonRowMapper;
+import fr.inra.oresing.rest.model.authorization.LoginAdminResult;
 import lombok.extern.slf4j.Slf4j;
 import org.hamcrest.Matchers;
 import org.hamcrest.core.IsEqual;
@@ -13,10 +15,7 @@ import org.hamcrest.core.IsNull;
 
 import static org.junit.jupiter.api.Assertions.*;
 
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.*;
 import org.skyscreamer.jsonassert.JSONAssert;
 import org.skyscreamer.jsonassert.JSONCompareMode;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,7 +29,6 @@ import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -57,6 +55,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 @AutoConfigureMockMvc(print = MockMvcPrint.NONE)
 @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
 @Slf4j
+@Tag("domain.model")
 public class TestReferencesErrors {
 
     public static final Map<String, String> responses = new HashMap<>();
@@ -73,7 +72,8 @@ public class TestReferencesErrors {
     @Autowired
     private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
     private Cookie authCookie;
-
+    private static CreateUserResult authUser = null;
+    private static UUID userId;
     @AfterAll
     public static void registerErrors() throws IOException {
         String errorsAsString = new ObjectMapper().writeValueAsString(responses);
@@ -86,10 +86,22 @@ public class TestReferencesErrors {
 
     @BeforeEach
     public void createUser() throws Exception {
-        CreateUserResult authUser = authenticationService.createUser("poussin", "xxxxxxxx", "poussin@inrae.fr");
-        final UUID userId = authUser.userId();
-        setToActive(userId);
-        final CreateUserResult lambdaUser = authenticationService.createUser("lambda", "xxxxxxxx", "lamnda@inrae.fr");
+        try {
+            authUser = authenticationService.createUser("poussin", "xxxxxxxx", "poussin@inrae.fr");
+            userId = authUser.userId();
+            setToActive(authUser.userId());
+        } catch (AuthenticationFailure e) {
+            LoginAdminResult login = authenticationService.login("poussin", "xxxxxxxx");
+            authUser = CreateUserResult.of(authenticationService.getByIdOrLogin(login.id().toString()));
+            userId = authUser.userId();
+            setToActive(authUser.userId());
+            log.info("L'utilisateur existe déjà .... login");
+        }
+        try {
+            authenticationService.createUser("lambda", "xxxxxxxx", "lamnda@inrae.fr");
+        } catch (AuthenticationFailure e) {
+            log.info("L'utilisateur existe déjà .... login");
+        }
         authCookie = mockMvc.perform(post("/api/v1/login")
                         .param("login", "poussin")
                         .param("password", "xxxxxxxx"))
@@ -120,17 +132,6 @@ public class TestReferencesErrors {
         namedParameterJdbcTemplate.update(sql, Map.of("id", userId));
     }
 
-    @Transactional
-    void setToActive(final String login) {
-        String sql = """
-                UPDATE public.oresiuser 
-                SET accountstate = 'active' 
-                WHERE login = :login
-                """;
-
-        namedParameterJdbcTemplate.update(sql, Map.of("login", login));
-    }
-
 
     @Test
     public void testRecursivity() throws Exception {
diff --git a/src/test/java/fr/inra/oresing/rest/model/authorization/CreateAuthorizationRequestTest.java b/src/test/java/fr/inra/oresing/rest/model/authorization/CreateAuthorizationRequestTest.java
index 6be15e1d58d1b013e3e61ae3a713d48b57bb5985..e1d4cc4007d183ab329e98fe3989557528a53a32 100644
--- a/src/test/java/fr/inra/oresing/rest/model/authorization/CreateAuthorizationRequestTest.java
+++ b/src/test/java/fr/inra/oresing/rest/model/authorization/CreateAuthorizationRequestTest.java
@@ -16,7 +16,6 @@ import fr.inra.oresing.persistence.JsonRowMapper;
 import fr.inra.oresing.persistence.data.read.DataRepositoryWithBuffer;
 import fr.inra.oresing.rest.model.authorization.exception.AuthorizationRequestError;
 import fr.inra.oresing.rest.model.authorization.request.AuthorizationRequestBuilder;
-import lombok.SneakyThrows;
 import org.json.JSONException;
 import org.junit.jupiter.api.*;
 import org.mockito.Mockito;
@@ -29,7 +28,6 @@ import java.nio.charset.StandardCharsets;
 import java.time.LocalDate;
 import java.util.*;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 class CreateAuthorizationRequestTest {
     static String createAuthorization;
@@ -41,7 +39,7 @@ class CreateAuthorizationRequestTest {
     }
 
     @Test
-    @Tag("SUITE")
+    @Tag("core.auth")
     void toAuthorizationRequest() throws IOException {
         CreateAuthorizationRequest createAuthorizationRequest1 = new CreateAuthorizationRequest(
                 UUID.fromString("e7570009-35fb-489d-ad3b-5bb335e7c5d5"),
diff --git a/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryAdvancedSearchTest.java b/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryAdvancedSearchTest.java
index 85b4ec431b00bf541e5346cc4391d72ce153b8ee..64f74c465361222923c9488cf5e4ef979850a843 100644
--- a/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryAdvancedSearchTest.java
+++ b/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryAdvancedSearchTest.java
@@ -16,7 +16,7 @@ import java.util.stream.Stream;
 
 import static org.junit.jupiter.api.Assertions.*;
 
-@Tag("MODEL_REQUEST_TEST")
+@Tag("integration.persistence\n")
 class DownloadDatasetQueryAdvancedSearchTest {
     public static JsonRowMapper mapper;
     public static final Set<String> rowIds = Set.of("addf3698-88f2-43f9-8926-0b64a86f3678", "0aef7ed1-1df9-4fbf-a676-1932e87ced9d", "2c527cbe-3ed7-4883-b7d1-8f29eff99eb1");
diff --git a/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryTest.java b/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryTest.java
index 883e74b7f9f89a6b1397419ba383fb887526f560..a2356a2459479fe21aea463e6fdce0378dec18c8 100644
--- a/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryTest.java
+++ b/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryTest.java
@@ -22,7 +22,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
-@Tag("MODEL_REQUEST_TEST")
+@Tag("integration.persistence\n")
 @Disabled
 class DownloadDatasetQueryTest {
     final String simpleSearchJson = """
diff --git a/src/test/java/fr/inra/oresing/rest/services/RelationalServiceTest.java b/src/test/java/fr/inra/oresing/rest/services/RelationalServiceTest.java
index a7dfa5b57974ed2d8bbfe154687cd570f8e882cf..77d9c781d2f36e6454d8364beedbf0c42765967b 100644
--- a/src/test/java/fr/inra/oresing/rest/services/RelationalServiceTest.java
+++ b/src/test/java/fr/inra/oresing/rest/services/RelationalServiceTest.java
@@ -8,6 +8,7 @@ import fr.inra.oresing.rest.OreSiResourcesTest;
 import fr.inra.oresing.rest.ViewStrategy;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
@@ -66,6 +67,7 @@ public class RelationalServiceTest {
 
     @Test
     @Disabled
+    @Tag("integration.persistence\n")
     public void testCreateViews() {
 //        request.setRequestClient(applicationCreatorRequestClient);
         final ImmutableSet<Fixtures.Application> applications = ImmutableSet
diff --git a/src/test/resources/data/configuration/hierarchical.json b/src/test/resources/data/configuration/hierarchical.json
index 8320193e1d4f4a37b677dd214a2c0d7242b252eb..effffa45fdb92d4b392f569aaa2a1b3cb087bf92 100644
--- a/src/test/resources/data/configuration/hierarchical.json
+++ b/src/test/resources/data/configuration/hierarchical.json
@@ -1,4 +1,5 @@
 [ {
+  "level" : 0,
   "nodeName" : "valeur_qualitative_vqe",
   "componentKey" : null,
   "columnToLookUpForRecursive" : null,
@@ -8,17 +9,19 @@
   "order" : 5,
   "isRecursive" : false
 }, {
+  "level" : 0,
   "nodeName" : "type_de_taxon_ttx",
   "componentKey" : null,
   "columnToLookUpForRecursive" : null,
   "parent" : null,
   "children" : [ {
+    "level" : 1,
     "nodeName" : "taxon_tax",
     "componentKey" : "ttx_nom",
     "columnToLookUpForRecursive" : null,
     "parent" : "type_de_taxon_ttx",
     "children" : [ ],
-    "depends" : [ "valeur_qualitative_vqe", "type_de_taxon_ttx" ],
+    "depends" : [ "type_de_taxon_ttx", "valeur_qualitative_vqe" ],
     "order" : 9999,
     "isRecursive" : false
   } ],
@@ -26,16 +29,19 @@
   "order" : 6,
   "isRecursive" : false
 }, {
+  "level" : 0,
   "nodeName" : "type_de_site_tsi",
   "componentKey" : null,
   "columnToLookUpForRecursive" : null,
   "parent" : null,
   "children" : [ {
+    "level" : 1,
     "nodeName" : "site_sit",
     "componentKey" : "sit_parent",
     "columnToLookUpForRecursive" : "sit_parent",
     "parent" : "type_de_site_tsi",
     "children" : [ {
+      "level" : 2,
       "nodeName" : "traitement_tra",
       "componentKey" : "sit_key",
       "columnToLookUpForRecursive" : null,
@@ -45,128 +51,13 @@
       "order" : 1,
       "isRecursive" : false
     }, {
+      "level" : 2,
       "nodeName" : "parcelle_par",
       "componentKey" : "sit_key",
       "columnToLookUpForRecursive" : null,
       "parent" : "site_sit",
       "children" : [ {
-        "nodeName" : "plot_plo",
-        "componentKey" : "sit_key",
-        "columnToLookUpForRecursive" : null,
-        "parent" : "parcelle_par",
-        "children" : [ ],
-        "depends" : [ "parcelle_par", "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ],
-        "order" : 9999,
-        "isRecursive" : false
-      } ],
-      "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ],
-      "order" : 2,
-      "isRecursive" : false
-    } ],
-    "depends" : [ "type_de_site_tsi", "valeur_qualitative_vqe" ],
-    "order" : 9999,
-    "isRecursive" : true
-  }, {
-    "nodeName" : "site_sit",
-    "componentKey" : "sit_parent",
-    "columnToLookUpForRecursive" : "sit_parent",
-    "parent" : "type_de_site_tsi",
-    "children" : [ {
-      "nodeName" : "traitement_tra",
-      "componentKey" : "sit_key",
-      "columnToLookUpForRecursive" : null,
-      "parent" : "site_sit",
-      "children" : [ ],
-      "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ],
-      "order" : 1,
-      "isRecursive" : false
-    }, {
-      "nodeName" : "parcelle_par",
-      "componentKey" : "sit_key",
-      "columnToLookUpForRecursive" : null,
-      "parent" : "site_sit",
-      "children" : [ {
-        "nodeName" : "plot_plo",
-        "componentKey" : "sit_key",
-        "columnToLookUpForRecursive" : null,
-        "parent" : "parcelle_par",
-        "children" : [ ],
-        "depends" : [ "parcelle_par", "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ],
-        "order" : 9999,
-        "isRecursive" : false
-      } ],
-      "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ],
-      "order" : 2,
-      "isRecursive" : false
-    } ],
-    "depends" : [ "type_de_site_tsi", "valeur_qualitative_vqe" ],
-    "order" : 9999,
-    "isRecursive" : true
-  } ],
-  "depends" : [ ],
-  "order" : 9999,
-  "isRecursive" : false
-}, {
-  "nodeName" : "type_de_site_tsi",
-  "componentKey" : null,
-  "columnToLookUpForRecursive" : null,
-  "parent" : null,
-  "children" : [ {
-    "nodeName" : "site_sit",
-    "componentKey" : "sit_parent",
-    "columnToLookUpForRecursive" : "sit_parent",
-    "parent" : "type_de_site_tsi",
-    "children" : [ {
-      "nodeName" : "traitement_tra",
-      "componentKey" : "sit_key",
-      "columnToLookUpForRecursive" : null,
-      "parent" : "site_sit",
-      "children" : [ ],
-      "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ],
-      "order" : 1,
-      "isRecursive" : false
-    }, {
-      "nodeName" : "parcelle_par",
-      "componentKey" : "sit_key",
-      "columnToLookUpForRecursive" : null,
-      "parent" : "site_sit",
-      "children" : [ {
-        "nodeName" : "plot_plo",
-        "componentKey" : "sit_key",
-        "columnToLookUpForRecursive" : null,
-        "parent" : "parcelle_par",
-        "children" : [ ],
-        "depends" : [ "parcelle_par", "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ],
-        "order" : 9999,
-        "isRecursive" : false
-      } ],
-      "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ],
-      "order" : 2,
-      "isRecursive" : false
-    } ],
-    "depends" : [ "type_de_site_tsi", "valeur_qualitative_vqe" ],
-    "order" : 9999,
-    "isRecursive" : true
-  }, {
-    "nodeName" : "site_sit",
-    "componentKey" : "sit_parent",
-    "columnToLookUpForRecursive" : "sit_parent",
-    "parent" : "type_de_site_tsi",
-    "children" : [ {
-      "nodeName" : "traitement_tra",
-      "componentKey" : "sit_key",
-      "columnToLookUpForRecursive" : null,
-      "parent" : "site_sit",
-      "children" : [ ],
-      "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ],
-      "order" : 1,
-      "isRecursive" : false
-    }, {
-      "nodeName" : "parcelle_par",
-      "componentKey" : "sit_key",
-      "columnToLookUpForRecursive" : null,
-      "parent" : "site_sit",
-      "children" : [ {
+        "level" : 3,
         "nodeName" : "plot_plo",
         "componentKey" : "sit_key",
         "columnToLookUpForRecursive" : null,
@@ -188,12 +79,13 @@
   "order" : 9999,
   "isRecursive" : false
 }, {
+  "level" : 4,
   "nodeName" : "data",
   "componentKey" : "plo_key",
   "columnToLookUpForRecursive" : null,
   "parent" : null,
   "children" : [ ],
-  "depends" : [ "valeur_qualitative_vqe", "plot_plo", "parcelle_par", "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ],
+  "depends" : [ "parcelle_par", "plot_plo", "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ],
   "order" : 9999,
   "isRecursive" : false
 } ]
\ No newline at end of file