From 198d498ac9444bb5943f6eac4aaaa0c217baf3ba Mon Sep 17 00:00:00 2001
From: Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr>
Date: Mon, 17 Oct 2022 16:23:28 +0200
Subject: [PATCH] Corrections autour de la substitution de structures

---
 .../src/sql/create_comue.template.sql         |   3 +-
 .../Controller/TableauDeBordController.php    |   2 +-
 .../Traits/LogoAwareControllerTrait.php       |  69 --------
 .../ApplicationNavigationFactory.php          |   2 +-
 .../ListeDiffusionAddressGenerator.php        |   4 +-
 .../Application/Service/Role/RoleService.php  |   2 +-
 .../ecole-doctorale/information.phtml         |   6 +-
 .../index/partial/soutenances.phtml           |   2 +-
 .../rapport/partial/rapports-table.phtml      |   6 +-
 .../view/application/role/index.phtml         |   2 +-
 .../view/application/statistique/index.phtml  |   6 +-
 .../partial/form-filtrage.phtml               |   2 +-
 .../unite-recherche/information.phtml         |   8 +-
 .../utilisateur/gerer-utilisateur.phtml       |   2 +-
 .../utilisateur/lier-individu.phtml           |   2 +-
 .../Service/Fichier/FichierStorageService.php |  35 +---
 .../Controller/InscriptionController.php      |   8 +-
 .../Formation/Controller/SeanceController.php |   4 +-
 .../Controller/SessionController.php          |  10 +-
 .../Exporter/Emargement/emargement.phtml      |   6 +-
 .../Formation/View/Helper/partial/site.phtml  |   4 +-
 .../Controller/IndicateurController.php       |  12 +-
 .../Helper/CompletIndicateurTheseHelper.php   |  12 +-
 .../IndividuCompl/IndividuComplHydrator.php   |   4 +-
 .../view/individu/individu-compl/index.phtml  |   4 +-
 .../individu/individu/partial/roles.phtml     |   2 +-
 .../Service/RapportActiviteService.php        |  18 +-
 .../partial/rapports-table.phtml              |   6 +-
 .../Controller/PresoutenanceController.php    |   2 +-
 .../Convocation/convocation_doctorant.phtml   |   2 +-
 .../Convocation/convocation_membre.phtml      |   4 +-
 .../Service/Membre/MembreService.php          |   2 +-
 .../Proposition/PropositionService.php        |   4 +-
 .../signature-president.phtml                 |   4 +-
 .../soutenance/index/index-structure.phtml    |  12 +-
 .../index/partial/filtre-proposition.phtml    |  10 +-
 .../notification/convocation-membre.phtml     |   2 +-
 .../notification/validation-structure.phtml   |   2 +-
 .../presoutenance/associer-jury.phtml         |   2 +-
 ...cher-soutenances-par-ecole-doctorale.phtml |   4 +-
 .../proposition/declaration-non-plagiat.phtml |   2 +-
 .../proposition/partial/informations.phtml    |   6 +-
 .../partial/validations-structures.phtml      |   6 +-
 .../Controller/EcoleDoctoraleController.php   |   4 +-
 .../Controller/EtablissementController.php    |   6 +-
 .../EcoleDoctoraleControllerFactory.php       |   2 +-
 .../EtablissementControllerFactory.php        |  14 +-
 .../Factory/StructureControllerFactory.php    |  19 +-
 .../Factory/SubstitutionControllerFactory.php |  14 +-
 .../UniteRechercheControllerFactory.php       |  18 +-
 .../StructureConcreteController.php           |  46 ++---
 .../Controller/SubstitutionController.php     |  80 ++++-----
 .../Controller/UniteRechercheController.php   |  16 +-
 .../Structure/Entity/Db/EcoleDoctorale.php    |  70 +-------
 .../src/Structure/Entity/Db/Etablissement.php |  56 +-----
 .../Repository/EcoleDoctoraleRepository.php   |  26 ++-
 .../Db/Repository/EtablissementRepository.php |  27 ++-
 .../Repository/UniteRechercheRepository.php   |  23 ++-
 .../src/Structure/Entity/Db/Structure.php     |  67 ++++++-
 .../Entity/Db/StructureConcreteInterface.php  |  31 +++-
 .../Entity/Db/StructureInterface.php          |  10 +-
 .../Structure/Entity/Db/StructureSubstit.php  |   2 +-
 .../Structure/Entity/Db/UniteRecherche.php    |  74 +-------
 .../Form/Hydrator/StructureHydrator.php       |  12 +-
 .../EcoleDoctorale/EcoleDoctoraleService.php  |  21 +--
 .../Etablissement/EtablissementService.php    |  22 +--
 .../Service/Structure/StructureService.php    | 166 +++++++-----------
 .../Structure/StructureServiceFactory.php     |  21 +--
 .../UniteRecherche/UniteRechercheService.php  |  34 ++--
 .../View/Helper/StructureSubstitHelper.php    |  31 ++--
 .../structure/ecole-doctorale/index.phtml     |   4 +-
 .../ecole-doctorale/information.phtml         |   6 +-
 .../structure/ecole-doctorale/modifier.phtml  |   4 +-
 .../view/structure/etablissement/index.phtml  |   8 +-
 .../structure/etablissement/information.phtml |   8 +-
 .../structure/televerser-document.phtml       |   2 +-
 .../substitution/afficher-automatique.phtml   |   2 +
 .../substitution/index-structure.phtml        |   4 +-
 .../structure/substitution/modifier.phtml     |  18 +-
 .../partial/substitution-automatique.phtml    |  54 +++---
 .../substitution-automatique.phtml            |   8 +-
 .../structure/unite-recherche/index.phtml     |   4 +-
 .../unite-recherche/information.phtml         |   8 +-
 .../structure/unite-recherche/modifier.phtml  |   6 +-
 .../Controller/CoEncadrantController.php      |   4 +-
 .../src/These/Controller/TheseController.php  |   2 +-
 .../justificatif-coencadrements.phtml         |   6 +-
 .../src/These/Service/These/TheseService.php  |  18 +-
 .../co-encadrant/partial/table-these.phtml    |   6 +-
 .../view/these/these-recherche/index.phtml    |   8 +-
 module/These/view/these/these/identite.phtml  |   8 +-
 .../view/these/these/partial/fiche.phtml      |   6 +-
 92 files changed, 610 insertions(+), 803 deletions(-)
 delete mode 100644 module/Application/src/Application/Controller/Traits/LogoAwareControllerTrait.php

diff --git a/bin/database/src/sql/create_comue.template.sql b/bin/database/src/sql/create_comue.template.sql
index ead37876d..c6f74b5e6 100644
--- a/bin/database/src/sql/create_comue.template.sql
+++ b/bin/database/src/sql/create_comue.template.sql
@@ -9,7 +9,8 @@ select
   nextval('structure_id_seq'), 'COMUE',
   '{ETAB_COMUE_SIGLE}',   --> sigle ou abbréviation à personnaliser
   '{ETAB_COMUE_LIBELLE}', --> libellé à personnaliser
-  null, 1, 'COMUE', 1, 1
+  1, 1, 'COMUE', 1, 1
+from type_structure ts
 where {ETAB_COMUE} = 1
 ;
 
diff --git a/module/Application/src/Application/Controller/TableauDeBordController.php b/module/Application/src/Application/Controller/TableauDeBordController.php
index 22d154447..7e0a4a402 100644
--- a/module/Application/src/Application/Controller/TableauDeBordController.php
+++ b/module/Application/src/Application/Controller/TableauDeBordController.php
@@ -31,7 +31,7 @@ class TableauDeBordController extends AbstractController
         $source = $this->sourceService->fetchApplicationSource();
         $etablissements = $this->getEtablissementService()->getRepository()->findAllBySource($source->getCode());
         $etablissements = array_filter($etablissements, function (Etablissement $etablissement) { return count($etablissement->getStructure()->getStructuresSubstituees())==0; });
