diff --git a/.gitignore b/.gitignore
index db6b1e042d4503c2b0ba495d582b842e77f63bb5..e8ba8747559abdacd563868545e2a6666be82a3c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@ build/
 CMakeFiles/
 CMakeCache.txt
 .\#*
+.*.swp
 .DS_Store
 /compile_commands.json
 GPATH
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index dd8e7d6368d2c980f4c1ca381b91018c701f856f..1d9b64f0f08f80b6809fe6860e17b7c24444351b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -7,9 +7,10 @@ variables:
   CTEST_OUTPUT_ON_FAILURE: 1
 
 include:
-  - local: '/.gitlab-ci/gcc8-seq-dbg.yml'
-  - local: '/.gitlab-ci/gcc8-seq-release.yml'
-  - local: '/.gitlab-ci/clang10-seq-release.yml'
+  - local: '/.gitlab-ci/clang10-mpi-debug.yml'
   - local: '/.gitlab-ci/clang10-mpi-release.yml'
-  - local: '/.gitlab-ci/clang10-seq-coverage.yml'
-  - local: '/.gitlab-ci/clang10-mpi-coverage.yml'
+  - local: '/.gitlab-ci/gcc10-mpi-debug.yml'
+  - local: '/.gitlab-ci/gcc10-mpi-coverage.yml'
+  - local: '/.gitlab-ci/gcc10-mpi-release.yml'
+  - local: '/.gitlab-ci/gcc10-seq-coverage.yml'
+  - local: '/.gitlab-ci/gcc10-seq-release.yml'
diff --git a/.gitlab-ci/clang10-mpi-coverage.yml b/.gitlab-ci/clang10-mpi-coverage.yml
deleted file mode 100644
index 8d18ed109e0d929a7a66dcd44885eee8dbc55d68..0000000000000000000000000000000000000000
--- a/.gitlab-ci/clang10-mpi-coverage.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-coverage:clang10-mpi-coverage:
-  image: localhost:5000/ubuntu_clang10_mpi
-  stage: coverage
-  script:
-    - mkdir -p build/clang10-cov-mpi
-    - cd build/clang10-cov-mpi
-    - CXX=clang++-10 CC=clang-10 cmake ../.. -DCMAKE_BUILD_TYPE=Coverage -DCLANG_FORMAT=/usr/bin/clang-format-10
-    - make pugs
-    - make coverage
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-clang10-cov-mpi"
-    paths:
-      - build/clang10-cov-mpi
-    untracked: true
diff --git a/.gitlab-ci/clang10-mpi-debug.yml b/.gitlab-ci/clang10-mpi-debug.yml
new file mode 100644
index 0000000000000000000000000000000000000000..116a3f1034cd679352569680a09d878b31b83c73
--- /dev/null
+++ b/.gitlab-ci/clang10-mpi-debug.yml
@@ -0,0 +1,29 @@
+build:clang10-mpi-debug:
+  image: localhost:5000/ubuntu_clang10_mpi
+  stage: build
+  needs: []
+  script:
+    - mkdir -p build/clang10-debug-mpi
+    - cd build/clang10-debug-mpi
+    - CXX=clang++-10 CC=clang-10 cmake ../.. -DCMAKE_BUILD_TYPE=Debug
+    - make pugs
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-clang10-debug-mpi"
+    paths:
+      - build/clang10-debug-mpi
+    untracked: true
+
+test:clang10-mpi-debug:
+  image: localhost:5000/ubuntu_clang10_mpi
+  stage: test
+  needs: ["build:clang10-mpi-debug"]
+  script:
+    - mkdir -p build/clang10-debug-mpi
+    - cd build/clang10-debug-mpi
+    - CXX=clang++-10 CC=clang-10 cmake ../.. -DCMAKE_BUILD_TYPE=Debug
+    - make run_unit_tests
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-clang10-debug-mpi"
+    paths:
+      - build/clang10-debug-mpi
+    untracked: true
diff --git a/.gitlab-ci/clang10-mpi-release.yml b/.gitlab-ci/clang10-mpi-release.yml
index 6a7b914c42d5122c8fcdd5b2d1229185658e80c7..cb1ffbda2ddc3bbed30f03d2caa4f0c8e45629c6 100644
--- a/.gitlab-ci/clang10-mpi-release.yml
+++ b/.gitlab-ci/clang10-mpi-release.yml
@@ -1,6 +1,7 @@
 build:clang10-mpi-release:
   image: localhost:5000/ubuntu_clang10_mpi
   stage: build
+  needs: []
   script:
     - mkdir -p build/clang10-release-mpi
     - cd build/clang10-release-mpi
