diff --git a/e2e/calculate-all-params.e2e-spec.ts b/e2e/calculate-all-params.e2e-spec.ts
index 295e133ad0e42466d968cb3ca517eb6add7445f2..6f5632baf39b9aacf2333cb68154865592796f64 100644
--- a/e2e/calculate-all-params.e2e-spec.ts
+++ b/e2e/calculate-all-params.e2e-spec.ts
@@ -18,7 +18,7 @@ describe("ngHyd − calculate all parameters of all calculators", () => {
   });
 
   // get calculators list (IDs) @TODO read it from config, but can't import jalhyd here :/
-  const calcTypes = [ 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20 ];
+  const calcTypes = [ 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21 ];
 
   // for each calculator
   for (const ct of calcTypes) {
diff --git a/e2e/check-translations.e2e-spec.ts b/e2e/check-translations.e2e-spec.ts
index ed3ac2dacf0bc99d5b7e6373c04cd7d05e54d03c..2aef4ff34220586ff8209a79fdc03202028d900e 100644
--- a/e2e/check-translations.e2e-spec.ts
+++ b/e2e/check-translations.e2e-spec.ts
@@ -25,7 +25,7 @@ describe("ngHyd − check translation of all calculators", () => {
   });
 
   // get calculators list (IDs) @TODO read it from config, but can't import jalhyd here :/
-  const calcTypes = [ 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20 ];
+  const calcTypes = [ 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21 ];
 
   // options of "Language" selector on preferences page
   const langs = [ "English", "Français" ];
diff --git a/e2e/clone-all-calc.e2e-spec.ts b/e2e/clone-all-calc.e2e-spec.ts
index f74d61e78c2ded94acd930995882ff26117e84da..e5b77dcd1b84d0d34687a628f4c52f930eab779b 100644
--- a/e2e/clone-all-calc.e2e-spec.ts
+++ b/e2e/clone-all-calc.e2e-spec.ts
@@ -18,7 +18,7 @@ describe("ngHyd − clone all calculators with all possible <select> values", ()
   });
 
   // get calculators list (IDs) @TODO read it from config, but can't import jalhyd here :/
