diff --git a/0-getting_started_with_tutorial.ipynb b/0-getting_started_with_tutorial.ipynb
index 9bbd602c7f6114a5ef3ae87f5e5f06a5ce2794c0..8af82f6e1b41027680dbd96d7856d9d9c6d9f1bf 100644
--- a/0-getting_started_with_tutorial.ipynb
+++ b/0-getting_started_with_tutorial.ipynb
@@ -89,29 +89,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_11:3:16: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mexpected ';' at end of declaration\u001b[0m\n",
-      "    int foo = 5 // COMPILATION ERROR!\n",
-      "\u001b[0;1;32m               ^\n",
-      "\u001b[0m\u001b[0;32m               ;\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    int foo = 5 // COMPILATION ERROR!\n",
@@ -120,7 +100,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -138,7 +118,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -170,7 +150,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -180,31 +160,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_17:2:6: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mredefinition of 'i'\u001b[0m\n",
-      " int i = 1; // If the cell above was run, compilation error as `i` is al...\n",
-      "\u001b[0;1;32m     ^\n",
-      "\u001b[0m\u001b[1minput_line_16:2:6: \u001b[0m\u001b[0;1;30mnote: \u001b[0mprevious definition is here\u001b[0m\n",
-      " int i = 2; // Should be fine on the first call. But if you have execute...\n",
-      "\u001b[0;1;32m     ^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "int i = 1; // If the cell above was run, compilation error as `i` is already defined."
    ]
@@ -219,7 +177,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -230,7 +188,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -245,33 +203,14 @@
    "source": [
     "### Input / output\n",
     "\n",
-    "Inputs and outputs aren't directly a part of the language itself, but are in the standard library (often abbreviated as STL for Standard Template Library even if some purist may well and explain it's not 100 % the same thing...). You therefore need to __include__ a file named `iostream`; doing so will enable the use of the input / output facilities."
+    "Inputs and outputs aren't directly a part of the language itself, but are in the standard library (often abbreviated as STL for Standard Template Library even if some purist may yell and explain it's not 100 % the same thing...). You therefore need to __include__ a file named `iostream`; doing so will enable the use of the input / output facilities."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_26:3:10: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mno member named 'cout' in namespace 'std'\u001b[0m\n",
-      "    std::cout << \"Hello world!\" << std::endl; // Should fail (unless yo...\n",
-      "\u001b[0;1;32m    ~~~~~^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    std::cout << \"Hello world!\" << std::endl; // Should fail (unless you run a cell that includes iostream before)\n",
@@ -280,17 +219,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Hello world!\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -303,7 +234,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "- `std::cout` is the symbol to designate the standard output\n",
+    "- `std::cout` is the symbol to designate the standard output (i.e. your screen...)\n",
     "- `std::endl` is the symbol to clean-up the stream and go to next line.\n",
     "\n",
     "The operator `<<` is used to indicate what you direct toward the stream; here std::cout << \"Hello world!\" tells to redirect the string toward the standard output.\n",
diff --git a/1-ProceduralProgramming/1-Variables.ipynb b/1-ProceduralProgramming/1-Variables.ipynb
index 3257d8b7bb097d413412d59e9d05ab86060e3e8e..8992deab5ae3709d22c1ef26bde154354568eec7 100644
--- a/1-ProceduralProgramming/1-Variables.ipynb
+++ b/1-ProceduralProgramming/1-Variables.ipynb
@@ -41,7 +41,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [
     {
@@ -60,7 +60,7 @@
     "    int number; // integer variable\n",
     "    double real;  // floating-point variable\n",
     "\n",
-    "std::cout << number << std::endl;\n",
+    "    std::cout << number << std::endl; \n",
     "    std::cout << real << std::endl;\n",
     "}\n",
     "\n"
@@ -77,15 +77,14 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Although not mandatory, it is strongly recommended to give a\n",
+    "Although not mandatory, it is **strongly** recommended to give a\n",
     "initial value to your variables, as an expression between brackets. \n",
     "\n",
     "Not providing an initial value may lead to unexpected behaviour. For instance you can't make hypothesis upon the values of `number` and `real` in the cell above: you might end-up with any value... and someone else might get other values on his computer!\n",
     "\n",
     "\n",
     "If you give braces without values, a predefined and associated value\n",
-    "to the type is used (usually a form of 0).\n",
-    "If you give nothing , the behaviour is undefined: you might end up with a 0-like value or something"
+    "to the type is used (usually a form of 0)."
    ]
   },
   {
@@ -97,7 +96,7 @@
     "{\n",
     "    int nb1 { 1 }; // integer variable set with the value 1\n",
     "    int nb2 {}; // same as int nb2{0};\n",
-    "    double pi { 3.14 } ;  // real variable\n",
+    "    double pi { 3.14 };  // real variable\n",
     "}"
    ]
   },
@@ -107,13 +106,13 @@
    "source": [
     "C++ actually supports many other historical forms\n",
     "of initialization, which you will encounter everywhere, including in this tutorial,\n",
-    "with brackets and/or an equal sign. There are some subtile differences\n",
+    "with brackets and/or an equal sign. There are some subtle differences\n",
     "between each other... that you can ignore most of the time."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -175,6 +174,36 @@
     "}   "
    ]
   },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Affectations may be chained:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "a = 5, b = 5 and c = 5\n"
+     ]
+    }
+   ],
+   "source": [
+    "{\n",
+    "    int a {}, b {}, c {};\n",
+    "    \n",
+    "    a = b = c = 5;    \n",
+    "    \n",
+    "    std::cout << \"a = \" << a << \", b = \" << b << \" and c = \" << c << std::endl;\n",
+    "}"
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {},
@@ -184,7 +213,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [
     {
@@ -229,7 +258,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [
     {
@@ -252,8 +281,7 @@
     "    a++; // increment a by 1.\n",
     "    ++a; // same, both are actually equivalents here.\n",
     "    \n",
-    "    int c = a + b;\n",
-    "    \n",
+    "    int c = a + b;    \n",
     "    std::cout << \"a = \" << a << \", b = \" << b << \" and c = \" << c << std::endl;\n",
     "    \n",
     "    c = a-- + b; // first a + b is evaluated, and only then a is decremented.    \n",
@@ -273,7 +301,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [
     {
@@ -281,7 +309,7 @@
      "output_type": "stream",
      "text": [
       "a = 7, b = 3 and c = 10\n",
-      "a = 6, b = 3 and c = 9\n",
+      "a = 6, b = 3 and c = 10\n",
       "a = 6, b = 4 and c = 10\n"
      ]
     }
@@ -295,17 +323,14 @@
     "\n",
     "    int c = a + b;\n",
     "    std::cout << \"a = \" << a << \", b = \" << b << \" and c = \" << c << std::endl;\n",
-    "    \n",
-    "     --a; // equivalent to a-- but for reasons related to the standard library I advise you to rather use the\n",
-    "         // pre-increment form.\n",
-    "    \n",
-    "    c = a + b; // first a + b is evaluated, and only then a is decremented.    \n",
+    "        \n",
+    "    c = a + b;\n",
+    "    --a; // equivalent to a-- but for reasons related to the standard library I advise you \n",
+    "         // to rather use the pre-increment form when both are equivalent.\n",
     "    std::cout << \"a = \" << a << \", b = \" << b << \" and c = \" << c << std::endl;\n",
-    "   \n",
-    "    \n",
-    "    ++b; // same: equivalent to b++;\n",
-    "    \n",
-    "    c = a + b; // first a is incremented, and only then a + b is evaluated.\n",
+    "       \n",
+    "    ++b; // same: equivalent to b++;    \n",
+    "    c = a + b;\n",
     "    std::cout << \"a = \" << a << \", b = \" << b << \" and c = \" << c << std::endl;\n",
     "}"
    ]
@@ -404,7 +429,7 @@
     "in this case we use the pointer name directly, or we want to modify the variable\n",
     "pointed, in which case the name is prefixed with `*`.\n",
     "\n",
-    "We can therefore see the pointer as a kind of redefinable reference."
+    "We can therefore see the pointer as a kind of redefinable reference; pointers are a feature from C language."
    ]
   },
   {
@@ -477,7 +502,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 10,
    "metadata": {},
    "outputs": [
     {
@@ -491,7 +516,7 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[1minput_line_16:4:62: \u001b[0m\u001b[0;1;35mwarning: \u001b[0m\u001b[1mnull passed to a callee that requires a non-null argument [-Wnonnull]\u001b[0m\n",
+      "\u001b[1minput_line_24:4:62: \u001b[0m\u001b[0;1;35mwarning: \u001b[0m\u001b[1mnull passed to a callee that requires a non-null argument [-Wnonnull]\u001b[0m\n",
       "    std::cout << \"\\t p: address = \" << p << \", value = \" << *p << std::endl; // Dereferencing p is misguided!\n",
       "\u001b[0;1;32m                                                             ^\n",
       "\u001b[0m"
@@ -562,7 +587,7 @@
     "{\n",
     "    const double pi = 3.1415927;\n",
     "    double const pi_2 = 3.1415927; // equally valid; it is just a matter of taste. Mine is to put it before,\n",
-    "                                   // so that is what you will see in the remaining of the tutorial.\n",
+    "                                   // so that is what you will see in the remaining of the lecture.\n",
     "    pi = 5.; // COMPILATION ERROR!\n",
     "    pi_2 = 7.; // COMPILATION ERROR!\n",
     "}"
@@ -577,7 +602,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 35,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -592,17 +617,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 39,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[1minput_line_74:6:7: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mcannot assign to variable 'p' with const-qualified type 'int *const'\u001b[0m\n",
+      "\u001b[1minput_line_27:6:7: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mcannot assign to variable 'p' with const-qualified type 'int *const'\u001b[0m\n",
       "    p = &b; // COMPILATION ERROR - if you comment it it will \n",
       "\u001b[0;1;32m    ~ ^\n",
-      "\u001b[0m\u001b[1minput_line_74:4:16: \u001b[0m\u001b[0;1;30mnote: \u001b[0mvariable 'p' declared const here\u001b[0m\n",
+      "\u001b[0m\u001b[1minput_line_27:4:16: \u001b[0m\u001b[0;1;30mnote: \u001b[0mvariable 'p' declared const here\u001b[0m\n",
       "    int* const p { &a }; // Value is modifiable, but not the address pointed to.\n",
       "\u001b[0;1;32m    ~~~~~~~~~~~^~~~~~~~\n",
       "\u001b[0m"
@@ -629,14 +654,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 40,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[1minput_line_75:7:8: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mread-only variable is not assignable\u001b[0m\n",
+      "\u001b[1minput_line_28:7:8: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mread-only variable is not assignable\u001b[0m\n",
       "    *p = 5; // COMPILATION ERROR    \n",
       "\u001b[0;1;32m    ~~ ^\n",
       "\u001b[0m"
@@ -795,17 +820,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 15,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[1minput_line_18:7:32: \u001b[0m\u001b[0;1;35mwarning: \u001b[0m\u001b[1marray index 10 is past the end of the array (which contains 10 elements) [-Warray-bounds]\u001b[0m\n",
+      "\u001b[1minput_line_30:7:32: \u001b[0m\u001b[0;1;35mwarning: \u001b[0m\u001b[1marray index 10 is past the end of the array (which contains 10 elements) [-Warray-bounds]\u001b[0m\n",
       "    std::cout << \"i[10] = \" << i[10] << \" (undefined behaviour: out of range. Warning identifies the issue)\" << std::endl ;\n",
       "\u001b[0;1;32m                               ^ ~~\n",
-      "\u001b[0m\u001b[1minput_line_18:3:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0marray 'i' declared here\u001b[0m\n",
+      "\u001b[0m\u001b[1minput_line_30:3:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0marray 'i' declared here\u001b[0m\n",
       "    int i[10] ; // Array of 10 integers - not initialised properly!\n",
       "\u001b[0;1;32m    ^\n",
       "\u001b[0m"
@@ -815,8 +840,8 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "i[2] = 149375929 (may be nonsense: undefined behaviour due to lack of initialization!)\n",
-      "i[10] = -87424866 (undefined behaviour: out of range. Warning identifies the issue)\n",
+      "i[2] = 50428857 (may be gibberish: undefined behaviour due to lack of initialization!)\n",
+      "i[10] = -2038759403 (undefined behaviour: out of range. Warning identifies the issue)\n",
       "x[1] = 2 (expected: 2.)\n"
      ]
     }
@@ -843,7 +868,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 16,
    "metadata": {},
    "outputs": [
     {
@@ -891,7 +916,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 17,
    "metadata": {},
    "outputs": [
     {
diff --git a/1-ProceduralProgramming/2-Conditions-and-loops.ipynb b/1-ProceduralProgramming/2-Conditions-and-loops.ipynb
index 05f40c6c3e7096848e42030e48d0b0180281b249..5306fe56afaafbef657c26670c71e73e2fe46afa 100644
--- a/1-ProceduralProgramming/2-Conditions-and-loops.ipynb
+++ b/1-ProceduralProgramming/2-Conditions-and-loops.ipynb
@@ -64,24 +64,16 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Of course, the precedent is embarrassing but is due to the poor indenting used: you have to remember that in C++ indenting is just for the programmer: it is much easier to read if a program is properly indented, but it doesn't matter from the compiler standpoint!\n",
+    "Of course, the precedent code is embarrassing but is due to the poor indenting used: you have to remember that in C++ indenting is just for the programmer: it is much easier to read if a program is properly indented, but it doesn't matter from the compiler standpoint!\n",
     "\n",
     "Our case above would be much clearer however with a more logical indenting and spacing:"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "It's much clearer now that this line is not encompassed by the condition!\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -107,17 +99,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "a was not modified and is still 2\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -141,32 +125,14 @@
    "source": [
     "### No semicolon at the end of the `if` condition\n",
     "\n",
-    "__BEWARE__: do not put a `;` at the end of an `if` statement! If you do so, the statement executed if the condition is true is the empty statement `;` which doesn nothing... The risk is rather mitigated: any compiler worth its salt will warn you if you do this mistake."
+    "__BEWARE__: do not put a `;` at the end of an `if` statement! If you do so, the statement executed if the condition is true is the empty statement `;` which does nothing... The risk is rather mitigated: any compiler worth its salt will warn you if you do this mistake."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_11:4:16: \u001b[0m\u001b[0;1;35mwarning: \u001b[0m\u001b[1mif statement has empty body [-Wempty-body]\u001b[0m\n",
-      "    if (a == 0);\n",
-      "\u001b[0;1;32m               ^\n",
-      "\u001b[0m\u001b[1minput_line_11:4:16: \u001b[0m\u001b[0;1;30mnote: \u001b[0mput the semicolon on a separate line to silence this warning\u001b[0m\n"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Will be printed: the statement after the condition is ';', which does nothing...\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    int a = 2;\n",
@@ -177,7 +143,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -186,7 +152,7 @@
     "    if (a == 2)\n",
     "        ; // putting the semicolon in a different line silences the warning; there are legitimate cases in\n",
     "          // which it's useful to do so and the risk is\n",
-    "          // slim this was written by mistake. \n",
+    "          // slim that this was written by mistake. \n",
     "}"
    ]
   },
@@ -235,7 +201,7 @@
    "source": [
     "Please notice that:\n",
     "* `else if` and `else` syntax is the same as the one for `if` and you may choose a single statement or a block in each branch of the condition.\n",
-    "* As soon as one condition is fulfilled, the execution of the condition blocks ends. I didn't have to spell out in the (a < 100) case that a had to be greater than 10."
+    "* As soon as one condition is fulfilled, the execution of the condition blocks ends. I therefore didn't have to spell out in the (`a < 100`) case that `a` had to be greater than 10."
    ]
   },
   {
@@ -254,17 +220,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Is 5 even? -> false\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -283,17 +241,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 30,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Is 5 even? -> False\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -316,17 +266,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "1\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    int i = 5;\n",
@@ -345,36 +287,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 36,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_67:4:15: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mdefault initialization of an object of const type 'const int'\u001b[0m\n",
-      "    const int is_strictly_positive;\n",
-      "\u001b[0;1;32m              ^\n",
-      "\u001b[0m\u001b[0;32m                                   = 0\n",
-      "\u001b[0m\u001b[1minput_line_67:7:30: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mcannot assign to variable 'is_strictly_positive' with const-qualified type\n",
-      "      'const int'\u001b[0m\n",
-      "        is_strictly_positive = 1; // COMPILATION ERROR: can't assign to ...\n",
-      "\u001b[0;1;32m        ~~~~~~~~~~~~~~~~~~~~ ^\n",
-      "\u001b[0m\u001b[1minput_line_67:4:15: \u001b[0m\u001b[0;1;30mnote: \u001b[0mvariable 'is_strictly_positive' declared const here\u001b[0m\n",
-      "    const int is_strictly_positive;\n",
-      "\u001b[0;1;32m    ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    int i = 5;\n",
@@ -388,28 +303,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 37,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_68:12:18: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1muse of undeclared identifier 'is_strictly_positive'\u001b[0m\n",
-      "    std::cout << is_strictly_positive << std::endl; // COMPILATION ERROR...\n",
-      "\u001b[0;1;32m                 ^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{    \n",
     "    int i = 5;\n",
@@ -460,19 +356,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Ok: first condition is true.\n",
-      "Same as above illustrating the alternative representation.\n",
-      "Ok: a < 0 is false so the `not` operator returns true.\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -505,32 +391,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_20:6:26: \u001b[0m\u001b[0;1;35mwarning: \u001b[0m\u001b[1m'&&' within '||' [-Wlogical-op-parentheses]\u001b[0m\n",
-      "    if (a == 5 || a == 2 && b == 3)\n",
-      "\u001b[0;1;32m               ~~ ~~~~~~~^~~~~~~~~\n",
-      "\u001b[0m\u001b[1minput_line_20:6:26: \u001b[0m\u001b[0;1;30mnote: \u001b[0mplace parentheses around the '&&' expression to silence this warning\u001b[0m\n",
-      "    if (a == 5 || a == 2 && b == 3)\n",
-      "\u001b[0;1;32m                         ^\n",
-      "\u001b[0m\u001b[0;32m                  (               )\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "(a == 5) and (a == 2 && b == 3) are evaluated separately and the latter is true so this text is printed\n",
-      "Same but easier to grasp.\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    int a = 2;\n",
@@ -553,18 +416,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "b is still 3: as the first operand was true ++b was never evaluated.\n",
-      "b is now 4: the first operand run is not the same...\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    int a = 2;\n",
@@ -614,21 +468,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "1\n",
-      "2\n",
-      "3\n",
-      "4\n",
-      "5\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -649,7 +491,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -681,17 +523,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "0\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -736,21 +570,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "0\n",
-      "1\n",
-      "2\n",
-      "3\n",
-      "4\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -769,22 +591,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "1\n",
-      "2\n",
-      "3\n",
-      "4\n",
-      "5\n",
-      "`for` loop stopped for i = 5\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -817,20 +626,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "2\n",
-      "3\n",
-      "5\n",
-      "7\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "#include <vector> // we'll present this one more in detail later\n",
@@ -852,20 +650,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "2\n",
-      "3\n",
-      "5\n",
-      "7\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "#include <vector> // we'll present this one more in detail later\n",
@@ -923,17 +710,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -960,24 +739,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
     "{\n",
     "    int i = 2;\n",
     "    \n",
-    "    while (i > 0 and i <= 20)\n",
+    "    while (i > 0 && i <= 20)\n",
     "        std::cout << i++ << \" \";\n",
     "}"
    ]
@@ -993,7 +764,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [
     {
diff --git a/1-ProceduralProgramming/3-Types.ipynb b/1-ProceduralProgramming/3-Types.ipynb
index 7dfaf3e211dd8764700f510f40715b99ba9f87d3..bc821287676e4907e1e02a292243fdcc410e25e8 100644
--- a/1-ProceduralProgramming/3-Types.ipynb
+++ b/1-ProceduralProgramming/3-Types.ipynb
@@ -32,25 +32,15 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Boolean value of 5 is true.\n",
-      "Boolean value of 0 is false.\n",
-      "Boolean value of -2 is true.\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
     "{\n",
     "    bool a = true, b(false), c{true};\n",
-    "    bool d;  // UNDEFINED !! - warning: 'd' is used uninitialized in this function [-Wuninitialized]\n",
+    "    bool d;  // UNDEFINED !! \n",
     "    if (d)\n",
     "        std::cout << \"This text might appear or not - it's truly undefined and may vary from \"\n",
     "        \"one run/compiler/architecture/etc... to another!\" << std::endl;\n",
@@ -85,18 +75,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "0 1 2 (expected: 0, 1, 2)\n",
-      "10 11 20 (expected: 10, 11, 20)\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -118,18 +99,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "b = 6 (expected: 6)\n",
-      "d = 21 (expected: 21... but we've just added a shape to a color without ado!)\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -156,37 +128,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_13:5:23: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mredefinition of enumerator 'yes'\u001b[0m\n",
-      "    enum is_colored { yes, no }; // COMPILATION ERROR!\n",
-      "\u001b[0;1;32m                      ^\n",
-      "\u001b[0m\u001b[1minput_line_13:3:24: \u001b[0m\u001b[0;1;30mnote: \u001b[0mprevious definition is here\u001b[0m\n",
-      "    enum is_positive { yes, no };\n",
-      "\u001b[0;1;32m                       ^\n",
-      "\u001b[0m\u001b[1minput_line_13:5:28: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mredefinition of enumerator 'no'\u001b[0m\n",
-      "    enum is_colored { yes, no }; // COMPILATION ERROR!\n",
-      "\u001b[0;1;32m                           ^\n",
-      "\u001b[0m\u001b[1minput_line_13:3:29: \u001b[0m\u001b[0;1;30mnote: \u001b[0mprevious definition is here\u001b[0m\n",
-      "    enum is_positive { yes, no };\n",
-      "\u001b[0;1;32m                            ^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    enum is_positive { yes, no };\n",
@@ -206,7 +150,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -216,35 +160,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_16:2:2: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1muse of undeclared identifier 'yes'\u001b[0m\n",
-      " yes; // COMPILATION ERROR: `enum class ` value must be prefixed! (see below)\n",
-      "\u001b[0;1;32m ^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "yes; // COMPILATION ERROR: `enum class ` value must be prefixed! (see below)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -253,70 +178,32 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_18:2:6: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mcannot initialize a variable of type 'int' with an rvalue of type 'is_positive'\u001b[0m\n",
-      " int is_positive_p = is_positive::no; // COMPILATION ERROR: not implicitly convertible into an integer\n",
-      "\u001b[0;1;32m     ^               ~~~~~~~~~~~~~~~\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "int is_positive_p = is_positive::no; // COMPILATION ERROR: not implicitly convertible into an integer"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_19:2:19: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1minvalid operands to binary expression ('is_positive' and 'is_colored')\u001b[0m\n",
-      " is_positive::yes + is_colored::no; // COMPILATION ERROR: addition of two unrelated types\n",
-      "\u001b[0;1;32m ~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "is_positive::yes + is_colored::no; // COMPILATION ERROR: addition of two unrelated types"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
     "{\n",
     "    enum class color { red, green, blue } ;\n",
     "    color c = color::green;\n",
-    "    bool more_than_red = (c > color::red); // Both belong to the same type and therefore might be compared\n",
+    "    bool is_more_than_red = (c > color::red); // Both belong to the same type and therefore might be compared\n",
     "}"
    ]
   },
@@ -333,7 +220,7 @@
     "standard C++ only imposes `short <= int <= long` and `float <= double <= long double`. This makes these predefined types unportable. Like many things\n",
     "in C, and therefore in C++, performance is given priority over any other consideration.\n",
     "The default integer and real types, `int` and `double`, are assumed\n",
-    "to match the size of the processor registers and be the fastest (for more details see [numerical types](http://en.cppreference.com/w/cpp/language/types))\n",
+    "to match the size of the processor registers and be the fastest (for more details see [the article on cppreference](http://en.cppreference.com/w/cpp/language/types))\n",
     "\n",
     "| C++           | Fortran   | Observations        | 0 notation |\n",
     "|:------------- |:---------:|:-------------------:|:----------:|\n",
@@ -363,44 +250,34 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "int [min, max] = [-2147483648, 2147483647]\n",
-      "unsigned int [min, max] = [0, 4294967295]\n",
-      "short [min, max] = [-32768, 32767]\n",
-      "float [min, max] = [1.17549e-38, 3.40282e+38]\n",
-      "double [min, max] = [2.22507e-308, 1.79769e+308]\n",
-      "long double [min, max] = [3.3621e-4932, 1.18973e+4932]\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "#include <limits>  // for std::numeric_limits\n",
     "\n",
     "\n",
     "{\n",
-    "    std::cout << \"int [min, max] = [\" << std::numeric_limits<int>::min() << \", \"\n",
+    "    std::cout << \"int [min, max] = [\" << std::numeric_limits<int>::lowest() << \", \"\n",
     "            << std::numeric_limits<int>::max() << \"]\" << std::endl;\n",
     "\n",
-    "    std::cout << \"unsigned int [min, max] = [\" << std::numeric_limits<unsigned int>::min() << \", \"\n",
+    "    std::cout << \"unsigned int [min, max] = [\" << std::numeric_limits<unsigned int>::lowest() << \", \"\n",
     "            << std::numeric_limits<unsigned int>::max() << \"]\" << std::endl;    \n",
     "    \n",
-    "    std::cout << \"short [min, max] = [\" << std::numeric_limits<short>::min() << \", \"\n",
+    "    std::cout << \"short [min, max] = [\" << std::numeric_limits<short>::lowest() << \", \"\n",
     "            << std::numeric_limits<short>::max() << \"]\" << std::endl;\n",
     "    \n",
-    "    std::cout << \"float [min, max] = [\" << std::numeric_limits<float>::min() << \", \"\n",
+    "    std::cout << \"long [min, max] = [\" << std::numeric_limits<long>::lowest() << \", \"\n",
+    "            << std::numeric_limits<long>::max() << \"]\" << std::endl;\n",
+    "    \n",
+    "    std::cout << \"float [min, max] = [\" << std::numeric_limits<float>::lowest() << \", \"\n",
     "            << std::numeric_limits<float>::max() << \"]\" << std::endl;\n",
     "\n",
-    "    std::cout << \"double [min, max] = [\" << std::numeric_limits<double>::min() << \", \"\n",
+    "    std::cout << \"double [min, max] = [\" << std::numeric_limits<double>::lowest() << \", \"\n",
     "            << std::numeric_limits<double>::max() << \"]\" << std::endl;\n",
     "\n",
-    "    std::cout << \"long double [min, max] = [\" << std::numeric_limits<long double>::min() << \", \"\n",
+    "    std::cout << \"long double [min, max] = [\" << std::numeric_limits<long double>::lowest() << \", \"\n",
     "        << std::numeric_limits<long double>::max() << \"]\" << std::endl;\n",
     "}"
    ]
@@ -414,27 +291,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_28:3:15: \u001b[0m\u001b[0;1;35mwarning: \u001b[0m\u001b[1mimplicit conversion from 'int' to 'short' changes value from -33010 to 32526 [-Wconstant-conversion]\u001b[0m\n",
-      "    short s = -33010; // triggers a warning: outside the range\n",
-      "\u001b[0;1;32m          ~   ^~~~~~\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "32526\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -453,18 +312,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Max = 4294967295\n",
-      "Max + 1 = 0!\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "#include <limits>  // for std::numeric_limits\n",
@@ -538,10 +388,10 @@
    "source": [
     "Accuracy losses are detected during conversion:\n",
     "* from a floating point type (`long double`, `double` and `float`) into an integer type.\n",
-    "* from a `long double` into a `double` or a `float`, unless the source is constant and its value will fit into the type of the destination\n",
-    "* from a `double` into a `float`, unless the source is constant and its value will fit in the type of the destination\n",
-    "* from an integer type to an enumerated or floating point type, unless the source is constant and its value will fit into the type of the destination\n",
-    "* from an integer type to an enumerated type or another integer type, unless the source is constant and its value will fit into the type of the destination"
+    "* from a `long double` into a `double` or a `float`, unless the source is constant and its value fits into the type of the destination.\n",
+    "* from a `double` into a `float`, unless the source is constant and its value fits in the type of the destination.\n",
+    "* from an integer type to an enumerated or floating point type, unless the source is constant and its value fits into the type of the destination.\n",
+    "* from an integer type to an enumerated type or another integer type, unless the source is constant and its value fits into the type of the destination."
    ]
   },
   {
@@ -611,9 +461,9 @@
     "### Other explicit conversions\n",
     "\n",
     "There are 3 other types of C++ conversions:\n",
-    "* const_cast, to add or remove constness to a reference or a pointer.\n",
-    "* dynamic_cast, which will be introduced when we'll deal with polymorphism.\n",
-    "* reinterpret_cast, which is a very brutal cast which changes the type into any other type, regardless of the compatibility of the two types considered. It is a dangerous one that should be considered only in very last resort (usually when interacting with a C library)."
+    "* `const_cast`, to add or remove constness to a reference or a pointer (obviously to be used with great caution!)\n",
+    "* `dynamic_cast`, which will be introduced when we'll deal with polymorphism.\n",
+    "* `reinterpret_cast`, which is a very brutal cast which changes the type into any other type, regardless of the compatibility of the two types considered. It is a dangerous one that should be considered only in very last resort (usually when interacting with a C library)."
    ]
   },
   {
@@ -635,28 +485,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_34:5:19: \u001b[0m\u001b[0;1;35mwarning: \u001b[0m\u001b[1mISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings]\u001b[0m\n",
-      "    char* salut = \"salut\";  // To avoid in C++ (see warning)\n",
-      "\u001b[0;1;32m                  ^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "String 'bonjour' is 7 characters long.\n",
-      "String 'coucou' is 6 characters long.\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "#include <cstring>  // For strlen, strcpy, strncpy\n",
@@ -665,14 +496,14 @@
     "    char bonjour[] = {'b','o','n','j','o','u','r','\\0'};\n",
     "    char coucou[] = \"coucou\";\n",
     "    char* salut = \"salut\";  // To avoid in C++ (see warning)\n",
-    "    char copie[10] = {0}; // = {'\\0','\\0','\\0','\\0','\\0','\\0','\\0','\\0','\\0','\\0'};\n",
+    "    char copy[10] = {}; // = {'\\0','\\0','\\0','\\0','\\0','\\0','\\0','\\0','\\0','\\0'};\n",
     "\n",
-    "    strcpy(copie, bonjour);\n",
-    "    std::cout << \"String '\" << copie << \"' is \" << strlen(copie) << \" characters long.\" << std::endl;\n",
+    "    strcpy(copy, bonjour);\n",
+    "    std::cout << \"String '\" << copy << \"' is \" << strlen(copy) << \" characters long.\" << std::endl;\n",
     "\n",
-    "    strncpy(copie, coucou, strlen(coucou));\n",
-    "    copie[strlen(coucou)] = '\\0';  // Don't forget to terminate the string!\n",
-    "    std::cout << \"String '\" << copie << \"' is \" << strlen(copie) << \" characters long.\" << std::endl;\n",
+    "    strncpy(copy, coucou, strlen(coucou));\n",
+    "    copy[strlen(coucou)] = '\\0';  // Don't forget to terminate the string!\n",
+    "    std::cout << \"String '\" << copy << \"' is \" << strlen(copy) << \" characters long.\" << std::endl;\n",
     "}"
    ]
   },
@@ -680,7 +511,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "There are a lot of features to work from historical strings. For more information, do not hesitate to consult [this reference page](http://www.cplusplus.com/reference/cstring/)."
+    "There are several other functions related to historical strings; for more information, do not hesitate to consult [this reference page](http://www.cplusplus.com/reference/cstring/)."
    ]
   },
   {
@@ -696,7 +527,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [
     {
@@ -721,21 +552,21 @@
     "    std::string bonjour = bonjour_str;\n",
     "    std::string salut(\"salut\");\n",
     "    std::string coucou {\"coucou\"};\n",
-    "    std::string copie {};\n",
+    "    std::string copy {};\n",
     "\n",
-    "    copie = bonjour;\n",
-    "    std::cout << \"String '\" << copie << \"' is \" << copie.length() << \" characters long.\" << std::endl;\n",
-    "    copie = coucou; // please notice affectation is much more straightforward\n",
-    "    std::cout << \"String '\" << copie << \"' is \" << copie.length() << \" characters long.\" << std::endl;\n",
+    "    copy = bonjour;\n",
+    "    std::cout << \"String '\" << copy << \"' is \" << copy.length() << \" characters long.\" << std::endl;\n",
+    "    copy = coucou; // please notice affectation is much more straightforward\n",
+    "    std::cout << \"String '\" << copy << \"' is \" << copy.length() << \" characters long.\" << std::endl;\n",
     "\n",
-    "    const char* copie_str = bonjour.data();  // Returns a classic C-string (from C++11 onward)\n",
+    "    const char* copy_str = bonjour.data();  // Returns a classic C-string (from C++11 onward)\n",
     "    const char* old_copy_str = &bonjour[0];  // Same before C++11... \n",
-    "    std::cout << \"String '\" << copie_str << \"' is \" << strlen(copie_str) << \" characters long.\" << std::endl;\n",
+    "    std::cout << \"String '\" << copy_str << \"' is \" << strlen(copy_str) << \" characters long.\" << std::endl;\n",
     "\n",
-    "    std::string dynamique {\"dynamic std::string\"};\n",
-    "    std::cout << \"String '\" << dynamique << \"' is \" << dynamique.length() << \" characters long.\" << std::endl;\n",
-    "    dynamique = \"std::string is dynamical and flexible\";\n",
-    "    std::cout << \"String '\" << dynamique << \"' is \" << dynamique.length() << \" characters long.\" << std::endl;\n",
+    "    std::string dynamic {\"dynamic std::string\"};\n",
+    "    std::cout << \"String '\" << dynamic << \"' is \" << dynamic.length() << \" characters long.\" << std::endl;\n",
+    "    dynamic = \"std::string is dynamical and flexible\";\n",
+    "    std::cout << \"String '\" << dynamic << \"' is \" << dynamic.length() << \" characters long.\" << std::endl;\n",
     "  \n",
     "}"
    ]
@@ -744,7 +575,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Please notice C++17 introduced [std::string_view](https://en.cppreference.com/w/cpp/header/string_view) which is more efficient than `std::string` for some operations; it is however out of the scope of this tutorial.\n"
+    "Please notice C++17 introduced [std::string_view](https://en.cppreference.com/w/cpp/header/string_view) which is more efficient than `std::string` for some operations; it is however out of the scope of this lecture.\n"
    ]
   },
   {
@@ -758,9 +589,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 2,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Area = 3.14159265358979\n"
+     ]
+    }
+   ],
    "source": [
     "#include <iostream>\n",
     "#include <iomanip>  // For std::setprecision\n",
@@ -778,14 +617,22 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "In more modern C++ (C++11 and above), another syntax relying on `using` keyword was introduced; it is advised to use it as this syntax is more powerful in some contexts (see later with templates...)"
+    "In more modern C++ (C++11 and above), another syntax relying on `using` keyword was introduced; it is advised to use it as this syntax is more powerful in some contexts (see later with templates...):"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 3,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Area = 3.14159274101257\n"
+     ]
+    }
+   ],
    "source": [
     "#include <iostream>\n",
     "#include <iomanip>  // For std::setprecision\n",
@@ -814,7 +661,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -837,7 +684,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [
     {
@@ -881,7 +728,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 6,
    "metadata": {
     "scrolled": true
    },
@@ -927,7 +774,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [
     {
@@ -970,7 +817,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [
     {
@@ -1008,14 +855,14 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "That is not to say `decltype` is always inferior to `auto`: there are some cases in which decltype is invaluable (especially in metaprogramming - but it's out os scope of this tutorial!). \n",
+    "That is not to say `decltype` is always inferior to `auto`: there are some cases in which decltype is invaluable (especially in metaprogramming - but it's out of the scope of this lecture!). \n",
     "\n",
     "C++ 14 introduced a new one (poorly) called `decltype(auto)` which usefulness will be explained below:"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [
     {
@@ -1062,7 +909,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": 10,
    "metadata": {},
    "outputs": [
     {
diff --git a/1-ProceduralProgramming/4-Functions.ipynb b/1-ProceduralProgramming/4-Functions.ipynb
index 4eb371dd752a95ce485ecced2aef6cf07c2624db..67bf1d7b40578e463657a32825b4157a7da54208 100644
--- a/1-ProceduralProgramming/4-Functions.ipynb
+++ b/1-ProceduralProgramming/4-Functions.ipynb
@@ -23,7 +23,7 @@
    "source": [
     "## Function definition\n",
     "\n",
-    "To be usable in a C++ instruction, a function must be __defined beforehand__. This definition includes the name and type of the arguments, the type of the return value and the instruction block that make up the function.\n",
+    "To be usable in a C++ instruction, a function must be __defined__ beforehand. This definition includes the name and type of the arguments, the type of the return value and the instruction block that make up the function.\n",
     "\n",
     "`void` is a special type to indicate a function doesn't return any value.\n",
     "\n",
@@ -146,18 +146,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Inside the function: i = 6\n",
-      "Outside the function: i = 6\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "// Please execute it only once!\n",
     "\n",
@@ -187,11 +178,11 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
-    "int compute_division(int arg1, int arg2, int& quotient, int& remainder)\n",
+    "[[nodiscard]] int compute_division(int arg1, int arg2, int& quotient, int& remainder)\n",
     "{\n",
     "    if (arg2 == 0)\n",
     "        return -1; // error code.\n",
@@ -231,7 +222,7 @@
     "\n",
     "The function above gets two outputs: the quotient and the remainder of the euclidian division. Moreover, this function returns an error code: by convention this function returns 0 when everything is alright and -1 in case of a zero divider. \n",
     "\n",
-    "Using such an error code is a very common pattern in C, that might as well be used in C++.. The issue is that it requires a lot of discipline from the user of the function: there are no actual incentive to use the return value! Just calling `compute_division()` as if it was a void function is perfectly fine (and yet completely ill-advised). We will see [later](/notebooks/5-UsefulConceptsAndSTL/1-ErrorHandling.ipynb) the `exception` mechanism C++ recommends instead of error codes.\n",
+    "Using such an error code is a very common pattern in C, that might as well be used in C++... The issue is that it requires a lot of discipline from the user of the function: there are no actual incentive to use the return value! Just calling `compute_division()` as if it was a void function is perfectly fine (and yet completely ill-advised). We will see [later](/notebooks/5-UsefulConceptsAndSTL/1-ErrorHandling.ipynb) the `exception` mechanism C++ recommends instead of error codes.\n",
     "\n",
     "Below is an example where things go awry due to the lack of check:"
    ]
@@ -268,6 +259,13 @@
     "* This something is completely out of control: quotient and remainder don't get a default value that would help to see if something is askew. The behaviour is undefined: you have no guarantee on the values the program will print (currently I see the same values as in the previous function call, but another compiler/architecture/etc... might yield another wrong value."
    ]
   },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**UPDATE:** I still do not advise to use error codes, but the [nodiscard](https://en.cppreference.com/w/cpp/language/attributes/nodiscard) attribute introduced in C++ 17 helps your compiler to warn you when the return value was left unused."
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {},
@@ -368,8 +366,7 @@
     "    {\n",
     "        return x * x;\n",
     "    };\n",
-    "    \n",
-    "    \n",
+    "       \n",
     "    std::cout << square(5) << std::endl;\n",
     "}\n"
    ]
@@ -381,7 +378,7 @@
     "Several notes:\n",
     "\n",
     "* Use `auto` as its return type; said type is not reproducible (see the _square_ and _cube_ example below).\n",
-    "* `->` that specifies the type of the returned value is optional.\n",
+    "* The symbol `->` that specifies the type of the returned value is optional.\n",
     "* Parameters come after the `[]` in parenthesis with the same syntax as ordinary functions."
    ]
   },
@@ -492,7 +489,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "It is possible to capture everything by reference by using `[&]` but it is really ill-advised; don't do this!\n",
+    "It is possible to capture everything (in the scope where the lambda is defined) by reference by using `[&]` but it is really ill-advised; don't do this!\n",
     "\n",
     "Lambda functions really shines when you want to use them in a very special context; see below an example using the sort function provided by the standard library, in which for some reasons we want to sort integers but in two blocks: first the odd numbers properly ordered and then the even numbers:"
    ]
@@ -509,18 +506,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Initial list = 3 5 2 -4 8 -17 99 15 125447 0 -1246 \n",
-      "Sorted list = -17 3 5 15 99 125447 -1246 -4 0 2 8 "
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <vector> \n",
     "#include <iostream>\n",
@@ -581,7 +569,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -595,7 +583,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -607,7 +595,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -619,18 +607,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "f(5, 6) = 30\n",
-      "f(5, 6) = 11\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "PrintFunctionCall(multiply, 5, 6);\n",
     "PrintFunctionCall(add, 5, 6);"
@@ -682,7 +661,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -714,11 +693,11 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "This behaviour is pretty similar to the often frowned-upon **macros** from C, but the use of `inline` is not considered a bad practice... provided you have in mind the ay it works:\n",
+    "This behaviour is pretty similar to the often frowned-upon **macros** from C, but the use of `inline` is not considered a bad practice... provided you have in mind the way it works:\n",
     "\n",
     "* You have probably notice the conditional in my statements regarding `inline`: the keyword is an _hint_ given to the compiler... that might be followed or not.\n",
     "* On the syntactic side, `inline` must be provided both in the declaration `and` the definition.\n",
-    "* `inline` definitions must be provided in header file (see the [upcoming notebook](/notebooks/6-InRealEnvironment/2-FileStructure.ipynb) that will deal extensively with the file structure to follow in a C++ program). You therefore pay the price in compilation time whenever you change its implementation (as we'l ss see more in detail in aforementioned notebook, modifying a header file yields more re-compilation).\n",
+    "* `inline` definitions must be provided in header file (see the [upcoming notebook](/notebooks/6-InRealEnvironment/2-FileStructure.ipynb) that will deal extensively with the file structure to follow in a C++ program). You therefore pay the price in compilation time whenever you change its implementation (as we'll see more in detail in aforementioned notebook, modifying a header file yields more re-compilation).\n",
     "* Don't bother inlining functions with any complexity whatsoever, so if your function includes a loop or is more than few lines long, write a normal function instead. \n",
     "\n",
     "The `square` example was sound: this is typically the kind of functions that might be inlined."
diff --git a/1-ProceduralProgramming/5-DynamicAllocation.ipynb b/1-ProceduralProgramming/5-DynamicAllocation.ipynb
index 1475494abbf1424c62e5f2e296c41fa259cb08f0..95a03a366ac2066c6464a4e20ec25e778fbcf1d2 100644
--- a/1-ProceduralProgramming/5-DynamicAllocation.ipynb
+++ b/1-ProceduralProgramming/5-DynamicAllocation.ipynb
@@ -23,7 +23,7 @@
    "source": [
     "## Introduction\n",
     "\n",
-    "In C++, we can finely control the life cycle of objects and manage the memory allocated to them. This is what makes it possible to create more powerful applications than with other languages, but it is also the main source of errors in the language. Pointers and dynamic memory management: watch out for danger!\n",
+    "In C++, we can finely control the life cycle of objects and manage the memory allocated to them. This is what makes it possible to create more powerful applications than with many other languages, but it is also the main source of errors in the language. Pointers and dynamic memory management: watch out for danger!\n",
     "\n",
     "## Stack\n",
     "\n",
@@ -47,8 +47,7 @@
     "    } // at the end of this block, b is released first and then a - but 99.99 % of the time you shouldn't care\n",
     "      // about that order!\n",
     "\n",
-    "    // a and b are not available here\n",
-    "    \n",
+    "    // a and b are not available here    \n",
     "}"
    ]
   },
@@ -59,8 +58,8 @@
     "There are few limitations with the stack:\n",
     "\n",
     "* The number of memory you can allocate on the stack is rather limited. On a current POSIX OS the order of magnitude is ~ 8 Mo (on Unix type `ulimit -a` in a terminal to get this information). If you allocate more you will get a **stack overflow** (and now you know why the [most popular developers forum](https://stackoverflow.com/) is named this way!)\n",
-    "* The information is very local; you can't use it elsewhere. If you pass the variable as argument in a function for instance a copy is made (or if you're using a reference or a pointer you enbe sure all is done when the block is exited!)\n",
-    "* Stack information must be known at compile time: if you're allocating an array on the stack you must know its size beforehand!"
+    "* The information is very local; you can't use it elsewhere. If you pass the variable as argument in a function for instance a copy is made (or if you're using a reference or a pointer you have to be sure all is done when the block is exited!)\n",
+    "* Stack information must be known at compile time: if you're allocating an array on the stack you must know its size beforehand."
    ]
   },
   {
@@ -80,17 +79,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "5\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -145,12 +136,13 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
     "{\n",
-    "    int* pi_first_five_digits = new int[5];\n",
+    "    const unsigned int Ndigit = 5; // not known at compile-time!\n",
+    "    int* pi_first_five_digits = new int[Ndigit];\n",
     "    \n",
     "    pi_first_five_digits[0] = 3;\n",
     "    pi_first_five_digits[1] = 1;\n",
@@ -177,7 +169,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [],
    "source": [
diff --git a/1-ProceduralProgramming/6-Streams.ipynb b/1-ProceduralProgramming/6-Streams.ipynb
index a2ad13ba3fe8f3fc541040447452920100570614..ff9874cc05884ea0a6f8d5f96a8305b2de078fc2 100644
--- a/1-ProceduralProgramming/6-Streams.ipynb
+++ b/1-ProceduralProgramming/6-Streams.ipynb
@@ -221,7 +221,7 @@
    "source": [
     "### `getline()`\n",
     "\n",
-    "When reading a file, if you want to interpret it line by line you should also consider `getline()`; this function may get a thrid argument to choose which separator to use (`\\n` by default)."
+    "When reading a file, if you want to interpret it line by line you should also consider `getline()`; this function may get a third argument to choose which separator to use (`\\n` by default)."
    ]
   },
   {
@@ -418,7 +418,7 @@
     "\n",
     "You may act upon the exact formatting of the output\n",
     "\n",
-    "I'll be honest: it's not what is the most refined tool in the C++ library, and you may long for the simplicity and power of something like Python (or even C `printf`, which is a mess under the hood...).\n",
+    "I'll be honest: it's not what is the most refined tool in the C++ library, and you may long for the simplicity and power of something like Python (or even C `printf`, which while being a mess under the hood is much simpler to use...).\n",
     "\n",
     "The difficulty is that some settings apply only to the next entry onto the stream (`width` here), while others change the behaviour permanently (until told otherwise of course, e.g. `precision` here). Here are few examples of these syntaxes:\n",
     "\n",
diff --git a/2-ObjectProgramming/1-Introduction.ipynb b/2-ObjectProgramming/1-Introduction.ipynb
index 3f02279de991809ce24bda21f1493a21a474cee3..aba0cb213f3f187e37e090046dd74d7bd14d34f4 100644
--- a/2-ObjectProgramming/1-Introduction.ipynb
+++ b/2-ObjectProgramming/1-Introduction.ipynb
@@ -33,18 +33,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "5.47723\n",
-      "4.89898\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "#include <cmath>  // For std::sqrt\n",
@@ -82,7 +73,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -112,7 +103,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -126,18 +117,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "5.47723\n",
-      "4.89898\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "double norm(Vector v)\n",
     "{\n",
@@ -169,7 +151,7 @@
     "\n",
     "Let's introduce at this point a bit of vocabulary:\n",
     "\n",
-    "- `x`, `y` and `z` in the structure are called **member variables** or **data attributes** (often shorten as **attributes** even if in a class this is actually not completely proper. On a side note: some C++ purists will be adamant only **member variables** should be used; but I rather use **data attributes** which is the term preferred in many others object programming languages.\n",
+    "- `x`, `y` and `z` in the structure are called **member variables** or **data attributes** (often shorten as **attributes** even if in a class this is actually not completely proper). On a side note: some C++ purists will be adamant only **member variables** should be used; but I rather use **data attributes** which is the term preferred in many others object programming languages.\n",
     "- `Vector` is a **struct**, which is a somewhat simplified **class** (we will explain the difference when we'll introduce classes).\n",
     "- `v1` and `v2` are **objects**.\n",
     "\n",
@@ -187,7 +169,7 @@
     "* By reference.\n",
     "* By pointers.\n",
     "\n",
-    "I didn't mention there the copy cost of a pass-by-value: copying a plain old data (POD) type such as an `int` or a `double` is actually cheap, and is recommended over a reference. But the story is not the same for an object: the cost of copying the object in the case of a pass-by-value may actually be quite high (imagine if there were an array with thousands of double values for instance) - and that's supposing the object is copyable (but we're not quite ready yet to deal with [that aspect](http://localhost:8888/notebooks/3-Operators/4-CanonicalForm.ipynb#Uncopyable-class).\n",
+    "I didn't mention there the copy cost of a pass-by-value: copying a plain old data (POD) type such as an `int` or a `double` is actually cheap, and is recommended over a reference. But the story is not the same for an object: the cost of copying the object in the case of a pass-by-value may actually be quite high (imagine if there were an array with thousands of double values for instance) - and that's supposing the object is copyable (but we're not quite ready yet to deal with [that aspect](http://localhost:8888/notebooks/3-Operators/4-CanonicalForm.ipynb#Uncopyable-class)).\n",
     "\n",
     "### Pass-by-const-reference\n",
     "\n",
@@ -196,17 +178,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "5.47723\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "double norm2(const Vector& v) // change the name to avoid ambiguity in runtime with former definition\n",
     "                              // Just for Xeus-cling: don't do that in your code!\n",
@@ -235,17 +209,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "5.47723\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "double norm(const Vector* const v) // can keep the name here: no possible ambiguity\n",
     "{\n",
@@ -271,17 +237,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "5.47723\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "double norm2(const Vector* const v)\n",
     "{\n",
@@ -309,7 +267,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -323,17 +281,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Norm = 5.47723\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    Vector v1;\n",
diff --git a/2-ObjectProgramming/3-constructors-destructor.ipynb b/2-ObjectProgramming/3-constructors-destructor.ipynb
index 6bfe40b2c9205e99f4022ebc569b01563c3cfe3b..5cb7ac333e39f66d175b9ae54fcd9ee63af90640 100644
--- a/2-ObjectProgramming/3-constructors-destructor.ipynb
+++ b/2-ObjectProgramming/3-constructors-destructor.ipynb
@@ -30,19 +30,19 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
-    "struct Vector6\n",
+    "struct Vector\n",
     "{\n",
     "    double x_;\n",
     "    double y_;    \n",
     "    double z_;\n",
     "    \n",
-    "    Vector6(); // Constructor\n",
+    "    Vector(); // Constructor\n",
     "    \n",
-    "    Vector6(double x, double y, double z); // Another constructor\n",
+    "    Vector(double x, double y, double z); // Another constructor\n",
     "    \n",
     "    double norm() const;\n",
     "};"
@@ -57,12 +57,12 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
-    "Vector6::Vector6(double x, double y, double z)\n",
-    ": x_(x), // See the syntax here: `:` to introduce data attributes initialization,,,\n",
+    "Vector::Vector(double x, double y, double z)\n",
+    ": x_(x), // See the syntax here: `:` to introduce data attributes initialization,\n",
     "y_(y), // and commas to separate the different data attributes.\n",
     "z_(z)\n",
     "{ }"
@@ -70,11 +70,11 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
-    "Vector6::Vector6()\n",
+    "Vector::Vector()\n",
     ": x_(0.), // \n",
     "y_(0.),\n",
     "z_(0.)\n",
@@ -83,11 +83,11 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
-    "double Vector6::norm() const\n",
+    "double Vector::norm() const\n",
     "{\n",
     "    return std::sqrt(x_ * x_ + y_ * y_ + z_ * z_);\n",
     "}"
@@ -95,22 +95,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "8.86792\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
     "{\n",
-    "    Vector6 v(5., 6., -4.2); // note the creation of an object with a constructor call.\n",
+    "    Vector v(5., 6., -4.2); // note the creation of an object with a constructor call.\n",
     "    std::cout << v.norm() << std::endl;\n",
     "}"
    ]
@@ -124,22 +116,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "0\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
     "{\n",
-    "    Vector6 v; // no parenthesis here!\n",
+    "    Vector v; // no parenthesis here!\n",
     "    std::cout << v.norm() << std::endl;\n",
     "}"
    ]
@@ -155,7 +139,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -166,7 +150,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -181,37 +165,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_17:1:9: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mconstructor for 'Second' must explicitly initialize the reference member 'first_'\u001b[0m\n",
-      "Second::Second(const First& first)\n",
-      "\u001b[0;1;32m        ^\n",
-      "\u001b[0m\u001b[1minput_line_16:4:18: \u001b[0m\u001b[0;1;30mnote: \u001b[0mdeclared here\u001b[0m\n",
-      "    const First& first_;\n",
-      "\u001b[0;1;32m                 ^\n",
-      "\u001b[0m\u001b[1minput_line_17:3:12: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mno viable overloaded '='\u001b[0m\n",
-      "    first_ = first; // COMPILATION ERROR: can't initialize a reference data attribute here!    \n",
-      "\u001b[0;1;32m    ~~~~~~ ^ ~~~~~\n",
-      "\u001b[0m\u001b[1minput_line_15:1:8: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function (the implicit copy assignment operator) not viable: 'this' argument has type 'const First', but method is not marked const\u001b[0m\n",
-      "struct First\n",
-      "\u001b[0;1;32m       ^\n",
-      "\u001b[0m\u001b[1minput_line_15:1:8: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function (the implicit move assignment operator) not viable: 'this' argument has type 'const First', but method is not marked const\u001b[0m\n"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "Second::Second(const First& first)\n",
     "{\n",
@@ -221,7 +177,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -244,19 +200,19 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
-    "struct Vector7\n",
+    "struct Vector2\n",
     "{\n",
     "    double x_, y_, z_;\n",
     "    \n",
-    "    Vector7();\n",
+    "    Vector2();\n",
     "    \n",
-    "    Vector7(double xyz);\n",
+    "    Vector2(double xyz);\n",
     "    \n",
-    "    Vector7(double x, double y, double z);\n",
+    "    Vector2(double x, double y, double z);\n",
     "    \n",
     "    void Print() const;\n",
     "};"
@@ -264,13 +220,13 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
-    "void Vector7::Print() const\n",
+    "void Vector2::Print() const\n",
     "{\n",
     "    std::cout << \"(x, y, z) = (\" << x_ << \", \" << y_ << \", \" << z_ << \")\" << std::endl << std::endl;\n",
     "}"
@@ -278,28 +234,28 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
-    "Vector7::Vector7()\n",
+    "Vector2::Vector2()\n",
     ": x_(-1.),\n",
     "y_(-1.),\n",
     "z_(-1.)\n",
     "{\n",
-    "    std::cout << \"Calling Vector7 constructor with no arguments.\" << std::endl;\n",
+    "    std::cout << \"Calling Vector2 constructor with no arguments.\" << std::endl;\n",
     "}"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
-    "Vector7::Vector7(double x, double y, double z)\n",
+    "Vector2::Vector2(double x, double y, double z)\n",
     ": x_(x),\n",
     "y_(y),\n",
     "z_(z)\n",
@@ -308,12 +264,12 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
-    "Vector7::Vector7(double x)\n",
-    ": Vector7() \n",
+    "Vector2::Vector2(double x)\n",
+    ": Vector2() \n",
     "{ \n",
     "    x_ = x; // As the first constructor is assumed to build fully the object, you can't assign data attributes \n",
     "            // before the body of the constructor.\n",
@@ -322,39 +278,21 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Constructor with no argument:\n",
-      "Calling Vector7 constructor with no arguments.\n",
-      "(x, y, z) = (-1, -1, -1)\n",
-      "\n",
-      "Constructor with no delegation:\n",
-      "(x, y, z) = (3, 7, 5)\n",
-      "\n",
-      "Constructor that calls a delegate constructor:\n",
-      "Calling Vector7 constructor with no arguments.\n",
-      "(x, y, z) = (3, -1, -1)\n",
-      "\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    std::cout << \"Constructor with no argument:\" << std::endl;\n",
-    "    Vector7 v1;\n",
+    "    Vector2 v1;\n",
     "    v1.Print();\n",
     "    \n",
     "    std::cout << \"Constructor with no delegation:\" << std::endl;\n",
-    "    Vector7 v2(3., 7., 5.);\n",
+    "    Vector2 v2(3., 7., 5.);\n",
     "    v2.Print();\n",
     "    \n",
     "    std::cout << \"Constructor that calls a delegate constructor:\" << std::endl;    \n",
-    "    Vector7 v3(3.);\n",
+    "    Vector2 v3(3.);\n",
     "    v3.Print();    \n",
     "}"
    ]
@@ -373,7 +311,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -383,7 +321,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -394,7 +332,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -406,7 +344,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -416,34 +354,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_31:3:33: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mno matching constructor for initialization of 'ClassWithConstructorWithArg'\u001b[0m\n",
-      "    ClassWithConstructorWithArg my_object; // COMPILATION ERROR!\n",
-      "\u001b[0;1;32m                                ^\n",
-      "\u001b[0m\u001b[1minput_line_30:1:30: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires single argument 'a', but no arguments were provided\u001b[0m\n",
-      "ClassWithConstructorWithArg::ClassWithConstructorWithArg(int a)\n",
-      "\u001b[0;1;32m                             ^\n",
-      "\u001b[0m\u001b[1minput_line_29:1:8: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 0 were provided\u001b[0m\n",
-      "struct ClassWithConstructorWithArg\n",
-      "\u001b[0;1;32m       ^\n",
-      "\u001b[0m\u001b[1minput_line_29:1:8: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor (the implicit move constructor) not viable: requires 1 argument, but 0 were provided\u001b[0m\n"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    ClassWithConstructorWithArg my_object; // COMPILATION ERROR!\n",
@@ -461,7 +374,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -475,7 +388,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -485,7 +398,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -505,7 +418,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -517,17 +430,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 26,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Undefined behaviour: no guarantee for the value of the data attribute!: 152837032\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -548,7 +453,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -564,7 +469,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -575,18 +480,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 29,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "If constructor doesn't change the value, default is used: 5\n",
-      "If constructor changes the value, choice is properly used: 10\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -605,7 +501,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Please notice doing so doesn't prevent you to use the efficient initialization of `a_` in the cnonstructor with arguments: the values thus provided in the data attributes definitions are used only in the constructor doesn't supersede them."
+    "Please notice doing so doesn't prevent you to use the efficient initialization of `a_` in the constructor with arguments: the values thus provided in the data attributes definitions are used only in the constructor doesn't supersede them."
    ]
   },
   {
@@ -622,7 +518,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 30,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -634,7 +530,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 31,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -648,18 +544,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Constructor called with argument 5\n",
-      "Constructor called with argument 7\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    ClassWithIntConstructor my_object(5);\n",
@@ -674,14 +561,14 @@
    "source": [
     "So what happens here? In fact, the compiler implicitly convert the integer read into a constructor with an integer argument...\n",
     "\n",
-    "There are situations in which this might be deemed the right thing to do (never to my mind but I guess it depends on your programming style) but more often than not it's not what is intended and a good old compiler yell would be much preferable.\n",
+    "There are situations in which this might be deemed the right thing to do (none to my mind but I guess it depends on your programming style) but more often than not it's not what is intended and a good old compiler yell would be much preferable.\n",
     "\n",
     "To do so, in C++ 11 you must stick the keyword **explicit** in the declaration in front of the constructor. Personally I tend to always provide it to my constructors, following the likewise advice by \\cite{Meyers2015}.\n"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 33,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -693,7 +580,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 34,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -707,31 +594,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 35,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_49:5:15: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mno viable overloaded '='\u001b[0m\n",
-      "    my_object = 7; // COMPILATION ERROR! YAY!\n",
-      "\u001b[0;1;32m    ~~~~~~~~~ ^ ~\n",
-      "\u001b[0m\u001b[1minput_line_46:1:8: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function (the implicit copy assignment operator) not viable: no known conversion from 'int' to 'const ClassWithExplicitIntConstructor' for 1st argument\u001b[0m\n",
-      "struct ClassWithExplicitIntConstructor\n",
-      "\u001b[0;1;32m       ^\n",
-      "\u001b[0m\u001b[1minput_line_46:1:8: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function (the implicit move assignment operator) not viable: no known conversion from 'int' to 'ClassWithExplicitIntConstructor' for 1st argument\u001b[0m\n"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    ClassWithExplicitIntConstructor my_object(5);\n",
@@ -759,7 +624,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -772,15 +637,15 @@
     "    ~Array(); // Destructor!    \n",
     "    \n",
     "    double* array_ = nullptr;\n",
-    "    const int unique_id_ = std::numeric_limits<int>::min(); // to provide absurd value if not initialized.\n",
-    "                                                        // not necessarily the best choice if const wasn't \n",
-    "                                                        // provided: unique_id_ -- would yield 0!\n",
+    "    const int unique_id_ = std::numeric_limits<int>::min(); // to provide absurd value if not initialized\n",
+    "                                                            // That can't happen here, but might if a constructor\n",
+    "                                                            // was added later on.\n",
     "};"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -793,7 +658,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -808,9 +673,20 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 5,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Memory for array 3 is properly freed here.\n",
+      "Memory for array 4 is properly freed here.\n",
+      "Memory for array 2 is properly freed here.\n",
+      "Memory for array 1 is properly freed here.\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    Array array1(1, 5ul);\n",
@@ -856,6 +732,13 @@
     "}"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This is however a matter of personal taste; see for instance [this post from FluentCpp](https://www.fluentcpp.com/2019/04/23/the-rule-of-zero-zero-constructor-zero-calorie) for the opposite advice of not defining explicitly default constructor / destructor if you don't have to."
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {},
diff --git a/2-ObjectProgramming/4-encapsulation.ipynb b/2-ObjectProgramming/4-encapsulation.ipynb
index 94b92d3e571c8498fe4d69fb6bc50516cd315805..73a7e9f76919d44db420a17c56550ca97a7e641b 100644
--- a/2-ObjectProgramming/4-encapsulation.ipynb
+++ b/2-ObjectProgramming/4-encapsulation.ipynb
@@ -28,7 +28,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -40,7 +40,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -54,31 +54,11 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_10:3:16: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mcalling a private constructor of class 'FirstClass'\u001b[0m\n",
-      "    FirstClass object; // COMPILATION ERROR!\n",
-      "\u001b[0;1;32m               ^\n",
-      "\u001b[0m\u001b[1minput_line_7:3:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mimplicitly declared private here\u001b[0m\n",
-      "    FirstClass();\n",
-      "\u001b[0;1;32m    ^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [],
    "source": [
     "{\n",
     "    FirstClass object; // COMPILATION ERROR!\n",
@@ -101,7 +81,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -125,7 +105,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -137,7 +117,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -151,7 +131,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -163,7 +143,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [
     {
@@ -183,17 +163,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[1minput_line_17:4:12: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1m'SetValue' is a private member of 'SecondClass'\u001b[0m\n",
+      "\u001b[1minput_line_13:4:12: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1m'SetValue' is a private member of 'SecondClass'\u001b[0m\n",
       "    object.SetValue(7); // COMPILATION ERROR: trying to call publicly a private method\n",
       "\u001b[0;1;32m           ^\n",
-      "\u001b[0m\u001b[1minput_line_11:11:14: \u001b[0m\u001b[0;1;30mnote: \u001b[0mdeclared private here\u001b[0m\n",
+      "\u001b[0m\u001b[1minput_line_7:11:14: \u001b[0m\u001b[0;1;30mnote: \u001b[0mdeclared private here\u001b[0m\n",
       "        void SetValue(int a);\n",
       "\u001b[0;1;32m             ^\n",
       "\u001b[0m"
@@ -232,7 +212,7 @@
     "* A `struct` assumes implicitly attributes are public if nothing is specified.\n",
     "* A `class` assumes implicitly attributes are private if nothing is specified.\n",
     "\n",
-    "I would advise personally to use classes and specify explicitly the sections (as we shall see very soon it is advised to get at least some private parts) but you now understand why we stick with structs in the former chapters: it allowed not to meddle what was explained with the public/private concerns.\n",
+    "I would advise personally to use classes and specify explicitly the sections (as we shall see very soon it is advised to get at least some private parts) but you now understand why we stick with structs in the former chapters: it allowed not to meddle with public/private concerns.\n",
     "\n",
     "\n",
     "## Why encapsulation?\n",
@@ -242,7 +222,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -260,7 +240,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -273,9 +253,31 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 10,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1minput_line_19:1:17: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mredefinition of 'Print'\u001b[0m\n",
+      "void Rectangle::Print() const\n",
+      "\u001b[0;1;32m                ^\n",
+      "\u001b[0m\u001b[1minput_line_17:1:17: \u001b[0m\u001b[0;1;30mnote: \u001b[0mprevious definition is here\u001b[0m\n",
+      "void Rectangle::Print() const\n",
+      "\u001b[0;1;32m                ^\n",
+      "\u001b[0m"
+     ]
+    },
+    {
+     "ename": "Interpreter Error",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "Interpreter Error: "
+     ]
+    }
+   ],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -287,7 +289,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [
     {
@@ -317,7 +319,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -338,7 +340,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -351,7 +353,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -365,17 +367,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 15,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[1minput_line_27:5:10: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1m'length_' is a private member of 'MoreSecureRectangle'\u001b[0m\n",
+      "\u001b[1minput_line_25:5:10: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1m'length_' is a private member of 'MoreSecureRectangle'\u001b[0m\n",
       "    rect.length_ = 0.; // can't do that!   \n",
       "\u001b[0;1;32m         ^\n",
-      "\u001b[0m\u001b[1minput_line_23:9:16: \u001b[0m\u001b[0;1;30mnote: \u001b[0mdeclared private here\u001b[0m\n",
+      "\u001b[0m\u001b[1minput_line_21:9:16: \u001b[0m\u001b[0;1;30mnote: \u001b[0mdeclared private here\u001b[0m\n",
       "        double length_;\n",
       "\u001b[0;1;32m               ^\n",
       "\u001b[0m"
@@ -407,7 +409,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 16,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -431,7 +433,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 17,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -444,7 +446,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 18,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -458,7 +460,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 19,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -471,7 +473,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 20,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -484,7 +486,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 21,
    "metadata": {},
    "outputs": [
     {
@@ -528,7 +530,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": 22,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -555,7 +557,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": 23,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -567,7 +569,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 26,
+   "execution_count": 24,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -579,7 +581,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
+   "execution_count": 25,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -591,7 +593,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": 26,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -603,7 +605,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 29,
+   "execution_count": 27,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -615,7 +617,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 30,
+   "execution_count": 28,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -627,7 +629,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 31,
+   "execution_count": 29,
    "metadata": {},
    "outputs": [
     {
@@ -663,7 +665,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
+   "execution_count": 30,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -698,7 +700,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 33,
+   "execution_count": 31,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -710,7 +712,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 34,
+   "execution_count": 32,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -724,7 +726,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 35,
+   "execution_count": 33,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -736,7 +738,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 36,
+   "execution_count": 34,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -749,7 +751,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 37,
+   "execution_count": 35,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -762,7 +764,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 39,
+   "execution_count": 36,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -776,16 +778,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 40,
+   "execution_count": 37,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Areais 12\n",
-      "Areais 32\n",
-      "Areais 16\n"
+      "Area is 12\n",
+      "Area is 32\n",
+      "Area is 16\n"
      ]
     }
    ],
@@ -808,9 +810,9 @@
    "source": [
     "It's clear that `SetArea()` has no business being called publicly: this member function is introduced here to update the area each time a dimension has changed, but it is assumed to be called with very specific arguments (the data attributes).\n",
     "\n",
-    "A end-user of the class doesn't in fact even need to know there is such a method: for his purpose being able to change one dimension and to get the area is all that matters for him.\n",
+    "A end-user of the class doesn't in fact even need to know there is such a method: for his purpose being able to change one dimension and to get the correct area is all that matters for him.\n",
     "\n",
-    "This rather dumb example illustrates the interest of a mutator: when `SetWidth()` or `SetLength()` are called, the value is assigned AND another operation is also performed. If when extending a class you need another operations you didn't think of in the first place (imagine for instance you need for some reason to know how many times the length was modified) you have just to modify the code in one place: the definition of the mutator (plus defining a new data attribute to store this quantity and initializing it properly). If you didn't use a mutator, you would end-up search the code for all the locations the data attributes is modified and pray you didn't miss one..."
+    "This rather dumb example illustrates the interest of a mutator: when `SetWidth()` or `SetLength()` are called, the value is assigned **and** another operation is also performed. If when extending a class you need another operations you didn't think of in the first place (imagine for instance you need for some reason to know how many times the length was modified) you have just to modify the code in one place: the definition of the mutator (plus defining a new data attribute to store this quantity and initializing it properly). If you didn't use a mutator, you would end-up search the code for all the locations the data attributes is modified and pray you didn't miss one..."
    ]
   },
   {
@@ -824,7 +826,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 41,
+   "execution_count": 38,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -850,7 +852,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 42,
+   "execution_count": 39,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -863,7 +865,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 43,
+   "execution_count": 40,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -877,7 +879,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 44,
+   "execution_count": 41,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -897,7 +899,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 45,
+   "execution_count": 42,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -908,7 +910,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 46,
+   "execution_count": 43,
    "metadata": {},
    "outputs": [],
    "source": [
diff --git a/2-ObjectProgramming/5-static.ipynb b/2-ObjectProgramming/5-static.ipynb
index 4429ef498a1337b4313f85b56092b5404072dc5f..375b0b3390634f70ad352c68aace061ce0229e39 100644
--- a/2-ObjectProgramming/5-static.ipynb
+++ b/2-ObjectProgramming/5-static.ipynb
@@ -23,7 +23,7 @@
    "source": [
     "## Static in C\n",
     "\n",
-    "We haven't yeal dealt with the keyword `static`, which exists in C. \n",
+    "We haven't dealt yet with the keyword `static`, which exists in C. \n",
     "\n",
     "As the C++ concept of **static method** uses up the same keyword and is not entirely related (even if both may be intertwined as we shall see in the [last section](/notebooks/2-ObjectProgramming/5-static.ipynb#Static-order-initialization-fiasco---and-its-fix)), we shall first review the C concept before studying the C++ one.\n",
     "\n",
@@ -303,7 +303,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -322,7 +322,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -335,7 +335,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -347,7 +347,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -359,7 +359,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -371,21 +371,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "There are 0 of class Class.\n",
-      "Access by an object is still possible: 1\n",
-      "There are 1 of class Class.\n",
-      "There are 6 of class Class.\n",
-      "There are 1 of class Class.\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    Print3();\n",
diff --git a/2-ObjectProgramming/6-inheritance.ipynb b/2-ObjectProgramming/6-inheritance.ipynb
index a5174b97babdffbe9782bb92df83876cf002dd22..37a03e94b4da4440af689dd528e784da4db51855 100644
--- a/2-ObjectProgramming/6-inheritance.ipynb
+++ b/2-ObjectProgramming/6-inheritance.ipynb
@@ -25,14 +25,14 @@
     "\n",
     "Sometimes, you might want to define two types that are related: one might be an extension of the other, or they may share some similarities we would like to put in common.\n",
     "\n",
-    "Let's suppose for instance you are asked to register all vehicles owned by your company. You could define a `Bicyle`, `Scooter` and `Car` independent classes, but to then store them in a `std::vector` would be impossible. \n",
+    "Let's suppose for instance you are asked to register all vehicles owned by your company. You could define independent classes `Bicyle`, `Scooter` and `Car`, but as a result storing them in a same `std::vector` would be impossible. \n",
     "\n",
     "The idea of inheritance is to provide a **base class** from which our classes are derived:"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -50,7 +50,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -61,7 +61,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -76,7 +76,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -91,7 +91,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -102,7 +102,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -131,7 +131,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -145,7 +145,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -159,7 +159,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -173,7 +173,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 10,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -198,7 +198,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -228,7 +228,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -240,7 +240,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -252,7 +252,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -264,7 +264,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 15,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -276,7 +276,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 16,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -288,7 +288,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 17,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -302,7 +302,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 18,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -317,7 +317,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 19,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -335,7 +335,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 20,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -348,9 +348,22 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 21,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      " ==== RECTANGLE ==== \n",
+      "My rectangle gets a length of 5 and a width of 3\n",
+      "My rectangle gets a length of 2.5 and a width of 6\n",
+      " ==== SQUARE ==== \n",
+      "My rectangle gets a length of 4 and a width of 4\n",
+      "My rectangle gets a length of 2 and a width of 8\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    std::cout << \" ==== RECTANGLE ==== \" << std::endl;\n",
@@ -389,7 +402,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 22,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -404,7 +417,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 23,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -415,9 +428,40 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 24,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1minput_line_32:4:12: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1m'SetWidth' is a private member of 'Rectangle'\u001b[0m\n",
+      "    square.SetWidth(5.); // COMPILATION ERROR!\n",
+      "\u001b[0;1;32m           ^\n",
+      "\u001b[0m\u001b[1minput_line_30:1:17: \u001b[0m\u001b[0;1;30mnote: \u001b[0mconstrained by private inheritance here\u001b[0m\n",
+      "class Square2 : private Rectangle\n",
+      "\u001b[0;1;32m                ^~~~~~~~~~~~~~~~~\n",
+      "\u001b[0m\u001b[1minput_line_22:1:17: \u001b[0m\u001b[0;1;30mnote: \u001b[0mmember is declared here\u001b[0m\n",
+      "void Rectangle::SetWidth(double x)\n",
+      "\u001b[0;1;32m                ^\n",
+      "\u001b[0m\u001b[1minput_line_32:4:5: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mcannot cast 'Square2' to its private base class 'Rectangle'\u001b[0m\n",
+      "    square.SetWidth(5.); // COMPILATION ERROR!\n",
+      "\u001b[0;1;32m    ^\n",
+      "\u001b[0m\u001b[1minput_line_30:1:17: \u001b[0m\u001b[0;1;30mnote: \u001b[0mdeclared private here\u001b[0m\n",
+      "class Square2 : private Rectangle\n",
+      "\u001b[0;1;32m                ^~~~~~~~~~~~~~~~~\n",
+      "\u001b[0m"
+     ]
+    },
+    {
+     "ename": "Interpreter Error",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "Interpreter Error: "
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    Square2 square(4.);\n",
@@ -434,9 +478,31 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 25,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1minput_line_33:4:21: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mcannot cast 'Square2' to its private base class 'Rectangle'\u001b[0m\n",
+      "    ModifyRectangle(square);\n",
+      "\u001b[0;1;32m                    ^\n",
+      "\u001b[0m\u001b[1minput_line_30:1:17: \u001b[0m\u001b[0;1;30mnote: \u001b[0mdeclared private here\u001b[0m\n",
+      "class Square2 : private Rectangle\n",
+      "\u001b[0;1;32m                ^~~~~~~~~~~~~~~~~\n",
+      "\u001b[0m"
+     ]
+    },
+    {
+     "ename": "Interpreter Error",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "Interpreter Error: "
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    Square2 square(4.);\n",
@@ -455,7 +521,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 26,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -473,7 +539,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 27,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -484,7 +550,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 28,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -497,9 +563,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 29,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "My rectangle gets a length of 4 and a width of 4\n",
+      "My rectangle gets a length of 3 and a width of 3\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    Square3 square(4.);\n",
@@ -522,7 +597,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 30,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -550,7 +625,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 31,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -562,7 +637,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 32,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -574,7 +649,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 33,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -586,7 +661,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 34,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -600,7 +675,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 35,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -612,9 +687,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 36,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "My rectangle gets a length of 4 and a width of 4\n",
+      "My rectangle gets a length of 3 and a width of 3\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    Square4 square(4.);\n",
@@ -659,7 +743,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 37,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -678,7 +762,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 38,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -692,9 +776,35 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 39,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1minput_line_47:3:5: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1m'DoNothing' is a private member of 'BaseClass'\u001b[0m\n",
+      "    DoNothing()\n",
+      "\u001b[0;1;32m    ^\n",
+      "\u001b[0m\u001b[1minput_line_45:9:14: \u001b[0m\u001b[0;1;30mnote: \u001b[0mdeclared private here\u001b[0m\n",
+      "        void DoNothing() { }\n",
+      "\u001b[0;1;32m             ^\n",
+      "\u001b[0m\u001b[1minput_line_47:3:16: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mexpected ';' after expression\u001b[0m\n",
+      "    DoNothing()\n",
+      "\u001b[0;1;32m               ^\n",
+      "\u001b[0m\u001b[0;32m               ;\n",
+      "\u001b[0m"
+     ]
+    },
+    {
+     "ename": "Interpreter Error",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "Interpreter Error: "
+     ]
+    }
+   ],
    "source": [
     "DerivedClass::DerivedClass()\n",
     "{\n",
@@ -711,7 +821,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 40,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -730,7 +840,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 41,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -744,7 +854,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 42,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -785,7 +895,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 43,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -799,7 +909,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 44,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -815,7 +925,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 45,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -827,7 +937,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 46,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -843,7 +953,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 47,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -855,9 +965,28 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 48,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1minput_line_56:7:13: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mno member named 'Nwheels' in 'Vehicle2'\u001b[0m\n",
+      "    list[0].Nwheels(); // COMPILATION ERROR\n",
+      "\u001b[0;1;32m    ~~~~~~~ ^\n",
+      "\u001b[0m"
+     ]
+    },
+    {
+     "ename": "Interpreter Error",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "Interpreter Error: "
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    Bicycle2 b;\n",
@@ -879,7 +1008,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 49,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -915,7 +1044,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 50,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -927,7 +1056,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 51,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -939,7 +1068,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 52,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -951,9 +1080,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 53,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Nwheels = 0\n",
+      "Nwheels = 0\n"
+     ]
+    }
+   ],
    "source": [
     "#include <iostream>\n",
     "{\n",
@@ -993,7 +1131,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 54,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1028,7 +1166,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 55,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1040,7 +1178,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 56,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1052,7 +1190,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 57,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1078,7 +1216,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 58,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1110,9 +1248,28 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 59,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1minput_line_68:6:21: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1m'Nwhels' marked 'override' but does not override any member functions\u001b[0m\n",
+      "        virtual int Nwhels() const override; // Please notice the missing 'e', that now triggers a compilation error!\n",
+      "\u001b[0;1;32m                    ^\n",
+      "\u001b[0m"
+     ]
+    },
+    {
+     "ename": "Interpreter Error",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "Interpreter Error: "
+     ]
+    }
+   ],
    "source": [
     "class Car4_typo_override : public Vehicle4_typo\n",
     "{\n",
@@ -1133,9 +1290,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 60,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Nwheels = 0\n",
+      "Nwheels = 0\n"
+     ]
+    }
+   ],
    "source": [
     "#include <iostream>\n",
     "{\n",
@@ -1160,9 +1326,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 61,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Nwheels = 2\n",
+      "Nwheels = 4\n"
+     ]
+    }
+   ],
    "source": [
     "#include <iostream>\n",
     "{\n",
@@ -1190,9 +1365,19 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 62,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Nwheels = 2\n",
+      "Nwheels = 4\n",
+      "Nwheels = 0\n"
+     ]
+    }
+   ],
    "source": [
     "#include <iostream>\n",
     "{\n",
@@ -1224,7 +1409,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 63,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1259,7 +1444,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 64,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1271,7 +1456,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 65,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1283,9 +1468,31 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 66,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1minput_line_78:3:14: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mvariable type 'Vehicle5' is an abstract class\u001b[0m\n",
+      "    Vehicle5 v; // Compilation error: you can't instantiate an abstract class!\n",
+      "\u001b[0;1;32m             ^\n",
+      "\u001b[0m\u001b[1minput_line_75:6:21: \u001b[0m\u001b[0;1;30mnote: \u001b[0munimplemented pure virtual method 'Nwheels' in 'Vehicle5'\u001b[0m\n",
+      "        virtual int Nwheels() const = 0; // The only change from Vehicle4!\n",
+      "\u001b[0;1;32m                    ^\n",
+      "\u001b[0m"
+     ]
+    },
+    {
+     "ename": "Interpreter Error",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "Interpreter Error: "
+     ]
+    }
+   ],
    "source": [
     "{   \n",
     "    Vehicle5 v; // Compilation error: you can't instantiate an abstract class!\n",
@@ -1301,9 +1508,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 67,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Nwheels = 2\n",
+      "Nwheels = 4\n"
+     ]
+    }
+   ],
    "source": [
     "#include <iostream>\n",
     "{\n",
@@ -1337,7 +1553,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 68,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1360,7 +1576,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 69,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1372,7 +1588,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 70,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1384,9 +1600,28 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 71,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1minput_line_85:4:38: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mno member named 'GetOilType' in 'Vehicle5'\u001b[0m\n",
+      "    std::cout << \"Oil type = \" << c->GetOilType() << std::endl; // compilation error: been there before...\n",
+      "\u001b[0;1;32m                                  ~  ^\n",
+      "\u001b[0m"
+     ]
+    },
+    {
+     "ename": "Interpreter Error",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "Interpreter Error: "
+     ]
+    }
+   ],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -1407,9 +1642,22 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 72,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "IncrementalExecutor::executeFunction: symbol '_ZTV11Car5WithOil' unresolved while linking [cling interface function]!\n",
+      "You are probably missing the definition of vtable for Car5WithOil\n",
+      "Maybe you need to load the corresponding shared library?\n",
+      "IncrementalExecutor::executeFunction: symbol '_ZTI11Car5WithOil' unresolved while linking [cling interface function]!\n",
+      "You are probably missing the definition of typeinfo for Car5WithOil\n",
+      "Maybe you need to load the corresponding shared library?\n"
+     ]
+    }
+   ],
    "source": [
     "// Xeus-cling issue!\n",
     "\n",
@@ -1447,7 +1695,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 73,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1457,9 +1705,31 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 74,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1minput_line_90:1:27: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mbase 'UnderivableClass' is marked 'final'\u001b[0m\n",
+      "class ITryAnyway : public UnderivableClass\n",
+      "\u001b[0;1;32m                          ^\n",
+      "\u001b[0m\u001b[1minput_line_89:2:8: \u001b[0m\u001b[0;1;30mnote: \u001b[0m'UnderivableClass' declared here\u001b[0m\n",
+      " class UnderivableClass final\n",
+      "\u001b[0;1;32m       ^                ~~~~~\n",
+      "\u001b[0m"
+     ]
+    },
+    {
+     "ename": "Interpreter Error",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "Interpreter Error: "
+     ]
+    }
+   ],
    "source": [
     "class ITryAnyway : public UnderivableClass\n",
     "{ };"
@@ -1474,7 +1744,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 75,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1487,7 +1757,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 76,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1500,7 +1770,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 77,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1512,9 +1782,31 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 78,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1minput_line_94:3:18: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mdeclaration of 'Method1' overrides a 'final' function\u001b[0m\n",
+      "    virtual void Method1() override; // compilation error!\n",
+      "\u001b[0;1;32m                 ^\n",
+      "\u001b[0m\u001b[1minput_line_92:3:18: \u001b[0m\u001b[0;1;30mnote: \u001b[0moverridden virtual function is here\u001b[0m\n",
+      "    virtual void Method1() override final;\n",
+      "\u001b[0;1;32m                 ^\n",
+      "\u001b[0m"
+     ]
+    },
+    {
+     "ename": "Interpreter Error",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "Interpreter Error: "
+     ]
+    }
+   ],
    "source": [
     "struct DerivedClassSecondLevelIgnoreFinal : public DerivedClassFirstLevel\n",
     "{\n",
@@ -1533,7 +1825,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 79,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1547,7 +1839,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 80,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1562,7 +1854,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 81,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1574,7 +1866,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 82,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1588,7 +1880,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 83,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1600,7 +1892,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 84,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1612,9 +1904,26 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 85,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Here all should be well: \n",
+      "BaseClass3 constructor\n",
+      "DerivedClass3 constructor\n",
+      "DerivedClass3 destructor\n",
+      "BaseClass3 destructor\n",
+      "\n",
+      "But there not so much, see the missing destructor call! \n",
+      "BaseClass3 constructor\n",
+      "DerivedClass3 constructor\n",
+      "BaseClass3 destructor\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    std::cout << \"Here all should be well: \" << std::endl;\n",
@@ -1636,7 +1945,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "You can see here the derived class destructor is not call! This means if you're for instance deallocating memory in this destructor, the memory will remain unduly allocated.\n",
+    "You can see here the derived class destructor is not called! This means if you're for instance deallocating memory in this destructor, the memory will remain unduly allocated.\n",
     "\n",
     "To circumvent this, you need to declare the destructor virtual in the base class. This way, the derived destructor will be properly called.\n",
     "\n",
@@ -1656,7 +1965,7 @@
    "source": [
     "## Good practice: never call a virtual method in a constructor\n",
     "\n",
-    "A very important point: I lost time with this because I didn't read carefully enough item 9 of \\cite{Meyers2005}...\n",
+    "A very important point: I lost time years ago with this because I didn't read carefully enough item 9 of \\cite{Meyers2005}...\n",
     "\n",
     "Due to the way construction occurs, never call a virtual method in a constructor: it won't perform the dynamic binding as you would like it to.\n",
     "\n"
@@ -1664,7 +1973,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 86,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1680,7 +1989,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 87,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1694,7 +2003,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 88,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1708,7 +2017,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 89,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1720,7 +2029,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 90,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1732,9 +2041,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 91,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Hello! I'm BaseClass4\n",
+      "Hello! I'm BaseClass4\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    DerivedClass4 object; // nope by stack allocation\n",
@@ -1754,7 +2072,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 92,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1772,7 +2090,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 93,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1786,7 +2104,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 94,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1800,7 +2118,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 95,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1812,7 +2130,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 96,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1824,7 +2142,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 97,
    "metadata": {},
    "outputs": [
     {
diff --git a/3-Operators/1-Intro.ipynb b/3-Operators/1-Intro.ipynb
index 3dac8c0de93c5e91cc36974e0d85f1210bedc34f..9a1a09d15e46089073a9574f429ddac40f2f7a55 100644
--- a/3-Operators/1-Intro.ipynb
+++ b/3-Operators/1-Intro.ipynb
@@ -28,7 +28,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -55,7 +55,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -68,7 +68,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -85,7 +85,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -99,17 +99,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "(10, 10, 10)\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "{\n",
     "    Vector v1(3., 5., 7.);\n",
@@ -129,17 +121,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "10\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "{\n",
     "    double x1 = 3.;\n",
@@ -154,9 +138,9 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "C++ provides the way to mimic this behaviour with **operator overloading**. This is a very powerful conceit, but also one that should be approached wuth some care...\n",
+    "C++ provides the way to mimic this behaviour with **operator overloading**. This is a very powerful conceit, but also one that should be approached with some care...\n",
     "\n",
-    "We will see the general wao to define such an operator in this notebook and see in dedicated notebooks which are the ones specifically useful.\n",
+    "We will see the general way to define such an operator in this notebook and see in dedicated notebooks which are the ones specifically useful.\n",
     "\n",
     "## Overloading an operator\n",
     "\n",
@@ -165,7 +149,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -200,7 +184,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -213,7 +197,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -227,17 +211,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "(10, 10, 10)\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "{\n",
     "    Vector2 v1(3., 5., 7.);\n",
@@ -257,44 +233,16 @@
     "As a side note, please remark the `operator+` implementation is able to reach the private data attributes of the argument `v`; this means the private status is set **at class level** and not at object level.\n",
     "\n",
     "\n",
-    "It is actually possible to define the operator as a free function, thus providing a more symmetric implementation.\n",
+    "It is actually possible to define the operator as a free function, thus providing a more symmetric implementation:\n",
     "\n",
     "**Xeus-cling issue**: cling doesn't accept operator definition outside of class; please use [@Coliru](https://coliru.stacked-crooked.com/a/626efa4fb6a02915):"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_21:18:11: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mqualified reference to 'Vector3' is a constructor name rather than a type in this context\u001b[0m\n",
-      " Vector3::Vector3(double x, double y, double z)\n",
-      "\u001b[0;1;32m          ^\n",
-      "\u001b[0m\u001b[1minput_line_21:18:26: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mexpected '(' for function-style cast or type construction\u001b[0m\n",
-      " Vector3::Vector3(double x, double y, double z)\n",
-      "\u001b[0;1;32m                  ~~~~~~ ^\n",
-      "\u001b[0m\u001b[1minput_line_21:18:36: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mexpected '(' for function-style cast or type construction\u001b[0m\n",
-      " Vector3::Vector3(double x, double y, double z)\n",
-      "\u001b[0;1;32m                            ~~~~~~ ^\n",
-      "\u001b[0m\u001b[1minput_line_21:18:46: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mexpected '(' for function-style cast or type construction\u001b[0m\n",
-      " Vector3::Vector3(double x, double y, double z)\n",
-      "\u001b[0;1;32m                                      ~~~~~~ ^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "// Xeus-cling issue: doesn't compile!\n",
     "\n",
@@ -368,7 +316,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -454,7 +402,7 @@
     "it is indeed a shortcut to\n",
     "\n",
     "````\n",
-    "Vector4 vector_plus_5 = vector.operator*(5.);\n",
+    "Vector4 vector_plus_5 = vector.operator+(5.);\n",
     "````\n",
     "\n",
     "and the following won't compile:"
@@ -571,13 +519,14 @@
     "* The number of operators arguments\n",
     "* The precedence rules (between `+` and `*` for instance)\n",
     "\n",
-    "You can't _invent_ new operators, but only redefine operators in the following list:\n",
+    "You can't _invent_ new operators, but only redefine operators in the following list (that might be incomplete: I learnt about `\"\"` operator very recently on [this blog post](https://www.fluentcpp.com/2016/12/08/strong-types-for-strong-interfaces/)):\n",
     "\n",
     "````\n",
-    "+ - * / % ^ & | ~ !\n",
+    "+ - * / % ^ & | ~ ! \n",
     "= < > += -= *= /= %= ^= &=\n",
     "|= << >> >>= <<= == != <= >= &&\n",
     "|| ++ -- ->* , -> [] () new delete\n",
+    "\"\"\n",
     "````\n",
     "\n",
     "(plus **conversion operators** - see next section).\n",
@@ -594,7 +543,7 @@
     "Some can never be redefined:\n",
     "\n",
     "````\n",
-    "::: . .* ? ?: sizeof\n",
+    ": :: . .* ? ?: sizeof\n",
     "````\n",
     "\n",
     "\n",
@@ -605,7 +554,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -631,7 +580,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -643,7 +592,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -655,7 +604,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -667,20 +616,11 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": null,
    "metadata": {
     "scrolled": true
    },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "val as double: 2.14286\n",
-      "val as integer: 2\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
diff --git a/3-Operators/2-Comparison.ipynb b/3-Operators/2-Comparison.ipynb
index 4e383505a34528bb9ff5bbbb13833da58816415c..30b704a3594d6008f634d1aa3ef392bd571903ab 100644
--- a/3-Operators/2-Comparison.ipynb
+++ b/3-Operators/2-Comparison.ipynb
@@ -32,7 +32,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -56,14 +56,12 @@
     "};\n",
     "\n",
     "\n",
-    "\n",
     "Rational::Rational(int numerator, int denominator)\n",
     ": numerator_(numerator),\n",
     "denominator_(denominator)\n",
     "{ }\n",
     "\n",
     "\n",
-    "\n",
     "Rational::operator double() const\n",
     "{\n",
     "    return static_cast<double>(numerator_) / denominator_;\n",
@@ -74,7 +72,6 @@
     "    return static_cast<double>(lhs) < static_cast<double>(rhs);\n",
     "}\n",
     "\n",
-    "\n",
     "int main(int argc, char** argv)\n",
     "{\n",
     "    Rational r1(15, 7);\n",
@@ -110,7 +107,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -137,7 +134,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -152,7 +149,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -164,17 +161,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Are equal? : 0\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
diff --git a/3-Operators/3-Stream.ipynb b/3-Operators/3-Stream.ipynb
index c6817bcab6157633a6ac832ca8f61de041f8b492..e7402f56ecf54548f7d7adfcd1da700601e8c165 100644
--- a/3-Operators/3-Stream.ipynb
+++ b/3-Operators/3-Stream.ipynb
@@ -34,7 +34,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -58,7 +58,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -70,7 +70,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -82,7 +82,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -102,17 +102,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Rational = 22 / 7\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    Rational r(22, 7);\n",
@@ -129,17 +121,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Rationals = 22 / 7 and 84 / 9\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    \n",
@@ -154,7 +138,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "I won't demonstrate it here (partly for time, partly due to Xeus-Cling constraint) but the operator>> might be overloaded in a similar way; it might be used for instance to create an object from the data read in a file."
+    "I won't demonstrate it here (partly for time, partly due to Xeus-Cling constraint) but the operator>> might be overloaded in a similar way; it might be used for instance to create an object from data read in a file."
    ]
   },
   {
diff --git a/3-Operators/4-CanonicalForm.ipynb b/3-Operators/4-CanonicalForm.ipynb
index 89d4d67bced1ce0dd8725199495af3d33e516535..e6b2490f964f0cd593dd4fb8397e1ba53cbde3bf 100644
--- a/3-Operators/4-CanonicalForm.ipynb
+++ b/3-Operators/4-CanonicalForm.ipynb
@@ -32,7 +32,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -55,7 +55,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -68,7 +68,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -80,17 +80,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "(3, 5, 7)"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "{\n",
     "    Vector v1(3., 5., 7.);    \n",
@@ -112,7 +104,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -135,7 +127,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -150,7 +142,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -162,7 +154,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -206,7 +198,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -239,7 +231,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -254,7 +246,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -266,7 +258,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -278,18 +270,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "(3, 5, 7)\n",
-      "(3, 5, 7)"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "{\n",
     "    Vector3 v1(3., 5., 7.);    \n",
@@ -313,7 +296,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -331,7 +314,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -342,7 +325,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -354,31 +337,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_16:8:10: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mobject of type 'ClassWithRef' cannot be assigned because its copy assignment operator is implicitly deleted\u001b[0m\n",
-      "    obj2 = obj1; // COMPILATION ERROR \n",
-      "\u001b[0;1;32m         ^\n",
-      "\u001b[0m\u001b[1minput_line_13:8:14: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcopy assignment operator of 'ClassWithRef' is implicitly deleted because field 'index_' is of reference type 'int &'\u001b[0m\n",
-      "        int& index_;    \n",
-      "\u001b[0;1;32m             ^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "{\n",
     "    int a = 5;\n",
@@ -410,7 +371,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -430,7 +391,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -441,7 +402,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -537,7 +498,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -571,7 +532,7 @@
    "source": [
     "In my programs, I like to declare explicitly all of them, using `default` and `delete` to provide automatic implementation for most of them.\n",
     "\n",
-    "I admit it's a bit of boilerplate (and to be honest a script does the job for me in my project...), if you don't want to there are in fact rules that specify which of them you need to define: for instance if a class requires a user-defined destructor, a user-defined copy constructor, or a user-defined copy assignment operator, it almost certainly requires all three. See [this cppreference link](https://en.cppreference.com/w/cpp/language/rule_of_three) for more about these rules."
+    "I admit it's a bit of boilerplate (and to be honest a script does the job for me in my project...), if you don't want to there are in fact rules that specify which of them you need to define: for instance if a class requires a user-defined destructor, a user-defined copy constructor, or a user-defined copy assignment operator, it almost certainly requires all three. See [this cppreference link](https://en.cppreference.com/w/cpp/language/rule_of_three) for more about these rules and [this blog post](https://www.fluentcpp.com/2019/04/23/the-rule-of-zero-zero-constructor-zero-calorie/) for an opposite point of view."
    ]
   },
   {
diff --git a/3-Operators/5-Functors.ipynb b/3-Operators/5-Functors.ipynb
index 63a6a509711e44a6935bdbf101dae28163161863..917122fc6864c2fe0224ee3743011103b1453104 100644
--- a/3-Operators/5-Functors.ipynb
+++ b/3-Operators/5-Functors.ipynb
@@ -32,7 +32,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -41,63 +41,48 @@
     "\n",
     "    public :\n",
     "\n",
-    "        LinearFunction(double constant);\n",
+    "        LinearFunction(int constant);\n",
     "\n",
-    "        double operator()(double value)\n",
+    "        int operator()(int value)\n",
     "        {\n",
-    "            return constant_ * value; // here due to usual Xeus-cling issue with out of class definition\n",
+    "            return constant_ * value; // here due to usual Xeus-cling issue when out of class \n",
+    "                                      // definition is used for operators\n",
     "        }\n",
     "\n",
-    "  private :\n",
+    "    private :\n",
     "\n",
-    "        double constant_ = 0.;\n",
+    "        int constant_ = 0.;\n",
     "\n",
     " } ;\n"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
-    "LinearFunction::LinearFunction(double constant)\n",
+    "LinearFunction::LinearFunction(int constant)\n",
     ": constant_(constant)\n",
     "{ }"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "0\n",
-      "2\n",
-      "4\n",
-      "6\n",
-      "8\n",
-      "10\n",
-      "12\n",
-      "14\n",
-      "16\n",
-      "18\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
     "{\n",
-    "    double values[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n",
+    "    int values[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n",
     "  \n",
-    "    LinearFunction Double(2) ;\n",
+    "    LinearFunction Double(2);\n",
+    "    LinearFunction Triple(3);\n",
     "\n",
     "    for (double value : values)\n",
-    "        std::cout << Double(value) << std::endl;\n",
+    "        std::cout << value << \"\\t\" << Double(value) << \"\\t\" << Triple(value) << std::endl;\n",
     "}"
    ]
   },
@@ -109,22 +94,14 @@
     "\n",
     "## Functors in STL\n",
     "\n",
-    "STL itself defines some functors: imagine you want to sort a `std::vector` decreasingly; you can't directly put `>` as the comparison operation in sort and use the STL defined `greater`: "
+    "STL itself defines some functors: imagine you want to sort a `std::vector` decreasingly; you can't directly put `>` as the comparison operation in sort and use the STL-defined `greater`: "
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "92784 2987 275 27 12 4 -980 -988 -8323 -8936 "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <algorithm>\n",
     "#include <iostream>\n",
diff --git a/4-Templates/1-Intro.ipynb b/4-Templates/1-Intro.ipynb
index f1488c0a12c00787d4c453f39d51a2a39d672971..08a13a528e550f34fa23d1c6480ef85b89f40ba0 100644
--- a/4-Templates/1-Intro.ipynb
+++ b/4-Templates/1-Intro.ipynb
@@ -28,7 +28,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -40,7 +40,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -52,7 +52,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -64,19 +64,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "-8\n",
-      "-8\n",
-      "-8\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -100,7 +90,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -113,20 +103,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "-8\n",
-      "-8\n",
-      "-8\n",
-      "-8\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -192,31 +171,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_16:3:5: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1muse of undeclared identifier 'Convert'\u001b[0m\n",
-      "    Convert<std::string>(5); // Doesn't make sense so compiler will yell!\n",
-      "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1minput_line_16:3:24: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mexpected '(' for function-style cast or type construction\u001b[0m\n",
-      "    Convert<std::string>(5); // Doesn't make sense so compiler will yell!\n",
-      "\u001b[0;1;32m            ~~~~~~~~~~~^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <string>\n",
     "\n",
@@ -236,13 +193,12 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
     "#include <type_traits> // for std::is_arithmetic\n",
     "\n",
-    "\n",
     "template<class T>\n",
     "T Convert2(int value)\n",
     "{\n",
@@ -253,86 +209,86 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[1minput_line_18:4:5: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mstatic_assert failed \"T must be an integer or a floating point!\"\u001b[0m\n",
+      "\u001b[1minput_line_8:4:5: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mstatic_assert failed \"T must be an integer or a floating point!\"\u001b[0m\n",
       "    static_assert(std::is_arithmetic<T>(), \"T must be an integer or a floating point!\");\n",
       "\u001b[0;1;32m    ^             ~~~~~~~~~~~~~~~~~~~~~~~\n",
-      "\u001b[0m\u001b[1minput_line_20:3:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0min instantiation of function template specialization 'Convert2<std::__1::basic_string<char> >' requested here\u001b[0m\n",
-      "    Convert2<std::string>(5); // Doesn't make sense so compiler will yell!\n",
+      "\u001b[0m\u001b[1minput_line_10:3:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0min instantiation of function template specialization 'Convert2<std::__1::basic_string<char> >' requested here\u001b[0m\n",
+      "    Convert2<std::string>(5); // Doesn't make sense so compiler will yell! \n",
       "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1minput_line_18:5:12: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mno matching conversion for static_cast from 'int' to 'std::__1::basic_string<char>'\u001b[0m\n",
+      "\u001b[0m\u001b[1minput_line_8:5:12: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mno matching conversion for static_cast from 'int' to 'std::__1::basic_string<char>'\u001b[0m\n",
       "    return static_cast<T>(value);\n",
       "\u001b[0;1;32m           ^~~~~~~~~~~~~~~~~~~~~\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:786:40: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: no known conversion from 'int' to 'const std::__1::basic_string<char,\n",
-      "      std::__1::char_traits<char>, std::__1::allocator<char> >::allocator_type' (aka 'const std::__1::allocator<char>') for 1st\n",
-      "      argument\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:793:40: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: no known conversion from 'int' to 'const std::__1::basic_string<char,\n",
+      "      std::__1::char_traits<char>, std::__1::allocator<char> >::allocator_type' (aka 'const std::__1::allocator<char>') for\n",
+      "      1st argument\u001b[0m\n",
       "    _LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a)\n",
       "\u001b[0;1;32m                                       ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:793:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: no known conversion from 'int' to 'const std::__1::basic_string<char>' for 1st argument\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:800:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: no known conversion from 'int' to 'const std::__1::basic_string<char>' for 1st argument\u001b[0m\n",
       "    basic_string(const basic_string& __str);\n",
       "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:798:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: no known conversion from 'int' to 'std::__1::basic_string<char>' for 1st argument\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:805:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: no known conversion from 'int' to 'std::__1::basic_string<char>' for 1st argument\u001b[0m\n",
       "    basic_string(basic_string&& __str)\n",
       "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:811:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: no known conversion from 'int' to 'const char *' for 1st argument\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:820:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: no known conversion from 'int' to 'const char *' for 1st argument\u001b[0m\n",
       "    basic_string(const _CharT* __s) {\n",
       "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:861:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: no known conversion from 'int' to 'initializer_list<char>' for 1st argument\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:874:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: no known conversion from 'int' to 'initializer_list<char>' for 1st argument\u001b[0m\n",
       "    basic_string(initializer_list<_CharT> __il);\n",
       "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:847:18: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: requirement '__can_be_converted_to_string_view<char, char_traits<char>, int>::value' was not satisfied\n",
-      "      [with _Tp = int]\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:860:18: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: requirement '__can_be_converted_to_string_view<char, char_traits<char>, int>::value' was not\n",
+      "      satisfied [with _Tp = int]\u001b[0m\n",
       "        explicit basic_string(const _Tp& __t);\n",
       "\u001b[0;1;32m                 ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:821:9: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor template not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:832:9: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor template not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
       "        basic_string(const _CharT* __s, const _Allocator& __a);\n",
       "\u001b[0;1;32m        ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:832:9: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor template not viable: requires 3 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:845:9: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor template not viable: requires 3 arguments, but 1 was provided\u001b[0m\n",
       "        basic_string(size_type __n, _CharT __c, const _Allocator& __a);\n",
       "\u001b[0;1;32m        ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:842:9: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor template not viable: requires at least 3 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:855:9: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor template not viable: requires at least 3 arguments, but 1 was provided\u001b[0m\n",
       "        basic_string(const _Tp& __t, size_type __pos, size_type __n,\n",
       "\u001b[0;1;32m        ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:851:18: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor template not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:864:18: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor template not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
       "        explicit basic_string(const _Tp& __t, const allocator_type& __a);\n",
       "\u001b[0;1;32m                 ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:855:9: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor template not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:868:9: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor template not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
       "        basic_string(_InputIterator __first, _InputIterator __last);\n",
       "\u001b[0;1;32m        ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:858:9: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor template not viable: requires 3 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:871:9: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor template not viable: requires 3 arguments, but 1 was provided\u001b[0m\n",
       "        basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a);\n",
       "\u001b[0;1;32m        ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:783:31: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 0 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:790:31: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 0 arguments, but 1 was provided\u001b[0m\n",
       "    _LIBCPP_INLINE_VISIBILITY basic_string()\n",
       "\u001b[0;1;32m                              ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:794:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:801:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
       "    basic_string(const basic_string& __str, const allocator_type& __a);\n",
       "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:806:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:813:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
       "    basic_string(basic_string&& __str, const allocator_type& __a);\n",
       "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:824:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:835:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
       "    basic_string(const _CharT* __s, size_type __n);\n",
       "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:828:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:839:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
       "    basic_string(size_type __n, _CharT __c);\n",
       "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:863:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:876:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 2 arguments, but 1 was provided\u001b[0m\n",
       "    basic_string(initializer_list<_CharT> __il, const _Allocator& __a);\n",
       "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:826:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 3 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:837:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires 3 arguments, but 1 was provided\u001b[0m\n",
       "    basic_string(const _CharT* __s, size_type __n, const _Allocator& __a);\n",
       "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:837:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires at least 2 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:850:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires at least 2 arguments, but 1 was provided\u001b[0m\n",
       "    basic_string(const basic_string& __str, size_type __pos,\n",
       "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:834:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires at least 3 arguments, but 1 was provided\u001b[0m\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/string:847:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate constructor not viable: requires at least 3 arguments, but 1 was provided\u001b[0m\n",
       "    basic_string(const basic_string& __str, size_type __pos, size_type __n,\n",
       "\u001b[0;1;32m    ^\n",
       "\u001b[0m"
@@ -377,7 +333,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -396,7 +352,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -408,7 +364,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -421,7 +377,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [
     {
@@ -460,7 +416,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -482,7 +438,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -494,7 +450,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -514,7 +470,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 10,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -528,7 +484,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -554,7 +510,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -573,7 +529,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -587,7 +543,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -606,17 +562,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 15,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[1minput_line_34:3:13: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mtemplate argument for template type parameter must be a type\u001b[0m\n",
-      "    MyArray<5ul, 5ul> array1(2);\n",
+      "\u001b[1minput_line_24:3:13: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mtemplate argument for template type parameter must be a type\u001b[0m\n",
+      "    MyArray<5ul, 5ul> array1(2); // COMPILATION ERROR!\n",
       "\u001b[0;1;32m            ^~~\n",
-      "\u001b[0m\u001b[1minput_line_31:1:16: \u001b[0m\u001b[0;1;30mnote: \u001b[0mtemplate parameter is declared here\u001b[0m\n",
+      "\u001b[0m\u001b[1minput_line_21:1:16: \u001b[0m\u001b[0;1;30mnote: \u001b[0mtemplate parameter is declared here\u001b[0m\n",
       "template<class TypeT, std::size_t Nelts>\n",
       "\u001b[0;1;32m               ^\n",
       "\u001b[0m"
@@ -639,17 +595,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 16,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[1minput_line_35:3:18: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mtemplate argument for non-type template parameter must be an expression\u001b[0m\n",
+      "\u001b[1minput_line_25:3:18: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mtemplate argument for non-type template parameter must be an expression\u001b[0m\n",
       "    MyArray<int, int> array1(2); // COMPILATION ERROR!\n",
       "\u001b[0;1;32m                 ^~~\n",
-      "\u001b[0m\u001b[1minput_line_31:1:35: \u001b[0m\u001b[0;1;30mnote: \u001b[0mtemplate parameter is declared here\u001b[0m\n",
+      "\u001b[0m\u001b[1minput_line_21:1:35: \u001b[0m\u001b[0;1;30mnote: \u001b[0mtemplate parameter is declared here\u001b[0m\n",
       "template<class TypeT, std::size_t Nelts>\n",
       "\u001b[0;1;32m                                  ^\n",
       "\u001b[0m"
@@ -685,7 +641,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
diff --git a/4-Templates/2-Specialization.ipynb b/4-Templates/2-Specialization.ipynb
index ce4547d98873f4cf1ca34d3df5c2be462222f233..8ee7f28feb3b8c02c8aa2d0a8cc615869067e944 100644
--- a/4-Templates/2-Specialization.ipynb
+++ b/4-Templates/2-Specialization.ipynb
@@ -376,7 +376,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -392,18 +392,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Generic instantiation\n",
-      "(t^2, u^2) = (25, 49)\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    PrintSquare(5, 7.);\n",
@@ -412,28 +403,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_11:2:6: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mfunction template partial specialization is not allowed\u001b[0m\n",
-      "void PrintSquare<T, int>(T t, std::string u)\n",
-      "\u001b[0;1;32m     ^          ~~~~~~~~\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <string>\n",
     "\n",
@@ -454,7 +426,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -470,19 +442,11 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Seamingly ok function template specialization \n",
-      "(t^2, u^2) = (25, HelloHello)\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
+    "// May fail to Xeus-cling; but expected behaviour is to 'work' but not as intended...\n",
     "{\n",
     "    std::string hello(\"Hello\");\n",
     "    PrintSquare(5., hello);\n",
@@ -498,45 +462,11 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {
     "scrolled": true
    },
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_8:5:57: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1minvalid operands to binary expression ('std::__1::basic_string<char>' and 'std::__1::basic_string<char>')\u001b[0m\n",
-      "    std::cout << \"(t^2, u^2) = (\" << t * t << \", \" << u * u << \")\" << std::endl;\n",
-      "\u001b[0;1;32m                                                      ~ ^ ~\n",
-      "\u001b[0m\u001b[1minput_line_16:3:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0min instantiation of function template specialization 'PrintSquare<double, std::__1::basic_string<char> >' requested here\u001b[0m\n",
-      "    PrintSquare<double, std::string>(5., std::string(\"Hello\"));\n",
-      "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/valarray:3782:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: substitution failure [with _Expr1 = std::__1::basic_string<char>, _Expr2 =\n",
-      "      std::__1::basic_string<char>]: no member named 'value' in 'std::__1::__is_val_expr<std::__1::basic_string<char> >'\u001b[0m\n",
-      "operator*(const _Expr1& __x, const _Expr2& __y)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/valarray:3797:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: substitution failure [with _Expr = std::__1::basic_string<char>]: no member named 'value' in\n",
-      "      'std::__1::__is_val_expr<std::__1::basic_string<char> >'\u001b[0m\n",
-      "operator*(const _Expr& __x, const typename _Expr::value_type& __y)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/valarray:3813:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: substitution failure [with _Expr = std::__1::basic_string<char>]: no member named 'value' in\n",
-      "      'std::__1::__is_val_expr<std::__1::basic_string<char> >'\u001b[0m\n",
-      "operator*(const typename _Expr::value_type& __x, const _Expr& __y)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    PrintSquare<double, std::string>(5., std::string(\"Hello\"));\n",
@@ -558,7 +488,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -579,7 +509,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -600,7 +530,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -613,7 +543,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [
     {
@@ -644,7 +574,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -669,7 +599,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [
     {
@@ -698,7 +628,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -722,28 +652,28 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[1minput_line_11:12:61: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1minvalid operands to binary expression ('std::__1::basic_string<char>' and 'std::__1::basic_string<char>')\u001b[0m\n",
+      "\u001b[1minput_line_17:12:61: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1minvalid operands to binary expression ('std::__1::basic_string<char>' and 'std::__1::basic_string<char>')\u001b[0m\n",
       "        std::cout << \"(t^2, u^2) = (\" << t * t << \", \" << u * u << \")\" << std::endl;        \n",
       "\u001b[0;1;32m                                                          ~ ^ ~\n",
-      "\u001b[0m\u001b[1minput_line_12:3:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0min instantiation of function template specialization 'Print4<double, std::__1::basic_string<char> >' requested here\u001b[0m\n",
-      "    Print4<double, std::string>(5., \"Hello\");\n",
+      "\u001b[0m\u001b[1minput_line_18:3:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0min instantiation of function template specialization 'Print4<double, std::__1::basic_string<char> >' requested here\u001b[0m\n",
+      "    Print4<double, std::string>(5., \"Hello\"); // Compilation error!\n",
       "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/valarray:3782:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: requirement '__is_val_expr<basic_string<char> >::value' was not satisfied [with _Expr1 =\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/valarray:3785:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: requirement '__is_val_expr<basic_string<char> >::value' was not satisfied [with _Expr1 =\n",
       "      std::__1::basic_string<char>, _Expr2 = std::__1::basic_string<char>]\u001b[0m\n",
       "operator*(const _Expr1& __x, const _Expr2& __y)\n",
       "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/valarray:3797:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: requirement '__is_val_expr<basic_string<char> >::value' was not satisfied [with _Expr =\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/valarray:3800:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: requirement '__is_val_expr<basic_string<char> >::value' was not satisfied [with _Expr =\n",
       "      std::__1::basic_string<char>]\u001b[0m\n",
       "operator*(const _Expr& __x, const typename _Expr::value_type& __y)\n",
       "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/valarray:3813:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: requirement '__is_val_expr<basic_string<char> >::value' was not satisfied [with _Expr =\n",
+      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/valarray:3816:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: requirement '__is_val_expr<basic_string<char> >::value' was not satisfied [with _Expr =\n",
       "      std::__1::basic_string<char>]\u001b[0m\n",
       "operator*(const typename _Expr::value_type& __x, const _Expr& __y)\n",
       "\u001b[0;1;32m^\n",
diff --git a/4-Templates/3-Syntax.ipynb b/4-Templates/3-Syntax.ipynb
index 88827cc2b20840416cc242550ab34a888c33e14f..16eb07b5cb39b0679d284d60a8dc081459cd4dc1 100644
--- a/4-Templates/3-Syntax.ipynb
+++ b/4-Templates/3-Syntax.ipynb
@@ -30,7 +30,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -49,7 +49,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -67,28 +67,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_9:4:5: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1muse of undeclared identifier 'BaseMethod'\u001b[0m\n",
-      "    BaseMethod();\n",
-      "\u001b[0;1;32m    ^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "template<class T>\n",
     "void Derived<T>::DerivedMethod()\n",
@@ -108,7 +89,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -128,7 +109,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -182,29 +163,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_13:4:30: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mmissing 'typename' prior to dependent type name 'ContainerT::value_type'\u001b[0m\n",
-      "    std::cout << static_cast<ContainerT::value_type>(5) << std::endl;\n",
-      "\u001b[0;1;32m                             ^~~~~~~~~~~~~~~~~~~~~~\n",
-      "\u001b[0m\u001b[0;32m                             typename \n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -226,7 +187,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -255,7 +216,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -268,7 +229,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -283,28 +244,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_19:4:30: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mexpected expression\u001b[0m\n",
-      "    std::cout << u.PrintN<0>() << std::endl;\n",
-      "\u001b[0;1;32m                             ^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "template<class U>\n",
     "void Print(const U& u)\n",
@@ -324,7 +266,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -346,179 +288,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_20:4:15: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1minvalid operands to binary expression ('std::__1::ostream' (aka 'basic_ostream<char>') and 'void')\u001b[0m\n",
-      "    std::cout << u.template PrintN<0>() << std::endl; // Notice the template keyword!\n",
-      "\u001b[0;1;32m    ~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~\n",
-      "\u001b[0m\u001b[1minput_line_21:4:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0min instantiation of function template specialization 'Print<Foo>' requested here\u001b[0m\n",
-      "    Print(foo); // Compilation error!\n",
-      "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/type_traits:4836:3: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: no known conversion from 'std::__1::ostream' (aka 'basic_ostream<char>') to 'std::byte' for 1st\n",
-      "      argument\u001b[0m\n",
-      "  operator<< (byte  __lhs, _Integer __shift) noexcept\n",
-      "\u001b[0;1;32m  ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:194:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'std::__1::basic_ostream<char>\n",
-      "      &(*)(std::__1::basic_ostream<char> &)' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&))\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:198:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'basic_ios<std::__1::basic_ostream<char,\n",
-      "      std::__1::char_traits<char> >::char_type, std::__1::basic_ostream<char, std::__1::char_traits<char> >::traits_type>\n",
-      "      &(*)(basic_ios<std::__1::basic_ostream<char, std::__1::char_traits<char> >::char_type, std::__1::basic_ostream<char,\n",
-      "      std::__1::char_traits<char> >::traits_type> &)' (aka 'basic_ios<char, std::__1::char_traits<char> > &(*)(basic_ios<char,\n",
-      "      std::__1::char_traits<char> > &)') for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(basic_ios<char_type, traits_type>&\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:203:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'std::__1::ios_base &(*)(std::__1::ios_base &)'\n",
-      "      for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(ios_base& (*__pf)(ios_base&))\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:206:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'bool' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(bool __n);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:207:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'short' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(short __n);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:208:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'unsigned short' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(unsigned short __n);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:209:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'int' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(int __n);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:210:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'unsigned int' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(unsigned int __n);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:211:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'long' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(long __n);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:212:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'unsigned long' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(unsigned long __n);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:213:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'long long' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(long long __n);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:214:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'unsigned long long' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(unsigned long long __n);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:215:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'float' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(float __f);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:216:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'double' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(double __f);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:217:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'long double' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(long double __f);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:218:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'const void *' for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(const void* __p);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:219:20: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'basic_streambuf<std::__1::basic_ostream<char,\n",
-      "      std::__1::char_traits<char> >::char_type, std::__1::basic_ostream<char, std::__1::char_traits<char> >::traits_type> *' (aka\n",
-      "      'basic_streambuf<char, std::__1::char_traits<char> > *') for 1st argument\u001b[0m\n",
-      "    basic_ostream& operator<<(basic_streambuf<char_type, traits_type>* __sb);\n",
-      "\u001b[0;1;32m                   ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:755:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'char' for 2nd argument\u001b[0m\n",
-      "operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:788:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'char' for 2nd argument\u001b[0m\n",
-      "operator<<(basic_ostream<char, _Traits>& __os, char __c)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:795:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'signed char' for 2nd argument\u001b[0m\n",
-      "operator<<(basic_ostream<char, _Traits>& __os, signed char __c)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:802:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'unsigned char' for 2nd argument\u001b[0m\n",
-      "operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:816:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'const char *' for 2nd argument\u001b[0m\n"
-     ]
-    },
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:862:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'const char *' for 2nd argument\u001b[0m\n",
-      "operator<<(basic_ostream<char, _Traits>& __os, const char* __str)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:869:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'const signed char *' for 2nd argument\u001b[0m\n",
-      "operator<<(basic_ostream<char, _Traits>& __os, const signed char* __str)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:877:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'const unsigned char *' for 2nd argument\u001b[0m\n",
-      "operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:1061:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function not viable: cannot convert argument of incomplete type 'void' to 'const std::__1::error_code' for 2nd argument\u001b[0m\n",
-      "operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:748:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: deduced conflicting types for parameter '_CharT' ('char' vs. 'void')\u001b[0m\n",
-      "operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:809:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: could not match 'const _CharT *' against 'void'\u001b[0m\n",
-      "operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:1044:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: could not match 'basic_string<type-parameter-0-0, type-parameter-0-1, type-parameter-0-2>' against\n",
-      "      'void'\u001b[0m\n",
-      "operator<<(basic_ostream<_CharT, _Traits>& __os,\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:1088:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: could not match 'bitset<_Size>' against 'void'\u001b[0m\n",
-      "operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:1034:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: requirement '!is_lvalue_reference<basic_ostream<char> &>::value' was not satisfied [with _Stream =\n",
-      "      std::__1::basic_ostream<char> &, _Tp = void]\u001b[0m\n",
-      "operator<<(_Stream&& __os, const _Tp& __x)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:1052:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: could not match 'basic_string_view<type-parameter-0-0, type-parameter-0-1>' against 'void'\u001b[0m\n",
-      "operator<<(basic_ostream<_CharT, _Traits>& __os,\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:1069:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: could not match 'shared_ptr<type-parameter-0-2>' against 'void'\u001b[0m\n",
-      "operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/ostream:1081:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: could not match 'unique_ptr<type-parameter-0-2, type-parameter-0-3>' against 'void'\u001b[0m\n",
-      "operator<<(basic_ostream<_CharT, _Traits>& __os, unique_ptr<_Yp, _Dp> const& __p)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/valarray:4150:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: substitution failure [with _Expr1 = std::__1::basic_ostream<char>, _Expr2 = void]: no type named\n",
-      "      'value_type' in 'std::__1::basic_ostream<char>'\u001b[0m\n",
-      "operator<<(const _Expr1& __x, const _Expr2& __y)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/valarray:4165:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: substitution failure [with _Expr = std::__1::basic_ostream<char>]: no type named 'value_type' in\n",
-      "      'std::__1::basic_ostream<char>'\u001b[0m\n",
-      "operator<<(const _Expr& __x, const typename _Expr::value_type& __y)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/valarray:4181:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: substitution failure [with _Expr = void]: type 'void' cannot be used prior to '::' because it has no\n",
-      "      members\u001b[0m\n",
-      "operator<<(const typename _Expr::value_type& __x, const _Expr& __y)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/iomanip:362:1: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: could not match '__iom_t8<type-parameter-0-2>' against 'void'\u001b[0m\n",
-      "operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x)\n",
-      "\u001b[0;1;32m^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/iomanip:477:5: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: could not match '__iom_t10<type-parameter-0-0>' against 'void'\u001b[0m\n",
-      "    operator<<(basic_ostream<_Cp, _Traits>& __os, const __iom_t10<_Cp>& __x);\n",
-      "\u001b[0;1;32m    ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/iomanip:572:33: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: could not match '__quoted_output_proxy<type-parameter-0-0, type-parameter-0-2, type-parameter-0-1>'\n",
-      "      against 'void'\u001b[0m\n",
-      "basic_ostream<_CharT, _Traits>& operator<<(\n",
-      "\u001b[0;1;32m                                ^\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/iomanip:592:33: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate template ignored: could not match '__quoted_proxy<type-parameter-0-0, type-parameter-0-1, type-parameter-0-2>' against\n",
-      "      'void'\u001b[0m\n",
-      "basic_ostream<_CharT, _Traits>& operator<<(\n",
-      "\u001b[0;1;32m                                ^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    Foo foo;\n",
diff --git a/4-Templates/4-Metaprogramming.ipynb b/4-Templates/4-Metaprogramming.ipynb
index 1b0be9053420ea261cbe6b9a9c784747351465cf..2785f61b028941c756ee8fd31598d584f46dfceb 100644
--- a/4-Templates/4-Metaprogramming.ipynb
+++ b/4-Templates/4-Metaprogramming.ipynb
@@ -39,7 +39,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -58,21 +58,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "5\n",
-      "hello\n",
-      "5\n",
-      "3.2\n",
-      "-35\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -96,7 +84,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -125,7 +113,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -151,21 +139,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "5\n",
-      "hello\n",
-      "5\n",
-      "3.2\n",
-      "-35\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    std::tuple<int, std::string, double, float, long> tuple = \n",
@@ -183,7 +159,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -203,21 +179,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "5\n",
-      "hello\n",
-      "5\n",
-      "3.2\n",
-      "-35\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    std::tuple<int, std::string, double, float, long> tuple = std::make_tuple(5, \"hello\", 5., 3.2f, -35l);\n",
@@ -229,23 +193,14 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "In fact, my laziness earlier when I used a template argument rather than the exact tuple type pays now as this function may be used with any tuple (which elements define `operator<<` at least):"
+    "In fact, my laziness earlier when I used a template argument rather than the exact tuple type pays now as this function may be used with any tuple (or more precisely with any tuple for which all elements comply with `operator<<`):"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Hello\n",
-      "0x7ffee3431874\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    int a = 5;\n",
diff --git a/4-Templates/5-MoreAdvanced.ipynb b/4-Templates/5-MoreAdvanced.ipynb
index 19fc3044088a88e30dd544b0a90bcf51e68a4679..5e146e15d4ed696a4c77eb593914c8b27d588910 100644
--- a/4-Templates/5-MoreAdvanced.ipynb
+++ b/4-Templates/5-MoreAdvanced.ipynb
@@ -21,7 +21,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "We have barely scratched the surface of what can be done with templates; I will here just drop few names and a very brief explanation to allow you to dig deeper if it might seem of interest for your codes (a Google search for eitherof them will give you plenty of references)\n",
+    "We have barely scratched the surface of what can be done with templates; I will here just drop few names and a very brief explanation to allow you to dig deeper if it might seem of interest for your codes (a Google search for either of them will give you plenty of references) and also avoid you frowing upon a seemingly daunting syntax...\n",
     "\n",
     "## Curiously recurrent template pattern (CRTP)\n",
     "\n",
@@ -29,7 +29,7 @@
     "\n",
     "The idea behind it is to provide a same set of a given functionality to classes that have otherwise nothing in common.\n",
     "\n",
-    "The basic example is if you want to assign a `UniqueIdentifier` to a class of yours: the implementation would be exactly the same in each otherwise different class in which you need this:\n",
+    "The basic example is if you want to assign a unique identifier to a class of yours: the implementation would be exactly the same in each otherwise different class in which you need this:\n",
     "\n",
     "* Initializing properly this identifier at construction.\n",
     "* Check no other objects of the same class use it already.\n",
@@ -119,7 +119,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -160,9 +160,31 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 2,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1minput_line_9:2:29: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mreturn type of out-of-line definition of 'ImprovedHoldAValue::GetValue' differs from that in the declaration\u001b[0m\n",
+      "auto ImprovedHoldAValue<T>::GetValue() const\n",
+      "\u001b[0;1;32m~~~~                        ^\n",
+      "\u001b[0m\u001b[1minput_line_8:12:22: \u001b[0m\u001b[0;1;30mnote: \u001b[0mprevious declaration is here\u001b[0m\n",
+      "        return_value GetValue() const;\n",
+      "\u001b[0;1;32m        ~~~~~~~~~~~~ ^\n",
+      "\u001b[0m"
+     ]
+    },
+    {
+     "ename": "Interpreter Error",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "Interpreter Error: "
+     ]
+    }
+   ],
    "source": [
     "template<class T>\n",
     "typename ImprovedHoldAValue<T>::return_value ImprovedHoldAValue<T>::GetValue() const\n",
@@ -217,7 +239,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -228,7 +250,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -247,7 +269,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -276,7 +298,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [
     {
@@ -284,8 +306,8 @@
      "output_type": "stream",
      "text": [
       "My color is blue!\n",
-      "My color is white!\n",
-      "My color is black!\n"
+      "Current color is white!\n",
+      "Current color is black!\n"
      ]
     }
    ],
@@ -313,7 +335,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -332,14 +354,14 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "This function is atypical as it may take an arbitrary number of arguments. You can devise similar function of your own (look for `va_arg` if you insist...) but it was not recommended: under the hood it is quite messy, and limits greatly the checks your compiler may perform on your code.\n",
+    "This function is atypical as it may take an arbitrary number of arguments. You can devise similar function of your own in C (look for `va_arg` if you insist...) but it was not recommended: under the hood it is quite messy, and limits greatly the checks your compiler may perform on your code.\n",
     "\n",
     "C++ 11 introduced **variadic templates**, which provides a much neater way to provide this kind of functionality (albeit with a very tricky syntax: check all the `...` below... and it becomes worse if you need to propagate them)."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -364,7 +386,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [
     {
@@ -382,7 +404,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 10,
    "metadata": {},
    "outputs": [
     {
@@ -399,20 +421,20 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[1minput_line_25:2:2: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mno matching function for call to 'Print'\u001b[0m\n",
-      " Print();\n",
+      "\u001b[1minput_line_22:2:2: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mno matching function for call to 'Print'\u001b[0m\n",
+      " Print(); // Compilation error: no arguments isn't accepted!\n",
       "\u001b[0;1;32m ^~~~~\n",
-      "\u001b[0m\u001b[1minput_line_22:3:6: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function template not viable: requires single argument 'value', but no arguments were provided\u001b[0m\n",
+      "\u001b[0m\u001b[1minput_line_19:3:6: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function template not viable: requires single argument 'value', but no arguments were provided\u001b[0m\n",
       "void Print(T value)\n",
       "\u001b[0;1;32m     ^\n",
-      "\u001b[0m\u001b[1minput_line_22:9:6: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function template not viable: requires at least argument 'value', but no arguments were provided\u001b[0m\n",
+      "\u001b[0m\u001b[1minput_line_19:9:6: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcandidate function template not viable: requires at least argument 'value', but no arguments were provided\u001b[0m\n",
       "void Print(T value, Args... args)  // args here will be all parameters passed to the function fron the \n",
       "\u001b[0;1;32m     ^\n",
       "\u001b[0m"
@@ -442,23 +464,23 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
+    "# References\n",
     "\n",
-    "© _CNRS 2016_ - _Inria 2018-2019_   \n",
-    "_This notebook is an adaptation of a lecture prepared and redacted by David Chamont (CNRS) under the terms of the licence [Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)](http://creativecommons.org/licenses/by-nc-sa/4.0/)_  \n",
-    "_The present version has been redacted by Sébastien Gilles and Vincent Rouvreau (Inria)_"
+    "(<a id=\"cit-Alexandrescu2001\" href=\"#call-Alexandrescu2001\">Alexandrescu, 2001</a>) Andrei Alexandrescu, ``_Modern C++ Design: Generic Programming and Design Patterns applied_'', 01 2001.\n",
+    "\n",
+    "(<a id=\"cit-Meyers2015\" href=\"#call-Meyers2015\">Meyers, 2015</a>) Scott Meyers, ``_Effective modern C++: 42 specific ways to improve your use of C++11\n",
+    "               and C++14_'',  2015.  [online](http://www.worldcat.org/oclc/890021237)\n",
+    "\n"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "# References\n",
-    "\n",
-    "(<a id=\"cit-Alexandrescu2001\" href=\"#call-Alexandrescu2001\">Alexandrescu, 2001</a>) Andrei Alexandrescu, ``_Modern C++ Design: Generic Programming and Design Patterns applied_'', 01 2001.\n",
     "\n",
-    "(<a id=\"cit-Meyers2015\" href=\"#call-Meyers2015\">Meyers, 2015</a>) Scott Meyers, ``_Effective modern C++: 42 specific ways to improve your use of C++11\n",
-    "               and C++14_'',  2015.  [online](http://www.worldcat.org/oclc/890021237)\n",
-    "\n"
+    "© _CNRS 2016_ - _Inria 2018-2019_   \n",
+    "_This notebook is an adaptation of a lecture prepared and redacted by David Chamont (CNRS) under the terms of the licence [Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)](http://creativecommons.org/licenses/by-nc-sa/4.0/)_  \n",
+    "_The present version has been redacted by Sébastien Gilles and Vincent Rouvreau (Inria)_"
    ]
   }
  ],
diff --git a/5-UsefulConceptsAndSTL/1-ErrorHandling.ipynb b/5-UsefulConceptsAndSTL/1-ErrorHandling.ipynb
index 4ad6a2344a0e5f10acd9c89eda6bcdedd62dfee6..343548b101c68a82672665b79346261577e2fac9 100644
--- a/5-UsefulConceptsAndSTL/1-ErrorHandling.ipynb
+++ b/5-UsefulConceptsAndSTL/1-ErrorHandling.ipynb
@@ -23,7 +23,7 @@
    "source": [
     "## Introduction\n",
     "\n",
-    "It is very important of course to be able to track and manage as nicely as possible when something goes south in your code. We will see in this chapter the main ways to provide such assurance.\n",
+    "It is very important of course to be able to track and manage as nicely as possible when something goes south in your code. We will see in this chapter the main ways to provide such insurance.\n",
     "\n",
     "## Compiler warnings and errors\n",
     "\n",
@@ -106,7 +106,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -126,9 +126,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 2,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Valid digit is 5\n",
+      "End\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    FunctionThatExpectsSingleDigitNumber(5);\n",
@@ -138,9 +147,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 3,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "ename": "Error",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "Error: "
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    FunctionThatExpectsSingleDigitNumber(15);\n",
@@ -166,9 +184,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 4,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Error: value is bigger than 9!\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    try\n",
@@ -194,9 +220,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 5,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Gluttony case... but no object to manipulate to extract more information!\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    try\n",
@@ -227,7 +261,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -244,7 +278,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -259,7 +293,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 8,
    "metadata": {
     "scrolled": true
    },
@@ -281,9 +315,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 9,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Properly caught: Value is more than 9!\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    try\n",
@@ -303,7 +345,7 @@
    "source": [
     "The information is now in the exception object, which is much better...\n",
     "\n",
-    "Unfortunately, you are not always privy to the choice: if for instance you're using [Boost library](https://www.boost.org) the exception class they use don't inherit from `std::exception` (but some derived one such à `boost::filesystem::error` do...). In this case, make sure to foresee to catch them with a dedicated block:"
+    "Unfortunately, you are not always privy to the choice: if for instance you're using [Boost library](https://www.boost.org) the exception class they use don't inherit from `std::exception` (but some derived ones such as `boost::filesystem::error` do...). In this case, make sure to foresee to catch them with a dedicated block:"
    ]
   },
   {
@@ -397,7 +439,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 10,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -408,7 +450,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -458,6 +500,13 @@
     "}"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The latter point may however be mitigated since C++17 with the attribute [nodiscard](https://en.cppreference.com/w/cpp/language/attributes/nodiscard), which helps your compiler figure out the return value should have been checked."
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {},
diff --git a/5-UsefulConceptsAndSTL/2-RAII.ipynb b/5-UsefulConceptsAndSTL/2-RAII.ipynb
index 5a636cbc41cefc346422f69f3e40ca427c786de1..bb7fa8d6d6a0450200dba9125026d93686c21088 100644
--- a/5-UsefulConceptsAndSTL/2-RAII.ipynb
+++ b/5-UsefulConceptsAndSTL/2-RAII.ipynb
@@ -29,7 +29,7 @@
     "\n",
     "However, garbage collection, used for instance in Python and Java, is not without issues itself: the memory is not always freed as swiftly as possible, and the bookkeeping of references is not without a toll on the efficiency of the program itself.\n",
     "\n",
-    "C++ provides in fact the best of both world: a way to provide safe freeing of memory as soon as possible... provided you know how to adequately use it.\n",
+    "C++ provides in fact the best of both worlds: a way to provide safe freeing of memory as soon as possible... provided you know how to adequately use it.\n",
     "\n",
     "The **Ressource Acquisition Is Initialization** or **RAII** is the key mechanism for this: the idea is just to use an object with:\n",
     "* The constructor in charge of allocating the ressources (memory, mutexes, etc...)\n",
diff --git a/5-UsefulConceptsAndSTL/3-Containers.ipynb b/5-UsefulConceptsAndSTL/3-Containers.ipynb
index 7876efc24e9dd1762ebc98deb05630ebdd6e8b99..69a38dd732b3bf1b6ddac99a072940b6f3033ce2 100644
--- a/5-UsefulConceptsAndSTL/3-Containers.ipynb
+++ b/5-UsefulConceptsAndSTL/3-Containers.ipynb
@@ -582,17 +582,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "3 8 9 -12.3 -32.35 "
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <vector>\n",
     "#include <iostream>\n",
diff --git a/5-UsefulConceptsAndSTL/4-AssociativeContainers.ipynb b/5-UsefulConceptsAndSTL/4-AssociativeContainers.ipynb
index ea25e3544b2d73125dc19cd36687d7da24a2519c..0500ec31cc4695b312e69cc8448620b24b422c11 100644
--- a/5-UsefulConceptsAndSTL/4-AssociativeContainers.ipynb
+++ b/5-UsefulConceptsAndSTL/4-AssociativeContainers.ipynb
@@ -114,7 +114,7 @@
    "source": [
     "### Iteration\n",
     "\n",
-    "In this example, we set three people with their age. We may iterate through it; the actual storage of an item is here a `std::pair<std::string, unsigned int>`. We haven't seen `std::pair` so far, but think of it as a `std::tuple` with 2 elements 2 (it existed prior to the tuple in fact).\n",
+    "In this example, we set three people with their age. We may iterate through it; the actual storage of an item is here a `std::pair<std::string, unsigned int>`. We haven't seen `std::pair` so far, but think of it as a `std::tuple` with 2 elements (it existed prior to the tuple in fact).\n",
     "\n",
     "There are two handy attributes to access the respective first and second element: `first` and `second`."
    ]
@@ -163,7 +163,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [
     {
@@ -205,7 +205,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [
     {
@@ -253,7 +253,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [
     {
@@ -270,7 +270,7 @@
       "Alice : 25\n",
       "Bob : 22\n",
       "Charlie : 31\n",
-      "David : 44\n"
+      "Dave : 44\n"
      ]
     }
    ],
@@ -287,9 +287,9 @@
     "    };\n",
     "    \n",
     "    {\n",
-    "        auto result = age_list.insert({\"David\", 44});\n",
+    "        auto result = age_list.insert({\"Dave\", 44});\n",
     "        if (!result.second)\n",
-    "            std::cerr << \"Insertion of David failed\" << std::endl;\n",
+    "            std::cerr << \"Insertion of Dave failed\" << std::endl;\n",
     "    }\n",
     "    \n",
     "    {\n",
@@ -317,7 +317,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [
     {
@@ -365,7 +365,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [
     {
@@ -464,7 +464,7 @@
     "\n",
     "`std::set` is a special case in which you do not associate a value to the key. The interface is roughly the same.\n",
     "\n",
-    "It might be used for instance if you want to keep a list of stuff you have encountered at least once: you don't care about how many times, but you want to know if it was encountered at least once. A `std::vector` would be inappropriate: you would have to look up its content before each insertion. With a `std::set` it is already built-in the class.\n",
+    "It might be used for instance if you want to keep a list of stuff you have encountered at least once: you don't care about how many times, but you want to know if it was encountered at least once. A `std::vector` would be inappropriate: you would have to look up its whole content before each insertion. With a `std::set` it is already built-in in the class.\n",
     "\n",
     "## std::unordered_map\n",
     "\n",
diff --git a/5-UsefulConceptsAndSTL/5-MoveSemantics.ipynb b/5-UsefulConceptsAndSTL/5-MoveSemantics.ipynb
index d86cea5fb649814bea1262b7a0e20fbfb0ab77d2..c802669813d210a250e9ed1a891cb6666ebe431b 100644
--- a/5-UsefulConceptsAndSTL/5-MoveSemantics.ipynb
+++ b/5-UsefulConceptsAndSTL/5-MoveSemantics.ipynb
@@ -162,6 +162,7 @@
     "    unsigned int tmp_size = lhs.size_;\n",
     "    char* tmp_data  = lhs.data_;\n",
     "    lhs.size_ = rhs.size_;\n",
+    "    lhs.data_ = rhs.data_;\n",
     "\n",
     "    rhs.size_ = tmp_size;\n",
     "    rhs.data_ = tmp_data;\n",
@@ -218,7 +219,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "A reference can only be attached to a stable value (left value or **l-value**), which may broadly be summarized as a value which address may be taken (see \\cite{Meyers2015} on this topic - its reading is especially interesting concerning this topic that is not always handled properly elsewhere}.\n",
+    "A reference can only be attached to a stable value (left value or **l-value**), which may broadly be summarized as a value which address may be taken (see \\cite{Meyers2015} on this topic - its reading is especially interesting concerning this topic that is not always explained properly elsewhere - especially on the Web).\n",
     "\n",
     "By opposition a **r-value** is a temporary value such as a literal expression or a temporary object created by implicit conversion."
    ]
@@ -268,7 +269,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -283,17 +284,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "l- or r- value is hello\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    print_by_copy(\"hello\") ; // Ok!\n",
@@ -309,7 +302,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -321,17 +314,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "l-value is hello\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    print_by_const_ref(\"hello\") ; // Ok!\n",
@@ -512,7 +497,7 @@
    "source": [
     "{\n",
     "    std::vector<int> primes { 2, 3, 5, 7, 11, 13, 17, 19 };        \n",
-    "    print_double(std::move(primes));\n",
+    "    print_double(std::move(primes)); // strictly equivalent to the static_cast in former cell!\n",
     "}"
    ]
   },
diff --git a/5-UsefulConceptsAndSTL/6-SmartPointers.ipynb b/5-UsefulConceptsAndSTL/6-SmartPointers.ipynb
index 155844012a85d9ecb9e617b557553600ddb20060..17bc652c58c8e0f0cde55da3a6a727272f7c4ea9 100644
--- a/5-UsefulConceptsAndSTL/6-SmartPointers.ipynb
+++ b/5-UsefulConceptsAndSTL/6-SmartPointers.ipynb
@@ -43,7 +43,7 @@
     "* `*` to dereference the (now smart) pointer.\n",
     "* `->` to access an attribute of the underlying object.\n",
     "\n",
-    "Smart pointers are clearly a very good way to handle the ownership of a given object. This does not mean they supersede entirely raw pointers: raw pointers might be a good choice to pass an object as a function parameter (see the discussion for the third question in this [Herb Sutter post blog](https://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/)).\n",
+    "Smart pointers are clearly a very good way to handle the ownership of a given object. This does not mean they supersede entirely raw pointers: raw pointers might be a good choice to pass an object as a function parameter (see the discussion for the third question in this [Herb Sutter's post blog](https://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/)).\n",
     "\n",
     "The raw pointer behind a smart pointer may be accessed through the `get()` method.\n",
     "\n",
@@ -60,7 +60,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -84,31 +84,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_14:5:10: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mcall to implicitly-deleted copy constructor of 'std::__1::unique_ptr<int, std::__1::default_delete<int> >'\u001b[0m\n",
-      "    auto copy = ptr; // COMPILATION ERROR: can't be copied!    \n",
-      "\u001b[0;1;32m         ^      ~~~\n",
-      "\u001b[0m\u001b[1m/Users/Shared/Software/miniconda3/envs/cling/include/c++/v1/memory:2481:31: \u001b[0m\u001b[0;1;30mnote: \u001b[0mcopy constructor is implicitly deleted because 'unique_ptr<int, std::__1::default_delete<int> >' has a user-declared move constructor\u001b[0m\n",
-      "    _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT\n",
-      "\u001b[0;1;32m                              ^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <memory>\n",
     "\n",
@@ -121,7 +99,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -146,7 +124,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -169,7 +147,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -180,7 +158,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -192,7 +170,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -219,7 +197,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -230,7 +208,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -255,7 +233,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -269,17 +247,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "My priceless text here!\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "{\n",
     "    WithUniquePtr obj(\"My priceless text here!\");\n",
@@ -302,7 +272,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -322,7 +292,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -345,17 +315,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Nptr = 2\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -377,7 +339,7 @@
     "\n",
     "`shared_ptr` are clearly useful, but you should always wonder first if you really need them: for most uses a `unique_ptr` eventually seconded by raw pointers extracted by `get()` is enough.\n",
     "\n",
-    "There is also a risk of not releasing properly the memory is there is a circular dependancy between two `shared_ptr`. A variation of this pointer named `weak_ptr` enables to circumvent this issue, but is a bit tedious to put in motion. I have written in [appendix](/notebooks/7-Appendix/WeakPtr.ipynb) how to do so.\n",
+    "There is also a risk of not releasing properly the memory is there is a circular dependancy between two `shared_ptr`. A variation of this pointer named `weak_ptr` enables to circumvent this issue, but is a bit tedious to put into motion. I have written in [appendix](/notebooks/7-Appendix/WeakPtr.ipynb) to describe how to do so.\n",
     "\n"
    ]
   },
diff --git a/5-UsefulConceptsAndSTL/7-Algorithms.ipynb b/5-UsefulConceptsAndSTL/7-Algorithms.ipynb
index e83e9d6a6809abe84644840d621098059c1eb07a..e35e565c01e540fd920361c8382a626691d9362d 100644
--- a/5-UsefulConceptsAndSTL/7-Algorithms.ipynb
+++ b/5-UsefulConceptsAndSTL/7-Algorithms.ipynb
@@ -33,25 +33,16 @@
     "\n",
     "We won't obviously list them all here - the mighty \\cite{Josuttis2012} which is more than 1000 pages long don't do it either! - but show few examples on how to use them. For instance, many STL algorithms rely upon iterators: this way a same algorithm may be used as well on `std::vector`, `std::list`, and so on...\n",
     "\n",
-    "A side note: if a STL class provides a method which as a namesake algorithm, use the method. For instance there is a `std::sort` algorithm, but `std::list` provides a method which takes advantage on the underlying structure of the object and is therefore more efficient.\n",
+    "A side note: if a STL class provides a method which as a namesake algorithm, use the method. For instance there is a `std::sort` algorithm, but `std::list` provides a method which takes advantage on the underlying structure of the object and is therefore much more efficient.\n",
     "\n",
     "## Example: `std::sort`\n"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "-21 -9 0 11 87 100 \n",
-      "100 87 11 0 -9 -21 \n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <algorithm>\n",
     "#include <vector>\n",
@@ -86,17 +77,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "0 100 -21 -9 11 87 \n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <algorithm>\n",
     "#include <vector>\n",
@@ -137,17 +120,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "-9 0 11 87 -21 100 \n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <algorithm>\n",
     "#include <vector>\n",
@@ -179,17 +154,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Found at position 4\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <vector>\n",
     "#include <algorithm>\n",
@@ -217,17 +184,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "There are 3 instances of -21.\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <vector>\n",
     "#include <algorithm>\n",
@@ -251,17 +210,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "There are 2 even values in the list.\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <vector>\n",
     "#include <algorithm>\n",
@@ -324,17 +275,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "The odd values are: -9 87 11 -21 -21 17 -21 "
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <vector>\n",
     "#include <algorithm>\n",
@@ -400,17 +343,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "The unique values are (or not...): -9 87 11 0 -21 100 -21 17 -21 \n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <vector>\n",
     "#include <algorithm>\n",
@@ -441,17 +376,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "The unique values are (really this time): -21 -9 0 11 17 87 100 87 100 \n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <vector>\n",
     "#include <algorithm>\n",
@@ -488,17 +415,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "The even values are (or not...): 0 100 11 0 -21 100 -21 17 -21 \n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <vector>\n",
     "#include <algorithm>\n",
@@ -539,18 +458,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "The even values are: 0 100 \n",
-      "But the size of the vector is still 9\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <vector>\n",
     "#include <algorithm>\n",
@@ -584,18 +494,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "The even values are: 0 100 \n",
-      "And the size of the vector is correctly 2\n"
-     ]
-    }
-   ],
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "#include <vector>\n",
     "#include <algorithm>\n",
diff --git a/6-InRealEnvironment/1-SetUpEnvironment.ipynb b/6-InRealEnvironment/1-SetUpEnvironment.ipynb
index 1d15e1f065ec3a04945af061c3c330a7c8c94200..cdbd638bdfaf2fbee268a71b311aff569234afc4 100644
--- a/6-InRealEnvironment/1-SetUpEnvironment.ipynb
+++ b/6-InRealEnvironment/1-SetUpEnvironment.ipynb
@@ -194,14 +194,14 @@
     "\n",
     "From my experience, there are essentially two types of developers:\n",
     "\n",
-    "- Those that revel in using [VIM](https://en.wikipedia.org/wiki/Vim_(text_editor)) **or** [emacs](https://en.wikipedia.org/wiki/Emacs), which are lightweight editors that have been around for decades and are rather powerful once you've climbed a steep learning curve.\n",
+    "- Those that revel in using [VIM](https://en.wikipedia.org/wiki/Vim_(text_editor)) **or** [emacs](https://en.wikipedia.org/wiki/Emacs), which are lightweight editors that have been around for decades and are rather powerful once you've climbed a (very) steep learning curve.\n",
     "- Those that will like [integrated development environment](https://en.wikipedia.org/wiki/Integrated_development_environment) more, which provides more easily some facilities (that can often be configured the hard way in the aforementioned venerable text editors) but are more resource-intensive.\n",
     "\n",
     "I suggest you take whichever you're the most comfortable with and don't bother about the zealots that tell you their way is absolutely the best one. \n",
     "\n",
     "_Vim_ and _emacs_ are often either already installed or available easily with a distribution package (_apt_, _dnf_, etc...); for IDEs here are few of them:\n",
     "\n",
-    "* [Visual Studio Code](https://code.visualstudio.com/), which gained traction in last few years and is one of the most sizeable GitHub project. This is an open-source and multi-platform editor maintained by Microsoft, not to be confused with [Visual Studio](https://visualstudio.microsoft.com/?rr=https%3A%2F%2Fwww.google.com%2F) - also provided by Microsoft on Windows only with a fee.\n",
+    "* [Visual Studio Code](https://code.visualstudio.com/), which gained traction in last few years and is one of the most sizeable GitHub project. This is an open-source and multi-platform editor maintained by Microsoft, not to be confused with [Visual Studio](https://visualstudio.microsoft.com/?rr=https%3A%2F%2Fwww.google.com%2F) - also provided by Microsoft on Windows (and with a fee).\n",
     "* [CLion](https://www.jetbrains.com/clion/) by JetBrains is also a rising star in IDEs; a free version is available for academics.\n",
     "* [Eclipse CDT](https://www.eclipse.org/cdt/) and [NetBeans](https://netbeans.org/) are other IDEs with more mileage.\n",
     "* [QtCreator](https://www.qt.io/qt-features-libraries-apis-tools-and-ide) is not just for Qt edition and might be used as a C++ IDE as well.\n",
@@ -214,11 +214,11 @@
    "source": [
     "## Software configuration manager\n",
     "\n",
-    "A [software configuration manager](https://en.wikipedia.org/wiki/Software_configuration_management), sometimes abbreviated as **SCM**, is important when you're writing code that is meant to stay at least a while.\n",
+    "A [software configuration manager](https://en.wikipedia.org/wiki/Software_configuration_management), sometimes abbreviated as **SCM**, is important when you're writing code that is meant to stay at least a while (and very handy even if that is not the case).\n",
     "\n",
     "It is not useful only when you're working with someone else: if at some point you're lost in your code and don't understand why what was working perfectly few hours ago is now utterly broken it is really helpful to be able to compare what has changed since this last commit.\n",
     "\n",
-    "The most obvious choice for a SCM is [git](https://git-scm.com) which is now widely abroad. _git_ is very rich but you can already do a lot of version control with around 10 commands so the learning curve is not as steep as you may fear.\n",
+    "The most obvious choice for a SCM is [git](https://git-scm.com) which is now widely abroad and has become the _de facto_ standard. _git_ is extremely versatile but you can already do a lot of version control with around 10 commands so the learning curve is not as steep as you may fear.\n",
     "\n",
     "git is generally already installed on your system or readily available through your package manager."
    ]
diff --git a/6-InRealEnvironment/2-FileStructure.ipynb b/6-InRealEnvironment/2-FileStructure.ipynb
index 567f48095da2a79f784d5b6f9edd02a22b6c341a..98969c60de0e3b2344ca68b40e3ca2aa237e6e66 100644
--- a/6-InRealEnvironment/2-FileStructure.ipynb
+++ b/6-InRealEnvironment/2-FileStructure.ipynb
@@ -27,15 +27,15 @@
     "\n",
     "To summarize:\n",
     "\n",
-    "* An **executable** runs the content of the [`main() function`](http://localhost:8888/notebooks/1-ProceduralProgramming/4-Functions.ipynb#A-very-special-function:-main). There should be exactly one such function in all the compiled files; the file with this main must be compiled.\n",
+    "* An **executable** runs the content of the [`main() function`](http://localhost:8888/notebooks/1-ProceduralProgramming/4-Functions.ipynb#A-very-special-function:-main). There should be exactly one such function in all the compiled files; the file with this `main` must be compiled.\n",
     "* A **library** is a collection of function, classes and so on that might be used in a program. A library may be **header-only**: in this case it is just an ensemble of header files with no file compiled. In this case all the definitions must be either **inline** or **template**.\n",
     "\n",
     "### Static and shared libraries\n",
     "\n",
     "A (non header) library may be constructed as one of the following type:\n",
     "\n",
-    "* A **static** library, usually with a **.a** extension, is actually included directly into any executable that requires it. The advantage is that you just need the bare executable to run your code: the library is no longer be required at runtime. The inconvenient is that if the storage space may balloon up rather quickly: each executable will contain the whole library! \n",
-    "* A **shared** library, which extension may vary wildly from one OS to another (**.dylib**, **so**, **dll**, etc...), is on the other hand required at runtime by the executable that was built with it. The advantage is that executables are thus much smaller. They are often described on the Web as the way to go; my personal experience with them is however less rosy as each OS handles them differently (noticeably the way to indicate in which location the dynamic libraries should be looked at differ rather wildly...)\n",
+    "* A **static** library, usually with a **.a** extension, is actually included directly into any executable that requires it. The advantage is that you just need the bare executable to run your code: the library is no longer required at runtime. The inconvenient is that the storage space may balloon up rather quickly: each executable will contain the whole library! \n",
+    "* A **shared** library, which extension may vary wildly from one OS to another (**.dylib**, **.so**, **.dll**, etc...), is on the other hand required at runtime by the executable that was built with it. The advantage is that executables are thus much smaller. They are often described on the Web as the way to go; my personal experience with them is however less rosy as each OS handles them differently (noticeably the way to indicate in which location the dynamic libraries should be looked at differ rather wildly...)\n",
     "\n",
     "The best if possible is to enable generation of your library in either type... but it is a bit of work in your build system.\n",
     "\n",
@@ -52,7 +52,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -524,7 +524,7 @@
     "\n",
     "The **.hxx** is included at the end of **.hpp** file; this way:\n",
     "\n",
-    "* End-user just includes the **.hpp** files in his code; he **nevers** need to bother about including **.hxx** or not.\n",
+    "* End-user just includes the **.hpp** files in his code; he **never** needs to bother about including **.hxx** or not.\n",
     "* The **hpp** file is not too long and includes only declarations with additionally Doxygen comments to explain the API.\n",
     "\n",
     "And you may have noticed that standard library headers get no extension at all!\n"
@@ -536,7 +536,7 @@
    "source": [
     "## Why a build system: very basic CMake demonstration\n",
     "\n",
-    "Let's take back our mighty \"Hello world\" example with a slight extension: we want to query the identity of the user and print that instead. We will foolishsly add this new function in yet another file for the sake of illustration only:\n",
+    "Let's take back our mighty \"Hello world\" example with a slight extension: we want to query the identity of the user and print that instead. We will foolishly add this new function in yet another file for the sake of illustration only:\n",
     "\n"
    ]
   },
@@ -651,7 +651,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "The issue with that is that it's not robust at all: either you recompile everything all the time (and let's face it: it's tedious even with our limited number of files...) or you have to keep track of which should be recomputed. For instance if `who-are-you.hpp` is modified all source files include it and must be recompiled, but if it is `hello.hpp` `who_are_you.cpp` is not modified.\n",
+    "The issue with that is that it's not robust at all: either you recompile everything all the time (and let's face it: it's tedious even with our limited number of files...) or you have to keep track of which should be recompiled. For instance if `who-are-you.hpp` is modified all source files include it and must be recompiled, but if it is `hello.hpp` `who_are_you.cpp` is not modified.\n",
     "\n",
     "It is to handle automatically this and limit the compilation to only what is required that build systems (which we talked about briefly [here](/notebooks/6-InRealEnvironment/1-SetUpEnvironment.ipynb#Build-system)) were introduced. Let's see a brief CMake configuration file named by convention `CMakeLists.txt`:"
    ]
diff --git a/6-InRealEnvironment/3-Compilers.ipynb b/6-InRealEnvironment/3-Compilers.ipynb
index d7a9f56e05647e0304d4ad9c34a83e3dca177ceb..24d013032c6866accde2a1761bffea5a917b522b 100644
--- a/6-InRealEnvironment/3-Compilers.ipynb
+++ b/6-InRealEnvironment/3-Compilers.ipynb
@@ -29,12 +29,12 @@
     "\n",
     "So the more compiler with which you may test your code, the merrier!\n",
     "\n",
-    "If you're Inria staff, Inria also provides a licence to [Intel compiler](https://software.intel.com/en-us/c-compilers) which is famed to be really efficient on Intel architecture (and provides strong chekcs upon your code); unfortunately I never had the time to investigate it more.\n",
+    "If you're Inria staff, Inria also provides a licence to [Intel compiler](https://software.intel.com/en-us/c-compilers) which is famed to be really efficient on Intel architecture (and provides strong checks upon your code); unfortunately I never had the time to investigate it more.\n",
     "\n",
     "\n",
     "## GNU compiler \n",
     "\n",
-    "[GCC](http://gcc.gnu.org/) is a free to use compiler which is now around for a while; it is mostly for Unix systems but may be used with Windows with some additional set-up (I don't master this but see for instance this [StackOverflow question](https://stackoverflow.com/questions/771756/what-is-the-difference-between-cygwin-and-mingw).\n",
+    "[GCC](http://gcc.gnu.org/) is a free to use compiler which is now around for a while; it is mostly for Unix systems but may be used with Windows with some additional set-up (I don't master this but see for instance this [StackOverflow question](https://stackoverflow.com/questions/771756/what-is-the-difference-between-cygwin-and-mingw)).\n",
     "\n",
     "As many others softwares, GCC changed its version system: gcc 3 and 4 were there for decades, and now the versions change more swiftly, with gcc 8 the current stable version and a beta of 9 already available.\n",
     "\n",
@@ -112,7 +112,7 @@
     "\n",
     "clang provides many warnings that are the same as gcc... but:\n",
     "\n",
-    "* Some do not behave exactly the same way. For instance I activate -Wshadow in clang but not in gcc where it is too cumbersome for my taste.\n",
+    "* Some do not behave exactly the same way. For instance I activate `-Wshadow` in clang but not in gcc where it is too cumbersome for my taste.\n",
     "* Some are specific to a compiler... and it becomes truer with each new version of clang, which often introduces a new warning.\n",
     "\n",
     "But what I really like with clang is they took the opposite approach warning side: they provide a `-Weverything` which really activates all of them! (`-Wall -Wextra` are also supported but similar to gcc counterparts).\n",
@@ -139,7 +139,7 @@
     "\n",
     "### Standard library\n",
     "\n",
-    "A new implementation of the standard library is also delivered with clang; it is named **libc++**. I advise you to use ot rather than libstdc++ with clang; however it is easier said than done on Ubuntu (at least the last time I tried).\n",
+    "A new implementation of the standard library is also delivered with clang; it is named **libc++**. I advise you to use it rather than libstdc++ with clang; however it is easier said than done on Ubuntu (at least the last time I tried).\n",
     "\n",
     "To ensure that, add in your command line:\n",
     "\n",
@@ -155,7 +155,7 @@
     "\n",
     "### Apple Clang\n",
     "\n",
-    "As a side note: macOS provides for few years now a customized clang with its developer environment. This one is not the standard clang and is usually slightly older than the bleeding-edge clang you may find. The drawback is that they stopped indicating the base version upon which their version is built; so it's not that easy to find on the Web whether a feature is supported or not."
+    "As a side note: macOS provides for few years now a customized clang with its developer environment. This one is not the standard clang and is usually slightly older than the bleeding-edge clang you may find on LLVM site. The drawback is that they stopped indicating the base version upon which their version is built; so it's not that easy to find on the Web whether a feature is supported or not."
    ]
   },
   {
diff --git a/6-InRealEnvironment/4-ThirdParty.ipynb b/6-InRealEnvironment/4-ThirdParty.ipynb
index 3a90833d97f346695cbc4e8a9d01063bc4f0d2c1..a2d488e36af81daafe65f6d9cb8e89ee262e7440 100644
--- a/6-InRealEnvironment/4-ThirdParty.ipynb
+++ b/6-InRealEnvironment/4-ThirdParty.ipynb
@@ -79,7 +79,7 @@
    "source": [
     "Compiling this code with clang and `-Weverything` yields more than 1000 warnings at the time of this writing!\n",
     "\n",
-    "This example is tackled in Docker; see the [README](https://gitlab.inria.fr/formations/cpp/gettingstartedwithmoderncpp/blob/master/6-InRealEnvironment/Docker/ThirdPartyWarning/README.md) to see how to use this Dcker image which illustrates directly the methods explained below."
+    "This example is tackled in Docker; see the [README](https://gitlab.inria.fr/formations/cpp/gettingstartedwithmoderncpp/blob/master/6-InRealEnvironment/Docker/ThirdPartyWarning/README.md) to see how to use this Docker image which illustrates directly the methods explained below."
    ]
   },
   {
diff --git a/6-InRealEnvironment/5-Namespace.ipynb b/6-InRealEnvironment/5-Namespace.ipynb
index 65cffc32a38f9627f76ede3bfae647926b93e39a..4ff430b7b1567462214c3755f4d21ed045df1669 100644
--- a/6-InRealEnvironment/5-Namespace.ipynb
+++ b/6-InRealEnvironment/5-Namespace.ipynb
@@ -42,7 +42,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -51,7 +51,6 @@
     "\n",
     "namespace MyProject\n",
     "{\n",
-    "   \n",
     "    \n",
     "    void Hello();\n",
     "    \n",
@@ -60,7 +59,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -68,9 +67,7 @@
     "#include <iostream>\n",
     "\n",
     "namespace MyProject\n",
-    "{\n",
-    "   \n",
-    "    \n",
+    "{    \n",
     "    void Hello()\n",
     "    {\n",
     "        std::cout << \"Hello from MyProject namespace!\" << std::endl;\n",
@@ -83,7 +80,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "To use the `Hello` function, you need to specify the namespace explicitly with the axact same syntax already used for classes:"
+    "To use the `Hello` function, you need to specify the namespace explicitly with the exact same syntax already used for classes:"
    ]
   },
   {
@@ -122,7 +119,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -134,25 +131,41 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 7,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Hello from the global namespace!\n"
+     ]
+    }
+   ],
    "source": [
     "Hello();"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 8,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Hello from MyProject namespace!\n"
+     ]
+    }
+   ],
    "source": [
     "MyProject::Hello();"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -169,9 +182,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 10,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Hello from MyProject namespace!\n",
+      "Hello from the global namespace!\n"
+     ]
+    }
+   ],
    "source": [
     "MyProject::PrintHello();"
    ]
@@ -187,7 +209,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -203,7 +225,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -221,7 +243,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -235,7 +257,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -252,9 +274,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 15,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Do internal stuff!\n"
+     ]
+    }
+   ],
    "source": [
     "MyProject::FunctionWithUsesUpInternalStuff();"
    ]
@@ -268,7 +298,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 16,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -404,7 +434,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 17,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -420,7 +450,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 18,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -429,7 +459,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 19,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -438,18 +468,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 20,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[1minput_line_16:2:2: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1muse of undeclared identifier 'Bar'; did you mean 'Example::Bar'?\u001b[0m\n",
+      "\u001b[1minput_line_31:2:2: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1muse of undeclared identifier 'Bar'; did you mean 'Example::Bar'?\u001b[0m\n",
       " Bar(); // COMPILATION ERROR\n",
       "\u001b[0;1;32m ^~~\n",
       "\u001b[0m\u001b[0;32m Example::Bar\n",
-      "\u001b[0m\u001b[1minput_line_12:6:10: \u001b[0m\u001b[0;1;30mnote: \u001b[0m'Example::Bar' declared here\u001b[0m\n",
+      "\u001b[0m\u001b[1minput_line_28:6:10: \u001b[0m\u001b[0;1;30mnote: \u001b[0m'Example::Bar' declared here\u001b[0m\n",
       "    void Bar() {}\n",
       "\u001b[0;1;32m         ^\n",
       "\u001b[0m"
@@ -518,7 +548,8 @@
     "namespace // anonymous\n",
     "{\n",
     "    \n",
-    "    void InternalStuff(); // This function exists on\n",
+    "    void InternalStuff(); // This function exists in the cpp file but its symbol is not\n",
+    "                          // exported - exactly as C static function we saw earlier.\n",
     "    \n",
     "} // namespace anonymous"
    ]
diff --git a/6-InRealEnvironment/6-Tools.ipynb b/6-InRealEnvironment/6-Tools.ipynb
index ade0f50aceeeed477cc874a2f54e724e0a263f3e..1fcf3f9b7406351f0735c0d5a5fc99c6bc724af1 100644
--- a/6-InRealEnvironment/6-Tools.ipynb
+++ b/6-InRealEnvironment/6-Tools.ipynb
@@ -14,7 +14,7 @@
    },
    "source": [
     "<h1>Table of contents<span class=\"tocSkip\"></span></h1>\n",
-    "<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Introduction\" data-toc-modified-id=\"Introduction-1\">Introduction</a></span></li><li><span><a href=\"#Online-compilers\" data-toc-modified-id=\"Online-compilers-2\">Online compilers</a></span></li><li><span><a href=\"#Static-analyzer-tools\" data-toc-modified-id=\"Static-analyzer-tools-3\">Static analyzer tools</a></span></li><li><span><a href=\"#Valgrind\" data-toc-modified-id=\"Valgrind-4\">Valgrind</a></span></li><li><span><a href=\"#Address-sanitizer\" data-toc-modified-id=\"Address-sanitizer-5\">Address sanitizer</a></span></li><li><span><a href=\"#Sonarqube\" data-toc-modified-id=\"Sonarqube-6\">Sonarqube</a></span></li><li><span><a href=\"#Tests\" data-toc-modified-id=\"Tests-7\">Tests</a></span><ul class=\"toc-item\"><li><span><a href=\"#Boost-tests\" data-toc-modified-id=\"Boost-tests-7.1\">Boost tests</a></span></li><li><span><a href=\"#Catch2\" data-toc-modified-id=\"Catch2-7.2\">Catch2</a></span></li><li><span><a href=\"#Google-test\" data-toc-modified-id=\"Google-test-7.3\">Google test</a></span></li></ul></li><li><span><a href=\"#Build-system\" data-toc-modified-id=\"Build-system-8\">Build system</a></span></li><li><span><a href=\"#Code-formatters\" data-toc-modified-id=\"Code-formatters-9\">Code formatters</a></span></li><li><span><a href=\"#Doxygen\" data-toc-modified-id=\"Doxygen-10\">Doxygen</a></span></li></ul></div>"
+    "<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Introduction\" data-toc-modified-id=\"Introduction-1\">Introduction</a></span></li><li><span><a href=\"#Online-compilers\" data-toc-modified-id=\"Online-compilers-2\">Online compilers</a></span></li><li><span><a href=\"#Static-analyzer-tools\" data-toc-modified-id=\"Static-analyzer-tools-3\">Static analyzer tools</a></span></li><li><span><a href=\"#Valgrind\" data-toc-modified-id=\"Valgrind-4\">Valgrind</a></span></li><li><span><a href=\"#Address-sanitizer\" data-toc-modified-id=\"Address-sanitizer-5\">Address sanitizer</a></span></li><li><span><a href=\"#Sonarqube\" data-toc-modified-id=\"Sonarqube-6\">Sonarqube</a></span></li><li><span><a href=\"#Tests\" data-toc-modified-id=\"Tests-7\">Tests</a></span><ul class=\"toc-item\"><li><span><a href=\"#Boost-tests\" data-toc-modified-id=\"Boost-tests-7.1\">Boost tests</a></span></li><li><span><a href=\"#Catch2\" data-toc-modified-id=\"Catch2-7.2\">Catch2</a></span></li><li><span><a href=\"#Google-test\" data-toc-modified-id=\"Google-test-7.3\">Google test</a></span></li></ul></li><li><span><a href=\"#Build-system\" data-toc-modified-id=\"Build-system-8\">Build system</a></span></li><li><span><a href=\"#Code-formatters\" data-toc-modified-id=\"Code-formatters-9\">Code formatters</a></span></li><li><span><a href=\"#Doxygen\" data-toc-modified-id=\"Doxygen-10\">Doxygen</a></span></li><li><span><a href=\"#More...\" data-toc-modified-id=\"More...-11\">More...</a></span></li></ul></div>"
    ]
   },
   {
@@ -49,7 +49,7 @@
     "\n",
     "[Valgrind](valgrind.org/) is mostly known as a leak checker, but is really a jack-of-all-trade tool; callgrind for instance may be used to profile your code and see where most of the computation time is spent. Some lesser-known tools are also incredibly useful: [Verrou](https://github.com/edf-hpc/verrou) for instance, developed at EDF, is a floating-point checker which helps you figure out if at some point some of your computations might be skewed by the way the computer approximates the real numbers.\n",
     "\n",
-    "Unfortunately, macOS support is scarse: sometimes they plainly say it is not up-to-date, but even they say ot works the outputs were never satisfactory for me. So even if I develop mostly in macOS I always fire up valgrind in a Linux environment.\n",
+    "Unfortunately, macOS support is scarse: sometimes they plainly say it is not up-to-date, but even when they say it works the outputs were never satisfactory for me (always check `valgrind ls` first as they recommend on their website...). So even if I develop mostly in macOS I always fire up valgrind in a Linux environment.\n",
     "\n",
     "## Address sanitizer\n",
     "\n",
@@ -75,7 +75,8 @@
     "\n",
     "### Catch2\n",
     "\n",
-    "[Catch2](https://github.com/catchorg/Catch2) is a more recent test facility which is aimed at being user-friendly. I'm using it but currently regret they do not for the time being provide a test to check a test ends-up with an abortion, which is something Boost Test is able to do. So even if I'm happy enough with it not to rewrite my tests in Boost Test I would recommend Boost over it for now.\n",
+    "[Catch2](https://github.com/catchorg/Catch2) is a more recent test facility which is aimed at being user-friendly.\n",
+    "\n",
     "\n",
     "### Google test\n",
     "\n",
@@ -93,7 +94,7 @@
     "\n",
     "I can mention [Uncrustify](http://uncrustify.sourceforge.net/): plenty of options to configure, even if they're not easy to figure out.\n",
     "\n",
-    "[clang-format](https://clang.llvm.org/docs/ClangFormat.html) probably provides a better trade-off power/complexity but requires clang to be installed on your system.\n",
+    "[clang-format](https://clang.llvm.org/docs/ClangFormat.html) probably provides a better trade-off power/complexity but requires LLVM clang to be installed on your system (AppleClang won't do).\n",
     "\n",
     "\n",
     "## Doxygen\n",
@@ -107,14 +108,15 @@
     "* No parallelism in some steps.\n",
     "* Everything is redone at each Doxygen call.\n",
     "\n",
-    "So expect for important projects the time to generate Doxygen documentation to be bigger than compilation time.\n",
+    "So expect for important projects the time to generate Doxygen documentation to be bigger than compilation time. \n",
     "\n",
+    "I have observed Doxygen is not very efficient on macOS for sizeable projects: time is much more important than the one observed in Alpine Docker images...\n",
     "\n",
-    "## More...\n",
     "\n",
-    "Our colleagues at Inria Bordeaux also recommend some additional tools in the SonarQ\n",
+    "## More...\n",
     "\n",
-    "https://sonarqube.bordeaux.inria.fr/pages/documentation.html#orgd4ab5b1\n",
+    "Our colleagues at Inria Bordeaux also recommend some additional tools in the Inria SonarQube\n",
+    "[documentation](https://sonarqube.bordeaux.inria.fr/pages/documentation.html#orgd4ab5b1).\n",
     "\n",
     "\n"
    ]
diff --git a/7-Appendix/Crtp.ipynb b/7-Appendix/Crtp.ipynb
index 7332937624b7e4d1782e1086d18494de9a806409..42d885868e22d227e2fb7a45e4b85ced70cbc316 100644
--- a/7-Appendix/Crtp.ipynb
+++ b/7-Appendix/Crtp.ipynb
@@ -50,7 +50,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -61,7 +61,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -87,7 +87,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -100,7 +100,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -111,7 +111,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -123,7 +123,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -133,7 +133,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -143,9 +143,20 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 8,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Carrot 0\n",
+      "Cabbage 2\n",
+      "Carrot 1\n",
+      "Cabbage 3\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    Carrot carrot[2];\n",
@@ -172,7 +183,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -190,7 +201,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Of course, at some point you can't protect a developer against its own stupidity, but ideally it's better if you can protect it as much a possible, and closing this possibility would be nice.\n",
+    "Of course, at some point you can't protect a developer against his/her own stupidity, but ideally it's better if you can protect it as much a possible, and closing this possibility would be nice.\n",
     "\n",
     "In case you're wondering, the list above would not be terribly useful: if you want to use the list for something other that the unique id functionality, you would have to use **dynamic_cast** - which I do not recommend) "
    ]
@@ -204,7 +215,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 10,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -216,7 +227,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -228,9 +239,20 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 12,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Carrot 6\n",
+      "Cabbage 8\n",
+      "Carrot 7\n",
+      "Cabbage 9\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    Carrot2 carrot[2];\n",
@@ -251,7 +273,7 @@
     "We haven't gained much with private inheritance, and even lost a bit:\n",
     "\n",
     "* Underlying numeration is still the same for unrelated classes.\n",
-    "* We now additionnally need to explicitly allow in derived classes the base class method with `using` statement. This may not seem much, but in a complex CRTP with several methods it adds boilerplate to provide in each derived class.\n",
+    "* We now additionally need to explicitly allow in derived classes the base class method with `using` statement. This may not seem much, but in a complex CRTP with several methods it adds boilerplate to provide in each derived class.\n",
     "* It is up to the user to proceed to private inheritance: he may use public one as easily as private one.\n",
     "\n",
     "The only substantive gain is that we block the possibility to list together unrelated objects:"
@@ -259,9 +281,37 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 13,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1minput_line_22:6:35: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mcannot cast 'Carrot2' to its private base class 'UniqueId'\u001b[0m\n",
+      "    std::vector<UniqueId*> list { carrot, cabbage };\n",
+      "\u001b[0;1;32m                                  ^\n",
+      "\u001b[0m\u001b[1minput_line_18:1:18: \u001b[0m\u001b[0;1;30mnote: \u001b[0mdeclared private here\u001b[0m\n",
+      "struct Carrot2 : private UniqueId\n",
+      "\u001b[0;1;32m                 ^~~~~~~~~~~~~~~~\n",
+      "\u001b[0m\u001b[1minput_line_22:6:43: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mcannot cast 'Cabbage2' to its private base class 'UniqueId'\u001b[0m\n",
+      "    std::vector<UniqueId*> list { carrot, cabbage };\n",
+      "\u001b[0;1;32m                                          ^\n",
+      "\u001b[0m\u001b[1minput_line_19:1:19: \u001b[0m\u001b[0;1;30mnote: \u001b[0mdeclared private here\u001b[0m\n",
+      "struct Cabbage2 : private UniqueId\n",
+      "\u001b[0;1;32m                  ^~~~~~~~~~~~~~~~\n",
+      "\u001b[0m"
+     ]
+    },
+    {
+     "ename": "Interpreter Error",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "Interpreter Error: "
+     ]
+    }
+   ],
    "source": [
     "#include <vector>\n",
     "\n",
@@ -284,7 +334,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -308,7 +358,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 15,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -319,7 +369,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 16,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -332,7 +382,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 17,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -354,7 +404,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 18,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -365,7 +415,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 19,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -378,9 +428,20 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 20,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Carrot 10\n",
+      "Cabbage 12\n",
+      "Carrot 11\n",
+      "Cabbage 13\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    Carrot3 carrot[2];\n",
@@ -412,7 +473,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 21,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -439,7 +500,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 22,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -453,7 +514,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 23,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -465,7 +526,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 24,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -485,7 +546,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 25,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -495,7 +556,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 26,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -505,9 +566,20 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 27,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Carrot 0\n",
+      "Cabbage 0\n",
+      "Carrot 1\n",
+      "Cabbage 1\n"
+     ]
+    }
+   ],
    "source": [
     "{\n",
     "    Carrot4 carrot[2];\n",
@@ -548,7 +620,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 28,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -563,7 +635,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 29,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -578,7 +650,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 30,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -592,7 +664,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 31,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -604,7 +676,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 32,
    "metadata": {},
    "outputs": [
     {
diff --git a/7-Appendix/HomemadeException.ipynb b/7-Appendix/HomemadeException.ipynb
index 05ea0e2b1b970b9703636ad9cfcbc4ad95b7006b..232d62f8227bf8567d0066cbbdd6b863b8ff8d05 100644
--- a/7-Appendix/HomemadeException.ipynb
+++ b/7-Appendix/HomemadeException.ipynb
@@ -41,7 +41,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -62,18 +62,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "ename": "Standard Exception",
-     "evalue": "x should be in [-2., 5.]",
-     "output_type": "error",
-     "traceback": [
-      "Standard Exception: x should be in [-2., 5.]"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "{\n",
     "    double x = -3.;\n",
@@ -102,7 +93,7 @@
     "\n",
     "### Indicating the file and line\n",
     "\n",
-    "If your code is huge, knowing the exception itself is not enough, if this exception may be thrown from several locations in your code. To identify where the exception was thrown, I use the `__FILE__` and `__LINE__` macro which gives the file and line where they were found in the code.\n",
+    "If your code is huge, knowing the exception itself is not enough, if this exception may be thrown from several locations in your code. To identify where the exception was thrown, I use the `__FILE__` and `__LINE__` macro which gives the file and line where they were found in the code (better alternative [may appear](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4562.html#reflection.src_loc) in C++ 20).\n",
     "\n",
     "So my constructor looks like:\n",
     "\n",
@@ -122,26 +113,6 @@
     "### Exception.hpp"
    ]
   },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "#include <exception>\n",
-    "\n",
-    "class RangeMinus2PlusFiveException : public std::exception\n",
-    "{\n",
-    "    RangeMinus2PlusFiveException() = default;\n",
-    "    \n",
-    "    virtual const char* what() const noexcept override\n",
-    "    {\n",
-    "        return \"x should be in [-2., 5.]\";\n",
-    "    } \n",
-    "\n",
-    "};"
-   ]
-  },
   {
    "cell_type": "code",
    "execution_count": null,
diff --git a/7-Appendix/Switch.ipynb b/7-Appendix/Switch.ipynb
index 2e52606038b689595f073f72967909a17a23bbdb..5091df416ad0f8113c61266fd294669310a9e9fb 100644
--- a/7-Appendix/Switch.ipynb
+++ b/7-Appendix/Switch.ipynb
@@ -33,7 +33,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -42,17 +42,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Blue!\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -85,19 +77,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Blue!\n",
-      "Red!\n",
-      "Green!\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -124,19 +106,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Blue!\n",
-      "Red!\n",
-      "Green!\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -167,17 +139,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Neither blue nor red!\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -206,20 +170,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_45:4:12: \u001b[0m\u001b[0;1;35mwarning: \u001b[0m\u001b[1menumeration value 'green' not handled in switch [-Wswitch]\u001b[0m\n",
-      "    switch(my_color)\n",
-      "\u001b[0;1;32m           ^\n",
-      "\u001b[0m"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -248,31 +201,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1minput_line_37:10:9: \u001b[0m\u001b[0;1;31merror: \u001b[0m\u001b[1mcannot jump from switch statement to this case label\u001b[0m\n",
-      "        default:\n",
-      "\u001b[0;1;32m        ^\n",
-      "\u001b[0m\u001b[1minput_line_37:8:17: \u001b[0m\u001b[0;1;30mnote: \u001b[0mjump bypasses variable initialization\u001b[0m\n",
-      "            int i = 5; // COMPILATION ERROR!\n",
-      "\u001b[0;1;32m                ^\n",
-      "\u001b[0m"
-     ]
-    },
-    {
-     "ename": "Interpreter Error",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "Interpreter Error: "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
@@ -292,17 +223,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Not blue!\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#include <iostream>\n",
     "\n",
diff --git a/7-Appendix/WeakPtr.ipynb b/7-Appendix/WeakPtr.ipynb
index aa0a5e7e5682a76d2f77588507eca2fe4b34608b..3eb8c5cd02590b5768af7089abb4d6076c4a0717 100644
--- a/7-Appendix/WeakPtr.ipynb
+++ b/7-Appendix/WeakPtr.ipynb
@@ -502,7 +502,8 @@
     "    {\n",
     "        auto mistake = std::make_shared<Child2>(\"Yoda\", father); // ages don't even match!\n",
     "        father->AddChild(mistake);\n",
-    "    }\n",
+    "    } // mistake is released here: it becomes out of scope, and children_ data attribute\n",
+    "      // is made of weak pointers.\n",
     "    \n",
     "    father->Print();\n",
     "}"
@@ -592,7 +593,7 @@
     "Now we will tackle the remaining design issues:\n",
     "\n",
     "- Making the end-user call `AddChild()` himself is very ill-advised, as you put on him the burden of making sure the objects are consistant. \n",
-    "- If a `Child` is removed at some point, it remains present in the `Father` dedicated data attribute `children_`; taking the size of this vector thus yields a wrong result. This second issue is not as bad as the first one: `children_` is a private data attribute that is not exposed publicly at all; it might be acceptable to keep this behaviour and provide a method that yielss the number of children (and in this case documenting it properly in Doxygen or equivalent: if someone fiddles with the class implementation in the future he must be fully aware of it... and this someone could be yourself in few months!).\n",
+    "- If a `Child` is removed at some point, it remains present in the `Father` dedicated data attribute `children_`; taking the size of this vector thus yields a wrong result. This second issue is not as bad as the first one: `children_` is a private data attribute that is not exposed publicly at all; it might be acceptable to keep this behaviour and provide a method that yields the number of children (and in this case documenting it properly in Doxygen or equivalent: if someone fiddles with the class implementation in the future he must be fully aware of it... and this someone could be yourself in few months!).\n",
     "\n",
     "What would be the neater way to solve the first issue would be to to this step during the `Child` constructor: we set the relationship both ways at the same time. What we lacked is a way to derive a `shared_ptr` from the `this` pointer; STL provides a CRTP to do exactly that: `std::enable_shared_from_this`. With this CRTP, we gain a `shared_from_this()` method that provides exactly what we need (you should have a look at [cppreference](https://en.cppreference.com/w/cpp/memory/enable_shared_from_this) for more details about why you shouldn't try to create the shared pointer from this yourself).\n",
     "\n",
@@ -793,7 +794,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "If you're a bit lost by the implementation above, please check a former [notebook](/notebooks/5-UsefulConceptsAndSTL/6-Algorithms.ipynb#std::remove)."
+    "If you're a bit lost by the implementation above, please check a former [notebook](/notebooks/5-UsefulConceptsAndSTL/7-Algorithms.ipynb#std::remove)."
    ]
   },
   {
@@ -847,7 +848,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 40,
+   "execution_count": 39,
    "metadata": {},
    "outputs": [
     {
diff --git a/bibliography.ipynb b/bibliography.ipynb
index fde6d811089d4c453ae8ab1a74ab0aeb7df2a6a0..a95c094b801a2304f4f5c4f087fbbf19d8657867 100644
--- a/bibliography.ipynb
+++ b/bibliography.ipynb
@@ -48,22 +48,22 @@
    "source": [
     "# References\n",
     "\n",
-    "[<a id=\"cit-Sutter1999\" href=\"#call-Sutter1999\">Sutter1999</a>] Herb Sutter, _Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions_,  2000.\n",
+    "[<a id=\"cit-Meyers2005\" href=\"#call-Meyers2005\">Meyers2005</a>] Scott Meyers, ``_Effective C++: 55 Specific Ways to Improve Your Programs and Designs (3rd Edition)_'',  2005.\n",
     "\n",
-    "[<a id=\"cit-Meyers2005\" href=\"#call-Meyers2005\">Meyers2005</a>] Scott Meyers, _Effective C++: 55 Specific Ways to Improve Your Programs and Designs (3rd Edition)_,  2005.\n",
+    "[<a id=\"cit-Meyers1995\" href=\"#call-Meyers1995\">Meyers1995</a>] Scott Meyers, ``_More Effective C++: 35 New Ways to Improve Your Programs and Designs_'',  1995.\n",
     "\n",
-    "[<a id=\"cit-Meyers1995\" href=\"#call-Meyers1995\">Meyers1995</a>] Scott Meyers, _More Effective C++: 35 New Ways to Improve Your Programs and Designs_,  1995.\n",
+    "[<a id=\"cit-Meyers2015\" href=\"#call-Meyers2015\">Meyers2015</a>] Scott Meyers, ``_Effective modern C++: 42 specific ways to improve your use of C++11\n",
+    "               and C++14_'',  2015.  [online](http://www.worldcat.org/oclc/890021237)\n",
     "\n",
-    "[<a id=\"cit-Meyers2015\" href=\"#call-Meyers2015\">Meyers2015</a>] Scott Meyers, _Effective modern C++: 42 specific ways to improve your use of C++11\n",
-    "               and C++14_,  2015.  [online](http://www.worldcat.org/oclc/890021237)\n",
+    "[<a id=\"cit-Josuttis2012\" href=\"#call-Josuttis2012\">Josuttis2012</a>] Nicolai M. Josuttis, ``_The C++ Standard Library: A Tutorial and Reference_'',  2012.\n",
     "\n",
-    "[<a id=\"cit-Josuttis2012\" href=\"#call-Josuttis2012\">Josuttis2012</a>] Nicolai M. Josuttis, _The C++ Standard Library: A Tutorial and Reference_,  2012.\n",
+    "[<a id=\"cit-Alexandrescu2001\" href=\"#call-Alexandrescu2001\">Alexandrescu2001</a>] Andrei Alexandrescu, ``_Modern C++ Design: Generic Programming and Design Patterns applied_'', 01 2001.\n",
     "\n",
-    "[<a id=\"cit-Alexandrescu2001\" href=\"#call-Alexandrescu2001\">Alexandrescu2001</a>] Andrei Alexandrescu, _Modern C++ Design: Generic Programming and Design Patterns applied_, 01 2001.\n",
+    "[<a id=\"cit-Sutter1999\" href=\"#call-Sutter1999\">Sutter1999</a>] Herb Sutter, ``_Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions_'',  2000.\n",
     "\n",
-    "[<a id=\"cit-Sutter2002\" href=\"#call-Sutter2002\">Sutter2002</a>] Herb Sutter, _More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions_,  2002.\n",
+    "[<a id=\"cit-Sutter2002\" href=\"#call-Sutter2002\">Sutter2002</a>] Herb Sutter, ``_More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions_'',  2002.\n",
     "\n",
-    "[<a id=\"cit-Meyers2001\" href=\"#call-Meyers2001\">Meyers2001</a>] Scott Meyers, _Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library_,  2001.\n",
+    "[<a id=\"cit-Meyers2001\" href=\"#call-Meyers2001\">Meyers2001</a>] Scott Meyers, ``_Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library_'',  2001.\n",
     "\n"
    ]
   },
@@ -125,7 +125,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.6.8"
+   "version": "3.6.7"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
@@ -144,6 +144,19 @@
    "latex_user_defs": false,
    "report_style_numbering": false,
    "user_envs_cfg": false
+  },
+  "toc": {
+   "base_numbering": 1,
+   "nav_menu": {},
+   "number_sections": true,
+   "sideBar": true,
+   "skip_h1_title": false,
+   "title_cell": "Table of Contents",
+   "title_sidebar": "Contents",
+   "toc_cell": false,
+   "toc_position": {},
+   "toc_section_display": true,
+   "toc_window_display": false
   }
  },
  "nbformat": 4,