@@ -15,8 +16,7 @@ build:clang10-mpi-release:
 test:clang10-mpi-release:
   image: localhost:5000/ubuntu_clang10_mpi
   stage: test
-  dependencies:
-    - build:clang10-mpi-release
+  needs: ["build:clang10-mpi-release"]
   script:
     - mkdir -p build/clang10-release-mpi
     - cd build/clang10-release-mpi
diff --git a/.gitlab-ci/clang10-seq-coverage.yml b/.gitlab-ci/clang10-seq-coverage.yml
deleted file mode 100644
index c9bb772d63cabed996f3fe3834e858aded8cef4b..0000000000000000000000000000000000000000
--- a/.gitlab-ci/clang10-seq-coverage.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-coverage:clang10-seq-coverage:
-  image: localhost:5000/ubuntu_clang10
-  stage: coverage
-  script:
-    - mkdir -p build/clang10-cov
-    - cd build/clang10-cov
-    - CXX=clang++-10 CC=clang-10 cmake ../.. -DCMAKE_BUILD_TYPE=Coverage -DCLANG_FORMAT=/usr/bin/clang-format-10
-    - make pugs
-    - make coverage
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-clang10-cov"
-    paths:
-      - build/clang10-cov
-    untracked: true
diff --git a/.gitlab-ci/clang10-seq-release.yml b/.gitlab-ci/clang10-seq-release.yml
deleted file mode 100644
index bfd921abdd8b60a7fcb273d55a7821ace695bbeb..0000000000000000000000000000000000000000
--- a/.gitlab-ci/clang10-seq-release.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-build:clang10-seq-release:
-  image: localhost:5000/ubuntu_clang10
-  stage: build
-  script:
-    - mkdir -p build/clang10-release-seq
-    - cd build/clang10-release-seq
-    - CXX=clang++-10 CC=clang-10 cmake ../.. -DCMAKE_BUILD_TYPE=Release -DCLANG_FORMAT=/usr/bin/clang-format-10
-    - make pugs
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-clang10-release-seq"
-    paths:
-      - build/clang10-release-seq
-    untracked: true
-
-test:clang10-seq-release:
-  image: localhost:5000/ubuntu_clang10
-  stage: test
-  dependencies:
-    - build:clang10-seq-release
-  script:
-    - mkdir -p build/clang10-release-seq
-    - cd build/clang10-release-seq
-    - CXX=clang++-10 CC=clang-10 cmake ../.. -DCMAKE_BUILD_TYPE=Release -DCLANG_FORMAT=/usr/bin/clang-format-10
-    - make run_unit_tests
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-clang10-release-seq"
-    paths:
-      - build/clang10-release-seq
-    untracked: true
diff --git a/.gitlab-ci/gcc10-mpi-coverage.yml b/.gitlab-ci/gcc10-mpi-coverage.yml
new file mode 100644
index 0000000000000000000000000000000000000000..156592e9f4c080b545915a5e9a7aecef96ce3d2e
--- /dev/null
+++ b/.gitlab-ci/gcc10-mpi-coverage.yml
@@ -0,0 +1,14 @@
+coverage:gcc10-mpi-coverage:
+  image: localhost:5000/ubuntu_gcc10_mpi
+  stage: coverage
+  script:
+    - mkdir -p build/gcc10-cov-mpi
+    - cd build/gcc10-cov-mpi
+    - CXX=g++-10 CC=gcc-10 cmake ../.. -DCMAKE_BUILD_TYPE=Coverage
+    - make pugs
+    - make coverage
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc10-cov-mpi"
+    paths:
+      - build/gcc10-cov-mpi
+    untracked: true
diff --git a/.gitlab-ci/gcc10-mpi-debug.yml b/.gitlab-ci/gcc10-mpi-debug.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6dd2806678651be82e4e2defdbb0c57ea2597f79
--- /dev/null
+++ b/.gitlab-ci/gcc10-mpi-debug.yml
@@ -0,0 +1,29 @@
+build:gcc10-mpi-debug:
+  image: localhost:5000/ubuntu_gcc10_mpi
+  stage: build
+  needs: []
+  script:
+    - mkdir -p build/gcc10-debug-mpi
+    - cd build/gcc10-debug-mpi
+    - CXX=g++-10 CC=gcc-10 cmake ../.. -DCMAKE_BUILD_TYPE=Debug
+    - make pugs
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc10-debug-mpi"
+    paths:
+      - build/gcc10-debug-mpi
+    untracked: true
+
+test:gcc10-mpi-debug:
+  image: localhost:5000/ubuntu_gcc10_mpi
+  stage: test
+  needs: ["build:gcc10-mpi-debug"]
+  script:
+    - mkdir -p build/gcc10-debug-mpi
+    - cd build/gcc10-debug-mpi
+    - CXX=g++-10 CC=gcc-10 cmake ../.. -DCMAKE_BUILD_TYPE=Debug
+    - make run_unit_tests
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc10-debug-mpi"
+    paths:
+      - build/gcc10-debug-mpi
+    untracked: true
diff --git a/.gitlab-ci/gcc10-mpi-release.yml b/.gitlab-ci/gcc10-mpi-release.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3f7d2a6a9aae7368216047a5fb691dc71df2aff9
--- /dev/null
+++ b/.gitlab-ci/gcc10-mpi-release.yml
@@ -0,0 +1,29 @@
+build:gcc10-mpi-release:
+  image: localhost:5000/ubuntu_gcc10_mpi
+  stage: build
+  needs: []
+  script:
+    - mkdir -p build/gcc10-release-mpi
+    - cd build/gcc10-release-mpi
+    - CXX=g++-10 CC=gcc-10 cmake ../.. -DCMAKE_BUILD_TYPE=Release
+    - make pugs
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc10-release-mpi"
+    paths:
+      - build/gcc10-release-mpi
+    untracked: true
+
+test:gcc10-mpi-release:
+  image: localhost:5000/ubuntu_gcc10_mpi
+  stage: test
+  needs: ["build:gcc10-mpi-release"]
+  script:
+    - mkdir -p build/gcc10-release-mpi
+    - cd build/gcc10-release-mpi
+    - CXX=g++-10 CC=gcc-10 cmake ../.. -DCMAKE_BUILD_TYPE=Release
+    - make run_unit_tests
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc10-release-mpi"
+    paths:
+      - build/gcc10-release-mpi
+    untracked: true
diff --git a/.gitlab-ci/gcc10-seq-coverage.yml b/.gitlab-ci/gcc10-seq-coverage.yml
new file mode 100644
index 0000000000000000000000000000000000000000..663798274b0c465892c78084dde56022b151b1ba
--- /dev/null
+++ b/.gitlab-ci/gcc10-seq-coverage.yml
@@ -0,0 +1,14 @@
+coverage:gcc10-seq-coverage:
+  image: localhost:5000/ubuntu_gcc10
+  stage: coverage
+  script:
+    - mkdir -p build/gcc10-cov
+    - cd build/gcc10-cov
+    - CXX=g++-10 CC=gcc-10 cmake ../.. -DCMAKE_BUILD_TYPE=Coverage
+    - make pugs
+    - make coverage
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc10-cov"
+    paths:
+      - build/gcc10-cov
+    untracked: true
diff --git a/.gitlab-ci/gcc10-seq-release.yml b/.gitlab-ci/gcc10-seq-release.yml
new file mode 100644
index 0000000000000000000000000000000000000000..525a08a80f295df5a8e766304279b79cd3fef4b0
--- /dev/null
+++ b/.gitlab-ci/gcc10-seq-release.yml
@@ -0,0 +1,29 @@
+build:gcc10-seq-release:
+  image: localhost:5000/ubuntu_gcc10
+  stage: build
+  needs: []
+  script:
+    - mkdir -p build/gcc10-release-seq
+    - cd build/gcc10-release-seq
+    - CXX=g++-10 CC=gcc-10 cmake ../.. -DCMAKE_BUILD_TYPE=Release
+    - make pugs
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc10-release-seq"
+    paths:
+      - build/gcc10-release-seq
+    untracked: true
+
+test:gcc10-seq-release:
+  image: localhost:5000/ubuntu_gcc10
+  stage: test
+  needs: ["build:gcc10-seq-release"]
+  script:
+    - mkdir -p build/gcc10-release-seq
+    - cd build/gcc10-release-seq
+    - CXX=g++-10 CC=gcc-10 cmake ../.. -DCMAKE_BUILD_TYPE=Release
+    - make run_unit_tests
+  cache:
+    key: "${CI_COMMIT_REF_SLUG}-gcc10-release-seq"
+    paths:
+      - build/gcc10-release-seq
+    untracked: true
diff --git a/.gitlab-ci/gcc8-seq-coverage.yml b/.gitlab-ci/gcc8-seq-coverage.yml
deleted file mode 100644
index b1dde28e100add4c0aecccc07b7cb7c695cde92e..0000000000000000000000000000000000000000
--- a/.gitlab-ci/gcc8-seq-coverage.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-build:gcc8-seq-coverage:
-  image: localhost:5000/ubuntu_gcc8
-  stage: coverage
-  script:
-    - mkdir -p build/gcc8-seq-covrage
-    - cd build/gcc8-seq-covrage
-    - CXX=g++-8 CC=gcc-8 cmake ../.. -DCMAKE_BUILD_TYPE=Coverage
-    - make coverage
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-gcc8-seq-coverage"
-    paths:
-      - build/gcc8-seq-covrage
-    untracked: true
diff --git a/.gitlab-ci/gcc8-seq-dbg.yml b/.gitlab-ci/gcc8-seq-dbg.yml
deleted file mode 100644
index b8a9d91379064a24bde84b873adbf717d8380503..0000000000000000000000000000000000000000
--- a/.gitlab-ci/gcc8-seq-dbg.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-build:gcc8-seq-dbg:
-  image: localhost:5000/ubuntu_gcc8
-  stage: build
-  script:
-    - mkdir -p build/gcc8-seq-dbg
-    - cd build/gcc8-seq-dbg
-    - CXX=g++-8 CC=gcc-8 cmake ../.. -DCMAKE_BUILD_TYPE=Debug
-    - make pugs
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-gcc8-seq-dbg"
-    paths:
-      - build/gcc8-seq-dbg
-    untracked: true
-
-test:gcc8-seq-dbg:
-  image: localhost:5000/ubuntu_gcc8
-  stage: test
-  dependencies:
-    - build:gcc8-seq-dbg
-  script:
-    - mkdir -p build/gcc8-seq-dbg
-    - cd build/gcc8-seq-dbg
-    - CXX=g++-8 CC=gcc-8 cmake ../.. -DCMAKE_BUILD_TYPE=Debug
-    - make run_unit_tests
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-gcc8-seq-dbg"
-    paths:
-      - build/gcc8-seq-dbg
-    untracked: true
diff --git a/.gitlab-ci/gcc8-seq-release.yml b/.gitlab-ci/gcc8-seq-release.yml
deleted file mode 100644
index 516bfa2e2f4ceb0656a2394f7f0b3b50acf96d86..0000000000000000000000000000000000000000
--- a/.gitlab-ci/gcc8-seq-release.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-build:gcc8-seq-release:
-  image: localhost:5000/ubuntu_gcc8
-  stage: build
-  script:
-    - mkdir -p build/gcc8-seq-release
-    - cd build/gcc8-seq-release
-    - CXX=g++-8 CC=gcc-8 cmake ../.. -DCMAKE_BUILD_TYPE=Release
-    - make pugs
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-gcc8-seq-release"
-    paths:
-      - build/gcc8-seq-release
-    untracked: true
-
-test:gcc8-seq-release:
-  image: localhost:5000/ubuntu_gcc8
-  stage: test
-  dependencies:
-    - build:gcc8-seq-release
-  script:
-    - mkdir -p build/gcc8-seq-release
-    - cd build/gcc8-seq-release
-    - CXX=g++-8 CC=gcc-8 cmake ../.. -DCMAKE_BUILD_TYPE=Release
-    - make run_unit_tests
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}-gcc8-seq-release"
-    paths:
-      - build/gcc8-seq-release
-    untracked: true
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 73cda5739485b07c04c44c93ae6f4e9533d0f055..4197fca78ed484ea3a2ffd8747872db2bcb66c6a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required (VERSION 3.4)
+cmake_minimum_required (VERSION 3.10)
 
 # CMake utils
 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
