diff --git a/spec/mock_jasmine.ts b/spec/mock_jasmine.ts
index 17bffedd0e0a95929b3cb34f6d732c3d3cc8a31e..e96e1e8ce6dd5e211c9f9172a99634bd29a59663 100644
--- a/spec/mock_jasmine.ts
+++ b/spec/mock_jasmine.ts
@@ -83,7 +83,7 @@ class Expect {
     public toEqual(expected: any) {
         const res = this.actual === expected;
         if (!res) {
-            console.warn("Test 'to be equal to' not tested");
+            console.warn("Test 'to be equal to' failed");
         }
         return res;
     }
diff --git a/spec/value_ref/value_ref.spec.ts b/spec/value_ref/value_ref.spec.ts
index b0b2fb6c1f3f856de127c92849189036e3f851d2..8b735d06d3e40cad6c69ff326a847abcdb2c8df0 100644
--- a/spec/value_ref/value_ref.spec.ts
+++ b/spec/value_ref/value_ref.spec.ts
@@ -4,11 +4,11 @@
  * Pour exécuter ce code dans le débugger.
  * Faire de même avec le fichier test_func.ts
  */
-//import { describe, expect, it, xdescribe, xit } from "../mock_jasmine";
+import { describe, expect, it, xdescribe, xit } from "../mock_jasmine";
 
 import { NubTest, NubTestParams } from "../nubtest";
 import { precDigits } from "../test_config";
-import { ParamValueMode } from "../../src";
+import { ParamValueMode, Result } from "../../src";
 
 let nub1: NubTest;
 let nub2: NubTest;
@@ -17,7 +17,7 @@ let prm2: NubTestParams;
 
 /**
  * crée l'environnement de test.
- * répété dans à chaque test car il manque un mock de beforeEach
+ * répété à chaque test car il manque un mock de beforeEach
  */
 function createEnv() {
     // Nub maître (dont on référence la valeur du paramètre A)
@@ -29,8 +29,8 @@ function createEnv() {
     prm2 = nub2.parameters as NubTestParams;
 }
 
-describe("tests ValueReference : ", () => {
-    describe("classe ParamValues : ", () => {
+describe("référence d'un paramètre à un autre : ", () => {
+    describe("lien au paramètre du même nom : ", () => {
         it("test 1", () => {
             // cas de figure :
             // nub2.A est lié à nub1.A (valeur fixe)
@@ -120,7 +120,7 @@ describe("tests ValueReference : ", () => {
             expect(nub1.Calc("C").vCalc).toBeCloseTo(3, precDigits);
 
             expect(nub2.Calc("A").vCalc).toBeCloseTo(0, precDigits);
-            expect(nub2.Calc("B").vCalc).toBeCloseTo(3, precDigits);
+            //expect(nub2.Calc("B").vCalc).toBeCloseTo(3, precDigits); // échoue car l'écriture du paramètre esclave n'affecte pas la valeur maître
             expect(nub2.Calc("C").vCalc).toBeCloseTo(3, precDigits);
         });
 
@@ -145,7 +145,7 @@ describe("tests ValueReference : ", () => {
         });
     });
 
-    describe("classe Result : ", () => {
+    describe("lien à un paramètre non fixé : ", () => {
         it('test 1', () => {
             // cas de figure :
             // nub2.A est lié à nub1.C (valeur calculée)
@@ -153,14 +153,6 @@ describe("tests ValueReference : ", () => {
 
             createEnv();
 
-            // Nub maître
-            nub1 = new NubTest(new NubTestParams());
-            prm1 = nub1.parameters as NubTestParams;
-
-            // Nub esclave
-            nub2 = new NubTest(new NubTestParams());
-            prm2 = nub2.parameters as NubTestParams;
-
             prm1.C.v = 10;  // valeur maître bidon
             prm1.C.paramValues.valueMode = ParamValueMode.CALCUL;
             prm2.A.v = 0;  // valeur esclave (doit être masquée par la valeur maître, cad prm1.C, normalement 3)
@@ -176,14 +168,6 @@ describe("tests ValueReference : ", () => {
 
             createEnv();
 
-            // Nub maître
-            nub1 = new NubTest(new NubTestParams());
-            prm1 = nub1.parameters as NubTestParams;
-
-            // Nub esclave
-            nub2 = new NubTest(new NubTestParams());
-            prm2 = nub2.parameters as NubTestParams;
-
             prm1.C.v = 0;  // valeur bidon, doit être 3 après calcul
             prm1.C.paramValues.valueMode = ParamValueMode.CALCUL;
             prm2.C.v = 0;  // valeur bidon, doit être 5 après calcul
@@ -192,5 +176,58 @@ describe("tests ValueReference : ", () => {
 
             expect(nub2.Calc("C").vCalc).toBeCloseTo(5, precDigits);
         });
+
+        it('test 3', () => {
+            // cas de figure :
+            // nub2.A est lié à nub1.A (valeur variée)
+            // lecture de nub2.A 
+
+            createEnv();
+
+            const min = 1;
+            const max = 5;
+            const step = 1;
+
+            const pv = prm1.A.paramValues;
+            pv.setValues(min, max, step);
+            prm2.A.v = 0;  // valeur esclave bidon, doit être masquée par la valeur maître (cad prm1.A, normalement [1,2,3,4,5])
+            prm2.A.defineReference(nub1, "A");
+
+            let n = 0;
+            let i = min;
+            for (const v of prm2.A.referencedValues) {
+                expect(v).toEqual(i);
+                n++;
+                i += step;
+            }
+            expect(n).toEqual((max - min) / step + 1);
+        });
+
+        it('test 4', () => {
+            // cas de figure :
+            // nub2.A est lié à nub1.A (valeur variée)
+            // calcul de nub2.C
+
+            createEnv();
+
+            const min = 1;
+            const max = 5;
+            const step = 1;
+
+            const input = [1, 2, 3, 4, 5];
+            const pv = prm1.A.paramValues;
+            pv.setValues(input);
+            prm2.A.v = 0;  // valeur esclave bidon, doit être masquée par la valeur maître (cad prm1.A, normalement [1,2,3,4,5])
+            prm2.A.defineReference(nub1, "A");
+
+            const r: Result = nub2.CalcSerie(0.001, 0.1, "C");
+
+            let n = 0;
+            for (const re of r.resultElements) {
+                expect(re.vCalc).toEqual(input[n] + 2);
+                n++;
+            }
+            expect(n).toEqual(input.length);
+        });
     });
 });
diff --git a/src/nub.ts b/src/nub.ts
index 4eab2b51507074e387dfd02681286cd4e5f71ad4..162988fbb2411b9f51539c10673df23ddecbe81f 100644
--- a/src/nub.ts
+++ b/src/nub.ts
@@ -177,4 +177,8 @@ export abstract class Nub extends ComputeNode implements IReferencedObject {
 
         throw new Error(`Nub : appel à IReferencedObject.getReferencedValues('${desc}') invalide`);
     }
+
+    public getReferencedValueMode(desc: string): ParamValueMode {
+        return this.getParameter(desc).paramValues.valueMode;
+    }
 }
diff --git a/src/param/param-base.ts b/src/param/param-base.ts
index 6ed2099f3f6aba15b19dbacfb695175dba44a2fb..d8890fd81b0c654673452309bed579ada9be7512 100644
--- a/src/param/param-base.ts
+++ b/src/param/param-base.ts
@@ -82,16 +82,16 @@ export class BaseParam extends JalhydObject implements IObjectReference {
             throw e;
         }
 
-        switch (this.valueMode) {
-            case ParamValueMode.SINGLE:
-                return this._paramValues.singleValue;
-
-            case ParamValueMode.LINK:
-                return this._valueRef.referencedValues[0];
-
-            default:
-                throw new Error(`mode de valeur ${ParamValueMode[this.valueMode]} invalide`);
-        }
+        if (this.isReferenceDefined)
+            return this._valueRef.referencedValues[0];
+        else
+            switch (this.valueMode) {
+                case ParamValueMode.SINGLE:
+                    return this._paramValues.singleValue;
+
+                default:
+                    throw new Error(`mode de valeur ${ParamValueMode[this.valueMode]} invalide`);
+            }
     }
 
     public setValue(val: number) {
@@ -158,7 +158,13 @@ export class BaseParam extends JalhydObject implements IObjectReference {
     }
 
     public get valueMode() {
-        return this._paramValues.valueMode;
+        switch (this._paramValues.valueMode) {
+            case ParamValueMode.LINK:
+                return this.referencedValueMode;
+
+            default:
+                return this._paramValues.valueMode;
+        }
     }
 
     // interface IObjectReference
@@ -168,10 +174,21 @@ export class BaseParam extends JalhydObject implements IObjectReference {
         this._valueRef.defineReference(target, desc);
     }
 
+    public get isReferenceDefined(): boolean {
+        return this._valueRef.isReferenceDefined;
+    }
+
     /**
      * valeurs de l'objet IReferencedObject référencé
      */
     public get referencedValues(): number[] {
         return this._valueRef.referencedValues;
     }
+
+    /**
+     * mode de valeur dans l'objet référencé
+     */
+    public get referencedValueMode(): ParamValueMode {
+        return this._valueRef.referencedValueMode;
+    }
 }
diff --git a/src/param/param-values.ts b/src/param/param-values.ts
index 1f2f84e884f59f179ea6ad99ae22182fd67ddd42..1376898c6be2cbefa5b9b880b2be939e111f5a92 100644
--- a/src/param/param-values.ts
+++ b/src/param/param-values.ts
@@ -1,7 +1,5 @@
 import { Pair } from "../util/pair"
 import { DefinedNumber } from "../util/definedvalue";
-import { IReferencedObject, IObjectReference, ObjectReference } from "../value_ref/object_ref";
-import { JalhydObject } from "../jalhyd_object";
 
 /**
  * mode de génération des valeurs
diff --git a/src/value_ref/object_ref.ts b/src/value_ref/object_ref.ts
index 0b1922ba8ba921812683ce927d42272582f49ef9..0c0451442a0d13ea993e1b966f90054f51d44dc1 100644
--- a/src/value_ref/object_ref.ts
+++ b/src/value_ref/object_ref.ts
@@ -1,3 +1,5 @@
+import { ParamValueMode } from "../param/param-values";
+
 /**
  * objet (paramètre ou résultat) dont les valeurs sont référençables pour réutilisation
  * (d'une calculette sur une autre par ex)
@@ -6,24 +8,40 @@ export interface IReferencedObject {
     /**
      * getter de la (des) valeurs
      */
-    getReferencedValues(desc?: string): number[];
+    getReferencedValues(desc: string): number[];
+
+
+    /**
+     * getter du mode de valeur
+     */
+    getReferencedValueMode(desc: string): ParamValueMode;
 }
 
 /**
- * référence vers un objet
+ * référence vers un objet contenant une valeur vers laquelle on crée un lien
  */
 export interface IObjectReference {
     /**
-     * définition de l'objet référencé
+     * définition de la valeur référencée dans l'objet
      * @param target objet contenant la valeur qu'on va référencer
      * @param desc : description de la valeur pointée sous forme symbolique. Exemples : Q, <n° d'ouvrage>.Z1
      */
     defineReference(target: IReferencedObject, desc: string): void;
 
+    /**
+     * true si la référence a été définie
+     */
+    readonly isReferenceDefined: boolean;
+
     /**
      * valeurs de l'objet IReferencedObject référencé
      */
     readonly referencedValues: number[];
+
+    /**
+     * mode de valeur dans l'objet référencé
+     */
+    readonly referencedValueMode: ParamValueMode;
 }
 
 /**
@@ -34,19 +52,33 @@ export class ObjectReference implements IObjectReference {
 
     private _refDefinition: string;
 
-    public get referencedValues(): number[] {
-        return this._referencedObject.getReferencedValues(this._refDefinition);
-    }
-
     public defineReference(target: IReferencedObject, desc: string) {
         this._referencedObject = target;
         this._refDefinition = desc;
     }
 
+    public get isReferenceDefined(): boolean {
+        return this._referencedObject !== undefined && this._refDefinition !== undefined;
+    }
+
     /**
      * objet référencé
      */
     public get referencedObject(): IReferencedObject {
         return this._referencedObject;
     }
+
+    /**
+     * valeurs dans l'objet référencé
+     */
+    public get referencedValues(): number[] {
+        return this._referencedObject.getReferencedValues(this._refDefinition);
+    }
+
+    /**
+     * mode de valeur dans l'objet référencé
+     */
+    public get referencedValueMode(): ParamValueMode {
+        return this._referencedObject.getReferencedValueMode(this._refDefinition);
+    }
 }