diff --git a/spec/base.spec.ts b/spec/base.spec.ts
index 17f37c3f7852080e6a30b7de0ca487dd5792a37b..1c61ec68a92c1d931d2e99808a52641cf607d764 100644
--- a/spec/base.spec.ts
+++ b/spec/base.spec.ts
@@ -1,6 +1,5 @@
 /// <reference path="../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../src/base";
 import { nub, precDigits } from "./nubtest";
 import { Message, MessageCode, MessageSeverity } from "../src/util/message";
 
diff --git a/spec/cond_distri.spec.ts b/spec/cond_distri.spec.ts
index 5b5c9f93ecbc0a86ed75b51af7b6273682ed03f8..fc6fe224613958965102662f411285cfe3546043 100644
--- a/spec/cond_distri.spec.ts
+++ b/spec/cond_distri.spec.ts
@@ -1,7 +1,7 @@
 // tslint:disable-next-line:no-reference
 /// <reference path="../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../src/base";
+import { Result } from "../src/util/result";
 import { ConduiteDistrib, ConduiteDistribParams } from "../src/cond_distri";
 import { equalEpsilon } from "./nubtest";
 
diff --git a/spec/lechaptcalmon.spec.ts b/spec/lechaptcalmon.spec.ts
index 8c1d74705faaa7c33e4b437a5c1739276c0d7273..076c66e1ff0f5e0f5ac7600dcf1c85980aae3fd8 100644
--- a/spec/lechaptcalmon.spec.ts
+++ b/spec/lechaptcalmon.spec.ts
@@ -1,6 +1,6 @@
 /// <reference path="../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../src/base";
+import { Result } from "../src/util/result";
 import { equalEpsilon } from "./nubtest";
 import { LechaptCalmonParams, LechaptCalmon } from "../src/lechaptcalmon"
 
