diff --git a/src/app/formulaire/check-field.ts b/src/app/formulaire/check-field.ts
index cce27669e7ce6e3748b617894596048b8c79d90a..95f1afcdb45ee0a00720fe2e42c60ac6a5339a28 100644
--- a/src/app/formulaire/check-field.ts
+++ b/src/app/formulaire/check-field.ts
@@ -20,10 +20,6 @@ export class CheckField extends Field {
         this._value = val;
     }
 
-    protected verifyDependency(d: Dependency): boolean {
-        throw "CheckField.verifyDependency() : type de condition '" + DependencyConditionType[d.masterCondition.type] + "' non pris en charge";
-    }
-
     public get isValid(): boolean {
         return true;
     }
diff --git a/src/app/formulaire/dependency/dependency.ts b/src/app/formulaire/dependency/dependency.ts
index c3db2e55d7fd6485abb7aede6b49cefbf7df788b..8df53daef654a98e53318bc3b6040775dad56ebc 100644
--- a/src/app/formulaire/dependency/dependency.ts
+++ b/src/app/formulaire/dependency/dependency.ts
@@ -7,24 +7,44 @@ import { DependencyCondition } from "./dependency-condition";
  * cad que son affichage, sa valeur, ... sont modifiés
  */
 export abstract class Dependency {
-    private _master: FormulaireElement;
+    private _slave: FormulaireElement;
+
+    private _masterId: string;
 
     private _masterCondition: DependencyCondition;
 
-    constructor(m: FormulaireElement, mc: DependencyCondition) {
-        this._master = m;
+    constructor(s: FormulaireElement, mid: string, mc: DependencyCondition) {
+        this._slave = s;
+        this._masterId = mid;
         this._masterCondition = mc;
     }
 
-    public get masterElement(): FormulaireElement {
-        return this._master;
+    private getMasterElement(id: string): FormulaireElement {
+        let parentNode = this._slave.parent;
+        while (parentNode != undefined) {
+            var res: FormulaireElement = parentNode.getFormulaireNodeById(id) as FormulaireElement;
+            if (res != undefined)
+                return res;
+            parentNode = parentNode.parent;
+        }
+        return undefined;
+    }
+
+    protected get masterElement(): FormulaireElement {
+        return this.getMasterElement(this._masterId);
     }
 
     public get masterCondition(): DependencyCondition {
         return this._masterCondition;
     }
 
+    public apply() {
+        const master: FormulaireElement = this.masterElement;
+        if (master && master.verifiesDependency(this))
+            this._slave.applyDependency(this);
+    }
+
     public toString(): string {
-        return "master=" + this._master.toString() + "\n  " + this._masterCondition.toString();
+        return "slave=" + this._slave.toString() + "\n  mid=" + this._masterId + "\n  " + this._masterCondition.toString();
     }
 }
diff --git a/src/app/formulaire/dependency/value-dependency.ts b/src/app/formulaire/dependency/value-dependency.ts
index 7b95b83d67e9a09ff1217f8879fd3c2f7a50bc64..4f06d7d33c5fb26fa75ef35e8d32ef820c68778e 100644
--- a/src/app/formulaire/dependency/value-dependency.ts
+++ b/src/app/formulaire/dependency/value-dependency.ts
@@ -8,8 +8,8 @@ import { ValueDependencyCondition } from "./value-dependency-condition";
 export class ValueDependency extends Dependency {
     public slaveValue: any;
 
-    constructor(m: FormulaireElement, masterValue: any) {
-        super(m, new ValueDependencyCondition(masterValue));
+    constructor(slave: FormulaireElement, masterId: string, masterValue: any) {
+        super(slave, masterId, new ValueDependencyCondition(masterValue));
     }
 
     public toString() {
diff --git a/src/app/formulaire/field.ts b/src/app/formulaire/field.ts
index 44524d3f3eaad58a0f55c530d6a5d905c7859d01..99b2599df44c6225f10ee6d5de87f84fd4bf057e 100644
--- a/src/app/formulaire/field.ts
+++ b/src/app/formulaire/field.ts
@@ -1,6 +1,7 @@
-import { FormulaireNode } from "./formulaire-node";
 import { FormulaireElement } from "./formulaire-element";
 import { ValueDependency } from "./dependency/value-dependency";
+import { Dependency } from "./dependency/dependency";
+import { isNumber } from "util";
 
 export abstract class Field extends FormulaireElement {
     public abstract get isValid();
@@ -11,15 +12,10 @@ export abstract class Field extends FormulaireElement {
     private parse_value_dependencies(json: {}) {
         for (let di in json) {
             let d = json[di];
-            let masterField: FormulaireElement = this.parent.getFormulaireNodeById(d["refid"]) as FormulaireElement;
-            if (masterField != undefined) {
-                let masterValue = d["refvalue"];
-                let dep = new ValueDependency(masterField, masterValue);
-                dep.slaveValue = d["value"];
-                this._dependencies.push(dep);
-            }
-            else
-                throw new Error(`la dépendance de valeur de '${this.id}' fait référence à un élément inconnu '${d["refid"]}'`);
+            let masterValue = d["refvalue"];
+            let dep = new ValueDependency(this, d["refid"], masterValue);
+            dep.slaveValue = d["value"];
+            this._dependencies.push(dep);
         }
     }
 
@@ -30,4 +26,18 @@ export abstract class Field extends FormulaireElement {
         if (dep != undefined)
             this.parse_value_dependencies(dep);
     }
+
+    /**
+     * applique une dépendance dont la condition a été vérifiée
+     */
+    public applyDependency(d: Dependency) {
+        if (d instanceof ValueDependency) {
+            if (isNumber(d.slaveValue))
+                this.setValue(this, +d.slaveValue);
+            else
+                this.setValue(this, d.slaveValue);
+        }
+        else
+            super.applyDependency(d);
+    }
 }
diff --git a/src/app/formulaire/fieldset-container.ts b/src/app/formulaire/fieldset-container.ts
index aa73266ee3547ccdb04b6bfa50c3e928b3f3717e..4287dcb0295c15a79e2588ae87ab02bb7eb8e8f5 100644
--- a/src/app/formulaire/fieldset-container.ts
+++ b/src/app/formulaire/fieldset-container.ts
@@ -65,10 +65,6 @@ export class FieldsetContainer extends FormulaireElement {
                     this.addTemplate(d);
     }
 
-    protected verifyDependency(d: Dependency): boolean {
-        return true;
-    }
-
     public updateLocalisation(loc?: StringMap) {
         if (loc == undefined)
             loc = this._localisation;
diff --git a/src/app/formulaire/fieldset.ts b/src/app/formulaire/fieldset.ts
index 5edca538bc0f6f4773702f5847f56d233bf07376..60885ad864db1fbc8c4a3c68d1951f4b39e0d4bd 100644
--- a/src/app/formulaire/fieldset.ts
+++ b/src/app/formulaire/fieldset.ts
@@ -75,10 +75,6 @@ export class FieldSet extends FormulaireElement implements Observer {
         return undefined;
     }
 
-    protected verifyDependency(d: Dependency): boolean {
-        throw "FieldSet.verifyDependency() : type de condition '" + DependencyConditionType[d.masterCondition.type] + "' non pris en charge";
-    }
-
     public get isValid(): boolean {
         let res: boolean = true;
         for (const f of this.kids) {
diff --git a/src/app/formulaire/formulaire-element.ts b/src/app/formulaire/formulaire-element.ts
index 4f227999f1ebc9b2950a16fc9a774d1b20fd5f21..00bdce133d895b354b086c7855e522ae278452d4 100644
--- a/src/app/formulaire/formulaire-element.ts
+++ b/src/app/formulaire/formulaire-element.ts
@@ -47,10 +47,6 @@ export abstract class FormulaireElement extends FormulaireNode {
         return super.kids as FormulaireElement[];
     }
 
-    private isNumber(s: string): boolean {
-        return Number(s) != NaN;
-    }
-
     /**
      * analyse les dépendances d'existence
      * @param json configuration de la dépendance
@@ -58,35 +54,30 @@ export abstract class FormulaireElement extends FormulaireNode {
     private parse_existence_dependencies(json: {}) {
         for (let di in json) {
             let d = json[di];
-            let masterField: FormulaireElement = parentNode.getFormulaireNodeById(d["refid"]) as FormulaireElement;
-            if (masterField != undefined) {
-                let rv = d["refvalue"];
-                if (rv != undefined)
-                    var mc: DependencyCondition = new ValueDependencyCondition(rv);
-                else {
-                    let cond = d["cond"];
-                    if (cond != undefined) {
-                        switch (cond) {
-                            case "isvar":
-                                var mc = new DependencyCondition(DependencyConditionType.IsVariable);
-                                break;
-
-                            case "isdisp":
-                                var mc = new DependencyCondition(DependencyConditionType.IsDisplayed);
-                                break;
-
-                            default:
-                                throw "Formulaire.parse_existence_dependencies() : type de condition '" + cond + "' non pris en charge";
-                        }
+            let rv = d["refvalue"];
+            if (rv != undefined)
+                var mc: DependencyCondition = new ValueDependencyCondition(rv);
+            else {
+                let cond = d["cond"];
+                if (cond != undefined) {
+                    switch (cond) {
+                        case "isvar":
+                            var mc = new DependencyCondition(DependencyConditionType.IsVariable);
+                            break;
+
+                        case "isdisp":
+                            var mc = new DependencyCondition(DependencyConditionType.IsDisplayed);
+                            break;
+
+                        default:
+                            throw "Formulaire.parse_existence_dependencies() : type de condition '" + cond + "' non pris en charge";
                     }
-                    else
-                        throw "Formulaire.parse_existence_dependencies() : infos de dépendance manquantes/non prises en charge";
                 }
-                let dep = new ExistenceDependency(masterField, mc);
-                this._dependencies.push(dep);
+                else
+                    throw "Formulaire.parse_existence_dependencies() : infos de dépendance manquantes/non prises en charge";
             }
-            else
-                console.log(`WARNING : la dépendance d'existence de '${this.id}' fait référence à un élément inconnu '${d["refid"]}'`);
+            let dep = new ExistenceDependency(this, d["refid"], mc);
+            this._dependencies.push(dep);
         }
     }
 
@@ -101,23 +92,17 @@ export abstract class FormulaireElement extends FormulaireNode {
             this.parse_existence_dependencies(dep);
     }
 
-    protected abstract verifyDependency(d: Dependency): boolean;
-
     public verifiesDependency(d: Dependency): boolean {
         if (d.masterCondition.type == DependencyConditionType.IsDisplayed)
             return this._isDisplayed;
-
-        return this.verifyDependency(d);
     }
 
-    private getDependencyFromMasterValue(v: any): Dependency {
-        for (let d of this._dependencies)
-            if (d.masterCondition.type == DependencyConditionType.HasValue) {
-                let mv = (<ValueDependencyCondition>d.masterCondition).value;
-                if (mv === v)
-                    return d;
-            }
-        return undefined;
+    /**
+     * applique une dépendance dont la condition a été vérifiée
+     */
+    public applyDependency(d: Dependency) {
+        if (d instanceof ExistenceDependency)
+            this.isDisplayed = true;
     }
 
     private prepareExistenceDependencies() {
@@ -134,28 +119,7 @@ export abstract class FormulaireElement extends FormulaireNode {
         this.prepareExistenceDependencies();
 
         for (let d of this._dependencies) {
-            let master: FormulaireElement = d.masterElement;
-            if (d instanceof ExistenceDependency && !this._isDisplayed) {
-                let slave: FormulaireElement = this;
-                slave.isDisplayed = slave._isDisplayed || (master.isDisplayed && master.verifiesDependency(d)); // le problème c'est que master.isDisplayed n'est pas forcément correct à ce moment précis...
-            }
-            else if (d instanceof ValueDependency) {
-                let vd = <ValueDependency>d;
-                /*
-                let master: HTMLElement = this.getHtmlElementFromId(d.masterElement.id);
-                if (this.getHtmlElementValue(master) == vd.masterValue) {
-                    let slave: HTMLElement = this.getHtmlElementFromId(d.slaveElement.id);
-                    this.setHtmlElementValue(slave, vd.slaveValue);
-                }
-                */
-                if (master.verifiesDependency(d)) {
-                    let slave = parentForm.getFieldById(this.id);
-                    if (this.isNumber(vd.slaveValue))
-                        slave.setValue(this, +vd.slaveValue);
-                    else
-                        slave.setValue(this, vd.slaveValue);
-                }
-            }
+            d.apply();
         }
 
         for (const k of this.getKids())
diff --git a/src/app/formulaire/ngparam.ts b/src/app/formulaire/ngparam.ts
index c60586b3bba9c6dfd29095b4bbf2d8aaca193a93..671730429dd4413c273548c9832142561144c8f1 100644
--- a/src/app/formulaire/ngparam.ts
+++ b/src/app/formulaire/ngparam.ts
@@ -290,7 +290,10 @@ export class NgParameter extends InputField {
         this.isDefault = false; // malgré le fait qu'il soit initialisé dans la déclaration de la classe NgParam à false, quand on relit sa valeur, il vaut undefined (merci Microsoft)
     }
 
-    protected verifyDependency(d: Dependency): boolean {
+    public verifiesDependency(d: Dependency): boolean {
+        if (super.verifiesDependency(d))
+            return true;
+
         switch (d.masterCondition.type) {
             case DependencyConditionType.HasValue:
                 {
@@ -302,7 +305,7 @@ export class NgParameter extends InputField {
                 return this.radioState == ParamRadioConfig.VAR;
 
             default:
-                throw "NgParameter.verifyDependency() : type de condition '" + DependencyConditionType[d.masterCondition.type] + "' non pris en charge";
+                throw "NgParameter.verifiesDependency() : type de condition '" + DependencyConditionType[d.masterCondition.type] + "' non pris en charge";
         }
     }
 
diff --git a/src/app/formulaire/select-field.ts b/src/app/formulaire/select-field.ts
index e30c00373af1b7ac60c63a8807dbad192737a174..cf136910af11bf5e9b16ca1c6ad3742ca8c4fcfd 100644
--- a/src/app/formulaire/select-field.ts
+++ b/src/app/formulaire/select-field.ts
@@ -60,14 +60,17 @@ export class SelectField extends Field {
         return this._selectedEntry.label;
     }
 
-    protected verifyDependency(d: Dependency): boolean {
+    public verifiesDependency(d: Dependency): boolean {
+        if (super.verifiesDependency(d))
+            return true;
+
         switch (d.masterCondition.type) {
             case DependencyConditionType.HasValue:
                 let mc: ValueDependencyCondition = <ValueDependencyCondition>d.masterCondition;
                 return this._selectedEntry.id === mc.value;
 
             default:
-                throw "SelectField.verifyDependency() : type de condition '" + DependencyConditionType[d.masterCondition.type] + "' non pris en charge";
+                throw "SelectField.verifiesDependency() : type de condition '" + DependencyConditionType[d.masterCondition.type] + "' non pris en charge";
         }
     }
 
diff --git a/src/app/util.ts b/src/app/util.ts
index d312650ee1fe5a79090b880b1dd7f3052a1b53c2..cab3a40aadd680bfae52a7ae5e6fba795a9d2344 100644
--- a/src/app/util.ts
+++ b/src/app/util.ts
@@ -5,3 +5,7 @@ export function logObject(obj: {}, m?: string) {
     else
         console.log(m + " " + JSON.stringify(obj));
 }
+
+export function isNumber(s: string): boolean {
+    return Number(s) != NaN;
+}