-  const calcTypes = [ 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20 ];
+  const calcTypes = [ 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21 ];
 
   // for each calculator
   for (const ct of calcTypes) {
diff --git a/jalhyd_branch b/jalhyd_branch
index 7f8147304dea3e5f1ef135be121d42f63648ed3f..0c6550147d6ae5cd2a34cbe0d6523c6fde1c533a 100644
--- a/jalhyd_branch
+++ b/jalhyd_branch
@@ -1 +1 @@
-146-passer-les-courbes-de-remous-en-cote
+55-ajout-d-un-module-de-calcul-des-cotes-amont-aval-d-un-bief
diff --git a/src/app/calculators/bief/bief.config.json b/src/app/calculators/bief/bief.config.json
new file mode 100644
index 0000000000000000000000000000000000000000..58561811fb3b2cede61ea70cd6690707f478e113
--- /dev/null
+++ b/src/app/calculators/bief/bief.config.json
@@ -0,0 +1,70 @@
+[
+    {
+        "id": "fs_water_line",
+        "type": "fieldset",
+        "fields": [
+            {
+                "id": "select_regime",
+                "type": "select",
+                "source": "bief_regime"
+            }
+        ]
+    },
+    {
+        "id": "fs_section",
+        "type": "fieldset",
+        "fields": [
+            {
+                "id": "select_section",
+                "type": "select",
+                "help": {
+                    "SectionRectangle": "hsl/types_sections.html#section-rectangulaire",
+                    "SectionCercle": "hsl/types_sections.html#section-circulaire",
+                    "SectionTrapeze": "hsl/types_sections.html#section-trapezoidale",
+                    "SectionPuissance": "hsl/types_sections.html#section-parabolique"
+                },
+                "source": "acsection_section"
+            },
+            "LargeurFond",
+            "Fruit",
+            "LargeurBerge",
+            "D",
+            "k"
+        ]
+    },
+    {
+        "id": "fs_bief",
+        "type": "fieldset",
+        "fields": [
+            "Ks",
+            "Long",
+            "YB",
+            "ZF1",
+            "ZF2"
+        ]
+    },
+    {
+        "id": "fs_condlim",
+        "type": "fieldset",
+        "fields": [
+            "Q",
+            "Z1",
+            "Z2"
+        ]
+    },
+    {
+        "id": "fs_param_calc",
+        "type": "fieldset",
+        "fields": [
+            "Dx"
+        ]
+    },
+    {
+        "type": "options",
+        "defaultNodeType": "SectionRectangle",
+        "defaultRegime": "Fluvial",
+        "sectionSourceId": "select_section",
+        "regimeSelectId": "select_regime",
+        "help": "hsl/bief.html"
+    }
+]
\ No newline at end of file
diff --git a/src/app/calculators/bief/bief.en.json b/src/app/calculators/bief/bief.en.json
new file mode 100644
index 0000000000000000000000000000000000000000..056d2873002dba19ea3ab322a185f7c413259a4c
--- /dev/null
+++ b/src/app/calculators/bief/bief.en.json
@@ -0,0 +1,35 @@
+{
+    "fs_water_line": "Type of water line",
+    "select_regime": "Regime",
+
+    "select_regime_0": "Fluvial",
+    "select_regime_1": "Torrential",
+
+    "fs_section": "Type of section",
+    "select_section": "Choice of section type",
+
+    "select_section_SectionTrapeze": "Trapezoidal",
+    "select_section_SectionRectangle": "Rectangular",
+    "select_section_SectionCercle": "Circular",
+    "select_section_SectionPuissance": "Parabolic",
+
+    "LargeurFond": "Width at bottom",
+    "Fruit": "Bank slope",
+    "D": "Diameter",
+    "k": "Coefficient",
+    "LargeurBerge": "Width at embankment level",
+    "fs_bief": "Reach features",
+    "Ks": "Strickler coefficient",
+    "Hs": "Head",
+    "Long": "Length of reach",
+    "YB": "Embankment elevation",
+    "fs_condlim": "Boundary conditions",
+    "Q": "Upstream flow",
+    "S": "Wet surface",
+    "fs_param_calc": "Calculation parameters",
+    "Dx": "Discretisation step",
+    "Z1": "Upstream water elevation",
+    "Z2": "Downstream water elevation",
+    "ZF1": "Upstream bottom elevation",
+    "ZF2": "Downstream bottom elevation"
+}
\ No newline at end of file
diff --git a/src/app/calculators/bief/bief.fr.json b/src/app/calculators/bief/bief.fr.json
new file mode 100644
index 0000000000000000000000000000000000000000..f22d1f0240caff2b34f64ce0d5b458624d6c6e5c
--- /dev/null
+++ b/src/app/calculators/bief/bief.fr.json
@@ -0,0 +1,35 @@
+{
+    "fs_water_line": "Type de ligne d'eau",
+    "select_regime": "Régime",
+
+    "select_regime_0": "Fluvial",
+    "select_regime_1": "Torrentiel",
+
+    "fs_section": "Type de section",
+    "select_section": "Choix du type de section",
+
+    "select_section_SectionTrapeze": "Trapézoïdale",
+    "select_section_SectionRectangle": "Rectangulaire",
+    "select_section_SectionCercle": "Circulaire",
+    "select_section_SectionPuissance": "Parabolique",
+
+    "LargeurFond": "Largeur au fond",
+    "Fruit": "Fruit des berges",
+    "D": "Diamètre",
+    "k": "Coefficient",
+    "LargeurBerge": "Largeur de berge",
+    "fs_bief": "Caractéristiques du bief",
+    "Ks": "Coefficient de Strickler",
+    "Hs": "Charge",
+    "Long": "Longueur du bief",
+    "YB": "Hauteur de berge",
+    "fs_condlim": "Conditions aux limites",
+    "Q": "Débit amont",
+    "S": "Surface mouillée",
+    "Dx": "Pas de discrétisation",
+    "fs_param_calc": "Paramètres de calcul",
+    "Z1": "Cote de l'eau à l'amont",
+    "Z2": "Cote de l'eau à l'aval",
+    "ZF1": "Cote du fond à l'amont",
+    "ZF2": "Cote du fond à l'aval"
+}
\ No newline at end of file
diff --git a/src/app/components/dialog-edit-param-values/dialog-edit-param-values.component.ts b/src/app/components/dialog-edit-param-values/dialog-edit-param-values.component.ts
index d581f63e406716c8b1cc513c47e231dcc59d1f31..41258994dd9647bd24fd859427cdbfc82881acaa 100644
--- a/src/app/components/dialog-edit-param-values/dialog-edit-param-values.component.ts
+++ b/src/app/components/dialog-edit-param-values/dialog-edit-param-values.component.ts
@@ -205,7 +205,12 @@ export class DialogEditParamValuesComponent implements OnInit {
 
     public get numberOfValues(): number {
         if (this.isMinMax) {
-            return this.param.paramDefinition.getInferredValuesList().length;
+            try {
+                return this.param.paramDefinition.getInferredValuesList().length;
+            } catch (e) {
+                // min > max or something, silent fail
+                return 0;
+            }
         } else {
             // values are not set before closing modal
             return this.buildNumbersListFromString(this.valuesListForm.controls.valuesList.value).length;
diff --git a/src/app/components/generic-calculator/calculator.component.html b/src/app/components/generic-calculator/calculator.component.html
index 2cde586a44cc4a875fc0082e6391d2052535b419..b8d29a5a355874bc7ff7d625115a23997a3fed64 100644
--- a/src/app/components/generic-calculator/calculator.component.html
+++ b/src/app/components/generic-calculator/calculator.component.html
@@ -104,6 +104,15 @@
                         {{ uitextGeneratePAB }}
                     </button>
 
+                    <div *ngIf="isBief" class="multi-buttons-container">
+                        <button mat-raised-button color="accent" id="generate-sp-amont" (click)="generateSPAmont()">
+                            {{ uitextGenerateSPAmont }}
+                        </button>
+                        <button mat-raised-button color="accent" id="generate-sp-aval" (click)="generateSPAval()">
+                            {{ uitextGenerateSPAval }}
+                        </button>
+                    </div>
+
                     <mat-card-content>
                         <calc-results id="resultsComp" (afterViewChecked)="onCalcResultsViewChecked()"></calc-results>
                     </mat-card-content>
diff --git a/src/app/components/generic-calculator/calculator.component.scss b/src/app/components/generic-calculator/calculator.component.scss
index b520db9c9a1cc298d0e0bbd4aebbe2514c1fbfba..e48960ad064734b2ff927bf1da07ba94607d8387 100644
--- a/src/app/components/generic-calculator/calculator.component.scss
+++ b/src/app/components/generic-calculator/calculator.component.scss
@@ -66,6 +66,15 @@ mat-card {
                 height: min-content;
             }
         }
+
+        .multi-buttons-container {
+            button:nth-of-type(even) {
+                margin-top: .5em;
+            }
+            button:nth-of-type(odd) {
+                margin-right: .5em;
+            }
+        }
     }
 
     ::ng-deep .mat-card-header-text {
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 4bdf8c67512ca356aedb8942187b45b1b4c90567..f655bd60f4a0b8a1e8b0fa6ecdee99114f39663a 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -2,7 +2,7 @@ import { Component, OnInit, DoCheck, OnDestroy, ViewChild, ViewChildren,
          QueryList, AfterViewChecked, ElementRef, Inject, forwardRef } from "@angular/core";
 import { ActivatedRoute, Router } from "@angular/router";
 
-import { Observer, Session, Cloisons, Pab, ParamValueMode, CalculatorType } from "jalhyd";
+import { Observer, Session, Cloisons, Pab, ParamValueMode, CalculatorType, Bief, SectionParametree, acSection, round, SessionSettings } from "jalhyd";
 
 import { AppComponent } from "../../app.component";
 import { FormulaireService } from "../../services/formulaire.service";
@@ -195,6 +195,14 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         return this.intlService.localizeText("INFO_CALCULATOR_RESULTS_GENERATE_PAB");
     }
 
+    public get uitextGenerateSPAmont() {
+        return this.intlService.localizeText("INFO_CALCULATOR_RESULTS_GENERATE_SP_AMONT");
+    }
+
+    public get uitextGenerateSPAval() {
+        return this.intlService.localizeText("INFO_CALCULATOR_RESULTS_GENERATE_SP_AVAL");
+    }
+
     public get uitextOpenHelp() {
         return this.intlService.localizeText("INFO_CALCULATOR_OPEN_HELP");
     }
@@ -497,6 +505,15 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         return this._formulaire && this._formulaire.helpLink;
     }
 
+    /** return true if current Nub type is ct */
+    public is(ct: CalculatorType): boolean {
+        return (
+            this._formulaire
+            && this._formulaire.currentNub
+            && this._formulaire.currentNub.calcType === ct
+        );
+    }
+
     // for "one wide column" layout
     public get isWide() {
         return (this.isPAB || this.isMRC);
@@ -504,38 +521,27 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
 
     // true if current Nub is PAB
     public get isPAB() {
-        return (
-            this._formulaire
-            && this._formulaire.currentNub
-            && this._formulaire.currentNub.calcType === CalculatorType.Pab
-        );
+        return this.is(CalculatorType.Pab);
     }
 
     // true if current Nub is MacroRugoCompound
     public get isMRC() {
-        return (
-            this._formulaire
-            && this._formulaire.currentNub
-            && this._formulaire.currentNub.calcType === CalculatorType.MacroRugoCompound
-        );
+        return this.is(CalculatorType.MacroRugoCompound);
     }
 
     // true if current Nub is Jet
     public get isJet() {
-        return (
-            this._formulaire
-            && this._formulaire.currentNub
-            && this._formulaire.currentNub.calcType === CalculatorType.Jet
-        );
+        return this.is(CalculatorType.Jet);
     }
 
     // for "generate PAB" button
     public get isPABCloisons() {
-        return (
-            this._formulaire
-            && this._formulaire.currentNub
-            && this._formulaire.currentNub.calcType === CalculatorType.Cloisons
-        );
+        return this.is(CalculatorType.Cloisons);
+    }
+
+    // true if current Nub is Bief
+    public get isBief() {
+        return this.is(CalculatorType.Bief);
     }
 
     /**
@@ -611,6 +617,50 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
         });
     }
 
+    /**
+     * Génère une SectionParametree à partir des cotes amont du module Bief en cours
+     */
+    public generateSPAmont() {
+        const bief = (this._formulaire.currentNub as Bief);
+        this.generateSP(round(bief.prms.Z1.singleValue - bief.prms.ZF1.singleValue, 3));
+    }
+
+    /**
+     * Génère une SectionParametree à partir des cotes aval du module Bief en cours
+     */
+    public generateSPAval() {
+        const bief = (this._formulaire.currentNub as Bief);
+        this.generateSP(round(bief.prms.Z2.singleValue - bief.prms.ZF2.singleValue, 3));
+    }
+
+    /**
+     * Génère une SectionParametree à partir du module Bief en cours
+     * @param Y tirant d'eau
+     */
+    private generateSP(Y: number) {
+        const bief = (this._formulaire.currentNub as Bief);
+        const pente = round(
+            (bief.prms.ZF1.singleValue - bief.prms.ZF2.singleValue) / bief.prms.Long.singleValue,
+            5 // ça ou autre chose…
+        );
+        const serialisedSection = bief.section.serialise();
+        const sectionCopy = Session.getInstance().unserialiseSingleNub(serialisedSection, false).nub;
+        const secParam = new SectionParametree(sectionCopy as acSection);
+        Session.getInstance().registerNub(secParam);
+
+        this.formulaireService.createFormulaire(CalculatorType.SectionParametree, secParam)
+            .then((f: FormulaireDefinition) => {
+                const sp = (f.currentNub as SectionParametree);
+                sp.section.prms.Y.singleValue = Y;
+                sp.section.prms.If.singleValue = pente;
+                // calculate
+                f.doCompute();
+                // go to new SP
+                this.router.navigate(["/calculator", f.uid]).then();
+            }
+        );
+    }
+
     public saveCalculator() {
         this.formulaireService.saveForm(this._formulaire);
     }
diff --git a/src/app/components/remous-results/remous-results.component.ts b/src/app/components/remous-results/remous-results.component.ts
index ab9f3f71800041e327cad3c6cec6cc8e0ef655db..a710067a4c938490d3e8bec4e27bf6da4dd3f344 100644
--- a/src/app/components/remous-results/remous-results.component.ts
+++ b/src/app/components/remous-results/remous-results.component.ts
@@ -393,7 +393,8 @@ export class RemousResultsComponent extends ResultsComponent implements DoCheck
     }
 
     private get abscisseIterator(): INumberIterator {
-        return this._remousResults.varResults.variatedParameters[0].paramDefinition.valuesIterator;
+        const param = this._remousResults.varResults.variatedParameters[0].paramDefinition;
+        return param.paramValues.initValuesIterator(false, undefined, true); // add last step !
     }
 
     private connectRessaut(lineFlu: LineData, lineTor: LineData) {
diff --git a/src/app/config.json b/src/app/config.json
index d7fa138742d5c05aa522aa79330249d6c204c733..1b2da220febf7661f5a2d1fed5cf860609dbca72 100644
--- a/src/app/config.json
+++ b/src/app/config.json
@@ -38,7 +38,7 @@
                 "path": "surface-libre.jpg",
                 "credits": "David Dorchies / Irstea"
             },
-            "calculators": [ 2, 3, 4, 20 ]
+            "calculators": [ 2, 3, 4, 20, 21 ]
         },
         {
             "name": "HYDRAULIQUE_EN_CHARGE",
diff --git a/src/app/formulaire/definition/concrete/form-bief.ts b/src/app/formulaire/definition/concrete/form-bief.ts
new file mode 100644
index 0000000000000000000000000000000000000000..90edbe1357d1acfa7892966c702b05bbd1e08eb3
--- /dev/null
+++ b/src/app/formulaire/definition/concrete/form-bief.ts
@@ -0,0 +1,70 @@
+import { IObservable, SectionNub, Session, BiefRegime } from "jalhyd";
+
+import { FormDefSection } from "../form-def-section";
+import { FieldSet } from "../../fieldset";
+import { FormulaireBase } from "./form-base";
+
+export class FormulaireBief extends FormulaireBase {
+
+    private _formSection: FormDefSection;
+
+    /** id du select configurant le régime */
+    private _regimeSelectId: string;
+
+    constructor() {
+        super();
+        this._formSection = new FormDefSection(this);
+        // default properties
+        this._props["regime"] = BiefRegime.Fluvial;
+    }
+
+    protected parseOptions(json: {}) {
+        super.parseOptions(json);
+        this._formSection.parseOptions(json);
+
+        // id du select configurant la méthode de résolution
+        this._regimeSelectId = this.getOption(json, "regimeSelectId");
+    }
+
+    public afterParseFieldset(fs: FieldSet) {
+        this._formSection.afterParseFieldset(fs);
+
+        // si le FieldSet contient le select de méthode de résolution
+        if (this._regimeSelectId) {
+            const sel = fs.getFormulaireNodeById(this._regimeSelectId);
+            if (sel) {
+                // on abonne le formulaire aux propriétés du FieldSet
+                fs.properties.addObserver(this);
+            }
+        }
+    }
+
+    // interface Observer
+
+    update(sender: IObservable, data: any) {
+
+        super.update(sender, data);
+
+        if (sender instanceof FieldSet && data.action === "propertyChange") {
+            switch (sender.id) {
+                case "fs_section":
+                    // replace underlying section without replacing whole Nub
+                    const newSect = Session.getInstance().createSection(data.value);
+                    (this._currentNub as SectionNub).setSection(newSect);
+                    // reflect changes in GUI
+                    for (const fs of this.allFieldsets) {
+                        // show / hide dependent fields
+                        fs.updateFields();
+                    }
+                    this.reset();
+                    break;
+
+                case "fs_water_line":
+                    this.reset();
+                    // Either Z1 or Z2 is calculable, depending on Regime
+                    this.getFieldsetById("fs_condlim").updateFields();
+                    break;
+            }
+        }
+    }
+}
diff --git a/src/app/formulaire/fieldset.ts b/src/app/formulaire/fieldset.ts
index 494e64140121f81b1ac62b9bf0e6f90aefa3e021..b5d4978c5be82673ce8d59cccf9b0b20c41c9266 100644
--- a/src/app/formulaire/fieldset.ts
+++ b/src/app/formulaire/fieldset.ts
@@ -1,6 +1,5 @@
 import {
     CalculatorType,
-    ComputeNodeType,
     ParamDefinition,
     LCMaterial,
     LoiDebit,
@@ -10,6 +9,7 @@ import {
     MethodeResolution,
     GrilleType,
     GrilleProfile,
+    BiefRegime,
 } from "jalhyd";
 
 import { FormulaireElement } from "./formulaire-element";
@@ -254,6 +254,10 @@ export class FieldSet extends FormulaireElement implements Observer {
             case "fs_grille": // Grille
                 this.setSelectValueFromProperty("select_grid_profile", "gridProfile");
                 break;
+
+            case "fs_water_line": // Bief
+                this.setSelectValueFromProperty("select_regime", "regime");
+                break;
         }
     }
 
@@ -315,6 +319,7 @@ export class FieldSet extends FormulaireElement implements Observer {
         this.setPropertyValueFromConfig(json, "defaultMaterial", "material", LCMaterial);
         this.setPropertyValueFromConfig(json, "defaultGridProfile", "gridProfile", GrilleProfile);
         this.setPropertyValueFromConfig(json, "defaultGridType", "gridType", GrilleType);
+        this.setPropertyValueFromConfig(json, "defaultRegime", "regime", BiefRegime);
         this.setPropertyValueFromConfig(json, "varCalc", "varCalc");
 
         this.updateFields();
@@ -404,6 +409,9 @@ export class FieldSet extends FormulaireElement implements Observer {
                         case "select_grid_profile": // Grille
                             this.setPropValue("gridProfile", data.value.value);
                             break;
+                        case "select_regime": // Bief
+                            this.setPropValue("regime", data.value.value);
+                            break;
                     }
                     break;
             }
diff --git a/src/app/formulaire/select-field.ts b/src/app/formulaire/select-field.ts
index ee83f1ae853c34319ac27a88b04a88ffe06d1dbe..308b319b08bab11b65ededa940cc947143cb7e7c 100644
--- a/src/app/formulaire/select-field.ts
+++ b/src/app/formulaire/select-field.ts
@@ -1,4 +1,15 @@
-import { LechaptCalmon, acSection, CourbeRemous, Nub, ParallelStructure, StructureType, LoiDebit, GrilleType, GrilleProfile } from "jalhyd";
+import {
+    BiefRegime,
+    LechaptCalmon,
+    acSection,
+    CourbeRemous,
+    Nub,
+    ParallelStructure,
+    StructureType,
+    LoiDebit,
+    GrilleType,
+    GrilleProfile
+ } from "jalhyd";
 
 import { Field } from "./field";
 import { SelectEntry } from "./select-entry";
@@ -172,6 +183,11 @@ export class SelectField extends Field {
                 this.addEntry(new SelectEntry(this._entriesBaseId + GrilleProfile.Rectangular, GrilleProfile.Rectangular));
                 this.addEntry(new SelectEntry(this._entriesBaseId + GrilleProfile.Hydrodynamic, GrilleProfile.Hydrodynamic));
                 break;
+
+            case "bief_regime": // Bief: type de régime
+                this.addEntry(new SelectEntry(this._entriesBaseId + BiefRegime.Fluvial, BiefRegime.Fluvial));
+                this.addEntry(new SelectEntry(this._entriesBaseId + BiefRegime.Torrentiel, BiefRegime.Torrentiel));
+                break;
         }
     }
 }
