diff --git a/src/compute-node.ts b/src/compute-node.ts
index 7dc9278b4befd7a58f16e39c610ba92456c29559..adc2ae4f52ac126788d2c945eda513a2354d31b9 100644
--- a/src/compute-node.ts
+++ b/src/compute-node.ts
@@ -70,8 +70,6 @@ export abstract class ComputeNode extends JalhydObject implements IDebug {
      */
     protected _resultsUnits: any;
 
-    protected _calcType: CalculatorType;
-
     private _debug: Debug;
 
     constructor(prms: ParamsEquation, dbg: boolean = false) {
diff --git a/src/devalaison/grille.ts b/src/devalaison/grille.ts
index 1d9621a43c9eb13330b2d101c13a19cec8524fee..b54f0757b11588ccad3e70ff2c314817b18281b6 100644
--- a/src/devalaison/grille.ts
+++ b/src/devalaison/grille.ts
@@ -23,7 +23,7 @@ export class Grille extends Nub implements Observer {
 
     constructor(prms: GrilleParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.Grille;
+        this.setCalculatorType(CalculatorType.Grille);
         this._props.addObserver(this);
         this.type = GrilleType.Inclined;
         this.profile = GrilleProfile.Rectangular;
diff --git a/src/devalaison/jet.ts b/src/devalaison/jet.ts
index 13e3f87e1d7e5f60af8a37347084e5a484279813..c00f1944db56539e83da61ef8c81c5f5df12633b 100644
--- a/src/devalaison/jet.ts
+++ b/src/devalaison/jet.ts
@@ -13,7 +13,7 @@ export class Jet extends Nub {
 
     public constructor(prms: JetParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.Jet;
+        this.setCalculatorType(CalculatorType.Jet);
         this._defaultCalculatedParam = prms.D;
         this.resetDefaultCalculatedParam();
     }
diff --git a/src/macrorugo/concentration_blocs.ts b/src/macrorugo/concentration_blocs.ts
index b06a60a4c5eef8b0a15d9df5f8a298ba45da7b8a..d2738e3bc307c35fe5ae8b9d7dd7d7aa17ea2ebf 100644
--- a/src/macrorugo/concentration_blocs.ts
+++ b/src/macrorugo/concentration_blocs.ts
@@ -10,7 +10,7 @@ export class ConcentrationBlocs extends Nub {
 
     constructor(prms: ConcentrationBlocsParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.ConcentrationBlocs;
+        this.setCalculatorType(CalculatorType.ConcentrationBlocs);
         this._defaultCalculatedParam = prms.C;
         this.resetDefaultCalculatedParam();
     }
diff --git a/src/macrorugo/macrorugo.ts b/src/macrorugo/macrorugo.ts
index cdd326052671b0de068687f82ed281eb3d007250..4c80085da29da805eda7c02abe3af34430094b1e 100644
--- a/src/macrorugo/macrorugo.ts
+++ b/src/macrorugo/macrorugo.ts
@@ -57,7 +57,7 @@ export class MacroRugo extends FishPass {
     constructor(prms: MacrorugoParams, dbg: boolean = false) {
         super(prms, dbg);
         this._cache = {};
-        this._calcType = CalculatorType.MacroRugo;
+        this.setCalculatorType(CalculatorType.MacroRugo);
         this._defaultCalculatedParam = this.prms.Q;
         this._intlType = "MacroRugo";
         this.resetDefaultCalculatedParam();
diff --git a/src/macrorugo/macrorugo_compound.ts b/src/macrorugo/macrorugo_compound.ts
index 021e1eb267fa84fdb81a471b50ab47471fad6c44..4d4b748edf24a686a6341a70a135007ca3cab5d1 100644
--- a/src/macrorugo/macrorugo_compound.ts
+++ b/src/macrorugo/macrorugo_compound.ts
@@ -24,7 +24,7 @@ export class MacrorugoCompound extends MacroRugo implements Observer {
 
     constructor(prms: MacrorugoCompoundParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.MacroRugoCompound;
+        this.setCalculatorType(CalculatorType.MacroRugoCompound);
         this._props.addObserver(this);
         this.inclinedApron = MRCInclination.NOT_INCLINED;
     }
diff --git a/src/math/spp.ts b/src/math/spp.ts
index aaffa17878ac04440144fc0025c2999bde72d11d..b7436633524c7a9e2e9f074d71e40bcfd1b3b4d9 100644
--- a/src/math/spp.ts
+++ b/src/math/spp.ts
@@ -19,7 +19,7 @@ export class SPP extends Nub {
 
     constructor(prms: SPPParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.SPP;
+        this.setCalculatorType(CalculatorType.SPP);
         this._defaultCalculatedParam = prms.Y;
         this.resetDefaultCalculatedParam();
         this.operation = SPPOperation.SUM;
diff --git a/src/math/trigo.ts b/src/math/trigo.ts
index 13e6cad8a2849b30c21b3a7f7807b119ef25856e..606210c5f970d45a98df5579cf82fc0a646b62c8 100644
--- a/src/math/trigo.ts
+++ b/src/math/trigo.ts
@@ -27,7 +27,7 @@ export class Trigo extends Nub implements Observer {
 
     constructor(prms: TrigoParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.Trigo;
+        this.setCalculatorType(CalculatorType.Trigo);
         this._defaultCalculatedParam = prms.Y;
         this.resetDefaultCalculatedParam();
         this.properties.addObserver(this);
diff --git a/src/math/yaxb.ts b/src/math/yaxb.ts
index 3dbb19b3f5c45e28999cf9d71d6816401da811b0..dff5d1df9395d38076c038b2bfd27727113d73d8 100644
--- a/src/math/yaxb.ts
+++ b/src/math/yaxb.ts
@@ -12,7 +12,7 @@ export class YAXB extends Nub {
 
     constructor(prms: YAXBParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.YAXB;
+        this.setCalculatorType(CalculatorType.YAXB);
         this._defaultCalculatedParam = prms.Y;
         this.resetDefaultCalculatedParam();
     }
diff --git a/src/math/yaxn.ts b/src/math/yaxn.ts
index 0c05407e3adf230af8df5f505b28e5e1b830305c..2cb0b7624ab0a3699dbc45c4b890e0ab5957d76d 100644
--- a/src/math/yaxn.ts
+++ b/src/math/yaxn.ts
@@ -12,7 +12,7 @@ export class YAXN extends ChildNub {
 
     constructor(prms: YAXNParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.YAXN;
+        this.setCalculatorType(CalculatorType.YAXN);
         this._defaultCalculatedParam = prms.Y;
         this._intlType = "Puissance";
         this.resetDefaultCalculatedParam();
diff --git a/src/nub.ts b/src/nub.ts
index 77ef5d81fb21b72a65fe5b40bc9e6d901d337732..73d7590ed73dae8aed6fcae6e94c422e62bbb28e 100644
--- a/src/nub.ts
+++ b/src/nub.ts
@@ -94,6 +94,17 @@ export abstract class Nub extends ComputeNode implements IObservable {
         return this._result;
     }
 
+    private _calcType: CalculatorType;
+
+    /**
+     * set Nub calculator type.
+     * give children the opportunity to react to assignment
+     * @see Structure
+     */
+    protected setCalculatorType(ct: CalculatorType) {
+        this._calcType = ct;
+    }
+
     /**
      * Local setter to set results of Equation() / Solve() / …  as current
      * ResultElement, instead of overwriting the whole Result object
diff --git a/src/open-channel/bief.ts b/src/open-channel/bief.ts
index c5fba684ba10d7994ec81dc97ddcecc5b8f2dfd2..59bf16f956145b965660024105a5a188f0f293b7 100644
--- a/src/open-channel/bief.ts
+++ b/src/open-channel/bief.ts
@@ -18,7 +18,7 @@ export class Bief extends SectionNub implements Observer {
 
     constructor(s: acSection, bp: BiefParams, dbg: boolean = false) {
         super(bp, dbg);
-        this._calcType = CalculatorType.Bief;
+        this.setCalculatorType(CalculatorType.Bief);
         this.setSection(s);
         this._props.addObserver(this);
         this.regime = BiefRegime.Fluvial;
diff --git a/src/open-channel/pente.ts b/src/open-channel/pente.ts
index 28407d0a51a6fe3f1d83cf4ecb6bad1c48420c83..c06070d2c2bd73e03a8dcf9389ba912918b29bf0 100644
--- a/src/open-channel/pente.ts
+++ b/src/open-channel/pente.ts
@@ -8,7 +8,7 @@ export class Pente extends Nub {
 
     constructor(prms: PenteParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.Pente;
+        this.setCalculatorType(CalculatorType.Pente);
         this._defaultCalculatedParam = prms.I;
         this.resetDefaultCalculatedParam();
     }
diff --git a/src/open-channel/regime_uniforme.ts b/src/open-channel/regime_uniforme.ts
index 45be61ca176c93e28a42867c8ff1ea3e0a296083..e842449979865455cbab5887c9a0ba04a17300e3 100644
--- a/src/open-channel/regime_uniforme.ts
+++ b/src/open-channel/regime_uniforme.ts
@@ -12,7 +12,7 @@ export class RegimeUniforme extends SectionNub {
 
     constructor(s: acSection, dbg: boolean = false) {
         super(new SectionParams(), dbg);
-        this._calcType = CalculatorType.RegimeUniforme;
+        this.setCalculatorType(CalculatorType.RegimeUniforme);
         this.setSection(s);
     }
 
diff --git a/src/open-channel/remous.ts b/src/open-channel/remous.ts
index f3be273953964158fc045e2edb4a09af19aaabc8..cb8e52fb24bc78cc942a600fa342b2b4e5b88758 100644
--- a/src/open-channel/remous.ts
+++ b/src/open-channel/remous.ts
@@ -38,7 +38,7 @@ export class CourbeRemous extends SectionNub {
         dbg: boolean = false
     ) {
         super(crp, dbg);
-        this._calcType = CalculatorType.CourbeRemous;
+        this.setCalculatorType(CalculatorType.CourbeRemous);
         this.setSection(s);
         this.methodeResolution = method;
         // no calculated parameter
diff --git a/src/open-channel/section/section_parametree.ts b/src/open-channel/section/section_parametree.ts
index dcd8c599dcb9738cfec884907d5045a000d92e61..725057ae8424efce7cb004f288ae2a8eb250bf46 100644
--- a/src/open-channel/section/section_parametree.ts
+++ b/src/open-channel/section/section_parametree.ts
@@ -14,7 +14,7 @@ export class SectionParametree extends SectionNub {
 
     constructor(s: acSection, dbg: boolean = false) {
         super(new SectionParams(), dbg);
-        this._calcType = CalculatorType.SectionParametree;
+        this.setCalculatorType(CalculatorType.SectionParametree);
         this.setSection(s);
         this.initSectionVars();
         // no calculated parameter
diff --git a/src/open-channel/section/section_type.ts b/src/open-channel/section/section_type.ts
index 78a6ca7e7d928ad04463808ff4a06b542e93d2e8..be114310313c472be1b4b5e94f9334e2d2092d5a 100644
--- a/src/open-channel/section/section_type.ts
+++ b/src/open-channel/section/section_type.ts
@@ -89,7 +89,7 @@ export abstract class acSection extends Nub {
      */
     constructor(prms: ParamsSection, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.Section;
+        this.setCalculatorType(CalculatorType.Section);
         this._newtonDbg = dbg;
         this._intlType = "Section";
     }
diff --git a/src/pab/cloison_aval.ts b/src/pab/cloison_aval.ts
index 880198d6f79b7db6e1ebfa2a141a0c3855a6d209..31d961585a17dc7d2d835964974b3d8c863c99ff 100644
--- a/src/pab/cloison_aval.ts
+++ b/src/pab/cloison_aval.ts
@@ -12,7 +12,7 @@ export class CloisonAval extends ParallelStructure {
 
     constructor(prms: CloisonsAvalParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.CloisonAval;
+        this.setCalculatorType(CalculatorType.CloisonAval);
         this._intlType = "Cloison";
     }
 
diff --git a/src/pab/cloisons.ts b/src/pab/cloisons.ts
index 1c4a2c735c7202cb412a0da99e44f7a3189d92ed..20f26e37711b106ecd540d67cac3421f727e44cd 100644
--- a/src/pab/cloisons.ts
+++ b/src/pab/cloisons.ts
@@ -12,7 +12,7 @@ export class Cloisons extends ParallelStructure {
 
     constructor(prms: CloisonsParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.Cloisons;
+        this.setCalculatorType(CalculatorType.Cloisons);
         this._intlType = "Cloison";
     }
 
diff --git a/src/pab/pab.ts b/src/pab/pab.ts
index 1698e9d1b2e68f0c2e34f4bebcf799ccbfce4746..5ef89546c0e31e74c9d492c4e80b32b92903b4da 100644
--- a/src/pab/pab.ts
+++ b/src/pab/pab.ts
@@ -55,7 +55,7 @@ export class Pab extends FishPass {
     constructor(prms: PabParams, downWall: CloisonAval, dbg: boolean = false) {
         super(prms, dbg);
         this.downWall = downWall;
-        this._calcType = CalculatorType.Pab;
+        this.setCalculatorType(CalculatorType.Pab);
     }
 
     public get downWall() {
diff --git a/src/pab/pab_chute.ts b/src/pab/pab_chute.ts
index a494221ca33ee31dcd69655de7242d622fe4ca7c..952b8221ec0df8d917fa9a93e10517c02aaf1d9d 100644
--- a/src/pab/pab_chute.ts
+++ b/src/pab/pab_chute.ts
@@ -8,7 +8,7 @@ import { PabChuteParams } from "./pab_chute_params";
 export class PabChute extends Nub {
     constructor(prms: PabChuteParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.PabChute;
+        this.setCalculatorType(CalculatorType.PabChute);
         this._defaultCalculatedParam = prms.DH;
         this.resetDefaultCalculatedParam();
     }
diff --git a/src/pab/pab_dimension.ts b/src/pab/pab_dimension.ts
index 0cbc8af6f3902ca2bceb3894a12a7efb04115e8b..5d94a1c1176883e44f393d44724515235cbb07a1 100644
--- a/src/pab/pab_dimension.ts
+++ b/src/pab/pab_dimension.ts
@@ -7,7 +7,7 @@ import { PabDimensionParams } from "./pab_dimensions_params";
 export class PabDimension extends Nub {
     constructor(prms: PabDimensionParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.PabDimensions;
+        this.setCalculatorType(CalculatorType.PabDimensions);
     }
 
     /**
diff --git a/src/pab/pab_nombre.ts b/src/pab/pab_nombre.ts
index 0d79c90801cf940f33bc3658d33cc07b3b8b98e9..ff1a2f3c7791e7b45de7575d3c142a15476e25f2 100644
--- a/src/pab/pab_nombre.ts
+++ b/src/pab/pab_nombre.ts
@@ -9,7 +9,7 @@ import { PabNombreParams } from "./pab_nombre_params";
 export class PabNombre extends Nub {
     constructor(prms: PabNombreParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.PabNombre;
+        this.setCalculatorType(CalculatorType.PabNombre);
         this._defaultCalculatedParam = prms.N;
         this.resetDefaultCalculatedParam();
     }
diff --git a/src/pab/pab_puissance.ts b/src/pab/pab_puissance.ts
index a7e98e3a623354c34fe54007297893bd974d2c0f..17b11dcf8e2722a1bddc90ede1cad47935e9ab70 100644
--- a/src/pab/pab_puissance.ts
+++ b/src/pab/pab_puissance.ts
@@ -7,7 +7,7 @@ import { PabPuissanceParams } from "./pab_puissance_params";
 export class PabPuissance extends Nub {
     constructor(prms: PabPuissanceParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.PabPuissance;
+        this.setCalculatorType(CalculatorType.PabPuissance);
     }
 
     /**
diff --git a/src/par/par.ts b/src/par/par.ts
index 85ab0450cb437f66b9fc26fa85e1d015b41510cf..b89e4380bf984aae6d8a1aff3770e203bde24b02 100644
--- a/src/par/par.ts
+++ b/src/par/par.ts
@@ -27,7 +27,7 @@ export class Par extends FishPass implements Observer {
 
     constructor(prms: ParParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.Par;
+        this.setCalculatorType(CalculatorType.Par);
         this._defaultCalculatedParam = prms.Q;
         this.resetDefaultCalculatedParam();
         this._props.addObserver(this);
diff --git a/src/par/par_simulation.ts b/src/par/par_simulation.ts
index 75c26fbdbff96199d1db2a29b872df5680f3c774..ce67c64a08ce56db67114b1d2a5c32e8d85ec6ec 100644
--- a/src/par/par_simulation.ts
+++ b/src/par/par_simulation.ts
@@ -19,7 +19,7 @@ export class ParSimulation extends Par implements Observer {
 
     constructor(prms: ParSimulationParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.ParSimulation;
+        this.setCalculatorType(CalculatorType.ParSimulation);
         this.prms.ha.visible = false; // show ZD1 instead
     }
 
diff --git a/src/pipe_flow/cond_distri.ts b/src/pipe_flow/cond_distri.ts
index 3ca4d58d4ea7800bc7047ad246cd29c9f30ded0d..103b959a6f30b93baae833544fca274899015329 100644
--- a/src/pipe_flow/cond_distri.ts
+++ b/src/pipe_flow/cond_distri.ts
@@ -11,7 +11,7 @@ export class ConduiteDistrib extends Nub {
 
     constructor(prms: ConduiteDistribParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.ConduiteDistributrice;
+        this.setCalculatorType(CalculatorType.ConduiteDistributrice);
     }
 
     /**
diff --git a/src/pipe_flow/lechaptcalmon.ts b/src/pipe_flow/lechaptcalmon.ts
index 675f9f0618ebbfac9c28c80ac4d7b48bfd6f5ad9..b430f33356032193baaf9ced75dda5060ded599e 100644
--- a/src/pipe_flow/lechaptcalmon.ts
+++ b/src/pipe_flow/lechaptcalmon.ts
@@ -71,7 +71,7 @@ export class LechaptCalmon extends Nub implements Observer {
 
     constructor(prms: LechaptCalmonParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.LechaptCalmon;
+        this.setCalculatorType(CalculatorType.LechaptCalmon);
         this._props.addObserver(this);
         this.material = LCMaterial.PVCPolyethylene;
     }
diff --git a/src/prebarrage/pb_bassin.ts b/src/prebarrage/pb_bassin.ts
index ba68be6a9e13a1be701064d61fd2ad237dc5c948..cac1c3cbe264ae4f28b8eebde9dbb58be0b7f28f 100644
--- a/src/prebarrage/pb_bassin.ts
+++ b/src/prebarrage/pb_bassin.ts
@@ -30,7 +30,7 @@ export class PbBassin extends Nub {
 
     constructor(prms: PbBassinParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.PbBassin;
+        this.setCalculatorType(CalculatorType.PbBassin);
         this.cloisonsAmont = [];
         this.cloisonsAval = [];
         this._intlType = "Bassin";
diff --git a/src/prebarrage/pb_cloison.ts b/src/prebarrage/pb_cloison.ts
index a8044fac4fe218a3b0d61799e4fdb5bee7e29bea..c4f19d285c570cef70136cb5ea53434bbb882452 100644
--- a/src/prebarrage/pb_cloison.ts
+++ b/src/prebarrage/pb_cloison.ts
@@ -20,7 +20,7 @@ export class PbCloison extends ParallelStructure {
         this.prms.Z2.visible = false;
         this.properties.setPropValue("upstreamBasin", bassinAmont === undefined ? "" : bassinAmont.uid);
         this.properties.setPropValue("downstreamBasin", bassinAval === undefined ? "" : bassinAval.uid);
-        this._calcType = CalculatorType.PbCloison;
+        this.setCalculatorType(CalculatorType.PbCloison);
         this._intlType = "Cloison";
     }
 
diff --git a/src/prebarrage/pre_barrage.ts b/src/prebarrage/pre_barrage.ts
index 30bf43f856c9cbe06e6460b2ac0eae33d3e36bba..daeb94a50d3bb4a37af3599d969cd59c2af04d55 100644
--- a/src/prebarrage/pre_barrage.ts
+++ b/src/prebarrage/pre_barrage.ts
@@ -28,7 +28,7 @@ export class PreBarrage extends Nub {
 
     constructor(prms: PreBarrageParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.PreBarrage;
+        this.setCalculatorType(CalculatorType.PreBarrage);
         this.cloisonsAmont = [];
         this._bassins = [];
         this.maxIterations = SessionSettings.maxIterations;
diff --git a/src/solveur/solveur.ts b/src/solveur/solveur.ts
index 8fd138a899b8f5f151163cb102182958a0f4f838..68bdd598371952db8d6938f48691385ac5a2358d 100644
--- a/src/solveur/solveur.ts
+++ b/src/solveur/solveur.ts
@@ -38,7 +38,7 @@ export class Solveur extends Nub implements Observer {
 
     constructor(prms: SolveurParams, dbg: boolean = false)  {
         super(prms, dbg);
-        this._calcType = CalculatorType.Solveur;
+        this.setCalculatorType(CalculatorType.Solveur);
         this._props.addObserver(this);
         this.prms.addObserver(this);
         // UID of Session Nub to calculate, the result of the which must be this.prms.Ytarget.singleValue
diff --git a/src/structure/dever.ts b/src/structure/dever.ts
index 44efef9c86957cc1ae48d18aca6480b52718b040..3ec2c332d4ed104d3d8d530545d81593f7926ff7 100644
--- a/src/structure/dever.ts
+++ b/src/structure/dever.ts
@@ -14,7 +14,7 @@ export class Dever extends ParallelStructure {
 
     constructor(prms: DeverParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.Dever;
+        this.setCalculatorType(CalculatorType.Dever);
     }
 
     /**
diff --git a/src/structure/parallel_structure.ts b/src/structure/parallel_structure.ts
index 057e012d661b00079e5e3610f41022f76676a1df..1ab776cf6d5d87fb5f1dcc0d06bd5924b137ad51 100644
--- a/src/structure/parallel_structure.ts
+++ b/src/structure/parallel_structure.ts
@@ -18,7 +18,7 @@ export class ParallelStructure extends Nub {
 
     constructor(prms: ParamsEquation, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.ParallelStructure;
+        this.setCalculatorType(CalculatorType.ParallelStructure);
     }
 
     /** children casting */
diff --git a/src/structure/structure.ts b/src/structure/structure.ts
index d8d4dadc24419cdf4d63b6f8d0299f9aef9559ca..6425e6ae08c3fde51e2e2934a17e6ce00711b33e 100644
--- a/src/structure/structure.ts
+++ b/src/structure/structure.ts
@@ -86,7 +86,7 @@ export abstract class Structure extends ChildNub {
 
     constructor(prms: StructureParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.Structure;
+        this.setCalculatorType(CalculatorType.Structure);
         this._isZDVcalculable = true;
         // Q is always the only calculated variable; setting another parameter
         // of a Structure to CALC mode makes it the calculated variable of the
@@ -98,7 +98,6 @@ export abstract class Structure extends ChildNub {
     /** Returns Props object (observable set of key-values) associated to this Nub */
     public get properties(): Props {
         // completes props with calcType, structureType and loiDebit if not already set
-        this._props.setPropValue("calcType", this.calcType);
         if (this._props.getPropValue("loiDebit") === undefined) {
             this._props.setPropValue("loiDebit", this._loiDebit);
         }
@@ -108,6 +107,13 @@ export abstract class Structure extends ChildNub {
         return this._props;
     }
 
+    // overriden to set property once and for all (it's a constant)
+    protected setCalculatorType(ct: CalculatorType): void {
+        super.setCalculatorType(ct);
+        // completes props with calcType
+        this._props.setPropValue("calcType", this.calcType);
+    }
+
     // setter is not inherited from Nub if getter is redefined :/
     public set properties(props: Props) {
         super.setProperties(props);
diff --git a/src/verification/espece.ts b/src/verification/espece.ts
index 14efc95a58f85ec6550277083958c5e5bd7f189f..41112f790a19026467981bd7aec72b71f5e91741 100644
--- a/src/verification/espece.ts
+++ b/src/verification/espece.ts
@@ -45,7 +45,7 @@ export class Espece extends Nub implements Observer {
 
     constructor(prms: EspeceParams, dbg: boolean = false) {
         super(prms, dbg);
-        this._calcType = CalculatorType.Espece;
+        this.setCalculatorType(CalculatorType.Espece);
         this._props.addObserver(this);
         // Diving jets in PAB are not supported by default
         this.divingJetSupported = DivingJetSupport.NOT_SUPPORTED;
diff --git a/src/verification/verificateur.ts b/src/verification/verificateur.ts
index 88bb47c14e1e1d92fcb9e816ba75aaec56f23ecd..4ceb194cbc91616c18ac6055e224c87b69ac0506 100644
--- a/src/verification/verificateur.ts
+++ b/src/verification/verificateur.ts
@@ -23,7 +23,7 @@ export class Verificateur extends Nub {
 
     constructor(dbg: boolean = false)  {
         super(new VerificateurParams(), dbg);
-        this._calcType = CalculatorType.Verificateur;
+        this.setCalculatorType(CalculatorType.Verificateur);
         // UID of Session Nub to verify
         this.nubToVerify = undefined;
         // List of fish species to check the pass against