diff --git a/CMakeLists.txt b/CMakeLists.txt
index c490e2259a30b3c82da656886a665b39365bea60..c95457bc6c19b6467eedabcb97f9d332d5442d1d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -638,7 +638,9 @@ message(" kokkos devices: ${PUGS_BUILD_KOKKOS_DEVICES}")
 if (MPI_FOUND)
   message(" MPI: ${MPI_CXX_LIBRARY_VERSION_STRING}")
 else()
-  if(NOT PARMETIS_LIBRARIES)
+  if (PUGS_ENABLE_MPI MATCHES "^OFF$")
+    message(" MPI: deactivated!")
+  elseif(NOT PARMETIS_LIBRARIES)
     message(" MPI: deactivated: ParMETIS cannot be found!")
   else()
     if (PUGS_ENABLE_MPI MATCHES "^(AUTO|ON)$")
diff --git a/README.md b/README.md
index 4d1ed7f40f80eeb7a25b6b39871ae3c5402b6ee5..62d6b43773cb0164a29e8a3716a818c5ec219c7d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,263 @@
-The Pugs framework
-==================
+The `pugs` framework
+====================
 
-Pugs stands for Parallel Unstructured Grid Solver.
+`pugs` stands for Parallel Unstructured Grid Solvers.
+
+It aims at providing a collection of numerical methods and utilities
+that are assembled together by a user friendly language.
+
+# Building `pugs`
+
+## Requirements
+
+For the most basic build, `pugs` only requires
+- a C++-17 compiler.
+  - g++-10 or higher versions
+  - clang-10 or higher versions
+- `CMake` (at least 3.16)
+
+> **Warning**:<br>
+> Building `pugs` in its source directory is **forbidden**. Trying to
+> do so will result in a failure. However it generally leaves some
+> garbage files in the source directory, namely the `CMakeCache.txt`
+> and the `CMakeFiles` directory. `CMake` itself is not able to remove
+> them, to avoid the risk of compilation issues, one has to dot it
+> manually...
+
+In the build directory, one for instance launches
+```shell
+cmake path-to-pugs-source
+```
+and then
+```shell
+make -j nb_jobs
+```
+Specifying the compiler is done for instance as
+```shell
+CXX=g++ CC=gcc cmake path-to-pugs-source
+```
+
+When compilation is done, `pugs` binary is produce. Additionally, one
+can run unit tests by
+```shell
+make check
+```
+
+## Optional packages
+
+`pugs` can benefit from additional packages to gain more
+functionalities or development tools.
+
+### Optional numerical tools
+
+#### MPI support
+
+`pugs` integrates MPI support and should compile with any MPI-3
+implementation. However in order to dispatch meshes on MPI processes
+`pugs` requires `ParMETIS`. Without, MPI support will be automatically
+deactivated.
+
+The easiest way to enable MPI support on Debian-like systems is to run
+```shell
+apt install libparmetis-dev
+```
+
+#### `PETSc`
+
+`pugs` can use `PETSc` to solve linear systems. In `pugs` the `PETSc`
+support requires MPI support.
+
+To install `PETSc` on Debian-like systems
+```shell
+apt install petsc-dev
+```
+
+#### `SLEPc`
+
+`SLEPc` is an eigenvalue problem solver based on `PETSc`. It requires
+`PETSc`.
+
+To install `SLEPc` on Debian-like systems
+```shell
+apt install slepc-dev
+```
+
+## Documentation
+
+### User documentation
+
+To build documentation one requires `emacs` and `gnuplot`,
+additionally since examples results are generated, the documentation
+can only be produced after the compilation of `pugs` itself.
+
+To install `emacs` on Debian-like systems
+```shell
+apt install emacs
+```
+To install `gnuplot` one can either use
+```shell
+apt install gnuplot-nox
+```
+or
+```shell
+apt install gnuplot-x11
+```
+> **Warning**:<br>
+> When building the documentation for the first time, a local `emacs`
+> configuration is generated. *This requires an internet connection.*
+
+These packages are enough to build the html documentation. To build
+the pdf documentation one requires a few more packages: `pdflatex`
+(actually a fresh texlive installation is probably necessary) and `pygmentize`
+
+On Debian-like systems these two packages are installed after
+```shell
+apt install texlive-full
+```
+
+Running the command
+```shell
+make doc
+```
+produces both the `html` and `pdf` documentation. Additional targets
+are
+- `userdoc`, `userdoc-pdf` and `userdoc-html`.
+
+> **Warning**:<br>
+> The documentation building **should not** be run in
+> parallel. Generation uses similar temporary files. A generation race
+> can produce corrupted documentations.
+
+### `doxygen` documentation
+
+## Development tools
+
+### `clang-format`
+
+If `clang-format` is found, a new compilation target is defined which
+allows to run
+
+```shell
+make clang-format
+```
+
+This allows to run `clang-format` on the entire code. **This should
+never be run** on non main development branches since `clang-format`
+versions may experience unpleasant compatibility issues.
+
+### Static analysis
+
+#### `scan-build`
+
+To install `scan-build`
+```shell
+apt install clang-tools
+```
+It is fairly simple to use. First launch
+```shell
+scan-build cmake path-to-pugs-source -DCMAKE_BUILD_TYPE=Debug
+```
+Observe that the code is built in debug mode to reduce false
+positives.
+
+Then compile `pugs`
+```shell
+scan-build make -j nb-jobs pugs
+```
+One can use any other generator such as `Ninja` for instance. Here we
+only build `pugs`'s binary, which is generally enough.
+
+At the end of the compilation, an hint such as
+```
+scan-build: Run 'scan-view /tmp/scan-build-XXXX-XX-XX-XXXXXX-XXXXX-X' to examine bug reports.
+```
+is produced. Running this command opens the report in the default
+browser.
+
+`scan-build` is a precious tool but may unfortunately produce false
+positives.
+
+#### `clang-tidy`
+
+We do not give details here about `clang-tidy`. It is a much more
+complex tool and should be used by more experienced developers since
+it requires fine tuning and produces a lot of false positive.
+
+#### `clazy`
+
+`clazy` is another great static-analysis tool. It checks constructions
+and gives some performances hints. It can be install by
+```shell
+apt install clazy
+```
+When `clazy` is installed a new target is defined and one just has to
+run
+```shell
+make clazy-standalone
+```
+
+> **Warning**:<br>
+> Since some generated sources files are required, one must first run
+> a classic compilation in the same build directory.
+
+This is a special homemade compilation procedure: specifying jobs has
+no effect. Each file is checked serially.
+
+## `CMake` building options
+
+In this section we give specific options that can be used to modify
+the way `pugs` is built.
+
+### Optimization options
+
+| Description | Variable                | Values                                  |
+|:------------|:------------------------|:---------------------------------------:|
+| Build type  | `CMAKE_BUILD_TYPE`      | `Release`(default), `Debug`, `Coverage` |
+| OpenMP      | `Kokkos_ENABLE_OPENMP`  | `ON`(default),  `OFF`                   |
+| Pthread     | `Kokkos_ENABLE_PTHREAD` | `ON`, `OFF`(default)                    |
+| Serial      | `Kokkos_ENABLE_SERIAL`  | `ON`, `OFF`(default)                    |
+
+- `Coverage` is a special compilation mode. It forces the run of unit
+  tests and produces coverage reports. See below for coverage
+  instructions.
+- OpenMP, PThread and Serial builds are mutually exclusive. OpenMP
+  support is automatically enabled as soon as the C++ compiler
+  supports it.
+
+### Additional packages support
+
+| Description     | Variable            | Values                       |
+|:----------------|:--------------------|:----------------------------:|
+| MPI support     | `PUGS_ENABLE_MPI`   | `AUTO`(default), `ON`, `OFF` |
+| `PETSc` support | `PUGS_ENABLE_PETSC` | `AUTO`(default), `ON`, `OFF` |
+| `SLEPc` support | `PUGS_ENABLE_SLEPC` | `AUTO`(default), `ON`, `OFF` |
+
+### Code coverage build
+
+To enable coverage more, one requires the following tools:
+- `lcov`
+- `gcov`
+- and `fastcov` when using `g++` as a compiler.
+
+To install these tools
+```shell
+apt install lcov gcov python3-pip
+```
+then to install `fastcov`, as the user do
+```shell
+pip3 install fastcov
+```
+
+Then to get coverage reports one can do
+```shell
+CXX=g++ CC=gcc cmake path-to-pugs-source -DCMAKE_BUILD_TYPE=Coverage
+```
+and
+```shell
+make -j nb-jobs
+```
+This produces a text report summary and a detailed html report is
+produced in the `coverage` directory.
+
+One can also use `clang` but the production of the report is much
+slower (does not use `fastcov`).