diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a69fa10ef3c13caa28549a07aa420cd91680f108..e8e6f717623db1465e2f61871d6ec417c500598f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -43,11 +43,6 @@ check_notebooks_empty_outputs:
         - changes:
             - docker/Dockerfile.${NAME}
 
-build_xeus-cling:
-    extends: .build_docker_image
-    variables:
-        NAME: "xeus-cling"
-
 build_fedora:
     extends: .build_docker_image
     variables:
@@ -58,6 +53,7 @@ build_fedora_with_boost:
     variables:
         NAME: "fedora_with_boost"
 
+
 compile_hands_on_solutions:
     image: $CI_REGISTRY/$CI_PROJECT_PATH/fedora_for_hands_on
     stage: check
diff --git a/0b-getting_started_with_tutorial.ipynb b/0b-getting_started_with_tutorial.ipynb
index 91d7659782c7a9e557ec2f431b17eccef523a7de..9168ff87b62f41987849979ca4f4a6f3ce21b308 100644
--- a/0b-getting_started_with_tutorial.ipynb
+++ b/0b-getting_started_with_tutorial.ipynb
@@ -11,29 +11,61 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## About the choice of a Jupyter notebook\n",
+    "## Jupyter notebook\n",
     "\n",
-    "This notebook uses up [xeus-cling](https://xeus-cling.readthedocs.io/en/latest/), a special instance of Jupyter able to run C++ code based upon xeus (tool to build Jupyter kernels for any language) and cling (a creation from CERN to be able to run C++ as an interpreted language).\n",
+    "### About the choice of a Jupyter notebook\n",
     "\n",
-    "The reasons for these choices is to really access directly to handle C++ code without the hassle of explaining how to compile and run stuff, which is an especially cumbersome way to start with this (or any really...) language.\n",
+    "We made the choice to use a Jupyter notebook for conveniency:\n",
     "\n",
-    "This is not to say this tutorial will ignore entirely these topics (see the dedicated [chapter](./6-InRealEnvironment/0-main.ipynb)), just that we will first focus on C++ code. However keep in mind that this notebook's fancy interpreter is not a typical C++ environment.\n",
+    "- We can delve directly into the syntax of the language itself, without muddying the water with peripherical stuff such as explaining from the beginning how a build system works.\n",
+    "(don't worry we'll cover real environments [in part 6](./6-InRealEnvironment/0-main.ipynb)\n",
+    "- Notebooks are a cool tool to meddle explanations and actual code that is directly executable.\n",
     "\n",
-    "## When the notebook is not enough...\n",
+    "However, Jupyter notebooks were clearly not initially designed with C++ in mind (Jupyter stands for **Ju**Lia **Py**thon and **R** - these three langages are either interpreted or just-in-time, whereas C++ is a compiled langage).\n",
     "\n",
-    "As we shall see repeatedly, Xeus-cling notebooks are far from being full-proof: some stuff that are perfectly acceptable C++ aren't accepted in them, and some others required work-arounds. When such an issue appears:\n",
+    "This didn't stop people from trying, leveraging the [cling](https://root.cern/cling) project from CERN which aims to provide an interpreter to the C++ langage.\n",
     "\n",
-    "* It will be indicated explicitly in the notebook if a specific work around is used. We do not want you to take Jupyter work-arounds as a legit advice on how to write proper C++.\n",
-    "* If Jupyter can't deal with the code, we will use [Coliru](https://coliru.stacked-crooked.com/). Coliru is a C++ online compiler; others are listed [here]([GitHub page](https://arnemertz.github.io/online-compilers/)) ([Wandbox](https://wandbox.org/) deserves a shout out as it enables testing the same code with a great variety of compiler versions).\n",
+    "Up to summer 2024, we were using [Xeus-cling](https://xeus-cling.readthedocs.io/en/latest) to run this tutorial; however this project was stagnating and in particular doesn't seem keen to adopt C++ 20, which is (partially) supported by the cling interpreter.\n",
     "\n",
-    "We're not sure we'll keep using Jupyter notebooks in the future: development of Xeus-cling has a bit stalled in the recent years and support of more recent versions of C++ (20 and more) is still unclear.\n"
+    "We have therefore switched to a [homemade Jupyter kernel](https://gitlab.inria.fr/sed-saclay/cppyy_kernel) which uses up the fantastic [cppyy](https://cppyy.readthedocs.io) project, which enables running C++ code from a Python environment.\n",
+    "\n",
+    "That being said, it is important to keep in mind that this notebook's fancy interpreter is absolutely not a typical C++ environment.\n",
+    "\n",
+    "### When cling / the notebook is not enough...\n",
+    "\n",
+    "Even if notebooks are really useful, there are some C++ operations that are not fully supported, be it due to cling limitations (either intrinsic or just because some new C++ features aren't yet covered) or to the way we implemented our kernel around cppyy.\n",
+    "\n",
+    "We try our best to make the most content available directly, and we designed our kernel accordingly. We used so-called *magics* to do so, so don't be surprised if some cells starts with a line such as:\n",
+    "\n",
+    "```jupyter\n",
+    "%%cppmagics cppyy/cppdef\n",
+    "```\n",
+    "\n",
+    "Such lines are dedicated to the running of the tutorial and have nothing to do with C++ itself; you may entirely ignore it (unless of course you intend to use our cppyy kernel for your own purposes).\n",
+    "\n",
+    "The most common such magics are:\n",
+    "\n",
+    "- `%%cppmagics cppyy/cppdef`: cppyy in fact defines two different functions `cppexec` and `cppdef`. The former is for code deemed to be executed, the latter for code that defines classes, functions and so on. In our Jupyter kernel we use by default `cppexec`, which works just fine for most operations. However some really need to call under the hood `cppdef`, and that's the reason for this magics.\n",
+    "- `%%cppmagics clang`: this magics tells that the entire content of the cell is to be written into a file that is to be compiled by `clang++` compiler; the executable hence produced is then run directly and its output is printed in the notebook. Contrary to the usual behaviour, the content of the cell is sandboxed and self-contained.\n",
+    "\n",
+    "The list of all magics may be displayed with following cell:\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%cppmagics\n",
+    ";"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## Few guidelines about Jupyter\n",
+    "### Few guidelines about Jupyter\n",
     "\n",
     "You might not be familiar with Jupyter notebooks, so here are few tips to run it smoothly (the _Help_ menu will help you find more if you need it).\n",
     "\n",
@@ -60,12 +92,12 @@
     "\n",
     "If for some reason the code in the notebook seems stuck, you might try to restart the kernel with one of the restart option in the _Kernel_ menu.\n",
     "\n",
-    "### Restarting the kernel\n",
+    "#### Restarting the kernel\n",
     "\n",
     "Sometimes something that should work doesn't... In this case try restarting the kernel: it might fix your issue!\n",
     "\n",
     "\n",
-    "### Table of contents\n",
+    "#### Table of contents\n",
     "\n",
     "The table of content for a given notebook is available as a side panel if you go to _View_ > _Table of contents_ or if you click on the third item on the leftmost panel."
    ]
@@ -221,16 +253,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/1-ProceduralProgramming/0-main.ipynb b/1-ProceduralProgramming/0-main.ipynb
index 4a32dd928f5806f1b84a7a91213cffcfa545a6a0..7d64b092b5913fe4f00ae92a03e14d889faca411 100644
--- a/1-ProceduralProgramming/0-main.ipynb
+++ b/1-ProceduralProgramming/0-main.ipynb
@@ -35,16 +35,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/1-ProceduralProgramming/1-Variables.ipynb b/1-ProceduralProgramming/1-Variables.ipynb
index 5477d05d0174599524ae79cf84f7c581b919f976..923461cd918e53ed0be31f41f02f9dde4653c67c 100644
--- a/1-ProceduralProgramming/1-Variables.ipynb
+++ b/1-ProceduralProgramming/1-Variables.ipynb
@@ -41,8 +41,9 @@
     "    int number; // integer variable\n",
     "    double real;  // floating-point variable\n",
     "\n",
+    "    // C++ standard dictates nothing - don't expect 0 for all architectures even if you get one here!\n",
     "    std::cout << number << std::endl; \n",
-    "    std::cout << real << std::endl;\n",
+    "    std::cout << real << std::endl; \n",
     "}"
    ]
   },
@@ -257,7 +258,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "**Beware:** it is however entirely possible to reuse in an inner block a variable name... but it is to be avoided because it really clutters the understanding of the code for a reader! (and compilers usually warn against this, even if here Xeus-cling does not):"
+    "**Beware:** it is however entirely possible to reuse in an inner block a variable name... but it is to be avoided because it really clutters the understanding of the code for a reader!"
    ]
   },
   {
@@ -285,6 +286,48 @@
     "     \"is the initial one: \" << a << std::endl;\n"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The special compiler used in our kernel environment does not warn about the repetition of the variable name, but a real-life compiler worth its salt would:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%cppmagics clang\n",
+    "// < We're asking here to the system clang compiler to compile and execute the code.\n",
+    "// Don't bother for the time being for the supplementary lines: we'll cover them in subsequent notebooks.\n",
+    "\n",
+    "#include <cstddef>\n",
+    "#include <iostream>\n",
+    "\n",
+    "int main(int argc, char** argv)\n",
+    "{    \n",
+    "    int a = 5;\n",
+    "    \n",
+    "    {\n",
+    "        int a = 10;\n",
+    "        std::cout << \"a is available at this level; it is the most inner scope one: \" << a << std::endl; \n",
+    "    \n",
+    "        {\n",
+    "            std::cout << \"Of course same here: \" << a << std::endl;\n",
+    "        }\n",
+    "        \n",
+    "        a = a + 5; // this is the inner most 'a' that is modified\n",
+    "    } // inner most a becomes out if scope\n",
+    "    \n",
+    "    std::cout << \"Here the innermost 'a' got out of scope and therefore the best choice for 'a' \"\n",
+    "         \"is the initial one: \" << a << std::endl;\n",
+    "\n",
+    "    return EXIT_SUCCESS;\n",
+    "}\n"
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {},
@@ -969,16 +1012,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/1-ProceduralProgramming/2-Conditions-and-loops.ipynb b/1-ProceduralProgramming/2-Conditions-and-loops.ipynb
index d3ec99b288f9b61db013f31b628d6aaa24e49042..9a0261df412e81c622e306b16c02b50c71e9b73a 100644
--- a/1-ProceduralProgramming/2-Conditions-and-loops.ipynb
+++ b/1-ProceduralProgramming/2-Conditions-and-loops.ipynb
@@ -873,16 +873,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/1-ProceduralProgramming/2b-hands-on.ipynb b/1-ProceduralProgramming/2b-hands-on.ipynb
index 83fe58efee1472a1ff528d74c846a5ab9656a690..816a12d0435bcc0754c655b21c0ab0216eee108d 100644
--- a/1-ProceduralProgramming/2b-hands-on.ipynb
+++ b/1-ProceduralProgramming/2b-hands-on.ipynb
@@ -79,16 +79,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/1-ProceduralProgramming/3-Types.ipynb b/1-ProceduralProgramming/3-Types.ipynb
index e1ae5e8c5b96f2640fd7900c47f09e04ba0899b9..7534c528867631c352b38cde16260a6c43622faa 100644
--- a/1-ProceduralProgramming/3-Types.ipynb
+++ b/1-ProceduralProgramming/3-Types.ipynb
@@ -600,7 +600,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "If you really want a `float` division, you have to cast at least one of the value:"
+    "If you really want a floating-point division, you have to cast at least one of the value:"
    ]
   },
   {
@@ -614,7 +614,7 @@
    "outputs": [],
    "source": [
     "{\n",
-    "  double a = static_cast<float>(2) / 3;\n",
+    "  double a = static_cast<double>(2) / 3;\n",
     "  std::cout << a << std::endl;\n",
     "  // this is also valid\n",
     "  double b = 2. / 3;\n",
@@ -1147,16 +1147,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/1-ProceduralProgramming/4-Functions.ipynb b/1-ProceduralProgramming/4-Functions.ipynb
index 3cd54af24d944efb2484a12b42458049b0ca2dc2..47fbfa70b6a861761f36c0d1c0b4ee91855c080c 100644
--- a/1-ProceduralProgramming/4-Functions.ipynb
+++ b/1-ProceduralProgramming/4-Functions.ipynb
@@ -50,7 +50,7 @@
    "outputs": [],
    "source": [
     "int ReturnFive(); // providing a parameter is also optional...\n",
-    "                  // Don't bother Xeus-cling warning: it IS here a function declaration!"
+    "                  // Don't bother the notebook kernel warning: it IS here a function declaration!"
    ]
   },
   {
@@ -447,7 +447,10 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "auto Sum(int a, int b) -> int // Currently doesn't compile in Xeus-cling environment\n",
+    "%%cppmagics cppyy/cppdef \n",
+    "// < Notebook-related line - without it the perfectly valid C++ syntax below wouldn't be accepted. Don't bother!\n",
+    "\n",
+    "auto Sum(int a, int b) -> int\n",
     "{\n",
     "    return a + b;\n",
     "}"
@@ -457,7 +460,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "The return type is optional (and was the reason of Xeus-cling failure):"
+    "The return type is optional:"
    ]
   },
   {
@@ -466,7 +469,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "auto Sum(int a, int b) // compiles just fine in Xeus-cling\n",
+    "auto SumWithoutExplicitReturnType(int a, int b)\n",
     "{\n",
     "    return a + b;\n",
     "}"
@@ -483,7 +486,8 @@
     "int a = 8;\n",
     "int b = -3;\n",
     "\n",
-    "std::cout << a << \" + \" << b << \" = \" << Sum(a, b) << std::endl;"
+    "std::cout << a << \" + \" << b << \" = \" << Sum(a, b) << std::endl;\n",
+    "std::cout << a << \" + \" << b << \" = \" << SumWithoutExplicitReturnType(a, b) << std::endl;"
    ]
   },
   {
@@ -981,6 +985,9 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef \n",
+    "// < Notebook-related line - without it the perfectly valid C++ syntax below wouldn't be accepted. Don't bother!\n",
+    "    \n",
     "// Declaration.\n",
     "void FunctionWithOptional(double x, double y = 0., double z = 0.);\n"
    ]
@@ -991,6 +998,9 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef \n",
+    "// < Notebook-related line - without it the perfectly valid C++ syntax below wouldn't be accepted. Don't bother!\n",
+    "    \n",
     "#include <iostream>\n",
     "\n",
     "// Definition\n",
@@ -1006,11 +1016,9 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// WARNING: Xeus-cling issue!\n",
-    "\n",
     "{\n",
-    "    FunctionWithOptional(3., 5., 6.); // ok\n",
-    "    FunctionWithOptional(3.); // should be ok, but Xeus-cling issue.\n",
+    "    FunctionWithOptional(3., 5., 6.);\n",
+    "    FunctionWithOptional(3.);\n",
     "}"
    ]
   },