-        $etablissements = array_filter($etablissements, function (Etablissement $etablissement) { return $etablissement->getSigle() != "NU";});
+        $etablissements = array_filter($etablissements, function (Etablissement $etablissement) { return $etablissement->getStructure()->getSigle() != "NU";});
 
         return new ViewModel([
             'anomaliesTables' => $anomaliesTables,
diff --git a/module/Application/src/Application/Controller/Traits/LogoAwareControllerTrait.php b/module/Application/src/Application/Controller/Traits/LogoAwareControllerTrait.php
deleted file mode 100644
index 5a97d840b..000000000
--- a/module/Application/src/Application/Controller/Traits/LogoAwareControllerTrait.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-
-namespace Application\Controller\Traits;
-
-use Structure\Entity\Db\StructureConcreteInterface;
-use Structure\Service\Structure\StructureService;
-use UnicaenApp\Exception\RuntimeException;
-use Laminas\Mvc\Plugin\FlashMessenger\FlashMessenger;
-use Laminas\Mvc\Controller\Plugin\Params;
-
-/**
- * Trait LogoAwareControllerTrait
- *
- * @method Params params()
- * @method FlashMessenger flashMessenger()
- *
- * @property StructureService $structureService
-
- * @package Application\Controller\Traits
- *
- * @deprecated Mis dans StructureConcreteController
- */
-trait LogoAwareControllerTrait
-{
-    /**
-     * Retire le logo associé à une structure :
-     * - effacement du chemin en bdd,
-     * - effacement du fichier stocké sur le serveur.
-     *
-     * @param StructureConcreteInterface $structure
-     */
-    public function supprimerLogoStructure(StructureConcreteInterface $structure)
-    {
-        try {
-            $fileDeleted = $this->structureService->deleteLogoStructure($structure);
-        } catch (RuntimeException $e) {
-            $this->flashMessenger()->addErrorMessage(
-                "Erreur lors de l'effacement du logo de la structure '$structure' : " . $e->getMessage());
-            return;
-        }
-
-        if ($fileDeleted) {
-            $this->flashMessenger()->addSuccessMessage("Le logo de la structure '$structure' vient d'être supprimé.");
-        } else {
-            $this->flashMessenger()->addWarningMessage("Aucun logo à supprimer pour la structure '$structure'.");
-        }
-    }
-
-    /**
-     * Ajoute le logo associé à une structure :
-     * - suppression du précédent logo éventuel,
-     * - modification du chemin en bdd
-     * - création du fichier sur le serveur.
-     *
-     * @param StructureConcreteInterface $structure
-     * @param string                     $cheminLogoUploade chemin vers le fichier temporaire associé au logo
-     */
-    public function ajouterLogoStructure(StructureConcreteInterface $structure, $cheminLogoUploade)
-    {
-        try {
-            $this->structureService->updateLogoStructure($structure, $cheminLogoUploade);
-        } catch (RuntimeException $e) {
-            $this->flashMessenger()->addErrorMessage(
-                "Erreur lors de l'enregistrement du logo de la structure '$structure' : " . $e->getMessage());
-        }
-
-        $this->flashMessenger()->addSuccessMessage("Le logo de la structure '$structure' vient d'être ajouté.");
-    }
-}
\ No newline at end of file
diff --git a/module/Application/src/Application/Navigation/ApplicationNavigationFactory.php b/module/Application/src/Application/Navigation/ApplicationNavigationFactory.php
index 6a032548e..f5c10d565 100644
--- a/module/Application/src/Application/Navigation/ApplicationNavigationFactory.php
+++ b/module/Application/src/Application/Navigation/ApplicationNavigationFactory.php
@@ -245,7 +245,7 @@ class ApplicationNavigationFactory extends NavigationFactory
         switch (true) {
             case $role->isEcoleDoctoraleDependant():
                 $ed = $role->getStructure()->getEcoleDoctorale();
-                $label = $ed->getSigle();
+                $label = $ed->getStructure()->getSigle();
                 $query = [EcoleDoctoraleSearchFilter::NAME => $ed->getSourceCode()];
                 break;
             case $role->isUniteRechercheDependant():
diff --git a/module/Application/src/Application/Service/ListeDiffusion/Address/ListeDiffusionAddressGenerator.php b/module/Application/src/Application/Service/ListeDiffusion/Address/ListeDiffusionAddressGenerator.php
index ec6cecb08..91abd6a1b 100644
--- a/module/Application/src/Application/Service/ListeDiffusion/Address/ListeDiffusionAddressGenerator.php
+++ b/module/Application/src/Application/Service/ListeDiffusion/Address/ListeDiffusionAddressGenerator.php
@@ -128,10 +128,10 @@ class ListeDiffusionAddressGenerator
             return null;
         }
 
-        Assert::notEmpty($this->ecoleDoctorale->getSigle(),
+        Assert::notEmpty($this->ecoleDoctorale->getStructure()->getSigle(),
             "Ecole doctorale n°{$this->ecoleDoctorale->getId()} sans sigle");
 
-        return trim(str_replace(str_split(' -_'), '', $this->ecoleDoctorale->getSigle())); // ex: 'ED590MIIS'
+        return trim(str_replace(str_split(' -_'), '', $this->ecoleDoctorale->getStructure()->getSigle())); // ex: 'ED590MIIS'
     }
 
     /**
diff --git a/module/Application/src/Application/Service/Role/RoleService.php b/module/Application/src/Application/Service/Role/RoleService.php
index 1c666b6a6..21e3bbec7 100644
--- a/module/Application/src/Application/Service/Role/RoleService.php
+++ b/module/Application/src/Application/Service/Role/RoleService.php
@@ -264,7 +264,7 @@ class RoleService extends BaseService
                 $roleId = $roleModele->getLibelle() . " " . $structure->getStructure()->getCode();
             } else {
                 $sourceCode = $this->sourceCodeStringHelper->addDefaultPrefixTo($roleModele->getRoleCode() . "_" . $structure->getSourceCode());
-                $roleId = $roleModele->getLibelle() . " " . $structure->getSigle();
+                $roleId = $roleModele->getLibelle() . " " . $structure->getStructure()->getSigle();
             }
 
             $role = $this->createRole($roleModele->getRoleCode(), $roleModele->getLibelle(), $sourceCode);
diff --git a/module/Application/view/application/ecole-doctorale/information.phtml b/module/Application/view/application/ecole-doctorale/information.phtml
index c7ef6f1d1..e92aa85f3 100644
--- a/module/Application/view/application/ecole-doctorale/information.phtml
+++ b/module/Application/view/application/ecole-doctorale/information.phtml
@@ -31,7 +31,7 @@ $structure = $ecole->getStructure();
 ?>
 
 <h1 class="page-header">
-    École doctorale &laquo; <?php echo $ecole->getLibelle(); ?> &raquo;
+    École doctorale &laquo; <?php echo $ecole->getStructure()->getLibelle(); ?> &raquo;
 </h1>
 
 <?php echo $this->messenger()->addMessagesFromFlashMessengerWithNoNamespace() ?>
@@ -89,9 +89,9 @@ $structure = $ecole->getStructure();
             <div class="col-md-6">
                 <dl>
                     <dt> Libelle :</dt>
-                    <dd>    <?php echo $ecole->getLibelle(); ?>     </dd>
+                    <dd>    <?php echo $ecole->getStructure()->getLibelle(); ?>     </dd>
                     <dt> Sigle :</dt>
-                    <dd>    <?php echo $ecole->getSigle(); ?>       </dd>
+                    <dd>    <?php echo $ecole->getStructure()->getSigle(); ?>       </dd>
                     <dt> Code :</dt>
                     <dd>    <?php echo $ecole->getStructure()->getCode(); ?>        </dd>
                     <dt> Id REF :</dt>
diff --git a/module/Application/view/application/index/partial/soutenances.phtml b/module/Application/view/application/index/partial/soutenances.phtml
index 1d95e0ce5..b2d8bb4f9 100644
--- a/module/Application/view/application/index/partial/soutenances.phtml
+++ b/module/Application/view/application/index/partial/soutenances.phtml
@@ -13,7 +13,7 @@ use Structure\Entity\Db\EcoleDoctorale;
             <li>
                 <a
                    href="<?php echo $this->url('soutenances-par-ecole-doctorale', ['ecole' => $ecole->getId()], [], true); ?>"
-                ><?php echo ($ecole->getSigle())??$ecole->getLibelle(); ?></a>
+                ><?php echo ($ecole->getStructure()->getSigle())??$ecole->getStructure()->getLibelle(); ?></a>
             </li>
         <?php endforeach; ?>
     </ul>
diff --git a/module/Application/view/application/rapport/partial/rapports-table.phtml b/module/Application/view/application/rapport/partial/rapports-table.phtml
index e4f6d6b90..0ed06b95d 100644
--- a/module/Application/view/application/rapport/partial/rapports-table.phtml
+++ b/module/Application/view/application/rapport/partial/rapports-table.phtml
@@ -163,7 +163,7 @@ $acteursFormatterCodirecteurs->asSeparated()
 
             <?php if ($displayEtablissement): ?>
             <td>
-                <abbr title="<?php echo $these->getEtablissement()->getLibelle() ?>">
+                <abbr title="<?php echo $these->getEtablissement()->getStructure()->getLibelle() ?>">
                     <?php echo $these->getEtablissement()->getCode() ?>
                 </abbr>
             </td>
@@ -206,7 +206,7 @@ $acteursFormatterCodirecteurs->asSeparated()
             <?php if ($displayEcoleDoctorale): ?>
             <td>
                 <?php if ($ed = $these->getEcoleDoctorale()): ?>
-                    <abbr title="<?php echo $ed->getLibelle() ?>">
+                    <abbr title="<?php echo $ed->getStructure()->getLibelle() ?>">
                         <?php echo $ed->getStructure()->getCode(); ?>
                     </abbr>
                 <?php endif ?>
@@ -216,7 +216,7 @@ $acteursFormatterCodirecteurs->asSeparated()
             <?php if ($displayUniteRecherche): ?>
             <td>
                 <?php if ($ur = $these->getUniteRecherche()): ?>
-                    <abbr title="<?php echo $ur->getLibelle() ?>">
+                    <abbr title="<?php echo $ur->getStructure()->getLibelle() ?>">
                         <?php echo $ur->getStructure()->getCode(); ?>
                     </abbr>
                 <?php endif ?>
diff --git a/module/Application/view/application/role/index.phtml b/module/Application/view/application/role/index.phtml
index 64c811c64..a1ab600c5 100644
--- a/module/Application/view/application/role/index.phtml
+++ b/module/Application/view/application/role/index.phtml
@@ -18,7 +18,7 @@ use Application\Entity\Db\Role;
 <?php foreach ($etablissements as $etablissement): ?>
     <?php $roles = $mappedRoles[$etablissement->getStructure()->getCode()]; ?>
     <h2>
-        <?php echo $etablissement->getLibelle(); ?>
+        <?php echo $etablissement->getStructure()->getLibelle(); ?>
         <span class="badge bg-secondary">
             <?php echo count($roles); ?>
         </span>
diff --git a/module/Application/view/application/statistique/index.phtml b/module/Application/view/application/statistique/index.phtml
index 578a061aa..1b1e1521d 100644
--- a/module/Application/view/application/statistique/index.phtml
+++ b/module/Application/view/application/statistique/index.phtml
@@ -76,21 +76,21 @@ $this->headTitle($this->translate("Statistiques"));
                     //null option
                     $("select#structure_id").append(new Option(("Selectionner un établissement ... "), null, false, true));
                     <?php foreach ($etablissements as $structureConcrete) : ?>
-                        $("select#structure_id").append(new Option(<?php echo '"'.$structureConcrete->getLibelle().'"'; ?> , <?php echo $structureConcrete->getId(); ?>, false, false));
+                        $("select#structure_id").append(new Option(<?php echo '"'.$structureConcrete->getStructure()->getLibelle().'"'; ?> , <?php echo $structureConcrete->getId(); ?>, false, false));
                     <?php endforeach; ?>
                     break;
                 case "ED" :
                     //null option
                     $("select#structure_id").append(new Option(("Selectionner une école doctorale ... "), null, false, true));
                     <?php foreach ($ecoles as $structureConcrete) : ?>
-                        $("select#structure_id").append(new Option(<?php echo '"'.$structureConcrete->getLibelle().'"'; ?> , <?php echo $structureConcrete->getId(); ?>, false, false));
+                        $("select#structure_id").append(new Option(<?php echo '"'.$structureConcrete->getStructure()->getLibelle().'"'; ?> , <?php echo $structureConcrete->getId(); ?>, false, false));
                     <?php endforeach; ?>
                     break;
                 case "UR" :
                     //null option
                     $("select#structure_id").append(new Option(("Selectionner une unité de recherche ... "), null, false, true));
                     <?php foreach ($unites as $structureConcrete) : ?>
-                        $("select#structure_id").append(new Option(<?php echo '"'.$structureConcrete->getLibelle().'"'; ?> , <?php echo $structureConcrete->getId(); ?>, false, false));
+                        $("select#structure_id").append(new Option(<?php echo '"'.$structureConcrete->getStructure()->getLibelle().'"'; ?> , <?php echo $structureConcrete->getId(); ?>, false, false));
                     <?php endforeach; ?>
                     break;
             }
diff --git a/module/Application/view/application/tableau-de-bord/partial/form-filtrage.phtml b/module/Application/view/application/tableau-de-bord/partial/form-filtrage.phtml
index 6f708df2a..0fc899b3c 100644
--- a/module/Application/view/application/tableau-de-bord/partial/form-filtrage.phtml
+++ b/module/Application/view/application/tableau-de-bord/partial/form-filtrage.phtml
@@ -25,7 +25,7 @@ $paramEtablissements = [];
 $paramEtablissements[] = ['value' => '',                             'label' => $this->translate("Tous") ];
 /** @var Etablissement[] $etablissements */
 foreach ($etablissements as $etablissement) {
-    $paramEtablissements[] = ['value' => $v = $etablissement->getStructure()->getCode(), 'label' => $etablissement->getSigle() ];
+    $paramEtablissements[] = ['value' => $v = $etablissement->getStructure()->getCode(), 'label' => $etablissement->getStructure()->getSigle() ];
 }
 
 echo $this->filterPanel([
diff --git a/module/Application/view/application/unite-recherche/information.phtml b/module/Application/view/application/unite-recherche/information.phtml
index 720a825aa..96b525c50 100644
--- a/module/Application/view/application/unite-recherche/information.phtml
+++ b/module/Application/view/application/unite-recherche/information.phtml
@@ -31,7 +31,7 @@ $structure = $unite->getStructure();
 ?>
 
 <h1 class="page-header">
-    Unité de recherche &laquo; <?php echo $unite->getLibelle(); ?> &raquo;
+    Unité de recherche &laquo; <?php echo $unite->getStructure()->getLibelle(); ?> &raquo;
 </h1>
 
 <?php echo $this->messenger()->addMessagesFromFlashMessengerWithNoNamespace() ?>
@@ -89,9 +89,9 @@ $structure = $unite->getStructure();
             <div class="col-md-8">
                 <dl>
                     <dt> Libelle :</dt>
-                    <dd>    <?php echo $unite->getLibelle(); ?>     </dd>
+                    <dd>    <?php echo $unite->getStructure()->getLibelle(); ?>     </dd>
                     <dt> Sigle :</dt>
-                    <dd>    <?php echo $unite->getSigle(); ?>       </dd>
+                    <dd>    <?php echo $unite->getStructure()->getSigle(); ?>       </dd>
                     <dt> Code :</dt>
                     <dd>    <?php echo $unite->getStructure()->getCode(); ?>        </dd>
                     <dt> Id REF: </dt>
@@ -108,7 +108,7 @@ $structure = $unite->getStructure();
                     <dd>
                         <ul>
                             <?php foreach ($etablissementsRattachements as $etablissementRattachement) : ?>
-                                <li> <?php echo $etablissementRattachement->getEtablissement()->getLibelle(); ?></li>
+                                <li> <?php echo $etablissementRattachement->getEtablissement()->getStructure()->getLibelle(); ?></li>
                             <?php endforeach; ?>
                         </ul>
                     </dd>
diff --git a/module/Application/view/application/utilisateur/gerer-utilisateur.phtml b/module/Application/view/application/utilisateur/gerer-utilisateur.phtml
index 4fa1f10c1..9d7631559 100644
--- a/module/Application/view/application/utilisateur/gerer-utilisateur.phtml
+++ b/module/Application/view/application/utilisateur/gerer-utilisateur.phtml
@@ -85,7 +85,7 @@ use Application\Entity\Db\Utilisateur;
                         </td>
                         <td>
                             <?php if ($acteur->getEtablissement() !== null) : ?>
-                                <?php echo $acteur->getEtablissement()->getLibelle(); ?>
+                                <?php echo $acteur->getEtablissement()->getStructure()->getLibelle(); ?>
                             <?php else : ?>
                                 Aucun établissement
                             <?php endif; ?>
diff --git a/module/Application/view/application/utilisateur/lier-individu.phtml b/module/Application/view/application/utilisateur/lier-individu.phtml
index 6345c8b15..f07075c92 100644
--- a/module/Application/view/application/utilisateur/lier-individu.phtml
+++ b/module/Application/view/application/utilisateur/lier-individu.phtml
@@ -141,7 +141,7 @@ use UnicaenApp\Form\Element\SearchAndSelect;
                                 </td>
                                 <td>
                                     <?php if ($acteur->getEtablissement() !== null) : ?>
-                                        <?php echo $acteur->getEtablissement()->getLibelle(); ?>
+                                        <?php echo $acteur->getEtablissement()->getStructure()->getLibelle(); ?>
                                     <?php else : ?>
                                         Aucun établissement
                                     <?php endif; ?>
diff --git a/module/Fichier/src/Fichier/Service/Fichier/FichierStorageService.php b/module/Fichier/src/Fichier/Service/Fichier/FichierStorageService.php
index 14870e847..ec8008ede 100644
--- a/module/Fichier/src/Fichier/Service/Fichier/FichierStorageService.php
+++ b/module/Fichier/src/Fichier/Service/Fichier/FichierStorageService.php
@@ -2,20 +2,14 @@
 
 namespace Fichier\Service\Fichier;
 
-use Fichier\Exporter\PageFichierIntrouvablePdfExporterTrait;
-use InvalidArgumentException;
-use Structure\Entity\Db\EcoleDoctorale;
-use Structure\Entity\Db\Etablissement;
-use Structure\Entity\Db\Structure;
-use Structure\Entity\Db\StructureConcreteInterface;
-use Structure\Entity\Db\StructureInterface;
-use Structure\Entity\Db\UniteRecherche;
 use Fichier\Entity\Db\Fichier;
+use Fichier\Exporter\PageFichierIntrouvablePdfExporterTrait;
 use Fichier\Service\Storage\Adapter\Exception\StorageAdapterException;
 use Fichier\Service\Storage\Adapter\StorageAdapterInterface;
 use Generator;
+use InvalidArgumentException;
 use RuntimeException;
-use UnexpectedValueException;
+use Structure\Entity\Db\StructureInterface;
 use UnicaenApp\Util;
 
 class FichierStorageService
@@ -188,23 +182,16 @@ class FichierStorageService
      */
     private function computeDirectoryNameForLogoStructure(StructureInterface $structure): string
     {
+        $type = $structure->getTypeStructure();
         $dir = null;
 
         // sous-répertoire identifiant le type de structure
-        if ($structure instanceof EcoleDoctorale) {
+        if ($type->isEtablissement()) {
+            $dir = self::DIR_ETAB;
+        } elseif ($type->isEcoleDoctorale()) {
             $dir = self::DIR_ED;
-        } elseif ($structure instanceof UniteRecherche) {
+        } elseif ($type->isUniteRecherche()) {
             $dir = self::DIR_UR;
-        } elseif ($structure instanceof Etablissement) {
-            $dir = self::DIR_ETAB;
-        } elseif ($structure instanceof Structure) {
-            if ($structure->getTypeStructure()->isEtablissement()) {
-                $dir = self::DIR_ETAB;
-            } elseif ($structure->getTypeStructure()->isEcoleDoctorale()) {
-                $dir = self::DIR_ED;
-            } elseif ($structure->getTypeStructure()->isUniteRecherche()) {
-                $dir = self::DIR_UR;
-            }
         }
         if ($dir === null) {
             throw new RuntimeException("Structure spécifiée imprévue.");
@@ -252,12 +239,6 @@ class FichierStorageService
 
         $name = $structure->getCode();
 
-        if ($structure instanceof StructureConcreteInterface) {
-            if ($type = $structure->getStructure()->getTypeStructure()) {
-                $name = $type->getCode() . '-' . $name;
-            }
-        }
-
         $name = str_replace(["'", ':'], '_', $name);
         $name = str_replace(' ', '', $name);
 
diff --git a/module/Formation/src/Formation/Controller/InscriptionController.php b/module/Formation/src/Formation/Controller/InscriptionController.php
index 4467e8e81..c1c573692 100644
--- a/module/Formation/src/Formation/Controller/InscriptionController.php
+++ b/module/Formation/src/Formation/Controller/InscriptionController.php
@@ -214,13 +214,13 @@ class InscriptionController extends AbstractController
 
         $logos = [];
         try {
-            $logos['site'] = $this->fichierStorageService->getFileForLogoStructure($session->getSite());
+            $logos['site'] = $this->fichierStorageService->getFileForLogoStructure($session->getSite()->getStructure());
         } catch (StorageAdapterException $e) {
             $logos['site'] = null;
         }
         if ($comue = $this->etablissementService->fetchEtablissementComue()) {
             try {
-                $logos['comue'] = $this->fichierStorageService->getFileForLogoStructure($comue);
+                $logos['comue'] = $this->fichierStorageService->getFileForLogoStructure($comue->getStructure());
             } catch (StorageAdapterException $e) {
                 $logos['comue'] = null;
             }
@@ -247,13 +247,13 @@ class InscriptionController extends AbstractController
 
         $logos = [];
         try {
-            $logos['site'] = $this->fichierStorageService->getFileForLogoStructure($session->getSite());
+            $logos['site'] = $this->fichierStorageService->getFileForLogoStructure($session->getSite()->getStructure());
         } catch (StorageAdapterException $e) {
             $logos['site'] = null;
         }
         if ($comue = $this->etablissementService->fetchEtablissementComue()) {
             try {
-                $logos['comue'] = $this->fichierStorageService->getFileForLogoStructure($comue);
+                $logos['comue'] = $this->fichierStorageService->getFileForLogoStructure($comue->getStructure());
             } catch (StorageAdapterException $e) {
                 $logos['comue'] = null;
             }
diff --git a/module/Formation/src/Formation/Controller/SeanceController.php b/module/Formation/src/Formation/Controller/SeanceController.php
index a2edb80b2..c2acbe3cd 100644
--- a/module/Formation/src/Formation/Controller/SeanceController.php
+++ b/module/Formation/src/Formation/Controller/SeanceController.php
@@ -146,13 +146,13 @@ class SeanceController extends AbstractController
 
         $logos = [];
         try {
-            $logos['site'] = $this->fichierStorageService->getFileForLogoStructure($session->getSite());
+            $logos['site'] = $this->fichierStorageService->getFileForLogoStructure($session->getSite()->getStructure());
         } catch (StorageAdapterException $e) {
             $logos['site'] = null;
         }
         if ($comue = $this->etablissementService->fetchEtablissementComue()) {
             try {
-                $logos['comue'] = $this->fichierStorageService->getFileForLogoStructure($comue);
+                $logos['comue'] = $this->fichierStorageService->getFileForLogoStructure($comue->getStructure());
             } catch (StorageAdapterException $e) {
                 $logos['comue'] = null;
             }
diff --git a/module/Formation/src/Formation/Controller/SessionController.php b/module/Formation/src/Formation/Controller/SessionController.php
index 2160f4caf..52049b940 100644
--- a/module/Formation/src/Formation/Controller/SessionController.php
+++ b/module/Formation/src/Formation/Controller/SessionController.php
@@ -304,9 +304,9 @@ class SessionController extends AbstractController
         foreach ($inscriptions as $inscription) {
             $doctorant = $inscription->getDoctorant();
             $theses = array_filter($doctorant->getTheses(), function (These $t) { return $t->getEtatThese() === These::ETAT_EN_COURS; });
-            $etablissements = array_map(function (These $t) { return ($t->getEtablissement())?$t->getEtablissement()->getLibelle():"Établissement non renseigné";}, $theses);
-            $ecoles = array_map(function (These $t) { return ($t->getEcoleDoctorale())?$t->getEcoleDoctorale()->getLibelle():"École doctorale non renseignée";}, $theses);
-            $unites = array_map(function (These $t) { return ($t->getUniteRecherche())?$t->getUniteRecherche()->getLibelle():"Unité de recherche non renseignée";}, $theses);
+            $etablissements = array_map(function (These $t) { return ($t->getEtablissement())?$t->getEtablissement()->getStructure()->getLibelle():"Établissement non renseigné";}, $theses);
+            $ecoles = array_map(function (These $t) { return ($t->getEcoleDoctorale())?$t->getEcoleDoctorale()->getStructure()->getLibelle():"École doctorale non renseignée";}, $theses);
+            $unites = array_map(function (These $t) { return ($t->getUniteRecherche())?$t->getUniteRecherche()->getStructure()->getLibelle():"Unité de recherche non renseignée";}, $theses);
             $entry = [
                 'Liste' => $inscription->getListe(),
                 'Dénomination étudiant' => $doctorant->getIndividu()->getNomComplet(),
@@ -339,14 +339,14 @@ class SessionController extends AbstractController
 
         $logos = [];
         try {
-            $logos['site'] = $this->fichierStorageService->getFileForLogoStructure($session->getSite());
+            $logos['site'] = $this->fichierStorageService->getFileForLogoStructure($session->getSite()->getStructure());
         } catch (StorageAdapterException $e) {
             $logos['site'] = null;
         }
 
         if ($comue = $this->etablissementService->fetchEtablissementComue()) {
             try {
-                $logos['comue'] = $this->fichierStorageService->getFileForLogoStructure($comue);
+                $logos['comue'] = $this->fichierStorageService->getFileForLogoStructure($comue->getStructure());
             } catch (StorageAdapterException $e) {
                 $logos['comue'] = null;
             }
diff --git a/module/Formation/src/Formation/Service/Exporter/Emargement/emargement.phtml b/module/Formation/src/Formation/Service/Exporter/Emargement/emargement.phtml
index bc61a9cd3..6bc5f2e56 100644
--- a/module/Formation/src/Formation/Service/Exporter/Emargement/emargement.phtml
+++ b/module/Formation/src/Formation/Service/Exporter/Emargement/emargement.phtml
@@ -61,11 +61,11 @@ $formateurs = $session->getFormateurs();
             $theses = array_filter($theses, function(These $t) { return $t->getEtatThese() === These::ETAT_EN_COURS;});
             $etablissements = []; $ecoles = []; $unites = [];
             foreach ($theses as $these) {
-                $etablissement = ($these->getEtablissement())?$these->getEtablissement()->getSigle():"Établissement non renseigné";
+                $etablissement = ($these->getEtablissement())?$these->getEtablissement()->getStructure()->getSigle():"Établissement non renseigné";
                 $etablissements[$etablissement] = $etablissement;
-                $ecole = ($these->getEcoleDoctorale())?$these->getEcoleDoctorale()->getSigle():"École doctorale non renseignée";
+                $ecole = ($these->getEcoleDoctorale())?$these->getEcoleDoctorale()->getStructure()->getSigle():"École doctorale non renseignée";
                 $ecoles[$ecole] = $ecole;
-                $unite = ($these->getUniteRecherche())?$these->getUniteRecherche()->getSigle():"Unité de recherche non renseignée";
+                $unite = ($these->getUniteRecherche())?$these->getUniteRecherche()->getStructure()->getSigle():"Unité de recherche non renseignée";
                 $unites[$unite] = $unite;
             }
         ?>
diff --git a/module/Formation/src/Formation/View/Helper/partial/site.phtml b/module/Formation/src/Formation/View/Helper/partial/site.phtml
index 746759a67..42f1ce177 100644
--- a/module/Formation/src/Formation/View/Helper/partial/site.phtml
+++ b/module/Formation/src/Formation/View/Helper/partial/site.phtml
@@ -10,9 +10,9 @@ use Structure\Entity\Db\Etablissement;
 ?>
 
 <?php if ($site !== null) : ?>
-    <span class="site" title="<?php echo $site->getLibelle(); ?>"
+    <span class="site" title="<?php echo $site->getStructure()->getLibelle(); ?>"
           data-bs-toggle="tooltip" data-bs-html="true">
-        <?php echo $site->getSigle(); ?>
+        <?php echo $site->getStructure()->getSigle(); ?>
     </span>
 <?php else : ?>
     <span class="site" title="Formation dispensée pour tous les sites"
diff --git a/module/Indicateur/src/Indicateur/Controller/IndicateurController.php b/module/Indicateur/src/Indicateur/Controller/IndicateurController.php
index b1e40f74c..3516ede67 100644
--- a/module/Indicateur/src/Indicateur/Controller/IndicateurController.php
+++ b/module/Indicateur/src/Indicateur/Controller/IndicateurController.php
@@ -226,22 +226,22 @@ class IndicateurController extends AbstractActionController {
                     case 'Établissement d\'inscription' :
                         if ($entry[$fct]) {
                             /** @var Etablissement $etablissement */
-                            $etablissement = $this->getStructureService()->getStructuresConcreteByTypeAndStructureConcreteId(TypeStructure::CODE_ETABLISSEMENT, $entry[$fct]);
-                            $value = $etablissement->getLibelle();
+                            $etablissement = $this->getStructureService()->getStructureConcreteByTypeAndStructureConcreteId(TypeStructure::CODE_ETABLISSEMENT, $entry[$fct]);
+                            $value = $etablissement->getStructure()->getLibelle();
                         } else $value .= "";
                         break;
                     case 'École doctorale' :
                         if ($entry[$fct]) {
                             /** @var EcoleDoctorale $ecole */
-                            $ecole = $this->getStructureService()->getStructuresConcreteByTypeAndStructureConcreteId(TypeStructure::CODE_ECOLE_DOCTORALE, $entry[$fct]);
-                            $value = $ecole->getLibelle();
+                            $ecole = $this->getStructureService()->getStructureConcreteByTypeAndStructureConcreteId(TypeStructure::CODE_ECOLE_DOCTORALE, $entry[$fct]);
+                            $value = $ecole->getStructure()->getLibelle();
                         } else $value .= "";
                         break;
                     case 'Unité de recherche' :
                         if ($entry[$fct]) {
                             /** @var UniteRecherche $unite */
-                            $unite = $this->getStructureService()->getStructuresConcreteByTypeAndStructureConcreteId(TypeStructure::CODE_UNITE_RECHERCHE, $entry[$fct]);
-                            $value = $unite->getLibelle();
+                            $unite = $this->getStructureService()->getStructureConcreteByTypeAndStructureConcreteId(TypeStructure::CODE_UNITE_RECHERCHE, $entry[$fct]);
+                            $value = $unite->getStructure()->getLibelle();
                         } else $value .= "";
                         break;
                     default:
diff --git a/module/Indicateur/src/Indicateur/View/Helper/CompletIndicateurTheseHelper.php b/module/Indicateur/src/Indicateur/View/Helper/CompletIndicateurTheseHelper.php
index 82782a269..17fef64a1 100644
--- a/module/Indicateur/src/Indicateur/View/Helper/CompletIndicateurTheseHelper.php
+++ b/module/Indicateur/src/Indicateur/View/Helper/CompletIndicateurTheseHelper.php
@@ -54,15 +54,15 @@ class CompletIndicateurTheseHelper extends AbstractHelper
                         case 'Établissement d\'inscription':
                             if ($entry[$valeur]) {
                                 /** @var Etablissement $etablissement */
-                                $etablissement = $structureService->getStructuresConcreteByTypeAndStructureConcreteId(TypeStructure::CODE_ETABLISSEMENT, $entry[$valeur]);
-                                $html .= '<abbr title="' . $etablissement->getLibelle() . '">' . $etablissement->getSigle() . '</abbr>';
+                                $etablissement = $structureService->getStructureConcreteByTypeAndStructureConcreteId(TypeStructure::CODE_ETABLISSEMENT, $entry[$valeur]);
+                                $html .= '<abbr title="' . $etablissement->getStructure()->getLibelle() . '">' . $etablissement->getStructure()->getSigle() . '</abbr>';
                             } else $html .= "---";
                             break;
                         case 'École doctorale':
                             if ($entry[$valeur]) {
                                 /** @var EcoleDoctorale $ecole */
-                                $ecole = $structureService->getStructuresConcreteByTypeAndStructureConcreteId(TypeStructure::CODE_ECOLE_DOCTORALE, $entry[$valeur]);
-                                $html .= '<abbr title="' . $ecole->getLibelle() . '">' . $ecole->getSigle() . '</abbr>';
+                                $ecole = $structureService->getStructureConcreteByTypeAndStructureConcreteId(TypeStructure::CODE_ECOLE_DOCTORALE, $entry[$valeur]);
+                                $html .= '<abbr title="' . $ecole->getStructure()->getLibelle() . '">' . $ecole->getStructure()->getSigle() . '</abbr>';
                             } else {
                                 $html .= "---";
                             }
@@ -70,8 +70,8 @@ class CompletIndicateurTheseHelper extends AbstractHelper
                         case 'Unité de recherche':
                             if ($entry[$valeur]) {
                                 /** @var UniteRecherche $unite */
-                                $unite = $structureService->getStructuresConcreteByTypeAndStructureConcreteId(TypeStructure::CODE_UNITE_RECHERCHE, $entry[$valeur]);
-                                $html .= '<abbr title="' . $unite->getLibelle() . '">' . $unite->getSigle() . '</abbr>';
+                                $unite = $structureService->getStructureConcreteByTypeAndStructureConcreteId(TypeStructure::CODE_UNITE_RECHERCHE, $entry[$valeur]);
+                                $html .= '<abbr title="' . $unite->getStructure()->getLibelle() . '">' . $unite->getStructure()->getSigle() . '</abbr>';
                             } else {
                                 $html .= "---";
                             }
diff --git a/module/Individu/src/Individu/Form/IndividuCompl/IndividuComplHydrator.php b/module/Individu/src/Individu/Form/IndividuCompl/IndividuComplHydrator.php
index 999e8b80d..e390629f2 100644
--- a/module/Individu/src/Individu/Form/IndividuCompl/IndividuComplHydrator.php
+++ b/module/Individu/src/Individu/Form/IndividuCompl/IndividuComplHydrator.php
@@ -27,11 +27,11 @@ class IndividuComplHydrator implements HydratorInterface {
             'email' => ($object->getEmail())?:null,
             'etablissement' => [
                 'id' => ($object->getEtablissement())?$object->getEtablissement()->getId():null,
-                'label' => ($object->getEtablissement())?$object->getEtablissement()->getLibelle():null,
+                'label' => ($object->getEtablissement())?$object->getEtablissement()->getStructure()->getLibelle():null,
             ],
             'uniteRecherche' => [
                 'id' => ($object->getUniteRecherche())?$object->getUniteRecherche()->getId():null,
-                'label' => ($object->getUniteRecherche())?$object->getUniteRecherche()->getLibelle():null,
+                'label' => ($object->getUniteRecherche())?$object->getUniteRecherche()->getStructure()->getLibelle():null,
             ],
         ];
         return $data;
diff --git a/module/Individu/view/individu/individu-compl/index.phtml b/module/Individu/view/individu/individu-compl/index.phtml
index 98d43b411..74354e805 100644
--- a/module/Individu/view/individu/individu-compl/index.phtml
+++ b/module/Individu/view/individu/individu-compl/index.phtml
@@ -73,14 +73,14 @@ $canHistoriser = $canAjouter;
             </td>
             <td>
                 <?php if ($complement->getEtablissement()) : ?>
-                    <?php echo $complement->getEtablissement()->getLibelle(); ?>
+                    <?php echo $complement->getEtablissement()->getStructure()->getLibelle(); ?>
                 <?php else: ?>
                     (Non renseigné&middot;e)
                 <?php endif; ?>
             </td>
             <td>
                 <?php if ($complement->getUniteRecherche()) : ?>
-                    <?php echo $complement->getUniteRecherche()->getLibelle(); ?>
+                    <?php echo $complement->getUniteRecherche()->getStructure()->getLibelle(); ?>
                 <?php else: ?>
                     (Non renseigné&middot;e)
                 <?php endif; ?>
diff --git a/module/Individu/view/individu/individu/partial/roles.phtml b/module/Individu/view/individu/individu/partial/roles.phtml
index 8020eefc2..de6dc7999 100644
--- a/module/Individu/view/individu/individu/partial/roles.phtml
+++ b/module/Individu/view/individu/individu/partial/roles.phtml
@@ -113,7 +113,7 @@ function generateSelect($structures, $id, $roles = null)
     foreach ($structuresValides as $structure) {
         $texte .= '<option value="' . $structure->getStructure()->getId() . '">';
         $texte .= $structure->getStructure()->getLibelle();
-        $texte .= ' (' . $structure->getSigle() . ')';
+        $texte .= ' (' . $structure->getStructure()->getSigle() . ')';
         $texte .= '</option>';
     }
     $texte .= "</select>";
diff --git a/module/RapportActivite/src/RapportActivite/Service/RapportActiviteService.php b/module/RapportActivite/src/RapportActivite/Service/RapportActiviteService.php
index 45b290339..fbd38532f 100644
--- a/module/RapportActivite/src/RapportActivite/Service/RapportActiviteService.php
+++ b/module/RapportActivite/src/RapportActivite/Service/RapportActiviteService.php
@@ -297,7 +297,7 @@ class RapportActiviteService extends BaseService
         }
 
         // structures
-        $exportData->etablissement = $etablissement->getLibelle();
+        $exportData->etablissement = $etablissement->getStructure()->getLibelle();
         $exportData->ecoleDoctorale = $ed->getStructure()->getLibelle();
         $exportData->uniteRecherche = $ur->getStructure()->getLibelle();
 
@@ -307,11 +307,11 @@ class RapportActiviteService extends BaseService
         $exportData->useCOMUE = false;
         if ($comue = $this->etablissementService->fetchEtablissementComue()) {
             $exportData->useCOMUE = true;
-            if (!$comue->getCheminLogo()) {
+            if (!$comue->getStructure()->getCheminLogo()) {
                 throw new PageValidationExportDataException("La COMUE '{$comue}' n'a aucun logo !");
             }
             try {
-                $exportData->logoCOMUE = $this->fichierStorageService->getFileForLogoStructure($comue);
+                $exportData->logoCOMUE = $this->fichierStorageService->getFileForLogoStructure($comue->getStructure());
             } catch (StorageAdapterException $e) {
                 throw new PageValidationExportDataException(
                     "Accès impossible au logo de la COMUE '{$comue}' : " . $e->getMessage());
@@ -319,33 +319,33 @@ class RapportActiviteService extends BaseService
         }
 
         // logo etablissement
-        if (!$etablissement->getCheminLogo()) {
+        if (!$etablissement->getStructure()->getCheminLogo()) {
             throw new PageValidationExportDataException("L'établissement '{$etablissement}' n'a aucun logo !");
         }
         try {
-            $exportData->logoEtablissement = $this->fichierStorageService->getFileForLogoStructure($etablissement);
+            $exportData->logoEtablissement = $this->fichierStorageService->getFileForLogoStructure($etablissement->getStructure());
         } catch (StorageAdapterException $e) {
             throw new PageValidationExportDataException(
                 "Accès impossible au logo de l'établissement '{$etablissement}' : " . $e->getMessage());
         }
 
         // logo ED
-        if (!$ed->getCheminLogo()) {
+        if (!$ed->getStructure()->getCheminLogo()) {
             throw new PageValidationExportDataException("L'ED '{$ed}' n'a aucun logo !");
         }
         try {
-            $exportData->logoEcoleDoctorale = $this->fichierStorageService->getFileForLogoStructure($ed);
+            $exportData->logoEcoleDoctorale = $this->fichierStorageService->getFileForLogoStructure($ed->getStructure());
         } catch (StorageAdapterException $e) {
             throw new PageValidationExportDataException(
                 "Accès impossible au logo de l'ED '{$ed}' : " . $e->getMessage());
         }
 
         // logo UR
-        if (!$ur->getCheminLogo()) {
+        if (!$ur->getStructure()->getCheminLogo()) {
             throw new PageValidationExportDataException("L'UR '{$ur}' n'a aucun logo !");
         }
         try {
-            $exportData->logoUniteRecherche = $this->fichierStorageService->getFileForLogoStructure($ur);
+            $exportData->logoUniteRecherche = $this->fichierStorageService->getFileForLogoStructure($ur->getStructure());
         } catch (StorageAdapterException $e) {
             throw new PageValidationExportDataException(
                 "Accès impossible au logo de l'UR '{$ur}' : " . $e->getMessage());
diff --git a/module/RapportActivite/view/rapport-activite/partial/rapports-table.phtml b/module/RapportActivite/view/rapport-activite/partial/rapports-table.phtml
index 7f0c93b58..194a7208e 100644
--- a/module/RapportActivite/view/rapport-activite/partial/rapports-table.phtml
+++ b/module/RapportActivite/view/rapport-activite/partial/rapports-table.phtml
@@ -149,7 +149,7 @@ $ajaxModalEvent = 'EVENT_AVIS_SAISI';
 
             <?php if ($displayEtablissement): ?>
             <td>
-                <abbr title="<?php echo $these->getEtablissement()->getLibelle() ?>">
+                <abbr title="<?php echo $these->getEtablissement()->getStructure()->getLibelle() ?>">
                     <?php echo $these->getEtablissement()->getCode() ?>
                 </abbr>
             </td>
@@ -196,7 +196,7 @@ $ajaxModalEvent = 'EVENT_AVIS_SAISI';
             <?php if ($displayEcoleDoctorale): ?>
             <td>
                 <?php if ($ed = $these->getEcoleDoctorale()): ?>
-                    <abbr title="<?php echo $ed->getLibelle() ?>">
+                    <abbr title="<?php echo $ed->getStructure()->getLibelle() ?>">
                         <?php echo $ed->getStructure()->getCode(); ?>
                     </abbr>
                 <?php endif ?>
@@ -206,7 +206,7 @@ $ajaxModalEvent = 'EVENT_AVIS_SAISI';
             <?php if ($displayUniteRecherche): ?>
             <td>
                 <?php if ($ur = $these->getUniteRecherche()): ?>
-                    <abbr title="<?php echo $ur->getLibelle() ?>">
+                    <abbr title="<?php echo $ur->getStructure()->getLibelle() ?>">
                         <?php echo $ur->getStructure()->getCode(); ?>
                     </abbr>
                 <?php endif ?>
diff --git a/module/Soutenance/src/Soutenance/Controller/PresoutenanceController.php b/module/Soutenance/src/Soutenance/Controller/PresoutenanceController.php
index 8f84eb14a..2ff450f9e 100644
--- a/module/Soutenance/src/Soutenance/Controller/PresoutenanceController.php
+++ b/module/Soutenance/src/Soutenance/Controller/PresoutenanceController.php
@@ -444,7 +444,7 @@ class PresoutenanceController extends AbstractController
      */
     private function getVille(Etablissement $etablissement) : string
     {
-        switch ($etablissement->getSigle()) {
+        switch ($etablissement->getStructure()->getSigle()) {
             case "UCN" :
                 $ville = "Caen";
                 break;
diff --git a/module/Soutenance/src/Soutenance/Service/Exporter/Convocation/convocation_doctorant.phtml b/module/Soutenance/src/Soutenance/Service/Exporter/Convocation/convocation_doctorant.phtml
index 459bf5e32..7db0bafae 100644
--- a/module/Soutenance/src/Soutenance/Service/Exporter/Convocation/convocation_doctorant.phtml
+++ b/module/Soutenance/src/Soutenance/Service/Exporter/Convocation/convocation_doctorant.phtml
@@ -141,7 +141,7 @@ $civilite = ($these->getDoctorant()->getIndividu()->getCivilite() === 'M.')?"Mon
             <br/>
             <br/>
             Visa de l'établissement d'inscription du doctorant,<br/>
-            <?php echo $these->getEtablissement()->getLibelle(); ?>
+            <?php echo $these->getEtablissement()->getStructure()->getLibelle(); ?>
         </td>
     </tr>
     <tr>
diff --git a/module/Soutenance/src/Soutenance/Service/Exporter/Convocation/convocation_membre.phtml b/module/Soutenance/src/Soutenance/Service/Exporter/Convocation/convocation_membre.phtml
index a8ddc754c..7e977bbf9 100644
--- a/module/Soutenance/src/Soutenance/Service/Exporter/Convocation/convocation_membre.phtml
+++ b/module/Soutenance/src/Soutenance/Service/Exporter/Convocation/convocation_membre.phtml
@@ -105,7 +105,7 @@ Par décision en date du
                 Date manquante,
         </span>
 <?php endif; ?>
-le chef de l'établissement <?php echo  $these->getEtablissement()->getLibelle(); ?> vous a désigné<?php if($civilite==="Madame") echo "e"; ?>
+le chef de l'établissement <?php echo  $these->getEtablissement()->getStructure()->getLibelle(); ?> vous a désigné<?php if($civilite==="Madame") echo "e"; ?>
  pour participer au jury devant examiner les travaux de <?php echo $these->getDoctorant()->getIndividu()->getNomComplet(true); ?>
  en vue de l'obtention du diplôme : <br/>
 Doctorat en <?php echo $these->getLibelleDiscipline(); ?>.
@@ -172,7 +172,7 @@ $texte_directeur = implode(" et ", $encadrement);
             <br/>
             <br/>
             Visa de l'établissement d'inscription du doctorant,<br/>
-            <?php echo $these->getEtablissement()->getLibelle(); ?>
+            <?php echo $these->getEtablissement()->getStructure()->getLibelle(); ?>
         </td>
     </tr>
     <tr>
diff --git a/module/Soutenance/src/Soutenance/Service/Membre/MembreService.php b/module/Soutenance/src/Soutenance/Service/Membre/MembreService.php
index 7e55973d1..9716a4544 100644
--- a/module/Soutenance/src/Soutenance/Service/Membre/MembreService.php
+++ b/module/Soutenance/src/Soutenance/Service/Membre/MembreService.php
@@ -244,7 +244,7 @@ class MembreService {
         $membre->setGenre(($acteur->getIndividu()->estUneFemme())?"F":"H");
         $qualite = $this->getQualiteService()->getQualiteByLibelle($acteur->getQualite());
         $membre->setQualite(($qualite !== null)?$qualite:$inconnue);
-        $membre->setEtablissement(($acteur->getEtablissement())?$acteur->getEtablissement()->getLibelle():"Etablissement inconnu");
+        $membre->setEtablissement(($acteur->getEtablissement())?$acteur->getEtablissement()->getStructure()->getLibelle():"Etablissement inconnu");
         $membre->setRole(Membre::MEMBRE_JURY);
         $membre->setExterieur("non");
         $membre->setEmail($acteur->getIndividu()->getEmail());
diff --git a/module/Soutenance/src/Soutenance/Service/Proposition/PropositionService.php b/module/Soutenance/src/Soutenance/Service/Proposition/PropositionService.php
index ef013fef9..337cf1837 100644
--- a/module/Soutenance/src/Soutenance/Service/Proposition/PropositionService.php
+++ b/module/Soutenance/src/Soutenance/Service/Proposition/PropositionService.php
@@ -516,14 +516,14 @@ class PropositionService {
         $logos['COMUE'] = null;
         if ($comue = $this->getEtablissementService()->fetchEtablissementComue()) {
             try {
-                $logos['COMUE'] = $this->fichierStorageService->getFileForLogoStructure($comue);
+                $logos['COMUE'] = $this->fichierStorageService->getFileForLogoStructure($comue->getStructure());
             } catch (StorageAdapterException $e) {
                 $logos['COMUE'] = null;
             }
         }
 
         try {
-            $logos['ETAB'] = $this->fichierStorageService->getFileForLogoStructure($these->getEtablissement());
+            $logos['ETAB'] = $this->fichierStorageService->getFileForLogoStructure($these->getEtablissement()->getStructure());
         } catch (StorageAdapterException $e) {
             $logos['ETAB'] = null;
         }
diff --git a/module/Soutenance/src/Soutenance/Service/SignaturePresident/signature-president.phtml b/module/Soutenance/src/Soutenance/Service/SignaturePresident/signature-president.phtml
index 54be45a1a..ef17f0941 100644
--- a/module/Soutenance/src/Soutenance/Service/SignaturePresident/signature-president.phtml
+++ b/module/Soutenance/src/Soutenance/Service/SignaturePresident/signature-president.phtml
@@ -17,8 +17,8 @@ use Soutenance\Entity\Proposition;
  */
 
 $these = $proposition->getThese();
-$unite = ($these->getUniteRecherche())?$these->getUniteRecherche()->getLibelle():$these->getLibelleUniteRecherche();
-$ecole = ($these->getEcoleDoctorale())?$these->getEcoleDoctorale()->getLibelle():"Information manquante";
+$unite = ($these->getUniteRecherche())?$these->getUniteRecherche()->getStructure()->getLibelle():$these->getLibelleUniteRecherche();
+$ecole = ($these->getEcoleDoctorale())?$these->getEcoleDoctorale()->getStructure()->getLibelle():"Information manquante";
 ?>
 
 <style>
diff --git a/module/Soutenance/view/soutenance/index/index-structure.phtml b/module/Soutenance/view/soutenance/index/index-structure.phtml
index aebba475e..67e1d4248 100644
--- a/module/Soutenance/view/soutenance/index/index-structure.phtml
+++ b/module/Soutenance/view/soutenance/index/index-structure.phtml
@@ -95,9 +95,9 @@ $canSuppression = ($role->getCode() === Role::CODE_ADMIN_TECH);
                     <td>
                         <?php if ($these->getEtablissement()) : ?>
                             <span class="structure etablissement"
-                                  title="Établissement : <?php echo $these->getEtablissement()->getLibelle(); ?> (<?php echo $these->getEtablissement()->getCode(); ?>)"
+                                  title="Établissement : <?php echo $these->getEtablissement()->getStructure()->getLibelle(); ?> (<?php echo $these->getEtablissement()->getCode(); ?>)"
                             >
-                                <?php echo $these->getEtablissement()->getLibelle(); ?>
+                                <?php echo $these->getEtablissement()->getStructure()->getLibelle(); ?>
                             </span>
                         <?php else : ?>
                             <strong style="color:darkred;">
@@ -108,9 +108,9 @@ $canSuppression = ($role->getCode() === Role::CODE_ADMIN_TECH);
 
                         <?php if ($these->getEcoleDoctorale()) : ?>
                             <span class="structure ecole-doctorale"
-                                  title="École doctorale : <?php echo $these->getEcoleDoctorale()->getLibelle(); ?> <?php echo "(".$these->getEcoleDoctorale()->getSigle() .")"; ?>"
+                                  title="École doctorale : <?php echo $these->getEcoleDoctorale()->getStructure()->getLibelle(); ?> <?php echo "(".$these->getEcoleDoctorale()->getStructure()->getSigle() .")"; ?>"
                             >
-                                <?php echo $these->getEcoleDoctorale()->getLibelle(); ?>
+                                <?php echo $these->getEcoleDoctorale()->getStructure()->getLibelle(); ?>
                             </span>
                         <?php else : ?>
                             <strong style="color:darkred;">
@@ -121,9 +121,9 @@ $canSuppression = ($role->getCode() === Role::CODE_ADMIN_TECH);
 
                         <?php if ($these->getUniteRecherche()) : ?>
                             <span class="structure unite-recherche"
-                                  title="Unité de recherche : <?php echo $these->getUniteRecherche()->getLibelle(); ?> <?php echo "(".$these->getUniteRecherche()->getSigle() .")"; ?>"
+                                  title="Unité de recherche : <?php echo $these->getUniteRecherche()->getStructure()->getLibelle(); ?> <?php echo "(".$these->getUniteRecherche()->getStructure()->getSigle() .")"; ?>"
                             >
-                                <?php echo $these->getUniteRecherche()->getLibelle(); ?>
+                                <?php echo $these->getUniteRecherche()->getStructure()->getLibelle(); ?>
                             </span>
                         <?php else : ?>
                             <!-- Gestion des unités de recherche -->
diff --git a/module/Soutenance/view/soutenance/index/partial/filtre-proposition.phtml b/module/Soutenance/view/soutenance/index/partial/filtre-proposition.phtml
index a3cb9bd5e..edaf003fe 100644
--- a/module/Soutenance/view/soutenance/index/partial/filtre-proposition.phtml
+++ b/module/Soutenance/view/soutenance/index/partial/filtre-proposition.phtml
@@ -30,7 +30,7 @@ use Soutenance\Entity\Etat;
                     <option value="">Tous les établissements </option>
                     <?php foreach ($etablissements as $etablissement) : ?>
                         <option value="<?php echo $etablissement->getId(); ?>" <?php if ($etablissement->getId() == $etablissementId) echo " selected "; ?>>
-                            <?php echo $etablissement->getLibelle(); ?>
+                            <?php echo $etablissement->getStructure()->getLibelle(); ?>
                         </option>
                     <?php endforeach; ?>
                 </select>
@@ -41,8 +41,8 @@ use Soutenance\Entity\Etat;
                         <option value="">Toutes les écoles doctorales </option>
                         <?php foreach ($ecoles as $ecole) : ?>
                             <option value="<?php echo $ecole->getId(); ?>" <?php if ($ecole->getId() == $ecoleDoctoraleId) echo " selected "; ?>>
-                                <?php echo $ecole->getSigle(); ?> :
-                                <?php echo $ecole->getLibelle(); ?>
+                                <?php echo $ecole->getStructure()->getSigle(); ?> :
+                                <?php echo $ecole->getStructure()->getLibelle(); ?>
                             </option>
                         <?php endforeach; ?>
                     </select>
@@ -53,8 +53,8 @@ use Soutenance\Entity\Etat;
                         <option value="">Toutes les unités de recherche </option>
                         <?php foreach ($unites as $unite) : ?>
                             <option value="<?php echo $unite->getId(); ?>" <?php if ($unite->getId() == $uniteRechercheId) echo " selected "; ?>>
-                                <?php echo $unite->getSigle(); ?> :
-                                <?php echo $unite->getLibelle(); ?>
+                                <?php echo $unite->getStructure()->getSigle(); ?> :
+                                <?php echo $unite->getStructure()->getLibelle(); ?>
                             </option>
                         <?php endforeach; ?>
                     </select>
diff --git a/module/Soutenance/view/soutenance/notification/convocation-membre.phtml b/module/Soutenance/view/soutenance/notification/convocation-membre.phtml
index ab155aaa8..117de135e 100644
--- a/module/Soutenance/view/soutenance/notification/convocation-membre.phtml
+++ b/module/Soutenance/view/soutenance/notification/convocation-membre.phtml
@@ -34,7 +34,7 @@ Par décision en date du
                 Date manquante,
         </span>
 <?php endif; ?>
-le chef de l'établissement <?php echo  $these->getEtablissement()->getLibelle(); ?> vous a désigné<?php if($civilite==="Madame") echo "e"; ?>
+le chef de l'établissement <?php echo  $these->getEtablissement()->getStructure()->getLibelle(); ?> vous a désigné<?php if($civilite==="Madame") echo "e"; ?>
 pour participer au jury devant examiner les travaux de <?php echo $these->getDoctorant()->getIndividu()->getNomComplet(true); ?>
 en vue de l'obtention du diplôme : <br/>
 Doctorat en <?php echo $these->getLibelleDiscipline(); ?>.
diff --git a/module/Soutenance/view/soutenance/notification/validation-structure.phtml b/module/Soutenance/view/soutenance/notification/validation-structure.phtml
index 7b01d846a..324ab77da 100644
--- a/module/Soutenance/view/soutenance/notification/validation-structure.phtml
+++ b/module/Soutenance/view/soutenance/notification/validation-structure.phtml
@@ -64,7 +64,7 @@ $justification = true;
 
     <?php if ($panic) : ?>
         <p>
-            <strong>Aucun responsable de site n'a pu être trouvé pour le site '<?php echo $these->getEtablissement()->getLibelle(); ?>'</strong><span class=""></span>
+            <strong>Aucun responsable de site n'a pu être trouvé pour le site '<?php echo $these->getEtablissement()->getStructure()->getLibelle(); ?>'</strong><span class=""></span>
         </p>
     <?php endif; ?>
 
diff --git a/module/Soutenance/view/soutenance/presoutenance/associer-jury.phtml b/module/Soutenance/view/soutenance/presoutenance/associer-jury.phtml
index 17fef5da4..7b0b39153 100644
--- a/module/Soutenance/view/soutenance/presoutenance/associer-jury.phtml
+++ b/module/Soutenance/view/soutenance/presoutenance/associer-jury.phtml
@@ -22,7 +22,7 @@ use Soutenance\Entity\Membre;
 <!--                --><?php //echo $acteur->getIndividu()->getNomComplet(false,false,false, true); ?>
                 <?php echo $acteur->getIndividu()->getNomComplet(false,false,false, true); ?>
                 <?php echo $acteur->getQualite(); ?>
-                <?php echo ($acteur->getEtablissement())?$acteur->getEtablissement()->getLibelle():"Établissement inconnu"; ?>
+                <?php echo ($acteur->getEtablissement())?$acteur->getEtablissement()->getStructure()->getLibelle():"Établissement inconnu"; ?>
             </option>
         <?php endforeach; ?>
     </select>
diff --git a/module/Soutenance/view/soutenance/proposition/afficher-soutenances-par-ecole-doctorale.phtml b/module/Soutenance/view/soutenance/proposition/afficher-soutenances-par-ecole-doctorale.phtml
index 56e78ecf2..5d0715be6 100644
--- a/module/Soutenance/view/soutenance/proposition/afficher-soutenances-par-ecole-doctorale.phtml
+++ b/module/Soutenance/view/soutenance/proposition/afficher-soutenances-par-ecole-doctorale.phtml
@@ -12,7 +12,7 @@ use These\Entity\Db\Acteur;
 use Structure\Entity\Db\EcoleDoctorale;
 use Soutenance\Entity\Proposition;
 
-$this->headTitle("Soutenances autorisées pour l'école doctorale [".$ecole->getSigle()."] " . $ecole->getLibelle());
+$this->headTitle("Soutenances autorisées pour l'école doctorale [".$ecole->getStructure()->getSigle()."] " . $ecole->getStructure()->getLibelle());
 
 $count = count($soutenances);
 ?>
@@ -28,7 +28,7 @@ $count = count($soutenances);
     <div id="content" class="col-12 col-md-10">
         <h1 class="page-header">
             Soutenances autorisées pour l'école doctorale <br/>
-            [<?php echo $ecole->getSigle(); ?>] <?php echo $ecole->getLibelle(); ?>
+            [<?php echo $ecole->getStructure()->getSigle(); ?>] <?php echo $ecole->getStructure()->getLibelle(); ?>
         </h1>
 
         <?php if ($count > 0) : ?>
diff --git a/module/Soutenance/view/soutenance/proposition/declaration-non-plagiat.phtml b/module/Soutenance/view/soutenance/proposition/declaration-non-plagiat.phtml
index 80cfd90cf..778786d79 100644
--- a/module/Soutenance/view/soutenance/proposition/declaration-non-plagiat.phtml
+++ b/module/Soutenance/view/soutenance/proposition/declaration-non-plagiat.phtml
@@ -39,7 +39,7 @@ if (!empty($acteurs)) {
 $unite = "unité de recherche non renseignée";
 $ur = $these->getUniteRecherche();
 if ($ur !== null) {
-    $unite = $ur->getLibelle() . " (" . $ur->getSigle() . ")";
+    $unite = $ur->getStructure()->getLibelle() . " (" . $ur->getStructure()->getSigle() . ")";
 }
 
 $canValider = $this->isAllowed($these, PropositionPrivileges::PROPOSITION_DECLARATION_HONNEUR_VALIDER);
diff --git a/module/Soutenance/view/soutenance/proposition/partial/informations.phtml b/module/Soutenance/view/soutenance/proposition/partial/informations.phtml
index 9eb3930a7..be0e1ff88 100644
--- a/module/Soutenance/view/soutenance/proposition/partial/informations.phtml
+++ b/module/Soutenance/view/soutenance/proposition/partial/informations.phtml
@@ -73,7 +73,7 @@ $etablissement = $these->getEtablissement();
                             <?php if (!$unite) : ?>
                                 <strong class="text-danger">Aucune unité de recherche !</strong>
                             <?php else : ?>
-                                <?php echo $unite->getLibelle(); ?>
+                                <?php echo $unite->getStructure()->getLibelle(); ?>
                                     <?php if (empty($uniteResponsables)) : ?>
                                         <div class="alert alert-danger">
                                             <span class="icon icon-attention"></span> Aucun reponsable de site
@@ -95,7 +95,7 @@ $etablissement = $these->getEtablissement();
                             <?php if (!$ecole) : ?>
                                 <strong class="text-danger">Aucune école doctorale !</strong>
                             <?php else : ?>
-                                <?php echo $ecole->getLibelle(); ?>
+                                <?php echo $ecole->getStructure()->getLibelle(); ?>
                                 <?php if (empty($ecoleResponsables)) : ?>
                                     <div class="alert alert-danger">
                                         <span class="icon icon-attention"></span> Aucun reponsable de site
@@ -117,7 +117,7 @@ $etablissement = $these->getEtablissement();
                             <?php if (!$ecole) : ?>
                                 <strong class="text-danger">Aucun établissement !</strong>
                             <?php else : ?>
-                                <?php echo $etablissement->getLibelle(); ?>
+                                <?php echo $etablissement->getStructure()->getLibelle(); ?>
                                 <?php if (empty($etablissementResponsables)) : ?>
                                     <div class="alert alert-danger">
                                         <span class="icon icon-attention"></span> Aucun reponsable de site
diff --git a/module/Soutenance/view/soutenance/proposition/partial/validations-structures.phtml b/module/Soutenance/view/soutenance/proposition/partial/validations-structures.phtml
index 0883fe209..ca1ac6a84 100644
--- a/module/Soutenance/view/soutenance/proposition/partial/validations-structures.phtml
+++ b/module/Soutenance/view/soutenance/proposition/partial/validations-structures.phtml
@@ -29,7 +29,7 @@ $these = $proposition->getThese();
                 <ul>
                     <li>
                         <?php if ($these->getUniteRecherche()) : ?>
-                            <?php echo $these->getUniteRecherche()->getLibelle(); ?>  (Unité de recherche) <br/>
+                            <?php echo $these->getUniteRecherche()->getStructure()->getLibelle(); ?>  (Unité de recherche) <br/>
                         <?php else: ?>
                             <strong style="color:darkred;">
                                 Libellé complémentaire :
@@ -53,7 +53,7 @@ $these = $proposition->getThese();
                     </li>
                     <li>
                         <?php if ($these->getEcoleDoctorale()) : ?>
-                            <?php echo $these->getEcoleDoctorale()->getLibelle(); ?>  (École Doctorale) <br/>
+                            <?php echo $these->getEcoleDoctorale()->getStructure()->getLibelle(); ?>  (École Doctorale) <br/>
                         <?php else: ?>
                             <strong style="color:darkred;">
                                 Aucune
@@ -71,7 +71,7 @@ $these = $proposition->getThese();
                         <?php endif; ?>
                     </li>
                     <li>
-                        <?php echo $these->getEtablissement()->getLibelle(); ?>
+                        <?php echo $these->getEtablissement()->getStructure()->getLibelle(); ?>
                         (Signature de la proposition de soutenance par la direction de l'établissement) <br/>
                         <?php if ($validations[Role::CODE_BDD]) : ?>
                             <?php $validation = current($validations[Role::CODE_BDD]); ?>
diff --git a/module/Structure/src/Structure/Controller/EcoleDoctoraleController.php b/module/Structure/src/Structure/Controller/EcoleDoctoraleController.php
index ae9153ebe..9a8af4cea 100644
--- a/module/Structure/src/Structure/Controller/EcoleDoctoraleController.php
+++ b/module/Structure/src/Structure/Controller/EcoleDoctoraleController.php
@@ -106,8 +106,8 @@ class EcoleDoctoraleController extends StructureConcreteController
             foreach ($unites as $unite) {
                 $result[] = array(
                     'id' => $unite->getId(),            // identifiant unique de l'item
-                    'label' => $unite->getLibelle(),    // libellé de l'item
-                    'extra' => $unite->getSigle(),      // infos complémentaires (facultatives) sur l'item
+                    'label' => $unite->getStructure()->getLibelle(),    // libellé de l'item
+                    'extra' => $unite->getStructure()->getSigle(),      // infos complémentaires (facultatives) sur l'item
                 );
             }
             usort($result, function ($a, $b) {
diff --git a/module/Structure/src/Structure/Controller/EtablissementController.php b/module/Structure/src/Structure/Controller/EtablissementController.php
index 14de12b0c..e6a785ed0 100644
--- a/module/Structure/src/Structure/Controller/EtablissementController.php
+++ b/module/Structure/src/Structure/Controller/EtablissementController.php
@@ -106,7 +106,7 @@ class EtablissementController extends StructureConcreteController
             'etablissement'   => $etablissement,
             'roleListing'     => $roleListings,
             'individuListing' => $individuListings,
-            'logoContent'     => $this->structureService->getLogoStructureContent($etablissement),
+            'logoContent'     => $this->structureService->getLogoStructureContent($etablissement->getStructure()),
             'contenus'        => $contenus,
         ]);
     }
@@ -151,8 +151,8 @@ class EtablissementController extends StructureConcreteController
             foreach ($unites as $unite) {
                 $result[] = array(
                     'id' => $unite->getId(),            // identifiant unique de l'item
-                    'label' => $unite->getLibelle(),    // libellé de l'item
-                    'extra' => $unite->getSigle(),      // infos complémentaires (facultatives) sur l'item
+                    'label' => $unite->getStructure()->getLibelle(),    // libellé de l'item
+                    'extra' => $unite->getStructure()->getSigle(),      // infos complémentaires (facultatives) sur l'item
                 );
             }
             usort($result, function ($a, $b) {
diff --git a/module/Structure/src/Structure/Controller/Factory/EcoleDoctoraleControllerFactory.php b/module/Structure/src/Structure/Controller/Factory/EcoleDoctoraleControllerFactory.php
index e323f116a..27c2b0a41 100644
--- a/module/Structure/src/Structure/Controller/Factory/EcoleDoctoraleControllerFactory.php
+++ b/module/Structure/src/Structure/Controller/Factory/EcoleDoctoraleControllerFactory.php
@@ -21,7 +21,7 @@ class EcoleDoctoraleControllerFactory
      * @throws \Psr\Container\ContainerExceptionInterface
      * @throws \Psr\Container\NotFoundExceptionInterface
      */
-    public function __invoke(ContainerInterface $container)
+    public function __invoke(ContainerInterface $container): EcoleDoctoraleController
     {
         /** @var EcoleDoctoraleForm $form */
         $form = $container->get('FormElementManager')->get('EcoleDoctoraleForm');
diff --git a/module/Structure/src/Structure/Controller/Factory/EtablissementControllerFactory.php b/module/Structure/src/Structure/Controller/Factory/EtablissementControllerFactory.php
index aa6b0c2b3..21829c4b9 100644
--- a/module/Structure/src/Structure/Controller/Factory/EtablissementControllerFactory.php
+++ b/module/Structure/src/Structure/Controller/Factory/EtablissementControllerFactory.php
@@ -2,24 +2,22 @@
 
 namespace Structure\Controller\Factory;
 
+use Application\Service\Role\RoleService;
+use Individu\Service\IndividuService;
+use Interop\Container\ContainerInterface;
 use Structure\Controller\EtablissementController;
 use Structure\Form\EtablissementForm;
 use Structure\Service\Etablissement\EtablissementService;
-use Individu\Service\IndividuService;
-use Application\Service\Role\RoleService;
 use Structure\Service\Structure\StructureService;
 use Structure\Service\StructureDocument\StructureDocumentService;
-use Interop\Container\ContainerInterface;
 
 class EtablissementControllerFactory
 {
     /**
-     * Create service
-     *
-     * @param ContainerInterface $container
-     * @return EtablissementController
+     * @throws \Psr\Container\ContainerExceptionInterface
+     * @throws \Psr\Container\NotFoundExceptionInterface
      */
-    public function __invoke(ContainerInterface $container)
+    public function __invoke(ContainerInterface $container): EtablissementController
     {
         /** @var EtablissementForm $form */
         $form = $container->get('FormElementManager')->get('EtablissementForm');
diff --git a/module/Structure/src/Structure/Controller/Factory/StructureControllerFactory.php b/module/Structure/src/Structure/Controller/Factory/StructureControllerFactory.php
index 4f05ac86d..f7b844789 100644
--- a/module/Structure/src/Structure/Controller/Factory/StructureControllerFactory.php
+++ b/module/Structure/src/Structure/Controller/Factory/StructureControllerFactory.php
@@ -2,27 +2,25 @@
 
 namespace Structure\Controller\Factory;
 
+use Application\Service\Role\RoleService;
+use Fichier\Service\Fichier\FichierService;
+use Fichier\Service\NatureFichier\NatureFichierService;
+use Individu\Service\IndividuService;
+use Interop\Container\ContainerInterface;
 use Structure\Controller\StructureController;
 use Structure\Service\EcoleDoctorale\EcoleDoctoraleService;
 use Structure\Service\Etablissement\EtablissementService;
-use Fichier\Service\Fichier\FichierService;
-use Individu\Service\IndividuService;
-use Fichier\Service\NatureFichier\NatureFichierService;
-use Application\Service\Role\RoleService;
 use Structure\Service\Structure\StructureService;
 use Structure\Service\StructureDocument\StructureDocumentService;
 use Structure\Service\UniteRecherche\UniteRechercheService;
-use Interop\Container\ContainerInterface;
 
 class StructureControllerFactory
 {
     /**
-     * Create service
-     *
-     * @param ContainerInterface $container
-     * @return StructureController
+     * @throws \Psr\Container\ContainerExceptionInterface
+     * @throws \Psr\Container\NotFoundExceptionInterface
      */
-    public function __invoke(ContainerInterface $container)
+    public function __invoke(ContainerInterface $container): StructureController
     {
         /**
          * @var IndividuService $individuService
@@ -57,7 +55,6 @@ class StructureControllerFactory
         $controller->setFichierService($fichierService);
         $controller->setStructureDocumentService($structureDocumentService);
 
-
         return $controller;
     }
 }
\ No newline at end of file
diff --git a/module/Structure/src/Structure/Controller/Factory/SubstitutionControllerFactory.php b/module/Structure/src/Structure/Controller/Factory/SubstitutionControllerFactory.php
index 055b9d4e4..2d17804a7 100644
--- a/module/Structure/src/Structure/Controller/Factory/SubstitutionControllerFactory.php
+++ b/module/Structure/src/Structure/Controller/Factory/SubstitutionControllerFactory.php
@@ -2,24 +2,22 @@
 
 namespace Structure\Controller\Factory;
 
+use Application\SourceCodeStringHelper;
+use Doctrine\ORM\EntityManager;
+use Interop\Container\ContainerInterface;
 use Structure\Controller\SubstitutionController;
 use Structure\Service\EcoleDoctorale\EcoleDoctoraleService;
 use Structure\Service\Etablissement\EtablissementService;
 use Structure\Service\Structure\StructureService;
 use Structure\Service\UniteRecherche\UniteRechercheService;
-use Application\SourceCodeStringHelper;
-use Doctrine\ORM\EntityManager;
-use Interop\Container\ContainerInterface;
 
 class SubstitutionControllerFactory
 {
     /**
-     * Create service
-     *
-     * @param ContainerInterface $container
-     * @return SubstitutionController
+     * @throws \Psr\Container\ContainerExceptionInterface
+     * @throws \Psr\Container\NotFoundExceptionInterface
      */
-    public function __invoke(ContainerInterface $container)
+    public function __invoke(ContainerInterface $container): SubstitutionController
     {
         /**
          * @var EntityManager $entityManager
diff --git a/module/Structure/src/Structure/Controller/Factory/UniteRechercheControllerFactory.php b/module/Structure/src/Structure/Controller/Factory/UniteRechercheControllerFactory.php
index fb9e7cb3f..10dde5cd8 100644
--- a/module/Structure/src/Structure/Controller/Factory/UniteRechercheControllerFactory.php
+++ b/module/Structure/src/Structure/Controller/Factory/UniteRechercheControllerFactory.php
@@ -2,29 +2,26 @@
 
 namespace Structure\Controller\Factory;
 
+use Application\Service\DomaineScientifiqueService;
+use Application\Service\Role\RoleService;
+use Interop\Container\ContainerInterface;
 use Structure\Controller\UniteRechercheController;
 use Structure\Form\UniteRechercheForm;
-use These\Service\CoEncadrant\CoEncadrantService;
-use Application\Service\DomaineScientifiqueService;
 use Structure\Service\Etablissement\EtablissementServiceLocateTrait;
-use Individu\Service\Individu\IndividuService;
-use Application\Service\Role\RoleService;
 use Structure\Service\Structure\StructureService;
 use Structure\Service\StructureDocument\StructureDocumentService;
 use Structure\Service\UniteRecherche\UniteRechercheService;
-use Interop\Container\ContainerInterface;
+use These\Service\CoEncadrant\CoEncadrantService;
 
 class UniteRechercheControllerFactory
 {
     use EtablissementServiceLocateTrait;
 
     /**
-     * Create service
-     *
-     * @param ContainerInterface $container
-     * @return UniteRechercheController
+     * @throws \Psr\Container\ContainerExceptionInterface
+     * @throws \Psr\Container\NotFoundExceptionInterface
      */
-    public function __invoke(ContainerInterface $container)
+    public function __invoke(ContainerInterface $container): UniteRechercheController
     {
         /** @var UniteRechercheForm $form */
         $form = $container->get('FormElementManager')->get('UniteRechercheForm');
@@ -32,7 +29,6 @@ class UniteRechercheControllerFactory
         /**
          * @var CoEncadrantService $coEncadrantService
          * @var UniteRechercheService $uniteRechercheService
-         * @var IndividuService $individuService
          * @var RoleService $roleService
          * @var StructureService $structureService
          * @var DomaineScientifiqueService $domaineService
diff --git a/module/Structure/src/Structure/Controller/StructureConcreteController.php b/module/Structure/src/Structure/Controller/StructureConcreteController.php
index 33c076aef..0ad622964 100644
--- a/module/Structure/src/Structure/Controller/StructureConcreteController.php
+++ b/module/Structure/src/Structure/Controller/StructureConcreteController.php
@@ -7,6 +7,7 @@ use Structure\Entity\Db\EcoleDoctorale;
 use Individu\Entity\Db\Individu;
 use Individu\Entity\Db\IndividuRole;
 use Application\Entity\Db\Role;
+use Structure\Entity\Db\Etablissement;
 use Structure\Entity\Db\StructureConcreteInterface;
 use Structure\Entity\Db\TypeStructure;
 use Structure\Entity\Db\UniteRecherche;
@@ -121,7 +122,7 @@ abstract class StructureConcreteController extends AbstractController
             'structure'       => $structureConcrete,
             'roleListing'     => $roleListings,
             'individuRoles' => $individuRoles,
-            'logoContent'     => $this->structureService->getLogoStructureContent($structureConcrete),
+            'logoContent'     => $this->structureService->getLogoStructureContent($structureConcrete->getStructure()),
         ]);
     }
 
@@ -135,21 +136,19 @@ abstract class StructureConcreteController extends AbstractController
      */
     public function modifierAction()
     {
-        /** @var UniteRecherche $structureConcrete */
         $structureId = $this->params()->fromRoute("structure");
         $structureConcrete  = $this->getStructureConcreteService()->getRepository()->findByStructureId($structureId);
         $this->structureForm->bind($structureConcrete);
 
-        // si POST alors on revient du formulaire
-        if ($data = $this->params()->fromPost()) {
+        $request = $this->getRequest();
 
+        if ($request->isPost()) {
             // récupération des données et des fichiers
-            $request = $this->getRequest();
             $data = $request->getPost()->toArray();
             $file = $request->getFiles()->toArray();
 
             // action de modification
-            $cheminLogo = $structureConcrete->getCheminLogo();
+            $cheminLogo = $structureConcrete->getStructure()->getCheminLogo();
             $this->structureForm->setData($data);
             if ($this->structureForm->isValid()) {
 
@@ -157,9 +156,10 @@ abstract class StructureConcreteController extends AbstractController
                 if ($file['cheminLogo']['tmp_name'] !== '') {
                     $this->ajouterLogoStructure($file['cheminLogo']['tmp_name']);
                 } else {
-                    $structureConcrete->setCheminLogo($cheminLogo);
+                    $structureConcrete->getStructure()->setCheminLogo($cheminLogo);
                 }
                 // mise à jour des données relatives aux structures
+                /** @var EcoleDoctorale|Etablissement|UniteRecherche $structureConcrete */
                 $structureConcrete = $this->structureForm->getData();
                 $this->getStructureConcreteService()->update($structureConcrete);
 
@@ -172,17 +172,11 @@ abstract class StructureConcreteController extends AbstractController
             return $this->redirect()->toRoute($this->routeName, [], ['query' => ['selected' => $structureId]], true);
         }
 
-        $viewModel = new ViewModel([
+        return new ViewModel([
             'structure' => $structureConcrete,
-            'form'                        => $this->structureForm,
-//            'etablissements'              => $etablissements,
-//            'etablissementsRattachements' => $etablissementsRattachements,
-//            'domainesAssocies'            => $unite->getDomaines(),
-//            'domainesScientifiques'       => $domaineScientifiques,
-            'logoContent'                 => $this->structureService->getLogoStructureContent($structureConcrete),
+            'form' => $this->structureForm,
+            'logoContent' => $this->structureService->getLogoStructureContent($structureConcrete->getStructure()),
         ]);
-
-        return $viewModel;
     }
 
     /**
@@ -190,16 +184,16 @@ abstract class StructureConcreteController extends AbstractController
      */
     public function ajouterAction()
     {
-        if ($data = $this->params()->fromPost()) {
+        $request = $this->getRequest();
 
+        if ($request->isPost()) {
             // récupération des données et des fichiers
-            $request = $this->getRequest();
             $data = $request->getPost()->toArray();
             $file = $request->getFiles()->toArray();
 
             $this->structureForm->setData($data);
             if ($this->structureForm->isValid()) {
-                /** @var EcoleDoctorale $structureConcrete */
+                /** @var EcoleDoctorale|Etablissement|UniteRecherche $structureConcrete */
                 $structureConcrete = $this->structureForm->getData();
                 $structureConcrete = $this->getStructureConcreteService()->create($structureConcrete, $this->userContextService->getIdentityDb());
 
@@ -221,11 +215,9 @@ abstract class StructureConcreteController extends AbstractController
 
         $this->structureForm->setAttribute('action', $this->url()->fromRoute($this->routeName . '/ajouter'));
 
-        $viewModel = new ViewModel([
+        return new ViewModel([
             'form' => $this->structureForm,
         ]);
-
-        return $viewModel;
     }
 
     /**
@@ -285,7 +277,7 @@ abstract class StructureConcreteController extends AbstractController
         $structure  = $this->getStructureConcreteService()->getRepository()->findByStructureId($structureId);
 
         try {
-            $fileDeleted = $this->structureService->deleteLogoStructure($structure);
+            $fileDeleted = $this->structureService->deleteLogoStructure($structure->getStructure(false));
         } catch (RuntimeException $e) {
             $this->flashMessenger()->addErrorMessage(
                 "Erreur lors de l'effacement du logo de la structure '$structure' : " . $e->getMessage());
@@ -305,10 +297,10 @@ abstract class StructureConcreteController extends AbstractController
      * - modification du chemin en bdd
      * - création du fichier sur le serveur.
      *
-     * @param string                     $cheminLogoUploade chemin vers le fichier temporaire associé au logo
-     * @param StructureConcreteInterface $structure
+     * @param string $cheminLogoUploade chemin vers le fichier temporaire associé au logo
+     * @param \Structure\Entity\Db\StructureConcreteInterface|null $structure
      */
-    protected function ajouterLogoStructure($cheminLogoUploade, StructureConcreteInterface $structure = null)
+    protected function ajouterLogoStructure(string $cheminLogoUploade, StructureConcreteInterface $structure = null)
     {
         if ($structure === null) {
             $structureId = $this->params()->fromRoute("structure");
@@ -316,7 +308,7 @@ abstract class StructureConcreteController extends AbstractController
         }
 
         try {
-            $this->structureService->updateLogoStructure($structure, $cheminLogoUploade);
+            $this->structureService->updateLogoStructure($structure->getStructure(false), $cheminLogoUploade);
         } catch (RuntimeException $e) {
             $this->flashMessenger()->addErrorMessage(
                 "Erreur lors de l'enregistrement du logo de la structure '$structure' : " . $e->getMessage());
diff --git a/module/Structure/src/Structure/Controller/SubstitutionController.php b/module/Structure/src/Structure/Controller/SubstitutionController.php
index f5fb477dd..adb262364 100644
--- a/module/Structure/src/Structure/Controller/SubstitutionController.php
+++ b/module/Structure/src/Structure/Controller/SubstitutionController.php
@@ -3,17 +3,17 @@
 namespace Structure\Controller;
 
 use Application\Controller\AbstractController;
+use Application\SourceCodeStringHelperAwareTrait;
+use Laminas\Http\Response;
+use Laminas\View\Model\ViewModel;
 use Structure\Entity\Db\Structure;
 use Structure\Entity\Db\StructureConcreteInterface;
-use Structure\Entity\Db\StructureInterface;
 use Structure\Entity\Db\TypeStructure;
 use Structure\Service\EcoleDoctorale\EcoleDoctoraleServiceAwareTrait;
 use Structure\Service\Etablissement\EtablissementServiceAwareTrait;
 use Structure\Service\Structure\StructureServiceAwareTrait;
 use Structure\Service\UniteRecherche\UniteRechercheServiceAwareTrait;
-use Application\SourceCodeStringHelperAwareTrait;
 use UnicaenApp\Service\EntityManagerAwareTrait;
-use Laminas\View\Model\ViewModel;
 
 class SubstitutionController extends AbstractController
 {
@@ -68,7 +68,7 @@ class SubstitutionController extends AbstractController
             // récupération des structures sources
             $sources = [];
             foreach ($data['sourceIds'] as $sourceId) {
-                $structureConcrete = $this->getStructureService()->getStructuresConcreteByTypeAndStructureId($type, $sourceId);
+                $structureConcrete = $this->getStructureService()->getStructureConcreteByTypeAndStructureId($type, $sourceId);
                 $sources[] = $structureConcrete;
             }
 
@@ -84,10 +84,8 @@ class SubstitutionController extends AbstractController
                 $this->structureService->updateStructureSubstitutions($sources, $structureCible->getStructure());
             }
 
-            $message = "La substitution <strong>" . $structureCible->getLibelle() . "</strong> vient d'être créée. Elle regroupe les structures : ";
-            $message .= implode(", ", array_map(function (StructureConcreteInterface $s) {
-                return "<i>" . $s->getLibelle() . "</i>";
-            }, $sources));
+            $message = "La structure substituante <strong>$structureCible</strong> a été créée. Elle regroupe les structures de type '$type' suivantes : ";
+            $message .= implode(", ", array_map(fn(StructureConcreteInterface $s) => sprintf("<i>%s (%d)</i>", $s, $s->getId()), $sources));
             $this->flashMessenger()->addSuccessMessage($message);
 
             return $this->redirect()->toRoute('substitution-modifier', ['cible' => $structureCible->getStructure()->getId()], [], true);
@@ -98,7 +96,6 @@ class SubstitutionController extends AbstractController
         }
 
         $vm = new ViewModel([
-//            'title' => "Création d'une substitution (".$type.")",
             'cible' => $cible,
             'structuresConcretesSubstituees' => $structuresConcretesSubstituees,
             'structuresConcretes' => $structures,
@@ -117,14 +114,7 @@ class SubstitutionController extends AbstractController
         $structureCible = $this->getStructureService()->findStructureSubsitutionCibleById($idCible);
         $type = $structureCible->getTypeStructure();
 
-        $structuresSubstituees = $structureCible->getStructuresSubstituees();
-
-        $structuresConcretesSubstituees = [];
-        foreach ($structuresSubstituees as $structureSubstituee) {
-            $structureConcreteSubstituee = $this->getStructureService()->findStructureConcreteFromStructure($structureSubstituee);
-            $structuresConcretesSubstituees[] = $structureConcreteSubstituee;
-        }
-
+        $structuresConcretesSubstituees = $structureCible->getStructuresConcretesSubstituees()->toArray();
         $structures = $this->getStructureService()->getStructuresSubstituablesByType($type);
 
         $request = $this->getRequest();
@@ -134,7 +124,7 @@ class SubstitutionController extends AbstractController
             // récupération des structures sources
             $sources = [];
             foreach ($data['sourceIds'] as $sourceId) {
-                $structureConcrete = $this->getStructureService()->getStructuresConcreteByTypeAndStructureId($type, $sourceId);
+                $structureConcrete = $this->getStructureService()->getStructureConcreteByTypeAndStructureId($type, $sourceId);
                 $sources[] = $structureConcrete;
             }
 
@@ -142,34 +132,30 @@ class SubstitutionController extends AbstractController
             $this->structureService->updateFromPostData($structureCible, $data['cible']);
             $this->structureService->updateStructureSubstitutions($sources, $structureCible);
 
-            $message = "La substitution <strong>" . $structureCible->getLibelle() . "</strong> vient d'être mise à jour. Elle regroupe les structures : ";
-            $message .= implode(", ", array_map(function (StructureConcreteInterface $s) {
-                return "<i>" . $s->getLibelle() . "</i>";
-            }, $sources));
+            $message = "La structure substituante <strong>$structureCible</strong> a été mise à jour. Elle regroupe les structures de type '$type' suivantes : ";
+            $message .= implode(", ", array_map(fn(StructureConcreteInterface $s) => sprintf("<i>%s (%d)</i>", $s->getStructure(false)->getLibelle(), $s->getId()), $sources));
             $this->flashMessenger()->addSuccessMessage($message);
 
             return $this->redirect()->toRoute(null, [], [], true);
         }
 
         return new ViewModel([
-//            'title' => "Modification d'une substitution (".$type.")",
             'cible' => $structureCible,
             'structuresConcretes' => $structures,
             'structuresConcretesSubstituees' => $structuresConcretesSubstituees,
             'structureCibleLogoContent' => $this->structureService->getLogoStructureContent($structureCible),
-            'structuresConcretesSubstitueesLogosContents' => array_map(function (StructureInterface $structureConcreteSubstituee) {
-                return $this->structureService->getLogoStructureContent($structureConcreteSubstituee);
+            'structuresConcretesSubstitueesLogosContents' => array_map(function (StructureConcreteInterface $structureConcreteSubstituee) {
+                return $this->structureService->getLogoStructureContent($structureConcreteSubstituee->getStructure(false));
             }, $structuresConcretesSubstituees),
         ]);
     }
 
     /** Fonction de destruction */
-    public function detruireAction()
+    public function detruireAction(): Response
     {
         $idCible = $this->params()->fromRoute('cible');
         $structure = $this->structureService->findStructureById($idCible);
-        $cible = $this->structureService->findStructureConcreteFromStructure($structure);
-        $this->structureService->removeSubstitution($cible);
+        $this->structureService->removeSubstitution($structure->getStructureConcrete());
 
         return $this->redirect()->toRoute('substitution-index', [], [], true);
     }
@@ -183,7 +169,7 @@ class SubstitutionController extends AbstractController
 
         return new ViewModel([
             'structure' => $structureConcrete,
-            'structureSourceLogoContent' => $this->structureService->getLogoStructureContent($structureConcrete),
+            'structureSourceLogoContent' => $this->structureService->getLogoStructureContent($structureConcrete->getStructure(false)),
         ]);
     }
 
@@ -193,13 +179,13 @@ class SubstitutionController extends AbstractController
         $typeStructure = ($code = $this->params()->fromRoute('type')) ? $this->structureService->fetchTypeStructure($code) : null;
 
         if ($typeStructure !== null) {
-            $substitutionsEcolesDoctorales = $typeStructure->isEcoleDoctorale() ? $this->structureService->checkStructure($typeStructure->getCode()) : null;
-            $substitutionsEtablissements = $typeStructure->isEtablissement() ? $this->structureService->checkStructure($typeStructure->getCode()) : null;
-            $substitutionsUnitesRecherches = $typeStructure->isUniteRecherche() ? $this->structureService->checkStructure($typeStructure->getCode()) : null;
+            $substitutionsEcolesDoctorales = $typeStructure->isEcoleDoctorale() ? $this->structureService->findStructuresSubstituablesSelonSourceCode($typeStructure->getCode()) : null;
+            $substitutionsEtablissements = $typeStructure->isEtablissement() ? $this->structureService->findStructuresSubstituablesSelonSourceCode($typeStructure->getCode()) : null;
+            $substitutionsUnitesRecherches = $typeStructure->isUniteRecherche() ? $this->structureService->findStructuresSubstituablesSelonSourceCode($typeStructure->getCode()) : null;
         } else {
-            $substitutionsEcolesDoctorales  = $this->getStructureService()->checkStructure(TypeStructure::CODE_ECOLE_DOCTORALE);
-            $substitutionsEtablissements    = $this->getStructureService()->checkStructure(TypeStructure::CODE_ETABLISSEMENT);
-            $substitutionsUnitesRecherches  = $this->getStructureService()->checkStructure(TypeStructure::CODE_UNITE_RECHERCHE);
+            $substitutionsEcolesDoctorales  = $this->getStructureService()->findStructuresSubstituablesSelonSourceCode(TypeStructure::CODE_ECOLE_DOCTORALE);
+            $substitutionsEtablissements    = $this->getStructureService()->findStructuresSubstituablesSelonSourceCode(TypeStructure::CODE_ETABLISSEMENT);
+            $substitutionsUnitesRecherches  = $this->getStructureService()->findStructuresSubstituablesSelonSourceCode(TypeStructure::CODE_UNITE_RECHERCHE);
 
         }
         return new ViewModel([
@@ -216,8 +202,8 @@ class SubstitutionController extends AbstractController
         $type = $this->params()->fromRoute('type');
         $identifiant = $this->params()->fromRoute('identifiant');
 
-        $structures = $this->getStructureService()->getStructuresBySuffixe($identifiant, $type);
-
+        /** @var StructureConcreteInterface[] $sources */
+        /** @var StructureConcreteInterface $cible */
         $dictionnary = $this->getStructureService()->getSubstitutionDictionnary($identifiant, $type);
         $sources = $dictionnary["sources"];
         $cible = $dictionnary["cible"];
@@ -227,9 +213,9 @@ class SubstitutionController extends AbstractController
         } else {
             /** @var StructureConcreteInterface $cible */
             $cible = $this->getStructureService()->createStructureConcrete($type);
-            $cible->getStructure()->setLibelle($sources[0]->getLibelle());
-            $cible->getStructure()->setSigle($sources[0]->getSigle());
-            $cible->getStructure()->setCode($sources[0]->getCode());
+            $cible->getStructure()->setLibelle($sources[0]->getStructure(false)->getLibelle());
+            $cible->getStructure()->setSigle($sources[0]->getStructure(false)->getSigle());
+            $cible->getStructure()->setCode($sources[0]->getStructure(false)->getCode());
             $this->getStructureService()->createStructureSubstitutions($sources, $cible);
         }
 
@@ -245,7 +231,7 @@ class SubstitutionController extends AbstractController
         $sources = $dictionnary["sources"];
         $cible = $dictionnary["cible"];
 
-        $structures = $this->getStructureService()->getAllStructuresAffichablesByType($type);
+        $structures = $this->getStructureService()->getStructuresSubstituablesByType($type);
 
         $request = $this->getRequest();
         if ($request->isPost()) {
@@ -260,18 +246,18 @@ class SubstitutionController extends AbstractController
             if ($cible === null) {
                 /** @var StructureConcreteInterface $cible */
                 $cible = $this->getStructureService()->createStructureConcrete($type);
-                $cible->getStructure()->setLibelle($sources[0]->getLibelle());
-                $cible->getStructure()->setSigle($sources[0]->getSigle());
-                $cible->getStructure()->setCode($sources[0]->getCode());
+                $cible->getStructure()->setLibelle($sources[0]->getStructure(false)->getLibelle());
+                $cible->getStructure()->setSigle($sources[0]->getStructure(false)->getSigle());
+                $cible->getStructure()->setCode($sources[0]->getStructure(false)->getCode());
                 $this->getStructureService()->createStructureSubstitutions($sources, $cible);
             } else {
                 $this->structureService->updateFromPostData($cible, $data['cible']);
                 $this->structureService->updateStructureSubstitutions($sources, $cible->getStructure());
             }
 
-            $message = "La substitution <strong>" . $cible->getLibelle() . "</strong> vient d'être mise à jour. Elle regroupe les structures : ";
+            $message = "La substitution <strong>" . $cible->getStructure()->getLibelle() . "</strong> vient d'être mise à jour. Elle regroupe les structures : ";
             $message .= implode(", ", array_map(function (StructureConcreteInterface $s) {
-                return "<i>" . $s->getLibelle() . "</i>";
+                return "<i>" . $s->getStructure(false)->getLibelle() . "</i>";
             }, $sources));
             $this->flashMessenger()->addSuccessMessage($message);
 
@@ -291,7 +277,7 @@ class SubstitutionController extends AbstractController
             'identifiant' => $identifiant,
             'structuresConcretes' => $structures,
             'structuresConcretesSubstituees' => $sources,
-            'structureCibleLogoContent' => $this->structureService->getLogoStructureContent($cible),
+            'structureCibleLogoContent' => $this->structureService->getLogoStructureContent($cible->getStructure(false)),
         ]);
         $vm->setTemplate('structure/substitution/modifier');
         return $vm;
diff --git a/module/Structure/src/Structure/Controller/UniteRechercheController.php b/module/Structure/src/Structure/Controller/UniteRechercheController.php
index a3b0d5a44..50cef6718 100644
--- a/module/Structure/src/Structure/Controller/UniteRechercheController.php
+++ b/module/Structure/src/Structure/Controller/UniteRechercheController.php
@@ -129,12 +129,13 @@ class UniteRechercheController extends StructureConcreteController
         if ($etablissementId == 0) {
             $this->flashMessenger()->addErrorMessage("Pour ajouter un établissement de rattachement, veuillez sélectionner un établissement.");
         } else {
+            /** @var \Structure\Entity\Db\Etablissement $etablissement */
             $etablissement = $this->getEtablissementService()->getRepository()->find($etablissementId);
             if ($this->getUniteRechercheService()->existEtablissementRattachement($unite, $etablissement)) {
-                $this->flashMessenger()->addErrorMessage("L'établissement de rattachement <strong>" . $etablissement->getLibelle() . "</strong> n'a pas pu être ajouter car déjà enregistré comme établissement de rattachement de l'unité de recherche <strong>" . $unite->getLibelle() . "</strong>.");
+                $this->flashMessenger()->addErrorMessage("L'établissement de rattachement <strong>" . $etablissement->getLibelle() . "</strong> n'a pas pu être ajouter car déjà enregistré comme établissement de rattachement de l'unité de recherche <strong>" . $unite->getStructure()->getLibelle() . "</strong>.");
             } else {
                 $this->getUniteRechercheService()->addEtablissementRattachement($unite, $etablissement);
-                $this->flashMessenger()->addSuccessMessage("L'établissement <strong>" . $etablissement->getLibelle() . "</strong> vient d'être ajouter comme établissement de rattachement de l'unité de recherche <strong>" . $unite->getLibelle() . "</strong>.");
+                $this->flashMessenger()->addSuccessMessage("L'établissement <strong>" . $etablissement->getLibelle() . "</strong> vient d'être ajouter comme établissement de rattachement de l'unité de recherche <strong>" . $unite->getStructure()->getLibelle() . "</strong>.");
             }
         }
 
@@ -146,10 +147,11 @@ class UniteRechercheController extends StructureConcreteController
         $structureId = $this->params()->fromRoute("structure");
         $unite = $this->getUniteRechercheService()->getRepository()->findByStructureId($structureId);
         $etablissementId = $this->params()->fromRoute("etablissement");
+        /** @var \Structure\Entity\Db\Etablissement $etablissement */
         $etablissement = $this->getEtablissementService()->getRepository()->find($etablissementId);
 
         $this->getUniteRechercheService()->removeEtablissementRattachement($unite, $etablissement);
-        $this->flashMessenger()->addSuccessMessage("L'établissement <strong>" . $etablissement->getLibelle() . "</strong> n'est plus un établissement de rattachement de l'unité de recherche <strong>" . $unite->getLibelle() . "</strong>.");
+        $this->flashMessenger()->addSuccessMessage("L'établissement <strong>" . $etablissement->getLibelle() . "</strong> n'est plus un établissement de rattachement de l'unité de recherche <strong>" . $unite->getStructure()->getLibelle() . "</strong>.");
 
         $this->redirect()->toRoute("unite-recherche/modifier", [], [], true);
     }
@@ -170,7 +172,7 @@ class UniteRechercheController extends StructureConcreteController
 
             $this->getDomaineScientifiqueService()->updateDomaineScientifique($domaine);
 
-            $this->flashMessenger()->addSuccessMessage("Le domaine scientifique <strong>" . $domaine->getLibelle() . "</strong> est maintenant un des domaines scientifiques de l'unité de recherche <strong>" . $unite->getLibelle() . "</strong>.");
+            $this->flashMessenger()->addSuccessMessage("Le domaine scientifique <strong>" . $domaine->getLibelle() . "</strong> est maintenant un des domaines scientifiques de l'unité de recherche <strong>" . $unite->getStructure()->getLibelle() . "</strong>.");
         }
         $this->redirect()->toRoute("unite-recherche/modifier", [], [], true);
     }
@@ -190,7 +192,7 @@ class UniteRechercheController extends StructureConcreteController
 
         $this->getDomaineScientifiqueService()->updateDomaineScientifique($domaine);
 
-        $this->flashMessenger()->addSuccessMessage("Le domaine scientifique <strong>" . $domaine->getLibelle() . "</strong> ne fait plus parti des domaines scientifiques de l'unité de recherche <strong>" . $unite->getLibelle() . "</strong>.");
+        $this->flashMessenger()->addSuccessMessage("Le domaine scientifique <strong>" . $domaine->getLibelle() . "</strong> ne fait plus parti des domaines scientifiques de l'unité de recherche <strong>" . $unite->getStructure()->getLibelle() . "</strong>.");
 
         return $this->redirect()->toRoute("unite-recherche/modifier", [], [], true);
     }
@@ -203,8 +205,8 @@ class UniteRechercheController extends StructureConcreteController
             foreach ($unites as $unite) {
                 $result[] = array(
                     'id' => $unite->getId(),            // identifiant unique de l'item
-                    'label' => $unite->getLibelle(),    // libellé de l'item
-                    'extra' => $unite->getSigle(),      // infos complémentaires (facultatives) sur l'item
+                    'label' => $unite->getStructure()->getLibelle(),    // libellé de l'item
+                    'extra' => $unite->getStructure()->getSigle(),      // infos complémentaires (facultatives) sur l'item
                 );
             }
             usort($result, function ($a, $b) {
diff --git a/module/Structure/src/Structure/Entity/Db/EcoleDoctorale.php b/module/Structure/src/Structure/Entity/Db/EcoleDoctorale.php
index be3d550fd..6c4987e2b 100644
--- a/module/Structure/src/Structure/Entity/Db/EcoleDoctorale.php
+++ b/module/Structure/src/Structure/Entity/Db/EcoleDoctorale.php
@@ -3,11 +3,11 @@
 namespace Structure\Entity\Db;
 
 use Application\Search\Filter\SearchFilterValueInterface;
-use UnicaenDbImport\Entity\Db\Traits\SourceAwareTrait;
+use Laminas\Permissions\Acl\Resource\ResourceInterface;
 use UnicaenApp\Entity\HistoriqueAwareInterface;
 use UnicaenApp\Entity\HistoriqueAwareTrait;
 use UnicaenDbImport\Entity\Db\Interfaces\SourceAwareInterface;
-use Laminas\Permissions\Acl\Resource\ResourceInterface;
+use UnicaenDbImport\Entity\Db\Traits\SourceAwareTrait;
 
 /**
  * EcoleDoctorale
@@ -93,67 +93,11 @@ class EcoleDoctorale
      *
      * @return string
      */
-    public function getSourceCode()
+    public function getSourceCode(): ?string
     {
         return $this->sourceCode;
     }
 
-    /**
-     * @return string|null
-     */
-    public function getCode(): ?string
-    {
-        return $this->structure->getCode();
-    }
-
-    /**
-     * @return string
-     */
-    public function getLibelle()
-    {
-        return $this->getStructure()->getLibelle();
-    }
-
-    /**
-     * @param string $libelle
-     */
-    public function setLibelle($libelle)
-    {
-        $this->getStructure()->setLibelle($libelle);
-    }
-
-    /**
-     * @return string
-     */
-    public function getCheminLogo()
-    {
-        return $this->getStructure()->getCheminLogo();
-    }
-
-    /**
-     * @param string $cheminLogo
-     */
-    public function setCheminLogo($cheminLogo)
-    {
-        $this->getStructure()->setCheminLogo($cheminLogo);
-    }
-
-    /**
-     * @return string
-     */
-    public function getSigle()
-    {
-        return $this->getStructure()->getSigle();
-    }
-
-    /**
-     * @param string $sigle
-     */
-    public function setSigle($sigle)
-    {
-        $this->getStructure()->setSigle($sigle);
-    }
-
     /**
      * Retourne l'éventuelle école doctorale substituant celle-ci.
      *
@@ -178,7 +122,7 @@ class EcoleDoctorale
      */
     public function estTouteEcoleDoctoraleConfondue()
     {
-        return $this->getStructure()->getCode() === self::CODE_TOUTE_ECOLE_DOCTORALE_CONFONDUE;
+        return $this->structure->getCode() === self::CODE_TOUTE_ECOLE_DOCTORALE_CONFONDUE;
     }
 
     /**
@@ -222,16 +166,16 @@ class EcoleDoctorale
      */
     public function createSearchFilterValueOption(): array
     {
-        $estFermee = $this->getStructure()->estFermee();
+        $estFermee = $this->structure->estFermee();
 
-        $subtext = $this->getLibelle();
+        $subtext = $this->structure->getLibelle();
         if ($estFermee) {
             $subtext .= " - FERMÉE";
         }
 
         return [
             'value' => $this->getSourceCode(),
-            'label' => $this->getSigle(),
+            'label' => $this->structure->getSigle(),
             'subtext' => $subtext,
             'class' => $estFermee ? 'fermee' : '',
         ];
diff --git a/module/Structure/src/Structure/Entity/Db/Etablissement.php b/module/Structure/src/Structure/Entity/Db/Etablissement.php
index c96f9a457..e6178ea42 100644
--- a/module/Structure/src/Structure/Entity/Db/Etablissement.php
+++ b/module/Structure/src/Structure/Entity/Db/Etablissement.php
@@ -122,7 +122,7 @@ class Etablissement
      *
      * @return string
      */
-    public function getSourceCode()
+    public function getSourceCode(): ?string
     {
         return $this->sourceCode;
     }
@@ -143,38 +143,6 @@ class Etablissement
         $this->domaine = $domaine;
     }
 
-    /**
-     * @return string
-     */
-    public function getLibelle()
-    {
-        return $this->getStructure()->getLibelle();
-    }
-
-    /**
-     * @param string $libelle
-     */
-    public function setLibelle($libelle)
-    {
-        $this->getStructure()->setLibelle($libelle);
-    }
-
-    /**
-     * @return string|null
-     */
-    public function getSigle(): ?string
-    {
-        return $this->getStructure()->getSigle();
-    }
-
-    /**
-     * @param string|null $sigle
-     */
-    public function setSigle(string $sigle = null)
-    {
-        $this->getStructure()->setSigle($sigle);
-    }
-
     /**
      * @return bool
      */
@@ -250,22 +218,6 @@ class Etablissement
         return $this;
     }
 
-    /**
-     * @return string
-     */
-    public function getCheminLogo()
-    {
-        return $this->getStructure()->getCheminLogo();
-    }
-
-    /**
-     * @param string $cheminLogo
-     */
-    public function setCheminLogo($cheminLogo)
-    {
-        $this->getStructure()->setCheminLogo($cheminLogo);
-    }
-
     /**
      * Retourne l'éventuel établissement substituant celui-ci.
      *
@@ -314,7 +266,7 @@ class Etablissement
      */
     public function estToutEtablissementConfondu()
     {
-        return $this->getStructure()->getCode() === self::CODE_TOUT_ETABLISSEMENT_CONFONDU;
+        return $this->structure->getCode() === self::CODE_TOUT_ETABLISSEMENT_CONFONDU;
     }
 
     /**
@@ -322,8 +274,8 @@ class Etablissement
      */
     public function createSearchFilterValueOption(): array
     {
-        $label = ($this->getCode() ?: $this->getSigle()) ?: $this->getLibelle();
-        if ($this->getStructure()->estFermee()) {
+        $label = ($this->code ?: $this->structure->getSigle()) ?: $this->structure->getLibelle();
+        if ($this->structure->estFermee()) {
             $label .= "&nbsp; FERMÉ";
         }
 
diff --git a/module/Structure/src/Structure/Entity/Db/Repository/EcoleDoctoraleRepository.php b/module/Structure/src/Structure/Entity/Db/Repository/EcoleDoctoraleRepository.php
index 0a15c3acb..579e44dc5 100644
--- a/module/Structure/src/Structure/Entity/Db/Repository/EcoleDoctoraleRepository.php
+++ b/module/Structure/src/Structure/Entity/Db/Repository/EcoleDoctoraleRepository.php
@@ -45,19 +45,35 @@ class EcoleDoctoraleRepository extends DefaultEntityRepository
         return $qb->getQuery()->getResult();
     }
 
-    public function findByStructureId($id)
+    /**
+     * @return EcoleDoctorale[]
+     */
+    public function findSubstituables(): array
+    {
+        $qb = $this->createQueryBuilder("ed");
+        $qb
+            ->addSelect("typ")
+            ->leftJoin("structure.typeStructure", "typ")
+            ->addSelect("structuresSubstituees")
+            ->leftJoin("structure.structuresSubstituees", "structuresSubstituees")
+            ->andWhere('structure.estFermee = false')
+            ->andWhere('structureSubstituante IS NULL')
+            ->andWhere('structuresSubstituees IS NULL')
+            ->orderBy("structure.libelle");
+
+        return $qb->getQuery()->getResult();
+    }
+
+    public function findByStructureId($id): ?EcoleDoctorale
     {
-        /** @var EcoleDoctorale $ecole */
         $qb = $this->createQueryBuilder("ed")
             ->andWhere("structure.id = :id")
             ->setParameter("id", $id);
         try {
-            $ecole = $qb->getQuery()->getOneOrNullResult();
+            return $qb->getQuery()->getOneOrNullResult();
         } catch (NonUniqueResultException $e) {
             throw new RuntimeException("EcoleDoctoraleRepository::findByStructureId(".$id.") retourne de multiples écoles doctorales !");
         }
-
-        return $ecole;
     }
 
     /**
diff --git a/module/Structure/src/Structure/Entity/Db/Repository/EtablissementRepository.php b/module/Structure/src/Structure/Entity/Db/Repository/EtablissementRepository.php
index bd705b7cf..5ac6511e8 100644
--- a/module/Structure/src/Structure/Entity/Db/Repository/EtablissementRepository.php
+++ b/module/Structure/src/Structure/Entity/Db/Repository/EtablissementRepository.php
@@ -92,6 +92,25 @@ class EtablissementRepository extends DefaultEntityRepository
         return $qb->getQuery()->getResult();
     }
 
+    /**
+     * @return Etablissement[]
+     */
+    public function findSubstituables(): array
+    {
+        $qb = $this->createQueryBuilder("ed");
+        $qb
+            ->addSelect("typ")
+            ->leftJoin("structure.typeStructure", "typ")
+            ->addSelect("structuresSubstituees")
+            ->leftJoin("structure.structuresSubstituees", "structuresSubstituees")
+            ->andWhere('structure.estFermee = false')
+            ->andWhere('structureSubstituante IS NULL')
+            ->andWhere('structuresSubstituees IS NULL')
+            ->orderBy("structure.libelle");
+
+        return $qb->getQuery()->getResult();
+    }
+
     /**
      * @param string source
      * @param boolean $include (si 'true' alors seulement la source sinon tous sauf la source)
@@ -176,18 +195,16 @@ class EtablissementRepository extends DefaultEntityRepository
         return $etab;
     }
 
-    public function findByStructureId($structureId)
+    public function findByStructureId($structureId): ?Etablissement
     {
         $qb = $this->createQueryBuilder("e")
             ->andWhere("structure.id = :structureId")
             ->setParameter("structureId", $structureId);
         try {
-            $etablissement = $qb->getQuery()->getOneOrNullResult();
+            return $qb->getQuery()->getOneOrNullResult();
         } catch (NonUniqueResultException $e) {
             throw new RuntimeException("Anomalie plusieurs établissements avec le même id.", 0, $e);
         }
-
-        return $etablissement;
     }
 
     /**
@@ -206,7 +223,7 @@ class EtablissementRepository extends DefaultEntityRepository
      * @param bool $cacheable
      * @return Etablissement[]
      */
-    public function findAllEtablissementsInscriptions(bool $cacheable): array
+    public function findAllEtablissementsInscriptions(bool $cacheable = false): array
     {
         $qb = $this->createQueryBuilder("e")
             ->andWhere("e.estInscription = true")
diff --git a/module/Structure/src/Structure/Entity/Db/Repository/UniteRechercheRepository.php b/module/Structure/src/Structure/Entity/Db/Repository/UniteRechercheRepository.php
index 7617ae3a0..1b8651770 100644
--- a/module/Structure/src/Structure/Entity/Db/Repository/UniteRechercheRepository.php
+++ b/module/Structure/src/Structure/Entity/Db/Repository/UniteRechercheRepository.php
@@ -46,6 +46,22 @@ class UniteRechercheRepository extends DefaultEntityRepository
         return $qb->getQuery()->getResult();
     }
 
+    /**
+     * @return UniteRecherche[]
+     */
+    public function findSubstituables(): array
+    {
+        $qb = $this->createQueryBuilder("ed");
+        $qb
+            ->addSelect("typ")
+            ->join("structure.typeStructure", "typ")
+            ->andWhere('structureSubstituante IS NULL')
+            ->andWhere('structure.structuresSubstituees IS EMPTY')
+            ->orderBy("structure.libelle");
+
+        return $qb->getQuery()->getResult();
+    }
+
     /**
      * @param int|null $id
      * @return UniteRecherche|null
@@ -67,19 +83,16 @@ class UniteRechercheRepository extends DefaultEntityRepository
         return $unite;
     }
 
-    public function findByStructureId($id)
+    public function findByStructureId($id): ?UniteRecherche
     {
-        /** @var UniteRecherche $unite */
         $qb = $this->createQueryBuilder("u")
             ->andWhere("structure.id = :id")
             ->setParameter("id", $id);
         try {
-            $unite = $qb->getQuery()->getOneOrNullResult();
+            return $qb->getQuery()->getOneOrNullResult();
         } catch (NonUniqueResultException $e) {
             throw new RuntimeException("UniteRechercheRepository::findByStructureId(".$id.") retourne de multiples unités de recherches !");
         }
-
-        return $unite;
     }
 
     /**
diff --git a/module/Structure/src/Structure/Entity/Db/Structure.php b/module/Structure/src/Structure/Entity/Db/Structure.php
index 1bec18a51..6f0ad50e0 100644
--- a/module/Structure/src/Structure/Entity/Db/Structure.php
+++ b/module/Structure/src/Structure/Entity/Db/Structure.php
@@ -6,6 +6,7 @@ use Application\Entity\Db\Role;
 use Application\Entity\Db\Source;
 use Doctrine\Common\Collections\ArrayCollection;
 use Doctrine\Common\Collections\Collection;
+use InvalidArgumentException;
 use UnicaenApp\Entity\HistoriqueAwareInterface;
 use UnicaenApp\Entity\HistoriqueAwareTrait;
 use UnicaenApp\Exception\LogicException;
@@ -110,11 +111,11 @@ class Structure implements StructureInterface, HistoriqueAwareInterface, SourceA
         $structureRattach = new Structure();
         $structureRattach->setTypeStructure($type);
         $structureRattach->setSource($source);
-        $structureRattach->setCheminLogo($data->getCheminLogo());
-        $structureRattach->setLibelle($data->getLibelle());
-        $structureRattach->setSigle($data->getSigle());
+        $structureRattach->setCheminLogo($data->getStructure()->getCheminLogo());
+        $structureRattach->setLibelle($data->getStructure()->getLibelle());
+        $structureRattach->setSigle($data->getStructure()->getSigle());
         $structureRattach->setSourceCode($data->getSourceCode());
-        $structureRattach->setCode($data->getCode());
+        $structureRattach->setCode($data->getStructure()->getCode());
 
         // structure concrète
         switch (true) {
@@ -296,7 +297,7 @@ class Structure implements StructureInterface, HistoriqueAwareInterface, SourceA
     /**
      * @return TypeStructure
      */
-    public function getTypeStructure()
+    public function getTypeStructure(): TypeStructure
     {
         return $this->typeStructure;
     }
@@ -305,23 +306,63 @@ class Structure implements StructureInterface, HistoriqueAwareInterface, SourceA
      * @param TypeStructure $typeStructure
      * @return self
      */
-    public function setTypeStructure(TypeStructure $typeStructure)
+    public function setTypeStructure(TypeStructure $typeStructure): self
     {
         $this->typeStructure = $typeStructure;
 
         return $this;
     }
 
+    /**
+     * Retourne la Structure "concrète" correspondant à cette Structure "abstraite".
+     *
+     * @return \Structure\Entity\Db\StructureConcreteInterface
+     */
+    public function getStructureConcrete(): StructureConcreteInterface
+    {
+        switch (true) {
+            case $this->typeStructure->isEtablissement():
+                return $this->etablissement;
+            case $this->typeStructure->isEcoleDoctorale():
+                return $this->ecoleDoctorale;
+            case $this->typeStructure->isUniteRecherche():
+                return $this->uniteRecherche;
+            default:
+                throw new InvalidArgumentException("Type de structure inattendu");
+        }
+    }
+
+    /**
+     * Retourne l'éventuel Etablissement correspondant à cette Structure "abstraite",
+     * telle que défini par la jointure Doctrine.
+     *
+     * @see getStructureConcrete()
+     * @return \Structure\Entity\Db\Etablissement|null
+     */
     public function getEtablissement(): ?Etablissement
     {
         return $this->etablissement;
     }
 
+    /**
+     * Retourne l'éventuelle EcoleDoctorale correspondant à cette Structure "abstraite",
+     * telle que définie par la jointure Doctrine.
+     *
+     * @see getStructureConcrete()
+     * @return \Structure\Entity\Db\EcoleDoctorale|null
+     */
     public function getEcoleDoctorale(): ?EcoleDoctorale
     {
         return $this->ecoleDoctorale;
     }
 
+    /**
+     * Retourne l'éventuelle UniteRecherche correspondant à cette Structure "abstraite",
+     * telle que défini par la jointure Doctrine.
+     *
+     * @see getStructureConcrete()
+     * @return \Structure\Entity\Db\UniteRecherche|null
+     */
     public function getUniteRecherche(): ?UniteRecherche
     {
         return $this->uniteRecherche;
@@ -330,13 +371,25 @@ class Structure implements StructureInterface, HistoriqueAwareInterface, SourceA
     /**
      * Retourne les éventuelles structures substituées par celle-ci.
      *
-     * @return \Doctrine\Common\Collections\Collection
+     * @see getStructuresConcretesSubstituees()
+     * @return \Doctrine\Common\Collections\Collection|\Structure\Entity\Db\Structure[]
      */
     public function getStructuresSubstituees(): Collection
     {
         return $this->structuresSubstituees;
     }
 
+    /**
+     * Retourne les éventuelles structures "concrètes" substituées par celle-ci.
+     *
+     * @see getStructuresSubstituees()
+     * @return \Doctrine\Common\Collections\Collection|\Structure\Entity\Db\StructureConcreteInterface[]
+     */
+    public function getStructuresConcretesSubstituees(): Collection
+    {
+        return $this->structuresSubstituees->map(fn(Structure $s) => $s->getStructureConcrete());
+    }
+
     /**
      * Retourne l'éventuelle "structure substituante", càd qui substitue celle-ci.
      *
diff --git a/module/Structure/src/Structure/Entity/Db/StructureConcreteInterface.php b/module/Structure/src/Structure/Entity/Db/StructureConcreteInterface.php
index f58d72a9c..96ee6cb9a 100644
--- a/module/Structure/src/Structure/Entity/Db/StructureConcreteInterface.php
+++ b/module/Structure/src/Structure/Entity/Db/StructureConcreteInterface.php
@@ -2,8 +2,30 @@
 
 namespace Structure\Entity\Db;
 
-interface StructureConcreteInterface extends StructureInterface
+use Application\Entity\Db\Source;
+
+interface StructureConcreteInterface
 {
+    /**
+     * @return string
+     */
+    public function __toString();
+
+    /**
+     * @return string
+     */
+    public function getId();
+
+    /**
+     * @return string
+     */
+    public function getSourceCode();
+
+    /**
+     * @return Source
+     */
+    public function getSource();
+
     /**
      * @param Structure $structure
      * @return self
@@ -11,7 +33,10 @@ interface StructureConcreteInterface extends StructureInterface
     public function setStructure(Structure $structure): self;
 
     /**
-     * @return Structure
+     * Retourne l'éventuelle structure liée *ou son substitut le cas échéant*.
+     *
+     * @param bool $returnSubstitIfExists À true, retourne la structure substituante s'il y en a une ; sinon la structure d'origine.
+     * @return Structure|null
      */
-    public function getStructure(): ?Structure;
+    public function getStructure(bool $returnSubstitIfExists = true): ?Structure;
 }
\ No newline at end of file
diff --git a/module/Structure/src/Structure/Entity/Db/StructureInterface.php b/module/Structure/src/Structure/Entity/Db/StructureInterface.php
index a7103c793..2181b364f 100644
--- a/module/Structure/src/Structure/Entity/Db/StructureInterface.php
+++ b/module/Structure/src/Structure/Entity/Db/StructureInterface.php
@@ -11,11 +11,6 @@ interface StructureInterface
      */
     public function getId();
 
-    /**
-     * @return string
-     */
-    public function getSigle();
-
     /**
      * @return string
      */
@@ -31,6 +26,11 @@ interface StructureInterface
      */
     public function getLibelle();
 
+    /**
+     * @return string
+     */
+    public function getSigle();
+
     /**
      * SPécifie le Nom du fichier (pas le chemin!)
      *
diff --git a/module/Structure/src/Structure/Entity/Db/StructureSubstit.php b/module/Structure/src/Structure/Entity/Db/StructureSubstit.php
index fc80356c9..6852f1b67 100644
--- a/module/Structure/src/Structure/Entity/Db/StructureSubstit.php
+++ b/module/Structure/src/Structure/Entity/Db/StructureSubstit.php
@@ -31,7 +31,7 @@ class StructureSubstit implements HistoriqueAwareInterface
     /**
      * StructureSubstit factory.
      *
-     * @param Structure[] $structuresSources
+     * @param \Structure\Entity\Db\StructureConcreteInterface[]\Structure\Entity\Db\StructureInterface[] $structuresSources
      * @param Structure   $structureCible
      * @return self[]
      */
diff --git a/module/Structure/src/Structure/Entity/Db/UniteRecherche.php b/module/Structure/src/Structure/Entity/Db/UniteRecherche.php
index aeb3ccfa7..b48608398 100644
--- a/module/Structure/src/Structure/Entity/Db/UniteRecherche.php
+++ b/module/Structure/src/Structure/Entity/Db/UniteRecherche.php
@@ -3,13 +3,13 @@
 namespace Structure\Entity\Db;
 
 use Application\Entity\Db\DomaineScientifique;
-use These\Entity\Db\These;
 use Application\Search\Filter\SearchFilterValueInterface;
-use UnicaenDbImport\Entity\Db\Traits\SourceAwareTrait;
+use Laminas\Permissions\Acl\Resource\ResourceInterface;
+use These\Entity\Db\These;
 use UnicaenApp\Entity\HistoriqueAwareInterface;
 use UnicaenApp\Entity\HistoriqueAwareTrait;
 use UnicaenDbImport\Entity\Db\Interfaces\SourceAwareInterface;
-use Laminas\Permissions\Acl\Resource\ResourceInterface;
+use UnicaenDbImport\Entity\Db\Traits\SourceAwareTrait;
 
 /**
  * UniteRecherche
@@ -46,12 +46,8 @@ class UniteRecherche
      */
     protected $domaines;
 
-
     /** @var string RNSR */
     protected $RNSR;
-    /**
-     * UniteRecherche constructor.
-     */
 
     /** @var These[] */
     private $theses;
@@ -107,67 +103,11 @@ class UniteRecherche
      *
      * @return string
      */
-    public function getSourceCode()
+    public function getSourceCode(): ?string
     {
         return $this->sourceCode;
     }
 
-    /**
-     * @return string
-     */
-    public function getCode(): ?string
-    {
-        return $this->structure->getCode();
-    }
-
-    /**
-     * @return string
-     */
-    public function getLibelle()
-    {
-        return $this->getStructure()->getLibelle();
-    }
-
-    /**
-     * @param string $libelle
-     */
-    public function setLibelle($libelle)
-    {
-        $this->getStructure()->setLibelle($libelle);
-    }
-
-    /**
-     * @return string
-     */
-    public function getCheminLogo()
-    {
-        return $this->getStructure()->getCheminLogo();
-    }
-
-    /**
-     * @param string $cheminLogo
-     */
-    public function setCheminLogo($cheminLogo)
-    {
-        $this->getStructure()->setCheminLogo($cheminLogo);
-    }
-
-    /**
-     * @return string
-     */
-    public function getSigle()
-    {
-        return $this->getStructure()->getSigle();
-    }
-
-    /**
-     * @param string $sigle
-     */
-    public function setSigle($sigle)
-    {
-        $this->getStructure()->setSigle($sigle);
-    }
-
     /**
      * @return string
      */
@@ -282,16 +222,16 @@ class UniteRecherche
      */
     public function createSearchFilterValueOption(): array
     {
-        $estFermee = $this->getStructure()->estFermee();
+        $estFermee = $this->structure->estFermee();
 
-        $subtext = $this->getLibelle();
+        $subtext = $this->structure->getLibelle();
         if ($estFermee) {
             $subtext .= " - FERMÉE";
         }
 
         return [
             'value' => $this->getSourceCode(),
-            'label' => $this->getSigle(),
+            'label' => $this->structure->getSigle(),
             'subtext' => $subtext,
             'class' => $estFermee ? 'fermee' : '',
         ];
diff --git a/module/Structure/src/Structure/Form/Hydrator/StructureHydrator.php b/module/Structure/src/Structure/Form/Hydrator/StructureHydrator.php
index 9a3e1c2c5..3a311d950 100644
--- a/module/Structure/src/Structure/Form/Hydrator/StructureHydrator.php
+++ b/module/Structure/src/Structure/Form/Hydrator/StructureHydrator.php
@@ -15,10 +15,10 @@ abstract class StructureHydrator extends DoctrineObject
     {
         $data = parent::extract($structure);
 
-        $data['libelle'] = $structure->getLibelle();
+        $data['libelle'] = $structure->getStructure()->getLibelle();
         $data['code'] = $structure->getStructure()->getCode();
-        $data['sigle'] = $structure->getSigle();
-        $data['cheminLogo'] = $structure->getCheminLogo();
+        $data['sigle'] = $structure->getStructure()->getSigle();
+        $data['cheminLogo'] = $structure->getStructure()->getCheminLogo();
         $data['estFerme'] = $structure->getStructure()->estFermee();
         $data['id_ref'] = $structure->getStructure()->getIdRef();
         $data['id_hal'] = $structure->getStructure()->getIdHal();
@@ -36,12 +36,12 @@ abstract class StructureHydrator extends DoctrineObject
         /** @var StructureConcreteInterface $object */
         $object = parent::hydrate($data, $structure);
 
-        $object->setLibelle($data['libelle']);
-        $object->setSigle($data['sigle']);
+        $object->getStructure()->setLibelle($data['libelle']);
+        $object->getStructure()->setSigle($data['sigle']);
         $object->getStructure()->setCode($data['code']);
         $object->getStructure()->setIdRef($data['id_ref']);
         $object->getStructure()->setIdHal($data['id_hal']);
-        $object->setCheminLogo($data['cheminLogo']);
+        $object->getStructure()->setCheminLogo($data['cheminLogo']);
         $object->getStructure()->setEstFermee(isset($data['estFerme']) and $data['estFerme'] === "1");
 
         return $object;
diff --git a/module/Structure/src/Structure/Service/EcoleDoctorale/EcoleDoctoraleService.php b/module/Structure/src/Structure/Service/EcoleDoctorale/EcoleDoctoraleService.php
index 6463af7d6..a36eb6bc9 100644
--- a/module/Structure/src/Structure/Service/EcoleDoctorale/EcoleDoctoraleService.php
+++ b/module/Structure/src/Structure/Service/EcoleDoctorale/EcoleDoctoraleService.php
@@ -6,6 +6,7 @@ use Application\Entity\Db\Utilisateur;
 use Application\Service\BaseService;
 use Application\SourceCodeStringHelperAwareTrait;
 use Doctrine\ORM\OptimisticLockException;
+use Doctrine\ORM\ORMException;
 use Laminas\Mvc\Controller\AbstractActionController;
 use Structure\Entity\Db\EcoleDoctorale;
 use Structure\Entity\Db\Repository\EcoleDoctoraleRepository;
@@ -68,13 +69,13 @@ class EcoleDoctoraleService extends BaseService
 
         $this->entityManager->beginTransaction();
 
-        $this->entityManager->persist($structure);
-        $this->entityManager->persist($structureConcrete);
         try {
+            $this->entityManager->persist($structure);
+            $this->entityManager->persist($structureConcrete);
             $this->entityManager->flush($structure);
             $this->entityManager->flush($structureConcrete);
             $this->entityManager->commit();
-        } catch (\Exception $e) {
+        } catch (ORMException $e) {
             $this->rollback();
             throw new RuntimeException("Erreur lors de l'enregistrement de l'ED '$structure'", null, $e);
         }
@@ -91,7 +92,7 @@ class EcoleDoctoraleService extends BaseService
 
     public function setLogo(EcoleDoctorale $ecole, $cheminLogo)
     {
-        $ecole->setCheminLogo($cheminLogo);
+        $ecole->getStructure()->setCheminLogo($cheminLogo);
         $this->flush($ecole);
 
         return $ecole;
@@ -99,7 +100,7 @@ class EcoleDoctoraleService extends BaseService
 
     public function deleteLogo(EcoleDoctorale $ecole)
     {
-        $ecole->setCheminLogo(null);
+        $ecole->getStructure()->setCheminLogo(null);
         $this->flush($ecole);
 
         return $ecole;
@@ -141,18 +142,12 @@ class EcoleDoctoraleService extends BaseService
         return $ed;
     }
 
-    private function persist(EcoleDoctorale $ecole)
-    {
-        $this->getEntityManager()->persist($ecole);
-        $this->getEntityManager()->persist($ecole->getStructure());
-    }
-
     private function flush(EcoleDoctorale $ecole)
     {
         try {
             $this->getEntityManager()->flush($ecole);
             $this->getEntityManager()->flush($ecole->getStructure());
-        } catch (OptimisticLockException $e) {
+        } catch (ORMException $e) {
             throw new RuntimeException("Erreur lors de l'enregistrement de l'ED", null, $e);
         }
     }
@@ -177,7 +172,7 @@ class EcoleDoctoraleService extends BaseService
 
         $options = [];
         foreach ($ecoles as $ecole) {
-            $options[$ecole->getId()] = $ecole->getLibelle() . " " ."<span class='badge'>".$ecole->getSigle()."</span>";
+            $options[$ecole->getId()] = $ecole->getStructure()->getLibelle() . " " ."<span class='badge'>".$ecole->getStructure()->getSigle()."</span>";
         }
         return $options;
     }
diff --git a/module/Structure/src/Structure/Service/Etablissement/EtablissementService.php b/module/Structure/src/Structure/Service/Etablissement/EtablissementService.php
index 2986aade7..bb2912ad7 100644
--- a/module/Structure/src/Structure/Service/Etablissement/EtablissementService.php
+++ b/module/Structure/src/Structure/Service/Etablissement/EtablissementService.php
@@ -2,16 +2,16 @@
 
 namespace Structure\Service\Etablissement;
 
-use Structure\Entity\Db\Etablissement;
-use Structure\Entity\Db\Repository\EtablissementRepository;
-use Structure\Entity\Db\Structure;
-use Structure\Entity\Db\TypeStructure;
 use Application\Entity\Db\Utilisateur;
 use Application\Service\BaseService;
-use Fichier\Service\Fichier\FichierServiceAwareTrait;
 use Application\SourceCodeStringHelperAwareTrait;
 use Doctrine\ORM\NonUniqueResultException;
 use Doctrine\ORM\ORMException;
+use Fichier\Service\Fichier\FichierServiceAwareTrait;
+use Structure\Entity\Db\Etablissement;
+use Structure\Entity\Db\Repository\EtablissementRepository;
+use Structure\Entity\Db\Structure;
+use Structure\Entity\Db\TypeStructure;
 use UnicaenApp\Exception\RuntimeException;
 
 class EtablissementService extends BaseService
@@ -114,7 +114,7 @@ class EtablissementService extends BaseService
 
     public function setLogo(Etablissement $etablissement, $cheminLogo)
     {
-        $etablissement->setCheminLogo($cheminLogo);
+        $etablissement->getStructure()->setCheminLogo($cheminLogo);
         $this->flush($etablissement);
 
         return $etablissement;
@@ -122,7 +122,7 @@ class EtablissementService extends BaseService
 
     public function deleteLogo(Etablissement $etablissement)
     {
-        $etablissement->setCheminLogo(null);
+        $etablissement->getStructure()->setCheminLogo(null);
         $this->flush($etablissement);
 
         return $etablissement;
@@ -147,9 +147,9 @@ class EtablissementService extends BaseService
 
     public function getEtablissementsInscriptionsAsOptions() : array
     {
-        $etablissements = $this->getRepository()->findAllEtablissementsInscriptions();
+        $etablissements = $this->getRepository()->findAllEtablissementsInscriptions(true);
         $result = [];
-        foreach ($etablissements as $etablissement) $result[$etablissement->getId()] = $etablissement->getLibelle();
+        foreach ($etablissements as $etablissement) $result[$etablissement->getId()] = $etablissement->getStructure()->getLibelle();
         return $result;
     }
 
@@ -181,7 +181,7 @@ class EtablissementService extends BaseService
         $etablissements = $this->getRepository()->findAllEtablissementsInscriptions();
         $array = [];
         foreach ($etablissements as $etablissement) {
-            $array[$etablissement->getId()] = $etablissement->getLibelle();
+            $array[$etablissement->getId()] = $etablissement->getStructure()->getLibelle();
         }
         return $array;
     }
@@ -193,7 +193,7 @@ class EtablissementService extends BaseService
 
         $options = [];
         foreach ($etablissements as $etablissement) {
-            $options[$etablissement->getId()] = $etablissement->getLibelle() . " " ."<span class='badge'>".$etablissement->getSigle()."</span>";
+            $options[$etablissement->getId()] = $etablissement->getStructure()->getLibelle() . " " ."<span class='badge'>".$etablissement->getStructure()->getSigle()."</span>";
         }
         return $options;
     }
diff --git a/module/Structure/src/Structure/Service/Structure/StructureService.php b/module/Structure/src/Structure/Service/Structure/StructureService.php
index d6a354e5c..21a5d604b 100755
--- a/module/Structure/src/Structure/Service/Structure/StructureService.php
+++ b/module/Structure/src/Structure/Service/Structure/StructureService.php
@@ -8,14 +8,12 @@ use Application\SourceCodeStringHelperAwareTrait;
 use Doctrine\Laminas\Hydrator\DoctrineObject;
 use Doctrine\ORM\EntityRepository;
 use Doctrine\ORM\NonUniqueResultException;
-use Doctrine\ORM\OptimisticLockException;
 use Doctrine\ORM\ORMException;
 use Doctrine\ORM\Query\Expr\Join;
 use Doctrine\ORM\QueryBuilder;
 use Fichier\FileUtils;
 use Fichier\Service\Fichier\FichierStorageServiceAwareTrait;
 use Fichier\Service\Storage\Adapter\Exception\StorageAdapterException;
-use Import\Service\Traits\SynchroServiceAwareTrait;
 use Laminas\Mvc\Controller\AbstractActionController;
 use Structure\Entity\Db\EcoleDoctorale;
 use Structure\Entity\Db\Etablissement;
@@ -34,7 +32,6 @@ use Structure\Service\UniteRecherche\UniteRechercheServiceAwareTrait;
 use UnicaenApp\Exception\RuntimeException;
 use UnicaenApp\Util;
 use Webmozart\Assert\Assert;
-use function Application\generateNameForEtab;
 
 /**
  * @author Unicaen
@@ -42,7 +39,6 @@ use function Application\generateNameForEtab;
 class StructureService extends BaseService
 {
     use SourceServiceAwareTrait;
-    use SynchroServiceAwareTrait;
     use SourceCodeStringHelperAwareTrait;
     use EcoleDoctoraleServiceAwareTrait;
     use EtablissementServiceAwareTrait;
@@ -70,9 +66,8 @@ class StructureService extends BaseService
      * Objet contenant les attributs de la structure de substitution à créer
      * @return StructureConcreteInterface Entités créées (une par substitution)
      */
-    public function createStructureSubstitutions(array $structuresSources, StructureConcreteInterface $structureCibleDataObject)
+    public function createStructureSubstitutions(array $structuresSources, StructureConcreteInterface $structureCibleDataObject): StructureConcreteInterface
     {
-
         switch (true) {
             case ($structuresSources[0] instanceOf Etablissement):
                 Assert::allIsInstanceOf($structuresSources, Etablissement::class);
@@ -84,12 +79,9 @@ class StructureService extends BaseService
                 Assert::allIsInstanceOf($structuresSources, UniteRecherche::class);
                 break;
             default:
-                new RuntimeException("La première structure est de type non connu.");
-                break;
+                throw new RuntimeException("La première structure est de type non connu.");
         }
 
-        //Assert::null($structureCibleDataObject->getSourceCode(), "Le source code doit être null car il est calculé");
-
         // le source code d'une structure cible est calculé
         $sourceCode = $structureCibleDataObject->getSourceCode();
         if ($sourceCode === null) {
@@ -136,26 +128,24 @@ class StructureService extends BaseService
         $substitutions = StructureSubstit::fromStructures($structuresSources, $structureRattachCible);
 
         // enregistrement en bdd
-        $this->getEntityManager()->beginTransaction();
+        $this->entityManager->beginTransaction();
         try {
-            $this->getEntityManager()->persist($structureRattachCible);
-            $this->getEntityManager()->persist($structureConcreteCible);
+            $this->entityManager->persist($structureRattachCible);
+            $this->entityManager->persist($structureConcreteCible);
             array_map(function(StructureSubstit $ss) {
-                $this->getEntityManager()->persist($ss);
+                $this->entityManager->persist($ss);
             }, $substitutions);
 
-            $this->getEntityManager()->flush($structureRattachCible);
-            $this->getEntityManager()->flush($structureConcreteCible);
-            $this->getEntityManager()->flush($substitutions);
+            $this->entityManager->flush($structureRattachCible);
+            $this->entityManager->flush($structureConcreteCible);
+            $this->entityManager->flush($substitutions);
 
-            $this->getEntityManager()->commit();
+            $this->entityManager->commit();
         } catch (\Exception $e) {
-            $this->getEntityManager()->rollback();
+            $this->entityManager->rollback();
             throw new RuntimeException("Erreur rencontrée lors de l'enregistrement des substitutions", null, $e);
         }
 
-        $this->runSynchroTheses($structureConcreteCible->getStructure());
-
         return $structureConcreteCible;
     }
 
@@ -231,34 +221,6 @@ class StructureService extends BaseService
             $this->getEntityManager()->rollback();
             throw new RuntimeException("Erreur rencontrée lors de l'enregistrement des substitutions", null, $e);
         }
-
-        $this->runSynchroTheses($structureCible);
-    }
-
-    /**
-     * Lance la synchro des thèses pour prendre en compte la substitution de structure.
-     *
-     * @deprecated Ne plus appeller cette méthode. La substitution ne doit plus être "appliquée" grâce aux vues de synchro SRC_*
-     * mais à la main dans le code PHP.
-     *
-     * @param \Structure\Entity\Db\Structure $structureCible
-     */
-    private function runSynchroTheses(Structure $structureCible)
-    {
-        // Les noms de synchros sont déclinés par source/établissement (ex: 'these-UCN') ; on ne retient que
-        // les sources/établissements des structures substituées.
-        $etabs = [];
-        foreach ($structureCible->getStructuresSubstituees() as $structuresSubstituee) {
-            /** @var \Application\Entity\Db\Source $source */
-            $source = $structuresSubstituee->getSource();
-            $etab = $source->getEtablissement()->getCode();
-            $etabs[$etab] = $etab;
-        }
-        foreach ($etabs as $etab) {
-            $this->synchroService->addService(generateNameForEtab('these-%s', $etab));
-        }
-
-        $this->synchroService->synchronize();
     }
 
     /**
@@ -296,8 +258,6 @@ class StructureService extends BaseService
             throw new RuntimeException("Erreur rencontrée lors de la supression des substitutions", null, $e);
         }
 
-        $this->runSynchroTheses($structureCible);
-
         return $structureSubstits;
     }
 
@@ -429,7 +389,8 @@ class StructureService extends BaseService
     }
 
     /**
-     * Détruit les substitutions associées à une structure cible dans la table STRUCTURE_SUBSTIT et détruit cette structure cible
+     * Détruit les substitutions associées à une structure cible dans la table STRUCTURE_SUBSTIT et détruit cette structure cible.
+     *
      * @param StructureConcreteInterface $cibleConcrete
      */
     public function removeSubstitution(StructureConcreteInterface $cibleConcrete)
@@ -437,20 +398,18 @@ class StructureService extends BaseService
         $qb = $this->getEntityManager()->getRepository(StructureSubstit::class)->createQueryBuilder("ss")
             ->andWhere("ss.toStructure = :cible")
             ->setParameter("cible", $cibleConcrete->getStructure());
-        $result = $qb->getQuery()->getResult();
 
-        foreach($result as $entry) {
-            $this->getEntityManager()->remove($entry);
-        }
+        $this->getEntityManager()->beginTransaction();
         try {
+            foreach($qb->getQuery()->getResult() as $entry) {
+                $this->getEntityManager()->remove($entry);
+            }
             $this->getEntityManager()->remove($cibleConcrete);
-        } catch (ORMException $e) {
-        }
-
-        try {
             $this->getEntityManager()->flush();
-        } catch (OptimisticLockException $e) {
-            throw new RuntimeException("Problème lors de l'effacement des structures");
+            $this->getEntityManager()->commit();
+        } catch (ORMException $e) {
+            $this->getEntityManager()->rollback();
+            throw new RuntimeException("Problème rencontré lors de la suppression de la substitution de structures");
         }
     }
 
@@ -458,7 +417,7 @@ class StructureService extends BaseService
      * @param string $typeStructure
      * @return StructureConcreteInterface|null
      */
-    public function createStructureConcrete(string $typeStructure)
+    public function createStructureConcrete(string $typeStructure): ?StructureConcreteInterface
     {
         $sourceSygal = $this->sourceService->fetchApplicationSource();
         $type = $this->fetchTypeStructure($typeStructure);
@@ -485,15 +444,17 @@ class StructureService extends BaseService
         return $structureCibleDataObject;
     }
 
-
     /**
-     * @param $structure
-     * @param $data
+     * @param \Structure\Entity\Db\StructureInterface|\Structure\Entity\Db\StructureConcreteInterface $structure
+     * @param array $data
      */
-    public function updateFromPostData($structure, $data)
+    public function updateFromPostData($structure, array $data)
     {
         $hydrator = new DoctrineObject($this->getEntityManager());
-        $hydrator->hydrate($data, $structure);
+        $hydrator->hydrate(
+            $data,
+            $structure instanceof StructureConcreteInterface ? $structure->getStructure(false) : $structure
+        );
     }
 
     /**
@@ -579,10 +540,10 @@ class StructureService extends BaseService
     }
 
     /**
-     * Recherche les structures qui peuvent être substituées.
+     * Retourne les structures qui peuvent être substituées, **hydratées au format array**.
      *
      * @param string $type
-     * @return StructureConcreteInterface[]
+     * @return array[]
      */
     public function getStructuresSubstituablesByType(string $type): array
     {
@@ -590,13 +551,12 @@ class StructureService extends BaseService
         $repo = $this->getEntityManager()->getRepository($this->getEntityByType($type));
 
         $qb = $repo->createQueryBuilder('structureConcrete')
-            ->addSelect('substitutionFrom')
             ->leftJoin('structure.structuresSubstituees', 'substitutionFrom')
-            ->andWhere('substitutionFrom.id IS NULL')
-            ->andWhere('structureSubstituante.id IS NULL')
+            ->andWhere('substitutionFrom.id IS NULL')      // non substituante
+//            ->andWhere('structureSubstituante.id IS NULL') // non déjà substituée
             ->orderBy('structure.libelle');
 
-        return $qb->getQuery()->getResult();
+        return $qb->getQuery()->getArrayResult();
     }
 
     /**
@@ -656,7 +616,7 @@ class StructureService extends BaseService
      * @param int|string $structureId
      * @return StructureConcreteInterface
      */
-    public function getStructuresConcreteByTypeAndStructureId(string $type, $structureId): StructureConcreteInterface
+    public function getStructureConcreteByTypeAndStructureId(string $type, $structureId): StructureConcreteInterface
     {
         $qb = $this->getEntityManager()->getRepository($this->getEntityByType($type))->createQueryBuilder('structureConcrete')
             ->addSelect('structurec')
@@ -679,7 +639,7 @@ class StructureService extends BaseService
      * @param int|string $structureId
      * @return StructureConcreteInterface
      */
-    public function getStructuresConcreteByTypeAndStructureConcreteId(string $type, $structureId): StructureConcreteInterface
+    public function getStructureConcreteByTypeAndStructureConcreteId(string $type, $structureId): StructureConcreteInterface
     {
         $qb = $this->getEntityManager()->getRepository($this->getEntityByType($type))->createQueryBuilder('structureConcrete')
             ->addSelect('structurec')
@@ -701,30 +661,31 @@ class StructureService extends BaseService
      * Identifie les structures substituables en utilisant le sourceCode.
      *
      * @param string $type
-     * @return array
+     * @return array [$identifiant => [$sources, $cible]]
      *
-     * @deprecated Mise deprecated pour penser à la renommer clairement,
-     * et à remplacer if ($prefix === "SyGAL" || $prefix === "COMUE").
+     * @deprecated Mise deprecated pour penser à remplacer if ($prefix === "SyGAL" || $prefix === "COMUE").
      */
-    public function checkStructure($type)
+    public function findStructuresSubstituablesSelonSourceCode(string $type): array
     {
         $structures = [];
         switch($type) {
             case (TypeStructure::CODE_ECOLE_DOCTORALE):
-                $structures = $this->getEcoleDoctoraleService()->getRepository()->findAll();
+                $structures = $this->getEcoleDoctoraleService()->getRepository()->findSubstituables();
                 break;
             case (TypeStructure::CODE_ETABLISSEMENT):
-                $structures = $this->getEtablissementService()->getRepository()->findAll();
+                $structures = $this->getEtablissementService()->getRepository()->findSubstituables();
                 break;
             case (TypeStructure::CODE_UNITE_RECHERCHE):
-                $structures = $this->getUniteRechercheService()->getRepository()->findAll();
+                $structures = $this->getUniteRechercheService()->getRepository()->findSubstituables();
                 break;
         }
 
         $dictionnaire = [];
         foreach ($structures as $structure) {
             $identifiant = explode("::", $structure->getSourceCode())[1];
-            $dictionnaire[$identifiant][] = $structure;
+            if ($identifiant) {
+                $dictionnaire[$identifiant][] = $structure;
+            }
         }
 
         $substitutions = [];
@@ -783,27 +744,24 @@ class StructureService extends BaseService
      */
     public function deleteLogoStructure(StructureInterface $structure): bool
     {
-        $cheminLogo = $structure->getCheminLogo();
+        if (!$structure->getCheminLogo()) {
+            return false;
+        }
+
+        try {
+            $this->fichierStorageService->deleteFileForLogoStructure($structure);
+        } catch (StorageAdapterException $e) {
+            throw new RuntimeException("Erreur lors de la suppression du logo de la structure. " . $e->getMessage(), null, $e);
+        }
 
         $structure->setCheminLogo(null);
         try {
             $this->entityManager->flush($structure);
-            if ($structure instanceof StructureConcreteInterface) {
-                $this->entityManager->flush($structure->getStructure());
-            }
         } catch (ORMException $e) {
             throw new RuntimeException("Erreur lors de l'enregistrement de la structure.", null, $e);
         }
-        
-        if ($hasLogo = ($cheminLogo !== null)) {
-            try {
-                $this->fichierStorageService->deleteFileForLogoStructure($structure);
-            } catch (StorageAdapterException $e) {
-                throw new RuntimeException("Erreur lors de la suppression du logo de la structure. " . $e->getMessage(), null, $e);
-            }
-        }
 
-        return $hasLogo;
+        return true;
     }
 
     /**
@@ -821,21 +779,21 @@ class StructureService extends BaseService
         $logoFilepath = FileUtils::convertLogoFileToPNG($uploadedFilePath);
 
         // Suppression du logo existant
-        $this->deleteLogoStructure($structure); // todo: améliorer pour l'inclure dns le try-catch ci-après
-
+        $this->entityManager->beginTransaction();
         try {
+            $this->deleteLogoStructure($structure);
+
             $this->fichierStorageService->saveFileForLogoStructure($logoFilepath, $structure);
 
             $logoFilename = $this->fichierStorageService->computeFileNameForNewLogoStructure($structure);
             $structure->setCheminLogo($logoFilename);
 
             $this->entityManager->flush($structure);
-            if ($structure instanceof StructureConcreteInterface) {
-                $this->entityManager->flush($structure->getStructure());
-            }
+            $this->entityManager->commit();
         } catch (StorageAdapterException $e) {
             throw new RuntimeException("Impossible d'enregistrer le fichier logo dans le storage. " . $e->getMessage(), null, $e);
         } catch (ORMException $e) {
+            $this->entityManager->rollback();
             throw new RuntimeException("Erreur lors de l'enregistrement de la structure. " . $e->getMessage(), null, $e);
         }
     }
@@ -858,6 +816,10 @@ class StructureService extends BaseService
             return Util::createImageWithText("Anomalie: Fichier|absent sur le storage. " . $e->getMessage(), 200, 200);
         }
 
+        if ($logoFilepath === null) {
+            return null;
+        }
+
         return file_get_contents($logoFilepath) ?: null;
     }
 
diff --git a/module/Structure/src/Structure/Service/Structure/StructureServiceFactory.php b/module/Structure/src/Structure/Service/Structure/StructureServiceFactory.php
index a948e9264..18def4420 100755
--- a/module/Structure/src/Structure/Service/Structure/StructureServiceFactory.php
+++ b/module/Structure/src/Structure/Service/Structure/StructureServiceFactory.php
@@ -2,35 +2,29 @@
 
 namespace Structure\Service\Structure;
 
-use Structure\Service\EcoleDoctorale\EcoleDoctoraleService;
-use Structure\Service\Etablissement\EtablissementService;
-use Fichier\Service\Fichier\FichierStorageService;
 use Application\Service\Source\SourceService;
-use Structure\Service\UniteRecherche\UniteRechercheService;
 use Application\SourceCodeStringHelper;
-use Import\Service\SynchroService;
+use Fichier\Service\Fichier\FichierStorageService;
 use Interop\Container\ContainerInterface;
+use Structure\Service\EcoleDoctorale\EcoleDoctoraleService;
+use Structure\Service\Etablissement\EtablissementService;
+use Structure\Service\UniteRecherche\UniteRechercheService;
 
-/**
- * @author Unicaen
- */
 class StructureServiceFactory
 {
     /**
-     * @param ContainerInterface $container
-     * @return StructureService
+     * @throws \Psr\Container\ContainerExceptionInterface
+     * @throws \Psr\Container\NotFoundExceptionInterface
      */
-    public function __invoke(ContainerInterface $container)
+    public function __invoke(ContainerInterface $container): StructureService
     {
         /**
          * @var SourceService $sourceService
-         * @var SynchroService $synchroService
          * @var EcoleDoctoraleService $ecoleService
          * @var EtablissementService $etablissementService
          * @var UniteRechercheService $uniteRechercheService
          */
         $sourceService = $container->get(SourceService::class);
-        $synchroService = $container->get(SynchroService::class);
         $ecoleService = $container->get(EcoleDoctoraleService::class);
         $etablissementService = $container->get(EtablissementService::class);
         $uniteRechercheService = $container->get(UniteRechercheService::class);
@@ -40,7 +34,6 @@ class StructureServiceFactory
 
         $service = new StructureService;
         $service->setSourceService($sourceService);
-        $service->setSynchroService($synchroService);
         $service->setEcoleDoctoraleService($ecoleService);
         $service->setEtablissementService($etablissementService);
         $service->setUniteRechercheService($uniteRechercheService);
diff --git a/module/Structure/src/Structure/Service/UniteRecherche/UniteRechercheService.php b/module/Structure/src/Structure/Service/UniteRecherche/UniteRechercheService.php
index a58f6607a..85df76623 100644
--- a/module/Structure/src/Structure/Service/UniteRecherche/UniteRechercheService.php
+++ b/module/Structure/src/Structure/Service/UniteRecherche/UniteRechercheService.php
@@ -6,7 +6,6 @@ use Application\Entity\Db\Utilisateur;
 use Application\Service\BaseService;
 use Application\SourceCodeStringHelperAwareTrait;
 use Doctrine\ORM\NonUniqueResultException;
-use Doctrine\ORM\OptimisticLockException;
 use Doctrine\ORM\ORMException;
 use Structure\Entity\Db\Etablissement;
 use Structure\Entity\Db\EtablissementRattachement;
@@ -125,7 +124,7 @@ class UniteRechercheService extends BaseService
 
     public function setLogo(UniteRecherche $unite, $cheminLogo)
     {
-        $unite->setCheminLogo($cheminLogo);
+        $unite->getStructure()->setCheminLogo($cheminLogo);
         $this->flush($unite);
 
         return $unite;
@@ -133,7 +132,7 @@ class UniteRechercheService extends BaseService
 
     public function deleteLogo(UniteRecherche $unite)
     {
-        $unite->setCheminLogo(null);
+        $unite->getStructure()->setCheminLogo(null);
         $this->flush($unite);
 
         return $unite;
@@ -144,7 +143,7 @@ class UniteRechercheService extends BaseService
         try {
             $this->getEntityManager()->flush($ur);
             $this->getEntityManager()->flush($ur->getStructure());
-        } catch (OptimisticLockException $e) {
+        } catch (ORMException $e) {
             throw new RuntimeException("Erreur lors de l'enregistrement de l'UR", null, $e);
         }
     }
@@ -154,22 +153,23 @@ class UniteRechercheService extends BaseService
     /**
      * @param UniteRecherche $unite
      * @param Etablissement  $etablissement
-     * @throws OptimisticLockException
      */
     public function addEtablissementRattachement(UniteRecherche $unite, Etablissement $etablissement)
     {
         $er = new EtablissementRattachement();
         $er->setUniteRecherche($unite);
         $er->setEtablissement($etablissement);
-        $this->getEntityManager()->persist($er);
-        $this->getEntityManager()->flush($er);
+        try {
+            $this->getEntityManager()->persist($er);
+            $this->getEntityManager()->flush($er);
+        } catch (ORMException $e) {
+            throw new RuntimeException("Erreur lors de l'enregistrement de l'UR", null, $e);
+        }
     }
 
     /**
      * @param UniteRecherche $unite
      * @param Etablissement  $etablissement
-     * @throws OptimisticLockException
-     * @throws \Doctrine\ORM\NonUniqueResultException
      */
     public function removeEtablissementRattachement(UniteRecherche $unite, Etablissement $etablissement)
     {
@@ -178,11 +178,19 @@ class UniteRechercheService extends BaseService
             ->andWhere("er.etablissement = :etablissement")
             ->setParameter("unite", $unite)
             ->setParameter("etablissement", $etablissement);
-        $result = $qb->getQuery()->getOneOrNullResult();
+        try {
+            $result = $qb->getQuery()->getOneOrNullResult();
+        } catch (NonUniqueResultException $e) {
+            throw new RuntimeException("Erreur lors de l'enregistrement de l'UR", null, $e);
+        }
 
         if ($result) {
-            $this->getEntityManager()->remove($result);
-            $this->getEntityManager()->flush($result);
+            try {
+                $this->getEntityManager()->remove($result);
+                $this->getEntityManager()->flush($result);
+            } catch (ORMException $e) {
+                throw new RuntimeException("Erreur lors de l'enregistrement de l'UR", null, $e);
+            }
         }
     }
 
@@ -193,7 +201,7 @@ class UniteRechercheService extends BaseService
 
         $options = [];
         foreach ($unites as $unite) {
-            $options[$unite->getId()] = $unite->getLibelle() . " " ."<span class='badge'>".$unite->getSigle()."</span>";
+            $options[$unite->getId()] = $unite->getStructure()->getLibelle() . " " ."<span class='badge'>".$unite->getStructure()->getSigle()."</span>";
         }
         return $options;
     }
diff --git a/module/Structure/src/Structure/View/Helper/StructureSubstitHelper.php b/module/Structure/src/Structure/View/Helper/StructureSubstitHelper.php
index 03e69eae5..ff1299f0e 100644
--- a/module/Structure/src/Structure/View/Helper/StructureSubstitHelper.php
+++ b/module/Structure/src/Structure/View/Helper/StructureSubstitHelper.php
@@ -20,32 +20,35 @@ class StructureSubstitHelper extends AbstractHelper
      * @param string|null                     $logoContent
      * @return string
      */
-    public function structureSource(StructureConcreteInterface $structurestructureConcrete, ?string $logoContent)
+    public function structureSource(StructureConcreteInterface $structurestructureConcrete, ?string $logoContent): string
     {
+        // structure substituée SANS REMONTER À LA STRUCTURE SUBSTITUANTE
+        $structure = $structurestructureConcrete->getStructure(false);
+
         $texte = '<div class="card" data-struct-id="'.$structurestructureConcrete->getId().'" id="panel_' . $structurestructureConcrete->getId() . '" >';
         $texte .= '<div class="card-header bg-secondary text-white">';
-        $texte .= 'Source : ' . $structurestructureConcrete->getSource() . " - Identifiant : " . $structurestructureConcrete->getStructure()->getId();
+        $texte .= 'Source : ' . $structurestructureConcrete->getSource() . " / Structure abstraite " . $structure->getId() . " / Structure concrète " . $structurestructureConcrete->getId();
         $texte .= '</div>';
 
         $texte .= '<div class="card-body">';
 
         $texte .= '<div class="float-start">';
-        $texte .= '<input type="hidden" id="source" name="sourceIds[]" value="' . $structurestructureConcrete->getStructure()->getId() . '" />';
+        $texte .= '<input type="hidden" id="source" name="sourceIds[]" value="' . $structure->getId() . '" />';
         $texte .= '<table>';
         $texte .= '<tr>';
-        $texte .= '<td><input champ="sigle" id="sigle_' . $structurestructureConcrete->getSigle() . '" type="radio" name="sigle"/> </td>';
+        $texte .= '<td><input champ="sigle" id="sigle_' . $structurestructureConcrete->getStructure(false)->getSigle() . '" type="radio" name="sigle"/> </td>';
         $texte .= '<th> &nbsp; Sigle : &nbsp; </th>';
-        $texte .= '<td>' . $structurestructureConcrete->getSigle() . '</td>';
+        $texte .= '<td>' . $structurestructureConcrete->getStructure(false)->getSigle() . '</td>';
         $texte .= '</tr>';
         $texte .= '<tr>';
-        $texte .= '<td><input champ="libelle" id="sigle_' . $structurestructureConcrete->getSigle() . '" type="radio" name="libelle"/> </td>';
+        $texte .= '<td><input champ="libelle" id="sigle_' . $structurestructureConcrete->getStructure(false)->getSigle() . '" type="radio" name="libelle"/> </td>';
         $texte .= '<th> &nbsp; Libellé : &nbsp; </th>';
-        $texte .= '<td>' . $structurestructureConcrete->getLibelle() . '</td>';
+        $texte .= '<td>' . $structurestructureConcrete->getStructure(false)->getLibelle() . '</td>';
         $texte .= '</tr>';
         $texte .= '<tr>';
-        $texte .= '<td><input champ="code" id="sigle_' . $structurestructureConcrete->getSigle() . '" type="radio" name="code"/> </td>';
+        $texte .= '<td><input champ="code" id="sigle_' . $structurestructureConcrete->getStructure(false)->getSigle() . '" type="radio" name="code"/> </td>';
         $texte .= '<th> &nbsp; Code : &nbsp; </th>';
-        $texte .= '<td>' . $structurestructureConcrete->getStructure()->getCode() . '</td>';
+        $texte .= '<td>' . $structure->getCode() . '</td>';
         $texte .= '</tr>';
         $texte .= '</table>';
 
@@ -58,10 +61,10 @@ class StructureSubstitHelper extends AbstractHelper
         $texte .= '</div>';
 
         $texte .= '<div id="logo-div" class="float-end ">';
-        if ($structurestructureConcrete->getCheminLogo() !== null)
-            $texte .= '<input champ="logo" id="logo_' . $structurestructureConcrete->getSigle() . '" type="radio" name="logo" /> &nbsp; ';
+        if ($structurestructureConcrete->getStructure(false)->getCheminLogo() !== null)
+            $texte .= '<input champ="logo" id="logo_' . $structurestructureConcrete->getStructure(false)->getSigle() . '" type="radio" name="logo" /> &nbsp; ';
         $texte .= '<img class="current" style="max-width: 125px; max-height: 125px; border: 1px solid black; background-color: white;" src="data:image/*;base64,' . base64_encode($logoContent) . '"/>';
-        $texte .= '<input class="path" type="hidden" champ="cheminLogo" name="cheminLogo" value="' . $structurestructureConcrete->getStructure()->getCheminLogo() . '"/>';
+        $texte .= '<input class="path" type="hidden" champ="cheminLogo" name="cheminLogo" value="' . $structure->getCheminLogo() . '"/>';
         $texte .= '</div>';
         $texte .= '</div>';
         $texte .= '</div>';
@@ -75,13 +78,13 @@ class StructureSubstitHelper extends AbstractHelper
      * @param string|null    $logoContent
      * @return string
      */
-    function structureCible(Structure $structure, ?string $logoContent)
+    function structureCible(Structure $structure, ?string $logoContent): string
     {
         $texte = "";
         $texte .= '<div class="card">';
 
         $texte .= '    <div class="card-header bg-success">';
-        $texte .= 'Source : ' . $structure->getSource() . " - Identifiant : " . $structure->getId();
+        $texte .= 'Source : ' . $structure->getSource() . " / Identifiant Structure : " . $structure->getId();
         $texte .= '    </div>';
 
         $texte .= '    <div class="card-body">';
diff --git a/module/Structure/view/structure/ecole-doctorale/index.phtml b/module/Structure/view/structure/ecole-doctorale/index.phtml
index 2a7fd1bbb..3e546c031 100644
--- a/module/Structure/view/structure/ecole-doctorale/index.phtml
+++ b/module/Structure/view/structure/ecole-doctorale/index.phtml
@@ -67,7 +67,7 @@ $canSubstituer = $this->isAllowed(SubstitutionPrivileges::getResourceId(Substitu
             <tr>
                 <td>
                     <a href="<?php echo $this->url('ecole-doctorale/information', ['structure' => $ecole->getStructure()->getId()], [], true); ?>">
-                        <?php echo $ecole->getLibelle(); ?>
+                        <?php echo $ecole->getStructure()->getLibelle(); ?>
                         <?php if ($ecole->getStructure()->estFermee()) : ?>
                             &nbsp;<span class="badge bg-danger">Structure fermée</span>
                         <?php endif; ?>
@@ -79,7 +79,7 @@ $canSubstituer = $this->isAllowed(SubstitutionPrivileges::getResourceId(Substitu
                 <td>
                     <?php echo $ecole->getStructure()->getCode(); ?>
                 </td>
-                <td> <?php echo $ecole->getSigle(); ?> </td>
+                <td> <?php echo $ecole->getStructure()->getSigle(); ?> </td>
                 <td>
                     <?php if (($canModifier OR $canModifierCetteEcole) && !$historisee) : ?>
                         <a href="<?php echo $this->url('ecole-doctorale/supprimer', ["structure" => $ecole->getStructure()->getId()], [], true); ?>"
diff --git a/module/Structure/view/structure/ecole-doctorale/information.phtml b/module/Structure/view/structure/ecole-doctorale/information.phtml
index 1a8c07ff9..8708b51d0 100644
--- a/module/Structure/view/structure/ecole-doctorale/information.phtml
+++ b/module/Structure/view/structure/ecole-doctorale/information.phtml
@@ -33,7 +33,7 @@ $structure = $ecole->getStructure();
 ?>
 
 <h1 class="page-header">
-    École doctorale &laquo; <?php echo $ecole->getLibelle(); ?> &raquo;
+    École doctorale &laquo; <?php echo $ecole->getStructure()->getLibelle(); ?> &raquo;
 </h1>
 
 <?php echo $this->messenger()->addMessagesFromFlashMessengerWithNoNamespace() ?>
@@ -81,9 +81,9 @@ $structure = $ecole->getStructure();
         <div class="col-md-6">
             <dl>
                 <dt> Libelle :</dt>
-                <dd>    <?php echo $ecole->getLibelle(); ?>     </dd>
+                <dd>    <?php echo $ecole->getStructure()->getLibelle(); ?>     </dd>
                 <dt> Sigle :</dt>
-                <dd>    <?php echo $ecole->getSigle(); ?>       </dd>
+                <dd>    <?php echo $ecole->getStructure()->getSigle(); ?>       </dd>
                 <dt> Code :</dt>
                 <dd>    <?php echo $ecole->getStructure()->getCode(); ?>        </dd>
                 <dt> Id REF :</dt>
diff --git a/module/Structure/view/structure/ecole-doctorale/modifier.phtml b/module/Structure/view/structure/ecole-doctorale/modifier.phtml
index 979a65e3f..f3f66ba48 100644
--- a/module/Structure/view/structure/ecole-doctorale/modifier.phtml
+++ b/module/Structure/view/structure/ecole-doctorale/modifier.phtml
@@ -33,7 +33,7 @@ $form->get('code')->setAttribute('readonly', !$editable);
     <?php if ($isNew): ?>
         Création d'une nouvelle école doctorale
     <?php else: ?>
-        Modification de l'école doctorale &laquo; <?php echo $ecole->getLibelle(); ?> &raquo;
+        Modification de l'école doctorale &laquo; <?php echo $ecole->getStructure()->getLibelle(); ?> &raquo;
     <?php endif ?>
 </h1>
 
@@ -62,7 +62,7 @@ $form->get('code')->setAttribute('readonly', !$editable);
         <?php
         $content = $logoContent;
         if ($content === null) {
-            $ecole->setCheminLogo(null);
+            $ecole->getStructure()->setCheminLogo(null);
         }
         ?>
 
diff --git a/module/Structure/view/structure/etablissement/index.phtml b/module/Structure/view/structure/etablissement/index.phtml
index 1efc72855..70a1e2323 100644
--- a/module/Structure/view/structure/etablissement/index.phtml
+++ b/module/Structure/view/structure/etablissement/index.phtml
@@ -79,7 +79,7 @@ $canSubstituer = $this->isAllowed(SubstitutionPrivileges::getResourceId(Substitu
             <tr>
                 <td>
                     <a href="<?php echo $this->url('etablissement/information', ['structure' => $etablissement->getStructure()->getId()], [], true); ?>">
-                        <?php echo $etablissement->getLibelle(); ?>
+                        <?php echo $etablissement->getStructure()->getLibelle(); ?>
                         <?php if ($etablissement->getStructure()->estFermee()) : ?>
                             &nbsp;<span class="badge bg-danger">Structure fermée</span>
                         <?php endif; ?>
@@ -100,7 +100,7 @@ $canSubstituer = $this->isAllowed(SubstitutionPrivileges::getResourceId(Substitu
                 <td>
                     <?php echo $etablissement->getStructure()->getCode(); ?>
                 </td>
-                <td> <?php echo $etablissement->getSigle(); ?> </td>
+                <td> <?php echo $etablissement->getStructure()->getSigle(); ?> </td>
                 <td>
                     <?php if (($canModifier OR $canModifierCetEtab) && !$historisee) : ?>
                         <a href="<?php echo $this->url('etablissement/supprimer', ["structure" => $etablissement->getStructure()->getId()], [], true); ?>"
@@ -161,7 +161,7 @@ $canSubstituer = $this->isAllowed(SubstitutionPrivileges::getResourceId(Substitu
             <tr>
                 <td>
                     <a href="<?php echo $this->url('etablissement/information', ['structure' => $etablissement->getStructure()->getId()], [], true); ?>">
-                        <?php echo $etablissement->getLibelle(); ?>
+                        <?php echo $etablissement->getStructure()->getLibelle(); ?>
                     </a>
                     <?php if ($etablissement->estMembre()): ?>
                         <span class="badge bg-primary">Membre</span>
@@ -176,7 +176,7 @@ $canSubstituer = $this->isAllowed(SubstitutionPrivileges::getResourceId(Substitu
                 <td>
                     <?php echo $etablissement->getStructure()->getCode(); ?>
                 </td>
-                <td> <?php echo $etablissement->getSigle(); ?> </td>
+                <td> <?php echo $etablissement->getStructure()->getSigle(); ?> </td>
                 <td>
                     <?php if (($canModifier OR $canModifierCetEtab) && !$historisee) : ?>
                         <a href="<?php echo $this->url('etablissement/supprimer', ["structure" => $etablissement->getStructure()->getId()], [], true); ?>"
diff --git a/module/Structure/view/structure/etablissement/information.phtml b/module/Structure/view/structure/etablissement/information.phtml
index a95bfc373..e0c2b1a2c 100644
--- a/module/Structure/view/structure/etablissement/information.phtml
+++ b/module/Structure/view/structure/etablissement/information.phtml
@@ -16,7 +16,7 @@ use Structure\Entity\Db\Etablissement;
 use Structure\Entity\Db\TypeStructure;
 use Structure\Provider\Privilege\StructurePrivileges;
 
-$this->headTitle('Details de l\'établissement ['.$etablissement->getLibelle().']');
+$this->headTitle('Details de l\'établissement ['.$etablissement->getStructure()->getLibelle().']');
 
 $canAddRole = true;
 $canModifierEtablissement = $this->isAllowed(StructurePrivileges::getResourceId(StructurePrivileges::STRUCTURE_MODIFICATION_TOUTES_STRUCTURES));
@@ -25,7 +25,7 @@ $tab = $this->queryParams()['tab'] ?? StructureController::TAB_infos;
 ?>
 
 <h1 class="page-header">
-    Details de l'établissement [  <?php echo $etablissement->getLibelle(); ?> ]
+    Details de l'établissement [  <?php echo $etablissement->getStructure()->getLibelle(); ?> ]
 </h1>
 
 <?php echo $this->messenger()->addMessagesFromFlashMessengerWithNoNamespace() ?>
@@ -69,8 +69,8 @@ $tab = $this->queryParams()['tab'] ?? StructureController::TAB_infos;
     <div class="row">
         <div class="col-md-6">
             <dl>
-                <dt> Libelle : </dt>                <dd>    <?php echo $etablissement->getLibelle(); ?>     </dd>
-                <dt> Sigle : </dt>                  <dd>    <?php echo $etablissement->getSigle() ?: "(Non renseigné)"; ?></dd>
+                <dt> Libelle : </dt>                <dd>    <?php echo $etablissement->getStructure()->getLibelle(); ?>     </dd>
+                <dt> Sigle : </dt>                  <dd>    <?php echo $etablissement->getStructure()->getSigle() ?: "(Non renseigné)"; ?></dd>
                 <dt> Adresse : </dt>                <dd>    <?php echo $etablissement->getStructure()->getAdresse() ?: "(Non renseignée)"; ?></dd>
                 <dt> Téléphone : </dt>              <dd>    <?php echo $etablissement->getStructure()->getTelephone() ?: "(Non renseigné)"; ?></dd>
                 <dt> Fax : </dt>                    <dd>    <?php echo $etablissement->getStructure()->getFax() ?: "(Non renseigné)"; ?></dd>
diff --git a/module/Structure/view/structure/structure/televerser-document.phtml b/module/Structure/view/structure/structure/televerser-document.phtml
index 518c929a9..f4b930ed3 100644
--- a/module/Structure/view/structure/structure/televerser-document.phtml
+++ b/module/Structure/view/structure/structure/televerser-document.phtml
@@ -29,7 +29,7 @@ use Fichier\Entity\Db\NatureFichier;
                 <select class="form-control" id="etablissement" name="etablissement">
                     <option value="null">(Aucun)</option>
                     <?php foreach ($etablissements as $etablissement) : ?>
-                        <option value="<?php echo $etablissement->getId(); ?>"> <?php echo $etablissement->getLibelle(); ?> </option>
+                        <option value="<?php echo $etablissement->getId(); ?>"> <?php echo $etablissement->getStructure()->getLibelle(); ?> </option>
                     <?php endforeach; ?>
                 </select>
             </div>
diff --git a/module/Structure/view/structure/substitution/afficher-automatique.phtml b/module/Structure/view/structure/substitution/afficher-automatique.phtml
index a81f5c016..d9dd336cc 100644
--- a/module/Structure/view/structure/substitution/afficher-automatique.phtml
+++ b/module/Structure/view/structure/substitution/afficher-automatique.phtml
@@ -5,6 +5,8 @@
  * @var string  $type
  * @var StructureConcreteInterface[] $substituees
  * @var StructureConcreteInterface   $substituante
+ *
+ * @see \Structure\Controller\SubstitutionController::substitutionAutomatiqueAction()
  */
 
 use Structure\Entity\Db\StructureConcreteInterface;
diff --git a/module/Structure/view/structure/substitution/index-structure.phtml b/module/Structure/view/structure/substitution/index-structure.phtml
index d58a37b31..e1c0ae4d0 100644
--- a/module/Structure/view/structure/substitution/index-structure.phtml
+++ b/module/Structure/view/structure/substitution/index-structure.phtml
@@ -7,7 +7,7 @@ use Structure\Provider\Privilege\SubstitutionPrivileges;
 /**
   * @see \Soutenance\Controller\IndexController::indexStructureAction()
   * @var string $type
-  * @var StructureConcreteInterface[] $structures
+  * @var \Structure\Entity\Db\StructureInterface[] $structures
   */
 
  $libelle = 'Structure';
@@ -61,7 +61,7 @@ $canSubstitutionAutomatique = $this->isAllowed(SubstitutionPrivileges::getResour
 
                     <?php if ($canSubstitutionAutomatique): ?>
                         <a href="<?php echo $this->url('substitution-automatique', ['type' => $type], [], true);?>" class="float-end" title="Recherche automatique de substitution">
-                            <button class="btn btn-secondary"><span class="fas fa-cog"></span> Recherche automatique de substitutions </button>
+                            <button class="btn btn-secondary"><span class="fas fa-cog"></span> Recherche de substitutions possibles</button>
                         </a>
                     <?php endif; ?>
                 </p>
diff --git a/module/Structure/view/structure/substitution/modifier.phtml b/module/Structure/view/structure/substitution/modifier.phtml
index 1aa76b10c..3f0139aa3 100644
--- a/module/Structure/view/structure/substitution/modifier.phtml
+++ b/module/Structure/view/structure/substitution/modifier.phtml
@@ -3,7 +3,6 @@
 namespace Structure;
 
 use Structure\Controller\SubstitutionController;
-use Structure\Entity\Db\EcoleDoctorale;
 use Structure\Entity\Db\Structure;
 use Structure\Entity\Db\StructureConcreteInterface;
 use Structure\Entity\Db\TypeStructure;
@@ -15,11 +14,12 @@ use Application\View\Renderer\PhpRenderer;
  * @var string $identifiant
  * @var Structure $cible
  * @var StructureConcreteInterface[] $structuresConcretesSubstituees
- * @var StructureConcreteInterface[] $structuresConcretes
+ * @var array[] $structuresConcretes
  * @var TypeStructure $type
  * @var string $structureCibleLogoContent
  * @var string $structuresConcretesSubstitueesLogosContents
  *
+ * @see SubstitutionController::creerAction()
  * @see SubstitutionController::modifierAction()
  */
 
@@ -38,7 +38,7 @@ echo $messenger->addMessagesFromFlashMessenger();
 
 <p>
     <a href="<?php echo $this->url('substitution-index', [], [], null); ?>" class="">
-        < Retour à l'index des substitution
+        < Retour à l'index des substitutions
     </a>
 </p>
 
@@ -94,18 +94,18 @@ echo $messenger->addMessagesFromFlashMessenger();
 <?php
 
 /**
- * @param $structuresConcretes
+ * @param array[] $structuresConcretes
  * @param \Laminas\View\Renderer\PhpRenderer $renderer
  * @return string
  */
-function generateSelect($structuresConcretes, \Laminas\View\Renderer\PhpRenderer $renderer)
+function generateSelect(array $structuresConcretes, \Laminas\View\Renderer\PhpRenderer $renderer): string
 {
-    $texte = "";
-    $texte .= "<select name='nouveau' class='selectpicker' data-bs-html='true' data-live-search='true'>";
+    $texte = "<select name='nouveau' class='selectpicker' data-bs-html='true' data-live-search='true'>";
     $texte .= "<option value=''>(Sélectionnez la structure à ajouter)</option>";
     foreach ($structuresConcretes as $structuresConcrete) {
-        $url = $renderer->url('substitution-generer', ['id' => $structuresConcrete->getStructure()->getId()]);
-        $texte .= "<option data-struct-id='" . $structuresConcrete->getId() . "' value='" . $url . "'>" . $structuresConcrete->getLibelle() . "</option>";
+        $url = $renderer->url('substitution-generer', ['id' => $structuresConcrete['structure']['id']]);
+        $disabled = isset($structuresConcrete['structure']['structureSubstituante'][0]) ? 'disabled' : '';
+        $texte .= "<option data-struct-id='" . $structuresConcrete['id'] . "' value='" . $url . "' $disabled>" . $structuresConcrete['structure']['libelle'] . "</option>";
     }
     $texte .= "</select>";
     return $texte;
diff --git a/module/Structure/view/structure/substitution/partial/substitution-automatique.phtml b/module/Structure/view/structure/substitution/partial/substitution-automatique.phtml
index 04a3cbac2..8fced26d7 100644
--- a/module/Structure/view/structure/substitution/partial/substitution-automatique.phtml
+++ b/module/Structure/view/structure/substitution/partial/substitution-automatique.phtml
@@ -5,6 +5,8 @@
  * @var string  $type
  * @var StructureConcreteInterface[] $substituees
  * @var StructureConcreteInterface   $substituante
+ *
+ * @see \Structure\Controller\SubstitutionController::substitutionAutomatiqueAction()
  */
 
 use Structure\Entity\Db\StructureConcreteInterface;
@@ -13,55 +15,53 @@ use Structure\Entity\Db\StructureConcreteInterface;
 
 <div id="div_<?php echo $type; ?>_<?php echo $identifiant; ?>" class="card">
     <div class="card-header bg-dark text-white">
-        Substitution basé sur l'identitfiant <?php echo $identifiant; ?>
+        Substitution basée sur l'identifiant commun '<?php echo $identifiant; ?>'
     </div>
     <div class="row card-body">
 
-        <div class="col-md-5">
-            Substituées :
+        <div class="col-md-7">
+            Substituables :
             <ol>
                 <?php foreach($substituees as $structure): ?>
                     <li>
                         <?php echo $structure->getSourceCode(); ?>
                         -
-                        <?php echo $structure->getLibelle(); ?>
+                        <?php echo $structure->getStructure()->getLibelle(); ?>
                     </li>
                 <?php endforeach; ?>
             </ol>
         </div>
-        <div class="col-md-5">
-            Substituante :
-            <?php if ($substituante !== null): ?>
-                <ul>
-                    <li>
-                        <?php echo $substituante->getSourceCode(); ?>
-                        -
-                        <?php echo $substituante->getLibelle(); ?>
-                    </li>
-                </ul>
-            <?php endif ?>
-        </div>
+<!--        <div class="col-md-5">-->
+<!--            Substituante :-->
+<!--            --><?php //if ($substituante !== null): ?>
+<!--                <ul>-->
+<!--                    <li>-->
+<!--                        --><?php //echo $substituante->getSourceCode(); ?>
+<!--                        --->
+<!--                        --><?php //echo $substituante->getStructure()->getLibelle(); ?>
+<!--                    </li>-->
+<!--                </ul>-->
+<!--            --><?php //endif ?>
+<!--        </div>-->
         <div class="col-md-2">
             <a
                 data-event="edition-substitution"
                 href="<?php echo $this->url('substitution-automatique/modifier', ['type' => $type, 'identifiant' => $identifiant], [], true); ?>"
-                class="ajax-modal"
+                class="ajax-modalx"
             >
-                <button id="editer_<?php echo $type; ?>_<?php echo $identifiant; ?>" class="btn btn-info" style="width:95%;margin:2px;">
+                <button id="editer_<?php echo $type; ?>_<?php echo $identifiant; ?>" class="btn btn-primary">
                     <span class="icon icon-edit"></span>
-                    Personnaliser
+                    Personnaliser...
                 </button>
             </a>
-            <br/>
-            <button id="valider_<?php echo $type; ?>_<?php echo $identifiant; ?>" class="btn btn-success" style="width:95%;margin:2px;">
-                <span class="icon icon-oui"></span>
-                Enregistrer
-            </button>
-            <br/>
-            <button id="annuler_<?php echo $type; ?>_<?php echo $identifiant; ?>" class="btn btn-danger" style="width:95%;margin:2px;">
+<!--            <button id="valider_--><?php //echo $type; ?><!--_--><?php //echo $identifiant; ?><!--" class="btn btn-success">-->
+<!--                <span class="icon icon-oui"></span>-->
+<!--                Enregistrer-->
+<!--            </button>-->
+            <button id="annuler_<?php echo $type; ?>_<?php echo $identifiant; ?>" class="btn btn-outline-danger">
                 <span class="icon icon-delete"></span>
                 Masquer
-            </button> <br/>
+            </button>
         </div>
     </div>
 </div>
diff --git a/module/Structure/view/structure/substitution/substitution-automatique.phtml b/module/Structure/view/structure/substitution/substitution-automatique.phtml
index 7571aaa47..baf9314bb 100644
--- a/module/Structure/view/structure/substitution/substitution-automatique.phtml
+++ b/module/Structure/view/structure/substitution/substitution-automatique.phtml
@@ -5,17 +5,19 @@
  * @var array $substitutionsEcolesDoctorales (identifiant => EcoleDoctorale[])
  * @var array $substitutionsEtablissements (identifiant => Etablissement[])
  * @var array $substitutionsUnitesRecherches (identifiant => UniteRecherche[])
+ *
+ * @see \Structure\Controller\SubstitutionController::substitutionAutomatiqueAction()
  */
 
 use Structure\Entity\Db\TypeStructure;
 
 ?>
 
-<?php $this->headTitle($this->translate("Substitutions automatiques")) ?>
+<?php $this->headTitle()->append($this->translate("Recherche de substitutions possibles")) ?>
 
 
 <h1 class="page-header first">
-    Substitutions automatiques
+    Recherche de substitutions possibles
 </h1>
 
 <?php
@@ -79,7 +81,7 @@ echo $messenger->addMessagesFromFlashMessenger();
                 var type = id[1];
                 var identifiant = id[2];
 
-                var url = "automatique/enregistrer/" + type + "/" + identifiant;
+                var url = type + "/enregistrer/" + identifiant;
                 $.ajax({
                     type: "POST",
                     url : url,
diff --git a/module/Structure/view/structure/unite-recherche/index.phtml b/module/Structure/view/structure/unite-recherche/index.phtml
index 320e07a00..7ca835e9f 100644
--- a/module/Structure/view/structure/unite-recherche/index.phtml
+++ b/module/Structure/view/structure/unite-recherche/index.phtml
@@ -69,7 +69,7 @@ $canSubstituer = $this->isAllowed(SubstitutionPrivileges::getResourceId(Substitu
             <tr>
                 <td>
                     <a href="<?php echo $this->url('unite-recherche/information', ['structure' => $unite->getStructure()->getId()], [], true); ?>">
-                        <?php echo $unite->getLibelle(); ?>
+                        <?php echo $unite->getStructure()->getLibelle(); ?>
                         <?php if ($unite->getStructure()->estFermee()) : ?>
                             &nbsp;<span class="badge bg-danger">Structure fermée</span>
                         <?php endif; ?>
@@ -81,7 +81,7 @@ $canSubstituer = $this->isAllowed(SubstitutionPrivileges::getResourceId(Substitu
                 <td>
                     <?php echo $unite->getStructure()->getCode(); ?>
                 </td>
-                <td> <?php echo $unite->getSigle(); ?> </td>
+                <td> <?php echo $unite->getStructure()->getSigle(); ?> </td>
                 <td> <?php echo $unite->getRNSR(); ?> </td>
 <!--                <td> --><?php //echo count($unite->getTheses()); ?><!-- </td>-->
                 <td>
diff --git a/module/Structure/view/structure/unite-recherche/information.phtml b/module/Structure/view/structure/unite-recherche/information.phtml
index 1ef78cab0..542831286 100644
--- a/module/Structure/view/structure/unite-recherche/information.phtml
+++ b/module/Structure/view/structure/unite-recherche/information.phtml
@@ -34,7 +34,7 @@ $structure = $unite->getStructure();
 ?>
 
 <h1 class="page-header">
-    Unité de recherche &laquo; <?php echo $unite->getLibelle(); ?> &raquo;
+    Unité de recherche &laquo; <?php echo $unite->getStructure()->getLibelle(); ?> &raquo;
 </h1>
 
 <?php echo $this->messenger()->addMessagesFromFlashMessengerWithNoNamespace() ?>
@@ -82,9 +82,9 @@ $structure = $unite->getStructure();
         <div class="col-md-8">
             <dl>
                 <dt> Libelle :</dt>
-                <dd>    <?php echo $unite->getLibelle(); ?>     </dd>
+                <dd>    <?php echo $unite->getStructure()->getLibelle(); ?>     </dd>
                 <dt> Sigle :</dt>
-                <dd>    <?php echo $unite->getSigle(); ?>       </dd>
+                <dd>    <?php echo $unite->getStructure()->getSigle(); ?>       </dd>
                 <dt> Code :</dt>
                 <dd>    <?php echo $unite->getStructure()->getCode(); ?>        </dd>
                 <dt> Id REF: </dt>
@@ -109,7 +109,7 @@ $structure = $unite->getStructure();
                 <dd>
                     <ul>
                         <?php foreach ($etablissementsRattachements as $etablissementRattachement) : ?>
-                            <li> <?php echo $etablissementRattachement->getEtablissement()->getLibelle(); ?></li>
+                            <li> <?php echo $etablissementRattachement->getEtablissement()->getStructure()->getLibelle(); ?></li>
                         <?php endforeach; ?>
                     </ul>
                 </dd>
diff --git a/module/Structure/view/structure/unite-recherche/modifier.phtml b/module/Structure/view/structure/unite-recherche/modifier.phtml
index 5e9e87b72..d5aee691b 100644
--- a/module/Structure/view/structure/unite-recherche/modifier.phtml
+++ b/module/Structure/view/structure/unite-recherche/modifier.phtml
@@ -40,7 +40,7 @@ $form->get('code')->setAttribute('readonly', !$editable);
     <?php if ($isNew): ?>
         Création d'une nouvelle UR
     <?php else: ?>
-        Modification de l'UR &laquo; <?php echo $unite->getLibelle(); ?> &raquo;
+        Modification de l'UR &laquo; <?php echo $unite->getStructure()->getLibelle(); ?> &raquo;
     <?php endif ?>
 </h1>
 
@@ -71,7 +71,7 @@ $form->get('code')->setAttribute('readonly', !$editable);
 
         $content = $logoContent;
         if ($content === null) {
-            $unite->setCheminLogo(null);
+            $unite->getStructure()->setCheminLogo(null);
         }
         ?>
 
@@ -146,7 +146,7 @@ $form->get('code')->setAttribute('readonly', !$editable);
             <tbody>
             <?php foreach ($etablissementsRattachements as $etablissementRattachement): ?>
                 <tr>
-                    <td> <?php echo $etablissementRattachement->getEtablissement()->getLibelle(); ?> </td>
+                    <td> <?php echo $etablissementRattachement->getEtablissement()->getStructure()->getLibelle(); ?> </td>
                     <td>
                         <a
                                 href="<?php echo $this->url("unite-recherche/modifier/retirer-etablissement-rattachement", ["structure" => $idUniteRecherche, "etablissement" => $etablissementRattachement->getEtablissement()->getId()], [], true); ?>"
diff --git a/module/These/src/These/Controller/CoEncadrantController.php b/module/These/src/These/Controller/CoEncadrantController.php
index 548417614..c6629e3d6 100644
--- a/module/These/src/These/Controller/CoEncadrantController.php
+++ b/module/These/src/These/Controller/CoEncadrantController.php
@@ -164,7 +164,7 @@ class CoEncadrantController extends AbstractActionController {
 
         $logos = [];
         try {
-            $logos['etablissement'] = $this->fichierStorageService->getFileForLogoStructure($coencadrant->getEtablissement());
+            $logos['etablissement'] = $this->fichierStorageService->getFileForLogoStructure($coencadrant->getEtablissement()->getStructure());
         } catch (StorageAdapterException $e) {
             $logos['etablissement'] = null;
         }
@@ -203,7 +203,7 @@ class CoEncadrantController extends AbstractActionController {
             );
             $records[] = $entry;
         }
-        $filename = (new DateTime())->format('Ymd-His') . '_coencadrants-' . str_replace(' ','_',$structure->getSigle()) . '.csv';
+        $filename = (new DateTime())->format('Ymd-His') . '_coencadrants-' . str_replace(' ','_',$structure->getStructure()->getSigle()) . '.csv';
         $CSV = new CsvModel();
         $CSV->setDelimiter(';');
         $CSV->setEnclosure('"');
diff --git a/module/These/src/These/Controller/TheseController.php b/module/These/src/These/Controller/TheseController.php
index 5c9fef219..f3a5472bb 100755
--- a/module/These/src/These/Controller/TheseController.php
+++ b/module/These/src/These/Controller/TheseController.php
@@ -1374,7 +1374,7 @@ class TheseController extends AbstractController
             $etablissement = $these->getEtablissement();
         }
         try {
-            $cheminLogo = $this->fichierStorageService->getFileForLogoStructure($etablissement);
+            $cheminLogo = $this->fichierStorageService->getFileForLogoStructure($etablissement->getStructure());
         } catch (StorageAdapterException $e) {
             $cheminLogo = null;
         }
diff --git a/module/These/src/These/Service/CoEncadrant/Exporter/JustificatifCoencadrements/justificatif-coencadrements.phtml b/module/These/src/These/Service/CoEncadrant/Exporter/JustificatifCoencadrements/justificatif-coencadrements.phtml
index 61ed3e056..cc49174bc 100644
--- a/module/These/src/These/Service/CoEncadrant/Exporter/JustificatifCoencadrements/justificatif-coencadrements.phtml
+++ b/module/These/src/These/Service/CoEncadrant/Exporter/JustificatifCoencadrements/justificatif-coencadrements.phtml
@@ -122,7 +122,7 @@ use Application\View\Renderer\PhpRenderer;
 <p>
     Ce document certifie que <?php echo $coencadrant->getIndividu()->getPrenom1(); ?> <?php echo $coencadrant->getIndividu()->getNomUsuel(); ?>,
     actuellement <?php echo ($coencadrant->getQualite() !== " ")?$coencadrant->getQualite():""; ?> à
-    <?php echo ($coencadrant->getEtablissement())?$coencadrant->getEtablissement()->getLibelle():"<span style='color:darkred;'>établissement manquant</span>"; ?>,
+    <?php echo ($coencadrant->getEtablissement())?$coencadrant->getEtablissement()->getStructure()->getLibelle():"<span style='color:darkred;'>établissement manquant</span>"; ?>,
     a assuré la fonction de co-encadrant sur pour les thèses suivantes :
 </p>
 
@@ -135,9 +135,9 @@ use Application\View\Renderer\PhpRenderer;
         <?php echo $these->getDoctorant()->getIndividu()->getPrenom1(); ?>
         <?php echo $these->getDoctorant()->getIndividu()->getNomUsuel(); ?>
         -
-        <?php echo $these->getEtablissement()->getLibelle(); ?>
+        <?php echo $these->getEtablissement()->getStructure()->getLibelle(); ?>
         -
-        <?php echo $these->getUniteRecherche()->getLibelle(); ?> (<?php echo $these->getUniteRecherche()->getSigle(); ?>)
+        <?php echo $these->getUniteRecherche()->getStructure()->getLibelle(); ?> (<?php echo $these->getUniteRecherche()->getStructure()->getSigle(); ?>)
     </li>
 <?php endforeach; ?>
 </ul>
diff --git a/module/These/src/These/Service/These/TheseService.php b/module/These/src/These/Service/These/TheseService.php
index 6fa3093bf..901eb244e 100644
--- a/module/These/src/These/Service/These/TheseService.php
+++ b/module/These/src/These/Service/These/TheseService.php
@@ -503,7 +503,7 @@ class TheseService extends BaseService implements ListenerAggregateInterface
         $pdcData->setTitre($these->getTitre());
         $pdcData->setSpecialite($these->getLibelleDiscipline());
         if ($these->getEtablissement()) {
-            $pdcData->setEtablissement($these->getEtablissement()->getLibelle());
+            $pdcData->setEtablissement($these->getEtablissement()->getStructure()->getLibelle());
         }
         if ($these->getDoctorant()) {
             $pdcData->setDoctorant(strtoupper($these->getDoctorant()->getIndividu()->getNomComplet(false, true, false, true, true, false)));
@@ -574,11 +574,11 @@ class TheseService extends BaseService implements ListenerAggregateInterface
                 if ($directeur->getEtablissement()->estAssocie()) {
                     $pdcData->setAssocie(true);
                     try {
-                        $pdcData->setLogoAssocie($this->fichierStorageService->getFileForLogoStructure($directeur->getEtablissement()));
+                        $pdcData->setLogoAssocie($this->fichierStorageService->getFileForLogoStructure($directeur->getEtablissement()->getStructure()));
                     } catch (StorageAdapterException $e) {
                         $pdcData->setLogoAssocie(null);
                     }
-                    $pdcData->setLibelleAssocie($directeur->getEtablissement()->getLibelle());
+                    $pdcData->setLibelleAssocie($directeur->getEtablissement()->getStructure()->getLibelle());
                 }
             }
         }
@@ -640,13 +640,13 @@ class TheseService extends BaseService implements ListenerAggregateInterface
         foreach ($directeurs as $directeur) {
             $current = strtoupper($directeur->getIndividu()->getNomComplet(false, false, false, true, true));
             $structure = ($these->getUniteRecherche())?:$directeur->getIndividu()->getUniteRecherche()?:$directeur->getIndividu()->getEtablissement();
-            if ($structure !== null) $current .= " (". $structure->getLibelle() .")";
+            if ($structure !== null) $current .= " (". $structure->getStructure()->getLibelle() .")";
             $nomination[] = $current;
         }
         foreach ($codirecteurs as $directeur) {
             $current = strtoupper($directeur->getIndividu()->getNomComplet(false, false, false, true, true));
             $structure = ($directeur->getIndividu()->getUniteRecherche())?:$directeur->getIndividu()->getEtablissement();
-            if ($structure !== null) $current .= " (". $structure->getLibelle() .")";
+            if ($structure !== null) $current .= " (". $structure->getStructure()->getLibelle() .")";
             $nomination[] = $current;
         }
         $pdcData->setListing(implode(" et ", $nomination));
@@ -656,26 +656,26 @@ class TheseService extends BaseService implements ListenerAggregateInterface
         // chemins vers les logos
         if ($comue = $this->etablissementService->fetchEtablissementComue()) {
             try {
-                $pdcData->setLogoCOMUE($this->fichierStorageService->getFileForLogoStructure($comue));
+                $pdcData->setLogoCOMUE($this->fichierStorageService->getFileForLogoStructure($comue->getStructure()));
             } catch (StorageAdapterException $e) {
                 $pdcData->setLogoCOMUE(null);
             }
         }
         try {
-            $pdcData->setLogoEtablissement($this->fichierStorageService->getFileForLogoStructure($these->getEtablissement()));
+            $pdcData->setLogoEtablissement($this->fichierStorageService->getFileForLogoStructure($these->getEtablissement()->getStructure()));
         } catch (StorageAdapterException $e) {
             $pdcData->setLogoEtablissement(null);
         }
         if ($these->getEcoleDoctorale() !== null) {
             try {
-                $pdcData->setLogoEcoleDoctorale($this->fichierStorageService->getFileForLogoStructure($these->getEcoleDoctorale()));
+                $pdcData->setLogoEcoleDoctorale($this->fichierStorageService->getFileForLogoStructure($these->getEcoleDoctorale()->getStructure()));
             } catch (StorageAdapterException $e) {
                 $pdcData->setLogoEcoleDoctorale(null);
             }
         }
         if ($these->getUniteRecherche() !== null) {
             try {
-                $pdcData->setLogoUniteRecherche($this->fichierStorageService->getFileForLogoStructure($these->getUniteRecherche()));
+                $pdcData->setLogoUniteRecherche($this->fichierStorageService->getFileForLogoStructure($these->getUniteRecherche()->getStructure()));
             } catch (StorageAdapterException $e) {
                 $pdcData->setLogoUniteRecherche(null);
             }
diff --git a/module/These/view/these/co-encadrant/partial/table-these.phtml b/module/These/view/these/co-encadrant/partial/table-these.phtml
index 94eed380a..0f3e273ea 100644
--- a/module/These/view/these/co-encadrant/partial/table-these.phtml
+++ b/module/These/view/these/co-encadrant/partial/table-these.phtml
@@ -28,13 +28,13 @@ use These\Entity\Db\These;
                 <?php echo $these->getDoctorant()->getIndividu()->getNomUsuel(); ?>
             </td>
             <td>
-                <?php echo $these->getUniteRecherche()->getSigle(); ?>
+                <?php echo $these->getUniteRecherche()->getStructure()->getSigle(); ?>
             </td>
             <td>
-                <?php echo $these->getEcoleDoctorale()->getSigle(); ?>
+                <?php echo $these->getEcoleDoctorale()->getStructure()->getSigle(); ?>
             </td>
             <td>
-                <?php echo $these->getEtablissement()->getLibelle(); ?>
+                <?php echo $these->getEtablissement()->getStructure()->getLibelle(); ?>
             </td>
             <td>
                 <?php echo $these->getEtatThese(); ?>
diff --git a/module/These/view/these/these-recherche/index.phtml b/module/These/view/these/these-recherche/index.phtml
index 43536a23b..e6900a08d 100644
--- a/module/These/view/these/these-recherche/index.phtml
+++ b/module/These/view/these/these-recherche/index.phtml
@@ -144,7 +144,7 @@ $acteursFormatterCodirecteurs->asSeparated()
                     if ($displayEtablissement) {
                         echo "<td>";
                         echo "<abbr title='";
-                        echo $these->getEtablissement()->getLibelle();
+                        echo $these->getEtablissement()->getStructure()->getLibelle();
                         echo "'>";
                         echo $these->getEtablissement()->getStructure()->getCode();
                         echo "</abbr>";
@@ -169,9 +169,9 @@ $acteursFormatterCodirecteurs->asSeparated()
                 </td>
                 <td>
                     <?php if($these->getEcoleDoctorale()): ?>
-                        <abbr title="<?php echo $these->getEcoleDoctorale()->getLibelle() ?>">
+                        <abbr title="<?php echo $these->getEcoleDoctorale()->getStructure()->getLibelle() ?>">
                             <?php
-                            $sigle = $these->getEcoleDoctorale()->getSigle();
+                            $sigle = $these->getEcoleDoctorale()->getStructure()->getSigle();
                             if ($sigle && $sigle !== "") {
                                 echo $sigle;
                             } else {
@@ -183,7 +183,7 @@ $acteursFormatterCodirecteurs->asSeparated()
                 </td>
                 <td>
                     <?php if($these->getUniteRecherche()): ?>
-                        <abbr title="<?php echo $these->getUniteRecherche()->getLibelle() ?>">
+                        <abbr title="<?php echo $these->getUniteRecherche()->getStructure()->getLibelle() ?>">
                             <?php echo $these->getUniteRecherche()->getStructure()->getCode(); ?>
                         </abbr>
                     <?php endif ?>
diff --git a/module/These/view/these/these/identite.phtml b/module/These/view/these/these/identite.phtml
index 3b9e329d0..a40efdd6d 100644
--- a/module/These/view/these/these/identite.phtml
+++ b/module/These/view/these/these/identite.phtml
@@ -233,7 +233,7 @@ $financementFormatter->setDisplayAs(FinancementFormatter::DISPLAY_AS_LINE);
                 <?php
                 if ($these->getEtablissement()) {
                     echo /*$these->getEtablissement()->getCode() . " - " .*/
-                    $these->getEtablissement()->getLibelle();
+                    $these->getEtablissement()->getStructure()->getLibelle();
                 } else {
                     echo "<div class='alert alert-sm alert-warning'>";
                     echo "<span class='fas fa-exclamation-triangle'></span> Aucun établissement n'est renseignée.";
@@ -258,7 +258,7 @@ $financementFormatter->setDisplayAs(FinancementFormatter::DISPLAY_AS_LINE);
                 <?php
                 if ($these->getUniteRecherche()) {
                     echo /*$these->getUniteRecherche()->getSourceCode() . " - " .*/
-                    $these->getUniteRecherche()->getLibelle();
+                    $these->getUniteRecherche()->getStructure()->getLibelle();
                 } elseif ($these->getCodeUniteRecherche() && $these->getLibelleUniteRecherche()) {
                     echo $these->getCodeUniteRecherche() . " - " . $these->getLibelleUniteRecherche();
                     echo "<div class='alert alert-sm alert-warning'>";
@@ -284,7 +284,7 @@ $financementFormatter->setDisplayAs(FinancementFormatter::DISPLAY_AS_LINE);
                     echo "(Aucun établissement de rattachement renseigné)";
                 } else {
                     foreach ($rattachements as $rattachement) {
-                        echo $rattachement->getEtablissement()->getLibelle();
+                        echo $rattachement->getEtablissement()->getStructure()->getLibelle();
                         echo "<br/>";
                     }
                 }
@@ -298,7 +298,7 @@ $financementFormatter->setDisplayAs(FinancementFormatter::DISPLAY_AS_LINE);
             <dd class="col-md-8">
                 <?php if ($these->getEcoleDoctorale()) {
                     echo /*$these->getEcoleDoctorale()->getSourceCode() . " - " .*/
-                    $these->getEcoleDoctorale()->getLibelle();
+                    $these->getEcoleDoctorale()->getStructure()->getLibelle();
                 } else {
                     echo "<div class='alert alert-sm alert-warning'>";
                     echo "<span class='fas fa-exclamation-triangle'></span> Aucune école doctorale n'est renseignée.";
diff --git a/module/These/view/these/these/partial/fiche.phtml b/module/These/view/these/these/partial/fiche.phtml
index ca4a636e3..444ce770c 100644
--- a/module/These/view/these/these/partial/fiche.phtml
+++ b/module/These/view/these/these/partial/fiche.phtml
@@ -48,9 +48,9 @@ $acteursFormatter = new ActeursFormatter();
         <td>
             <?php
                 $etablissement = $these->getEtablissement();
-                if ($etablissement === null) echo "Non renseigné"; else echo $etablissement->getSigle();
+                if ($etablissement === null) echo "Non renseigné"; else echo $etablissement->getStructure()->getSigle();
                 echo " - ";
-                if ($etablissement === null) echo "Non renseigné"; else echo $etablissement->getLibelle();
+                if ($etablissement === null) echo "Non renseigné"; else echo $etablissement->getStructure()->getLibelle();
             ?>
         </td>
 
@@ -60,7 +60,7 @@ $acteursFormatter = new ActeursFormatter();
         <th>École doct.</th>
         <td>
             <?php if ($these->getEcoleDoctorale()): ?>
-                <?php echo $these->getEcoleDoctorale()->getSigle() . " - " . $these->getEcoleDoctorale()->getLibelle() ?>
+                <?php echo $these->getEcoleDoctorale()->getStructure()->getSigle() . " - " . $these->getEcoleDoctorale()->getStructure()->getLibelle() ?>
             <?php endif ?>
         </td>
     </tr>
-- 
GitLab