diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index ed45462d1e5e2a167ee7f222582dbb7a2ef7597d..95e2860536191fdf34dd7513b0b79781c52a92aa 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -228,11 +228,19 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
     // passage de la liste, récupération d'une Promise pour traiter le résultat
     const prom: Promise<any[]> = compRef.instance.run(list);
     prom.then(list => {
-      this.saveSession(list)
+      let name = compRef.instance.filename;
+
+      // ajout extension ".json"
+      const re = /.+\.json/;
+      const match = re.exec(name.toLowerCase());
+      if (match === null)
+        name = name + ".json";
+
+      this.saveSession(list, name)
     });
   }
 
-  private saveSession(calcList: any[]) {
+  private saveSession(calcList: any[], filename) {
     let elems = [];
     for (const c of calcList)
       if (c.selected) {
@@ -241,7 +249,7 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
         elems.push(form.JSONserialise());
       }
     let session = { "session": { "elements": elems } };
-    this.formulaireService.saveSession(session);
+    this.formulaireService.saveSession(session, filename);
   }
 
   private closeCalculator(form: FormulaireDefinition) {
diff --git a/src/app/components/save-calculator/save-calculator.component.html b/src/app/components/save-calculator/save-calculator.component.html
index 3ead22063df14db918b1825da7a79d7fc0713dee..cab54103edd0c849cfc77b83bb377ec6a90d3bbd 100644
--- a/src/app/components/save-calculator/save-calculator.component.html
+++ b/src/app/components/save-calculator/save-calculator.component.html
@@ -5,11 +5,23 @@
                 <h4 class="modal-title w-100" id="myModalLabel">{{uitextDialogTitle}}</h4>
             </div>
             <div class="modal-body">
+                <!-- liste de calculettes avec check -->
                 <div *ngFor="let c of _calculators">
                     <input type="checkbox" value={{c.uid}} checked={{isSelected(c)}} (change)="onCheckCalc($event)">{{c.title}}
                 </div>
+
+                <!-- bouton "tout sélectionnner" -->
                 <button type="button" class="btn btn-mdb-color waves-light" (click)="selectAll()" mdbRippleRadius>{{uitextSelectAll}}</button>
-                <button type="button" class="btn btn-mdb-color waves-light" (click)="deselectAll()" mdbRippleRadius>{{uitextDeselectAll}}</button>
+
+                <!-- bouton "tout désélectionnner" -->
+                <button type="button" class="btn btn-mdb-color waves-light py-10" (click)="deselectAll()" mdbRippleRadius>{{uitextDeselectAll}}</button>
+
+                <!-- nom du fichier -->
+                <div class="md-form form-sm mt-4">
+                    <input mdbActive type="text" id="form1" class="form-control" [(ngModel)]="_filename">
+                    <!-- on utilise [innerHTML] pour que les codes HTML comme &nbsp; soient interprétés correctement -->
+                    <label for="form1" [innerHTML]="_filenameTitle"></label>
+                </div>
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-danger relative waves-light" (click)="saveDialog.hide();cancelSave()" mdbRippleRadius>{{uitextCloseDialogNo}}</button>
diff --git a/src/app/components/save-calculator/save-calculator.component.ts b/src/app/components/save-calculator/save-calculator.component.ts
index f00fd173eae723d0b3c322d70ecdabd1b6ef5e2c..6e30cd2db078144cdd70ca127f3b5c29fc5861b4 100644
--- a/src/app/components/save-calculator/save-calculator.component.ts
+++ b/src/app/components/save-calculator/save-calculator.component.ts
@@ -15,6 +15,13 @@ export class SaveCalculatorComponent {
      */
     private _calculators: any[];
 
+    /**
+     * nom du fichier
+     */
+    private _filename: string = "session";
+
+    private _filenameTitle = "Nom de fichier";
+
     /**
      * événement émis lors du clic sur "annuler"/"enregister"
      * utilisé par la promise de gestion de la confirmation/annulation de la sauvegarde
@@ -50,6 +57,10 @@ export class SaveCalculatorComponent {
         return "Aucune";
     }
 
+    public get filename(): string {
+        return this._filename;
+    }
+
     public run(calcList: any[]): Promise<any[]> {
         this._calculators = calcList;
 
diff --git a/src/app/services/formulaire/formulaire.service.ts b/src/app/services/formulaire/formulaire.service.ts
index ccf34e3281fd803f8d71732be5ec9b66802a10dd..5984c3f9d0e22f1188115f91d312d87721ae8e9b 100644
--- a/src/app/services/formulaire/formulaire.service.ts
+++ b/src/app/services/formulaire/formulaire.service.ts
@@ -389,9 +389,9 @@ export class FormulaireService extends Observable {
         });
     }
 
-    public saveSession(session: {}) {
+    public saveSession(session: {}, filename?: string) {
         const blob = new Blob([JSON.stringify(session)], { type: "text/plain;charset=utf-8" });
-        saveAs(blob);
+        saveAs(blob, filename);
     }
 
     /**