@@ -1495,16 +1503,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xeus-cling-cpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "C++17",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/1-ProceduralProgramming/4b-hands-on.ipynb b/1-ProceduralProgramming/4b-hands-on.ipynb
index 09375d4609573349e5a722790bd0f0461eb932a2..b4412b0ad56348ba5faa9c3ef51766190f4e7af6 100644
--- a/1-ProceduralProgramming/4b-hands-on.ipynb
+++ b/1-ProceduralProgramming/4b-hands-on.ipynb
@@ -299,16 +299,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/1-ProceduralProgramming/5-DynamicAllocation.ipynb b/1-ProceduralProgramming/5-DynamicAllocation.ipynb
index d41d4cc704faadf2713b362bd04b8b14c32ccef7..7c51ceda37ef931309396a484d3b5b9406882766 100644
--- a/1-ProceduralProgramming/5-DynamicAllocation.ipynb
+++ b/1-ProceduralProgramming/5-DynamicAllocation.ipynb
@@ -231,16 +231,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/1-ProceduralProgramming/6-Streams.ipynb b/1-ProceduralProgramming/6-Streams.ipynb
index 35061d0772e51b87df395caa6b4199a5264b8a63..3ba2bc5d653229944491c3a3bd8fad92aff0c1c1 100644
--- a/1-ProceduralProgramming/6-Streams.ipynb
+++ b/1-ProceduralProgramming/6-Streams.ipynb
@@ -65,9 +65,7 @@
    "source": [
     "### `std:cin`\n",
     "\n",
-    "And finally `std::cin`, related to Unix channel `stdin`. Line crossings are ignored (assimilated to spaces and tabs).\n",
-    "    \n",
-    "**WARNING** This works only with a recent version of Xeus-cling."
+    "And finally `std::cin`, related to Unix channel `stdin`. Line crossings are ignored (assimilated to spaces and tabs)."
    ]
   },
   {
@@ -76,9 +74,15 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#include <random>\n",
+    "%%cppmagics std::cin/clang\n",
+    "// Standard input is **very** tricky to use in notebook environment; we're therefore using \n",
+    "// a hack that calls the underlying clang compiler on your system.\n",
+    "\n",
+    "#include <cstddef>\n",
     "#include <iostream>\n",
+    "#include <random>\n",
     "\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
     "    std::random_device rd;  // Will be used to obtain a seed for the random number engine\n",
     "    std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd()\n",
@@ -101,6 +105,8 @@
     "    }\n",
     "    \n",
     "    std::cout << \"Congratulations! You have found the hidden number!\" << std::endl;\n",
+    "\n",
+    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
@@ -117,10 +123,15 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#include <random>\n",
-    "#include <iostream>\n",
+    "%%cppmagics std::cin/clang\n",
+    "// Standard input is **very** tricky to use in notebook environment; we're therefore using \n",
+    "// a hack that calls the underlying clang compiler on your system.\n",
     "\n",
+    "#include <cstddef>\n",
+    "#include <iostream>\n",
+    "#include <random>\n",
     "\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
     "    std::random_device rd;  //Will be used to obtain a seed for the random number engine\n",
     "    std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()\n",
@@ -155,6 +166,8 @@
     "    }\n",
     "    \n",
     "    std::cout << \"Congratulations! You have found the hidden number!\" << std::endl;\n",
+    "\n",
+    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
@@ -546,16 +559,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/1-ProceduralProgramming/6b-hands-on.ipynb b/1-ProceduralProgramming/6b-hands-on.ipynb
index d920232c6b3dfb479ce585526e9d0c7f6a362b81..dbf6fee96bd25229134995e6f7f5bc3ac5ee2dbb 100644
--- a/1-ProceduralProgramming/6b-hands-on.ipynb
+++ b/1-ProceduralProgramming/6b-hands-on.ipynb
@@ -336,16 +336,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/1-ProceduralProgramming/7-StaticAndConstexpr.ipynb b/1-ProceduralProgramming/7-StaticAndConstexpr.ipynb
index 96c0b70376f91db6ea04fd1b5eb920ca67a9c9b9..1679e9b9b39088bd108ebff514ffa9b08f158de3 100644
--- a/1-ProceduralProgramming/7-StaticAndConstexpr.ipynb
+++ b/1-ProceduralProgramming/7-StaticAndConstexpr.ipynb
@@ -125,7 +125,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Recursive function - Xeus cling may not appreciate if you call this cell several times.\n",
+    "// Recursive function - kernel may not appreciate if you call this cell several times.\n",
     "\n",
     "auto Fibonacci (std::size_t n) \n",
     "{\n",
@@ -242,16 +242,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/2-ObjectProgramming/0-main.ipynb b/2-ObjectProgramming/0-main.ipynb
index e5e137041f6d2c5f9a608f93578011d3f4ee7cbf..1153cd11f9ee301cfc3fa2ef90a1dd2d979620e9 100644
--- a/2-ObjectProgramming/0-main.ipynb
+++ b/2-ObjectProgramming/0-main.ipynb
@@ -36,16 +36,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/2-ObjectProgramming/1-Introduction.ipynb b/2-ObjectProgramming/1-Introduction.ipynb
index f6ed4efd4c3aa23cd3e0e365b6d35f39d1307182..ef7818f9e792bbcbd9bb8c2a2713942eb7b6cdc5 100644
--- a/2-ObjectProgramming/1-Introduction.ipynb
+++ b/2-ObjectProgramming/1-Introduction.ipynb
@@ -155,7 +155,7 @@
    "metadata": {},
    "source": [
     "### The semicolon at the end of a `struct`\n",
-    "This comes historically from the C, where a `struct` could be defined and initialized at the same time (or should - Xeus-cling doesn't manage it... As usual you may check a full-fledged compiler accepts it [@Coliru](http://coliru.stacked-crooked.com/a/3b77606ea8082485)):"
+    "This comes historically from the C, where a `struct` could be defined and initialized at the same time:"
    ]
   },
   {
@@ -164,18 +164,26 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Xeus-cling issue (at least circa September 2022 and still there in February 2024)\n",
+    "%%cppmagics clang\n",
+    "// < Following code isn't supported by our kernel, so we're using native compiler instead.\n",
     "\n",
-    "struct VectorAndInstantiate\n",
+    "#include <cstdlib>\n",
+    "\n",
+    "int main()\n",
     "{\n",
-    "    double x;\n",
-    "    double y;\n",
-    "    double z;    \n",
-    "} v1; // Here the struct is declared and at the same time an object v1 is created\n",
+    "    struct VectorAndInstantiate\n",
+    "    {\n",
+    "        double x;\n",
+    "        double y;\n",
+    "        double z;    \n",
+    "    } v1; // Here the struct is declared and at the same time an object v1 is created\n",
+    "    \n",
+    "    v1.x = 1.;\n",
+    "    v1.y = 5.;\n",
+    "    v1.z = -2.;\n",
     "\n",
-    "v1.x = 1.;\n",
-    "v1.y = 5.;\n",
-    "v1.z = -2.;"
+    "    return EXIT_SUCCESS;\n",
+    "}    "
    ]
   },
   {
@@ -328,16 +336,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/2-ObjectProgramming/1b-hands-on.ipynb b/2-ObjectProgramming/1b-hands-on.ipynb
index bed328ab9d0a93175dafab8243613650e52dd89c..6d8a5cbb3b7a9f8f5aa291d346d0ed3f5e8bf0cc 100644
--- a/2-ObjectProgramming/1b-hands-on.ipynb
+++ b/2-ObjectProgramming/1b-hands-on.ipynb
@@ -60,16 +60,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/2-ObjectProgramming/2-Member-functions.ipynb b/2-ObjectProgramming/2-Member-functions.ipynb
index 9988282f05d7a8799c523e9f62150ab0f6198ebe..9eec6e60ddda11f8ff3117b35812bfa2de7da8c6 100644
--- a/2-ObjectProgramming/2-Member-functions.ipynb
+++ b/2-ObjectProgramming/2-Member-functions.ipynb
@@ -486,16 +486,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/2-ObjectProgramming/2b-hands-on.ipynb b/2-ObjectProgramming/2b-hands-on.ipynb
index 9295c27cca9cd08139e3b83005d04450ba311f0c..9812bc0664d2105bf4a8c86e24b468b0662e7c3b 100644
--- a/2-ObjectProgramming/2b-hands-on.ipynb
+++ b/2-ObjectProgramming/2b-hands-on.ipynb
@@ -53,16 +53,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/2-ObjectProgramming/3-constructors-destructor.ipynb b/2-ObjectProgramming/3-constructors-destructor.ipynb
index 1e3c394c1b962662491f85bb90f4747dd74eaa9f..515ff1fafa7f8945c1c8caa8af567c2f46cbb3a1 100644
--- a/2-ObjectProgramming/3-constructors-destructor.ipynb
+++ b/2-ObjectProgramming/3-constructors-destructor.ipynb
@@ -65,10 +65,14 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "// < without this line the perfectly valid - and recommended! - braces in data \n",
+    "// attribute initialization are not accepted by our kernel.\n",
+    "    \n",
     "Vector::Vector()\n",
-    ": x_(0.), // braces may also be used since C++ 11... but not supported here by Xeus-cling.\n",
-    "y_(0.),\n",
-    "z_(0.)\n",
+    ": x_{0}, // braces may also be used since C++ 11, and are the recommended choice \n",
+    "y_{}, // the value inside may be skipped if it is 0\n",
+    "z_{}\n",
     "{ }"
    ]
   },
@@ -193,8 +197,7 @@
    "outputs": [],
    "source": [
     "struct First\n",
-    "{\n",
-    "};"
+    "{ };"
    ]
   },
   {
@@ -305,7 +308,36 @@
    "source": [
     "You may have unwanted effects if you do not respect the same ordering.\n",
     "\n",
-    "Fortunately, compilers are able to emit warnings to advise you to remedy this if you have properly activated them with options such as `-Wall` (we shall discuss this in a [later notebook](../6-InRealEnvironment/3-Compilers.ipynb)). You may check the very example [in Coliru](https://coliru.stacked-crooked.com/a/f783f09ff4395aa1); both clang++ and g++ provide an adequate warning."
+    "Fortunately, compilers are able to emit warnings to advise you to remedy this if you have properly activated them with options such as `-Wall` (we shall discuss this in a [later notebook](../6-InRealEnvironment/3-Compilers.ipynb)). Here is an example when calling directly `clang`; you may also try with `gcc` which will also provides a warning:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%cppmagics clang\n",
+    "\n",
+    "#include <cstdlib>\n",
+    "\n",
+    "struct PoorlyDefinedVector\n",
+    "{\n",
+    "    double x_;\n",
+    "    double y_;\n",
+    "\n",
+    "    PoorlyDefinedVector(double x, double y);\n",
+    "};\n",
+    "\n",
+    "PoorlyDefinedVector::PoorlyDefinedVector(double x, double y)\n",
+    ": y_(y), // y_ is defined first, whereas x_ comes first in data attribute list!\n",
+    "x_(x)\n",
+    "{ }\n",
+    "\n",
+    "int main()\n",
+    "{\n",
+    "    return EXIT_SUCCESS;\n",
+    "}"
    ]
   },
   {
@@ -855,16 +887,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/2-ObjectProgramming/3b-hands-on.ipynb b/2-ObjectProgramming/3b-hands-on.ipynb
index 54f4d10ff5081fb37fb77a327dd440824ca7bf43..b05b0a1d435b012b87a0151d269cef2b7b5c61d6 100644
--- a/2-ObjectProgramming/3b-hands-on.ipynb
+++ b/2-ObjectProgramming/3b-hands-on.ipynb
@@ -50,16 +50,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/2-ObjectProgramming/4-encapsulation.ipynb b/2-ObjectProgramming/4-encapsulation.ipynb
index 96ba5726b9eadeed16d15b5e4acac5b137150e66..056f889609d71d04ff0b0b3a505592b679262dfa 100644
--- a/2-ObjectProgramming/4-encapsulation.ipynb
+++ b/2-ObjectProgramming/4-encapsulation.ipynb
@@ -859,16 +859,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/2-ObjectProgramming/4b-hands-on.ipynb b/2-ObjectProgramming/4b-hands-on.ipynb
index 3143cec74aa987c05c702b96569b132fbb9666a2..d3b28b32efa6237eefebe4663622528252a4cdff 100644
--- a/2-ObjectProgramming/4b-hands-on.ipynb
+++ b/2-ObjectProgramming/4b-hands-on.ipynb
@@ -218,16 +218,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/2-ObjectProgramming/5-static.ipynb b/2-ObjectProgramming/5-static.ipynb
index 341999bb6f3146e373748accf6ef689fccd9d817..5befdd4a253283a7e81b65a58a64fd4b03b53008 100644
--- a/2-ObjectProgramming/5-static.ipynb
+++ b/2-ObjectProgramming/5-static.ipynb
@@ -87,10 +87,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## Static data attributes - to avoid... (see next section to understand why!)\n",
-    "\n",
-    "\n",
-    "**Xeus-Cling Warning:** cling doesn't enable proper initialization of a static data attribute... Please considered the following code, available [@Coliru](https://coliru.stacked-crooked.com/a/f43bcc4548a4f160):"
+    "## Static data attributes - to avoid... (see next section to understand why!)"
    ]
   },
   {
@@ -99,9 +96,17 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics clang\n",
+    "// cling - used by our kernel - doesn't enable proper initialization of a static data attribute;\n",
+    "// we therefore use the native clang instead.\n",
+    "\n",
     "#include <iostream>\n",
     "#include <vector>\n",
     "\n",
+    "// ========================\n",
+    "// Declarations\n",
+    "// ========================\n",
+    "\n",
     "struct Class\n",
     "{\n",
     "    Class();\n",
@@ -111,6 +116,13 @@
     "    static unsigned int Ninstance_;\n",
     "};\n",
     "\n",
+    "void Print();\n",
+    "\n",
+    "\n",
+    "// ========================\n",
+    "// Definitions\n",
+    "// ========================\n",
+    "\n",
     "Class::Class()\n",
     "{\n",
     "    ++Ninstance_;\n",
@@ -129,7 +141,11 @@
     "    std::cout << \"There are \" << Class::Ninstance_ << \" of class Class.\" << std::endl;\n",
     "}\n",
     "\n",
-    "int main(int argc, char** argv)\n",
+    "// ========================\n",
+    "// Main\n",
+    "// ========================\n",
+    "\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
     "    Print();\n",
     "    \n",
@@ -289,7 +305,9 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Thanks to this [FluentCpp post](https://www.fluentcpp.com/2019/07/23/how-to-define-a-global-constant-in-cpp/) that gave me the hint!"
+    "Thanks to this [FluentCpp post](https://www.fluentcpp.com/2019/07/23/how-to-define-a-global-constant-in-cpp/) that gave us the hint!\n",
+    "\n",
+    "And make sure not to forget the `inline` keyword, without which you go straight back to the fiasco situation..."
    ]
   },
   {
@@ -302,16 +320,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/2-ObjectProgramming/6-inheritance.ipynb b/2-ObjectProgramming/6-inheritance.ipynb
index f06cd4e02901fda5d805cdedaa8c0a5f206c75f5..0b3bdce941767b20345b67c827cef1de843ae2a1 100644
--- a/2-ObjectProgramming/6-inheritance.ipynb
+++ b/2-ObjectProgramming/6-inheritance.ipynb
@@ -1038,16 +1038,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/2-ObjectProgramming/7-polymorphism.ipynb b/2-ObjectProgramming/7-polymorphism.ipynb
index e3ab16aab9b572c7c88f1f1f06b238764060c27a..4da5ce1124f35a3730ed87235b7ff120c5202535 100644
--- a/2-ObjectProgramming/7-polymorphism.ipynb
+++ b/2-ObjectProgramming/7-polymorphism.ipynb
@@ -902,9 +902,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "You may in fact explicitly tells the `c` pointer needs to be interpreted as a `PolymorphicThermicCar`:\n",
-    "\n",
-    "**Xeus-cling issue:** Here cling may not be able to run it (depends on the version used - it didn't in 2021 but seems to work in 2022 and 2024) but it is accepted rightfully by a full-fledged compiler (see for instance [@Coliru](http://coliru.stacked-crooked.com/a/22fff15d28c93a17)):"
+    "You may in fact explicitly tells the `c` pointer needs to be interpreted as a `PolymorphicThermicCar`:"
    ]
   },
   {
@@ -913,8 +911,6 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Xeus-cling issue!\n",
-    "\n",
     "#include <iostream>\n",
     "\n",
     "{\n",
@@ -1353,16 +1349,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/2-ObjectProgramming/7b-hands-on.ipynb b/2-ObjectProgramming/7b-hands-on.ipynb
index c3934dde85acc56045c56a56c7d74177803ce831..74bfd20f5cb1b0907d21ea8c8ee5ff11d2ae59c2 100644
--- a/2-ObjectProgramming/7b-hands-on.ipynb
+++ b/2-ObjectProgramming/7b-hands-on.ipynb
@@ -321,16 +321,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/3-Operators/0-main.ipynb b/3-Operators/0-main.ipynb
index e51b57770cbaca5d784596015c31e07eb31df2d9..0240440e4076c0d649562b3cbabfb76e182ceb85 100644
--- a/3-Operators/0-main.ipynb
+++ b/3-Operators/0-main.ipynb
@@ -33,16 +33,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/3-Operators/1-Intro.ipynb b/3-Operators/1-Intro.ipynb
index cf87e37d3df00c856a61a506eff82f5c7dee52c2..dd612b2eb9c9e8670100464105000f68062f6ee1 100644
--- a/3-Operators/1-Intro.ipynb
+++ b/3-Operators/1-Intro.ipynb
@@ -136,7 +136,7 @@
     "\n",
     "To overload an operator, the syntax is just the keyword **operator** followed by the operator to overload. In the following we will just replace the `Add` method by `operator+`.\n",
     "\n",
-    "The following code illustrate how to do so... but unfortunately doesn't run with Xeus Cling (you may play with it [@Coliru](https://coliru.stacked-crooked.com/a/765b9dc1e2b73c71)).\n"
+    "The following code illustrate how to do so:\n"
    ]
   },
   {
@@ -145,7 +145,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// DOESN'T RUN WITH XEUS-CLING\n",
+    "%%cppmagics cppyy/cppdef\n",
+    "// < We need to help the kernel interpret properly the code below, which is perfectly valid C++. Don't bother about this magics!\n",
     "\n",
     "#include <iostream>\n",
     "\n",
@@ -175,13 +176,11 @@
     "z_(z)\n",
     "{ }\n",
     "\n",
-    "\n",
     "void VectorPlus::Print() const\n",
     "{\n",
     "    std::cout << \"(\" << x_ << \", \" << y_ << \", \" << z_ << \")\" << std::endl;\n",
     "}\n",
     "\n",
-    "\n",
     "VectorPlus operator+(const VectorPlus& v1, const VectorPlus& v2) \n",
     "{    \n",
     "    // Provides a symmetric implementation of operator +: both vectors are at the same level!    \n",
@@ -191,22 +190,23 @@
     "    ret.z_ = v1.z_ + v2.z_;\n",
     "    \n",
     "    return ret;\n",
-    "}\n",
+    "}\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "VectorPlus v1(3., 5., 7.);\n",
+    "VectorPlus v2(7., 5., 3.);\n",
     "\n",
+    "VectorPlus v3 = v1 + v2; // Nicer syntax!\n",
+    "v3.Print();\n",
     "\n",
-    "int main(int argc, char** argv)\n",
-    "{\n",
-    "    VectorPlus v1(3., 5., 7.);\n",
-    "    VectorPlus v2(7., 5., 3.);\n",
-    "    \n",
-    "    VectorPlus v3 = v1 + v2; // Nicer syntax!\n",
-    "    v3.Print();\n",
-    "    \n",
-    "    VectorPlus v4 = operator+(v1, v2); // but \"usual\" method syntax is possible as well\n",
-    "    v4.Print();\n",
-    "    \n",
-    "    return EXIT_SUCCESS;\n",
-    "}"
+    "VectorPlus v4 = operator+(v1, v2); // but \"usual\" method syntax is possible as well\n",
+    "v4.Print();"
    ]
   },
   {
@@ -222,6 +222,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "\n",
     "class VectorPlusAsMethod\n",
     "{\n",
     "    public :\n",
@@ -232,23 +234,15 @@
     "    \n",
     "        void Print() const;\n",
     "    \n",
-    "        // I would rather put the definition outside but Xeus-cling doesn't seem to accept this.\n",
-    "        VectorPlusAsMethod operator+(const VectorPlusAsMethod& v) const\n",
-    "        {\n",
-    "            VectorPlusAsMethod ret;\n",
-    "            ret.x_ = x_ + v.x_;\n",
-    "            ret.y_ = y_ + v.y_;\n",
-    "            ret.z_ = z_ + v.z_;\n",
-    "    \n",
-    "            return ret;\n",
-    "        }\n",
+    "        VectorPlusAsMethod operator+(const VectorPlusAsMethod& v) const;\n",
     "\n",
     "    private :\n",
     "    \n",
-    "        double x_ = 0.;\n",
-    "        double y_ = 0.;\n",
-    "        double z_ = 0.;\n",
-    "}; "
+    "        double x_ {};\n",
+    "        double y_ {};\n",
+    "        double z_ {};\n",
+    "}; \n",
+    "\n"
    ]
   },
   {
@@ -257,11 +251,13 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "    \n",
     "VectorPlusAsMethod::VectorPlusAsMethod(double x, double y, double z)\n",
-    ": x_(x),\n",
-    "y_(y),\n",
-    "z_(z)\n",
-    "{ }"
+    ": x_{x},\n",
+    "y_{y},\n",
+    "z_{z}\n",
+    "{ }\n"
    ]
   },
   {
@@ -275,7 +271,8 @@
     "void VectorPlusAsMethod::Print() const\n",
     "{\n",
     "    std::cout << \"(\" << x_ << \", \" << y_ << \", \" << z_ << \")\" << std::endl;\n",
-    "}"
+    "}\n",
+    "\n"
    ]
   },
   {
@@ -284,7 +281,23 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "VectorPlusAsMethod VectorPlusAsMethod::operator+(const VectorPlusAsMethod& v) const\n",
     "{\n",
+    "    VectorPlusAsMethod ret;\n",
+    "    ret.x_ = x_ + v.x_;\n",
+    "    ret.y_ = y_ + v.y_;\n",
+    "    ret.z_ = z_ + v.z_;\n",
+    "\n",
+    "    return ret;\n",
+    "}\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "    VectorPlusAsMethod v1(3., 5., 7.);\n",
     "    VectorPlusAsMethod v2(7., 5., 3.);\n",
     "    \n",
@@ -292,8 +305,7 @@
     "    v3.Print();\n",
     "    \n",
     "    VectorPlusAsMethod v4 = v1.operator+(v2); // but \"usual\" method syntax is possible as well\n",
-    "    v4.Print();\n",
-    "}"
+    "    v4.Print();\n"
    ]
   },
   {
@@ -321,6 +333,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "\n",
     "class VectorPlusDouble\n",
     "{\n",
     "    public :\n",
@@ -331,22 +345,13 @@
     "    \n",
     "        void Print() const;\n",
     "    \n",
-    "        // Defined in the class declaration due to Xeus-cling limitation.\n",
-    "        VectorPlusDouble operator+(double value) const\n",
-    "        {\n",
-    "            VectorPlusDouble ret;\n",
-    "            ret.x_ = x_ + value;\n",
-    "            ret.y_ = y_ + value;\n",
-    "            ret.z_ = z_ + value;\n",
-    "    \n",
-    "            return ret;\n",
-    "        }\n",
+    "        VectorPlusDouble operator+(double value) const;\n",
     "\n",
     "    private :\n",
     "    \n",
-    "        double x_ = 0.;\n",
-    "        double y_ = 0.;\n",
-    "        double z_ = 0.;\n",
+    "        double x_ {};\n",
+    "        double y_ {};\n",
+    "        double z_ {};\n",
     "}; "
    ]
   },
