diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 09827b43ea41a1f4e1bfa8b32bdfe43aecced3b8..6b7d73fd1a10da98f2cc0ddb0581b00adf15f79b 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -63,6 +63,8 @@ import { CalcCanvasComponent } from "./components/canvas/canvas.component";
 import { SectionCanvasComponent } from "./components/section-canvas/section-canvas.component";
 import { RemousResultsComponent } from "./components/remous-results/remous-results.component";
 import { ResultsGraphComponent } from "./components/results-graph/results-graph.component";
+import { PabResultsComponent } from "./components/pab-results/pab-results.component";
+import { PabResultsTableComponent } from "./components/pab-results/pab-results-table.component";
 import { GraphTypeSelectComponent } from "./components/results-graph/graph-type.component";
 import { LogComponent } from "./components/log/log.component";
 import { CalculatorListComponent } from "./components/calculator-list/calculator-list.component";
@@ -72,6 +74,7 @@ import { FixedResultsComponent } from "./components/fixedvar-results/fixed-resul
 import { VarResultsComponent } from "./components/fixedvar-results/var-results.component";
 import { LogEntryComponent } from "./components/log-entry/log-entry.component";
 import { ParamLinkComponent } from "./components/param-link/param-link.component";
+import { SelectModelFieldLineComponent } from "./components/select-model-field-line/select-model-field-line.component";
 
 import { DialogConfirmEmptySessionComponent } from "./components/dialog-confirm-empty-session/dialog-confirm-empty-session.component";
 import { DialogConfirmCloseCalcComponent } from "./components/dialog-confirm-close-calc/dialog-confirm-close-calc.component";
@@ -89,7 +92,6 @@ import {
   JalhydModelValidationStepDirective
 } from "./directives/jalhyd-model-validation.directive";
 import { ImmediateErrorStateMatcher } from "./formulaire/immediate-error-state-matcher";