diff --git a/spec/nubtest.ts b/spec/nubtest.ts
index ce4b3e7c767d81ccb9b803ba1c76e85fe84c83b5..62f0e9c6f330781fa57c48fa02becb9601891f9c 100644
--- a/spec/nubtest.ts
+++ b/spec/nubtest.ts
@@ -1,4 +1,4 @@
-import { Result } from "../src/base";
+import { Result } from "../src/util/result";
 import { Nub } from "../src/nub";
 import {
     ComputeNodeType, ParamCalculability, ParamDefinition, ParamDomain, ParamDomainValue, ParamsEquation,
@@ -57,7 +57,6 @@ export class NubTest extends Nub {
 }
 
 export let nub = new NubTest(new NubTestParams());
-// export let res = new Result(0);
 
 /**
  * précision de calcul (nombre de décimales)
diff --git a/spec/regime_uniforme/regime_uniforme_circ.spec.ts b/spec/regime_uniforme/regime_uniforme_circ.spec.ts
index 228ff02e7454e915dce83244b73d9d4eded3467e..720976c225d74be59be2364f7ffa35093fc83e19 100644
--- a/spec/regime_uniforme/regime_uniforme_circ.spec.ts
+++ b/spec/regime_uniforme/regime_uniforme_circ.spec.ts
@@ -1,7 +1,7 @@
 // tslint:disable-next-line:no-reference
 /// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RegimeUniforme } from "../../src/regime_uniforme";
 import { cSnCirc, ParamsSectionCirc } from "../../src/section/section_circulaire";
 import { equalEpsilon, precDist } from "../nubtest";
diff --git a/spec/regime_uniforme/regime_uniforme_puissance.spec.ts b/spec/regime_uniforme/regime_uniforme_puissance.spec.ts
index 092b21a561626cc4c4107b04a70a59c23797aef6..54c9221eaf4f138f26c098b1bc09b3d43dc60658 100644
--- a/spec/regime_uniforme/regime_uniforme_puissance.spec.ts
+++ b/spec/regime_uniforme/regime_uniforme_puissance.spec.ts
@@ -1,7 +1,7 @@
 // tslint:disable-next-line:no-reference
 /// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RegimeUniforme } from "../../src/regime_uniforme";
 import { cSnPuiss, ParamsSectionPuiss } from "../../src/section/section_puissance";
 import { MessageCode } from "../../src/util/message";
diff --git a/spec/regime_uniforme/regime_uniforme_rect.spec.ts b/spec/regime_uniforme/regime_uniforme_rect.spec.ts
index bae4b0784a44daafd6a05fa5af5b7e2316645336..bf8c7b37c5242498290a730162d50575580ddfab 100644
--- a/spec/regime_uniforme/regime_uniforme_rect.spec.ts
+++ b/spec/regime_uniforme/regime_uniforme_rect.spec.ts
@@ -1,7 +1,7 @@
 // tslint:disable-next-line:no-reference
 /// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RegimeUniforme } from "../../src/regime_uniforme";
 import { cSnRectang, ParamsSectionRectang } from "../../src/section/section_rectang";
 import { equalEpsilon, precDist } from "../nubtest";
diff --git a/spec/regime_uniforme/regime_uniforme_trapeze.spec.ts b/spec/regime_uniforme/regime_uniforme_trapeze.spec.ts
index 479d35671145fae267be49d3e32108518762a325..7bf9f87815e1bca8ad5141767845b9d2faa58fb9 100644
--- a/spec/regime_uniforme/regime_uniforme_trapeze.spec.ts
+++ b/spec/regime_uniforme/regime_uniforme_trapeze.spec.ts
@@ -1,7 +1,7 @@
 // tslint:disable-next-line:no-reference
 /// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RegimeUniforme } from "../../src/regime_uniforme";
 import { cSnTrapez, ParamsSectionTrapez } from "../../src/section/section_trapez";
 import { equalEpsilon, precDist } from "../nubtest";
diff --git a/spec/section_param/section_param_circ_fluvial.spec.ts b/spec/section_param/section_param_circ_fluvial.spec.ts
index e214367de014cce2ba41749db5c1eb423eee8af7..50c651bb557ab2c8928aeab3f6150d6c1b2d5019 100644
--- a/spec/section_param/section_param_circ_fluvial.spec.ts
+++ b/spec/section_param/section_param_circ_fluvial.spec.ts
@@ -1,4 +1,4 @@
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { cSnCirc, ParamsSectionCirc } from "../../src/section/section_circulaire";
 import { equalEpsilon, precDist } from "../nubtest";
 
diff --git a/spec/section_param/section_param_circ_torrentiel.spec.ts b/spec/section_param/section_param_circ_torrentiel.spec.ts
index a658912ff284afc2d1e89e5704d28a5a882fadf0..917eb5e3354a24977d7691dd5f22a11191368590 100644
--- a/spec/section_param/section_param_circ_torrentiel.spec.ts
+++ b/spec/section_param/section_param_circ_torrentiel.spec.ts
@@ -1,4 +1,4 @@
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { cSnCirc, ParamsSectionCirc } from "../../src/section/section_circulaire";
 import { equalEpsilon, precDist } from "../nubtest";
 
diff --git a/spec/section_param/section_param_puiss_fluvial.spec.ts b/spec/section_param/section_param_puiss_fluvial.spec.ts
index 96a4d9647af3529075c8bce1f3119ea493433f80..5b5df72221b9509e61c7508da5dee1a902348ea2 100644
--- a/spec/section_param/section_param_puiss_fluvial.spec.ts
+++ b/spec/section_param/section_param_puiss_fluvial.spec.ts
@@ -1,4 +1,4 @@
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { cSnPuiss, ParamsSectionPuiss } from "../../src/section/section_puissance";
 import { equalEpsilon, precDist } from "../nubtest";
 
diff --git a/spec/section_param/section_param_puiss_torrentiel.spec.ts b/spec/section_param/section_param_puiss_torrentiel.spec.ts
index 65d0e12a347bbb01316de0ad2f14c5fa87216cd5..6cc2be4a7041d2a29a7fe0c835b73838625a9a56 100644
--- a/spec/section_param/section_param_puiss_torrentiel.spec.ts
+++ b/spec/section_param/section_param_puiss_torrentiel.spec.ts
@@ -1,4 +1,4 @@
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { cSnPuiss, ParamsSectionPuiss } from "../../src/section/section_puissance";
 import { equalEpsilon, precDist } from "../nubtest";
 
diff --git a/spec/section_param/section_param_rect_conv_newton.spec.ts b/spec/section_param/section_param_rect_conv_newton.spec.ts
index fad04b0338b48b2079af52733afcf30c8e85ef38..1d0fc9c557a8c4731468491a1182a7dfee2bbed9 100644
--- a/spec/section_param/section_param_rect_conv_newton.spec.ts
+++ b/spec/section_param/section_param_rect_conv_newton.spec.ts
@@ -1,5 +1,5 @@
 // tslint:disable:no-console
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { cSnRectang, ParamsSectionRectang } from "../../src/section/section_rectang";
 import { MessageCode } from "../../src/util/message";
 import { equalEpsilon, precDist } from "../nubtest";
diff --git a/spec/section_param/section_param_rect_fluvial.spec.ts b/spec/section_param/section_param_rect_fluvial.spec.ts
index 5ed1970149974facdef86a9f9da9843eb6f0212a..8ae7cca92cdc0cdddd1677f45e2f79a7e001b349 100644
--- a/spec/section_param/section_param_rect_fluvial.spec.ts
+++ b/spec/section_param/section_param_rect_fluvial.spec.ts
@@ -1,4 +1,4 @@
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { cSnRectang, ParamsSectionRectang } from "../../src/section/section_rectang";
 import { equalEpsilon, precDist } from "../nubtest";
 
diff --git a/spec/section_param/section_param_rect_torrentiel.spec.ts b/spec/section_param/section_param_rect_torrentiel.spec.ts
index b225406a03beae9da2d1139f8cc3a7ff27b45146..a5e7e374339f26e939bc788b1869d76dcbe974f1 100644
--- a/spec/section_param/section_param_rect_torrentiel.spec.ts
+++ b/spec/section_param/section_param_rect_torrentiel.spec.ts
@@ -1,4 +1,4 @@
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { cSnRectang, ParamsSectionRectang } from "../../src/section/section_rectang";
 import { equalEpsilon, precDist } from "../nubtest";
 
diff --git a/spec/section_param/section_param_trapez_fluvial.spec.ts b/spec/section_param/section_param_trapez_fluvial.spec.ts
index 086028bc0c6e84ffd1422359f1a519c8b75500ab..f2095057df8ce5a062b30602b27789004ce266a0 100644
--- a/spec/section_param/section_param_trapez_fluvial.spec.ts
+++ b/spec/section_param/section_param_trapez_fluvial.spec.ts
@@ -1,4 +1,4 @@
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { cSnTrapez, ParamsSectionTrapez } from "../../src/section/section_trapez";
 import { equalEpsilon, precDist } from "../nubtest";
 
diff --git a/spec/section_param/section_param_trapez_torrentiel.spec.ts b/spec/section_param/section_param_trapez_torrentiel.spec.ts
index 2b0cc47a7af62f36cba251d7b4d0f731f69eb926..2b03327234fb8c9ba651cca021b7a495d069494f 100644
--- a/spec/section_param/section_param_trapez_torrentiel.spec.ts
+++ b/spec/section_param/section_param_trapez_torrentiel.spec.ts
@@ -1,4 +1,4 @@
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { cSnTrapez, ParamsSectionTrapez } from "../../src/section/section_trapez";
 import { equalEpsilon, precDist } from "../nubtest";
 
diff --git a/spec/structure/rectangular_structure.ts b/spec/structure/rectangular_structure.ts
index 34b3b6ae4843767b257f7346875e0209a2ba316e..deee528562ccb15569b504fa57592847b9813da4 100644
--- a/spec/structure/rectangular_structure.ts
+++ b/spec/structure/rectangular_structure.ts
@@ -1,7 +1,7 @@
 // tslint:disable-next-line:no-reference
 /// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RectangularStructure } from "../../src/structure/rectangular_structure";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { precDigits } from "../nubtest";
diff --git a/spec/structure/structure.spec.ts b/spec/structure/structure.spec.ts
index 4f0ba77c6ab37ed73656d6fcac695d423c659b85..575f95863f8dafa798a91e82e49b7463bf9a9c16 100644
--- a/spec/structure/structure.spec.ts
+++ b/spec/structure/structure.spec.ts
@@ -1,8 +1,8 @@
 // tslint:disable-next-line:no-reference
 /// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../../src/base";
-import { Structure, StructureFlowMode, StructureFlowRegime, StructureParams} from "../../src/structure/structure";
+import { Result } from "../../src/util/result";
+import { Structure, StructureFlowMode, StructureFlowRegime, StructureParams } from "../../src/structure/structure";
 import { equalEpsilon } from "../nubtest";
 
 function check(val1: Result, val2: number) {
@@ -35,7 +35,7 @@ class StructureTest extends Structure {
             case "Q":
                 v = this.prms.h1.v - this.prms.h2.v;
                 break;
-                default:
+            default:
                 throw new Error("StructureTest.Equation() : invalid parameter name " + sVarCalc);
         }
         return new Result(v);
diff --git a/spec/structure/structure_cem88d.spec.ts b/spec/structure/structure_cem88d.spec.ts
index 1be7f28a43b0e65a3f1207b6986065c5924e2f4b..bae6c610ac9b8b9234bab8f31a0f8b22f61e1229 100644
--- a/spec/structure/structure_cem88d.spec.ts
+++ b/spec/structure/structure_cem88d.spec.ts
@@ -1,7 +1,7 @@
 // tslint:disable-next-line:no-reference
 /// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureCem88d } from "../../src/structure/structure_cem88d";
diff --git a/spec/structure/structure_cem88v.spec.ts b/spec/structure/structure_cem88v.spec.ts
index c2b3d1daccedac8d333f149c83284a1e54ffa2ca..0ab80754a6f4085eea91813080934d6b857665ee 100644
--- a/spec/structure/structure_cem88v.spec.ts
+++ b/spec/structure/structure_cem88v.spec.ts
@@ -1,7 +1,7 @@
 // tslint:disable-next-line:no-reference
 /// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureCem88v } from "../../src/structure/structure_cem88v";
diff --git a/spec/structure/structure_cunge80.spec.ts b/spec/structure/structure_cunge80.spec.ts
index 69cb47d92783e0771efe2d91c160573b60a6094a..8e4bc0324455f3819d7c5a2676b1d86e945705a2 100644
--- a/spec/structure/structure_cunge80.spec.ts
+++ b/spec/structure/structure_cunge80.spec.ts
@@ -1,7 +1,7 @@
 // tslint:disable-next-line:no-reference
 /// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureCunge80 } from "../../src/structure/structure_cunge80";
diff --git a/spec/structure/structure_orifice_free.spec.ts b/spec/structure/structure_orifice_free.spec.ts
index db51c1ec0ffa9ac9d4ca20837494efd5beae4518..44e1a7c3cefdb0aae57af592417e42a2d3e348a8 100644
--- a/spec/structure/structure_orifice_free.spec.ts
+++ b/spec/structure/structure_orifice_free.spec.ts
@@ -1,7 +1,7 @@
 // tslint:disable-next-line:no-reference
 /// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureOrificeFree } from "../../src/structure/structure_orifice_free";
diff --git a/spec/structure/structure_orifice_submerged.spec.ts b/spec/structure/structure_orifice_submerged.spec.ts
index 050bd6a7dc76407ed57d86d755b7cf5cb75e37a4..bf4cd9e8a5e710e013fc69cf1356701eac7b4107 100644
--- a/spec/structure/structure_orifice_submerged.spec.ts
+++ b/spec/structure/structure_orifice_submerged.spec.ts
@@ -1,7 +1,7 @@
 // tslint:disable-next-line:no-reference
 /// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureOrificeSubmerged } from "../../src/structure/structure_orifice_submerged";
diff --git a/spec/structure/structure_weir_free.spec.ts b/spec/structure/structure_weir_free.spec.ts
index 9a75c2d01c581992d620c12c5f41b9cbc612f0ce..1aa66d3a3dd4a6fc2efc17c93c2281d2474ae889 100644
--- a/spec/structure/structure_weir_free.spec.ts
+++ b/spec/structure/structure_weir_free.spec.ts
@@ -1,7 +1,7 @@
 // tslint:disable-next-line:no-reference
 /// <reference path="../../node_modules/@types/jasmine/index.d.ts" />
 
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureWeirFree } from "../../src/structure/structure_weir_free";
diff --git a/spec/structure/test_rectangular_structure.ts b/spec/structure/test_rectangular_structure.ts
index 9b7b60bd9560aeda382722cfcfc2660129bff53b..118442634104b6ebc154721d692be1205d3b56fd 100644
--- a/spec/structure/test_rectangular_structure.ts
+++ b/spec/structure/test_rectangular_structure.ts
@@ -1,4 +1,4 @@
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RectangularStructure } from "../../src/structure/rectangular_structure";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { expect, it } from "../mock_jasmine";
diff --git a/spec/structure/test_structure_cem88d.ts b/spec/structure/test_structure_cem88d.ts
index 92c674710f9ba2602dabc00d4d9023ccf6583a7e..0e00540709e76a6062e40cf4f27fdb8d2b78439c 100644
--- a/spec/structure/test_structure_cem88d.ts
+++ b/spec/structure/test_structure_cem88d.ts
@@ -1,4 +1,4 @@
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RectangularStructureParams, StructureCem88d } from "../../src/structure/structure_cem88d";
 import { describe, xdescribe } from "../mock_jasmine";
 import { precDigits } from "../nubtest";
diff --git a/spec/structure/test_structure_cem88v.ts b/spec/structure/test_structure_cem88v.ts
index 20acbfaeeee65dc51f05d1400e21d6ba34729936..c1be649b6d7927e23fca0d4cec6d1b0cfab11728 100644
--- a/spec/structure/test_structure_cem88v.ts
+++ b/spec/structure/test_structure_cem88v.ts
@@ -1,4 +1,4 @@
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RectangularStructureParams, StructureCem88v } from "../../src/structure/structure_cem88v";
 import { describe, xdescribe } from "../mock_jasmine";
 import { precDigits } from "../nubtest";
diff --git a/spec/structure/test_structure_cunge80.ts b/spec/structure/test_structure_cunge80.ts
index 7cc5df7cf6b296715fb54247ed5b4a4ebdcdc30f..60d794187f28671e8c6135946d09b535338a6584 100644
--- a/spec/structure/test_structure_cunge80.ts
+++ b/spec/structure/test_structure_cunge80.ts
@@ -1,4 +1,4 @@
-import { Result } from "../../src/base";
+import { Result } from "../../src/util/result";
 import { RectangularStructureParams } from "../../src/structure/rectangular_structure_params";
 import { StructureFlowMode, StructureFlowRegime } from "../../src/structure/structure";
 import { StructureCunge80 } from "../../src/structure/structure_cunge80";
diff --git a/src/base.ts b/src/base.ts
index ad55b28fade5bb9b6959e5e2245d49c8adbfe241..4365b942d68073c04d6fc6d7a26abd39a54cf317 100644
--- a/src/base.ts
+++ b/src/base.ts
@@ -1,39 +1,3 @@
-import { Message, MessageCode } from "./util/message";
-
-/**
- * Résultat de calcul comprenant la valeur du résultat et des calculs annexes (flag, calculs intermédiaires...)
- */
-export class Result {
-
-    /** Calculs intermédiaires ou supplémentaires, flags de calcul */
-    public extraVar: { [key: string]: any };
-
-    /** Valeur calculée */
-    public vCalc: number;
-
-    private _message: Message;
-
-    /**
-     * Résultat de calcul
-     * @param v Valeur numérique du résultat
-     * @param m Message d'erreur
-     * @param e Calculs intermédiaires ou supplémentaires, flags de calcul
-     */
-    constructor(v: number, e?: { [key: string]: any }, m?: Message) {
-        this.vCalc = v;
-        this.extraVar = e;
-        this._message = m;
-    }
-
-    get code() {
-        if (this._message == undefined)
-            return MessageCode.ERROR_OK;
-        return this._message.code;
-    }
-
-    get Message() { return this._message; }
-}
-
 /**
  * Série de valeurs à calculer définie par le nom de la variable à sérier et le vecteur de valeur
  */
diff --git a/src/cond_distri.ts b/src/cond_distri.ts
index d27d43bb32464c65e110f4328ce857fa8a0dee40..6ab4a1f2e70c35754daa5d98aff9f45f907ed0e6 100644
--- a/src/cond_distri.ts
+++ b/src/cond_distri.ts
@@ -1,4 +1,4 @@
-import { Result } from "./base";
+import { Result } from "./util/result";
 import { ComputeNodeType, ParamDefinition, ParamDomain, ParamDomainValue, ParamCalculability, ParamsEquation } from "./param";
 import { Nub } from "./nub";
 
diff --git a/src/dichotomie.ts b/src/dichotomie.ts
index d02fd2a010f6de02503138bd719bb0bcfd725890..49e85018fc8767fe3eb61cfa78f479c7d4ad7ca9 100644
--- a/src/dichotomie.ts
+++ b/src/dichotomie.ts
@@ -1,5 +1,6 @@
 // import { XOR, BoolIdentity, Debug, Result, ResultCode, UndefinedError } from "./base";
-import { XOR, BoolIdentity, Debug, Result } from "./base";
+import { XOR, BoolIdentity, Debug } from "./base";
+import { Result } from "./util/result";
 import { Message, MessageCode } from "./util/message";
 import { Nub } from "./nub";
 import { ParamDefinition, ParamDomain, ParamDomainValue } from "./param"
@@ -461,8 +462,7 @@ export class Dichotomie extends Debug {
         if (r.ok)
             var interv: SearchInterval = r.intSearch;
         else {
-            let result = new Result(undefined, undefined, r.res);
-            return result;
+            return new Result(r.res);
         }
 
         // Dichotomie
diff --git a/src/lechaptcalmon.ts b/src/lechaptcalmon.ts
index c7a8a635e1d1f5daa8c8a0669a8d9abc7d9127c7..39dd48c82b57b2845bfca23463863ab4775ce63e 100644
--- a/src/lechaptcalmon.ts
+++ b/src/lechaptcalmon.ts
@@ -1,4 +1,4 @@
-import { Result } from "./base";
+import { Result } from "./util/result";
 import { ComputeNodeType, ParamDefinition, ParamDomain, ParamDomainValue, ParamCalculability, ParamsEquation } from "./param";
 import { Nub } from "./nub";
 
diff --git a/src/nub.ts b/src/nub.ts
index bb30a00a3b5f0cd1da238712624ff8fcd1e573e6..d3822c3ab8c3d24aabe033a8a341c5b483683da4 100644
--- a/src/nub.ts
+++ b/src/nub.ts
@@ -1,4 +1,5 @@
-import { Debug, Result, Serie } from "./base"
+import { Debug, Serie } from "./base"
+import { Result } from "./util/result";
 import { Dichotomie } from "./dichotomie"
 import { ComputeNode, ParamDefinition, ParamsEquation } from "./param"
 
diff --git a/src/regime_uniforme.ts b/src/regime_uniforme.ts
index 1692c59f649adce1291a62b9661e245e3d248c90..5582c5e6366611fc27e0aee48c263695078593c9 100644
--- a/src/regime_uniforme.ts
+++ b/src/regime_uniforme.ts
@@ -1,4 +1,4 @@
-import { Result } from "./base";
+import { Result } from "./util/result";
 import { Nub } from "./nub";
 import { ParamsSection, acSection } from "./section/section_type";
 import { ParamDefinition, ParamCalculability } from "./param"
@@ -54,4 +54,4 @@ export class RegimeUniforme extends Nub {
 
         return new Result(v);
     }
-}
\ No newline at end of file
+}
diff --git a/src/remous.ts b/src/remous.ts
index de53b50c3ae6f628318517db10e83a2ff18a359e..ff305273c1259a3c3a02145ae9c5161cb943e736 100644
--- a/src/remous.ts
+++ b/src/remous.ts
@@ -1,5 +1,6 @@
 import { ParamsSection, acSection } from "./section/section_type";