@@ -370,13 +375,32 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "\n",
     "VectorPlusDouble::VectorPlusDouble(double x, double y, double z)\n",
-    ": x_(x),\n",
-    "y_(y),\n",
-    "z_(z)\n",
+    ": x_{x},\n",
+    "y_{y},\n",
+    "z_{z}\n",
     "{ }"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "VectorPlusDouble VectorPlusDouble::operator+(double value) const\n",
+    "{\n",
+    "    VectorPlusDouble ret;\n",
+    "    ret.x_ = x_ + value;\n",
+    "    ret.y_ = y_ + value;\n",
+    "    ret.z_ = z_ + value;\n",
+    "\n",
+    "    return ret;\n",
+    "}"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -432,9 +456,9 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "If you want it to be possible, you have to define the operator with arguments in both orders; you therefore need to use out-of-class prototype of the function (can't show it currently due to Xeus-cling limitation, available [@Coliru](https://coliru.stacked-crooked.com/a/c03fc40e0f0a8ea0)).\n",
+    "If you want it to be possible, you have to define the operator with arguments in both orders; you therefore need to use out-of-class prototype of the function.\n",
     "\n",
-    "Of course, it is a **good practice** to define one in way of the other:"
+    "Of course, it is a **good practice** in this case to define one in way of the other:"
    ]
   },
   {
@@ -443,10 +467,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Won't compile in Xeus-cling\n",
-    "\n",
-    "#include <cstdlib>\n",
-    "#include <iostream>\n",
+    "%%cppmagics cppyy/cppdef\n",
     "\n",
     "class VectorPlusDoubleCommutative\n",
     "{\n",
@@ -464,27 +485,47 @@
     "\n",
     "    private :\n",
     "    \n",
-    "        double x_ = 0.;\n",
-    "        double y_ = 0.;\n",
-    "        double z_ = 0.;\n",
-    "}; \n",
-    "\n",
-    "\n",
+    "        double x_ {};\n",
+    "        double y_ {};\n",
+    "        double z_ {};\n",
+    "}; "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#include <iostream>\n",
     "\n",
     "void VectorPlusDoubleCommutative::Print() const\n",
     "{\n",
     "    std::cout << \"(\" << x_ << \", \" << y_ << \", \" << z_ << \")\" << std::endl;\n",
-    "}\n",
-    "\n",
-    "\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "    \n",
     "VectorPlusDoubleCommutative::VectorPlusDoubleCommutative(double x, double y, double z)\n",
-    ": x_(x),\n",
-    "y_(y),\n",
-    "z_(z)\n",
-    "{ }\n",
-    "\n",
-    "\n",
-    "\n",
+    ": x_{x},\n",
+    "y_{y},\n",
+    "z_{z}\n",
+    "{ }"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "VectorPlusDoubleCommutative operator+(const VectorPlusDoubleCommutative& v, double value)\n",
     "{\n",
     "    VectorPlusDoubleCommutative ret;\n",
@@ -494,16 +535,27 @@
     "    ret.z_ = v.z_ + value;\n",
     "    \n",
     "    return ret;\n",
-    "}\n",
-    "\n",
-    "\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "VectorPlusDoubleCommutative operator+(double value, const VectorPlusDoubleCommutative& v)\n",
     "{\n",
     "    return v + value; // good practice: make it rely upon the other `operator+` defined!\n",
-    "}\n",
-    "\n",
-    "\n",
-    "int main(int argc, char** argv)\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "{\n",
     "    VectorPlusDoubleCommutative vector(5., 3.2, -1.);\n",
     "    VectorPlusDoubleCommutative vector_plus_5 = vector + 5.;\n",
@@ -511,9 +563,7 @@
     "    \n",
     "    vector_plus_5.Print();\n",
     "    vector_plus_5_commutated.Print();\n",
-    "    \n",
-    "    return EXIT_SUCCESS;\n",
-    "}\n"
+    "}"
    ]
   },
   {
@@ -650,7 +700,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Won't run in Xeus-cling, as it's not within the class declaration\n",
+    "// Won't run in the notebook, as it's not declared within the class declaration\n",
     "\n",
     "explicit operator int() const;\n",
     "explicit operator double() const;"
@@ -667,16 +717,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/3-Operators/1b-hands-on.ipynb b/3-Operators/1b-hands-on.ipynb
index 728dbce7e9eaaae0a8f593f37604e492884bad54..4f0d7ef2acd2641bbebde483507884945bca1d1c 100644
--- a/3-Operators/1b-hands-on.ipynb
+++ b/3-Operators/1b-hands-on.ipynb
@@ -78,16 +78,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/3-Operators/2-Comparison.ipynb b/3-Operators/2-Comparison.ipynb
index e572ba5f311209203e7776b8c52da4c448e9d266..6eb23e68bb2c0779a7c7b53576c5159011f6ebdd 100644
--- a/3-Operators/2-Comparison.ipynb
+++ b/3-Operators/2-Comparison.ipynb
@@ -15,9 +15,7 @@
     "\n",
     "These 4 operators are **not** implicitly defined for a class (and that is very natural: what would be the rationale to devise the default `<` operator for a `ComplexNumber` or a `Car` class?)\n",
     "\n",
-    "Let's take again our `Rational` class to illustrate this:\n",
-    "\n",
-    "**Xeus-cling** issue: cling doesn't accept operator definition outside of class; please use [@Coliru](https://coliru.stacked-crooked.com/a/6f0dc54ac63f476c):"
+    "Let's take again our `Rational` class to illustrate this:"
    ]
   },
   {
@@ -26,9 +24,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Xeus-cling issue: doesn't compile!\n",
-    "\n",
-    "#include <iostream>\n",
+    "%%cppmagics cppyy/cppdef\n",
     "\n",
     "class Rational\n",
     " {\n",
@@ -40,36 +36,62 @@
     "    \n",
     "  private :\n",
     "\n",
-    "    int numerator_ = 0;\n",
-    "    int denominator_ = 0;\n",
-    "\n",
-    "};\n",
+    "    int numerator_ {};\n",
+    "    int denominator_ {};\n",
     "\n",
+    "};"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%cppmagics cppyy/cppdef\n",
     "\n",
     "Rational::Rational(int numerator, int denominator)\n",
-    ": numerator_(numerator),\n",
-    "denominator_(denominator)\n",
-    "{ }\n",
-    "\n",
-    "\n",
+    ": numerator_{numerator},\n",
+    "denominator_{denominator}\n",
+    "{ }"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "Rational::operator double() const\n",
     "{\n",
     "    return static_cast<double>(numerator_) / denominator_;\n",
-    "}\n",
-    "\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "bool operator<(const Rational& lhs, const Rational& rhs)\n",
     "{\n",
     "    return static_cast<double>(lhs) < static_cast<double>(rhs);\n",
-    "}\n",
-    "\n",
-    "int main(int argc, char** argv)\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "{\n",
     "    Rational r1(15, 7);\n",
     "    Rational r2(27, 4);\n",
     "    \n",
-    "    std::cout << (r1 < r2) << std::endl;\n",
-    "    return EXIT_SUCCESS;\n",
-    "}\n"
+    "    std::cout << \"Is r1 lower than r2? -> \" << std::boolalpha << (r1 < r2) << std::endl;\n",
+    "}"
    ]
   },
   {
@@ -109,16 +131,11 @@
     "    \n",
     "        ~Vector();\n",
     "    \n",
-    "        // Working around the Xeus-cling bug but avoid direct definition in class declaration...\n",
-    "        // As mentioned previously free functions should be preferred, but still the Xeus-cling bug.\n",
-    "        bool operator==(const Vector& rhs) const\n",
-    "        {\n",
-    "            return array_ == rhs.array_; // BUG!\n",
-    "        }\n",
+    "        friend bool operator==(const Vector& lhs, const Vector& rhs);\n",
     "    \n",
     "    private:\n",
     "    \n",
-    "        int* array_ = nullptr;\n",
+    "        int* array_ { nullptr };\n",
     "};"
    ]
   },
@@ -149,6 +166,18 @@
     "}"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bool operator==(const Vector& lhs, const Vector& rhs)\n",
+    "{\n",
+    "    return lhs.array_ == rhs.array_; // BUG!\n",
+    "}"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -161,7 +190,7 @@
     "    Vector v1(3, 4, 5);\n",
     "    Vector v2(3, 4, 5);    \n",
     "    \n",
-    "    std::cout << \"Are equal? : \" << (v1 == v2) << std::endl;\n",
+    "    std::cout << \"Are equal? ('true' expected): \" << (v1 == v2) << std::endl;\n",
     "}"
    ]
   },
@@ -185,7 +214,7 @@
    "source": [
     "### Spaceship operator\n",
     "\n",
-    "Currently (in C++ 17 and below) you have to define all the comparison operators, which can quickly become rather tedious (the following code doesn't work in Xeus-cling; you may use [@Coliru](https://coliru.stacked-crooked.com/a/122ec1b6a6ac3d0f)):"
+    "In C++ 17 and below, you have to define all the comparison operators, which can quickly become rather tedious (and error-prone):"
    ]
   },
   {
@@ -194,70 +223,134 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Xeus-cling issue: doesn't compile!\n",
+    "%%cppmagics cppyy/cppdef\n",
     "\n",
     "#include <iostream>\n",
     "#include <cmath>\n",
     "\n",
-    "class Rational\n",
-    " {\n",
+    "class Rational20\n",
+    "{\n",
     "  public :\n",
     "\n",
-    "    explicit Rational(int numerator, int denominator);\n",
+    "    explicit Rational20(int numerator, int denominator);\n",
     "    \n",
     "    explicit operator double() const;\n",
     "    \n",
     "  private :\n",
     "\n",
-    "    int numerator_ = 0;\n",
-    "    int denominator_ = 0;\n",
+    "    int numerator_ {};\n",
+    "    int denominator_ {};\n",
     "\n",
-    "};\n",
-    "\n",
-    "Rational::Rational(int numerator, int denominator)\n",
-    ": numerator_(numerator),\n",
-    "denominator_(denominator)\n",
-    "{ }\n",
-    "\n",
-    "Rational::operator double() const\n",
+    "};"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "    \n",
+    "Rational20::Rational20(int numerator, int denominator)\n",
+    ": numerator_{numerator},\n",
+    "denominator_{denominator}\n",
+    "{ }"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "Rational20::operator double() const\n",
     "{\n",
     "    return static_cast<double>(numerator_) / static_cast<double>(denominator_);\n",
-    "}\n",
-    "\n",
-    "bool operator<(const Rational& lhs, const Rational& rhs)\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bool operator<(const Rational20& lhs, const Rational20& rhs)\n",
     "{\n",
     "    return static_cast<double>(lhs) < static_cast<double>(rhs);\n",
-    "}\n",
-    "\n",
-    "bool operator==(const Rational& lhs, const Rational& rhs)\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bool operator==(const Rational20& lhs, const Rational20& rhs)\n",
     "{\n",
     "    return std::fabs(static_cast<double>(lhs)  - static_cast<double>(rhs) ) < 1.e-16; // crude...\n",
-    "}\n",
-    "\n",
-    "bool operator!=(const Rational& lhs, const Rational& rhs)\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bool operator!=(const Rational20& lhs, const Rational20& rhs)\n",
     "{\n",
     "    return !operator==(lhs, rhs);\n",
-    "}\n",
-    "\n",
-    "bool operator>(const Rational& lhs, const Rational& rhs) \n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bool operator>(const Rational20& lhs, const Rational20& rhs) \n",
     "{\n",
     "    return operator<(rhs, lhs);\n",
-    "}\n",
-    "\n",
-    "bool operator>=(const Rational& lhs, const Rational& rhs) \n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bool operator>=(const Rational20& lhs, const Rational20& rhs) \n",
     "{\n",
     "    return !operator<(lhs, rhs);\n",
-    "}\n",
-    "\n",
-    "bool operator<=(const Rational& lhs, const Rational& rhs)\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bool operator<=(const Rational20& lhs, const Rational20& rhs)\n",
     "{\n",
     "    return !operator>(lhs, rhs);\n",
-    "}\n",
-    "\n",
-    "int main()\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "{\n",
-    "    Rational a(5, 2);\n",
-    "    Rational b(17, 5);    \n",
+    "    Rational20 a(5, 2);\n",
+    "    Rational20 b(17, 5);    \n",
     "    \n",
     "    std::cout << std::boolalpha << \"a < b ? -> \" << (a < b) << std::endl;\n",
     "    std::cout << std::boolalpha << \"a > b ? -> \" << (a > b) << std::endl;    \n",
@@ -265,8 +358,6 @@
     "    std::cout << std::boolalpha << \"a >= b ? -> \" << (a >= b) << std::endl;\n",
     "    std::cout << std::boolalpha << \"a == b ? -> \" << (a == b) << std::endl;\n",
     "    std::cout << std::boolalpha << \"a != b ? -> \" << (a != b) << std::endl;         \n",
-    "    \n",
-    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
@@ -274,7 +365,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "C++ 20 introduces the so-called spaceship operator, which enables defining more concisely all those operators  (the following code doesn't work in Xeus-cling; you may use [@Coliru](https://coliru.stacked-crooked.com/a/1cec8ddda8a1eece)):"
+    "C++ 20 introduces the so-called spaceship operator, which enables defining more concisely all those operators:"
    ]
   },
   {
@@ -283,10 +374,17 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Xeus-cling issue: doesn't compile! (and C++ 20 not yet supported there anyway)\n",
+    "%%cppmagics clang\n",
+    "// We're using native compiler here as the standard library embedded with `cling` - the interpreter used by our kernel - \n",
+    "// doesn't support yet `std::partial_ordering`.\n",
     "\n",
-    "#include <iostream>\n",
     "#include <cmath>\n",
+    "#include <compare>\n",
+    "#include <iostream>\n",
+    "\n",
+    "// ===========================\n",
+    "// Declarations\n",
+    "// ===========================\n",
     "\n",
     "class Rational20\n",
     "{\n",
@@ -298,14 +396,23 @@
     "    \n",
     "  private :\n",
     "\n",
-    "    int numerator_ = 0;\n",
-    "    int denominator_ = 0;\n",
+    "    int numerator_ {};\n",
+    "    int denominator_ {};\n",
     "\n",
     "};\n",
     "\n",
+    "bool operator==(const Rational20& lhs, const Rational20& rhs);\n",
+    "\n",
+    "std::partial_ordering operator<=>(const Rational20& lhs, const Rational20& rhs);\n",
+    "\n",
+    "// ===========================\n",
+    "// Definitions\n",
+    "// ===========================\n",
+    "\n",
+    "   \n",
     "Rational20::Rational20(int numerator, int denominator)\n",
-    ": numerator_(numerator),\n",
-    "denominator_(denominator)\n",
+    ": numerator_{numerator},\n",
+    "denominator_{denominator}\n",
     "{ }\n",
     "\n",
     "Rational20::operator double() const\n",
@@ -313,19 +420,22 @@
     "    return static_cast<double>(numerator_) / static_cast<double>(denominator_);\n",
     "}\n",
     "\n",
-    "\n",
     "bool operator==(const Rational20& lhs, const Rational20& rhs)\n",
     "{\n",
     "    return std::fabs(static_cast<double>(lhs) - static_cast<double>(rhs)) < 1.e-16; // crude...\n",
     "}\n",
     "\n",
+    "\n",
     "std::partial_ordering operator<=>(const Rational20& lhs, const Rational20& rhs)\n",
     "{\n",
     "    return static_cast<double>(lhs) <=> static_cast<double>(rhs);\n",
     "}\n",
     "\n",
+    "// ===========================\n",
+    "// Main\n",
+    "// ===========================\n",
     "\n",
-    "int main()\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
     "    Rational20 a(5, 2);\n",
     "    Rational20 b(17, 5);    \n",
@@ -336,8 +446,6 @@
     "    std::cout << std::boolalpha << \"a >= b ? -> \" << (a >= b) << std::endl;\n",
     "    std::cout << std::boolalpha << \"a == b ? -> \" << (a == b) << std::endl;\n",
     "    std::cout << std::boolalpha << \"a != b ? -> \" << (a != b) << std::endl;         \n",
-    "    \n",
-    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
@@ -374,13 +482,11 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Xeus-cling issue: doesn't compile!\n",
-    "\n",
     "bool operator==(const Toolbox& lhs, const Toolbox& rhs)\n",
     "{\n",
     "    return lhs.Nscrewdriver_ == rhs.Nscrewdriver_\n",
     "        && lhs.Nhammer_ == rhs.Nhammer_\n",
-    "        && lhs.Nails_ == rhs.Nnails_;    \n",
+    "        && lhs.Nnails_ == rhs.Nnails_;    \n",
     "}"
    ]
   },
