diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 9cd3266d597dad4bdd213f71b5a484c600954c01..a1024c868d05344d233cecae6379cc88486e7880 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -201,11 +201,6 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
     this._calculators[formIndex]["title"] = title;
   }
 
-  private loadSession() {
-    this.formulaireService.loadSession();
-    this.closeNav();
-  }
-
   /**
    * sauvegarde du/des formulaires
    * @param form formulaire à sélectionner par défaut dans la liste
@@ -336,6 +331,19 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
     this.toList();
   }
 
+  private loadSession() {
+    this.closeNav();
+
+    // création du dialogue de sélection des formulaires à sauver
+    const compRef: ComponentRef<LoadCalculatorComponent> = this.loadCalcDialogAnchor.createDialog();
+
+    const prom: Promise<any[]> = compRef.instance.run();
+    prom.then(list => {
+      this.formulaireService.loadSession(compRef.instance.selectedFile);
+      compRef.destroy();
+    });
+  }
+
   private params() {
     this.closeNav();
     this.router.navigate(['/setup']);
diff --git a/src/app/formulaire/fieldset-container.ts b/src/app/formulaire/fieldset-container.ts
index 64aaee77a898620470bc3529cc90b23b81497dd3..1f384a140395d38231d64f8a7bb3e4a439e4a615 100644
--- a/src/app/formulaire/fieldset-container.ts
+++ b/src/app/formulaire/fieldset-container.ts
@@ -28,6 +28,16 @@ export class FieldsetContainer extends FormulaireElement {
         return this._templates[index];
     }
 
+    private getTemplateIndex(id: string): number {
+        let i = 0;
+        for (const t of this._templates) {
+            if (t.config["id"] == id)
+                return i;
+            i++;
+        }
+        throw new Error(`template ${id} non trouvé`);
+    }
+
     public addFieldset(fs: FieldSet) {
         this.fieldsets.push(fs);
     }
@@ -68,7 +78,7 @@ export class FieldsetContainer extends FormulaireElement {
      * @param templateIndex indice du template dans la liste
      * @param after insère le nouveau FieldSet après cette position, à la fin sinon
      */
-    public addFromTemplate(templateIndex: number, after?: number) {
+    public addFromTemplate(templateIndex: number, after?: number): FieldSet {
         const templ: FieldsetTemplate = this._templates[templateIndex];
 
         const inst: FieldSet = templ.instantiateTemplate(this, after);
@@ -80,6 +90,8 @@ export class FieldsetContainer extends FormulaireElement {
             "action": "newFieldset",
             "fieldset": inst
         }, this);
+
+        return inst;
     }
 
     public get fieldsets(): FieldSet[] {
diff --git a/src/app/services/formulaire/formulaire.service.ts b/src/app/services/formulaire/formulaire.service.ts
index 194b0cb099d4df2e2ce444f9ff7613be8f4ee297..c08bb630ebb535b4e72b273d394ae9a7fe4e18b0 100644
--- a/src/app/services/formulaire/formulaire.service.ts
+++ b/src/app/services/formulaire/formulaire.service.ts
@@ -146,7 +146,7 @@ export class FormulaireService extends Observable {
         return this._httpService.httpGetRequest(undefined, undefined, undefined, f, processData);
     }
 
-    public createFormulaire(ct: CalculatorType): Promise<FormulaireDefinition> {
+    private newFormulaire(ct: CalculatorType, jsonState?: {}): FormulaireDefinition {
         let f: FormulaireDefinition;
         switch (ct) {
             case CalculatorType.ConduiteDistributrice:
@@ -185,10 +185,31 @@ export class FormulaireService extends Observable {
                 throw new Error(`FormulaireService.createFormulaire() : type de calculette ${ct} non pris en charge`)
         }
 
-        f.calculatorName = decode(this.getLocalisedTitleFromCalculatorType(ct) + " (" + f.uid + ")");
+        if (jsonState !== undefined) {
+            const props = jsonState["props"];
+            f.initSessionNub(props);
+        }
+        else
+            f.initSessionNub();
+
+        return f;
+    }
+
+    /**
+     * crée un formulaire d'un type donné
+     * @param ct type de formulaire
+     * @param jsonState 
+     */
+    public createFormulaire(ct: CalculatorType, jsonState?: {}): Promise<FormulaireDefinition> {
+        const f: FormulaireDefinition = this.newFormulaire(ct, jsonState);
+
+        if (jsonState === undefined)
+            f.calculatorName = decode(this.getLocalisedTitleFromCalculatorType(ct) + " (" + f.uid + ")");
         this._formulaires.push(f);
         let prom: Promise<Response> = this.loadConfig(f, ct);
         return prom.then(_ => {
+            if (jsonState !== undefined)
+                f.deserialiseJSON(jsonState);
             return f;
         }).then(f => {
             this.loadUpdateFormulaireLocalisation(f);
@@ -328,7 +349,38 @@ export class FormulaireService extends Observable {
         return false;
     }
 
-    public loadSession() {
+    private readSingleFile(file: File): Promise<any> {
+        return new Promise<any>((resolve, reject) => {
+            var 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);
+        });
+    }
+
+    public loadSession(f: File) {
+        this.readSingleFile(f).then(s => {
+            const session = JSON.parse(s);
+            for (const k in session)
+                switch (k) {
+                    case "session":
+                        this.deserialiseSession(session[k]);
+                        break;
+
+                    default:
+                        throw new Error(`session file : invalid key '${k}'`);
+                }
+        }).catch(err => {
+            throw err;
+        });
     }
 
     public saveForm(f: FormulaireDefinition) {