@@ -81,8 +81,8 @@ endif()
 #------------------------------------------------------
 
 # Checks if compiler version is compatible with Pugs sources
-set(GNU_CXX_MIN_VERSION "7.0.0")
-set(CLANG_CXX_MIN_VERSION "5.0.0")
+set(GNU_CXX_MIN_VERSION "8.0.0")
+set(CLANG_CXX_MIN_VERSION "8.0.0")
 
 # Pugs default compiler flags
 set(PUGS_CXX_FLAGS "${PUGS_CXX_FLAGS} -Wall -Wextra -pedantic")
@@ -181,15 +181,7 @@ endif()
 
 #------------------------------------------------------
 # C++ 17 flags
-if(${CMAKE_VERSION} VERSION_LESS "3.8.0")
-  message(WARNING "Please consider to switch to CMake >= 3.8")
-  set(PUGS_CXX_FLAGS "${PUGS_CXX_FLAGS}  -std=gnu++1z")
-  if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
-    set(PUGS_CXX_FLAGS "${PUGS_CXX_FLAGS}  -Wno-c++17-extensions")
-  endif()
-else()
-  set(CMAKE_CXX_STANDARD "17")
-endif()
+set(CMAKE_CXX_STANDARD "17")
 
 #------------------------------------------------------
 # Kokkos configuration