diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 2759ef9f56aad5027654e2911e2c776c4e34f6e5..a1f172ab09f5d18169e4826edd76bf949dc24817 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -19,6 +19,7 @@ import {
   MatCardModule,
   MatTableModule,
   MatSnackBarModule,
+  MatBadgeModule,
   ErrorStateMatcher,
   MatButtonToggleModule
 } from "@angular/material";
@@ -104,6 +105,7 @@ const appRoutes: Routes = [
     ChartModule,
     HttpClientModule,
     FlexLayoutModule,
+    MatBadgeModule,
     MatButtonModule,
     MatButtonToggleModule,
     MatCardModule,
diff --git a/src/app/components/dialog-load-session/dialog-load-session.component.html b/src/app/components/dialog-load-session/dialog-load-session.component.html
index 0473b4cdeb95ad579bf3a19d62aeb8fda50f2427..97e2d6e4296093ab83d1575c2dee75b65b934bae 100644
--- a/src/app/components/dialog-load-session/dialog-load-session.component.html
+++ b/src/app/components/dialog-load-session/dialog-load-session.component.html
@@ -13,7 +13,8 @@
     </mat-form-field>
 
     <div class="cb-container">
-      <mat-checkbox [name]="c.uid" *ngFor="let c of calculators" [(ngModel)]="c.selected" [ngModelOptions]="{standalone: true}">
+      <mat-checkbox [name]="c.uid" *ngFor="let c of calculators" (change)="checkLinkedParamsDependencies()"
+        [(ngModel)]="c.selected" [ngModelOptions]="{standalone: true}">
         {{ c.title }}
       </mat-checkbox>
     </div>
@@ -26,6 +27,20 @@
         {{ uitextNone }}
       </button>
     </div>
+
+    <div class="dependencies-problems" *ngIf="dependenciesProblems.length > 0">
+      <mat-list role="list">
+        <mat-list-item role="listitem" *ngFor="let dp of dependenciesProblems">
+          <mat-icon color="warn">error_outline</mat-icon> {{ dp.message }}
+        </mat-list-item>
+      </mat-list>
+      <p>
+        <button mat-raised-button (click)="fixDependencies()"
+            [matBadge]="dependenciesProblems.length" matBadgeColor="warn">
+          {{ uitextFixMissingDependencies }}
+        </button>
+      </p>
+    </div>
   </div>
 
   <div mat-dialog-actions>
diff --git a/src/app/components/dialog-load-session/dialog-load-session.component.scss b/src/app/components/dialog-load-session/dialog-load-session.component.scss
index e612ad2cf5490552d96d024c1122ef4cd1bbfc1f..f9cad276513dfef8f4fd62cf8ecc57e177dc538b 100644
--- a/src/app/components/dialog-load-session/dialog-load-session.component.scss
+++ b/src/app/components/dialog-load-session/dialog-load-session.component.scss
@@ -17,3 +17,24 @@ mat-form-field {
         margin-right: 5px;
     }
 }
