diff --git a/src/app/components/field-set/field-set.component.html b/src/app/components/field-set/field-set.component.html
index 361f044f68001f0ecd2ad26d2a211fef5615628b..cd33a4983f88f4856124c8d689120633478c725d 100644
--- a/src/app/components/field-set/field-set.component.html
+++ b/src/app/components/field-set/field-set.component.html
@@ -18,7 +18,7 @@
     <param-field-line *ngIf="isInputField(p)" [param]=p (onRadio)=onRadioClick($event) (onValid)=onParamLineValid()>
     </param-field-line>
 
-    <select-field-line *ngIf="isSelectField(p)" [param]=p (selectChange)=onSelectChanged($event)>
+    <select-field-line *ngIf="isSelectField(p)" [param]=p>
     </select-field-line>
 
     <check-field-line *ngIf="isCheckField(p)" [param]=p></check-field-line>
diff --git a/src/app/components/field-set/field-set.component.ts b/src/app/components/field-set/field-set.component.ts
index 0594d7767c6cc9b5597c292ffd0a7b037b4cf0c5..4626446278cd5d8a8fce6d640dd4da9e8099aeee 100644
--- a/src/app/components/field-set/field-set.component.ts
+++ b/src/app/components/field-set/field-set.component.ts
@@ -136,13 +136,6 @@ export class FieldSetComponent implements DoCheck {
     @Output()
     private onRadio = new EventEmitter<any>();
 
-    /**
-     * réception d'un événement d'un select
-     */
-    private onSelectChanged(val: SelectEntry) {
-        this.selectChange.emit(val); // on transmet au parent
-    }
-
     public get isValid() {
         return this._isValid;
     }
@@ -184,10 +177,4 @@ export class FieldSetComponent implements DoCheck {
     private onParamLineValid(event: boolean) {
         this.updateValidity();
     }
-
-    /**
-     * événément de changement d'état d'un select
-     */
-    @Output()
-    private selectChange = new EventEmitter<SelectEntry>();
 }
diff --git a/src/app/components/fieldset-container/fieldset-container.component.html b/src/app/components/fieldset-container/fieldset-container.component.html
index ad35465953f2001a197494e447a72d15ff6cdfa8..1546960415c226045779381f33adac85c5996c4f 100644
--- a/src/app/components/fieldset-container/fieldset-container.component.html
+++ b/src/app/components/fieldset-container/fieldset-container.component.html
@@ -6,7 +6,6 @@
         <!-- bouton d'ajout d'un ouvrage -->
         <button type="button" class="btn btn-grey waves-light" mdbRippleRadius (click)="addStructure()">Ajouter un ouvrage</button>
     </div>
-    <field-set *ngFor="let fs of fieldsets" [fieldSet]=fs (selectChange)=onSelectChanged($event) (onRadio)=onRadioClick($event)
-        (onValid)=onFieldsetValid()>
+    <field-set *ngFor="let fs of fieldsets" [fieldSet]=fs (onRadio)=onRadioClick($event) (onValid)=onFieldsetValid()>
     </field-set>
 </div>
\ No newline at end of file
diff --git a/src/app/components/fieldset-container/fieldset-container.component.ts b/src/app/components/fieldset-container/fieldset-container.component.ts
index e2da23746b7f5597f247edc93573bccff8d42eb9..26ac2f5f1ca3a1f15857b18c9719ff613ea6a902 100644
--- a/src/app/components/fieldset-container/fieldset-container.component.ts
+++ b/src/app/components/fieldset-container/fieldset-container.component.ts
@@ -13,12 +13,6 @@ export class FieldsetContainerComponent implements DoCheck {
     @Input("container")
     private _container: FieldsetContainer;
 
-    /**
-     * événément de changement d'état d'un select
-     */
-    @Output()
-    private selectChange = new EventEmitter<SelectEntry>();
-
     /**
      * liste des composants FieldSet enfants
      */
@@ -44,13 +38,6 @@ export class FieldsetContainerComponent implements DoCheck {
         this._container.addFromTemplate(this._container.templates[0].id);
     }
 
-    /**
-     * réception d'un événement d'un select
-     */
-    private onSelectChanged(val: SelectEntry) {
-        this.selectChange.emit(val); // on transmet au parent
-    }
-
     /*
      * gestion des événements clic sur les radios :
      * réception d'un message du composant enfant (field-set)
diff --git a/src/app/components/generic-calculator/calculator.component.html b/src/app/components/generic-calculator/calculator.component.html
index 5d8e836580d6155bf467a002b35c0fa1c7c9b443..47e2a2e53aeb9f5bd4f5702cc34821eb0a9dee44 100644
--- a/src/app/components/generic-calculator/calculator.component.html
+++ b/src/app/components/generic-calculator/calculator.component.html
@@ -24,10 +24,9 @@
             <!-- chapitres -->
             <ng-template ngFor let-fe [ngForOf]="formElements">
                 <field-set *ngIf="isFieldset(fe)" [style.display]="getFieldsetStyleDisplay(fe.id)" [fieldSet]=fe (onRadio)=onRadioClick($event)
-                    (selectChange)=onSelectChanged($event) (validChange)=OnFieldsetValid()></field-set>
+                    (validChange)=OnFieldsetValid()></field-set>
 
-                <fieldset-container *ngIf="isFieldsetContainer(fe)" [container]=fe (selectChange)=onSelectChanged($event) (onRadio)=onRadioClick($event)
-                    (validChange)=onFieldsetContainerValid()></fieldset-container>
+                <fieldset-container *ngIf="isFieldsetContainer(fe)" [container]=fe (onRadio)=onRadioClick($event) (validChange)=onFieldsetContainerValid()></fieldset-container>
             </ng-template>
         </div>
 
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index f69d1cb95d015e88ba7b6b19dbd5136633791784..752e911ddd607eb0c8fad2bac94e539cd9103948 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -256,14 +256,6 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit,
         }
     }
 
-    /**
-     * réception d'un événement d'un select
-     */
-    private onSelectChanged(val: SelectEntry) {
-        this._formulaire.resetResults();
-        this._formulaire.applyDependencies();
-    }
-
     /**
      * appelé après le 1er affichage du composant
      */
diff --git a/src/app/components/ngparam-input/ngparam-input.component.ts b/src/app/components/ngparam-input/ngparam-input.component.ts
index 803076aeb35e6435984d15ffcd01bc5e3cb8c762..b7c3bcbf063068580ebed86f06d6b747f7de9c1e 100644
--- a/src/app/components/ngparam-input/ngparam-input.component.ts
+++ b/src/app/components/ngparam-input/ngparam-input.component.ts
@@ -8,7 +8,6 @@ import { NumericalString, Message } from "jalhyd";
 import { InternationalisationService } from "../../services/internationalisation/internationalisation.service";
 import { NgParameter } from "../../formulaire/ngparam";
 import { GenericInputComponent } from "../generic-input/generic-input.component";
-import { Observer, IObservable } from "../../services/observer";
 
 @Component({
     selector: "ngparam-input",
diff --git a/src/app/components/select-field-line/select-field-line.component.html b/src/app/components/select-field-line/select-field-line.component.html
index f1facb0c075f826390f52a083c6ac1da847f0f5d..f3e7ae806429ca653a341a374718f70a5e1295e0 100644
--- a/src/app/components/select-field-line/select-field-line.component.html
+++ b/src/app/components/select-field-line/select-field-line.component.html
@@ -13,4 +13,4 @@
             <a class="dropdown-item" *ngFor="let e of entries" [value]=e>{{entryLabel(e)}}</a>
         </div>
     </div>
-</div>
+</div>
\ No newline at end of file
diff --git a/src/app/formulaire/definition/concrete/form-parallel-structures.ts b/src/app/formulaire/definition/concrete/form-parallel-structures.ts
index ae1d2e96b712a734804e012e7d75992d2f039d16..c195885cd5ea1ca5df68ead0661b5c7638defafb 100644
--- a/src/app/formulaire/definition/concrete/form-parallel-structures.ts
+++ b/src/app/formulaire/definition/concrete/form-parallel-structures.ts
@@ -7,6 +7,9 @@ import { FormDefParamToCalculate } from "../form-def-paramcalc";
 import { FormDefFixedVar } from "../form-def-fixedvar";
 import { FormComputeParallelStructures } from "../form-compute-parallel-structures";
 import { FormResultFixedVar } from "../form-result-fixedvar";
+import { FieldsetContainer } from "../../fieldset-container";
+import { FieldSet } from "../../fieldset";
+import { SelectField } from "../../select-field";
 
 export class FormulaireParallelStructure extends FormulaireDefinition {
     private _formFixedVar: FormDefFixedVar;
@@ -34,6 +37,37 @@ export class FormulaireParallelStructure extends FormulaireDefinition {
     }
 
     protected completeParse() {
+        // récupération des valeurs par défaut pour les affecter au template
+
+        // for (const n of this.allFormElements)
+        //     if (n instanceof FieldsetContainer) {
+        //         var fsc: FieldsetContainer = n;
+        //         break;
+        //     }
+
+        // if (fsc == undefined)
+        //     console.log("warning : pas de valeurs par défaut trouvées pour les ouvrages en parallèle")
+        // else {
+        //     const st = CreateStructure(StructureType.Cem88d);
+        //     for (const i in st.prms.map) {
+        //         const param = st.prms.map[i];
+
+        //         let found = false;
+        //         for (const tmpl of fsc.templates) {
+        //             for (const n of tmpl.allFormElements)
+        //                 if (n.id === param.symbol) {
+        //                     // if (n.id === param.symbol) {
+        //                     const ng = n as NgParameter;
+        //                     ng.setValue(param.v);
+        //                     found = true;
+        //                     break;
+        //                 }
+        //             if (found) break;
+        //         }
+        //     }
+        // }
+
+        this.subscribeFieldsetContainer();
     }
 
     /**
@@ -58,4 +92,37 @@ export class FormulaireParallelStructure extends FormulaireDefinition {
     public get results(): CalculatorResults[] {
         return this._formResult.results;
     }
+
+    /**
+     * abonnement en tant qu'observateur du FieldsetContainer
+     */
+    private subscribeFieldsetContainer() {
+        const n = this.getFormulaireNodeById("struct_container");
+        if (n == undefined || !(n instanceof FieldsetContainer))
+            throw new Error("l'élément 'struct_container' n'est pas du type FieldsetContainer");
+        const fsc: FieldsetContainer = n as FieldsetContainer;
+        fsc.addObserver(this);
+    }
+
+    /**
+     * abonnement en tant qu'observateur du SelectField des FieldSet contenus dans le FieldsetContainer
+     */
+    private subscribeStructureSelectFields(fs: FieldSet) {
+        for (const n of fs.allFormElements)
+            if (n instanceof SelectField)
+                n.addObserver(this);
+    }
+
+    public update(sender: any, data: any) {
+        if (sender instanceof FieldsetContainer)
+            switch (data["action"]) {
+                case "newFieldset":
+                    this.reset();
+                    this.subscribeStructureSelectFields(data["fieldset"]);
+            }
+        else if (sender instanceof SelectField) {
+            // la valeur d'un des select (type d'ouvrage, loi de débit) a changé
+            this.reset();
+        }
+    }
 }
diff --git a/src/app/formulaire/definition/form-compute.ts b/src/app/formulaire/definition/form-compute.ts
index 33b9eb2db9906a740dab37f5801b4bae5d12b63b..ae5ca83e53650e81c378a98eee8528410d685359 100644
--- a/src/app/formulaire/definition/form-compute.ts
+++ b/src/app/formulaire/definition/form-compute.ts
@@ -1,16 +1,9 @@
-import { IObservable, Observable, Observer } from "../../services/observer";
 import { FormResult } from "./form-result";
 import { ParamsEquation, ComputeNode } from "jalhyd";
 import { FormulaireDefinition } from "./form-definition";
 
 export abstract class FormCompute {
-    /**
-     * implémentation par délégation de IObservable
-     */
-    private _observable: Observable;
-
     constructor(protected _formBase: FormulaireDefinition, protected _formResult: FormResult) {
-        this._observable = new Observable;
     }
 
     protected abstract getNubAndParameters(): [ComputeNode, ParamsEquation];
@@ -28,6 +21,6 @@ export abstract class FormCompute {
 
         this._formBase.notifyObservers({
             "action": "resultsUpdated",
-        });
+        }, this._formBase);
     }
-}
\ No newline at end of file
+}
diff --git a/src/app/formulaire/definition/form-def-fixedvar.ts b/src/app/formulaire/definition/form-def-fixedvar.ts
index 0db6220e36c78ac6fab5f999e5ce61dbe4f4124b..75e0c71aaab516b2b2a9fe57754e65eac9cf84a3 100644
--- a/src/app/formulaire/definition/form-def-fixedvar.ts
+++ b/src/app/formulaire/definition/form-def-fixedvar.ts
@@ -81,8 +81,7 @@ export class FormDefFixedVar {
                 newCal.radioState = ParamRadioConfig.CAL;
         }
 
-        this._formBase.resetResults();
-        this._formBase.applyDependencies();
+        this._formBase.reset();
     }
 
     /**
diff --git a/src/app/formulaire/definition/form-def-section.ts b/src/app/formulaire/definition/form-def-section.ts
index 558d4f458a5e61879b5a048ab227ac68cd72a796..556e58edddfe349f10415cd37c1163d2ad93de87 100644
--- a/src/app/formulaire/definition/form-def-section.ts
+++ b/src/app/formulaire/definition/form-def-section.ts
@@ -33,7 +33,11 @@ export class FormDefSection implements Observer {
     }
 
     private updateSectionNodeType() {
-        this._sectionNodeType = this.getNodeTypeFromSelectField();
+        const nt = this.getNodeTypeFromSelectField();
+        if (this._sectionNodeType !== nt) {
+            this._sectionNodeType = nt;
+            this._formBase.reset();
+        }
     }
 
     public getSectionVariatedParameter(): NgParameter {
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index 70e107df113812565bf51d1b17e516ed076116d3..e838c009d49902969e30e23b449e204e89f515f8 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -2,7 +2,6 @@ import { CalculatorType, ComputeNodeType } from "jalhyd";
 import { FormulaireElement } from "../formulaire-element";
 import { NgParameter, ParamRadioConfig } from "../ngparam";
 import { Field } from "../field";
-import { IObservable, Observer, Observable } from "../../services/observer";
 import { StringMap } from "../../stringmap";
 import { FormulaireNode } from "../formulaire-node";
 import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";
@@ -18,12 +17,7 @@ import { CalculatorResults } from "../../results/calculator-results";
 /**
  * classe de base pour tous les formulaires
  */
