diff --git a/docs/fr/calculators/hyd_en_charge/lechapt-calmon.md b/docs/fr/calculators/hyd_en_charge/lechapt-calmon.md
index 6001e557244786c0b6d2f9890bb159d4460d98e4..2cfcad148958c173b3bdeec91fa97052fb76473a 100644
--- a/docs/fr/calculators/hyd_en_charge/lechapt-calmon.md
+++ b/docs/fr/calculators/hyd_en_charge/lechapt-calmon.md
@@ -1,26 +1,12 @@
-# Lechapt et Calmon
-
-Ce module permet de calculer les pertes de charge dans une conduite circulaire à partir des abaques de Lechapt et Calmon.
-
-Il permet le calcul de la valeur d'une des grandeurs suivantes :
-
-- Débit (m<sup>3</sup>/s)
-- Diamètre du tuyau (m)
-- Perte de charge totale (m)
-- Longueur du tuyau (m)
-- Coefficient de perte de charge singulière (m)
-
-La perte de charge totale est la somme des pertes de charges linéaires \(J_L\) obtenue à partir des abaques de Lechapt et Calmon et singulières \(J_S\) dépendantes du coefficient ci-dessus.
-
-## Formule de Lechapt et Calmon
+# Formule de Lechapt et Calmon
 
 La formule de Lechapt et Calmon est basée sur des ajustements de la formule de  [Cyril Frank Colebrook](http://fr.wikipedia.org/wiki/Cyril_Frank_Colebrook)&nbsp;:
 
-$$J_L=\frac{l_T}{1000}L.Q^M.D^{-N}$$
+$$J_{lin}=\frac{l_T}{1000}L.Q^M.D^{-N}$$
 
 Avec&nbsp;:
 
-- \(J_L\)&nbsp;: la perte de charge linéaire en m&nbsp;;
+- \(J_{lin}\)&nbsp;: la perte de charge linéaire en m&nbsp;;
 - \(l_T\)&nbsp;: la longueur du tuyau en m&nbsp;;
 - \(Q\)&nbsp;: le débit en L/s&nbsp;;
 - \(D\)&nbsp;: le diamètre de la conduite en m&nbsp;;
@@ -43,21 +29,4 @@ Le tableau de correspondance des coefficients est le suivant&nbsp;:
 | Tuyau hydrauliquement lisse - 0.05 &le; D &le; 0.2 | 0.00 | 0.916 | 1.78 | 4.78 |
 | Tuyau hydrauliquement lisse - 0.25 &le; D &le; 1 | 0.00 | 0.971 | 1.81 | 4.81 |
 
-Table: Matériaux et coefficients utilisés dans la formule de Lechapt et Calmon
-
-## Perte de charge singulière
-
-$$ J_S = K_S \frac{V^2}{2g}$$
-
-Avec&nbsp;:
-
-- \(K_S\)&nbsp;: le coefficient de perte de charge singulière
-- \(V\)&nbsp;: la vitesse de l'eau dans la conduite (\(V = 4 Q / \pi / D^2\))
-
-## Coefficient de perte de charge linéaire
-
-$$ K_L = \frac{2g J_L}{V^2} $$
-
-## Coefficient de perte de charge de Darcy
-
-$$ f_D = \frac{2g J D}{l_T V^2} $$
+Table&nbsp;: Matériaux et coefficients utilisés dans la formule de Lechapt et Calmon
diff --git a/docs/fr/calculators/hyd_en_charge/perte_de_charge.md b/docs/fr/calculators/hyd_en_charge/perte_de_charge.md
new file mode 100644
index 0000000000000000000000000000000000000000..955d4a1b2a67dde51bcb1ce6c79925e48d3767aa
--- /dev/null
+++ b/docs/fr/calculators/hyd_en_charge/perte_de_charge.md
@@ -0,0 +1,33 @@
+# Perte de charge
+
+Ce module permet de calculer les pertes de charge dans une conduite circulaire à partir des lois suivantes donnant les pertes de charge linéaires :
+
+- Lechapt et Calmon
+- Strickler
+
+Il permet le calcul de la valeur d'une des grandeurs suivantes&nbsp;:
+
+- Débit (m<sup>3</sup>/s)
+- Diamètre du tuyau (m)
+- Perte de charge totale (m)
+- Longueur du tuyau (m)
+- Coefficient de perte de charge locale (singulière) (m)
+
+La perte de charge totale est la somme des pertes de charges linéaires \(J_{lin}\) (données par la loi utilisée) et locales \(J_{loc}\) dépendantes du coefficient ci-dessus.
+
+## Perte de charge locale
+
+$$ J_{loc} = K_{loc} \frac{V^2}{2g}$$
+
+Avec&nbsp;:
+
+- \(K_{loc}\)&nbsp;: le coefficient de perte de charge locale
+- \(V\)&nbsp;: la vitesse de l'eau dans la conduite (\(V = 4 Q / \pi / D^2\))
+
+## Coefficient de perte de charge linéaire
+
+$$ K_{lin} = \frac{2g J_{lin}}{V^2} $$
+
+## Coefficient de perte de charge de Darcy
+
+$$ f_D = \frac{2g J D}{l_T V^2} $$
diff --git a/docs/fr/calculators/hyd_en_charge/strickler.md b/docs/fr/calculators/hyd_en_charge/strickler.md
new file mode 100644
index 0000000000000000000000000000000000000000..7f393129602d4fbcb82e994031ba278e87cd22ce
--- /dev/null
+++ b/docs/fr/calculators/hyd_en_charge/strickler.md
@@ -0,0 +1,11 @@
+# Formule de Strickler
+
+Cette loi de perte de charge linéaire est paramétrée par le coefficient de Stricker \(K_S\).
+
+Les autres paramètres sont ceux communs à tous les calculs de perte de charge&nbsp;:
+
+- \(Q\) : débit (m<sup>3</sup>/s)
+- \(D\) : diamètre du tuyau (m)
+- \(l_T\) : Longueur du tuyau (m)
+
+$$J_L=\frac{l_T.Q^2}{(K_S.\pi.D^2/4)^2.(D/4)^{4/3}}$$
diff --git a/e2e/load-save-session.e2e-spec.ts b/e2e/load-save-session.e2e-spec.ts
index ddb95adfe856dd717278c66d9703e2f8d8efee35..436058e6f6ffc4d54e716b1680c22b6b8dc9de18 100644
--- a/e2e/load-save-session.e2e-spec.ts
+++ b/e2e/load-save-session.e2e-spec.ts
@@ -203,7 +203,7 @@ describe("ngHyd − save and load sessions", () => {
                         // the displayed calculator is now the loaded one
 
                         // check the calculator has been loaded
-                        expectNumber("num calcs", await navbar.getCalculatorEntriesCount(), 2);
+                        expectNumber(`calc ${ct} select ${selId} : num calcs`, await navbar.getCalculatorEntriesCount(), 2);
 
                         // check the select in the loaded session points to the same option
                         const sel2 = calcPage.getSelectById(selId);
@@ -212,14 +212,14 @@ describe("ngHyd − save and load sessions", () => {
                         const optTxt2 = await calcPage.getMatselectCurrentOptionText(sel2);
                         await browser.sleep(100);
                         const ind2 = options.indexOf(optTxt2);
-                        expectNumber("opt index", ind2, nextInd);
+                        expectNumber(`calc ${ct} select ${selId} : opt index`, ind2, nextInd);
 
                         // close last calculator (the loaded one)
                         await navbar.middleClickCalculatorTab(1);
                         await browser.sleep(200);
 
                         // check last calculator has been closed
-                        expectNumber("num calcs(2)", await navbar.getCalculatorEntriesCount(), 1);
+                        expectNumber(`calc ${ct} select ${selId} : num calcs(2)`, await navbar.getCalculatorEntriesCount(), 1);
                     }
                 }
             }
diff --git a/jalhyd_branch b/jalhyd_branch
index af02f54ce395c0a15d039b449fa00e9d42059486..cf4a15c270bac55dd48db6135f27a19b29c8ef52 100644
--- a/jalhyd_branch
+++ b/jalhyd_branch
@@ -1 +1 @@
-341-un-parametre-cible-d-un-lien-ne-doit-pas-se-lier-a-un-autre-parametre
+215-conduites-en-charge-ajouter-loi-de-strickler-exercice-dans-livre-de-bennis
diff --git a/src/app/calculators/pressureloss/config.json b/src/app/calculators/pressureloss/config.json
index e74c60cd9129266e00927d7bedecfef2509cc91a..c4bbbd561c12cf2ad5a9fff62b02551f55d6191e 100644
--- a/src/app/calculators/pressureloss/config.json
+++ b/src/app/calculators/pressureloss/config.json
@@ -9,7 +9,8 @@
                 "property": "pressureLossType",
                 "default": "LechaptCalmon",
                 "help": {
-                    "0": "hyd_en_charge/lechapt-calmon.html"
+                    "0": "hyd_en_charge/lechapt-calmon.html",
+                    "1": "hyd_en_charge/strickler.html"
                 }
             },
             {
@@ -20,7 +21,8 @@
             },
             "L",
             "M",
-            "N"
+            "N",
+            "Ks"
         ]
     },
     {
@@ -33,5 +35,9 @@
             "Lg",
             "Kloc"
         ]