@@ -390,7 +496,7 @@
    "source": [
     "This is rather cumbersome to type, but it is even dangerous: if at some point we extend the class and add `Nsaw_` for instance, we need not to forget to update the operator as well!\n",
     "\n",
-    "C++ 20 will enable default behaviour for the comparison operators, so in this case you would be able to write instead ([@Coliru](https://coliru.stacked-crooked.com/a/fa889df647c73a7f)):"
+    "C++ 20 will enable default behaviour for the comparison operators, so in this case you would be able to write instead:"
    ]
   },
   {
@@ -399,13 +505,17 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics clang\n",
+    "// We're using native compiler here as the standard library embedded with `cling` - the interpreter used by our kernel - \n",
+    "// doesn't support yet properly spaceship operator.\n",
+    "\n",
     "#include <iostream>\n",
     "\n",
-    "struct Toolbox\n",
+    "struct AutomatedToolbox\n",
     "{\n",
-    "    bool operator==(const Toolbox&) const = default;\n",
+    "    bool operator==(const AutomatedToolbox&) const = default;\n",
     "\n",
-    "    auto operator<=>(const Toolbox&) const = default;\n",
+    "    auto operator<=>(const AutomatedToolbox&) const = default;\n",
     "    \n",
     "    unsigned int Nscrewdriver_;\n",
     "    \n",
@@ -414,15 +524,14 @@
     "    unsigned int Nnails_;        \n",
     "};\n",
     "\n",
-    "\n",
-    "int main(int argc, char** argv)\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
-    "    Toolbox toolbox1;\n",
+    "    AutomatedToolbox toolbox1;\n",
     "    toolbox1.Nscrewdriver_ = 5;\n",
     "    toolbox1.Nhammer_ = 4;\n",
     "    toolbox1.Nnails_ = 200;\n",
     " \n",
-    "    Toolbox toolbox2;\n",
+    "    AutomatedToolbox toolbox2;\n",
     "    toolbox2.Nscrewdriver_ = 5;\n",
     "    toolbox2.Nhammer_ = 4;\n",
     "    toolbox2.Nnails_ = 200;\n",
@@ -449,14 +558,14 @@
    "source": [
     "// What the operator< would look like if we wrote it ourselves:\n",
     "\n",
-    "bool operator<(const Rational& lhs, const Rational& rhs)\n",
+    "bool operator<(const Toolbox& lhs, const Toolbox& rhs)\n",
     "{\n",
-    "    if !(toolbox1.Nscrewdriver_ == toolbox2.Nscrewdriver_)\n",
-    "        return toolbox1.Nscrewdriver_ < toolbox2.Nscrewdriver_;\n",
-    "    if !(toolbox1.Nhammer_ == toolbox2.Nhammer_)\n",
-    "        return toolbox1.Nhammer_ < toolbox2.Nhammer_;\n",
-    "    if !(toolbox1.Nnails_ == toolbox2.Nnails_)\n",
-    "        return toolbox1.Nnails_ < toolbox2.Nnails_;\n",
+    "    if (lhs.Nscrewdriver_ != rhs.Nscrewdriver_)\n",
+    "        return lhs.Nscrewdriver_ < rhs.Nscrewdriver_;\n",
+    "    if (lhs.Nhammer_ != rhs.Nhammer_)\n",
+    "        return lhs.Nhammer_ < rhs.Nhammer_;\n",
+    "    if (lhs.Nnails_ != rhs.Nnails_)\n",
+    "        return lhs.Nnails_ < rhs.Nnails_;\n",
     "    return false;\n",
     "}"
    ]
@@ -467,7 +576,7 @@
    "source": [
     "[This example](https://www.modernescpp.com/index.php/c-20-more-details-to-the-spaceship-operator), or [that example](https://devblogs.microsoft.com/cppblog/simplify-your-code-with-rocket-science-c20s-spaceship-operator/) show other defaulting of a comparison used directly upon the spaceship operator.\n",
     "\n",
-    "**Be aware** the default implementation may not be what you expected (see the `Rational` example, where even the default `operator==` is unlikely to be what we want)."
+    "**Be aware** the default implementation may not be what you expected (see the `Rational` example, where even the default `operator==` is unlikely to be what you want)."
    ]
   },
   {
@@ -481,16 +590,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/3-Operators/3-Stream.ipynb b/3-Operators/3-Stream.ipynb
index 6ef3ee823087eb3d7261ad57f0a19fdf5fe330aa..175b2acacfcf74218ac69a1a97f6d82eb978d285 100644
--- a/3-Operators/3-Stream.ipynb
+++ b/3-Operators/3-Stream.ipynb
@@ -17,9 +17,7 @@
     "\n",
     "However, it's even better if we could use the `<<` syntax directly, and the way to do so is to provide an overload of `operator<<`.\n",
     "\n",
-    "The recommended way to implement it is to use under the hood a `Print(std::ostream&)` (or whatever you want to call it):\n",
-    "\n",
-    "**Xeus-cling** issue: cling doesn't accept operator definition outside of class; please use [@Coliru](https://coliru.stacked-crooked.com/a/04f59249cce6c131)"
+    "The recommended way to implement it is to use under the hood a `Print(std::ostream&)` (or whatever you want to call it):"
    ]
   },
   {
@@ -28,8 +26,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Doesn't run on Xeus-cling due to definition of an operator outside of a class \n",
-    "// A ticket has been opened for this: https://github.com/QuantStack/xeus-cling/issues/214 \n",
+    "%%cppmagics cppyy/cppdef\n",
     "\n",
     "#include <iostream>\n",
     "\n",
@@ -44,32 +41,56 @@
     "\n",
     "    private :\n",
     "\n",
-    "        int numerator_ = 0;\n",
-    "        int denominator_ = 0;\n",
-    "\n",
-    "};\n",
-    "\n",
-    "\n",
+    "        int numerator_ {};\n",
+    "        int denominator_ {};\n",
+    "};"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "    \n",
     "Rational::Rational(int numerator, int denominator)\n",
-    ": numerator_(numerator),\n",
-    "denominator_(denominator)\n",
-    "{ }\n",
-    "\n",
-    "\n",
+    ": numerator_{numerator},\n",
+    "denominator_{denominator}\n",
+    "{ }"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "void Rational::Print(std::ostream& out) const\n",
     "{\n",
     "    out << numerator_ << \" / \" << denominator_;\n",
-    "}\n",
-    "\n",
-    "\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "std::ostream& operator<<(std::ostream& out, const Rational& r)\n",
     "{\n",
     "    r.Print(out); // see how the bulk of the work is done by the 'Print()' method!\n",
     "    return out;\n",
-    "}\n",
-    "\n",
-    "\n",
-    "int main()\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "{\n",
     "    Rational r1(22, 7);\n",
     "    Rational r2(77, 17);\n",
@@ -77,8 +98,6 @@
     "    \n",
     "    std::cout << \"Call may also be chained due to the signature of the function: \" << r1 \n",
     "        << \" and \" << r2 << std::endl;\n",
-    "    \n",
-    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
@@ -95,16 +114,11 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Doesn't run on Xeus-cling!\n",
-    "\n",
-    "int main()\n",
     "{\n",
     "    \n",
     "    Rational r1(22, 7);\n",
     "    Rational r2(84, 9);    \n",
     "    std::cout << \"Rationals = \" << r1 << \" and \" << r2 << std::endl;    \n",
-    " \n",
-    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
@@ -123,8 +137,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Doesn't run on Xeus-cling due to definition of an operator outside of a class \n",
-    "// A ticket has been opened for this: https://github.com/QuantStack/xeus-cling/issues/214 \n",
+    "%%cppmagics std::cin/clang\n",
     "\n",
     "#include <iostream>\n",
     "\n",
@@ -134,7 +147,6 @@
     "\n",
     "        explicit Rational(int numerator, int denominator);\n",
     "        \n",
-    "\n",
     "        void Print(std::ostream& out) const;\n",
     "        \n",
     "        friend std::istream& operator>>(std::istream& in, Rational& r);\n",
@@ -148,14 +160,14 @@
     "\n",
     "    private :\n",
     "\n",
-    "        int numerator_ = 0;\n",
-    "        int denominator_ = 0;\n",
+    "        int numerator_ {};\n",
+    "        int denominator_ {};\n",
     "\n",
     "};\n",
     "\n",
     "Rational::Rational(int numerator, int denominator)\n",
-    ": numerator_(numerator),\n",
-    "denominator_(denominator)\n",
+    ": numerator_{numerator},\n",
+    "denominator_{denominator}\n",
     "{ }\n",
     "\n",
     "void Rational::Print(std::ostream& out) const\n",
@@ -170,7 +182,6 @@
     "    return out;\n",
     "}\n",
     "\n",
-    "\n",
     "void Rational::Set(int numerator, int denominator)\n",
     "{\n",
     "    numerator_ = numerator;   \n",
@@ -193,8 +204,6 @@
     "    return in;\n",
     "}\n",
     "\n",
-    "\n",
-    "\n",
     "int main()\n",
     "{\n",
     "    Rational r1(0,0);\n",
@@ -206,7 +215,7 @@
     "    if (std::cin)\n",
     "        std::cout << \"Value read is \" << r1 << std::endl;\n",
     "    else\n",
-    "        std::cout << \"Invalid input!\" << std::endl;\n",
+    "        std::cerr << \"Invalid input!\" << std::endl;\n",
     "    \n",
     "    return EXIT_SUCCESS;\n",
     "}"
@@ -216,9 +225,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "This code doesn't run neither in Xeus-cling (due to the operator bug) nor in [Coliru](https://coliru.stacked-crooked.com/) or [Wandbox](https://wandbox.org/) (due to limited `std::cin` support) but you may check it on a local installation.\n",
-    "\n",
-    "Even then, it is not perfect: it handles correctly the case gibberish is given through `std::cin`, but if you put more than two blocks separated by spaces the first two ones are used and the others aren't dealt with... As I said, proper and complete handling of input stream is though!"
+    "This code is far from perfect: it handles correctly the case gibberish is given through `std::cin`, but if you put more than two blocks separated by spaces the first two ones are used and the others aren't dealt with... As we have already said, proper and complete handling of input stream is though!"
    ]
   },
   {
@@ -232,16 +239,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/3-Operators/3b-hands-on.ipynb b/3-Operators/3b-hands-on.ipynb
index f1858dd3f25fc9b5c626595118780c0413cbf916..8c024f045dc1316d32cdaa5049932e117bbfa61c 100644
--- a/3-Operators/3b-hands-on.ipynb
+++ b/3-Operators/3b-hands-on.ipynb
@@ -47,16 +47,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/3-Operators/4-CanonicalForm.ipynb b/3-Operators/4-CanonicalForm.ipynb
index 5e150b8dc248fad509611e6f31d6f8ea5b54e8f9..6312c50435bd11b4b84e7f7ce47430477c4346d8 100644
--- a/3-Operators/4-CanonicalForm.ipynb
+++ b/3-Operators/4-CanonicalForm.ipynb
@@ -26,6 +26,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "\n",
     "#include <iostream>\n",
     "\n",
     "class Vector\n",
@@ -39,9 +41,9 @@
     "    \n",
     "    private:\n",
     "    \n",
-    "        double x_ = 0.;    \n",
-    "        double y_ = 0.;    \n",
-    "        double z_ = 0.;    \n",
+    "        double x_ {};\n",
+    "        double y_ {};\n",
+    "        double z_ {};\n",
     "};"
    ]
   },
@@ -51,10 +53,12 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "    \n",
     "Vector::Vector(double x, double y, double z)\n",
-    ": x_(x),\n",
-    "y_(y),\n",
-    "z_(z)\n",
+    ": x_{x},\n",
+    "y_{y},\n",
+    "z_{z}\n",
     "{ }"
    ]
   },
@@ -113,7 +117,7 @@
     "    \n",
     "    private:\n",
     "    \n",
-    "        double* array_ = nullptr;\n",
+    "        double* array_ { nullptr };\n",
     "};"
    ]
   },
@@ -181,17 +185,75 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "At the time of this writing, this makes the kernel crash... In a more advanced environment ([Wandbox](https://wandbox.org) for instance) the reason appears more clearly:"
+    "At the time of this writing, this makes the kernel crash... In a more realistic environment (below when the code is compiled with clang and executed, but you can play with [Wandbox](https://wandbox.org) if you want to see how the different compilers handle it) the reason appears more clearly:"
    ]
   },
   {
-   "cell_type": "markdown",
+   "cell_type": "code",
+   "execution_count": null,
    "metadata": {},
+   "outputs": [],
    "source": [
-    "```txt\n",
-    "** Error in `./prog.exe': double free or corruption (fasttop): 0x0000000001532da0 **\n",
-    "```\n",
+    "%%cppmagics clang\n",
+    "// Exact same code as abovce, but given to your clang++ compiler to be compiled and executed\n",
+    "\n",
+    "#include <iostream>\n",
+    "\n",
+    "class Vector2\n",
+    "{\n",
+    "    public:\n",
+    "        Vector2(double x, double y, double z);\n",
+    "    \n",
+    "        ~Vector2();\n",
+    "    \n",
+    "        void Print(std::ostream& out) const;\n",
+    "    \n",
+    "    private:\n",
+    "    \n",
+    "        double* array_ { nullptr };\n",
+    "};\n",
+    "\n",
+    "Vector2::Vector2(double x, double y, double z)\n",
+    "{ \n",
+    "    array_ = new double[3];\n",
+    "    array_[0] = x;\n",
+    "    array_[1] = y;\n",
+    "    array_[2] = z;\n",
+    "}\n",
+    "\n",
+    "Vector2::~Vector2()\n",
+    "{\n",
+    "    delete[] array_;\n",
+    "}\n",
+    "\n",
+    "void Vector2::Print(std::ostream& out) const\n",
+    "{\n",
+    "    out << \"(\" << array_[0] << \", \" << array_[1]  << \", \" << array_[2]  << \")\";\n",
+    "}\n",
     "\n",
+    "\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
+    "{\n",
+    "    // Dynamic allocation here just to be able to make our point due to the explicit call of destructor with `delete`\n",
+    "    Vector2* v1 = new Vector2(3., 5., 7.);    \n",
+    "    Vector2* v2 = new Vector2(-4., -16., 0.);\n",
+    "\n",
+    "    v2 = v1;\n",
+    "    \n",
+    "    std::cout << \"Delete v1 @ \" << std::hex << v1 << std::endl;\n",
+    "    delete v1;\n",
+    "\n",
+    "    std::cout << \"Delete v2 @ \" << std::hex << v2 << std::endl;\n",
+    "    delete v2;\n",
+    "\n",
+    "    return EXIT_SUCCESS;\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
     "So what's the deal? The default operator copies all the data attributes from `v1` to `v2`... which here amounts only to the `array_` pointer. But it really copies that: the pointer itself, _not_ the data pointed by this pointer. So in fine v1 and v2 points to the same area of memory, and the issue is that we attempt to free the same memory twice.\n",
     "\n",
     "One way to solve this is not to use a dynamic array - for instance you would be cool with a `std::vector`. But we can do so properly by hand as well (in practice don't - stick with `std::vector`!):\n"
@@ -203,6 +265,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "\n",
     "#include <iostream>\n",
     "\n",
     "class Vector3\n",
@@ -211,22 +275,14 @@
     "        Vector3(double x, double y, double z);\n",
     "    \n",
     "        ~Vector3();\n",
-    "    \n",
-    "        // Then again the Xeus-cling issue with out of class operator definition.\n",
-    "        Vector3& operator=(const Vector3& rhs)\n",
-    "        {\n",
-    "            // Array already initialized in constructor; just change its content.\n",
-    "            for (auto i = 0ul; i < 3ul; ++i)\n",
-    "                array_[i] = rhs.array_[i];\n",
     "            \n",
-    "            return *this; // The (logical) return value for such a method.\n",
-    "        }\n",
-    "    \n",
+    "        Vector3& operator=(const Vector3& rhs);\n",
+    "   \n",
     "        void Print(std::ostream& out) const;\n",
     "    \n",
     "    private:\n",
     "    \n",
-    "        double* array_ = nullptr;\n",
+    "        double* array_ { nullptr };\n",
     "};"
    ]
   },
@@ -269,6 +325,22 @@
     "}"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "Vector3& Vector3::operator=(const Vector3& rhs)\n",
+    "{\n",
+    "    // Array already initialized in constructor; just change its content.\n",
+    "    for (auto i = 0ul; i < 3ul; ++i)\n",
+    "        array_[i] = rhs.array_[i];\n",
+    "    \n",
+    "    return *this; // The (logical) return value for such a method.\n",
+    "}"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -292,7 +364,7 @@
    "source": [
     "### Uncopyable class\n",
     "\n",
-    "In fact when I said by default an assignment operator is made available for the class, I was overly simplifying the issue. Let's consider for instance a class with a reference data attribute:"
+    "In fact when we said by default an assignment operator is made available for the class, we were overly simplifying the issue. Let's consider for instance a class with a reference data attribute:"
    ]
   },
   {
@@ -432,7 +504,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "### The dangers of copy constructions... and how I avoid them\n",
+    "### The dangers of copy constructions... and how I (Sébastien) avoid them\n",
     "\n",
     "Copy construction may in fact be quite dangerous:\n",
     "\n",
@@ -548,16 +620,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/3-Operators/5-Functors.ipynb b/3-Operators/5-Functors.ipynb
index 2306b26e5cc5a20d2bf3c5356d166199eda7afd0..5ff1b0951a91fea436ef0783022a44b47d7804f4 100644
--- a/3-Operators/5-Functors.ipynb
+++ b/3-Operators/5-Functors.ipynb
@@ -39,15 +39,11 @@
     "\n",
     "        LinearFunction(int constant);\n",
     "\n",
-    "        int operator()(int value)\n",
-    "        {\n",
-    "            return constant_ * value; // here due to usual Xeus-cling issue when out of class \n",
-    "                                      // definition is used for operators\n",
-    "        }\n",
+    "        int operator()(int value) const;\n",
     "\n",
     "    private :\n",
     "\n",
-    "        int constant_ = 0.;\n",
+    "        int constant_ {};\n",
     "\n",
     " } ;\n"
    ]
@@ -58,8 +54,22 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "int LinearFunction::operator()(int value) const\n",
+    "{\n",
+    "    return constant_ * value;\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "\n",
     "LinearFunction::LinearFunction(int constant)\n",
-    ": constant_(constant)\n",
+    ": constant_{constant}\n",
     "{ }"
    ]
   },