-export abstract class FormulaireDefinition extends FormulaireNode { //implements IFormulaireDefinition {
-    /**
-     * implémentation par délégation de IObservable
-     */
-    private _observable: Observable;
-
+export abstract class FormulaireDefinition extends FormulaireNode {
     /**
      * type de calculette
      */
@@ -40,7 +34,6 @@ export abstract class FormulaireDefinition extends FormulaireNode { //implements
     ) {
         super();
         this._calcType = calcType;
-        this._observable = new Observable();
     }
 
     public get calculatorType(): CalculatorType {
@@ -211,6 +204,15 @@ export abstract class FormulaireDefinition extends FormulaireNode { //implements
         throw new Error(`Formulaire.getNodeParameterValue() : pas de paramètre ${symbol} trouvé`);
     }
 
+    /**
+     * réinitialisation du formulaire suite à un changement d'une valeur, d'une option, ... :
+     * effacement des résultats, application des dépendances, ...
+     */
+    public reset() {
+        this.resetResults();
+        this.applyDependencies();
+    }
+
     /**
      * retourne la valeur actuellement sélectionnée d'un SelectField
      * @param selectFieldId id du SelectField
@@ -241,7 +243,7 @@ export abstract class FormulaireDefinition extends FormulaireNode { //implements
             fe.applyDependencies(this);
     }
 
-    public abstract resetResults();
+    protected abstract resetResults();
     public abstract doCompute();
     public abstract get hasResults(): boolean;
     public abstract get results(): CalculatorResults[];
@@ -306,26 +308,12 @@ export abstract class FormulaireDefinition extends FormulaireNode { //implements
         throw new Error("FormulaireDefinition.clone() non implémenté");
     }
 
-    // interface IObservable
-
-    /**
-     * ajoute un observateur à la liste
-     */
-    public addObserver(o: Observer) {
-        this._observable.addObserver(o);
-    }
-
-    /**
-     * supprime un observateur de la liste
-     */
-    public removeObserver(o: Observer) {
-        this._observable.removeObserver(o);
-    }
+    // interface Observer
 
-    /**
-     * notifie un événement aux observateurs
-     */
-    public notifyObservers(data: any) {
-        this._observable.notifyObservers(data, this);
-    }
+    // update(sender: IObservable, data: any) {
+    // switch (data["action"]) {
+    //     case "resetForm":  // événement demandant une réinitialisation du formulaire (changement d'un SelectField, ...)
+    //         this.onReset();
+    // }
+    // }
 }
diff --git a/src/app/formulaire/fieldset-container.ts b/src/app/formulaire/fieldset-container.ts
index d33157cc892c078ecb856b7ed052b61393ca064f..5999f7c6545fcf7a5470df486d82d79819fe562a 100644
--- a/src/app/formulaire/fieldset-container.ts
+++ b/src/app/formulaire/fieldset-container.ts
@@ -68,6 +68,12 @@ export class FieldsetContainer extends FormulaireElement {
         this.fieldsets.push(inst);
         inst.applyDependencies(this.parentForm);
         this.updateLocalisation()
+
+        // notification de création d'un FieldSet
+        this.notifyObservers({
+            "action": "newFieldset",
+            "fieldset": inst
+        }, this);
     }
 
     public get fieldsets(): FieldSet[] {
diff --git a/src/app/formulaire/formulaire-node.ts b/src/app/formulaire/formulaire-node.ts
index e569c7e30cb16b89e691fa242b70aa6f3ecd5ac2..285e8917d43581a44362ed7f74f9a4456ea7e1ef 100644
--- a/src/app/formulaire/formulaire-node.ts
+++ b/src/app/formulaire/formulaire-node.ts
@@ -2,11 +2,12 @@ import { JalhydObject } from "jalhyd"
 
 import { FormulaireDefinition } from "./definition/form-definition";
 import { DeepFormulaireNodeIterator } from "./form-iterator/deep-node-iterator";
+import { IObservable, Observer, Observable } from "../services/observer";
 
 /**
  * représentation sous forme d'arbre du formulaire et de ses éléments
  */
-export abstract class FormulaireNode {
+export abstract class FormulaireNode implements IObservable {
     /**
      * identifiant dans le fichier de conf
      */
@@ -32,10 +33,16 @@ export abstract class FormulaireNode {
     */
     private _fromTemplate: FormulaireNode;
 
+    /**
+     * implémentation par délégation de IObservable
+     */
+    private _observable: Observable;
+
     constructor(isTmpl: boolean = false) {
         this._kids = [];
         this._uid = JalhydObject.nextUID;
         this._isTemplate = isTmpl;
+        this._observable = new Observable()
     }
 
     get id(): string {
@@ -177,4 +184,27 @@ export abstract class FormulaireNode {
     public abstract parseConfig(json: {}, data?: {});
 
     public abstract parseDependencies(json: {}, parentForm: FormulaireDefinition);
+
+    // interface IObservable
+
+    /**
+     * ajoute un observateur à la liste
+     */
+    public addObserver(o: Observer) {
+        this._observable.addObserver(o);
+    }
+
+    /**
+     * supprime un observateur de la liste
+     */
+    public removeObserver(o: Observer) {
+        this._observable.removeObserver(o);
+    }
+
+    /**
+     * notifie un événement aux observateurs
+     */
+    notifyObservers(data: any, sender?: any) {
+        this._observable.notifyObservers(data, sender);
+    }
 }
diff --git a/src/app/formulaire/ngparam.ts b/src/app/formulaire/ngparam.ts
index f054d4ffaf5be42a91cca552978bc5b0c1401da4..6cd0bd3a14ff35901625810f065138fe1c651dcc 100644
--- a/src/app/formulaire/ngparam.ts
+++ b/src/app/formulaire/ngparam.ts
@@ -4,7 +4,6 @@ import { InputField } from "./input-field";
 import { Dependency } from "./dependency/dependency";
 import { DependencyConditionType } from "./dependency/dependency-condition";
 import { ValueDependencyCondition } from "./dependency/value-dependency-condition";
-import { Observable, IObservable, Observer } from "../services/observer";
 import { FormulaireDefinition } from "./definition/form-definition";
 import { ApplicationSetupService } from "../services/app-setup/app-setup.service";
 
@@ -44,7 +43,7 @@ export enum ParamValueMode {
 /**
  * classe englobante de ParamDefinition (champs supplémentaires pour l'affichage, radio boutons, ...)
  */
-export class NgParameter extends InputField { // implements IObservable {
+export class NgParameter extends InputField {
     public unit: string;
     public radioConfig: ParamRadioConfig;
     public radioState: ParamRadioConfig;
@@ -75,14 +74,8 @@ export class NgParameter extends InputField { // implements IObservable {
      */
     private _valueList: number[];
 
-    /**
-     * implémentation par délégation de IObservable
-     */
-    private _observable: Observable;
-
     constructor(private _paramDef: ParamDefinition, isTmpl = false) {
         super(isTmpl);
-        this._observable = new Observable();
     }
 
     get symbol(): string {
@@ -326,27 +319,4 @@ export class NgParameter extends InputField { // implements IObservable {
     protected clone(): NgParameter {
         return new NgParameter(this._paramDef.clone());
     }
-
-    // // interface IObservable
-
-    // /**
-    //  * ajoute un observateur à la liste
-    //  */
-    // public addObserver(o: Observer) {
-    //     this._observable.addObserver(o);
-    // }
-
-    // /**
-    //  * supprime un observateur de la liste
-    //  */
-    // public removeObserver(o: Observer) {
-    //     this._observable.removeObserver(o);
-    // }
-
-    // /**
-    //  * notifie un événement aux observateurs
-    //  */
-    // public notifyObservers(data: any) {
-    //     this._observable.notifyObservers(data, this);
-    // }
 }
diff --git a/src/app/formulaire/select-field.ts b/src/app/formulaire/select-field.ts
index ab25d5ef97c8dd89ed362ce47ae9227b4988f282..65bfbfc9480416f38e37fbf7d3cbd82477819ca6 100644
--- a/src/app/formulaire/select-field.ts
+++ b/src/app/formulaire/select-field.ts
@@ -6,17 +6,14 @@ import { ValueDependencyCondition } from "./dependency/value-dependency-conditio
 import { StringMap } from "../stringmap";
 import { IObservable, Observable, Observer } from "../services/observer";
 
-export class SelectField extends Field implements IObservable {
+export class SelectField extends Field {
     private _entries: SelectEntry[];
 
     private _selectedEntry: SelectEntry;
 
-    private _observable: Observable;
-
     constructor(isTmpl = false) {
         super(isTmpl);
         this._entries = [];
-        this._observable = new Observable();
     }
 
     public get entries() {
@@ -36,7 +33,10 @@ export class SelectField extends Field implements IObservable {
     public setValue(v: SelectEntry) {
         if (this._selectedEntry !== v) {
             this._selectedEntry = v;
-            this.notifyObservers({ "action": "select", "value": v });
+            this.notifyObservers({
+                "action": "select",
+                "value": v
+            }, this);
         }
     }
 
@@ -93,27 +93,4 @@ export class SelectField extends Field implements IObservable {
             this.addEntry(e);
         }
     }
-
-    // interface IObservable
-
-    /**
-     * ajoute un observateur à la liste
-     */
-    public addObserver(o: Observer) {
-        this._observable.addObserver(o);
-    }
-
-    /**
-     * supprime un observateur de la liste
-     */
-    public removeObserver(o: Observer) {
-        this._observable.removeObserver(o);
-    }
-
-    /**
-     * notifie un événement aux observateurs
-     */
-    public notifyObservers(data: any) {
-        this._observable.notifyObservers(data, this);
-    }
 }