diff --git a/spec/structure/structure_triangular_trunc_weir_free.spec.ts b/spec/structure/structure_triangular_trunc_weir.spec.ts
similarity index 89%
rename from spec/structure/structure_triangular_trunc_weir_free.spec.ts
rename to spec/structure/structure_triangular_trunc_weir.spec.ts
index c80ce74ca7f00d843aa9332c0d75625df774936c..c96923e70f1152bf5152738091b3471c794a687e 100644
--- a/spec/structure/structure_triangular_trunc_weir_free.spec.ts
+++ b/spec/structure/structure_triangular_trunc_weir.spec.ts
@@ -7,12 +7,12 @@
 // import { describe, expect, it, xdescribe } from "../mock_jasmine";
 
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
-import { StructureTriangularTruncWeirFree } from "../../src/structure/structure_triangular_trunc_weir_free";
-import { TriangularTruncStructureParams } from "../../src/structure/structure_triangular_trunc_weir_free_params";
+import { StructureTriangularTruncWeirFree } from "../../src/structure/structure_triangular_trunc_weir";
+import { TriangularTruncStructureParams } from "../../src/structure/structure_triangular_trunc_weir_params";
 import { itCalcQ } from "./functions";
 
 const structPrm: TriangularTruncStructureParams =
-    new TriangularTruncStructureParams(0, 100.1, 100, 0.9, 101, 1.36);
+    new TriangularTruncStructureParams(0, 100.1, 100, 100, 0.9, 101, 1.36);
 const structTest: StructureTriangularTruncWeirFree = new StructureTriangularTruncWeirFree(structPrm, false);
 
 describe("Class StructureTriangularTruncWeirFree: ", () => {
diff --git a/spec/structure/structure_triangular_weir_free.spec.ts b/spec/structure/structure_triangular_weir.spec.ts
similarity index 81%
rename from spec/structure/structure_triangular_weir_free.spec.ts
rename to spec/structure/structure_triangular_weir.spec.ts
index 3ee65c5848d52d849767445f1c619cb2ff5f6b91..9991abb2cc1e82d72396cd7ad16f677917d540fd 100644
--- a/spec/structure/structure_triangular_weir_free.spec.ts
+++ b/spec/structure/structure_triangular_weir.spec.ts
@@ -7,12 +7,12 @@
 // import { describe, expect, it, xdescribe } from "../mock_jasmine";
 
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
-import { StructureTriangularWeirFree } from "../../src/structure/structure_triangular_weir_free";
-import { TriangularStructureParams } from "../../src/structure/structure_triangular_weir_free_params";
+import { StructureTriangularWeir } from "../../src/structure/structure_triangular_weir";
+import { TriangularStructureParams } from "../../src/structure/structure_triangular_weir_params";
 import { itCalcQ } from "./functions";
 
-const structPrm: TriangularStructureParams = new TriangularStructureParams(0, 100.1, 100.1, 45, 1.36);
-const structTest: StructureTriangularWeirFree = new StructureTriangularWeirFree(structPrm, false);
+const structPrm: TriangularStructureParams = new TriangularStructureParams(0, 100.1, 100.1, 100.1, 45, 1.36);
+const structTest: StructureTriangularWeir = new StructureTriangularWeir(structPrm, false);
 
 describe("Class StructureTriangularWeirFree: ", () => {
     describe("Calcul Q a surface libre avec h1 croissant: ", () => {
diff --git a/spec/structure/structure_weir_submerged_larinier.spec.ts b/spec/structure/structure_weir_submerged_larinier.spec.ts
index 1952ed2f26f196c7e1f6e80312025e39965534f9..217491c52244d3bd3a85f5d1695fc17f4f6930c0 100644
--- a/spec/structure/structure_weir_submerged_larinier.spec.ts
+++ b/spec/structure/structure_weir_submerged_larinier.spec.ts
@@ -10,12 +10,13 @@ import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/stru
 // tslint:disable-next-line:max-line-length
 import { RectangularStructureParams, StructureWeirSubmergedLarinier } from "../../src/structure/structure_weir_submerged_larinier";
 import { itCalcQ } from "../structure/functions";
+import { precDigits } from "../test_config";
 
 const prms: RectangularStructureParams = new RectangularStructureParams(0, 101, 102, 101.5, 0.2, 0.65);
 const test: StructureWeirSubmergedLarinier = new StructureWeirSubmergedLarinier(prms, false);
 
-describe("Class CloisonsOrifice: ", () => {
-    describe("Calc(Q): ", () => {
+describe("Class StructureWeirSubmergedLarinier: ", () => {
+    xdescribe("Calc(Q): ", () => {
         const Z1: number[] = [102];
         const Q: number[] = [0.407];
         const mode: StructureFlowMode = StructureFlowMode.WEIR;
@@ -24,4 +25,13 @@ describe("Class CloisonsOrifice: ", () => {
             itCalcQ(test, Z1[i], Infinity, Q[i], mode, regime);
         }
     });
+    describe("Calc(Z1): ", () => {
+        it("Z1(Q=0.780) should be 75.301", () => {
+            const testZ1 = new StructureWeirSubmergedLarinier(
+                new RectangularStructureParams(0.780, 73.665, 75.301, 75.077, 0.35, 0.65),
+                false);
+            testZ1.prms.Z1.v = 100; // Test with initial condition far from solution
+            expect(testZ1.Calc("Z1").vCalc).toBeCloseTo(75.301, precDigits);
+        });
+    });
 });
diff --git a/src/structure/factory_structure.ts b/src/structure/factory_structure.ts
index 1379b405f308414b607978ff940bef0966d7775d..48d711d014617ed8b064bf1484dc420248308c64 100644
--- a/src/structure/factory_structure.ts
+++ b/src/structure/factory_structure.ts
@@ -14,8 +14,8 @@ import { StructureOrificeSubmerged, StructureOrificeSubmergedParams } from "./st
 import { StructureRectangularOrificeFree } from "./structure_rectangular_orifice_free";
 import { StructureRectangularOrificeSubmerged } from "./structure_rectangular_orifice_submerged";
 // tslint:disable-next-line:max-line-length
-import { StructureTriangularTruncWeirFree, TriangularTruncStructureParams } from "./structure_triangular_trunc_weir_free";
-import { StructureTriangularWeirFree, TriangularStructureParams } from "./structure_triangular_weir_free";
+import { StructureTriangularTruncWeirFree, TriangularTruncStructureParams } from "./structure_triangular_trunc_weir";
+import { StructureTriangularWeir, TriangularStructureParams } from "./structure_triangular_weir";
 import { StructureWeirFree } from "./structure_weir_free";
 import { StructureWeirSubmergedLarinier } from "./structure_weir_submerged_larinier";
 
@@ -93,16 +93,18 @@ export function CreateStructure(loiDebit: LoiDebit, parentNub?: ParallelStructur
                 0,          // Q
                 100,        // ZDV
                 102,        // Z1
+                100,        // Z2
                 45,         // Alpha2
                 oCd.SeuilT  // Cd pour un seuil triangulaire
                 // W = Infinity par défaut pour un seuil
             );
-            return new StructureTriangularWeirFree(structTriangPrms, dbg);
+            return new StructureTriangularWeir(structTriangPrms, dbg);
         case LoiDebit.TriangularTruncWeirFree:
             const structTriTruncPrms: TriangularTruncStructureParams = new TriangularTruncStructureParams(
                 0,          // Q
                 100.1,        // ZDV
                 102,        // Z1
+                100.1,        // Z2
                 0.9,        // BT
                 101,        // ZT
                 oCd.SeuilT  // Cd pour un seuil triangulaire
diff --git a/src/structure/structure.ts b/src/structure/structure.ts
index c92d5e381cebcb8b3c820252c6b7cf00b027ea04..0d44f85b78c5971fd2856f550cc523eff6a063f1 100644
--- a/src/structure/structure.ts
+++ b/src/structure/structure.ts
@@ -232,6 +232,9 @@ export abstract class Structure extends Nub {
         if ((sVarCalc === "Q" && (this.prms.h1.v < this.prms.h2.v)) || (sVarCalc !== "Q" && this.prms.Q.v < 0)) {
             [this.prms.h1.v, this.prms.h2.v] = [this.prms.h2.v, this.prms.h1.v]; // Swap ES6 fashion
             const res: Result = super.Calc(sVarCalc, rInit);
+            if (sVarCalc === "Q") {
+                res.vCalc = -res.vCalc;
+            }
             [this.prms.h1.v, this.prms.h2.v] = [this.prms.h2.v, this.prms.h1.v]; // Swap ES6 fashion
             return res;
         }
diff --git a/src/structure/structure_props.ts b/src/structure/structure_props.ts
index 5c366ecf2b05673a42c82d9b3bd1e617ea609502..04cd480a1c55a08c95b696394cfef434fe1af771 100644
--- a/src/structure/structure_props.ts
+++ b/src/structure/structure_props.ts
@@ -33,7 +33,7 @@ export enum LoiDebit {
     TriangularWeirFree,
     // Loi de débit seuil triangulaire tronqué
     TriangularTruncWeirFree,
-    // Loi de débit seuil noyé (Larinier 1992)
+    // Loi de débit fente noyée (Larinier 1992)
     WeirSubmergedLarinier,
     // Loi de débit orifice noyé
     OrificeSubmerged
@@ -45,7 +45,7 @@ export const loiAdmissiblesOuvrages: { [key: string]: LoiDebit[] } = {
     ],
     SeuilRectangulaire: [
         LoiDebit.WeirCem88d, LoiDebit.WeirCem88v, LoiDebit.Cunge80, LoiDebit.WeirFree,
-        LoiDebit.KIVI
+        LoiDebit.KIVI, LoiDebit.WeirSubmergedLarinier
     ],
     SeuilTriangulaire: [
         LoiDebit.TriangularWeirFree
diff --git a/src/structure/structure_triangular_trunc_weir_free.ts b/src/structure/structure_triangular_trunc_weir.ts
similarity index 71%
rename from src/structure/structure_triangular_trunc_weir_free.ts
rename to src/structure/structure_triangular_trunc_weir.ts
index dbecb29e18fef3f2f4fa7885036e52455752c60e..4a709256902b2df80ba87018251b3fdf8b0ece24 100644
--- a/src/structure/structure_triangular_trunc_weir_free.ts
+++ b/src/structure/structure_triangular_trunc_weir.ts
@@ -2,7 +2,8 @@ import { ParamCalculability } from "../param/param-definition";
 import { Result } from "../util/result";
 import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure";
 import { LoiDebit } from "./structure_props";
-import { TriangularTruncStructureParams } from "./structure_triangular_trunc_weir_free_params";
+import { TriangularTruncStructureParams } from "./structure_triangular_trunc_weir_params";
+import { Villemonte } from "./villemonte";
 
 export { TriangularTruncStructureParams };
 
@@ -31,14 +32,18 @@ export class StructureTriangularTruncWeirFree extends Structure {
         Structure.CheckEquation(sVarCalc);
         const data = this.getResultData();
 
-        let v: number = this.prms.Cd.v * this.prms.BT.v / (this.prms.ZT.v - this.prms.ZDV.v);
+        let Q: number = this.prms.Cd.v * this.prms.BT.v / (this.prms.ZT.v - this.prms.ZDV.v);
         if (this.prms.Z1.v <= this.prms.ZT.v) {
-            v = v * Math.pow(this.prms.h1.v, 2.5);
+            Q = Q * Math.pow(this.prms.h1.v, 2.5);
         } else {
-            v = v * (Math.pow(this.prms.h1.v, 2.5) - Math.pow(this.prms.Z1.v - this.prms.ZT.v, 2.5));
+            Q = Q * (Math.pow(this.prms.h1.v, 2.5) - Math.pow(this.prms.Z1.v - this.prms.ZT.v, 2.5));
         }
 
-        return new Result(v, this, data);
+        if (data.ENUM_StructureFlowRegime !== StructureFlowRegime.FREE) {
+            Q = Villemonte(this.prms.h1.v, this.prms.h2.v, 2.5) * Q;
+        }
+
+        return new Result(Q, this, data);
     }
 
     /**
@@ -56,7 +61,16 @@ export class StructureTriangularTruncWeirFree extends Structure {
     }
 
     protected getFlowRegime() {
-        return StructureFlowRegime.FREE;
+        if (this.prms.Z2.v <= this.prms.ZDV.v) {
+            return StructureFlowRegime.FREE;
+        } else {
+            // La réduction de débit s'applique dès que Z2 > ZDV (Villemonte, 1946)
+            if (this.prms.h2.v < 4 / 5 * this.prms.h1.v) {
+                // Yc = 4 / 5 * H1 (Jameson, 1925)
+                return StructureFlowRegime.PARTIAL;
+            }
+            return StructureFlowRegime.SUBMERGED;
+        }
     }
 
     protected getFlowMode() {
diff --git a/src/structure/structure_triangular_trunc_weir_free_params.ts b/src/structure/structure_triangular_trunc_weir_params.ts
similarity index 91%
rename from src/structure/structure_triangular_trunc_weir_free_params.ts
rename to src/structure/structure_triangular_trunc_weir_params.ts
index 694f2b9db203e606ce38e9fa2bb292c6bda7f091..fa3b77004f6ec08d5c59e73e2dc225703c8dfd98 100644
--- a/src/structure/structure_triangular_trunc_weir_free_params.ts
+++ b/src/structure/structure_triangular_trunc_weir_params.ts
@@ -21,16 +21,17 @@ export class TriangularTruncStructureParams extends StructureParams {
      * @param rQ    Débit (m3/s)
      * @param rZDV  Cote de la crête du déversoir ou du radier de la vanne (m)
      * @param rZ1   Cote de l'eau amont (m)
+     * @param rZ2   Cote de l'eau aval (m)
      * @param rBT   Demi-ouverture du triangle (m)
      * @param rZT   Cote haute du triangle (m)
      * @param rCd   Coefficient de débit (-)
      * @param rW    Ouverture de la vanne (m) (Valeur par défaut +infinity pour les déversoirs)
      */
     constructor(
-        rQ: number, rZDV: number, rZ1: number,
+        rQ: number, rZDV: number, rZ1: number, rZ2: number,
         rBT: number, rZT: number, rCd: number, rW: number = Infinity
     ) {
-        super(rQ, rZDV, rZ1, - Infinity, rW);
+        super(rQ, rZDV, rZ1, rZ2, rW);
         this.BT = new ParamDefinition(this, "BT", ParamDomainValue.POS, rBT);
         this.addParamDefinition(this.BT);
         this.ZT = new ParamDefinition(this, "ZT", ParamDomainValue.POS, rZT, ParamFamily.ELEVATIONS);
diff --git a/src/structure/structure_triangular_weir_free.ts b/src/structure/structure_triangular_weir.ts
similarity index 67%
rename from src/structure/structure_triangular_weir_free.ts
rename to src/structure/structure_triangular_weir.ts
index 0890add9d0f4924b77359c241ee1bdd8e90410db..ee505df9c103fe166a3f0cb955642393db99468b 100644
--- a/src/structure/structure_triangular_weir_free.ts
+++ b/src/structure/structure_triangular_weir.ts
@@ -2,14 +2,15 @@ import { ParamCalculability } from "../param/param-definition";
 import { Result } from "../util/result";
 import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure";
 import { LoiDebit } from "./structure_props";
-import { TriangularStructureParams } from "./structure_triangular_weir_free_params";
+import { TriangularStructureParams } from "./structure_triangular_weir_params";
+import { Villemonte } from "./villemonte";
 
 export { TriangularStructureParams };
 
 /**
- * Equation classique seuil triangulaire dénoyé
+ * Equation classique seuil triangulaire + Ennoiement Villemonte
  */
-export class StructureTriangularWeirFree extends Structure {
+export class StructureTriangularWeir extends Structure {
 
     constructor(prms: TriangularStructureParams, dbg: boolean = false) {
         super(prms, dbg);
@@ -31,10 +32,14 @@ export class StructureTriangularWeirFree extends Structure {
         Structure.CheckEquation(sVarCalc);
         const data = this.getResultData();
 
-        const v = this.prms.Cd.v * this.getTanFromDegrees(this.prms.alpha2.v)
+        let Q = this.prms.Cd.v * this.getTanFromDegrees(this.prms.alpha2.v)
             * Math.pow(this.prms.h1.v, 2.5);
 
-        return new Result(v, this, data);
+        if (data.ENUM_StructureFlowRegime !== StructureFlowRegime.FREE) {
+            Q = Villemonte(this.prms.h1.v, this.prms.h2.v, 2.5) * Q;
+        }
+
+        return new Result(Q, this, data);
     }
 
     /**
@@ -45,7 +50,16 @@ export class StructureTriangularWeirFree extends Structure {
     }
 
     protected getFlowRegime() {
-        return StructureFlowRegime.FREE;
+        if (this.prms.Z2.v <= this.prms.ZDV.v) {
+            return StructureFlowRegime.FREE;
+        } else {
+            // La réduction de débit s'applique dès que Z2 > ZDV (Villemonte, 1946)
+            if (this.prms.h2.v < 4 / 5 * this.prms.h1.v) {
+                // Yc = 4 / 5 * H1 (Jameson, 1925)
+                return StructureFlowRegime.PARTIAL;
+            }
+            return StructureFlowRegime.SUBMERGED;
+        }
     }
 
     protected getFlowMode() {
diff --git a/src/structure/structure_triangular_weir_free_params.ts b/src/structure/structure_triangular_weir_params.ts
similarity index 90%
rename from src/structure/structure_triangular_weir_free_params.ts
rename to src/structure/structure_triangular_weir_params.ts
index 89745252bc6052ecae255546f5b00a2f6767f178..b815bca4fdd131c8bb452493ae50a54044f5569a 100644
--- a/src/structure/structure_triangular_weir_free_params.ts
+++ b/src/structure/structure_triangular_weir_params.ts
@@ -18,15 +18,16 @@ export class TriangularStructureParams extends StructureParams {
      * @param rQ    Débit (m3/s)
      * @param rZDV  Cote de la crête du déversoir ou du radier de la vanne (m)
      * @param rZ1   Cote de l'eau amont (m)
+     * @param rZ2   Cote de l'eau aval (m)
      * @param rAlpha2    Demi-angle au sommet du triangle (degrés)
      * @param rCd   Coefficient de débit (-)
      * @param rW    Ouverture de la vanne (m) (Valeur par défaut +infinity pour les déversoirs)
      */
     constructor(
-        rQ: number, rZDV: number, rZ1: number,
+        rQ: number, rZDV: number, rZ1: number, rZ2: number,
         rAlpha2: number, rCd: number, rW: number = Infinity
     ) {
-        super(rQ, rZDV, rZ1, - Infinity, rW);
+        super(rQ, rZDV, rZ1, rZ2, rW);
         this.alpha2 = new ParamDefinition(this, "alpha2", ParamDomainValue.POS, rAlpha2);
         this.addParamDefinition(this.alpha2);
         this.Cd = new ParamDefinition(this, "Cd", ParamDomainValue.POS, rCd);