+
+.dependencies-problems {
+
+    .mat-list-base {
+        padding-top: 0;
+
+        .mat-list-item {
+            height: 32px;
+            font-size: .9em;
+
+            ::ng-deep .mat-list-item-content {
+                padding-left: 0;
+
+                mat-icon {
+                    transform: scale(0.8);
+                    margin-right: 5px;
+                }
+            }
+        }
+    }
+}
diff --git a/src/app/components/dialog-load-session/dialog-load-session.component.ts b/src/app/components/dialog-load-session/dialog-load-session.component.ts
index 3aa55c836a420dd0966dd5df2ae72687a382911e..b4bb4c83648e7b19255ad5bb18296ed19273c385 100644
--- a/src/app/components/dialog-load-session/dialog-load-session.component.ts
+++ b/src/app/components/dialog-load-session/dialog-load-session.component.ts
@@ -17,6 +17,8 @@ export class DialogLoadSessionComponent {
 
     public loadSessionForm: FormGroup;
 
+    public dependenciesProblems: any[] = [];
+
     constructor(
       public dialogRef: MatDialogRef<DialogLoadSessionComponent>,
       private intlService: I18nService,
@@ -40,6 +42,74 @@ export class DialogLoadSessionComponent {
       }
     }
 
+    public checkLinkedParamsDependencies() {
+      this.dependenciesProblems = [];
+      // for all checked Nubs
+      this.calculators.forEach((c) => {
+        if (c.selected) {
+          // do all required nubs are checked ?
+          c.requires.forEach((r) => {
+            if (! this.isCalculatorOrParentSelected(r)) {
+              const realUid = this.getUidOrParentUid(r);
+              const depTitle = this.getTitleFromUid(realUid);
+              this.dependenciesProblems.push({
+                requiring: c.title,
+                required: depTitle,
+                requiredUid: realUid,
+                message: c.title + " " + this.intlService.localizeText("INFO_REQUIRES") + " " + depTitle
+              });
+            }
+          });
+        }
+      });
+    }
+
+    public fixDependencies() {
+      for (const dp of this.dependenciesProblems) {
+        this.selectRequiredModule(dp.requiredUid);
+      }
+    }
+
+    private isCalculatorOrParentSelected(uid: string): boolean {
+      let isSelected = false;
+      this.calculators.forEach((c) => {
+        if (c.uid === uid || c.children.includes(uid)) {
+          isSelected = c.selected;
+        }
+      });
+      return isSelected;
+    }
+
+    private getUidOrParentUid(uid: string): string {
+      let realUid: string;
+      this.calculators.forEach((c) => {
+        if (c.uid === uid || c.children.includes(uid)) {
+          realUid = c.uid;
+        }
+      });
+      return realUid;
+    }
+
+    private getTitleFromUid(uid: string): string {
+      let title: string;
+      this.calculators.forEach((c) => {
+        if (c.uid === uid) {
+          title = c.title;
+        }
+      });
+      return title;
+    }
+
+    private selectRequiredModule(uid: string) {
+      this.calculators.forEach((c) => {
+        if (c.uid === uid) {
+          c.selected = true;
+        }
+      });
+      // re-run dependency checking
+      this.checkLinkedParamsDependencies();
+    }
+
     public onFileSelected(event: any) {
       if (event.target.files && event.target.files.length) {
         this.file = event.target.files[0];
@@ -94,4 +164,8 @@ export class DialogLoadSessionComponent {
     public get uitextLoadSessionTitle() {
       return this.intlService.localizeText("INFO_DIALOG_LOAD_SESSION_TITLE");
     }
+
+    public get uitextFixMissingDependencies() {
+      return this.intlService.localizeText("INFO_DIALOG_FIX_MISSING_DEPENDENCIES");
+    }
 }
diff --git a/src/app/services/formulaire/formulaire.service.ts b/src/app/services/formulaire/formulaire.service.ts
index 1c4bfc87b47cbedfaefa5ca6490e1934efb1122c..7a34e00ae22415259bb1ab48f1909952af2e1db4 100644
--- a/src/app/services/formulaire/formulaire.service.ts
+++ b/src/app/services/formulaire/formulaire.service.ts
@@ -451,16 +451,13 @@ export class FormulaireService extends Observable {
     private readSingleFile(file: File): Promise<any> {
         return new Promise<any>((resolve, reject) => {
             const fr = new FileReader();
-
             fr.onload = () => {
                 resolve(fr.result);
             };
-
             fr.onerror = () => {
                 fr.abort();
                 reject(new Error(`Erreur de lecture du fichier ${file.name}`));
             };
-
             fr.readAsText(file);
         });
     }
@@ -507,10 +504,27 @@ export class FormulaireService extends Observable {
             // liste des noms de modules de calcul
             if (data.session && Array.isArray(data.session)) {
                 data.session.forEach((e: any) => {
-                   res.push({
-                       uid: e.uid,
-                       title: e.meta && e.meta.title ? e.meta.title : undefined
-                    });
+                    const nubInfo = {
+                        uid: e.uid,
+                        title: e.meta && e.meta.title ? e.meta.title : undefined,
+                        requires: [],
+                        children: []
+                    };
+                    // list linked params dependencies for each Nub
+                    if (e.parameters) {
+                        e.parameters.forEach((p) => {
+                            if (p.targetNub && ! nubInfo.requires.includes(p.targetNub)) {
+                                nubInfo.requires.push(p.targetNub);
+                            }
+                        });
+                    }
+                    // list children nubs for each Nub
+                    if (e.structures) {
+                        e.structures.forEach((p) => {
+                            nubInfo.children.push(p.uid);
+                        });
+                    }
+                    res.push(nubInfo);
                 });
             }
             return res;
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 506bda9e733d133cd868979e7e1562b87f32f169..d265692b858e3c471593c20e5858f460e21ddad0 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -62,6 +62,7 @@
     "INFO_EXTRARES_ENUM_STRUCTUREFLOWREGIME_2": "Submerged",
     "INFO_EXTRARES_ENUM_STRUCTUREFLOWREGIME_3": "Zero flow",
     "INFO_DIALOG_COMPUTED_VALUE_TITLE": "Edit initial value",
+    "INFO_DIALOG_FIX_MISSING_DEPENDENCIES": "Fix missing dependencies",
     "INFO_DIALOG_LOAD_SESSION_FILENAME": "Choose a file",
     "INFO_DIALOG_LOAD_SESSION_TITLE": "Load calculator modules",
     "INFO_DIALOG_SAVE_SESSION_FILENAME": "File name",
@@ -196,6 +197,7 @@
     "INFO_REMOUS_LARGEUR_BERGE": "Width at embankment level = %B% m",
     "INFO_REMOUS_RESSAUT_DEHORS": "Hydraulic jump detected %sens% abscissa %x% m",
     "INFO_REMOUS_RESSAUT_HYDRO": "Hydraulic jump detected between abscissa %xmin% and %xmax% m",
+    "INFO_REQUIRES": "requires",
     "INFO_SECTIONPARAMETREE_TITRE": "Parametric section",
     "INFO_SECTIONPARAMETREE_TITRE_COURT": "Param. section",
     "INFO_SETUP_NEWTON_MAX_ITER": "Newton iteration limit",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 90b8466f0c88be4dac7a420670df25c44fd81922..5c40ca5d0449305e332aa163b8bc886029baed33 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -62,6 +62,7 @@
     "INFO_EXTRARES_ENUM_STRUCTUREFLOWREGIME_2": "Noyé",
     "INFO_EXTRARES_ENUM_STRUCTUREFLOWREGIME_3": "Débit nul",
     "INFO_DIALOG_COMPUTED_VALUE_TITLE": "Modifier la valeur initiale",
+    "INFO_DIALOG_FIX_MISSING_DEPENDENCIES": "Résoudre les dépendances",
     "INFO_DIALOG_LOAD_SESSION_FILENAME": "Choisir un fichier",
     "INFO_DIALOG_LOAD_SESSION_TITLE": "Charger des modules de calcul",
     "INFO_DIALOG_SAVE_SESSION_FILENAME": "Nom de fichier",
@@ -196,6 +197,7 @@
     "INFO_REMOUS_LARGEUR_BERGE": "Largeur au niveau des berges = %B% m",
     "INFO_REMOUS_RESSAUT_DEHORS": "Ressaut hydraulique détecté à l'%sens% de l'abscisse %x% m",
     "INFO_REMOUS_RESSAUT_HYDRO": "Ressaut hydraulique détecté entre les abscisses %xmin% et %xmax% m",
+    "INFO_REQUIRES": "dépend de",
     "INFO_SECTIONPARAMETREE_TITRE": "Section paramétrée",
     "INFO_SECTIONPARAMETREE_TITRE_COURT": "Sec. param.",
     "INFO_SETUP_NEWTON_MAX_ITER": "Newton : nombre d'itérations maximum",