diff --git a/e2e/session/session-solveur-chutes.json b/e2e/session/session-solveur-chutes.json
new file mode 100644
index 0000000000000000000000000000000000000000..3142108ec2b5a85559d8ba422d3ad0c7a618705b
--- /dev/null
+++ b/e2e/session/session-solveur-chutes.json
@@ -0,0 +1,124 @@
+{
+    "header": {
+        "source": "jalhyd",
+        "format_version": "1.3",
+        "created": "2019-10-22T08:08:13.816Z"
+    },
+    "settings": {
+        "precision": 0.0001,
+        "maxIterations": 100,
+        "displayPrecision": 3
+    },
+    "documentation": "",
+    "session": [
+        {
+            "uid": "NjRvcG",
+            "props": {
+                "calcType": "PabChute"
+            },
+            "meta": {
+                "title": "PAB : chute"
+            },
+            "children": [],
+            "parameters": [
+                {
+                    "symbol": "Z1",
+                    "mode": "SINGLE",
+                    "value": 2.1513761467889907
+                },
+                {
+                    "symbol": "Z2",
+                    "mode": "SINGLE",
+                    "value": 0.8669724770642202
+                },
+                {
+                    "symbol": "DH",
+                    "mode": "CALCUL"
+                }
+            ]
+        },
+        {
+            "uid": "dnV4bD",
+            "props": {
+                "calcType": "PabNombre"
+            },
+            "meta": {
+                "title": "PAB : nombre"
+            },
+            "children": [],
+            "parameters": [
+                {
+                    "symbol": "DHT",
+                    "mode": "LINK",
+                    "targetNub": "NjRvcG",
+                    "targetParam": "DH"
+                },
+                {
+                    "symbol": "N",
+                    "mode": "SINGLE",
+                    "value": 10
+                },
+                {
+                    "symbol": "DH",
+                    "mode": "CALCUL"
+                }
+            ]
+        },
+        {
+            "uid": "OHBpcz",
+            "props": {
+                "calcType": "PabPuissance"
+            },
+            "meta": {
+                "title": "PAB : puissance"
+            },
+            "children": [],
+            "parameters": [
+                {
+                    "symbol": "DH",
+                    "mode": "LINK",
+                    "targetNub": "dnV4bD",
+                    "targetParam": "DH"
+                },
+                {
+                    "symbol": "Q",
+                    "mode": "SINGLE",
+                    "value": 0.1
+                },
+                {
+                    "symbol": "V",
+                    "mode": "SINGLE",
+                    "value": 0.5
+                },
+                {
+                    "symbol": "PV",
+                    "mode": "CALCUL"
+                }
+            ]
+        },
+        {
+            "uid": "ODM0Z2",
+            "props": {
+                "calcType": "Solveur",
+                "nubToCalculate": "OHBpcz",
+                "searchedParameter": "NjRvcG/Z2"
+            },
+            "meta": {
+                "title": "Solveur"
+            },
+            "children": [],
+            "parameters": [
+                {
+                    "symbol": "Xinit",
+                    "mode": "SINGLE",
+                    "value": 0.5
+                },
+                {
+                    "symbol": "Ytarget",
+                    "mode": "SINGLE",
+                    "value": 252
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/e2e/solveur.e2e-spec.ts b/e2e/solveur.e2e-spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..84b3df0e9d0b143a9ee460b07be960195e762a82
--- /dev/null
+++ b/e2e/solveur.e2e-spec.ts
@@ -0,0 +1,135 @@
+import { AppPage } from "./app.po";
+import { ListPage } from "./list.po";
+import { CalculatorPage } from "./calculator.po";
+import { Navbar } from "./navbar.po";
+import { browser } from "protractor";
+import { SideNav } from "./sidenav.po";
+
+/**
+ * Clone calculators
+ */
+describe("Solveur - ", () => {
+  let startPage: AppPage;
+  let listPage: ListPage;
+  let calcPage: CalculatorPage;
+  let navbar: Navbar;
+  let sidenav: SideNav;
+
+  beforeEach(() => {
+    startPage = new AppPage();
+    listPage = new ListPage();
+    calcPage = new CalculatorPage();
+    navbar = new Navbar();
+    sidenav = new SideNav();
+  });
+
+  it("load > calculate", async () => {
+    await startPage.navigateTo();
+
+    await navbar.clickMenuButton();
+    await browser.sleep(200);
+
+    await sidenav.clickLoadSessionButton();
+    await browser.sleep(200);
+
+    await sidenav.loadSessionFile("./session/session-solveur-chutes.json");
+    await browser.sleep(200);
+
+    expect(await navbar.getAllCalculatorTabs().count()).toBe(4);
+    await navbar.clickCalculatorTab(3); // n°3 should be the latest
+
+    // check input values
+    expect(await calcPage.getInputById("Xinit").getAttribute("value")).toBe("0.5");
+    expect(await calcPage.getInputById("Ytarget").getAttribute("value")).toBe("252");
+    // check Nub to calculate
+    const ntc = calcPage.getSelectById("select_target_nub");
+    const ntcV = await calcPage.getSelectValueText(ntc);
+    expect(ntcV).toContain("PAB : puissance / Puissance dissipée (PV)");
+    // check searched Parameter
+    const sp = calcPage.getSelectById("select_searched_param");
+    const spV = await calcPage.getSelectValueText(sp);
+    expect(spV).toContain("Z2 - Cote aval (PAB : chute)");
+
+    // check that "compute" button is active
+    const calcButton = calcPage.getCalculateButton();
+    const disabledState = await calcButton.getAttribute("disabled");
+    expect(disabledState).not.toBe("true");
+    // click "compute" button
+    await calcButton.click();
+    // check that result is not empty
+    const hasResults = await calcPage.hasResults();
+    expect(hasResults).toBe(true);
+  });
+
+  it("create > feed > calculate > clone > calculate clone", async () => {
+    await startPage.navigateTo();
+
+    // 1. create empty Solveur
+    await listPage.clickMenuEntryForCalcType(22); // Solveur
+    await browser.sleep(500);
+
+    // 2. create PAB:Chute, PAB:Nombre and PAB:Puissance linked to one another
+    await navbar.clickNewCalculatorButton();
+    await listPage.clickMenuEntryForCalcType(12); // PAB:Chute
+    await browser.sleep(500);
+    await navbar.clickNewCalculatorButton();
+
+    await listPage.clickMenuEntryForCalcType(13); // PAB:Nombre
+    await browser.sleep(500);
+    // link DHT to PAB:Chute.DH
+    const dht = calcPage.getInputById("DHT");
+    await calcPage.setParamMode(dht, "link");
+    // Calculate DH
+    const dh_nombre = calcPage.getInputById("DH");
+    await calcPage.setParamMode(dh_nombre, "cal");
+
+    await navbar.clickNewCalculatorButton();
+    await listPage.clickMenuEntryForCalcType(6); // PAB:Puissance
+    await browser.sleep(500);
+    // link DH to PAB:Nombre.DH
+    const dh_puiss = calcPage.getInputById("DH");
+    await calcPage.setParamMode(dh_puiss, "link");
+
+    // Go back to Solveur
+    await navbar.clickCalculatorTab(0);
+
+    await calcPage.changeSelectValue(calcPage.getSelectById("select_target_nub"), 1); // "Puissance / PV"
+    await browser.sleep(500);
+    await calcPage.changeSelectValue(calcPage.getSelectById("select_searched_param"), 2); // "Chute / Z2"
+    await browser.sleep(500);
+    await calcPage.getInputById("Ytarget").sendKeys("318");
+
+    // check that "compute" button is active
+    const calcButton = calcPage.getCalculateButton();
+    const disabledState = await calcButton.getAttribute("disabled");
+    expect(disabledState).not.toBe("true");
+    // click "compute" button
+    await calcButton.click();
+    // check that result is not empty
+    const hasResults = await calcPage.hasResults();
+    expect(hasResults).toBe(true);
+
+    // otherwise clickCloneCalcButton() fails with "Element is not clickable at point"
+    await browser.executeScript("window.scrollTo(0, 0);");
+    await calcPage.clickCloneCalcButton();
+    await browser.sleep(500);
+
+    // 4. check existence of the cloned module
+    expect(await navbar.getAllCalculatorTabs().count()).toBe(5);
+    await navbar.clickCalculatorTab(4); // n°4 should be the latest
+
+    // check that result is empty
+    const hasResultsClone1 = await calcPage.hasResults();
+    expect(hasResultsClone1).toBe(false);
+
+    // check that "compute" button is active
+    const calcButtonClone = calcPage.getCalculateButton();
+    const disabledStateClone = await calcButtonClone.getAttribute("disabled");
+    expect(disabledStateClone).not.toBe("true");
+    // click "compute" button
+    await calcButtonClone.click();
+    // check that result is not empty
+    const hasResultsClone2 = await calcPage.hasResults();
+    expect(hasResultsClone2).toBe(true);
+  });
+});