diff --git a/e2e/calculator.po.ts b/e2e/calculator.po.ts
index 757a2fa707aec856605435c2f14dd7cd7dda971a..da84adc10448a18c56db41bd2c3e63646ea1a4c1 100644
--- a/e2e/calculator.po.ts
+++ b/e2e/calculator.po.ts
@@ -123,6 +123,28 @@ export class CalculatorPage {
         return await button.isPresent();
     }
 
+    /**
+     * @returns true if "fixed mode" button linked to an input is selected
+     */
+    async inputIsInFixedMode(input: ElementFinder): Promise<boolean> {
+        // get parent (div.container)
+        const container = await this.findParentContainer(input);
+        // find fixed radio button
+        const button: ElementFinder = container.element(by.css("mat-button-toggle.radio_fix"));
+        return await button.getAttribute("ng-reflect-checked") === "true";
+    }
+
+    /**
+     * @returns true if "calculated mode" button linked to an input is selected
+     */
+    async inputIsInCalculatedMode(input: ElementFinder): Promise<boolean> {
+        // get parent (div.container)
+        const container = await this.findParentContainer(input);
+        // find calc radio button
+        const button: ElementFinder = container.element(by.css("mat-button-toggle.radio_cal"));
+        return await button.getAttribute("ng-reflect-checked") === "true";
+    }
+
     async hasResults() {
         return (
             await this.presentAndVisible("fixedvar-results fixed-results > .fixed-results-container")
diff --git a/e2e/parallel-structures.e2e-spec.ts b/e2e/parallel-structures.e2e-spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..44312c6bf5344e7d8eed582884fa8220d95121e8
--- /dev/null
+++ b/e2e/parallel-structures.e2e-spec.ts
@@ -0,0 +1,55 @@
+import { ListPage } from "./list.po";
+import { Navbar } from "./navbar.po";
+import { browser, by, element } from "protractor";
+import { CalculatorPage } from "./calculator.po";
+import { PreferencesPage } from "./preferences.po";
+
+describe("Check calculated parameter remains the same when copying a structure", () => {
+    let listPage: ListPage;
+    let navBar: Navbar;
+    let calcPage: CalculatorPage;
+    let prefPage: PreferencesPage;
+
+    beforeAll(async () => {
+        listPage = new ListPage();
+        navBar = new Navbar();
+        calcPage = new CalculatorPage();
+        prefPage = new PreferencesPage();
+    });
+
+    beforeEach(async () => {
+        // disable evil option "empty fields on module creation"
+        await prefPage.navigateTo();
+        await prefPage.disableEvilEmptyFields();
+        await browser.sleep(200);
+    });
+
+    it("", async () => {
+        // open "fish ladder: cross walls" calculator
+        await navBar.clickNewCalculatorButton();
+        await listPage.clickMenuEntryForCalcType(10);
+        await browser.sleep(200);
+
+        // check L in first structure calc toggle is not checked
+        const L1 = calcPage.getInputById("0_L");
+
+        // const h11 = calcPage.getInputById("0_h1");
+
+        // set L to calculated in first structure
+        await calcPage.setParamMode(L1, "cal");
+
+        // check L calc toggle is  checked
+        expect(await calcPage.inputIsInCalculatedMode(L1)).toBe(true);
+
+        // copy 1st structure
+        const copyStruct = calcPage.getCopyStructureButton();
+        await copyStruct.click();
+
+        // check L in first structure is still in "calc" state
+        expect(await calcPage.inputIsInCalculatedMode(L1)).toBe(true);
+
+        // // check L in second structure is still in "fix" state
+        const L2 = calcPage.getInputById("1_L");
+        expect(await calcPage.inputIsInFixedMode(L2)).toBe(true);
+    });
+});
diff --git a/src/app/components/field-set/field-set.component.ts b/src/app/components/field-set/field-set.component.ts
index 1bde22b4165daa0a0064181ee0804a36359a9e5d..fa61d21cef01af81516a33cc19f3863aa7fc938a 100644
--- a/src/app/components/field-set/field-set.component.ts
+++ b/src/app/components/field-set/field-set.component.ts
@@ -159,46 +159,6 @@ export class FieldSetComponent implements DoCheck {
         this._isValid = new DefinedBoolean();
     }
 
-    public hasRadioFix(): boolean {
-        if (this._fieldSet.hasInputs) {
-            switch (this._fieldSet.getInput(0).radioConfig) {
-                case ParamRadioConfig.FIX:
-                    return false;
-
-                default:
-                    return true;
-            }
-        }
-        return false;
-    }
-
-    public hasRadioVar(): boolean {
-        if (this._fieldSet.hasInputs) {
-            switch (this._fieldSet.getInput(0).radioConfig) {
-                case ParamRadioConfig.VAR:
-                case ParamRadioConfig.CAL:
-                    return true;
-
-                default:
-                    return false;
-            }
-        }
-        return false;
-    }
-
-    public hasRadioCal(): boolean {
-        if (this._fieldSet.hasInputs) {
-            switch (this._fieldSet.getInput(0).radioConfig) {
-                case ParamRadioConfig.CAL:
-                    return true;
-
-                default:
-                    return false;
-            }
-        }
-        return false;
-    }
-
     /**
      * détermine si un Field est du type InputField
      */
diff --git a/src/app/components/fieldset-container/fieldset-container.component.ts b/src/app/components/fieldset-container/fieldset-container.component.ts
index add37e2be4a947f9bff00320b0e2ff0c16c1c94f..9d5664cf7bf0817ad0a61a60a960a24a2d383fae 100644
--- a/src/app/components/fieldset-container/fieldset-container.component.ts
+++ b/src/app/components/fieldset-container/fieldset-container.component.ts
@@ -7,6 +7,7 @@ import { FormulaireDefinition } from "../../formulaire/definition/form-definitio
 import { I18nService } from "../../services/internationalisation.service";
 import { ApplicationSetupService } from "../../services/app-setup.service";
 import { DefinedBoolean } from "app/definedvalue/definedboolean";
+import { ParamValueMode } from "jalhyd";
 
 @Component({
     selector: "fieldset-container",
@@ -90,6 +91,17 @@ export class FieldsetContainerComponent implements DoCheck, AfterViewInit {
             // @WTF why only those two ?
             newFs.setPropValue("structureType", after.properties.getPropValue("structureType"));
             newFs.setPropValue("loiDebit", after.properties.getPropValue("loiDebit"));
+
+            // au cas où un des paramètres du fieldset source est en mode calcul,
+            // on met le paramètre copié en mode fixé (nghyd#567)
+            for (const o of prms) {
+                if (o.prmDef !== undefined) {
+                    if (o.valueMode === ParamValueMode.CALCUL) {
+                        o.valueMode = ParamValueMode.SINGLE;
+                    }
+                }
+            }
+
             newFs.restoreParameters(prms);
         }
     }
diff --git a/src/app/formulaire/elements/fieldset.ts b/src/app/formulaire/elements/fieldset.ts
index 4081f824133ac596b38848c2e926a0793580713e..b73ff379a513b8a1c8b1f0ae0055ff97ffbb5d51 100644
--- a/src/app/formulaire/elements/fieldset.ts
+++ b/src/app/formulaire/elements/fieldset.ts
@@ -79,7 +79,7 @@ export class FieldSet extends FormulaireElement implements Observer {
             if (p instanceof NgParameter) {
                 for (const bp of backup) {
                     if (p.symbol === bp.prmDef.symbol) {
-                        p.loadObjectRepresentation(bp);
+                        p.loadObjectRepresentation(bp, false);
                         break;
                     }
                 }
diff --git a/src/app/formulaire/elements/ngparam.ts b/src/app/formulaire/elements/ngparam.ts
index 869e54e20f8131656548962e8d30bb56df4da946..188f87fd4b451d41b3ff11b9ffe5eb52a98f5579 100644
--- a/src/app/formulaire/elements/ngparam.ts
+++ b/src/app/formulaire/elements/ngparam.ts
@@ -35,13 +35,17 @@ export class NgParameter extends InputField implements Observer {
     /** user defined title (if undefined : parameter label + unit */
     private _title: string;
 
-    public radioConfig: ParamRadioConfig;
+    /**
+     * fix,var,calc,link radio buttons configuration, ie. what buttons are available,
+     * NOT the one selected
+     */
+    private _radioConfig: ParamRadioConfig;
 
     public disabled: boolean;
 
     constructor(private _paramDef: ParamDefinition, parent: FormulaireNode) {
         super(parent);
-        this.radioConfig = this.radioState;
+        this._radioConfig = this.radioState;
         this.disabled = false;
     }
 
@@ -183,7 +187,7 @@ export class NgParameter extends InputField implements Observer {
     /**
      * compute radio state from value mode
      */
-    public get radioState() {
+    public get radioState(): ParamRadioConfig {
         switch (this._paramDef.valueMode) {
             case ParamValueMode.SINGLE:
                 return ParamRadioConfig.FIX;
@@ -200,6 +204,20 @@ export class NgParameter extends InputField implements Observer {
         }
     }
 
+    public get radioConfig(): ParamRadioConfig {
+        if (this._radioConfig === undefined) {
+            throw new Error("radio config not defined!");
+        }
+        return this._radioConfig;
+    }
+
+    public set radioConfig(rc: ParamRadioConfig) {
+        if (this._radioConfig === undefined) {
+            throw new Error("cannot set radio config to undefined!");
+        }
+        this._radioConfig = rc;
+    }
+
     get isDefined(): boolean {
         return this._paramDef.isDefined;
     }
@@ -298,9 +316,9 @@ export class NgParameter extends InputField implements Observer {
     }
 
     /**
-     * Reads radio config from parameter calculability
+     * compute radio config from parameter calculability
      */
-    private getRadioConfig() {
+    private getRadioConfigFromCalculability(): ParamRadioConfig {
         switch (this.paramDefinition.calculability) {
             case ParamCalculability.FIXED:
                 return ParamRadioConfig.FIX;
@@ -309,6 +327,8 @@ export class NgParameter extends InputField implements Observer {
             case ParamCalculability.DICHO:
             case ParamCalculability.EQUATION:
                 return ParamRadioConfig.CAL;
+            default:
+                throw new Error("parameter calculability not set!");
         }
     }
 
@@ -504,16 +524,18 @@ export class NgParameter extends InputField implements Observer {
             prmDef: this.paramDefinition.objectRepresentation(),
             allowEmpty: this._allowEmpty,
             unit: this.unit,
-            radioConfig: this.radioConfig,
+            radioConfig: this._radioConfig,
+            valueMode: this.paramDefinition.valueMode
         }
     }
 
-    public loadObjectRepresentation(rep: any) {
+    public loadObjectRepresentation(rep: any, propagateToCalculatedParam: boolean = true) {
         if (this._paramDef.symbol === rep.prmDef.symbol) {
-            this._paramDef.loadObjectRepresentation(rep.prmDef);
+            this._paramDef.loadObjectRepresentation(rep.prmDef, false);
             this._allowEmpty = rep.allowEmpty;
             this._paramDef.setUnit(rep.unit);
-            this.radioConfig = rep.radioConfig;
+            this._radioConfig = rep.radioConfig;
+            this.paramDefinition.setValueMode(rep.valueMode, propagateToCalculatedParam);
         }
     }
 
@@ -597,9 +619,9 @@ export class NgParameter extends InputField implements Observer {
         if (json["allowEmpty"] !== undefined && typeof json["allowEmpty"] === "boolean") {
             this._allowEmpty = json["allowEmpty"];
         }
-        this.radioConfig = this.getRadioConfig();
+        this._radioConfig = this.getRadioConfigFromCalculability();
         if (json["calculable"] !== undefined && json["calculable"] === false) {
-            this.radioConfig = Math.min(ParamCalculability.FREE, this.getRadioConfig());
+            this._radioConfig = Math.min(ParamCalculability.FREE, this._radioConfig);
         }
     }