@@ -131,16 +141,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/3-Operators/5b-hands-on.ipynb b/3-Operators/5b-hands-on.ipynb
index 05a6ab8ec4990d666a26c41274a64ad86643b9bb..7d358af14f5eafcd2796fde8e29b96530ba00012 100644
--- a/3-Operators/5b-hands-on.ipynb
+++ b/3-Operators/5b-hands-on.ipynb
@@ -45,16 +45,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/4-Templates/0-main.ipynb b/4-Templates/0-main.ipynb
index a3a0b0dca79810fa444fbdae9159ec2e11759bcb..8e496bbb04e7d1431043acc1dc42219732f6b60c 100644
--- a/4-Templates/0-main.ipynb
+++ b/4-Templates/0-main.ipynb
@@ -31,16 +31,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/4-Templates/1-Intro.ipynb b/4-Templates/1-Intro.ipynb
index ee4c521129d195f9c91e20f443d5cd8807263c76..651606c4f2360b6d191f0b8f1ac569d923f96fe2 100644
--- a/4-Templates/1-Intro.ipynb
+++ b/4-Templates/1-Intro.ipynb
@@ -458,7 +458,7 @@
    "source": [
     "{\n",
     "    HoldAValue3<int> hold(5);\n",
-    "    Print(hold); // LINK ERROR, and that is not something amiss in Xeus-cling!\n",
+    "    Print(hold); // LINK ERROR, and that is not something amiss with notebook kernel!\n",
     "}"
    ]
   },
@@ -475,6 +475,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "\n",
     "template<class T>\n",
     "class HoldAValue4\n",
     "{\n",
@@ -499,9 +501,11 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "    \n",
     "template<class T>\n",
     "HoldAValue4<T>::HoldAValue4(T value)\n",
-    ": value_(value)\n",
+    ": value_{value}\n",
     "{ }"
    ]
   },
@@ -511,6 +515,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "    \n",
     "#include <iostream>\n",
     "\n",
     "// Notice it is only a label: in the definition I'm free to use the same label as for the class definitions!\n",
@@ -674,16 +680,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/4-Templates/1b-hands-on.ipynb b/4-Templates/1b-hands-on.ipynb
index 0c97e659961f3640d7bf6340aa729f4b1f6496c2..8d4249312659702e84ba179bb69661190f43bfcc 100644
--- a/4-Templates/1b-hands-on.ipynb
+++ b/4-Templates/1b-hands-on.ipynb
@@ -171,16 +171,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/4-Templates/2-Specialization.ipynb b/4-Templates/2-Specialization.ipynb
index a473e96346f5f1e2fde9baa9054a41a63240bfea..a5137d6e220f72f3c88b51cf56a58e549b9517dc 100644
--- a/4-Templates/2-Specialization.ipynb
+++ b/4-Templates/2-Specialization.ipynb
@@ -413,9 +413,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "You might have the impress it works if you try defining the function without specifying the brackets\n",
-    "\n",
-    "_(please use [@Coliru](https://coliru.stacked-crooked.com/a/ad6d2ceca1d05b0f) - the code below no longer works in Xeus-cling as of September 2022)_"
+    "You might have the impress it works if you try defining the function without specifying the brackets:"
    ]
   },
   {
@@ -424,8 +422,6 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// DOESN'T WORK ON XEUS-CLING!\n",
-    "\n",
     "#include <iostream>\n",
     "#include <string>\n",
     "\n",
@@ -436,31 +432,61 @@
     "    std::cout << \"(t^2, u^2) = (\" << t * t << \", \" << u * u << \")\" << std::endl;\n",
     "    // As '*' is not defined for std::string, one would expect a failure if invoked with\n",
     "    // `std::string` for T or U \n",
-    "}\n",
-    "\n",
-    "\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "template<class T>\n",
     "void PrintSquare(T t, std::string u)\n",
     "{\n",
     "    std::cout << \"Seemingly ok function template specialization \" << std::endl;\n",
     "    std::cout << \"(t^2, u^2) = (\" << t * t << \", \" << (u + u) << \")\" << std::endl;\n",
-    "}\n",
-    "\n",
-    "\n",
-    "int main(int argc, char** argv)\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "{\n",
     "    std::string hello(\"Hello\");\n",
     "    PrintSquare(5., hello);\n",
-    "    \n",
-    "    // But if you uncomment this line which explicitly calls the template function\n",
-    "    // with both types explicitly given the compilation will fail...\n",
-    "    // PrintSquare<double, std::string>(5., std::string(\"Hello\"));\n",
-    "    \n",
-    "    // ... whereas it is a perfectly legit way of calling a template instantiation, as you may check with:\n",
-    "    // PrintSquare<double, int>(5., 3);\n",
-    "    \n",
-    "    \n",
-    "    return EXIT_SUCCESS;  \n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "{\n",
+    "    PrintSquare<double, std::string>(5., std::string(\"Hello\")); // FAILS!\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "If you have any doubt, above syntax is perfectly valid to call template specialization as seen in the example below:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "{\n",
+    "    PrintSquare<double, int>(5., 3);\n",
     "}"
    ]
   },
@@ -645,16 +671,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/4-Templates/3-Syntax.ipynb b/4-Templates/3-Syntax.ipynb
index 8b5c0082478a3ea44e5bdf6ea9c2ddf3c32636d6..5c9d5989140f169a2a6a83e5d79232e719c1175c 100644
--- a/4-Templates/3-Syntax.ipynb
+++ b/4-Templates/3-Syntax.ipynb
@@ -221,7 +221,7 @@
    "source": [
     "### [optional] A bit of wandering: how will C++ 20 concepts will help to enforce the constraint upon the template parameter\n",
     "\n",
-    "Once again, C++ 20 concept will be much appreciated here to provide more straightforward error messages (see [@Coliru](https://coliru.stacked-crooked.com/a/4cc87e5a41d1a94c)):"
+    "Once again, C++ 20 concept will be much appreciated here to provide more straightforward error messages:"
    ]
   },
   {
@@ -230,7 +230,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// C++ 20 code - run it in Coliru!\n",
+    "%%cppmagics clang\n",
+    "// `cling` C++ interpreter used by kernel doesn't support yet C++ 20 concepts.\n",
     "\n",
     "#include <iostream>\n",
     "#include <vector>\n",
@@ -250,34 +251,18 @@
     "}\n",
     "\n",
     "\n",
-    "int main(int argc, char** argv)\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
     "    PrintFive<std::vector<int>>();\n",
     "    \n",
     "    PrintFive<std::list<int>>();\n",
     "    \n",
-    "    // PrintFive<int>(); // COMPILATION ERROR! But with a clear error message.\n",
+    "    PrintFive<int>(); // COMPILATION ERROR! But with a clear error message.\n",
     "    \n",
     "    return EXIT_SUCCESS;   \n",
     "}"
    ]
   },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "The error message (with gcc) includes all the relevant information to understand what is wrong the the `int` case:\n",
-    "\n",
-    "```shell\n",
-    "main.cpp: In function 'int main(int, char**)':\n",
-    "main.cpp:27:20: error: use of function 'void PrintFive() [with ContainerT = int]' with unsatisfied constraints\n",
-    "   27 |     PrintFive<int>(); // COMPILATION ERROR! But with a clear error message.  \n",
-    "...\n",
-    "main.cpp:8:14: note: the required type 'typename T::value_type' is invalid\n",
-    "    8 |     typename T::value_type;\n",
-    "```\n"
-   ]
-  },
   {
    "cell_type": "markdown",
    "metadata": {},
@@ -323,11 +308,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "metadata": {
-    "jupyter": {
-     "source_hidden": true
-    }
-   },
+   "metadata": {},
    "outputs": [],
    "source": [
     "template<class U>\n",
@@ -419,16 +400,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/4-Templates/3b-hands-on.ipynb b/4-Templates/3b-hands-on.ipynb
index 3f872eaf27e6d26d68b1443fa35373a10c0187a0..e56fd43fdb2892c356e58dd6f4f11ccfa2bf83e8 100644
--- a/4-Templates/3b-hands-on.ipynb
+++ b/4-Templates/3b-hands-on.ipynb
@@ -212,16 +212,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/4-Templates/4-Metaprogramming.ipynb b/4-Templates/4-Metaprogramming.ipynb
index c5445044ed4b316e1c6e88e7162a5f5ad909c7e1..2440b5e59b5d364a232b2eb2d68d226c95e6a97c 100644
--- a/4-Templates/4-Metaprogramming.ipynb
+++ b/4-Templates/4-Metaprogramming.ipynb
@@ -489,16 +489,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": false,
diff --git a/4-Templates/5-MoreAdvanced.ipynb b/4-Templates/5-MoreAdvanced.ipynb
index f43a7b2a2ab04fe612ed517b22f9a2dda2670ced..efe0a7558461fb077b54bcd8d35f651a01cf6a34 100644
--- a/4-Templates/5-MoreAdvanced.ipynb
+++ b/4-Templates/5-MoreAdvanced.ipynb
@@ -132,6 +132,9 @@
     "        ImprovedHoldAValue(T value);\n",
     "        \n",
     "        return_value GetValue() const;\n",
+    "\n",
+    "        // For the tutorial purpose!\n",
+    "        return_value GetValueAlternateSyntax() const;\n",
     "        \n",
     "    private:\n",
     "    \n",
@@ -169,7 +172,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "(unless you use the alternate syntax for function):"
+    "(unless you use the alternate syntax for function, which you should definitely consider!):"
    ]
   },
   {
@@ -178,9 +181,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Doesn't work in Xeus-cling but completely valid in a real environment\n",
     "template<class T>\n",
-    "auto ImprovedHoldAValue<T>::GetValue() const -> return_value\n",
+    "auto ImprovedHoldAValue<T>::GetValueAlternateSyntax() const -> return_value\n",
     "{ \n",
     "    return value_;    \n",
     "}"
@@ -212,8 +214,93 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "A more complete example with an uncopyable class and the proof the alternate syntax works is available [@Coliru](https://coliru.stacked-crooked.com/a/698eb583b5a94bc7).\n",
+    "We can even roll up a class which is uncopyable to check the constant reference is properly used:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#include <iostream>\n",
+    "\n",
+    "class UncopyableObject\n",
+    "{\n",
+    "    public:\n",
+    "    \n",
+    "        explicit UncopyableObject(double value);\n",
+    "        \n",
+    "        UncopyableObject(const UncopyableObject& rhs) = default;\n",
+    "        UncopyableObject(UncopyableObject&& rhs) = default;\n",
+    "                \n",
+    "        UncopyableObject& operator=(const UncopyableObject&) = delete;\n",
+    "        UncopyableObject& operator=(UncopyableObject&&) = delete;\n",
+    "        \n",
+    "        void Print(std::ostream& out) const;\n",
+    "    \n",
+    "    private:\n",
+    "    \n",
+    "        double value_;\n",
+    "};\n",
+    "\n",
+    "std::ostream& operator<<(std::ostream& out, const UncopyableObject& object);\n",
+    "    "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%%cppmagics cppyy/cppdef\n",
     "\n",
+    "UncopyableObject::UncopyableObject(double value)\n",
+    ": value_{value}\n",
+    "{ }"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "void UncopyableObject::Print(std::ostream& out) const\n",
+    "{ \n",
+    "    out << value_;   \n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "std::ostream& operator<<(std::ostream& out, const UncopyableObject& object)\n",
+    "{\n",
+    "    object.Print(out);\n",
+    "    return out;\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "ImprovedHoldAValue<UncopyableObject> object(UncopyableObject(10.));\n",
+    "    \n",
+    "std::cout << object.GetValue() << std::endl;"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
     "In fact sometimes you may even have **traits class**: class which sole purpose is to provide type information! Such classes are often used as template parameters of other classes."
    ]
   },
@@ -627,16 +714,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/5-UsefulConceptsAndSTL/0-main.ipynb b/5-UsefulConceptsAndSTL/0-main.ipynb
index 6171a82ebaafc6cbfc0b835c74d640da130a2aaf..c07ff71eeaf81d3112eb6faba08df51a552d9162 100644
--- a/5-UsefulConceptsAndSTL/0-main.ipynb
+++ b/5-UsefulConceptsAndSTL/0-main.ipynb
@@ -34,16 +34,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/5-UsefulConceptsAndSTL/1-ErrorHandling.ipynb b/5-UsefulConceptsAndSTL/1-ErrorHandling.ipynb
index eddd1acd50dfe2a04db89e3e2d1689dc15c6005e..50e35e11dfce5f44cafcef35dc6276279b554c14 100644
--- a/5-UsefulConceptsAndSTL/1-ErrorHandling.ipynb
+++ b/5-UsefulConceptsAndSTL/1-ErrorHandling.ipynb
@@ -36,11 +36,9 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#undef NDEBUG // Don't bother with this outside of Xeus-cling!\n",
     "#include <cassert>\n",
     "#include <iostream>\n",
     "\n",
-    "// THIS CODE WILL KILL Xeus-cling kernel!\n",
     "{\n",
     "    double* ptr = nullptr;\n",
     "    assert(ptr != nullptr && \"Pointer should be initialized first!\"); \n",
@@ -55,8 +53,6 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "(here in Xeus-cling it breaks the kernel; you may check on [Coliru](https://coliru.stacked-crooked.com/a/5fb74d5ae0118cb2))\n",
-    "\n",
     "The perk of `assert` is that it checks the condition is `true` *only in debug mode*! \n",
     "\n",
     "So you may get extensive tests in debug mode that are ignored once your code has been thoroughly checked and is ready for production use (_debug_ and _release_ mode will be explained in a [later notebook](../6-InRealEnvironment/3-Compilers.ipynb#Debug-and-release-flags)).\n",
@@ -71,7 +67,7 @@
     "* You get in a function a `std::vector` and you know it should be exactly 3 elements long? Fire up an assert to check this...\n",
     "* A `std::vector` is expected to be sorted a given way? Check it through an `assert`... (yes it's a O(n) operation, but if your contract is broken you need to know it!)\n",
     "\n",