-import { XOR, Result, round } from "./base";
+import { XOR, round } from "./base";
+import { Result } from "./util/result";
 import { ParamsEquation, ParamDefinition, ParamCalculability, ComputeNodeType, ParamDomainValue } from "./param";
 import { Dichotomie } from "./dichotomie";
 import { Nub } from "./nub";
@@ -168,8 +169,9 @@ export class CourbeRemous extends Nub {
 	private Calc_Y_EulerExplicite(Y: number): Result {
 		// L'appel à Calc('J') avec Y en paramètre réinitialise toutes les données dépendantes de la ligne d'eau
 		let Y2 = Y + this.Dx * this.Calc_dYdX(Y);
-		if (XOR(this.Dx > 0, !(Y2 < this.Sn.HautCritique)))
-			return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
+		if (XOR(this.Dx > 0, !(Y2 < this.Sn.HautCritique))) {
+			return new Result(new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
+		}
 
 		return new Result(Y2);
 	}
@@ -189,22 +191,25 @@ export class CourbeRemous extends Nub {
 		let hc = this.Sn.HautCritique;
 
 		//if ($this ->rDx > 0 xor !($Y + $rDx / 2 * $rk1 < $this ->oSect ->rHautCritique)) { return false; }
-		if (XOR(Dx > 0, !(Y + Dx / 2 * k1 < hc)))
-			return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
+		if (XOR(Dx > 0, !(Y + Dx / 2 * k1 < hc))) {
+			return new Result(new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
+		}
 
 		//$rk2 = $this ->Calc_dYdX($Y + $rDx / 2 * $rk1);
 		let k2 = this.Calc_dYdX(Y + Dx / 2 * k1);
 
 		//if ($this ->rDx > 0 xor !($Y + $rDx / 2 * $rk2 < $this ->oSect ->rHautCritique)) { return false; }
-		if (XOR(Dx > 0, !(Y + Dx / 2 * k2 < hc)))
-			return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
+		if (XOR(Dx > 0, !(Y + Dx / 2 * k2 < hc))) {
+			return new Result(new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
+		}
 
 		//$rk3 = $this ->Calc_dYdX($Y + $rDx / 2 * $rk2);
 		let k3 = this.Calc_dYdX(Y + Dx / 2 * k2);
 
 		//if ($this ->rDx > 0 xor !($Y + $rDx / 2 * $rk3 < $this ->oSect ->rHautCritique)) { return false; }
-		if (XOR(Dx > 0, !(Y + Dx / 2 * k3 < hc)))
-			return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
+		if (XOR(Dx > 0, !(Y + Dx / 2 * k3 < hc))) {
+			return new Result(new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
+		}
 
 		//$rk4 = $this ->Calc_dYdX($Y + $rDx * $rk3);
 		let k4 = this.Calc_dYdX(Y + Dx * k3);
@@ -213,8 +218,9 @@ export class CourbeRemous extends Nub {
 		let Yout = Y + Dx / 6 * (k1 + 2 * (k2 + k3) + k4);
 
 		//if ($this ->rDx > 0 xor !($Yout < $this ->oSect ->rHautCritique)) { return false; }
-		if (XOR(Dx > 0, !(Yout < hc)))
-			return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
+		if (XOR(Dx > 0, !(Yout < hc))) {
+			let res = new Result(new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
+		}
 
 		return new Result(Yout);
 	}
@@ -254,13 +260,14 @@ export class CourbeRemous extends Nub {
 		let r: Result = Dicho.Dichotomie(Trapez_Fn, this.prmSect.Prec.v, Y);
 
 		// if ($flag < 0) {
-		if (r.code != MessageCode.ERROR_OK)
+		if (!r.ok)
 			return r;
 
 		let Y2 = r.vCalc;
 		// } elseif($this ->rDx > 0 xor !($Y2 < $this ->oSect ->rHautCritique)) {
-		if (XOR(this.Dx > 0, !(Y2 < this.Sn.HautCritique)))
-			return new Result(undefined, new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
+		if (XOR(this.Dx > 0, !(Y2 < this.Sn.HautCritique))) {
+			return new Result(new Message(MessageCode.ERROR_REMOUS_ARRET_CRITIQUE));
+		}
 
 		return new Result(Y2);
 	}
@@ -337,7 +344,7 @@ export class CourbeRemous extends Nub {
 			// this.debug("end trY " + this.last(trY));
 			// this.debug("Yn " + this.Sn.HautNormale);
 
-			if (rY.code == MessageCode.ERROR_OK) {
+			if (rY.ok) {
 				// on vérifie qu'on ne traverse pas la hauteur normale (à la précision de calcul près)
 				let prec: number = this.prms.map.Prec.v;
 				let b1: boolean = lastY - this.Sn.HautNormale > prec;
@@ -689,4 +696,4 @@ export class CourbeRemous extends Nub {
 
 		return { "flu": crbFlu, "tor": crbTor, "trX": trX, "tRes": tRes };
 	}
-}
\ No newline at end of file
+}
diff --git a/src/structure/structure.ts b/src/structure/structure.ts
index f1254a47f068523df82df5f3568d8ebc29d0b0a0..c9f43ae1a0e69ad7595bf9b4b3ab1dd7d93a07dc 100644
--- a/src/structure/structure.ts
+++ b/src/structure/structure.ts
@@ -1,4 +1,4 @@
-import { Result } from "../base";
+import { Result } from "../util/result";
 import { Nub } from "../nub";
 import { ParamCalculability } from "../param";
 import { Message } from "../util/message";
@@ -55,12 +55,13 @@ export abstract class Structure extends Nub {
     /**
      * Calcul du mode et du régime d'écoulement
      */
-    public Equation(sVarCalc: string): Result {
-        this.CheckEquation(sVarCalc);
-        const res: Result = new Result(undefined, {
-                                        Mode:     this.getFlowMode(),
-                                        Regime:   this.getFlowRegime()});
-        return res;
+    public abstract Equation(sVarCalc: string): Result;
+
+    protected defaultResultData() {
+        return {
+            Mode: this.getFlowMode(),
+            Regime: this.getFlowRegime()
+        };
     }
 
     /**
@@ -161,7 +162,7 @@ export abstract class Structure extends Nub {
     /**
      * Test générique si VarCalc="Q" pour l'utilisation de Equation
      */
-    private CheckEquation(sVarCalc: string) {
+    protected CheckEquation(sVarCalc: string) {
         if (sVarCalc !== "Q") { throw new Error("Structure.Equation() : invalid parameter name " + sVarCalc); }
     }
 }
diff --git a/src/structure/structure_cem88d.ts b/src/structure/structure_cem88d.ts
index 8ddde8744cb93df31c65333fe725ae8583d6f80b..345e6825f5ca9008efc551a3324ce23c14839b37 100644
--- a/src/structure/structure_cem88d.ts
+++ b/src/structure/structure_cem88d.ts
@@ -1,4 +1,4 @@
-import { Result } from "../base";
+import { Result } from "../util/result";
 import { RectangularStructure } from "./rectangular_structure";
 import { RectangularStructureParams } from "./rectangular_structure_params";
 import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure";
@@ -15,16 +15,18 @@ export class StructureCem88d extends RectangularStructure {
      * @param sVarCalc Variable à calculer (doit être "Q")
      */
     public Equation(sVarCalc: string): Result {
-        const res: Result = super.Equation(sVarCalc);
+        super.CheckEquation(sVarCalc);
+        const data = super.defaultResultData();
+
         let v: number;
         const cd: number = this.prms.Cd.v * this.prms.L.v * Structure.R2G;
         const b1: number = Math.sqrt(this.prms.h1.v);
         const b2: number = Math.sqrt(this.prms.h1.v - this.prms.h2.v);
         const cd1: number = cd * 2.5981; // cd * 3*sqrt(3)/2
         this.debug("StructureCem88d.Equation b1=" + b1 + " b2=" + b2 + " cd1=" + cd1);
-        switch (res.extraVar.Mode) {
+        switch (data.Mode) {
             case StructureFlowMode.WEIR:
-                switch (res.extraVar.Regime) {
+                switch (data.Regime) {
                     case StructureFlowRegime.FREE:
                         v = cd * this.prms.h1.v * b1;
                         break;
@@ -36,7 +38,7 @@ export class StructureCem88d extends RectangularStructure {
                 break;
             case StructureFlowMode.ORIFICE:
                 const b3: number = Math.pow(this.prms.h1.v - this.prms.W.v, 1.5);
-                switch (res.extraVar.Regime) {
+                switch (data.Regime) {
                     case StructureFlowRegime.FREE:
                         v = cd * (this.prms.h1.v * b1 - b3);
                         break;
@@ -52,7 +54,7 @@ export class StructureCem88d extends RectangularStructure {
         this.debug(
             "StructureCem88d.Equation(h1=" + this.prms.h1.v + ",h2="
             + this.prms.h2.v + ",W=" + this.prms.W.v + ") => Q=" + v);
-        res.vCalc = v;
-        return res;
+
+        return new Result(v, data);
     }
 }
diff --git a/src/structure/structure_cem88v.ts b/src/structure/structure_cem88v.ts
index 457f430006452b553bedd14f5b744a29ed1bafff..cef783f7cb1adb6d65f57ca65d1bfce705b20c05 100644
--- a/src/structure/structure_cem88v.ts
+++ b/src/structure/structure_cem88v.ts
@@ -1,4 +1,4 @@
-import { Result } from "../base";
+import { Result } from "../util/result";
 import { RectangularStructure } from "./rectangular_structure";
 import { RectangularStructureParams } from "./rectangular_structure_params";
 import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure";
@@ -15,17 +15,19 @@ export class StructureCem88v extends RectangularStructure {
      * @param sVarCalc Variable à calculer (doit être "Q")
      */
     public Equation(sVarCalc: string): Result {
-        const res: Result = super.Equation(sVarCalc);
+        super.CheckEquation(sVarCalc);
+        const data = super.defaultResultData();
+
         let v: number;
         const mu0: number = 2 / 3 * this.prms.Cd.v;
         let KF: number;
-        if (res.extraVar.Regime !== StructureFlowRegime.FREE) {
-            KF = this.getKF(Math.sqrt( 1 - this.prms.h2.v / this.prms.h1.v), this.getAlfa(this.prms.h2.v));
+        if (data.Regime !== StructureFlowRegime.FREE) {
+            KF = this.getKF(Math.sqrt(1 - this.prms.h2.v / this.prms.h1.v), this.getAlfa(this.prms.h2.v));
         }
-        switch (res.extraVar.Mode) {
+        switch (data.Mode) {
             case StructureFlowMode.WEIR:
                 const muf: number = mu0 - 0.08;
-                switch (res.extraVar.Regime) {
+                switch (data.Regime) {
                     case StructureFlowRegime.FREE:
                         v = muf * this.prms.L.v * Structure.R2G * Math.pow(this.prms.h1.v, 1.5);
                         break;
@@ -36,21 +38,21 @@ export class StructureCem88v extends RectangularStructure {
                 }
                 break;
             case StructureFlowMode.ORIFICE:
-                const mu: number  = mu0 - 0.08 / (this.prms.h1.v / this.prms.W.v);
+                const mu: number = mu0 - 0.08 / (this.prms.h1.v / this.prms.W.v);
                 const mu1: number = mu0 - 0.08 / (this.prms.h1.v / this.prms.W.v - 1);
-                if (res.extraVar.Regime === StructureFlowRegime.FREE) {
+                if (data.Regime === StructureFlowRegime.FREE) {
                     v = this.prms.L.v * Structure.R2G
                         * (mu * Math.pow(this.prms.h1.v, 1.5)
-                        - mu1 * Math.pow(this.prms.h1.v - this.prms.W.v, 1.5));
+                            - mu1 * Math.pow(this.prms.h1.v - this.prms.W.v, 1.5));
                 } else {
-                    if (res.extraVar.Regime === StructureFlowRegime.PARTIAL) {
+                    if (data.Regime === StructureFlowRegime.PARTIAL) {
                         v = this.prms.L.v * Structure.R2G * (
                             KF * mu * Math.pow(this.prms.h1.v, 1.5)
                             - mu1 * Math.pow(this.prms.h1.v - this.prms.W.v, 1.5)
                         );
                     } else {
                         const KF1 = this.getKF(
-                            Math.sqrt( 1 - (this.prms.h2.v - this.prms.W.v) / (this.prms.h1.v - this.prms.W.v)),
+                            Math.sqrt(1 - (this.prms.h2.v - this.prms.W.v) / (this.prms.h1.v - this.prms.W.v)),
                             this.getAlfa(this.prms.h2.v - this.prms.W.v),
                         );
                         v = this.prms.L.v * Structure.R2G * (
@@ -63,8 +65,8 @@ export class StructureCem88v extends RectangularStructure {
         this.debug(
             "StructureCem88v.Equation(h1=" + this.prms.h1.v
             + ",h2=" + this.prms.h2.v + ",W=" + this.prms.W.v + ") => Q=" + v);
-        res.vCalc = v;
-        return res;
+
+        return new Result(v, data);
     }
 
     /**
diff --git a/src/structure/structure_cunge80.ts b/src/structure/structure_cunge80.ts
index d9cc8f448aad3ae941fb0198a1c8d4e375339889..bc8b05c40545d4128eb3351d70b42bc434eae8f0 100644
--- a/src/structure/structure_cunge80.ts
+++ b/src/structure/structure_cunge80.ts
@@ -1,4 +1,4 @@
-import { Result } from "../base";
+import { Result } from "../util/result";
 import { RectangularStructure } from "./rectangular_structure";
 import { RectangularStructureParams } from "./rectangular_structure_params";
 import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure";
@@ -14,31 +14,35 @@ export class StructureCunge80 extends RectangularStructure {
      * @param sVarCalc Variable à calculer (doit être égale à Q ici)
      */
     public Equation(sVarCalc: string): Result {
-        const res: Result = super.Equation(sVarCalc);
-        switch (res.extraVar.Regime) {
+        super.CheckEquation(sVarCalc);
+        const data = super.defaultResultData();
+        let v: number;
+
+        switch (data.Regime) {
             case StructureFlowRegime.FREE:
-                if (res.extraVar.Mode === StructureFlowMode.WEIR) {
+                if (data.Mode === StructureFlowMode.WEIR) {
                     const R32: number = 3 * Math.sqrt(3) / 2;
-                    res.vCalc = this.prms.Cd.v * this.prms.L.v * Structure.R2G / R32 * Math.pow(this.prms.h1.v, 1.5);
-                    this.debug("StructureCunge80.Equation WEIR FREE Q=" + res.vCalc);
+                    v = this.prms.Cd.v * this.prms.L.v * Structure.R2G / R32 * Math.pow(this.prms.h1.v, 1.5);
+                    this.debug("StructureCunge80.Equation WEIR FREE Q=" + v);
                 } else {
-                    res.vCalc = this.prms.Cd.v * this.prms.L.v * Structure.R2G
+                    v = this.prms.Cd.v * this.prms.L.v * Structure.R2G
                         * this.prms.W.v * Math.pow(this.prms.h1.v - this.prms.W.v, 0.5);
-                    this.debug("StructureCunge80.Equation ORIFICE FREE Q=" + res.vCalc);
+                    this.debug("StructureCunge80.Equation ORIFICE FREE Q=" + v);
                 }
                 break;
             case StructureFlowRegime.SUBMERGED:
-                if (res.extraVar.Mode === StructureFlowMode.WEIR) {
-                    res.vCalc = this.prms.Cd.v * this.prms.L.v * Structure.R2G * this.prms.h2.v
+                if (data.Mode === StructureFlowMode.WEIR) {
+                    v = this.prms.Cd.v * this.prms.L.v * Structure.R2G * this.prms.h2.v
                         * Math.sqrt(this.prms.h1.v - this.prms.h2.v);
-                    this.debug("StructureCunge80.Equation WEIR SUBMERGED Q=" + res.vCalc);
+                    this.debug("StructureCunge80.Equation WEIR SUBMERGED Q=" + v);
                 } else {
-                    res.vCalc = this.prms.Cd.v * this.prms.L.v * Structure.R2G
+                    v = this.prms.Cd.v * this.prms.L.v * Structure.R2G
                         * this.prms.W.v * Math.sqrt(this.prms.h1.v - this.prms.h2.v);
-                    this.debug("StructureCunge80.Equation ORIFICE SUBMERGED Q=" + res.vCalc);
+                    this.debug("StructureCunge80.Equation ORIFICE SUBMERGED Q=" + v);
                 }
         }
-        return res;
+
+        return new Result(v, data);
     }
 
     protected getFlowRegime() {
diff --git a/src/structure/structure_orifice_free.ts b/src/structure/structure_orifice_free.ts
index fcb3477baaeaebf07645bc770024b371c9adc367..39272136e8abf5a59581bb2e84ed0a02bcb4a0a3 100644
--- a/src/structure/structure_orifice_free.ts
+++ b/src/structure/structure_orifice_free.ts
@@ -1,4 +1,4 @@
-import { Result } from "../base";
+import { Result } from "../util/result";
 import { RectangularStructure } from "./rectangular_structure";
 import { RectangularStructureParams } from "./rectangular_structure_params";
 import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure";
@@ -14,11 +14,14 @@ export class StructureOrificeFree extends RectangularStructure {
      * @param sVarCalc Variable à calculer (doit être égale à Q ici)
      */
     public Equation(sVarCalc: string): Result {
-        const res: Result = super.Equation(sVarCalc);
+        super.CheckEquation(sVarCalc);
+        const data = super.defaultResultData();
+
         // TODO : Warning si les conditions hydrauliques ne correspondent pas à un écoulement dénoyé
-        res.extraVar.Regime = StructureFlowRegime.FREE;
-        res.vCalc = this.prms.Cd.v * Math.min(this.prms.W.v, this.prms.h1.v) * this.prms.L.v
+        data.Regime = StructureFlowRegime.FREE;
+        const v = this.prms.Cd.v * Math.min(this.prms.W.v, this.prms.h1.v) * this.prms.L.v
             * Structure.R2G * Math.sqrt(this.prms.h1.v);
-        return res;
+
+        return new Result(v, data);
     }
 }
diff --git a/src/structure/structure_orifice_submerged.ts b/src/structure/structure_orifice_submerged.ts
index bfdc4e57c0e68558e28e70945ae42d3036aea2ef..c8a670153bdffe166825e33770b2427b1eecd966 100644
--- a/src/structure/structure_orifice_submerged.ts
+++ b/src/structure/structure_orifice_submerged.ts
@@ -1,4 +1,4 @@
-import { Result } from "../base";
+import { Result } from "../util/result";
 import { RectangularStructure } from "./rectangular_structure";
 import { RectangularStructureParams } from "./rectangular_structure_params";
 import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure";
@@ -14,11 +14,14 @@ export class StructureOrificeSubmerged extends RectangularStructure {
      * @param sVarCalc Variable à calculer (doit être égale à Q ici)
      */
     public Equation(sVarCalc: string): Result {
-        const res: Result = super.Equation(sVarCalc);
+        super.CheckEquation(sVarCalc);
+        const data = super.defaultResultData();
+
         // TODO : Warning si les conditions hydrauliques ne correspondent pas à un écoulement dénoyé
-        res.extraVar.Regime = StructureFlowRegime.SUBMERGED;
-        res.vCalc = this.prms.Cd.v * Math.min(this.prms.W.v, this.prms.h1.v) * this.prms.L.v
+        data.Regime = StructureFlowRegime.SUBMERGED;
+        const v = this.prms.Cd.v * Math.min(this.prms.W.v, this.prms.h1.v) * this.prms.L.v
             * Structure.R2G * Math.sqrt(this.prms.h1.v - this.prms.h2.v);
-        return res;
+
+        return new Result(v, data);
     }
 }
diff --git a/src/structure/structure_params.ts b/src/structure/structure_params.ts
index 52305ce790126500672211ec1c528b423d480516..539047181ae3b3e4971914c9a2f535b19f3bc33e 100644
--- a/src/structure/structure_params.ts
+++ b/src/structure/structure_params.ts
@@ -1,4 +1,4 @@
-import { Result } from "../base";
+import { Result } from "../util/result";
 import { Nub } from "../nub";
 import { ComputeNodeType, ParamDefinition, ParamDomain, ParamDomainValue, ParamsEquation } from "../param";
 import { Message } from "../util/message";
diff --git a/src/structure/structure_weir_free.ts b/src/structure/structure_weir_free.ts
index fd1246406f35b38b10429ab821e34edc7d8f3831..4f862723bb97b245245a9775db7402e63d8e88de 100644
--- a/src/structure/structure_weir_free.ts
+++ b/src/structure/structure_weir_free.ts
@@ -1,4 +1,4 @@
-import { Result } from "../base";
+import { Result } from "../util/result";
 import { RectangularStructure } from "./rectangular_structure";
 import { RectangularStructureParams } from "./rectangular_structure_params";
 import { Structure, StructureFlowMode, StructureFlowRegime } from "./structure";
@@ -14,11 +14,14 @@ export class StructureWeirFree extends RectangularStructure {
      * @param sVarCalc Variable à calculer (doit être "Q")
      */
     public Equation(sVarCalc: string): Result {
-        const res: Result = super.Equation(sVarCalc);
+        super.CheckEquation(sVarCalc);
+        const data = super.defaultResultData();
+
         // TODO : Warning si les conditions hydrauliques ne correspondent pas à un seuil dénoyé
-        res.extraVar.Regime = StructureFlowRegime.FREE;
-        res.extraVar.Mode = StructureFlowMode.WEIR;
-        res.vCalc = this.prms.Cd.v * this.prms.L.v * Structure.R2G * Math.pow(this.prms.h1.v, 1.5);
-        return res;
+        data.Regime = StructureFlowRegime.FREE;
+        data.Mode = StructureFlowMode.WEIR;
+        const v = this.prms.Cd.v * this.prms.L.v * Structure.R2G * Math.pow(this.prms.h1.v, 1.5);
+
+        return new Result(v, data);
     }
 }
diff --git a/src/util/result.ts b/src/util/result.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1456888a9f224f429b49f43c7489a2d55f90ac1c
--- /dev/null
+++ b/src/util/result.ts
@@ -0,0 +1,62 @@
+import { cLog } from "./log";
+import { Message, MessageCode } from "./message";
+
+/**
+ * Résultat de calcul comprenant la valeur du résultat et des calculs annexes (flag, calculs intermédiaires...)
+ */
+export class Result {
+    /** Valeur calculée */
+    private _vCalc: number;
+
+    private _log: cLog;
+
+    constructor(v: number | Message, d: {} = undefined) {
+        this._log = new cLog();
+        if (typeof v == "number") {
+            this._vCalc = v;
+            const m = new Message(MessageCode.ERROR_OK);
+            m.extraVar = d;
+            this._log.add(m);
+        }
+        else {
+            if (d != undefined)
+                throw new Error("appel à Result.constructor() invalide");
+            this._log.add(v);
+        }
+    };
+
+    get vCalc() { return this._vCalc; }
+
+    get code(): MessageCode {
+        if (this.messageCount != 1)
+            throw new Error("appel à Result.code invalide, il n'y pas exactement un message de log");
+        return this._log.messages[0].code;
+    }
+
+    get extraVar() {
+        if (this.messageCount != 1)
+            throw new Error("appel à Result.extraVar invalide, il n'y pas exactement un message de log");
+        return this._log.messages[0].extraVar;
+    }
+
+    public addMessage(m: Message) {
+        this._log.add(m);
+    }
+
+    public get log(): cLog {
+        return this._log;
+    }
+
+    private get messageCount(): number {
+        return this._log.messages.length;
+    }
+
+    public get ok(): boolean {
+        if (this._vCalc == undefined)
+            return false;
+        for (let m of this._log.messages)
+            if (m.code != MessageCode.ERROR_OK)
+                return false;
+        return true;
+    }
+}