diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index a1024c868d05344d233cecae6379cc88486e7880..2f6879d8a7507c5cc58584b49c1bb8ea58e3ffdc 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -30,6 +30,11 @@ import { SaveCalculatorComponent } from './components/save-calculator/save-calcu
 export class AppComponent implements OnInit, OnDestroy, Observer {
   private _displayErrorDialog: boolean = false;
 
+  /**
+   * liste des calculettes. Forme des objets :
+   * "title": nom de la calculette
+   * "uid": id unique du formulaire
+   */
   private _calculators: any[] = [];
 
   /**
@@ -339,7 +344,7 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
 
     const prom: Promise<any[]> = compRef.instance.run();
     prom.then(list => {
-      this.formulaireService.loadSession(compRef.instance.selectedFile);
+      this.formulaireService.loadSession(compRef.instance.selectedFile, compRef.instance.calculators);
       compRef.destroy();
     });
   }
diff --git a/src/app/components/load-calculator/load-calculator.component.html b/src/app/components/load-calculator/load-calculator.component.html
index d6ee5866c554c2a394cfaab26a21477abe2fd45b..b596cadbf55f04ffd5ee4cf376c706549d00654d 100644
--- a/src/app/components/load-calculator/load-calculator.component.html
+++ b/src/app/components/load-calculator/load-calculator.component.html
@@ -16,6 +16,8 @@
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-danger relative waves-light" (click)="loadDialog.hide();cancelLoad()" mdbRippleRadius>{{uitextCancel}}</button>
+                <button type="button" class="btn btn-success waves-light" [disabled]="disableLoadButton" (click)="loadDialog.hide();confirmLoad()"
+                    mdbRippleRadius>{{uitextLoad}}</button>
             </div>
         </div>
     </div>
diff --git a/src/app/components/load-calculator/load-calculator.component.ts b/src/app/components/load-calculator/load-calculator.component.ts
index f07ecb22a90290260044dbff4a0e6f4b0bd9d383..c1a3f8b710f1e50228323e7a7c9b8457f1f8a0c7 100644
--- a/src/app/components/load-calculator/load-calculator.component.ts
+++ b/src/app/components/load-calculator/load-calculator.component.ts
@@ -12,6 +12,11 @@ export class LoadCalculatorComponent {
 
     private _selectFile: File;
 
+    /**
+     * liste des calculettes affichées. Forme des objets :
+     * "title": nom de la calculette
+     * "selected": flag de sélection pour la sauvegarde
+     */
     private _calculators: any[];
 
     /**
@@ -36,6 +41,11 @@ export class LoadCalculatorComponent {
         return "Annuler";
     }
 
+    private get uitextLoad() {
+        // return this.intlService.localizeText("INFO_OPTION_NO");
+        return "Charger";
+    }
+
     private get uitextSelectAll() {
         return "Toutes";
     }
@@ -44,6 +54,24 @@ export class LoadCalculatorComponent {
         return "Aucune";
     }
 
+    /**
+     * calcule l'état du bouton charger
+     */
+    private get disableLoadButton() {
+        // pas de fichier sélectionné -> bouton grisé
+        if (this._selectFile === undefined)
+            return true;
+
+        // au moins une calculette sélectionnée -> dégrisé
+        if (this._calculators !== undefined)
+            for (const c of this._calculators)
+                if (c.selected)
+                    return false;
+
+        // grisé sinon
+        return true;
+    }
+
     public run(): Promise<any[]> {
         // promise de gestion de la confirmation/annulation de la sauvegarde
         return new Promise((resolve, reject) => {
@@ -61,29 +89,44 @@ export class LoadCalculatorComponent {
         return this._calculators && this._calculators.length != 0;
     }
 
-    private onFileSelect() {
+    private getSelectedFile(): File {
         const files: { [key: string]: File } = this.fileSelector.nativeElement.files;
-        for (let key in files) {
-            if (!isNaN(parseInt(key))) {
-                this._selectFile = files[key];
-                this.confirmLoad();
-                break;
-            }
-        }
+        for (const key in files)
+            if (!isNaN(parseInt(key)))
+                return files[key];
+        return undefined;
+    }
+
+    private onFileSelect() {
+        const formService = ServiceFactory.instance.formulaireService;
+        this._selectFile = this.getSelectedFile();
+        if (this._selectFile !== undefined)
+            formService.calculatorInfosFromSessionFile(this._selectFile).then(
+                calcInfos => {
+                    this._calculators = calcInfos;
+                    for (const n of this._calculators)
+                        n["selected"] = true;
+                });
     }
 
     public get selectedFile(): File {
         return this._selectFile;
     }
 
+    public get calculators(): any[] {
+        return this._calculators;
+    }
+
     private isSelected(c: any) {
         return c.selected ? "checked" : undefined;
     }
 
     private onCheckCalc(event: any) {
         for (const c of this._calculators)
-            if (c.uid == +event.target.value)
+            if (c.uid == +event.target.value) {
                 c.selected = event.target.checked;
+                break;
+            }
     }
 
     private selectAll() {
@@ -110,7 +153,7 @@ export class LoadCalculatorComponent {
     }
 
     /**
-     * appelé quand on clique sur sauver
+     * appelé quand on clique sur charger
      */
     private confirmLoad() {
         this.confirmed = true;
diff --git a/src/app/components/save-calculator/save-calculator.component.ts b/src/app/components/save-calculator/save-calculator.component.ts
index 99babe24c344b877a0a2417d4eddb581f134826c..f00fd173eae723d0b3c322d70ecdabd1b6ef5e2c 100644
--- a/src/app/components/save-calculator/save-calculator.component.ts
+++ b/src/app/components/save-calculator/save-calculator.component.ts
@@ -7,6 +7,12 @@ import { InternationalisationService } from "../../services/internationalisation
     templateUrl: "./save-calculator.component.html"
 })
 export class SaveCalculatorComponent {
+    /**
+     * liste des calculettes affichées. Forme des objets :
+     * "title": nom de la calculette
+     * "selected": flag de sélection pour la sauvegarde
+     * "uid": id unique du formulaire
+     */
     private _calculators: any[];
 
     /**
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index 7d577b03da01de75cecd1d97d0c94ea3f3085d23..1a43403007d74910984da7d1ad9fdb08868d2e56 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -442,6 +442,7 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
     public JSONserialise(): {} {
         let res = {};
         res["id"] = this.calculatorName;
+        res["uid"] = this.uid;
         res["props"] = this._currentSessionNub.properties.props;
         res["elements"] = this.serialiseKids();
         return { "form": res };
@@ -488,6 +489,7 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
                     this._calculatorName = elements[k];
                     break;
 
+                case "uid":
                 case "props":
                     break;
 
diff --git a/src/app/services/formulaire/formulaire.service.ts b/src/app/services/formulaire/formulaire.service.ts
index c08bb630ebb535b4e72b273d394ae9a7fe4e18b0..b89e1baaa14433aa8e4c48f92abf4e5539435695 100644
--- a/src/app/services/formulaire/formulaire.service.ts
+++ b/src/app/services/formulaire/formulaire.service.ts
@@ -366,13 +366,18 @@ export class FormulaireService extends Observable {
         });
     }
 
-    public loadSession(f: File) {
+    /**
+     * charge une session en tenant compte des calculettes sélectionnées
+     * @param f fichier session
+     * @param formInfos infos sur les calculettes @see LoadCalculatorComponent._calculators
+     */
+    public loadSession(f: File, formInfos: any[]) {
         this.readSingleFile(f).then(s => {
             const session = JSON.parse(s);
             for (const k in session)
                 switch (k) {
                     case "session":
-                        this.deserialiseSession(session[k]);
+                        this.deserialiseSession(session[k], formInfos);
                         break;
 
                     default:
@@ -383,6 +388,36 @@ export class FormulaireService extends Observable {
         });
     }
 
+    /**
+     * obtient des infos (nom, uid des calculettes) d'un fichier session
+     * @param f fichier session
+     */
+    public calculatorInfosFromSessionFile(f: File): Promise<any[]> {
+        return this.readSingleFile(f).then(s => {
+            const res: any[] = [];
+            const session = JSON.parse(s);
+
+            // liste des noms de calculettes
+            for (const k in session)
+                switch (k) {
+                    case "session":
+                        const sess = session[k];
+                        const elems = sess["elements"];
+                        for (const e of elems)
+                            for (const k in e)
+                                if (k === "form") {
+                                    const form = e[k];
+                                    res.push({ "uid": form["uid"], "title": form["id"] });
+                                }
+                        break;
+
+                    default:
+                        throw new Error(`session file : invalid key '${k}'`);
+                }
+            return res;
+        });
+    }
+
     public saveForm(f: FormulaireDefinition) {
         this.notifyObservers({
             "action": "saveForm",
@@ -396,14 +431,18 @@ export class FormulaireService extends Observable {
         this.createFormulaire(ct, elements);
     }
 
-    private deserialiseSessionElement(element: {}) {
+    private deserialiseSessionElement(element: {}, formInfos: any[]) {
         const keys = Object.keys(element);
         if (keys.length !== 1)
             throw new Error(`session file : invalid session object '${element}'`);
 
         switch (keys[0]) {
             case "form":
-                this.deserialiseForm(element[keys[0]]);
+                const form = element[keys[0]];
+
+                for (const i of formInfos)
+                    if (i["uid"] == form["uid"] && i["selected"])
+                        this.deserialiseForm(form);
                 break;
 
             default:
@@ -411,12 +450,12 @@ export class FormulaireService extends Observable {
         }
     }
 
-    private deserialiseSession(elements: {}) {
+    private deserialiseSession(elements: {}, formInfos: any[]) {
         for (const ks in elements)
             switch (ks) {
                 case "elements":
                     for (const e of elements[ks])
-                        this.deserialiseSessionElement(e);
+                        this.deserialiseSessionElement(e, formInfos);
                     break;
 
                 default: