diff --git a/src/app/components/generic-calculator/calc-name.component.ts b/src/app/components/generic-calculator/calc-name.component.ts
index 208d11e9737a1484ac513de75271a67efc88c7fe..3de415d2ee7fd03474c43fe0ffd7768fdc644a7e 100644
--- a/src/app/components/generic-calculator/calc-name.component.ts
+++ b/src/app/components/generic-calculator/calc-name.component.ts
@@ -76,11 +76,4 @@ export class CalculatorNameComponent extends GenericInputComponent {
 
         return { isValid: valid, message: msg };
     }
-
-    /**
-     * convertit une valeur saisie dans l'UI en valeur affectable au modèle
-     */
-    protected uiToModel(ui: string): any {
-        return ui;
-    }
 }
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 890d21a4a179cdd197a843ead0ab00dd3386dc58..c6c9afed11cfc800c2e839055946bb7332cf1bb9 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -1,7 +1,7 @@
 import { Component, OnInit, DoCheck, OnDestroy, ViewChild, ViewChildren, QueryList, AfterViewChecked } from "@angular/core";
 import { ActivatedRoute, Router } from "@angular/router";
 
-import { Observer, Session, ParallelStructure } from "jalhyd";
+import { Observer, Session } from "jalhyd";
 
 import { FormulaireService } from "../../services/formulaire/formulaire.service";
 import { I18nService } from "../../services/internationalisation/internationalisation.service";
@@ -122,7 +122,7 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit,
     /**
      * détermine si un FormulaireElement est du type FieldsetContainer
      */
-    private isFieldsetContainer(fe: any): boolean {
+    public isFieldsetContainer(fe: any): boolean {
         return fe instanceof FieldsetContainer;
     }
 
@@ -164,9 +164,8 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit,
     }
 
     ngDoCheck() {
-        if (this._formulaire !== undefined) {
-            this.isCalculateDisabled = !(this._formulaire.isValid && this._isUIValid);
-        }
+        console.log(">>> UI validity", this._isUIValid);
+        this.isCalculateDisabled = ! this._isUIValid;
     }
 
     ngOnDestroy() {
@@ -192,7 +191,7 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit,
     /*
      * gestion des événements clic sur les radios
      */
-    private onRadioClick(info: any) {
+    public onRadioClick(info: any) {
         this.updateLinkedParameters();
         this._pendingRadioClick = true;
         this._pendingRadioClickInfo = info;
@@ -246,11 +245,6 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit,
         }
     }
 
-    private getFieldsetStyleDisplay(id: string) {
-        const isDisplayed: boolean = this._formulaire.isDisplayed(id);
-        return isDisplayed ? "block" : "none";
-    }
-
     private setForm(f: FormulaireDefinition) {
         if (this._formulaire !== undefined) {
             this._formulaire.removeObserver(this);
@@ -313,11 +307,7 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit,
                     // accumulator (valeur précédente du résultat)
                     acc,
                     // currentValue (élément courant dans le tableau)
-                    fieldset,
-                    // currentIndex (indice courant dans le tableau)
-                    currIndex,
-                    // array (tableau parcouru)
-                    array
+                    fieldset
                 ) => {
                     return acc && fieldset.isValid;
                 }
@@ -331,11 +321,7 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit,
                     // accumulator (valeur précédente du résultat)
                     acc,
                     // currentValue (élément courant dans le tableau)
-                    fieldsetContainer,
-                    // currentIndex (indice courant dans le tableau)
-                    currIndex,
-                    // array (tableau parcouru)
-                    array
+                    fieldsetContainer
                 ) => {
                     return acc && fieldsetContainer.isValid;
                 }
@@ -344,27 +330,36 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit,
         }
     }
 
+    public getFieldsetStyleDisplay(id: string) {
+        const isDisplayed: boolean = this._formulaire.isDisplayed(id);
+        return isDisplayed ? "block" : "none";
+    }
+
     /**
      * réception d'un événement de validité d'un FieldSetComponent
      */