-    "Of course, your debug mode will be much slower; but its role is anyway to make sure your code is correct, not to be the fastest possible (release mode is there for that!)\n"
+    "Of course, your debug mode will be much slower; but its role is anyway to make sure your code is correct, not to be the fastest possible (release mode is there for that!)"
    ]
   },
   {
@@ -100,8 +96,14 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics clang\n",
+    "// Kernel yields a weird output so we're better off using compiler directly\n",
+    "\n",
+    "#include <cstdlib>\n",
     "#include <iostream>\n",
     "\n",
+    "void FunctionThatExpectsSingleDigitNumber(int n);\n",
+    "\n",
     "void FunctionThatExpectsSingleDigitNumber(int n)\n",
     "{\n",
     "    if (n < -9)\n",
@@ -111,30 +113,17 @@
     "        throw 1;\n",
     "    \n",
     "    std::cout << \"Valid digit is \" << n << std::endl;\n",
-    "}"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
+    "}\n",
+    "\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
     "    FunctionThatExpectsSingleDigitNumber(5);\n",
-    "    std::cout << \"End\" << std::endl;\n",
-    "}"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "{\n",
+    "    std::cout << \"After call 5\" << std::endl;\n",
+    "\n",
     "    FunctionThatExpectsSingleDigitNumber(15);\n",
-    "    std::cout << \"End\" << std::endl;\n",
+    "    std::cout << \"After call 15\" << std::endl;\n",
+    "\n",
+    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
@@ -160,6 +149,26 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics clang\n",
+    "// Kernel yields a weird output so we're better off using compiler directly\n",
+    "\n",
+    "#include <cstdlib>\n",
+    "#include <iostream>\n",
+    "\n",
+    "void FunctionThatExpectsSingleDigitNumber(int n);\n",
+    "\n",
+    "void FunctionThatExpectsSingleDigitNumber(int n)\n",
+    "{\n",
+    "    if (n < -9)\n",
+    "        throw -1;\n",
+    "    \n",
+    "    if (n > 9)\n",
+    "        throw 1;\n",
+    "    \n",
+    "    std::cout << \"Valid digit is \" << n << std::endl;\n",
+    "}\n",
+    "\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
     "    try\n",
     "    { \n",
@@ -173,6 +182,8 @@
     "            std::cerr << \"Error: value is less than -9!\" << std::endl;\n",
     "    }\n",
     "    std::cout << \"End\" << std::endl;\n",
+    "\n",
+    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
@@ -189,6 +200,26 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics clang\n",
+    "// Kernel yields a weird output so we're better off using compiler directly\n",
+    "\n",
+    "#include <cstdlib>\n",
+    "#include <iostream>\n",
+    "\n",
+    "void FunctionThatExpectsSingleDigitNumber(int n);\n",
+    "\n",
+    "void FunctionThatExpectsSingleDigitNumber(int n)\n",
+    "{\n",
+    "    if (n < -9)\n",
+    "        throw -1;\n",
+    "    \n",
+    "    if (n > 9)\n",
+    "        throw 1;\n",
+    "    \n",
+    "    std::cout << \"Valid digit is \" << n << std::endl;\n",
+    "}\n",
+    "\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
     "    try\n",
     "    { \n",
@@ -202,6 +233,8 @@
     "    {\n",
     "        std::cerr << \"Gluttony case... but no object to manipulate to extract more information!\" << std::endl;\n",
     "    }\n",
+    "\n",
+    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
@@ -220,7 +253,26 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// No re-throw\n",
+    "%%cppmagics clang\n",
+    "// Kernel yields a weird output so we're better off using compiler directly\n",
+    "\n",
+    "#include <cstdlib>\n",
+    "#include <iostream>\n",
+    "\n",
+    "void FunctionThatExpectsSingleDigitNumber(int n);\n",
+    "\n",
+    "void FunctionThatExpectsSingleDigitNumber(int n)\n",
+    "{\n",
+    "    if (n < -9)\n",
+    "        throw -1;\n",
+    "    \n",
+    "    if (n > 9)\n",
+    "        throw 1;\n",
+    "    \n",
+    "    std::cout << \"Valid digit is \" << n << std::endl;\n",
+    "}\n",
+    "\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
     "    try\n",
     "    { \n",
@@ -232,6 +284,8 @@
     "    }\n",
     "    \n",
     "    std::cout << \"After catch\" << std::endl;\n",
+    "\n",
+    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
@@ -241,7 +295,26 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Rethrow\n",
+    "%%cppmagics clang\n",
+    "// Kernel yields a weird output so we're better off using compiler directly\n",
+    "\n",
+    "#include <cstdlib>\n",
+    "#include <iostream>\n",
+    "\n",
+    "void FunctionThatExpectsSingleDigitNumber(int n);\n",
+    "\n",
+    "void FunctionThatExpectsSingleDigitNumber(int n)\n",
+    "{\n",
+    "    if (n < -9)\n",
+    "        throw -1;\n",
+    "    \n",
+    "    if (n > 9)\n",
+    "        throw 1;\n",
+    "    \n",
+    "    std::cout << \"Valid digit is \" << n << std::endl;\n",
+    "}\n",
+    "\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
     "    try\n",
     "    { \n",
@@ -250,10 +323,12 @@
     "    catch(int n)\n",
     "    {\n",
     "        std::cerr << \"Int case: \" << n << \" not a single digit number\" << std::endl;\n",
-    "        throw; // `throw n` would have been correct as well but is not necessary\n",
+    "        throw; // the only difference with previous cell! Note `n` is not needed here.\n",
     "    }\n",
     "    \n",
     "    std::cout << \"After catch\" << std::endl;\n",
+    "\n",
+    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
@@ -358,7 +433,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Pseudo-code - Do not run in Xeus-cling!\n",
+    "// Pseudo-code - Do not run in notebook!\n",
     "\n",
     "try\n",
     "{\n",
@@ -465,7 +540,7 @@
    "source": [
     "This might seem trivial here, but in real code it is really handy to get all relevant information from your exception.\n",
     "\n",
-    "However, I avoided silently a common pitfall when dabbling with `std::exception`: one of its cardinal sin for me at least is to use C string as return type for its `what()` method. It might seem innocuous enough, but is absolutely not if you do not use a `std::string` as a data attribute to encapsulate the message.\n",
+    "However, I avoided silently a common pitfall when dabbling with `std::exception`: one of its cardinal sin is to use C string as return type for its `what()` method. It might seem innocuous enough, but is absolutely not if you do not use a `std::string` as a data attribute to encapsulate the message.\n",
     "\n",
     "Let's write it without the `msg_` data attribute:\n",
     "\n",
@@ -481,58 +556,63 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%file /tmp/cell.cpp\n",
+    "\n",
+    "#include <cstdlib>\n",
     "#include <exception>\n",
     "#include <sstream>\n",
     "#include <iostream>\n",
     "#include <string>\n",
     "\n",
+    "// ===========================\n",
+    "// Declarations\n",
+    "// ===========================\n",
+    "\n",
     "struct TooBigErrorWithMessagePoorlyImplemented : public std::exception\n",
     "{\n",
-    "    TooBigErrorWithMessagePoorlyImplemented(int n)\n",
-    "    : n_(n)\n",
-    "    { }\n",
+    "    TooBigErrorWithMessagePoorlyImplemented(int n);\n",
     "\n",
-    "    virtual const char* what() const noexcept override\n",
-    "    {        \n",
-    "        std::ostringstream oconv;\n",
-    "        oconv << \"Value '\" << n_ << \"' is more than 9!\";\n",
-    "        std::string msg = oconv.str();\n",
-    "        std::cout << \"\\nCheck: message is |\" << msg << \"|\" << std::endl;\n",
-    "        return msg.c_str();\n",
-    "    }\n",
+    "    virtual const char* what() const noexcept override;\n",
     "\n",
     "private:\n",
     "\n",
     "    int n_;\n",
-    "};"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "#include <iostream>\n",
+    "};\n",
+    "\n",
+    "// We skip negative case for readability's sake\n",
+    "void FunctionThatExpectsSingleDigitNumberWithPoorlyImplementedException(int n);\n",
+    "\n",
+    "\n",
+    "// ===========================\n",
+    "// Definitions\n",
+    "// ===========================\n",
+    "\n",
+    "TooBigErrorWithMessagePoorlyImplemented::TooBigErrorWithMessagePoorlyImplemented(int n)\n",
+    ": n_{n}\n",
+    "{ }\n",
+    "\n",
+    "const char* TooBigErrorWithMessagePoorlyImplemented::what() const noexcept\n",
+    "{        \n",
+    "    std::ostringstream oconv;\n",
+    "    oconv << \"Value '\" << n_ << \"' is more than 9!\";\n",
+    "    std::string msg = oconv.str();\n",
+    "    std::cout << \"\\nCheck: message is |\" << msg << \"|\" << std::endl;\n",
+    "    return msg.c_str();\n",
+    "}\n",
     "\n",
     "void FunctionThatExpectsSingleDigitNumberWithPoorlyImplementedException(int n)\n",
     "{\n",
-    "    // if (n < -9)\n",
-    "    //     throw TooSmallError(); // skip it - we will make the kernel crash and it's better not to bother reloading this one each time\n",
-    "    \n",
     "    if (n > 9)\n",
     "        throw TooBigErrorWithMessagePoorlyImplemented(n);\n",
     "    \n",
     "    std::cout << \"Valid digit is \" << n << std::endl;\n",
-    "}"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
+    "}\n",
+    "\n",
+    "\n",
+    "// ===========================\n",
+    "// Main\n",
+    "// ===========================\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
     "    try\n",
     "    { \n",
@@ -542,9 +622,60 @@
     "    {\n",
     "        std::cerr << \"Properly caught: \" << e.what() << std::endl;\n",
     "    }\n",
+    "\n",
+    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "You might wonder why we have just chosen to write the content in a file rather than executing the cell?\n",
+    "\n",
+    "The reason is that both our usual ways to run the cell (either using Cppyy kernel directly or defering to the local compiler) yield very obscure error messages that completely hide what goes wrong (even if there is a very helpful warning which pinpoints the issue).\n",
+    "\n",
+    "For once, let's go to the terminal and compile and run from there the program (please don't bother about the `-W` options - we'll get you covered in part 6):\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**In a terminal**\n",
+    "\n",
+    "*Compile the program*\n",
+    "```shell\n",
+    "clang++ -std=c++20 -Weverything -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-newline-eof -Wno-padded /tmp/cell.cpp -o poorly_implemented_exception\n",
+    "```\n",
+    "\n",
+    "*Run the program*\n",
+    "```shell\n",
+    "./poorly_implemented_exception\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "You should get something like:"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "```shell\n",
+    "Properly caught: \n",
+    "Check: message is |Value '15' is more than 9!|\n",
+    "```\n",
+    "\n",
+    "that may be followed by gibberish characters that vary from one call to another (or not - sometimes the program will work seemingly fine...)|"
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {},
@@ -559,10 +690,20 @@
     "\n",
     "So when you define an exception class you can't define the return of `what()` method inside the implementation of the method itself; you **must** use a data attribute to store it. The most common choice is to use a `std::string`.\n",
     "\n",
+    "And please notice that your compiler was very helpful with its warning message:\n",
     "\n",
     "\n"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "```shell\n",
+    "/tmp/cell.cpp:41:12: warning: address of stack memory associated with local variable 'msg' returned [-Wreturn-stack-address]\n",
+    "```"
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {},
@@ -751,7 +892,13 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics clang\n",
+    "\n",
+    "#include <cstdlib>\n",
+    "#include <string>\n",
     "\n",
+    "constexpr auto INVALID_TYPE = -1;\n",
+    "    \n",
     "template<class T>\n",
     "[[nodiscard]] int AbsoluteValueNoDiscard(T value, T& result)\n",
     "{\n",
@@ -766,22 +913,16 @@
     "\n",
     "        return EXIT_SUCCESS;\n",
     "    }\n",
-    "}"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "#include <string>\n",
+    "}\n",
     "\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
     "    std::string hello(\"Hello world\");\n",
     "    std::string absolute_value = \"\";\n",
     "    \n",
     "    AbsoluteValueNoDiscard(hello, absolute_value); // Now there is a warning! But only available after C++ 17...\n",
+    "\n",
+    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
@@ -796,16 +937,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/5-UsefulConceptsAndSTL/1b-hands-on.ipynb b/5-UsefulConceptsAndSTL/1b-hands-on.ipynb
index fb04bdd7ab02f5ae2816cd27d4997b4ee91a19b7..850da572cd0ceaa0f6498dfa8726f9bd8a11794c 100644
--- a/5-UsefulConceptsAndSTL/1b-hands-on.ipynb
+++ b/5-UsefulConceptsAndSTL/1b-hands-on.ipynb
@@ -211,16 +211,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/5-UsefulConceptsAndSTL/2-RAII.ipynb b/5-UsefulConceptsAndSTL/2-RAII.ipynb
index 1291659ac7839f6ac9e673f28fb019010d861c52..18848d4a930a9b383ea4ec7e0cbd958c2c124129 100644
--- a/5-UsefulConceptsAndSTL/2-RAII.ipynb
+++ b/5-UsefulConceptsAndSTL/2-RAII.ipynb
@@ -56,7 +56,7 @@
     "    \n",
     "        std::string name_;\n",
     "    \n",
-    "        double* underlying_array_ = nullptr;    \n",
+    "        double* underlying_array_ { nullptr };\n",
     "};"
    ]
   },
@@ -66,8 +66,10 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "\n",
     "Array::Array(std::string name, std::size_t dimension)\n",
-    ": name_(name)\n",
+    ": name_{name}\n",
     "{\n",
     "    std::cout << \"Acquire resources for \" << name_ << std::endl;\n",
     "    underlying_array_ = new double[dimension];\n",
@@ -130,16 +132,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/5-UsefulConceptsAndSTL/3-Containers.ipynb b/5-UsefulConceptsAndSTL/3-Containers.ipynb
index 2f079f3512a9a0d3f0c1b669bbc909e940bb8184..5df13e9859e8d05426da399e238c375377b68575 100644
--- a/5-UsefulConceptsAndSTL/3-Containers.ipynb
+++ b/5-UsefulConceptsAndSTL/3-Containers.ipynb
@@ -724,8 +724,7 @@
     "                    4  // can be accessed with begin()[3] or end()[-1]\n",
     "                    };\n",
     "std::cout << v.end()[-2] << \" - \" << v.begin()[1] << std::endl;\n",
-    "// Displays '3 - 2'\n",
-    "// But also some weird pointer value (something like @0x7ffff91e0de0) with Xeus-cling. Just forget about it, it looks like a Xeus-cling bug."
+    "// Displays '3 - 2'"
    ]
   },
   {
@@ -754,16 +753,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/5-UsefulConceptsAndSTL/3b-hands-on.ipynb b/5-UsefulConceptsAndSTL/3b-hands-on.ipynb
index 04c505aec95a785b383207bf73a501c4c5d4dd53..d18f8bf014fef6f03e19670ab634473147225892 100644
--- a/5-UsefulConceptsAndSTL/3b-hands-on.ipynb
+++ b/5-UsefulConceptsAndSTL/3b-hands-on.ipynb
@@ -93,16 +93,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/5-UsefulConceptsAndSTL/4-AssociativeContainers.ipynb b/5-UsefulConceptsAndSTL/4-AssociativeContainers.ipynb
index 9ee66a6b332df12193b91c8ed3aa74e99fac4e29..6952a4d1c6cf9ffcab984fb79037a200a6025c92 100644
--- a/5-UsefulConceptsAndSTL/4-AssociativeContainers.ipynb
+++ b/5-UsefulConceptsAndSTL/4-AssociativeContainers.ipynb
@@ -263,9 +263,17 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Since 2022 seems to fail with Xeus-Cling, but it is perfectly code I heartily recommend over the more clunky notation above.\n",
+    "%%cppmagics cppyy/cppdef\n",
     "\n",
-    "const auto& [iterator, was_properly_inserted] = age_list.insert({\"Alice\", 32});\n",
+    "const auto& [iterator, was_properly_inserted] = age_list.insert({\"Alice\", 32});"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
     "if (!was_properly_inserted)\n",
     "    std::cerr << \"Insertion of Alice failed\" << std::endl;"
    ]
@@ -437,16 +445,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/5-UsefulConceptsAndSTL/5-MoveSemantics.ipynb b/5-UsefulConceptsAndSTL/5-MoveSemantics.ipynb
index f09db6e3ffc314b3a1b0bde1c8c1d63f8e8781b0..38ff9444426a2980b56d644b1f081cbd64facef1 100644
--- a/5-UsefulConceptsAndSTL/5-MoveSemantics.ipynb
+++ b/5-UsefulConceptsAndSTL/5-MoveSemantics.ipynb
@@ -41,28 +41,12 @@
     "        // Copy constructor.\n",
     "        Text(const Text& t);\n",
     "\n",
-    "        // Recopy operator; defined here due to an issue of Xeus-cling with operators\n",
-    "        Text& operator=(const Text& t)\n",
-    "        {\n",
-    "            std::cout << \"Operator= called\" << std::endl;\n",
-    "            if (this == &t) \n",
-    "                return *this ; // standard idiom to deal with auto-recopy\n",
-    "\n",
-    "            delete [] data_;\n",
-    "            size_ = t.size_ ;\n",
-    "            data_ = new char[t.size_] ;\n",
-    "            std::copy(t.data_, t.data_ + size_, data_);\n",
-    "\n",
-    "            return *this ;\n",
-    "        }\n",
-    "             \n",
+    "        // Recopy operator.\n",
+    "        Text& operator=(const Text& t);\n",
     "        ~Text();\n",
     "\n",
-    "        // Overload of operator<<, defined here due to an issue of Xeus-cling with operators.\n",
-    "        friend std::ostream & operator<<(std::ostream& stream, const Text& t)\n",
-    "        { \n",
-    "            return stream << t.data_ ; \n",
-    "        }\n",
+    "        // Overload of operator<<.\n",
+    "        friend std::ostream & operator<<(std::ostream& stream, const Text& t);\n",
     "\n",
     "  private :\n",
     "\n",
@@ -100,6 +84,27 @@
     "}"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "Text& Text::operator=(const Text& t)\n",
+    "{\n",
+    "    std::cout << \"Operator= called\" << std::endl;\n",
+    "    if (this == &t) \n",
+    "        return *this ; // standard idiom to deal with auto-recopy\n",
+    "\n",
+    "    delete [] data_;\n",
+    "    size_ = t.size_ ;\n",
+    "    data_ = new char[t.size_] ;\n",
+    "    std::copy(t.data_, t.data_ + size_, data_);\n",
+    "\n",
+    "    return *this ;\n",
+    "}"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -113,6 +118,18 @@
     "}\n"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "std::ostream & operator<<(std::ostream& stream, const Text& t)\n",
+    "{ \n",
+    "    return stream << t.data_ ; \n",
+    "}"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -713,45 +730,16 @@
     "        // Move constructor\n",
     "        Text2(Text2&& t);    \n",
     "\n",
-    "        // Recopy operator; defined here due to an issue of Xeus-cling with operators\n",
-    "        Text2& operator=(const Text2& t)\n",
-    "        {\n",
-    "            std::cout << \"Operator= called\" << std::endl;\n",
-    "            if (this == &t) \n",
-    "                return *this ; // standard idiom to deal with auto-recopy\n",
-    "\n",
-    "            delete [] data_;\n",
-    "            size_ = t.size_ ;\n",
-    "            data_ = new char[t.size_] ;\n",
-    "            std::copy(t.data_, t.data_ + size_, data_);\n",
-    "\n",
-    "            return *this ;\n",
-    "        }\n",
+    "        // Recopy operator.\n",
+    "        Text2& operator=(const Text2& t);\n",
     "    \n",
-    "        // Move assignment operator; defined here due to an issue of Xeus-cling with operators\n",
-    "        Text2& operator=(Text2&& t)\n",
-    "        {\n",
-    "            std::cout << \"Operator= called for r-value\" << std::endl;\n",
-    "            if (this == &t) \n",
-    "                return *this;\n",
-    "          \n",
-    "            delete[] data_;\n",
-    "            size_ = t.size_;\n",
-    "            data_ = t.data_;\n",
-    "            \n",
-    "            // Don't forget to properly invalidate `t` content:\n",
-    "            t.size_ = 0 ;\n",
-    "            t.data_ = nullptr ;\n",
-    "            return *this ;\n",
-    "        }\n",
+    "        // Move assignment operator\n",
+    "        Text2& operator=(Text2&& t);\n",
     "             \n",
     "        ~Text2();\n",
     "\n",
-    "        // Overload of operator<<, defined here due to an issue of Xeus-cling with operators.\n",
-    "        friend std::ostream & operator<<(std::ostream& stream, const Text2& t)\n",
-    "        { \n",
-    "            return stream << t.data_ ; \n",
-    "        }\n",
+    "        // Overload of operator<<.\n",
+    "        friend std::ostream & operator<<(std::ostream& stream, const Text2& t);\n",
     "\n",
     "  private :\n",
     "\n",
@@ -804,6 +792,50 @@
     "}"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "Text2& Text2::operator=(const Text2& t)\n",
+    "{\n",
+    "    std::cout << \"Operator= called\" << std::endl;\n",
+    "    if (this == &t) \n",
+    "        return *this ; // standard idiom to deal with auto-recopy\n",
+    "\n",
+    "    delete [] data_;\n",
+    "    size_ = t.size_ ;\n",
+    "    data_ = new char[t.size_] ;\n",
+    "    std::copy(t.data_, t.data_ + size_, data_);\n",
+    "\n",
+    "    return *this ;\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "Text2& Text2::operator=(Text2&& t)\n",
+    "{\n",
+    "    std::cout << \"Operator= called for r-value\" << std::endl;\n",
+    "    if (this == &t) \n",
+    "        return *this;\n",
+    "  \n",
+    "    delete[] data_;\n",
+    "    size_ = t.size_;\n",
+    "    data_ = t.data_;\n",
+    "    \n",
+    "    // Don't forget to properly invalidate `t` content:\n",
+    "    t.size_ = 0 ;\n",
+    "    t.data_ = nullptr ;\n",
+    "    return *this ;\n",
+    "}"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -817,6 +849,18 @@
     "}"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "std::ostream & operator<<(std::ostream& stream, const Text2& t)\n",
+    "{ \n",
+    "    return stream << t.data_ ; \n",
+    "}"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -958,16 +1002,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/5-UsefulConceptsAndSTL/6-SmartPointers.ipynb b/5-UsefulConceptsAndSTL/6-SmartPointers.ipynb
index fd8d5d418878bce0609085ba475b73003f8b7964..edf490553a7fee92c2964cdb72e326190f89c3b2 100644
--- a/5-UsefulConceptsAndSTL/6-SmartPointers.ipynb
+++ b/5-UsefulConceptsAndSTL/6-SmartPointers.ipynb
@@ -123,15 +123,20 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#include <memory>\n",
+    "%%cppmagics clang\n",
+    "\n",
+    "#include <cstdlib>\n",
     "#include <iostream>\n",
+    "#include <memory>\n",
     "\n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)\n",
     "{\n",
     "    auto ptr = std::make_unique<int>(5);\n",
     "    auto copy = std::move(ptr);\n",
     "    \n",
