diff --git a/CMakeLists.txt b/CMakeLists.txt
index ddf9c2c37c873c059c7813d39de206b00a1e42af..33ecfa4f649b57a23b0b5a4423a08331b3a88244 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -335,33 +335,60 @@ if("${CMAKE_BUILD_TYPE}" STREQUAL "Coverage")
      message(FATAL_ERROR "Cannot find a proper gcov tool, cannot perform coverage.")
   endif()
 
-  add_custom_target(coverage
-    ALL # in coverage mode we do coverage!
-    # Cleanup previously generated profiling data
-    COMMAND ${LCOV} -q --gcov "${GCOV_BIN}" --base-directory "${PUGS_SOURCE_DIR}/src" --directory "${PUGS_BINARY_DIR}" --zerocounters
-    # Initialize profiling data with zero coverage for every instrumented line of the project
-    # This way the percentage of total lines covered will always be correct, even when not all source code files were loaded during the test(s)
-    COMMAND ${LCOV} -q --gcov "${GCOV_BIN}" --base-directory "${PUGS_SOURCE_DIR}/src" --directory "${PUGS_BINARY_DIR}" --capture --initial --output-file coverage_base.info
-    # Run tests
-    COMMAND ${CMAKE_CTEST_COMMAND} -j ${PROCESSOR_COUNT}
-    # Collect data from executions
-    COMMAND ${LCOV} --gcov "${GCOV_BIN}" --base-directory "${PUGS_SOURCE_DIR}/src" --directory "${PUGS_BINARY_DIR}" --capture --output-file coverage_ctest.info
-    # Combine base and ctest results
-    COMMAND ${LCOV} --gcov "${GCOV_BIN}" -q --add-tracefile coverage_base.info --add-tracefile coverage_ctest.info --output-file coverage_full.info
-    # Extract only project data (--no-capture or --remove options may be used to select collected data)
-    COMMAND ${LCOV} --gcov "${GCOV_BIN}" -q --extract coverage_full.info "'${PUGS_SOURCE_DIR}/src/*'" --output-file coverage_extract.info
-
-    # Remove unwanted stuff
-    COMMAND ${LCOV} --gcov "${GCOV_BIN}" --remove coverage_extract.info  --output-file coverage.info
-                                              '${PUGS_SOURCE_DIR}/src/main.cpp'
-                                              '${PUGS_SOURCE_DIR}/utils/BacktraceManager.*'
-
-    COMMAND ${LCOV} --gcov "${GCOV_BIN}" --list coverage.info
-
-    DEPENDS unit_tests mpi_unit_tests
-    COMMENT "Running test coverage."
-    WORKING_DIRECTORY "${PUGS_BINARY_DIR}"
-    )
+  find_program(FASTCOV fastcov fastcov.py)
+
+  if (FASTCOV AND (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "9"))
+
+    add_custom_target(coverage
+      ALL # in coverage mode we do coverage!
+
+      # Run tests
+      COMMAND ${CMAKE_CTEST_COMMAND} -j ${PROCESSOR_COUNT}
+
+      COMMAND ${FASTCOV} -q --gcov "${GCOV_BIN}"
+      --include "${PUGS_SOURCE_DIR}/src"
+      --exclude "${PUGS_SOURCE_DIR}/src/main.cpp"
+      --exclude "${PUGS_SOURCE_DIR}/src/utils/BacktraceManager.*"
+      --lcov -o coverage.info -n
+
+      COMMAND ${LCOV} --gcov "${GCOV_BIN}" --list coverage.info
+
+      DEPENDS unit_tests mpi_unit_tests
+      COMMENT "Running test coverage."
+      WORKING_DIRECTORY "${PUGS_BINARY_DIR}"
+      )
+
+  else()
+
+    add_custom_target(coverage
+      ALL # in coverage mode we do coverage!
+      # Cleanup previously generated profiling data
+      COMMAND ${LCOV} -q --gcov "${GCOV_BIN}" --base-directory "${PUGS_SOURCE_DIR}/src" --directory "${PUGS_BINARY_DIR}" --zerocounters
+      # Initialize profiling data with zero coverage for every instrumented line of the project
+      # This way the percentage of total lines covered will always be correct, even when not all source code files were loaded during the test(s)
+      COMMAND ${LCOV} -q --gcov "${GCOV_BIN}" --base-directory "${PUGS_SOURCE_DIR}/src" --directory "${PUGS_BINARY_DIR}" --capture --initial --output-file coverage_base.info
+      # Run tests
+      COMMAND ${CMAKE_CTEST_COMMAND} -j ${PROCESSOR_COUNT}
+      # Collect data from executions
+      COMMAND ${LCOV} --gcov "${GCOV_BIN}" --base-directory "${PUGS_SOURCE_DIR}/src" --directory "${PUGS_BINARY_DIR}" --capture --output-file coverage_ctest.info
+      # Combine base and ctest results
+      COMMAND ${LCOV} --gcov "${GCOV_BIN}" -q --add-tracefile coverage_base.info --add-tracefile coverage_ctest.info --output-file coverage_full.info
+      # Extract only project data (--no-capture or --remove options may be used to select collected data)
+      COMMAND ${LCOV} --gcov "${GCOV_BIN}" -q --extract coverage_full.info "'${PUGS_SOURCE_DIR}/src/*'" --output-file coverage_extract.info
+
+      # Remove unwanted stuff
+      COMMAND ${LCOV} --gcov "${GCOV_BIN}" --remove coverage_extract.info  --output-file coverage.info
+      '${PUGS_SOURCE_DIR}/src/main.cpp'
+      '${PUGS_SOURCE_DIR}/src/utils/BacktraceManager.*'
+
+      COMMAND ${LCOV} --gcov "${GCOV_BIN}" --list coverage.info
+
+      DEPENDS unit_tests mpi_unit_tests
+      COMMENT "Running test coverage."
+      WORKING_DIRECTORY "${PUGS_BINARY_DIR}"
+      )
+  endif()
+
 
   find_program(GENHTML genhtml)
   if(NOT GENHTML)