-    private OnFieldsetValid() {
+    public OnFieldsetValid() {
         this.updateUIValidity();
     }
 
     /**
      * réception d'un événement de validité d'un FieldsetContainerComponent
      */
-    private onFieldsetContainerValid() {
+    public onFieldsetContainerValid() {
         this.updateUIValidity();
     }
 
     /**
      * réception d'un événement de changement de valeur d'un input
      */
-    private onInputChange() {
+    public onInputChange() {
         this._formulaire.resetResults([]);
     }
 
+    public openHelp() {
+        window.open("assets/docs-fr/calculators/" + this._formulaire.helpLink + "/", "_blank");
+    }
+
     /**
      * flag d'affichage du bouton d'aide
      */
@@ -375,10 +370,6 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit,
         return false;
     }
 
-    private openHelp() {
-        window.open("assets/docs-fr/calculators/" + this._formulaire.helpLink + "/", "_blank");
-    }
-
     public saveCalculator() {
         this.formulaireService.saveForm(this._formulaire);
     }
diff --git a/src/app/components/generic-input/generic-input.component.ts b/src/app/components/generic-input/generic-input.component.ts
index 8f9f2f7a2c0206d74fc1fdc39a76ed4e542cd7a1..213dfeeaa18e9e6579f6820fd9ab6968d9c082c3 100644
--- a/src/app/components/generic-input/generic-input.component.ts
+++ b/src/app/components/generic-input/generic-input.component.ts
@@ -204,7 +204,7 @@ export abstract class GenericInputComponent extends BaseComponent implements OnC
      * MAJ et validation de l'UI
      */
     protected updateAndValidateUI() {
-        this._uiValue = this.modelToUI(this.getModelValue());
+        this._uiValue = String(this.getModelValue());
         this.validateUI();
     }
 
@@ -226,7 +226,7 @@ export abstract class GenericInputComponent extends BaseComponent implements OnC
      */
     public updateModelFromUI() {
         if (this.validateUI()) {
-            this.setAndValidateModel(this, this.uiToModel(this._uiValue));
+            this.setAndValidateModel(this, +this._uiValue); // cast UI value to Number
         }
     }
 
@@ -270,13 +270,6 @@ export abstract class GenericInputComponent extends BaseComponent implements OnC
      */
     protected abstract validateModelValue(v: any): { isValid: boolean, message: string };
 
-    /**
-     * convertit le modèle en valeur affichable par l'UI
-     */
-    protected modelToUI(v: any): string {
-        return String(v);
-    }
-
     /**
      * valide une valeur saisie dans l'UI (forme de la saisie : est ce bien une date, un nombre, ...)
      * @param ui saisie à valider
@@ -295,106 +288,4 @@ export abstract class GenericInputComponent extends BaseComponent implements OnC
 
         return { isValid: valid, message: msg };
     }
-
-    /**
-     * convertit une valeur saisie dans l'UI en valeur affectable au modèle
-     */
-    protected uiToModel(ui: string): any {
-        return +ui;
-    }
-}
-
-/*
- * exemples d'utilisation de GenericInputComponent
- */
-
-/*
-import { Component } from "@angular/core";
-
-import { isNumeric, Message } from "jalhyd";
-
-// exemple où le modèle est un type simple (number)
-
-@Component({
-    selector: "test-input",
-    template: `<div class="md-form form-sm">
-    <input  type="text" id="form1" class="form-control" [disabled]="isDisabled" [(ngModel)]="uiValue">
-    <label for="form1">{{title}}</label>
-    <small *ngIf="showError" class="text-danger">{{errorMessage}}</small>
-</div>`
-})
-export class TestInputComponent extends GenericInputComponent {
-    constructor() {
-        super();
-        this._model = 0;
-    }
-
-    protected getModelValue(): any {
-        return this._model;
-    }
-
-    protected setModelValue(v: any) {
-        this._model = v;
-    }
-
-    protected validateModelValue(v: any): { isValid: boolean, message: string } {
-        let msg = undefined;
-        let valid = false;
-
-        if (v < 0)
-            msg = "La valeur n'est pas >= 0 ";
-        else
-            valid = true;
-
-        return { isValid: valid, message: msg };
-    }
-
-    protected uiToModel(ui: string): any {
-        return +ui;
-    }
-}
-
-
-// exemple où le modèle est une classe dont on ne gère qu'un membre
-
-import { ParamDefinition } from "jalhyd";
-
-@Component({
-    selector: "test2-input",
-    template: `<div class="md-form form-sm">
-    <input type="text" id="form1" class="form-control" [disabled]="isDisabled" [(ngModel)]="uiValue">
-    <label for="form1">{{title}}</label>
-    <small *ngIf="showError" class="text-danger">{{errorMessage}}</small>
-</div>`
-})
-export class Test2InputComponent extends GenericInputComponent {
-    constructor() {
-        super();
-    }
-
-    // paramètre géré
-    private get _param(): ParamDefinition {
-        return this._model;
-    }
-
-    protected getModelValue(): any {
-        return this._param.getValue();
-    }
-
-    protected setModelValue(v: any) {
-        this._param.setValue(v);
-    }
-
-    protected validateModelValue(v: any): { isValid: boolean, message: string } {
-        let msg = undefined;
-        let valid = false;
-
-        if (v < 0)
-            msg = "La valeur n'est pas >= 0 ";
-        else
-            valid = true;
-
-        return { isValid: valid, message: msg };
-    }
 }
-/**/
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index e1d9f5433a88176548ee9c053157780103abd20b..4d14b15b7bdadc31e5a26e1c21d09b46d51d9d31 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -417,16 +417,6 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
         return (<FormulaireElement>this.getFormulaireNodeById(id)).isDisplayed;
     }
 