-    "    // std::cout << \"Beware as now there are no guarantee upon the content of ptr: \" << *ptr << std::endl;\n",
-    "    // < This line is invalid (using `ptr` after move is undefined behaviour) and makes Xeus-cling crash\n",
+    "    std::cout << \"Beware as now there are no guarantee upon the content of ptr: \" << *ptr << std::endl; // EXPECTED RUNTIME ISSUE!\n",
+    "\n",
+    "    return EXIT_SUCCESS;\n",
     "}"
    ]
   },
@@ -139,7 +144,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "As usual with move semantics, beware in this second case: ptr is undefined after the `move` occurred... (this code run on [Coliru](http://coliru.stacked-crooked.com/a/a1aa87e64f64c9e8) leads to a more explicit segmentation fault).\n",
+    "As usual with move semantics, beware in this second case: ptr is undefined after the `move` occurred... hence the segmentation fault you might have got.\n",
     "\n",
     "### Usage to store data in a class\n",
     "\n",
@@ -212,8 +217,7 @@
     "\n",
     "        void Init(std::string&& text); // rather artificial here, but we want to point out it can be done anywhere and not just in constructor!\n",
     "\n",
-    "        const Content& GetContent() const; // adding `noexcept` would be even better but Xeus-cling \n",
-    "                                           // doesn't like it!\n",
+    "        const Content& GetContent() const;\n",
     "    \n",
     "    private:\n",
     "    \n",
@@ -240,9 +244,11 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "\n",
     "#include <cassert>\n",
     "\n",
-    "const Content& WithUniquePtr::GetContent() const \n",
+    "const Content& WithUniquePtr::GetContent() const\n",
     "{\n",
     "    assert(content_ != nullptr && \"Make sure Init() has been properly called beforehand!\");\n",
     "    return *content_;\n",
@@ -571,16 +577,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/5-UsefulConceptsAndSTL/6b-hands-on.ipynb b/5-UsefulConceptsAndSTL/6b-hands-on.ipynb
index c43841da0887054a346b86059360ff86d1f32a9f..fd6cccca80e5e840ffd37ce0304526f7a43d76b0 100644
--- a/5-UsefulConceptsAndSTL/6b-hands-on.ipynb
+++ b/5-UsefulConceptsAndSTL/6b-hands-on.ipynb
@@ -81,16 +81,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/5-UsefulConceptsAndSTL/7-Algorithms.ipynb b/5-UsefulConceptsAndSTL/7-Algorithms.ipynb
index 013bd030a980f28b16fac880c1894a7b78476d89..bf06277ae81b22aba09aacab08012a0d9cb4ec27 100644
--- a/5-UsefulConceptsAndSTL/7-Algorithms.ipynb
+++ b/5-UsefulConceptsAndSTL/7-Algorithms.ipynb
@@ -614,7 +614,7 @@
     "\n",
     "It is also important to highlight that while the STL algorithms may provide you efficiency (this library is written by highly skilled engineers after all), this is not its main draw: the algorithms are written to be as generic as possible. The primary reason to use them is to allow you to think at a higher level of abstraction, not to get the fastest possible implementation. So if your ~~intuition~~ benchmarking has shown that the standard library is causing a critical slowdown, you are free to explore classic alternatives such as [loop unrolling](https://en.wikipedia.org/wiki/Loop_unrolling) - that's one of the strength of the language (and the STL itself opens up this possibility directly for some of its construct - you may for instance use your own memory allocator when defining a container). For most purposes however that will not be necessary.\n",
     "\n",
-    "FYI, C++ 20 introduces a completely new way to deal with algorithms, which does not rely on direct use of iterators but instead on a range library. This leads to a syntax which is more akin to what is done in other languages - see for instance this example [@Coliru](https://coliru.stacked-crooked.com/a/efbfb359b4dfa6ee):"
+    "FYI, C++ 20 introduces a completely new way to deal with algorithms, which does not rely on direct use of iterators but instead on a range library. This leads to a syntax which is more akin to what is done in other languages:"
    ]
   },
   {
@@ -623,13 +623,14 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// C++ 20: does not run in Xeus-cling!\n",
+    "%%cppmagics clang\n",
+    "// std::views not yet well handled by cppyy\n",
     "\n",
     "#include <iostream>\n",
     "#include <ranges>\n",
     "#include <vector>\n",
     "\n",
-    "int main(int argc, char** argv) \n",
+    "int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv) \n",
     "{\n",
     "\n",
     "    std::vector<int> numbers = { 3, 5, 12, 17, 21, 27, 28 };\n",
@@ -662,16 +663,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/5-UsefulConceptsAndSTL/7b-hands-on.ipynb b/5-UsefulConceptsAndSTL/7b-hands-on.ipynb
index 00e30e89a05ea0232976d5a422e8977eba8646d1..92edbf8d15236975ebcbf92c1571f2d7164ce7ad 100644
--- a/5-UsefulConceptsAndSTL/7b-hands-on.ipynb
+++ b/5-UsefulConceptsAndSTL/7b-hands-on.ipynb
@@ -82,16 +82,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/6-InRealEnvironment/0-main.ipynb b/6-InRealEnvironment/0-main.ipynb
index 3a18947c28a291b8e976900403bc1fd143cb7e7f..cdf1c4395024bb2ab5e819589f648ef23381dfd4 100644
--- a/6-InRealEnvironment/0-main.ipynb
+++ b/6-InRealEnvironment/0-main.ipynb
@@ -41,16 +41,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/6-InRealEnvironment/1-SetUpEnvironment.ipynb b/6-InRealEnvironment/1-SetUpEnvironment.ipynb
index 00b1afa4fbef697de67a1877e4d1a8f7f4773020..6b4a5e063bf616739ba58a57f3d05c788d13c6a0 100644
--- a/6-InRealEnvironment/1-SetUpEnvironment.ipynb
+++ b/6-InRealEnvironment/1-SetUpEnvironment.ipynb
@@ -301,16 +301,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/6-InRealEnvironment/2-FileStructure.ipynb b/6-InRealEnvironment/2-FileStructure.ipynb
index a66786a30faef4676fe73c5e53852401086da13f..e3f457822628480fe2a9a6be79ba2c0655eadbef 100644
--- a/6-InRealEnvironment/2-FileStructure.ipynb
+++ b/6-InRealEnvironment/2-FileStructure.ipynb
@@ -1151,16 +1151,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/6-InRealEnvironment/2b-hands-on.ipynb b/6-InRealEnvironment/2b-hands-on.ipynb
index f8bf3961bb108bd9a82a79faae9cb8bc83427b5b..395aa83210d59bd699b005128a17fbcb7208901a 100644
--- a/6-InRealEnvironment/2b-hands-on.ipynb
+++ b/6-InRealEnvironment/2b-hands-on.ipynb
@@ -82,16 +82,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/6-InRealEnvironment/3-Compilers.ipynb b/6-InRealEnvironment/3-Compilers.ipynb
index 940799c9625ac311f76b5fee65a169688a6c06d4..c2a9a1d302c2d63e5b390faae5591d72d47261c7 100644
--- a/6-InRealEnvironment/3-Compilers.ipynb
+++ b/6-InRealEnvironment/3-Compilers.ipynb
@@ -226,16 +226,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/6-InRealEnvironment/4-ThirdParty.ipynb b/6-InRealEnvironment/4-ThirdParty.ipynb
index a5b6316ae06df178979d468aab91d1dda854e560..9b64b5197139daf4b05a831f4b4ef9a34108d634 100644
--- a/6-InRealEnvironment/4-ThirdParty.ipynb
+++ b/6-InRealEnvironment/4-ThirdParty.ipynb
@@ -281,16 +281,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/6-InRealEnvironment/5-Namespace.ipynb b/6-InRealEnvironment/5-Namespace.ipynb
index a48c0b3e421e23f3ca3dc8577429187cdeacdb35..a9b307a17f50c21fe7d2c9ffca39d49e1bbffa7c 100644
--- a/6-InRealEnvironment/5-Namespace.ipynb
+++ b/6-InRealEnvironment/5-Namespace.ipynb
@@ -458,7 +458,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "cout << \"Without std:: prefix!\"; // Works! - or at least should work: Xeus Cling seems lost here..."
+    "cout << \"Without std:: prefix!\"; // Works!"
    ]
   },
   {
@@ -623,16 +623,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/6-InRealEnvironment/6-Tools.ipynb b/6-InRealEnvironment/6-Tools.ipynb
index 0b07e534b8b534d8b598366d7541300f9e760971..9173ed1fec1f5ce2463f7dfbc0c20aab204590c0 100644
--- a/6-InRealEnvironment/6-Tools.ipynb
+++ b/6-InRealEnvironment/6-Tools.ipynb
@@ -129,16 +129,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/7-Appendix/CompilationErrors.ipynb b/7-Appendix/CompilationErrors.ipynb
index bc6b28dcb10b3f4c6034cc1bf3ef82d157c3bd54..91c7bf0cc5eac9187075ef7cd85f236b6ae301c1 100644
--- a/7-Appendix/CompilationErrors.ipynb
+++ b/7-Appendix/CompilationErrors.ipynb
@@ -287,16 +287,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   }
  },
  "nbformat": 4,
diff --git a/7-Appendix/Crtp.ipynb b/7-Appendix/Crtp.ipynb
index 8d683fc4324eec8d854058e508723aa3df398a3d..f022c40a378847c957c79d1de0638e747edcfbe1 100644
--- a/7-Appendix/Crtp.ipynb
+++ b/7-Appendix/Crtp.ipynb
@@ -44,9 +44,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#include <iostream>\n",
-    "\n",
-    "using uint = unsigned int; // just to bypass a Xeus-cling limitation..."
+    "#include <iostream>"
    ]
   },
   {
@@ -64,13 +62,13 @@
     "    UniqueId(const UniqueId&) = delete;\n",
     "    UniqueId& operator=(const UniqueId&) = delete;\n",
     "    \n",
-    "    uint GetUniqueId() const; // noexcept would be better, but cling disagree...\n",
+    "    unsigned int GetUniqueId() const; // noexcept would be better, but cling disagree...\n",
     "    \n",
     "private:   \n",
     "    \n",
-    "    const uint unique_id_;\n",
+    "    const unsigned int unique_id_;\n",
     "    \n",
-    "    static uint Generate();\n",
+    "    static unsigned int Generate();\n",
     "\n",
     "};"
    ]
@@ -81,7 +79,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "uint UniqueId::Generate()\n",
+    "unsigned int UniqueId::Generate()\n",
     "{\n",
     "    static auto ret = 0u;\n",
     "    return ret++;\n",
@@ -105,7 +103,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "uint UniqueId::GetUniqueId() const\n",
+    "unsigned int UniqueId::GetUniqueId() const\n",
     "{\n",
     "    return unique_id_;\n",
     "}"
@@ -287,7 +285,7 @@
     "    \n",
     "    Carrot3();    \n",
     "    \n",
-    "    uint GetUniqueId() const;\n",
+    "    unsigned int GetUniqueId() const;\n",
     "    \n",
     "private:\n",
     "    \n",
@@ -313,7 +311,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "uint Carrot3::GetUniqueId() const\n",
+    "unsigned int Carrot3::GetUniqueId() const\n",
     "{\n",
     "    assert(!(!unique_id_));\n",
     "    return unique_id_->GetUniqueId();\n",
@@ -333,7 +331,7 @@
     "    \n",
     "    Cabbage3();    \n",
     "    \n",
-    "    uint GetUniqueId() const;\n",
+    "    unsigned int GetUniqueId() const;\n",
     "    \n",
     "private:\n",
     "    \n",
@@ -359,7 +357,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "uint Cabbage3::GetUniqueId() const\n",
+    "unsigned int Cabbage3::GetUniqueId() const\n",
     "{\n",
     "    assert(!(!unique_id_));\n",
     "    return unique_id_->GetUniqueId();\n",
@@ -416,13 +414,13 @@
     "    CrtpUniqueId(const CrtpUniqueId&) = delete;\n",
     "    CrtpUniqueId& operator=(const CrtpUniqueId&) = delete;\n",
     "    \n",
-    "    uint GetUniqueId() const; // noexcept would be better, but cling disagree...\n",
+    "    unsigned int GetUniqueId() const; // noexcept would be better, but cling disagree...\n",
     "    \n",
     "private:   \n",
     "    \n",
-    "    const uint unique_id_;\n",
+    "    const unsigned int unique_id_;\n",
     "    \n",
-    "    static uint Generate();\n",
+    "    static unsigned int Generate();\n",
     "\n",
     "};"
    ]
@@ -434,7 +432,7 @@
    "outputs": [],
    "source": [
     "template<class DerivedT>\n",
-    "uint CrtpUniqueId<DerivedT>::Generate()\n",
+    "unsigned int CrtpUniqueId<DerivedT>::Generate()\n",
     "{\n",
     "    static auto ret = 0u;\n",
     "    return ret++;\n",
@@ -460,7 +458,7 @@
    "outputs": [],
    "source": [
     "template<class DerivedT>\n",
-    "uint CrtpUniqueId<DerivedT>::GetUniqueId() const\n",
+    "unsigned int CrtpUniqueId<DerivedT>::GetUniqueId() const\n",
     "{\n",
     "    return unique_id_;\n",
     "}"
@@ -637,16 +635,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/7-Appendix/HomemadeException.ipynb b/7-Appendix/HomemadeException.ipynb
index b9a1dff9b6cba53bfdfadfb983df57b867fa2283..3b4f4f7253382383ab6a7464497e3b83955dbcc9 100644
--- a/7-Appendix/HomemadeException.ipynb
+++ b/7-Appendix/HomemadeException.ipynb
@@ -118,7 +118,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Doesn't work on Xeus-cling: C++ 20 on board!\n",
+    "// Not written to be used in notebook (`std::source_location` not yet supported by cling)\n",
     "\n",
     "#include <exception>  \n",
     "#include <source_location>\n",
@@ -217,7 +217,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Doesn't work on Xeus-cling: C++ 20 on board!\n",
+    "// Not written to be used in notebook (`std::source_location` not yet supported by cling)\n",
     "\n",
     "#include <cstring>\n",
     "#include <iostream>\n",
@@ -329,16 +329,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/7-Appendix/StringView.ipynb b/7-Appendix/StringView.ipynb
index 3589799642fe64aa4997274d229fa3c4d5678180..1753630db02941507fcc260ba1de5a3e4048cd5a 100644
--- a/7-Appendix/StringView.ipynb
+++ b/7-Appendix/StringView.ipynb
@@ -161,16 +161,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   }
  },
  "nbformat": 4,
diff --git a/7-Appendix/Switch.ipynb b/7-Appendix/Switch.ipynb
index c050b1d5027c870b9993d2e372fd9ce60f69df48..fbbe96268a7b88c6a4c42c549907df1c5470604d 100644
--- a/7-Appendix/Switch.ipynb
+++ b/7-Appendix/Switch.ipynb
@@ -217,8 +217,6 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Fails under Xeus-cling in 2024 but it is srtrictly valid code!\n",
-    "\n",
     "#include <iostream>\n",
     "\n",
     "{\n",
@@ -255,16 +253,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/7-Appendix/WeakPtr.ipynb b/7-Appendix/WeakPtr.ipynb
index 83f9e8238105350e1cdf137eb57ebf93f3bec56f..f358cd7403487c886574c05ceb39bfd662a3254a 100644
--- a/7-Appendix/WeakPtr.ipynb
+++ b/7-Appendix/WeakPtr.ipynb
@@ -25,13 +25,15 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef \n",
+    "\n",
     "#include <iostream>\n",
     "#include <vector>\n",
     "#include <memory>\n",
     "#include <string>\n",
     "\n",
     "// Forward declaration; see dedicated notebook!\n",
-    "class Child;    "
+    "class Child;"
    ]
   },
   {
@@ -80,7 +82,7 @@
     "    \n",
     "        ~Child();\n",
     "        \n",
-    "        const std::string& GetName() const; // noexcept unfortunately not supported by Xeus-cling\n",
+    "        const std::string& GetName() const;\n",
     "    \n",
     "    private:\n",
     "        \n",
@@ -121,11 +123,12 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "Child::Child(std::string name, const std::shared_ptr<Father>& father)\n",
-    ": name_(name), \n",
-    "father_(father)\n",
-    "{ \n",
-    "    std::cout << \"Allocating child \" << name_ << std::endl;\n",
+    "void Father::Print() const\n",
+    "{\n",
+    "    std::cout << name_ << \" is the father of \" << children_.size() << \" children: \" << std::endl;\n",
+    "\n",
+    "    for (const auto& child : children_)\n",
+    "        std::cout<< \"\\t\" << child->GetName() << std::endl;\n",
     "}"
    ]
   },
@@ -135,13 +138,11 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "void Father::Print() const\n",
-    "{\n",
-    "    std::cout << name_ << \" is the father of \" << children_.size() << \" children: \" << std::endl;\n",
-    "    \n",
-    "    for (const auto& child : children_)\n",
-    "        std::cout<< \"\\t\" << child->GetName() << std::endl;\n",
-    "    \n",
+    "Child::Child(std::string name, const std::shared_ptr<Father>& father)\n",
+    ": name_(name), \n",
+    "father_(father)\n",
+    "{ \n",
+    "    std::cout << \"Allocating child \" << name_ << std::endl;\n",
     "}"
    ]
   },
@@ -215,7 +216,7 @@
     "\n",
     "It is only used for storage; you can't use the object underneath directly and have to build a `shared_ptr` from it before use with the method `lock()`.  \n",
     "\n",