diff --git a/src/app/services/formulaire.service.ts b/src/app/services/formulaire.service.ts
index 8741f40e1865a7ccc90b525d059a1adddfac36a8..65a60d25bc8ea319c99c4b369e0ce228ff0ba21a 100644
--- a/src/app/services/formulaire.service.ts
+++ b/src/app/services/formulaire.service.ts
@@ -38,6 +38,7 @@ import { FormulairePab } from "../formulaire/definition/concrete/form-pab";
 import { FormulaireMacrorugoCompound } from "../formulaire/definition/concrete/form-macrorugo-compound";
 import { FormulaireLechaptCalmon } from "../formulaire/definition/concrete/form-lechapt-calmon";
 import { FormulaireGrille } from "../formulaire/definition/concrete/form-grille";
+import { FormulaireBief } from "../formulaire/definition/concrete/form-bief";
 
 @Injectable()
 export class FormulaireService extends Observable {
@@ -82,6 +83,7 @@ export class FormulaireService extends Observable {
         this.calculatorPaths[CalculatorType.Jet] = "jet";
         this.calculatorPaths[CalculatorType.Grille] = "grille";
         this.calculatorPaths[CalculatorType.Pente] = "pente";
+        this.calculatorPaths[CalculatorType.Bief] = "bief";
     }
 
     private get _intlService(): I18nService {
@@ -323,6 +325,10 @@ export class FormulaireService extends Observable {
                 f = new FormulaireGrille();
                 break;
 
+            case CalculatorType.Bief:
+                f = new FormulaireBief();
+                break;
+
             default:
                 f = new FormulaireBase();
         }
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index e8cbdf1d3a141377537f4acc845dc41418d5d792..d46b196a0e158bd6e1f2c10f8734e5533b04baa7 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -5,6 +5,8 @@
     "WARNING_NOTCH_SUBMERSION_GREATER_THAN_07": "Notch formula is discouraged when submersion is greater than 0.7",
     "WARNING_SLOT_SUBMERSION_NOT_BETWEEN_07_AND_09": "Slot formula is discouraged when submersion is lower than 0.7 or greater than 0.9",
     "ERROR_ABSTRACT": "%nb% errors occurred during calculation",
+    "ERROR_BIEF_Z1_CALC_FAILED": "Unable to calculate upstream elevation (calculation interrupted before upstream)",
+    "ERROR_BIEF_Z2_CALC_FAILED": "Unable to calculate downstream elevation (calculation interrupted before downstream)",
     "ERROR_DICHO_CONVERGE": "Dichotomy could not converge",
     "ERROR_DICHO_FUNCTION_VARIATION": "unable to determinate function direction of variation",
     "ERROR_DICHO_INIT_DOMAIN": "Dichotomy: target %targetSymbol%=%targetValue% does not exist for variable %variableSymbol% valued in interval %variableInterval%",
@@ -41,8 +43,9 @@
     "ERROR_PARAMDOMAIN_INVALID": "parameter '%symbol%: non supported '%domain%' definition domain",
     "ERROR_PROBLEM_LOADING_SESSION": "Session loaded, with errors",
     "ERROR_REMOUS_NO_WATER_LINE": "No water line can be calculated",
-    "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT": "Upstream boundary condition < Critical elevation: no possible calculation from upstream",
-    "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL": "Downstream boundary condition < Critical elevation: no possible calculation from downstream",
+    "WARNING_REMOUS_PAS_CALCUL_DEPUIS_AMONT": "Upstream boundary condition < Critical elevation: no possible calculation from upstream",
+    "WARNING_REMOUS_PAS_CALCUL_DEPUIS_AVAL": "Downstream boundary condition < Critical elevation: no possible calculation from downstream",
+    "ERROR_REMOUS_PAS_CALCUL": "No possible calculation, neither from upstream nor from downstream",
     "ERROR_REMOUS_PENTE_FORTE": "The water line slope is too steep at abscissa %x% m (the discretisation step should be reduced)",
     "ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCONJUG": "Non-convergence of the calculation of the combined depth (Newton's method)",
     "ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE": "Non-convergence of the calculation of the critical depth (Newton's method)",
@@ -58,10 +61,14 @@
     "INFO_CALCULATOR_OPEN_HELP": "Help",
     "INFO_CALCULATOR_PARAMFIXES": "Fixed parameters",
     "INFO_CALCULATOR_RESULTS_GENERATE_PAB": "Generate a fish ladder",
+    "INFO_CALCULATOR_RESULTS_GENERATE_SP_AMONT": "Hydraulic details of upstream section",
+    "INFO_CALCULATOR_RESULTS_GENERATE_SP_AVAL": "Hydraulic details of downstream section",
     "INFO_CALCULATOR_RESULTS_TITLE": "Results",
     "INFO_CALCULATOR_SAVE": "Save",
     "INFO_CALCULATOR_USED_BY": "Used by",
     "INFO_CALCULATOR_VALEURS": "Values",
+    "INFO_BIEF_TITRE_COURT": "Reach",
+    "INFO_BIEF_TITRE": "Up/downstream elevations of a reach",
     "INFO_CLOISONS_TITRE_COURT": "Cross walls",
     "INFO_CLOISONS_TITRE": "Fish ladder: Cross walls",
     "INFO_CLOSE_DIALOGUE_DEPENDING_MODULES": "The following modules depend on the one you are closing:",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index f2199ec48ec6217d359dedb84a5a225299f8cd82..92a77bf9c5055217b2bc34703262cae2ab5fab84 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -5,6 +5,8 @@
     "WARNING_NOTCH_SUBMERSION_GREATER_THAN_07": "La formule de l'échancrure n'est pas conseillée pour un ennoiement supérieur à 0.7",
     "WARNING_SLOT_SUBMERSION_NOT_BETWEEN_07_AND_09": "La formule de la fente n'est pas conseillée pour un ennoiement inférieur à 0.7 et supérieur à 0.9",
     "ERROR_ABSTRACT": "%nb% erreurs rencontrées lors du calcul",
+    "ERROR_BIEF_Z1_CALC_FAILED": "Impossible de calculer la cote amont (calcul interrompu avant l'amont)",
+    "ERROR_BIEF_Z2_CALC_FAILED": "Impossible de calculer la cote aval (calcul interrompu avant l'aval)",
     "ERROR_DICHO_CONVERGE": "La dichotomie n'a pas pu converger",
     "ERROR_DICHO_FUNCTION_VARIATION": "Dichotomie&nbsp;: impossible de determiner le sens de  variation de la fonction",
     "ERROR_DICHO_INIT_DOMAIN": "Dichotomie&nbsp;: la valeur cible %targetSymbol%=%targetValue% n'existe pas pour la variable %variableSymbol% prise dans l'intervalle %variableInterval%",
@@ -41,8 +43,9 @@
     "ERROR_PARAMDOMAIN_INVALID": "Paramètre '%symbol%'&nbsp;: le domaine de définition '%domain%' est incorrect",
     "ERROR_PROBLEM_LOADING_SESSION": "Session chargée, avec des erreurs",
     "ERROR_REMOUS_NO_WATER_LINE": "Aucune ligne d'eau ne peut être calculée",
-    "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT": "Condition limite amont > Hauteur critique&nbsp;: pas de calcul possible depuis l'amont",
-    "ERROR_REMOUS_PAS_CALCUL_DEPUIS_AVAL": "Condition limite aval < Hauteur critique&nbsp;: pas de calcul possible depuis l'aval",
+    "WARNING_REMOUS_PAS_CALCUL_DEPUIS_AMONT": "Condition limite amont > Hauteur critique&nbsp;: pas de calcul possible depuis l'amont",
+    "WARNING_REMOUS_PAS_CALCUL_DEPUIS_AVAL": "Condition limite aval < Hauteur critique&nbsp;: pas de calcul possible depuis l'aval",
+    "ERROR_REMOUS_PAS_CALCUL": "Aucun calcul possible ni depuis l'amont ni depuis l'aval",
     "ERROR_REMOUS_PENTE_FORTE": "La pente de la ligne d'eau est trop forte à l'abscisse %x% m (il faudrait réduire le pas de discrétisation)",
     "ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCONJUG": "Non convergence du calcul de la hauteur conjuguée (Méthode de Newton)",
     "ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE": "Non convergence du calcul de la hauteur critique (Méthode de Newton)",
@@ -58,10 +61,14 @@
     "INFO_CALCULATOR_OPEN_HELP": "Aide",
     "INFO_CALCULATOR_PARAMFIXES": "Paramètres fixés",
     "INFO_CALCULATOR_RESULTS_GENERATE_PAB": "Générer une passe à bassins",
+    "INFO_CALCULATOR_RESULTS_GENERATE_SP_AMONT": "Détails hydrauliques de la section amont",
+    "INFO_CALCULATOR_RESULTS_GENERATE_SP_AVAL": "Détails hydrauliques de la section aval",
     "INFO_CALCULATOR_RESULTS_TITLE": "Résultats",
     "INFO_CALCULATOR_SAVE": "Enregistrer",
     "INFO_CALCULATOR_USED_BY": "Utilisé par",
     "INFO_CALCULATOR_VALEURS": "Valeurs",
+    "INFO_BIEF_TITRE_COURT": "Bief",
+    "INFO_BIEF_TITRE": "Cotes amont/aval d'un bief",
     "INFO_CLOISONS_TITRE_COURT": "Cloisons",
     "INFO_CLOISONS_TITRE": "Passe à bassins&nbsp;: Cloisons",
     "INFO_CLOSE_DIALOGUE_DEPENDING_MODULES": "Les modules suivants dépendent de celui que vous êtes en train de fermer :",