-    public get isValid(): boolean {
-        let res = true;
-        for (const fs of this.allFieldsets) {
-            if (fs.isDisplayed) {
-                res = res && fs.isValid;
-            }
-        }
-        return res;
-    }
-
     /**
      * gestion d'un clic sur les radios
      */
diff --git a/src/app/formulaire/field.ts b/src/app/formulaire/field.ts
index c8d2f84b60290e67cbf9e3b570156758cb9a59ec..3bdbef3c0a504e0364f48ced8fffdaaebc1cccc1 100644
--- a/src/app/formulaire/field.ts
+++ b/src/app/formulaire/field.ts
@@ -4,7 +4,6 @@ import { Dependency } from "./dependency/dependency";
 import { isNumber } from "util";
 
 export abstract class Field extends FormulaireElement {
-    public abstract get isValid();
 
     public abstract getValue(): any;
     public abstract setValue(sender: any, val: any): void;
diff --git a/src/app/formulaire/fieldset.ts b/src/app/formulaire/fieldset.ts
index 14e44ce415a4a929cbde4c0f393edc3d25a662dd..ffa32a38d50050e230430c5671c7e06bde31ee6e 100644
--- a/src/app/formulaire/fieldset.ts
+++ b/src/app/formulaire/fieldset.ts
@@ -74,18 +74,6 @@ export class FieldSet extends FormulaireElement implements Observer {
         }
     }
 
-    public get isValid(): boolean {
-        let res = true;
-        for (const f of this.kids) {
-            if (f instanceof Field) {
-                if (f.isDisplayed) {
-                    res = res && f.isValid;
-                }
-            }
-        }
-        return res;
-    }
-
     private parse_select(json: {}): SelectField {
         const res: SelectField = new SelectField(this);
         res.parseConfig(json);
diff --git a/src/app/formulaire/select-field.ts b/src/app/formulaire/select-field.ts
index df078bfbf1a912061129b46786d72cb03e331b7d..c60b4dd506e3f122f01716f8ca95055251ad80ea 100644
--- a/src/app/formulaire/select-field.ts
+++ b/src/app/formulaire/select-field.ts
@@ -51,10 +51,6 @@ export class SelectField extends Field {
         }
     }
 
-    public get isValid(): boolean {
-        return true;
-    }
-
     public getLabel() {
         if (this._selectedEntry) {
             return this._selectedEntry.label;