-    "There are just two modifications to do (used to be done here but since 2021 Xeus emit an error (always there in 2024...) so the code will be put instead [@Coliru](http://coliru.stacked-crooked.com/a/6e32de57ca65b6fb)):"
+    "There are just two modifications to do:"
    ]
   },
   {
@@ -225,20 +226,89 @@
     "- In `Father` class, use this to store children:"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "```c++\n",
+    "std::vector<std::weak_ptr<Child>> children_;\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "- `Print()` becomes (slightly) more complicated:"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "```c++\n",
+    "void Father::Print() const\n",
+    "{\n",
+    "    std::cout << name_ << \" is the father of \" << children_.size() << \" children: \" << std::endl;\n",
+    "    \n",
+    "    for (const auto& child : children_)\n",
+    "    {\n",
+    "        auto shared = child.lock();\n",
+    "        std::cout<< \"\\t\" << shared->GetName() << std::endl;\n",
+    "    }\n",
+    "    \n",
+    "}\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "With that, memory is properly released:"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
-    "std::vector<std::weak_ptr<Child>> children_;"
+    "%%cppmagics cppyy/cppdef \n",
+    "\n",
+    "#include <iostream>\n",
+    "#include <vector>\n",
+    "#include <memory>\n",
+    "#include <string>\n",
+    "\n",
+    "// Forward declaration; see dedicated notebook!\n",
+    "class ChildWithMemoryFix;"
    ]
   },
   {
-   "cell_type": "markdown",
+   "cell_type": "code",
+   "execution_count": null,
    "metadata": {},
+   "outputs": [],
    "source": [
-    "- `Print()` becomes (slightly) more complicated:"
+    "class FatherWithMemoryFix\n",
+    "{\n",
+    "    public:\n",
+    "        \n",
+    "        FatherWithMemoryFix(std::string name);\n",
+    "    \n",
+    "        ~FatherWithMemoryFix();\n",
+    "    \n",
+    "        void AddChild(const std::shared_ptr<ChildWithMemoryFix>& child);        \n",
+    "        \n",
+    "        void Print() const;\n",
+    "    \n",
+    "    private:\n",
+    "        \n",
+    "        std::string name_;\n",
+    "\n",
+    "        std::vector<std::weak_ptr<ChildWithMemoryFix>> children_;\n",
+    "};"
    ]
   },
   {
@@ -247,7 +317,105 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "void Father::Print() const\n",
+    "class ChildWithMemoryFix\n",
+    "{\n",
+    "    public:\n",
+    "        ChildWithMemoryFix(std::string name, const std::shared_ptr<FatherWithMemoryFix>& father);\n",
+    "\n",
+    "        ~ChildWithMemoryFix();\n",
+    "        \n",
+    "        const std::string& GetName() const;\n",
+    "    \n",
+    "    private:\n",
+    "        \n",
+    "        std::string name_;\n",
+    "        \n",
+    "        std::shared_ptr<FatherWithMemoryFix> father_ = nullptr;\n",
+    "};"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "void FatherWithMemoryFix::AddChild(const std::shared_ptr<ChildWithMemoryFix>& child)\n",
+    "{\n",
+    "    children_.push_back(child);\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "FatherWithMemoryFix::FatherWithMemoryFix(std::string name)\n",
+    ": name_(name)\n",
+    "{\n",
+    "    std::cout << \"Allocating father \" << name_ << std::endl;\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "ChildWithMemoryFix::ChildWithMemoryFix(std::string name, const std::shared_ptr<FatherWithMemoryFix>& father)\n",
+    ": name_(name), \n",
+    "father_(father)\n",
+    "{ \n",
+    "    std::cout << \"Allocating child \" << name_ << std::endl;\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "FatherWithMemoryFix::~FatherWithMemoryFix()\n",
+    "{\n",
+    "    std::cout << \"Release Father \" << name_ << std::endl;\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "ChildWithMemoryFix::~ChildWithMemoryFix()\n",
+    "{\n",
+    "    std::cout << \"Release Child \" << name_ << std::endl;\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "const std::string& ChildWithMemoryFix::GetName() const // noexcept\n",
+    "{\n",
+    "    return name_;\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "void FatherWithMemoryFix::Print() const\n",
     "{\n",
     "    std::cout << name_ << \" is the father of \" << children_.size() << \" children: \" << std::endl;\n",
     "    \n",
@@ -260,6 +428,24 @@
     "}"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "{\n",
+    "    auto father = std::make_shared<FatherWithMemoryFix>(\"Darth Vader\");    \n",
+    "    auto boy = std::make_shared<ChildWithMemoryFix>(\"Luke\", father);\n",
+    "    auto girl = std::make_shared<ChildWithMemoryFix>(\"Leia\", father);    \n",
+    "    \n",
+    "    father->AddChild(boy);\n",
+    "    father->AddChild(girl);    \n",
+    "    \n",
+    "    father->Print();\n",
+    "}"
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {},
@@ -268,7 +454,7 @@
     "\n",
     "### Proper usage of `lock()`\n",
     "\n",
-    "However our code is currently not robust: we forget to check whether the underlying objects are still valid. Let's consider the following main ([@Coliru](http://coliru.stacked-crooked.com/a/aa96edd87fbd1f9b) - don't be surprised segmentation fault is fully expected!):"
+    "However our code is currently not robust: we forget to check whether the underlying objects are still valid. Let's consider the following program:"
    ]
   },
   {
@@ -277,26 +463,21 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Doesn't work in Xeus-cling!\n",
-    "\n",
-    "int main(int argc, char** argv)\n",
     "{\n",
-    "    auto father = std::make_shared<Father>(\"Darth Vader\");    \n",
-    "    auto boy = std::make_shared<Child>(\"Luke\", father);\n",
-    "    auto girl = std::make_shared<Child>(\"Leia\", father);    \n",
+    "    auto father = std::make_shared<FatherWithMemoryFix>(\"Darth Vader\");    \n",
+    "    auto boy = std::make_shared<ChildWithMemoryFix>(\"Luke\", father);\n",
+    "    auto girl = std::make_shared<ChildWithMemoryFix>(\"Leia\", father);    \n",
     "    \n",
     "    father->AddChild(boy);\n",
     "    father->AddChild(girl);    \n",
     "    \n",
     "    {\n",
-    "        auto mistake = std::make_shared<Child>(\"Yoda\", father); // ages don't even match!\n",
+    "        auto mistake = std::make_shared<ChildWithMemoryFix>(\"Yoda\", father); // ages don't even match!\n",
     "        father->AddChild(mistake);\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",
-    "    \n",
-    "    return EXIT_SUCCESS;\n",
+    "    father->Print(); // MAY CRASH THE KERNEL!\n",
     "}"
    ]
   },
@@ -308,7 +489,7 @@
     "\n",
     "There is a method `expired()` that returns `true` if the underlying object no longer exists; but in fact `lock()` gets a return value that may be used to the same purpose.\n",
     "\n",
-    "We just change the `Print()` function (see [@Coliru](http://coliru.stacked-crooked.com/a/c9deaf942e703f4c)):"
+    "We could change the `Print()` function (see [@Coliru](http://coliru.stacked-crooked.com/a/c9deaf942e703f4c) - we could do it here but it would entail lots of boilerplate...):"
    ]
   },
   {
@@ -317,7 +498,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "// Doesn't work in Xeus-cling!\n",
+    "// Not intended to be run\n",
     "\n",
     "void Father::Print() const\n",
     "{\n",
@@ -387,6 +568,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "    \n",
     "#include <iostream>\n",
     "#include <vector>\n",
     "#include <memory>\n",
@@ -435,6 +618,9 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%%cppmagics cppyy/cppdef\n",
+    "\n",
+    "\n",
     "class Child3 : public std::enable_shared_from_this<Child3> // CRTP!\n",
     "{\n",
     "    public:\n",
@@ -446,15 +632,15 @@
     "        \n",
     "        const std::string& GetName() const; // noexcept would be even better!\n",
     "        \n",
-    "//        #ifndef NDEBUG - commented for Xeus-cling only...\n",
+    "//        #ifndef NDEBUG - commented for notebook only...\n",
     "        bool IsInitialised() const; // noexcept would be even better!\n",
-    "//        #endif // NDEBUG - commented for Xeus-cling only...\n",
+    "//        #endif // NDEBUG - commented for notebook only...\n",
     "\n",
     "    private:\n",
     "        \n",
-    "//        #ifndef NDEBUG - commented for Xeus-cling only...\n",
+    "//        #ifndef NDEBUG - commented for notebook only...\n",
     "        bool is_initialised_ = false;\n",
-    "//        #endif // NDEBUG - commented for Xeus-cling only...\n",
+    "//        #endif // NDEBUG - commented for notebook only...\n",
     "        \n",
     "        std::string name_;\n",
     "        \n",
@@ -509,9 +695,9 @@
    "source": [
     "void Child3::Init()\n",
     "{\n",
-    "    #ifndef NDEBUG\n",
+    "    // #ifndef NDEBUG - commented for notebook only...\n",
     "    is_initialised_ = true;\n",
-    "    #endif // NDEBUG\n",
+    "    // #endif //NDEBUG - commented for notebook only...\n",
     "    father_->AddChild(shared_from_this());\n",
     "}"
    ]
@@ -522,12 +708,12 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "//#ifndef NDEBUG - commented for Xeus-cling only...\n",
+    "// #ifndef NDEBUG - commented for notebook only...\n",
     "bool Child3::IsInitialised() const // noexcept\n",
     "{\n",
     "    return is_initialised_;\n",
     "}\n",
-    "//#endif // NDEBUG - commented for Xeus-cling only..."
+    "// #endif // NDEBUG - commented for notebook only..."
    ]
   },
   {
@@ -670,16 +856,15 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "C++17",
-   "language": "C++17",
-   "name": "xcpp17"
+   "display_name": "Cppyy",
+   "language": "c++",
+   "name": "cppyy"
   },
   "language_info": {
-   "codemirror_mode": "text/x-c++src",
+   "codemirror_mode": "c++",
    "file_extension": ".cpp",
    "mimetype": "text/x-c++src",
-   "name": "c++",
-   "version": "17"
+   "name": "c++"
   },
   "latex_envs": {
    "LaTeX_envs_menu_present": true,
diff --git a/README.md b/README.md
index 501984276ebe60c471f46afaaa0043d0f63b0b25..38cf8951c6e6c84a8de43e33b744bf8127024bf9 100644
--- a/README.md
+++ b/README.md
@@ -7,8 +7,8 @@ Table of Contents
   - [How to run it?](#how-to-run-it)
     - [BinderHub](#binderhub)
     - [Local installation](#local-installation)
+      - [On Unix systems (Linux, macOS)](#on-unix-systems-linux-macos)
       - [On Windows](#on-windows)
-      - [On macOS](#on-macos)
     - [Docker](#docker)
   - [For maintainers and contributors](#for-maintainers-and-contributors)
 
@@ -20,9 +20,10 @@ This tutorial is heavily inspired from a C++ tutorial created by David Chamont (
 Current version provides two major modifications:
 
 * The tutorial is now in english.
-* Jupyter notebooks using [Xeus-cling kernel](https://github.com/QuantStack/xeus-cling) are now used, thus enabling a sort of interpreted C++ which is rather helpful for teaching it (even if it is clearly not yet mature...)
+* Jupyter notebooks using [homemade Cppyy kernel](https://gitlab.inria.fr/sed-saclay/cppyy_kernel) are now used, thus enabling a sort of interpreted C++ which is rather helpful for teaching it.
 
-I have rewritten entirely and modified heavily several chapters, but the backbone remains heavily indebted to David and Vincent and the hands-on is still very similar to the original one.
+
+We have rewritten entirely and modified heavily several chapters, but the backbone remains heavily indebted to David and Vincent and the hands-on is still very similar to the original one.
 
 As the original tutorial, the present lecture is released under the [Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)](http://creativecommons.org/licenses/by-nc-sa/4.0/) licence.
 
@@ -56,21 +57,21 @@ The pro of using Binder is that you have basically nothing more to do than click
 
 ### Local installation
 
-As this tutorial relies heavily on [Xeus-cling kernel](https://github.com/QuantStack/xeus-cling), the only requirement is to install this environment on your machine.
+#### On Unix systems (Linux, macOS)
 
-It can be done easily (at least on Linux - see below for Windows and macOS) through:
+* The dependencies to run this tutorial are:
 
-Should the procedure described below not work at some point I invite you to check the link above, but at the time of this writing you need to:
+- Jupyterlab
+- Our dedicated [C++ Jupyter kernel](https://gitlab.inria.fr/sed-saclay/cppyy_kernel).
 
-* Install [miniconda3](https://conda.io/miniconda.html) environment (apparently using full-fledged anaconda may lead to conflict in dependencies).
-* Create a new conda environment and activate it:
 
 ```shell
-conda env create -f environment.yml
-conda activate training_cpp
+pip install jupyterlab
+pip install git+https://gitlab.inria.fr/sed-saclay/cppyy_kernel.git
 ```
 
-Don't forget to activate it each time you intend to run the lecture!
+You may of course choose another way to install JupyterLab (typically using Anaconda or Mamba)
+
 
 * Then you can run the notebook by going **into its root directory** (or internal links won't work...) in a terminal and typing:
 
@@ -82,15 +83,10 @@ __NOTE__: It is possible to use the notebooks directly from some IDEs like [VSCo
 
 #### On Windows
 
-No package is provided for Windows for Xeus-cling package (https://github.com/jupyter-xeus/xeus-cling).
-
-Your best option if you're using Windows 10 or 11 is probably to  [install Ubuntu in your Windows session](https://tutorials.ubuntu.com/tutorial/tutorial-ubuntu-on-windows); I haven't tried this myself.
-
-#### On macOS
+None of us is using Windows, and Cppyy kernel was not tested for this OS at all.
 
-Since at least May 2021, Conda packaging is broken for macOS (11.3). A [ticket](https://github.com/jupyter-xeus/xeus-cling/issues/403) has been issued but to no avail so far despite several users chiming in or opening similar tickets.
+Your best option if you're using Windows 10 or 11 is probably to  [install Ubuntu in your Windows session](https://tutorials.ubuntu.com/tutorial/tutorial-ubuntu-on-windows).
 
-Situation is even [more dire](https://github.com/jupyter-xeus/xeus-cling/issues/436) for ARM computers. The best for macOS user is probably to use Binder or Docker.
 
 
 ### Docker
@@ -101,13 +97,13 @@ First get the image from Gitlab registry:
 
 ```shell
 docker login registry.gitlab.inria.fr
-docker pull registry.gitlab.inria.fr/formations/cpp/gettingstartedwithmoderncpp/xeus-cling:latest
+docker pull registry.gitlab.inria.fr/sed-saclay/cppyy_kernel/cppyy_kernel
 ```
 
 Then run a container with:
 
 ```shell
-docker run --rm -e JUPYTER_TOKEN='easy' -p 8888:8888  --cap-drop=all -v $PWD:/home/dev_cpp/training_cpp  registry.gitlab.inria.fr/formations/cpp/gettingstartedwithmoderncpp/xeus-cling:latest
+docker run --rm -e JUPYTER_TOKEN='easy' -p 8888:8888  -v $PWD:/training_cpp -w /training_cpp --cap-drop=all registry.gitlab.inria.fr/sed-saclay/cppyy_kernel/cppyy_kernel:latest 
 ```
 
 And in your browser type `http://localhost:8888`
@@ -117,10 +113,11 @@ and then type `easy` in the token dialog box (of course you may replace by whate
 
 Few hints for those not familiar with Docker:
 
-* `-v` creates a mapping between local folder and the `/home/dev_cpp/training_cpp` folder in the container; this enables you to edit the file from your comfy local environment and see the file edited this way in the Docker container.
+* `-v` creates a mapping between local folder and the `/training_cpp` folder in the container; this enables you to edit the file from your comfy local environment and see the file edited this way in the Docker container.
 * `--cap-drop=all` is a safety when you're running a Docker image not built by yourself: you're essentially blocking the few remaining operations that might impact your own environment that Docker lets by default open with the run command.
 * `-p` gives the port mapping between the Docker image and your local environment.
 * `--rm` tells docker to delete the container after its use.
+* `-w` tells to use as working directory the provided argument - which is here the mapped local folder.
 
 The lengthy `registry.gitlab.inria.fr/formations/cpp/gettingstartedwithmoderncpp/xeus-cling-and-compilers` is the name of the Docker **image**, if this image is not present locally in your environment Docker will try to fetch it from a *registry* on the Inria Gitlab. 
 
diff --git a/binder/environment.yml b/binder/environment.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9f5568e88440b0f3753e50061d61b46316fb5784
--- /dev/null
+++ b/binder/environment.yml
@@ -0,0 +1,23 @@
+# environment.yaml
+
+# clang version is intentionally fixed in the rather old 15 version:
+# if we let it loose clang and clang++ 18 are installed, but they
+# fail at runtime as the libstd++ used is too old (the GLIBCXX_3
+# requested by compiler is not found and looking at libstdc++ it appears
+# older versions are present). I didn't manage to set workable
+# values; to my mind the fault here is with the way Conda packages are
+# built and I don't see a better workaround).
+
+name: cppyy_kernel
+channels:
+  - conda-forge
+dependencies:
+  - python>=3.12
+  - pip
+  - clang=18
+  - clangxx=18
+  - clang-tools>=18
+  - gcc>=14
+  - gxx>=14
+  - libstdcxx-ng>=14
+
diff --git a/binder/postBuild b/binder/postBuild
new file mode 100644
index 0000000000000000000000000000000000000000..422fa197ba7fb917402aad15ca93c4af5cac2d4f
--- /dev/null
+++ b/binder/postBuild
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+pip install git+https://gitlab.inria.fr/sed-saclay/cppyy_kernel.git
+
diff --git a/binder/start b/binder/start
new file mode 100644
index 0000000000000000000000000000000000000000..fbc9dd7f527f1f0d6b1188dbd5beb6abd8d5b9ef
--- /dev/null
+++ b/binder/start
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+export LD_LIBRARY_PATH=${CONDA_PREFIX}/lib
+
+exec "$@"
\ No newline at end of file
diff --git a/docker/Dockerfile.xeus-cling b/docker/Dockerfile.xeus-cling
deleted file mode 100644
index f7ed49f896f1782beb67ad3a9f96a14c5bd99614..0000000000000000000000000000000000000000
--- a/docker/Dockerfile.xeus-cling
+++ /dev/null
@@ -1,22 +0,0 @@
-# Inspired from https://pythonspeed.com/articles/activate-conda-dockerfile
-FROM continuumio/miniconda3
-
-LABEL maintainer Sébastien Gilles "sebastien.gilles@inria.fr"
-
-# Create non root user and give him the ownership of /opt/conda.
-ENV USER "dev_cpp"
-RUN useradd --create-home ${USER}
-RUN chown ${USER}:${USER} /opt/conda
-USER ${USER}
-
-# Create the environment:
-WORKDIR /home/${USER}/training_cpp
-COPY environment.yml .
-RUN conda env create -f environment.yml 
-
-# Make RUN commands use the new environment:
-SHELL ["/bin/bash", "-c"] 
-
-# The code to run when container is started:
-# Using information from https://hub.docker.com/r/continuumio/miniconda3 and options used by Vicente in former Docker file based on Ubuntu.
-ENTRYPOINT [ "conda", "run", "--no-capture-output", "-n", "training_cpp", "jupyter", "lab", "--port=8888", "--ip=0.0.0.0", "--no-browser","--allow-root"]
diff --git a/environment.yml b/environment.yml
index a1c0be00657612399a5d37a4580000abc26e0355..2f9d8f3a230d9f11ce5771e677bca0e65600f477 100644
--- a/environment.yml
+++ b/environment.yml
@@ -3,4 +3,3 @@ channels:
   - conda-forge
 dependencies:
   - jupyterlab
-  - xeus-cling