+    },
+    {
+        "type": "options",
+        "help": "hyd_en_charge/perte_de_charge.html"
     }
 ]
diff --git a/src/app/calculators/pressureloss/en.json b/src/app/calculators/pressureloss/en.json
index de3a81a4eb9d1ac0aa318511676cf1ce9c7c9a25..238ce4911f254eb944394648f20f4a72d7f5de13 100644
--- a/src/app/calculators/pressureloss/en.json
+++ b/src/app/calculators/pressureloss/en.json
@@ -2,6 +2,7 @@
     "fs_pressureloss_law": "Pressure loss",
     "select_pressurelosstype": "Pressure loss law",
     "PRESSURELOSSTYPE_0": "Lechapt-Calmon",
+    "PRESSURELOSSTYPE_1": "Strickler",
 
     "fs_materiau": "Type of material",
     "select_material": "Choice of material",
@@ -26,6 +27,7 @@
     "Jlin": "Linear head loss",
     "Klin": "Linear head loss coefficient",
     "fD": "Darcy friction factor",
+    "Ks": "Strickler coefficient",
 
     "UNIT_JLIN": "m",
     "UNIT_V": "m/s"
diff --git a/src/app/calculators/pressureloss/fr.json b/src/app/calculators/pressureloss/fr.json
index cbf2dd2d83c302dc27df3f5253cdbbd26567da7f..fd1bd9c2ff98254fba30dbb457da7c4cfa6a4a98 100644
--- a/src/app/calculators/pressureloss/fr.json
+++ b/src/app/calculators/pressureloss/fr.json
@@ -2,6 +2,7 @@
     "fs_pressureloss_law": "Perte de charge",
     "select_pressurelosstype": "Loi de perte de charge",
     "PRESSURELOSSTYPE_0": "Lechapt-Calmon",