-import { SelectModelFieldLineComponent } from "./components/select-model-field-line/select-model-field-line.component";
 
 const appRoutes: Routes = [
   { path: "list", component: CalculatorListComponent },
@@ -168,6 +170,8 @@ const appRoutes: Routes = [
     LogComponent,
     LogEntryComponent,
     NgParamInputComponent,
+    PabResultsComponent,
+    PabResultsTableComponent,
     ParamComputedComponent,
     ParamFieldLineComponent,
     ParamLinkComponent,
diff --git a/src/app/components/calculator-results/calculator-results.component.html b/src/app/components/calculator-results/calculator-results.component.html
index 03c60dfa0215f53ecd21ce647d72338d7715d427..be99ed81b6241ed5baa4a3c2d900a339826d4535 100644
--- a/src/app/components/calculator-results/calculator-results.component.html
+++ b/src/app/components/calculator-results/calculator-results.component.html
@@ -1,5 +1,6 @@
 <div>
     <section-results></section-results>
     <remous-results></remous-results>
+    <pab-results></pab-results>
     <fixedvar-results></fixedvar-results>
 </div>
diff --git a/src/app/components/calculator-results/calculator-results.component.ts b/src/app/components/calculator-results/calculator-results.component.ts
index c6489fa69a1f5b9fb11587a08c1239778ac93020..514a8610193c1b94790e133e37eb7f9dad9f1b90 100644
--- a/src/app/components/calculator-results/calculator-results.component.ts
+++ b/src/app/components/calculator-results/calculator-results.component.ts
@@ -3,6 +3,7 @@ import { Component, ViewChild, Output, EventEmitter, AfterViewChecked } from "@a
 import { FixedVarResultsComponent } from "../../components/fixedvar-results/fixedvar-results.component";
 import { SectionResultsComponent } from "../../components/section-results/section-results.component";
 import { RemousResultsComponent } from "../../components/remous-results/remous-results.component";
+import { PabResultsComponent } from "../../components/pab-results/pab-results.component";
 import { FormulaireDefinition } from "../../formulaire/definition/form-definition";
 
 @Component({
@@ -30,6 +31,12 @@ export class CalculatorResultsComponent implements AfterViewChecked {
     @ViewChild(RemousResultsComponent)
     private remousResultsComponent: RemousResultsComponent;
 
+    /**
+     * composant d'affichage des résultats des passes à bassins
+     */
+    @ViewChild(PabResultsComponent)
+    private pabResultsComponent: PabResultsComponent;
+
     /**
      * événement émis à la fin du dessin de la vue
      */
@@ -42,10 +49,12 @@ export class CalculatorResultsComponent implements AfterViewChecked {
             this.fixedVarResultsComponent.results = undefined;
             this.sectionResultsComponent.results = undefined;
             this.remousResultsComponent.results = undefined;
+            this.pabResultsComponent.results = undefined;
         } else {
             this.fixedVarResultsComponent.results = f.results;
             this.sectionResultsComponent.results = f.results;
             this.remousResultsComponent.results = f.results;
+            this.pabResultsComponent.results = f.results;
         }
     }
 
@@ -53,6 +62,7 @@ export class CalculatorResultsComponent implements AfterViewChecked {
         this.fixedVarResultsComponent.updateView();
         this.sectionResultsComponent.updateView();
         this.remousResultsComponent.updateView();
+        this.pabResultsComponent.updateView();
     }
 
     public ngAfterViewChecked() {
diff --git a/src/app/components/fixedvar-results/fixedvar-results.component.scss b/src/app/components/fixedvar-results/fixedvar-results.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..6b464cc79aed1bab88068726a36ee186a2f1c536
--- /dev/null
+++ b/src/app/components/fixedvar-results/fixedvar-results.component.scss
@@ -0,0 +1,21 @@
+
+.result_right {
+    text-align: right;
+}
+
+.result_center {
+    text-align: center;
+}
+
+.result_id_0 {
+    background-color: #f0f0f0;
+}
+
+.result_id_1 {
+    background-color: #ffffff;
+}
+
+.result_id_2 {
+    font-weight: bolder;
+    background-color: #00d0ff;
+}
diff --git a/src/app/components/fixedvar-results/fixedvar-results.component.ts b/src/app/components/fixedvar-results/fixedvar-results.component.ts
index 3392fb698cf71523bca8cd1a036c9f8380bfb0dc..ca402293f108bfda22d83e7a75ea6aee5381828d 100644
--- a/src/app/components/fixedvar-results/fixedvar-results.component.ts
+++ b/src/app/components/fixedvar-results/fixedvar-results.component.ts
@@ -1,6 +1,5 @@
 import { Component, ViewChild, DoCheck } from "@angular/core";
 
-import { I18nService } from "../../services/internationalisation/internationalisation.service";
 import { LogComponent } from "../../components/log/log.component";
 import { FixedResults } from "../../results/fixed-results";
 import { VarResults } from "../../results/var-results";
@@ -15,24 +14,8 @@ import { VarResultsComponent } from "./var-results.component";
 @Component({
     selector: "fixedvar-results",
     templateUrl: "./fixedvar-results.component.html",
-    styles: [`
-    .result_right {
-        text-align: right;
-    }
-    .result_center {
-        text-align: center;
-    }
-    .result_id_0 {
-        background-color: #f0f0f0;
-    }
-    .result_id_1 {
-        background-color: #ffffff;
-    }
-    .result_id_2 {
-        font-weight: bolder;
-        background-color: #00d0ff;
-    }
-    `
+    styleUrls: [
+        "./fixedvar-results.component.scss"
     ]
 })
 export class FixedVarResultsComponent implements DoCheck {
@@ -66,7 +49,6 @@ export class FixedVarResultsComponent implements DoCheck {
     private resultsGraphComponent: ResultsGraphComponent;
 
     constructor(
-        private intlService: I18nService,
         private appSetupService: ApplicationSetupService,
     ) { }
 
diff --git a/src/app/components/fixedvar-results/var-results.component.ts b/src/app/components/fixedvar-results/var-results.component.ts
index 926e5b2a7809e18c270b2a9c1e0bcc9d323ac0ca..b8185119d8ad9801905debff482dbe1bcfd4e456 100644
--- a/src/app/components/fixedvar-results/var-results.component.ts
+++ b/src/app/components/fixedvar-results/var-results.component.ts
@@ -15,13 +15,13 @@ import * as XLSX from "xlsx";
 export class VarResultsComponent {
 
     /** résultats non mis en forme */
-    private _varResults: VarResults;
+    protected _varResults: VarResults;
 
     /** résultats mis en forme */
-    private _results: any[];
+    protected _results: any[];
 
     /** entêtes des colonnes (param à varier, à calculer + extraResults) */
-    private _headers: string[];
+    protected _headers: string[];
 
     /** tracks the fullscreen state */
     public get isFullscreen() {
@@ -31,8 +31,8 @@ export class VarResultsComponent {
     @ViewChild("tableContainer") table: ElementRef;
 
     constructor(
-        private appSetupService: ApplicationSetupService,
-        private intlService: I18nService
+        protected appSetupService: ApplicationSetupService,
+        protected intlService: I18nService
     ) { }
 
     public set results(r: VarResults) {
diff --git a/src/app/components/pab-results/pab-results-table.component.html b/src/app/components/pab-results/pab-results-table.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..bbdbf38db19c4d49f8db6fc3bda65506a3ea01af
--- /dev/null
+++ b/src/app/components/pab-results/pab-results-table.component.html
@@ -0,0 +1,32 @@
+<!-- @TODO copied from var-results.component.html > merge ?-->
+<div class="pab-results-table-container" #pabResultsTable *ngIf="hasResults" fxLayout="row wrap" fxLayoutAlign="center center">
+    <div fxFlex="1 1 100%">
+        <div class="pab-results-table-buttons">
+            <button mat-icon-button (click)="exportAsSpreadsheet()">
+                <mat-icon color="primary" svgIcon="file_excel" class="scaled09"></mat-icon>
+            </button>
+            <button mat-icon-button *ngIf="! isFullscreen" (click)="setFullscreen(pabResultsTable)">
+                <mat-icon color="primary" class="scaled12">fullscreen</mat-icon>
+            </button>
+            <button mat-icon-button *ngIf="isFullscreen" (click)="exitFullscreen()">
+                <mat-icon color="primary" class="scaled12">fullscreen_exit</mat-icon>
+            </button>
+        </div>
+
+        <div class="pab-results-table-scrollable-container" [ngClass]="{'full-height': isFullscreen}">
+            <!-- scrollable -->
+            <div class="pab-results-table-inner-container" #tableContainer>
+
+                <table mat-table [dataSource]="dataSet">
+                    <ng-container *ngFor="let h of headers; let i = index" [matColumnDef]="h">
+                        <th mat-header-cell *matHeaderCellDef>{{ h }}</th>
+                        <td mat-cell *matCellDef="let element">{{ element[i] }}</td>
+                    </ng-container>
+
+                    <tr mat-header-row *matHeaderRowDef="headers"></tr>
+                    <tr mat-row *matRowDef="let row; columns: headers;"></tr>
+                </table>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/src/app/components/pab-results/pab-results-table.component.scss b/src/app/components/pab-results/pab-results-table.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..780da209df9aac15415d2845eb749efab2969bef
--- /dev/null
+++ b/src/app/components/pab-results/pab-results-table.component.scss
@@ -0,0 +1,63 @@
+:host {
+    display: block;
+}
+
+.pab-results-table-container {
+    margin-top: 2em;
+    background-color: white;
+}
+
+.pab-results-table-buttons {
+    padding-right: 4px;
+    padding-top: 4px;
+    text-align: right;
+    background-color: white;
+
+    button {
+        margin-left: 3px;
+        width: auto;
+
+        mat-icon {
+            &.scaled12 {
+                transform: scale(1.2)
+            }
+            &.scaled09 {
+                transform: scale(0.9);
+            }
+        }
+    }
+}
+
+.pab-results-table-scrollable-container {
+    overflow-x: scroll;
+    border: solid #ccc 1px;
+
+    &.full-height {
+        height: calc(100vh - 40px); // rend le mode plein-écran scrollable verticalement, sinon ça dépasse
+    }
+}
+
+table.mat-table {
+
+    .mat-header-row {
+        height: 40px;
+    }
+
+    .mat-row {
+        height: 32px;
+
+        &:nth-child(odd) {
+            background-color: #f4f4f4;
+        }
+    }
+
+    ::ng-deep .mat-cell {
+        padding: 5px;
+    }
+
+    ::ng-deep .mat-header-cell {
+        font-size: 1em;
+        color: black;
+        padding: 5px;
+    }
+}
diff --git a/src/app/components/pab-results/pab-results-table.component.ts b/src/app/components/pab-results/pab-results-table.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..02424efa1055b8671aacf48975c334d4e9cbe603
--- /dev/null
+++ b/src/app/components/pab-results/pab-results-table.component.ts
@@ -0,0 +1,129 @@
+import { Component, ViewChild, ElementRef } from "@angular/core";
+
+import { ResultElement } from "jalhyd";
+
+import { PabResults } from "../../results/pab-results";
+
+import * as XLSX from "xlsx";
+import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";
+import { I18nService } from "../../services/internationalisation/internationalisation.service";
+
+@Component({
+    selector: "pab-results-table",
+    templateUrl: "./pab-results-table.component.html",
+    styleUrls: [
+        "./pab-results-table.component.scss"
+    ]
+})
+export class PabResultsTableComponent {
+
+    /** résultats non mis en forme */
+    private _pabResults: PabResults;
+
+    /** résultats mis en forme */
+    // private _results: any[];
+
+    /** entêtes des colonnes (param à varier, à calculer + extraResults) */
+    // private _headers: string[];
+
+    /** tracks the fullscreen state */
+    public get isFullscreen() {
+        return (document["fullscreenElement"] !== null);
+    }
+
+    @ViewChild("tableContainer") table: ElementRef;
+
+    constructor(
+        protected appSetupService: ApplicationSetupService,
+        protected intlService: I18nService
+    ) { }
+
+    public set results(r: PabResults) {
+        this._pabResults = r;
+
+        /*this._results = [];
+        this._headers = [];
+
+        if (this._pabResults) {
+            const nDigits = this.appSetupService.displayDigits;
+            let i = 0;
+            for (const x of this._pabResults.variatedParameter.valuesIterator) {
+                const pval = x.toFixed(nDigits);
+                this._results.push({ "param": pval, "result": this._pabResults.resultElements[i] });
+                i++;
+            }
+
+            this._headers.push(this._pabResults.variableParamHeader);
+            if (this._pabResults.calculatedParameterHeader) {
+                this._headers.push(this._pabResults.calculatedParameterHeader);
+            }
+
+            this._headers = this._headers.concat(this._pabResults.extraResultHeaders);
+        } */
+    }
+
+    public get hasResults(): boolean {
+        console.log("__ hasResults :", (this._pabResults !== undefined), this._pabResults ? this._pabResults.hasResults : "keud")
+        return this._pabResults && this._pabResults.hasResults;
+    }
+
+    /* public get headers() {
+        return this._headers;
+    } */
+
+    /**
+     * Returns a combination of and results and extraResults for mat-table
+     */
+    public get dataSet() {
+        const data = [];
+        /* const nDigits = this.appSetupService.displayDigits;
+        if (this._results) {
+            for (let i = 0; i < this._results.length; i++) {
+                const r = this._results[i];
+                const re: ResultElement = this._pabResults.resultElements[i];
+
+                if (re) {
+                    // for each computation step, build ordered list of : variable param value; result; extra results
+
+                    // 1. variable param value
+                    const list = [ r.param ];
+
+                    // 2. result
+                    if (re.vCalc) { // sometimes does no exist (ex: Section Parametree)
+                        list.push(re.vCalc.toFixed(nDigits));
+                    }
+
+                    // 3. extra results
+                    for (const erk of this._pabResults.extraResultKeys) {
+                        const er = re.getExtraResult(erk);
+                        if (er !== undefined) {
+                            list.push(this.intlService.formatResult(erk, er));
+                        } else {
+                            list.push(er); // keep list ordered
+                        }
+
+                    }
+                    data.push(list);
+                }
+            }
+        } */
+        return data;
+    }
+
+    public setFullscreen(element) {
+        element.requestFullscreen();
+    }
+
+    public exitFullscreen() {
+        document.exitFullscreen();
+    }
+
+    public exportAsSpreadsheet() {
+        // automagic <table> extraction
+        const ws: XLSX.WorkSheet = XLSX.utils.table_to_sheet(this.table.nativeElement);
+        const wb: XLSX.WorkBook = XLSX.utils.book_new();
+        XLSX.utils.book_append_sheet(wb, ws, "default");
+        // save and download
+        XLSX.writeFile(wb, "VariableResults.xlsx");
+    }
+}
diff --git a/src/app/components/pab-results/pab-results.component.html b/src/app/components/pab-results/pab-results.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..02aa6f94e3d9f1d315d909179a485897d1859a06
--- /dev/null
+++ b/src/app/components/pab-results/pab-results.component.html
@@ -0,0 +1,11 @@
+<div class="container">
+    <!-- journal -->
+    <log></log>
+
+    <!-- <results-graph *ngIf="showVarResults"></results-graph> -->
+
+    <div>
+        <!-- tableau de résultats -->
+        <pab-results-table [results]="pabResults"></pab-results-table>
+    </div>
+</div>
diff --git a/src/app/components/pab-results/pab-results.component.ts b/src/app/components/pab-results/pab-results.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d787ca36cce019b9e5a820d13ecbc94c958b002e
--- /dev/null
+++ b/src/app/components/pab-results/pab-results.component.ts
@@ -0,0 +1,126 @@
+import { Component, ViewChild, DoCheck } from "@angular/core";
+
+import { LogComponent } from "../../components/log/log.component";
+import { CalculatorResults } from "../../results/calculator-results";
+import { Result, cLog } from "jalhyd";
+import { NgParameter } from "../../formulaire/ngparam";
+import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";
+import { PabResultsTableComponent } from "./pab-results-table.component";
+import { PabResults } from "../../results/pab-results";
+
+@Component({
+    selector: "pab-results",
+    templateUrl: "./pab-results.component.html",
+    styleUrls: [
+        "../fixedvar-results/fixedvar-results.component.scss"
+    ]
+})
+export class PabResultsComponent implements DoCheck {
+
+    /** résultats non mis en forme */
+    private _pabResults: PabResults;
+
+    /** true si les résultats doiventt être remis à jour */
+    private _doUpdate = false;
+
+    @ViewChild(PabResultsTableComponent)
+    private pabResultsTableComponent: PabResultsTableComponent;
+
+    /** composant journal */
+    @ViewChild(LogComponent)
+    private logComponent: LogComponent;
+
+    constructor(
+        private appSetupService: ApplicationSetupService,
+    ) { }
+
+    public set results(rs: CalculatorResults[]) {
+        if (rs.length > 0) {
+            this._pabResults = rs[0] as PabResults;
+        }
+        this.updateView();
+    }
+
+    public updateView() {
+        this.logComponent.log = undefined;
+        if (this.pabResultsTableComponent) {
+            this.pabResultsTableComponent.results = undefined;
+        }
+        // set _doUpdate flag so that results are rebuilt on the next Angular display cycle
+        this._doUpdate = false;
+        if (this._pabResults !== undefined) {
+            this._doUpdate = this._doUpdate || this._pabResults.hasResults || this._pabResults.hasLog;
+        }
+    }
+
+    public ngDoCheck() {
+        if (this._doUpdate) {
+            this._doUpdate = !this.updateResults();
+        }
+    }
+
+    private mergeLog(result: Result, log: cLog) {
+        if (result && result.hasLog) {
+            if (result.hasGlobalLog) {
+                log.addLog(result.globalLog);
+            } else {
+                log.addLog(result.log);
+            }
+        }
+    }
+
+    private get mergedGlobalLogs(): cLog {
+        const res = new cLog();
+        if (this._pabResults) {
+            this.mergeLog(this._pabResults.result, res);
+        }
+        return res;
+    }
+
+    /**
+     * met à jour l'affichage des résultats
+     * @returns true si les résultats ont pu être mis à jour
+     */
+    private updateResults() {
+        let pabUpdated: boolean;
+        if (this.hasResults) {
+            pabUpdated = this.pabResultsTableComponent !== undefined;
+            if (pabUpdated) {
+                this.pabResultsTableComponent.results = this._pabResults;
+            }
+        } else {
+            pabUpdated = true;
+        }
+
+        const logUpdated = this.logComponent !== undefined;
+        if (logUpdated) {
+            this.logComponent.log = this.mergedGlobalLogs;
+        }
+
+        return pabUpdated && logUpdated;
+    }
+
+    /**
+     * affichage de la table des résultats de passe à bassins
+     */
+    public get showPabResults(): boolean {
+        return this.hasResults;
+    }
+
+    public get pabResults() {
+        return this._pabResults;
+    }
+
+    public formattedLabel(p: NgParameter): string {
+        return CalculatorResults.paramLabel(p, false);
+    }
+
+    public formattedValue(p: NgParameter): string {
+        const nDigits = this.appSetupService.displayDigits;
+        return p.getValue().toFixed(nDigits);
+    }
+
+    public get hasResults(): boolean {
+        return this._pabResults && this._pabResults.hasResults;
+    }
+}
diff --git a/src/app/formulaire/definition/concrete/form-base.ts b/src/app/formulaire/definition/concrete/form-base.ts
index d033e5076e562dec0ae43fe2110c26773b1c6cea..e54548b98fb970165a16b9bfdfc3a83a9c09fbb2 100644
--- a/src/app/formulaire/definition/concrete/form-base.ts
+++ b/src/app/formulaire/definition/concrete/form-base.ts
@@ -14,7 +14,7 @@ export class FormulaireBase extends FormulaireDefinition {
 
     constructor() {
         super();
-        this._formResult = new FormResultFixedVar(this, false);
+        this._formResult = new FormResultFixedVar(this);
         this._formCompute = new FormComputeFixedVar(this, (this._formResult as FormResultFixedVar));
     }
 
diff --git a/src/app/formulaire/definition/concrete/form-pab.ts b/src/app/formulaire/definition/concrete/form-pab.ts
index 71243ff67bbb64d6f94dc0812fe7463242f28c5f..18b63e068b240f0ba53f36ab2bdfee004887847b 100644
--- a/src/app/formulaire/definition/concrete/form-pab.ts
+++ b/src/app/formulaire/definition/concrete/form-pab.ts
@@ -1,6 +1,5 @@
 import { Nub, Props, Session, PabCloisons, Pab } from "jalhyd";
 
-import { FormResultFixedVar } from "../form-result-fixedvar";
 import { FieldsetContainer } from "../../fieldset-container";
 import { FieldSet } from "../../fieldset";
 import { SelectField } from "../../select-field";
@@ -9,6 +8,7 @@ import { FieldsetTemplate } from "../../fieldset-template";
 import { FormulaireNode } from "../../formulaire-node";
 import { FormulaireBase } from "./form-base";
 import { FormComputePab } from "../form-compute-pab";
+import { FormResultPab } from "../form-result-pab";
 
 /**
  * Formulaire pour les passes à bassins, inspiré du formulaire
@@ -24,11 +24,11 @@ export class FormulairePab extends FormulaireBase {
 
     constructor() {
         super();
-        this._formResult = new FormResultFixedVar(this, false);
+        this._formResult = new FormResultPab(this);
 
         // remove obsolete observer set by super()
         this.removeObserver(this._formCompute);
-        this._formCompute = new FormComputePab(this, (this._formResult as FormResultFixedVar));
+        this._formCompute = new FormComputePab(this, (this._formResult as FormResultPab));
     }
 
     public get modeleCloisonsSelectId(): string {
diff --git a/src/app/formulaire/definition/concrete/form-parallel-structures.ts b/src/app/formulaire/definition/concrete/form-parallel-structures.ts
index bc954c2969edf0165e5d1758cace4a0c22ea18fb..ada70cc185602a61e84820967a6daffda892319d 100644
--- a/src/app/formulaire/definition/concrete/form-parallel-structures.ts
+++ b/src/app/formulaire/definition/concrete/form-parallel-structures.ts
@@ -19,7 +19,7 @@ export class FormulaireParallelStructure extends FormulaireBase {
 
     constructor() {
         super();
-        this._formResult = new FormResultFixedVar(this, false);
+        this._formResult = new FormResultFixedVar(this);
 
         // remove obsolete observer set by super()
         this.removeObserver(this._formCompute);
diff --git a/src/app/formulaire/definition/form-compute-pab.ts b/src/app/formulaire/definition/form-compute-pab.ts
index 88801918110b67e71294a66a15e9abdfbf3f5ba5..8711164a7f8642dc317e8fa8cb5e8a3643cb87ce 100644
--- a/src/app/formulaire/definition/form-compute-pab.ts
+++ b/src/app/formulaire/definition/form-compute-pab.ts
@@ -1,28 +1,47 @@
-import { ParamDefinition, PabCloisons, Pab } from "jalhyd";
+import { Result, Pab } from "jalhyd";
 
-import { FormComputeFixedVar } from "./form-compute-fixedvar";
-import { FormResultFixedVar } from "./form-result-fixedvar";
 import { FormulaireDefinition } from "./form-definition";
+import { FormResultPab } from "./form-result-pab";
+import { FormCompute } from "./form-compute";
+import { NgParameter, ParamRadioConfig } from "../ngparam";
 
-export class FormComputePab extends FormComputeFixedVar {
+export class FormComputePab extends FormCompute {
 
-    constructor(formBase: FormulaireDefinition, formResult: FormResultFixedVar) {
+    constructor(formBase: FormulaireDefinition, formResult: FormResultPab) {
         super(formBase, formResult);
     }
 
-    /**
-     * construit un identifiant de type { uid: "abcdef", symbol: "X" }
-     * avec "abcdef" l'index du bassin et "X" son paramètre
-     */
-    protected getParameterRefid(p: ParamDefinition): any {
-        const nub = p.parentComputeNode;
-        if (nub instanceof PabCloisons) {
-            return {
-                uid: nub.uid,
-                symbol: p.symbol
-            };
-        } else {
-            return super.getParameterRefid(p);
+    protected get formResult(): FormResultPab {
+        return this._formResult as FormResultPab;
+    }
+
+    protected compute() {
+        this.runNubCalc(this._formBase.currentNub);
+        this.reaffectResultComponents();
+    }
+
+    protected reaffectResultComponents() {
+        console.log(">> reaffect RC");
+        const pab: Pab = (this._formBase.currentNub as Pab);
+        const computedParam: NgParameter = this.getComputedParameter();
+
+        // résultat de calcul de la passe à bassins
+        const pabr = this.formResult.pabResults;
+        pabr.calculatedParameter = computedParam;
+        pabr.result = pab.result;
+        // résultat de chaque cloison
+        const cr: Result[] = [];
+        for (const c of pab.getChildren()) {
+            cr.push(c.result);
         }
+        pabr.cloisonsResults = cr,
+        // résultat de la cloison aval
+        pabr.cloisonAvalResults = pab.downWall.result;
+
+        // @TODO Q & QA pour chaque enfant !
+    }
+
+    private getComputedParameter(): NgParameter {
+        return this._formBase.getDisplayedParamFromState(ParamRadioConfig.CAL);
     }
 }
diff --git a/src/app/formulaire/definition/form-result-fixedvar.ts b/src/app/formulaire/definition/form-result-fixedvar.ts
index be7137587ba266eb3ec4c47289d6393a0bcd95cf..53b9c455c9509afdabc217431e0a7c71f3a1830c 100644
--- a/src/app/formulaire/definition/form-result-fixedvar.ts
+++ b/src/app/formulaire/definition/form-result-fixedvar.ts
@@ -1,6 +1,6 @@
 import { FixedResults } from "../../results/fixed-results";
 import { GraphType, VarResults } from "../../results/var-results";
-import { ParamRadioConfig, NgParameter } from "../ngparam";
+import { ParamRadioConfig } from "../ngparam";
 import { FormResult } from "./form-result";
 import { FormulaireDefinition } from "./form-definition";
 import { CalculatorResults } from "../../results/calculator-results";
@@ -9,12 +9,12 @@ export class FormResultFixedVar extends FormResult {
     /**
      * résultats fixes/variables
      */
-    private _fixedResults: FixedResults;
-    private _varResults: VarResults;
+    protected _fixedResults: FixedResults;
+    protected _varResults: VarResults;
 
-    private _formBase: FormulaireDefinition;
+    protected _formBase: FormulaireDefinition;
 
-    constructor(base: FormulaireDefinition, private displaySymbol: boolean) {
+    constructor(base: FormulaireDefinition) {
         super();
         this._formBase = base;
         this._fixedResults = new FixedResults();
diff --git a/src/app/formulaire/definition/form-result-pab.ts b/src/app/formulaire/definition/form-result-pab.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5adc86f132629dfdea0239728c1c2a819c95bc90
--- /dev/null
+++ b/src/app/formulaire/definition/form-result-pab.ts
@@ -0,0 +1,33 @@
+import { FormulaireDefinition } from "./form-definition";
+import { FormResult } from "./form-result";
+import { CalculatorResults } from "../../results/calculator-results";
+import { PabResults } from "../../results/pab-results";
+
+export class FormResultPab extends FormResult {
+
+    protected _formBase: FormulaireDefinition;
+
+    protected _pabResults: PabResults;
+
+    constructor(base: FormulaireDefinition) {
+        super();
+        this._formBase = base;
+        this._pabResults = new PabResults();
+    }
+
+    public get pabResults() {
+        return this._pabResults;
+    }
+
+    public resetResults() {
+        this._pabResults.reset();
+    }
+
+    public get results(): CalculatorResults[] {
+        return [ this._pabResults ];
+    }
+
+    public get hasResults(): boolean {
+        return this._pabResults.hasResults;
+    }
+}
diff --git a/src/app/results/pab-results.ts b/src/app/results/pab-results.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2914a7b6b7b1e57080875033d549327b5b8d144c
--- /dev/null
+++ b/src/app/results/pab-results.ts
@@ -0,0 +1,24 @@
+import { CalculatedParamResults } from "./param-calc-results";
+import { Result } from "jalhyd";
+
+export class PabResults extends CalculatedParamResults {
+
+    /** résultats des modules Cloisons avant chaque bassin */
+    public cloisonsResults: Result[];
+
+    /** résultats du module ParallelStructure pour la cloison aval */
+    public cloisonAvalResults: Result;
+
+    /** données formatées */
+    protected data: any;
+
+    public constructor() {
+        super();
+        this.reset();
+    }
+
+    public reset() {
+        super.reset();
+        this.data = {};
+    }
+}