+    "PRESSURELOSSTYPE_1": "Strickler",
 
     "fs_materiau": "Type du matériau",
     "select_material": "Choix du matériau",
@@ -26,6 +27,7 @@
     "Jlin": "Perte de charge linéaire",
     "Klin": "Coefficient de perte de charge linéaire",
     "fD": "Coefficient de perte de charge de Darcy",
+    "Ks": "Coefficient de Strickler",
 
     "UNIT_JLIN": "m",
     "UNIT_V": "m/s"
diff --git a/src/app/components/calculator-list/calculator-list.component.ts b/src/app/components/calculator-list/calculator-list.component.ts
index b62c4f2e4cdbd58b89ee75fb1feebcc144edfe27..d69f071f82e6a107ee923348ef0c58e013ea7400 100644
--- a/src/app/components/calculator-list/calculator-list.component.ts
+++ b/src/app/components/calculator-list/calculator-list.component.ts
@@ -121,7 +121,8 @@ export class CalculatorListComponent implements OnInit {
                             CalculatorType.YAXN,
                             CalculatorType.PbBassin,
                             CalculatorType.PbCloison,
-                            CalculatorType.LechaptCalmon
+                            CalculatorType.LechaptCalmon,
+                            CalculatorType.PressureLossLaw
                         ].includes(t)
                     ) {
                         unusedTheme.calculators.push({
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index 146d1746a8b74f4ffbaf36e2655da910816a9d1f..9acb17e78dea09b3bf132dd208e12ffecbf7a4cb 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -81,7 +81,7 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
         return this._calculateDisabled;
     }
 
-    private getPropValue(key: string): any {
+    public getPropValue(key: string): any {
         if (this._currentNub === undefined)
             return this.defaultProperties[key];
         return this._currentNub.getPropValue(key);
diff --git a/src/app/formulaire/definition/form-pressureloss.ts b/src/app/formulaire/definition/form-pressureloss.ts
index 4b1e7ceb4188e1d4cb2d4f4caf03b4da1f827b80..26c862355f9b7d5f572d022379d73c0f27e4e982 100644
--- a/src/app/formulaire/definition/form-pressureloss.ts
+++ b/src/app/formulaire/definition/form-pressureloss.ts
@@ -1,5 +1,7 @@
-import { PressureLoss, Props, PressureLossType, Session, PressureLossLaw, CalculatorType } from "jalhyd";
+import { PressureLoss, Props, PressureLossType, Session, PressureLossLaw, CalculatorType, IObservable } from "jalhyd";
 import { FormulaireFixedVar } from "./form-fixedvar";
+import { FieldSet } from "../elements/fieldset";
+import { Prop_NullParameters } from "jalhyd";
 
 /**
  * Formulaire pour la perte de charge
@@ -26,10 +28,24 @@ export class FormulairePressureLoss extends FormulaireFixedVar {
 
         // create pressure loss law child nub
         const propsLaw: Props = new Props();
-        const pressureLossCalc: CalculatorType = PressureLossLaw.calcTypeFromPressureLossLaw[pll];
-        propsLaw.setPropValue("calcType", pressureLossCalc);
+        propsLaw.setPropValue(Prop_NullParameters, props.getPropValue(Prop_NullParameters));
+        propsLaw.setPropValue("calcType", CalculatorType.PressureLossLaw);
         const law = Session.getInstance().createNub(propsLaw) as PressureLossLaw;
         const pl: PressureLoss = this.currentNub as PressureLoss;
         pl.setLaw(law);
     }
+
+    public update(sender: IObservable, data: any) {
+        // changement de propriété du FieldSet contenant le select de choix du type de perte de charge
+        if (sender instanceof FieldSet && sender.id === "fs_pressureloss_law" && data.action === "propertyChange") {
+            // replace underlying pressure loss law without replacing whole Nub
+            const newPLL = Session.getInstance().createPressureLossLaw(data.value, undefined, this.currentNub.getPropValue(Prop_NullParameters));
+            (this._currentNub as PressureLoss).setLaw(newPLL);
+            // show / hide dependent fields
+            this.refreshFieldsets();
+            this.reset();
+        }
+        else
+            super.update(sender, data);
+    }
 }
diff --git a/src/app/formulaire/elements/fieldset.ts b/src/app/formulaire/elements/fieldset.ts
index 3637d892d27725fe0d7a7d84ad805c3ee589f63b..c1678a93ba7bbc72b6bbba20953523941dc1cf8f 100644
--- a/src/app/formulaire/elements/fieldset.ts
+++ b/src/app/formulaire/elements/fieldset.ts
@@ -107,11 +107,20 @@ export class FieldSet extends FormulaireElement implements IProperties {
     }
 
     private parse_select(json: {}): SelectField {
-        const res: SelectField = SelectFieldFactory.newSelectField(json, this);
-        res.parseConfig(json);
-        res.afterParseConfig();
-        res.addObserver(this);
-        return res;
+        let ok: boolean = true;
+        // in case select is associated to a property, check nub has the property
+        const p: string = json["property"];
+        if (p !== undefined) {
+            ok = this.parentForm.getPropValue(p) !== undefined;
+        }
+        if (ok) {
+            const res: SelectField = SelectFieldFactory.newSelectField(json, this);
+            res.parseConfig(json);
+            res.afterParseConfig();
+            res.addObserver(this);
+            return res;
+        }
+        return undefined;
     }
 
     public addPropertiesObserver(o: Observer) {
@@ -179,7 +188,9 @@ export class FieldSet extends FormulaireElement implements IProperties {
 
                 case "select":
                     param = this.parse_select(field);
-                    this.addField(param);
+                    if (param !== undefined) {
+                        this.addField(param);
+                    }
                     break;
             }
         }
@@ -205,7 +216,7 @@ export class FieldSet extends FormulaireElement implements IProperties {
         if (this.parentForm instanceof FormulaireFixedVar) {
             for (const sel of this.parentForm.allSelectFields) {
                 if (sel.hasAssociatedNubProperty) {  // ie. if select is a standard select
-                    this.setSelectValueFromProperty(sel.id, (this._confId === "fs_section"));
+                    this.setSelectValueFromProperty(sel.id);
                 }
             }
         }
@@ -213,12 +224,11 @@ export class FieldSet extends FormulaireElement implements IProperties {
 
     /**
      * Reflects a property value in the interface, through the value of a <select> field, if this select exists
-     * @param inSection if true, will look for the required property in the Nub's section (children[0])
      */
-    private setSelectValueFromProperty(selectId: string, inSection: boolean = false) {
+    private setSelectValueFromProperty(selectId: string) {
         const selectField: SelectField = this.getFormulaireNodeById(selectId) as SelectField;
         if (selectField) {
-            let propVal: any = this.getPropValue(selectField.associatedProperty, inSection);
+            let propVal: any = this.getPropValue(selectField.associatedProperty);
             if (propVal === undefined) {
                 propVal = ""; // clodo bullet-proof loading
             }
@@ -327,7 +337,7 @@ export class FieldSet extends FormulaireElement implements IProperties {
                     if (senderId === "select_section") {
                         // sections paramétrées, courbes de remous, régimes uniformes
                         // "nodeType" is a property of the section child, not of the parent
-                        const oldNodeType = this.nub.getChildren()[0].getPropValue("nodeType");
+                        const oldNodeType = this.getPropValue("nodeType");
                         if (oldNodeType !== data.value.value) { // avoid infinite loops
                             // manually notify parent so that it replaces the child Nub @WARNING clodo trick
                             this.parentForm.update(this, {
@@ -336,6 +346,19 @@ export class FieldSet extends FormulaireElement implements IProperties {
                                 value: data.value.value
                             });
                         }
+                    }
+                    else if (senderId === "select_pressurelosstype") {
+                        // lois de perte de charge
+                        // "pressureLossType" is a property of the child law, not of the parent
+                        const oldLaw = this.nub.getPropValue("pressureLossType");
+                        if (oldLaw !== data.value.value) { // avoid infinite loops
+                            // manually notify parent so that it replaces the child Nub @WARNING clodo trick
+                            this.parentForm.update(this, {
+                                action: "propertyChange",
+                                name: "pressureLossType",
+                                value: data.value.value
+                            });
+                        }
                     } else {
                         if (data.value !== undefined) {
                             if (this.parentForm instanceof FormulaireFixedVar) {
@@ -356,6 +379,7 @@ export class FieldSet extends FormulaireElement implements IProperties {
                                     }
                                 }
                             }
+                            this.parentForm.resetResults();
                         }
                     }
                     break; // switch (data.action)
@@ -379,16 +403,8 @@ export class FieldSet extends FormulaireElement implements IProperties {
     /**
      * get associated nub property value
      * @param key property name
-     * @param inSection if true, will look for the required property in the Nub's section (children[0])
      */
-    public getPropValue(key: string, inSection: boolean = false): any {
-        if (inSection) {
-            const section = this.nub.getChildren()[0];
-            if (section) {
-                return section.getPropValue(key);
-            }
-            return undefined;
-        }
+    public getPropValue(key: string): any {
         return this.nub.getPropValue(key);
     }
 
diff --git a/src/app/services/internationalisation.service.ts b/src/app/services/internationalisation.service.ts
index ba7e4cf84633d4bdf079f7bde4ca5b3bd6eb8023..ea1bec8c3d563f2e11b1a8cfdbf45ae95c67100f 100644
--- a/src/app/services/internationalisation.service.ts
+++ b/src/app/services/internationalisation.service.ts
@@ -63,7 +63,7 @@ export class I18nService extends Observable implements Observer {
         /** excluded calculators */
         const childCalculatorType: CalculatorType[] = [
             CalculatorType.Section, CalculatorType.Structure, CalculatorType.CloisonAval, CalculatorType.YAXN,
-            CalculatorType.LechaptCalmon
+            CalculatorType.LechaptCalmon, CalculatorType.PressureLossLaw
         ];
 
         // ensure 2-letter language code
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 5130406b10e0cdde1994abc35bd303f2fbe46ceb..b7b836bd09864cbe81f26ff922b9d154c1a98a70 100755
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -234,6 +234,7 @@
     "INFO_CHILD_TYPE_SECTION_PLUR": "sections",
     "INFO_CHILD_TYPE_SECTION_SHORT": "S",
     "INFO_CHILD_TYPE_LECHAPTCALMON": "Lechapt-Calmon",
+    "INFO_CHILD_TYPE_STRICKLER": "Strickler",
     "INFO_DIALOG_PARSIM_DESC": "Choose a combination of values to generate the simulation",
     "INFO_FIELDSET_ADD": "Add",
     "INFO_FIELDSET_COPY": "Copy",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index f487a29c09e7be331d0a10127319874b86a20b55..1b2892173b6f6383f61f07fac4766fbc1288b0b5 100755
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -234,6 +234,7 @@
     "INFO_CHILD_TYPE_SECTION_PLUR": "sections",
     "INFO_CHILD_TYPE_SECTION_SHORT": "S",
     "INFO_CHILD_TYPE_LECHAPTCALMON": "Lechapt-Calmon",
+    "INFO_CHILD_TYPE_STRICKLER": "Strickler",
     "INFO_DIALOG_PARSIM_DESC": "Choisir une combinaison de valeurs pour générer la simulation",
     "INFO_FIELDSET_ADD": "Ajouter",
     "INFO_FIELDSET_COPY": "Copier",
@@ -773,4 +774,4 @@
     "ERROR_VERIF_PAB_WALL_NOT_CROSSABLE": "La cloison n°%N% n'est pas franchissable",
     "ERROR_VERIF_PAB_DW_NOT_CROSSABLE": "La cloison aval n'est pas franchissable",
     "WARNING_VERIF_PAR_SPECIES_GROUP": "Les groupes d'espèces 3a, 3b et 7b sont déconseillés pour ce type de passe"
-}
\ No newline at end of file
+}