diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6fade4d59f21e68559cc68a92fdaaea908f8996d..45b7e87b407306acecb1209736852bf0c4369079 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -271,7 +271,16 @@ if (PUGS_ENABLE_HDF5 MATCHES "^(AUTO|ON)$")
       set(HIGHFIVE_UNIT_TESTS OFF)   # no unit tests
       set(HIGHFIVE_EXAMPLES OFF)     # no examples
       add_subdirectory(${PUGS_SOURCE_DIR}/packages/HighFive/)
-      set(HIGHFIVE_TARGET HighFive)
+      set(HIGHFIVE_TARGET HighFive::HighFive)
+
+      add_library(PkgConfig::HDF5 STATIC IMPORTED)
+      set_property(TARGET PkgConfig::HDF5 PROPERTY
+	IMPORTED_LOCATION "${HDF5_LIBRARIES}")
+
+      set_property(TARGET PkgConfig::HDF5 PROPERTY
+	INTERFACE_INCLUDE_DIRECTORIES "${HDF5_INCLUDE_DIRS}")
+
+      set(HDF5_TARGET PkgConfig::HDF5)
     endif()
   else()
     message(STATUS "HDF5 support is deactivated since pugs will not be build with MPI support")
@@ -280,6 +289,7 @@ if (PUGS_ENABLE_HDF5 MATCHES "^(AUTO|ON)$")
   set(PUGS_HAS_HDF5 ${HDF5_FOUND})
 else()
   unset(HIGHFIVE_TARGET)
+  unset(HDF5_TARGET PkgConfig::HDF5)
   unset(PUGS_HAS_HDF5)
 endif()
 
@@ -410,6 +420,10 @@ endif()
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PUGS_CXX_FLAGS}")
 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${PUGS_CXX_FLAGS}")
 
+
+message(STATUS "CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}")
+
+
 # Add debug mode for Standard C++ library (not for AppleClang since it is broken)
 if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG -D_LIBCPP_DEBUG=1")
@@ -682,6 +696,7 @@ target_link_libraries(
 )
 
 target_include_directories(pugs PUBLIC ${PETSC_INCLUDE_DIRS})
+target_include_directories(pugs PUBLIC ${HDF5_INCLUDE_DIRS})
 
 # Checkpoint management tool
 add_executable(
@@ -899,3 +914,14 @@ endif()
 
 message("================================")
 message("")
+
+configure_file(
+  ${PUGS_SOURCE_DIR}/cmake/PugsCompileFlags.cmake.in
+  ${PUGS_BINARY_DIR}/cmake/PugsCompileFlags.cmake
+  @ONLY
+)
+
+install(
+  FILES ${PUGS_BINARY_DIR}/cmake/PugsCompileFlags.cmake
+  DESTINATION lib/cmake/pugs
+)
diff --git a/cmake/PugsCompileFlags.cmake.in b/cmake/PugsCompileFlags.cmake.in
new file mode 100644
index 0000000000000000000000000000000000000000..83ecd3e6036a82c3e8696d2b75de2f35d724051c
--- /dev/null
+++ b/cmake/PugsCompileFlags.cmake.in
@@ -0,0 +1,10 @@
+@PACKAGE_INIT@
+
+set(PUGS_CMAKE_CXX_FLAGS "@CMAKE_CXX_FLAGS@")
+set(PUGS_CMAKE_CXX_STANDARD "@CMAKE_CXX_STANDARD@")
+
+set(PUGS_CMAKE_BUILD_TYPE "@CMAKE_BUILD_TYPE@")
+set(PUGS_CMAKE_CXX_COMPILER "@CMAKE_CXX_COMPILER@")
+set(PUGS_CMAKE_C_COMPILER "@CMAKE_C_COMPILER@")
+
+set(PUGS_HAS_MPI "@PUGS_HAS_MPI@")
diff --git a/src/utils/checkpointing/CMakeLists.txt b/src/utils/checkpointing/CMakeLists.txt
index b051975e8538df40a2b9b8a8d7f0486874cda938..06d34a349ab63a6e0de206908e50a82d418a857a 100644
--- a/src/utils/checkpointing/CMakeLists.txt
+++ b/src/utils/checkpointing/CMakeLists.txt
@@ -66,4 +66,8 @@ add_dependencies(PugsCheckpointing
 target_link_libraries(
   PugsCheckpointing
   ${HIGHFIVE_TARGET}
+#  ${HDF5_TARGET}
 )
+
+#target_include_directories(PugsCheckpointing PUBLIC ${HDF5_INCLUDE_DIRS})
+#target_include_directories(PugsAlgebra PUBLIC ${SLEPC_INCLUDE_DIRS})
diff --git a/tools/generate-plugin.sh b/tools/generate-plugin.sh
index a99f6976013582125f678a705a7a337dc5c3ac2d..275d1795f79753fbd259a2079119d977c89b7d82 100755
--- a/tools/generate-plugin.sh
+++ b/tools/generate-plugin.sh
@@ -61,18 +61,32 @@ then
     exit 1
 fi
 
+function substitute()
+{
+    sed s/_PLUGIN_NAME_/${PLUGIN_NAME}/g | sed s/_PLUGIN_LOW_/${PLUGIN_LOW}/g | sed s/_PLUGIN_UP_/${PLUGIN_UP}/g
+}
 
-mkdir "${PLUGIN_LOW}"
-mkdir "${PLUGIN_LOW}/cmake"
+mkdir -p "${PLUGIN_LOW}/cmake"
+mkdir -p "${PLUGIN_LOW}/tests"
+
+cp "${PUGS_DIR}"/tests/MeshDataBaseForTests.hpp "${PLUGIN_LOW}"/tests/
+cp "${PUGS_DIR}"/tests/MeshDataBaseForTests.cpp "${PLUGIN_LOW}"/tests/
+cp "${PUGS_DIR}"/tests/ParallelCheckerTester.hpp "${PLUGIN_LOW}"/tests/
+cp "${PUGS_DIR}"/tests/ParallelCheckerTester.cpp "${PLUGIN_LOW}"/tests/
+cp "${PUGS_DIR}"/tests/test_main.cpp "${PLUGIN_LOW}"/tests/
+cp "${PUGS_DIR}"/tests/mpi_test_main.cpp "${PLUGIN_LOW}"/tests/
 
 cp "${PUGS_DIR}"/cmake/CheckNotInSources.cmake "${PLUGIN_LOW}"/cmake/
 cp "${PUGS_DIR}"/tools/plugin-template/FindPugs.cmake "${PLUGIN_LOW}"/cmake/
 cp "${PUGS_DIR}"/.gitignore "${PLUGIN_LOW}"
 cp "${PUGS_DIR}"/.clang-format "${PLUGIN_LOW}"
-cat "${PUGS_DIR}"/tools/plugin-template/CMakeLists.txt-template | sed s/_PLUGIN_NAME_/${PLUGIN_NAME}/g | sed s/_PLUGIN_LOW_/${PLUGIN_LOW}/g | sed s/_PLUGIN_UP_/${PLUGIN_UP}/g > "${PLUGIN_LOW}"/CMakeLists.txt
-cat "${PUGS_DIR}"/tools/plugin-template/Module.hpp-template | sed s/_PLUGIN_NAME_/${PLUGIN_NAME}/g | sed s/_PLUGIN_LOW_/${PLUGIN_LOW}/g | sed s/_PLUGIN_UP_/${PLUGIN_UP}/g > "${PLUGIN_LOW}"/${PLUGIN_NAME}Module.hpp
-cat "${PUGS_DIR}"/tools/plugin-template/Module.cpp-template | sed s/_PLUGIN_NAME_/${PLUGIN_NAME}/g | sed s/_PLUGIN_LOW_/${PLUGIN_LOW}/g | sed s/_PLUGIN_UP_/${PLUGIN_UP}/g > "${PLUGIN_LOW}"/${PLUGIN_NAME}Module.cpp
-cat "${PUGS_DIR}"/tools/plugin-template/README.md-template | sed s/_PLUGIN_NAME_/${PLUGIN_NAME}/g | sed s/_PLUGIN_LOW_/${PLUGIN_LOW}/g | sed s/_PLUGIN_UP_/${PLUGIN_UP}/g > "${PLUGIN_LOW}"/README.md
+
+cat "${PUGS_DIR}"/tools/plugin-template/CMakeLists.txt-template | substitute > "${PLUGIN_LOW}"/CMakeLists.txt
+cat "${PUGS_DIR}"/tools/plugin-template/Module.hpp-template | substitute > "${PLUGIN_LOW}"/${PLUGIN_NAME}Module.hpp
+cat "${PUGS_DIR}"/tools/plugin-template/Module.cpp-template | substitute > "${PLUGIN_LOW}"/${PLUGIN_NAME}Module.cpp
+cat "${PUGS_DIR}"/tools/plugin-template/README.md-template | substitute > "${PLUGIN_LOW}"/README.md
+
+cat "${PUGS_DIR}"/tools/plugin-template/tests-CMakeLists.txt-template | substitute > "${PLUGIN_LOW}"/tests/CMakeLists.txt
 
 (cd "${PLUGIN_LOW}"; git init -q)
 (cd "${PLUGIN_LOW}"; git add .)
diff --git a/tools/plugin-template/CMakeLists.txt-template b/tools/plugin-template/CMakeLists.txt-template
index ae56000c37ed40cf18def1262e67554e0f5ee302..0cafe6d469c220d8dd091c9bdaf03ed4580378f5 100644
--- a/tools/plugin-template/CMakeLists.txt-template
+++ b/tools/plugin-template/CMakeLists.txt-template
@@ -2,6 +2,14 @@ cmake_minimum_required (VERSION 3.19)
 
 project("_PLUGIN_LOW_")
 
+if (NOT PUGS_PREFIX_PATH)
+  if (DEFINED ENV{PUGS_INSTALL_DIR})
+    message(STATUS "Looking for pugs in ${PUGS_INSTALL_DIR}")
+  else()
+    message(FATAL_ERROR "you must set PUGS_INSTALL_DIR environment variable")
+  endif()
+endif()
+
 # CMake utils
 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
 
@@ -12,6 +20,21 @@ include(CheckNotInSources)
 find_package(PkgConfig REQUIRED)
 find_package(Pugs REQUIRED)
 
+list(APPEND CMAKE_MODULE_PATH "${PUGS_PREFIX_PATH}/lib/cmake/Kokkos")
+include(KokkosConfig)
+
+list(APPEND CMAKE_MODULE_PATH "${PUGS_PREFIX_PATH}/lib/cmake/HighFive")
+include(HighFiveConfig)
+
+list(APPEND CMAKE_MODULE_PATH "${PUGS_PREFIX_PATH}/lib/cmake/pugs")
+include(PugsTargets)
+include(PugsCompileFlags)
+
+#------------------------------------------------------
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PUGS_CMAKE_CXX_FLAGS}")
+set(CMAKE_CXX_STANDARD "${PUGS_CMAKE_CXX_STANDARD}")
+
 # -----------------------------------------------------
 # dynamic libraries
 
@@ -21,59 +44,25 @@ set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
 
 #------------------------------------------------------
 
-set(CMAKE_CONFIGURATION_TYPES "Release;Debug;Coverage" CACHE STRING INTERNAL FORCE )
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
 
 #------------------------------------------------------
 
-set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+set(_PLUGIN_UP__SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+set(_PLUGIN_UP__BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
 
 #------------------------------------------------------
+# use pugs compilation settings
 
-set(PUGS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
-set(PUGS_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
-
-# Add new build types
-set(CMAKE_CXX_FLAGS_COVERAGE
-  "-g -O0 --coverage"
-  CACHE STRING "Flags used by the C++ compiler during coverage builds."
-  FORCE )
-set(CMAKE_C_FLAGS_COVERAGE
-  "-g -O0 --coverage"
-  CACHE STRING "Flags used by the C compiler during coverage builds."
-  FORCE )
-set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
-  "--coverage"
-  CACHE STRING "Flags used for linking binaries during coverage builds."
-  FORCE )
-set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
-  "--coverage"
-  CACHE STRING "Flags used by the shared libraries linker during coverage builds."
-  FORCE )
-mark_as_advanced(
-  CMAKE_CXX_FLAGS_COVERAGE
-  CMAKE_C_FLAGS_COVERAGE
-  CMAKE_EXE_LINKER_FLAGS_COVERAGE
-  CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
-
-if(CMAKE_BUILD_TYPE)
-  string(REGEX MATCH "^(Release|Debug|Coverage)$" VALID_BUILD_TYPE "${CMAKE_BUILD_TYPE}")
-  if(NOT VALID_BUILD_TYPE)
-    message(FATAL_ERROR "Invalid CMAKE_BUILD_TYPE: '${CMAKE_BUILD_TYPE}'")
-  endif()
-endif()
+set(CMAKE_BUILD_TYPE "${PUGS_CMAKE_BUILD_TYPE}" CACHE STRING "" FORCE)
+set(CMAKE_CXX_COMPILER "${PUGS_CMAKE_CXX_COMPILER}" CACHE STRING "" FORCE)
+set(CMAKE_C_COMPILER "${PUGS_CMAKE_C_COMPILER}" CACHE STRING "" FORCE)
 
-# Default build type is Release
-if(NOT CMAKE_BUILD_TYPE)
-  set(CMAKE_BUILD_TYPE "Release" CACHE STRING
-      "Choose the type of build: Release Debug Coverage."
-      FORCE)
-endif()
+mark_as_advanced(CMAKE_BUILD_TYPE CMAKE_CXX_COMPILER CMAKE_C_COMPILER)
 
 #------------------------------------------------------
 # default build shared libraries
-if (NOT BUILD_SHARED_LIBS)
-  set(BUILD_SHARED_LIBS ON CACHE STRING "" FORCE)
-endif()
+set(BUILD_SHARED_LIBS ON CACHE STRING "" FORCE)
 
 #------------------------------------------------------
 
@@ -82,14 +71,81 @@ set(GNU_CXX_MIN_VERSION "10.0.0")
 set(CLANG_CXX_MIN_VERSION "11.0.0")
 
 #------------------------------------------------------
-# Change Kokkos namespace to avoid conflicts
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DKokkos=InlineKokkos")
 
 include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
 include_directories(SYSTEM "${PUGS_PREFIX_PATH}/include")
 include_directories(SYSTEM "${PUGS_PREFIX_PATH}/include/kokkos")
 include_directories(SYSTEM "${PUGS_PREFIX_PATH}/include/tao/")
+include_directories(SYSTEM "${MPI_CXX_INCLUDE_DIRS}")
+
+get_target_property(_prop Pugs::PugsAlgebra INTERFACE_INCLUDE_DIRECTORIES)
+set(PUGS_INC_DIR "${PUGS_INC_DIR};${_prop}")
+get_target_property(_prop Pugs::PugsUtils INTERFACE_INCLUDE_DIRECTORIES)
+set(PUGS_INC_DIR "${PUGS_INC_DIR};${_prop}")
+get_target_property(_prop Pugs::pugs INTERFACE_INCLUDE_DIRECTORIES)
+set(PUGS_INC_DIR "${PUGS_INC_DIR};${_prop}")
+
+include_directories(SYSTEM ${PUGS_INC_DIR})
+link_directories(${PUGS_PREFIX_PATH}/lib)
+
+#------------------------------------------------------
+
+if(${PUGS_HAS_MPI})
+  set(MPIEXEC_OPTION_FLAGS --oversubscribe)
+  if (NOT "$ENV{GITLAB_CI}" STREQUAL "")
+    set(MPIEXEC_OPTION_FLAGS ${MPIEXEC_OPTION_FLAGS} --allow-run-as-root)
+  endif()
+  set(MPIEXEC_NUMPROC 3)
+  set(MPIEXEC_PATH_FLAG --path)
+  set(MPI_LAUNCHER ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_NUMPROC} ${MPIEXEC_OPTION_FLAGS})
+endif()
+
+add_custom_target(all_unit_tests
+  DEPENDS unit_tests mpi_unit_tests
+)
+
+add_custom_target(check
+  DEPENDS test
+  )
+
+add_custom_target(test
+  DEPENDS run_all_unit_tests
+  )
+
+add_custom_target(run_all_unit_tests
+  DEPENDS run_mpi_unit_tests
+  )
+
+if(PUGS_HAS_MPI)
+  set(RUN_MPI_UNIT_TESTS_COMMENT "Running mpi_unit_tests [using ${MPIEXEC_NUMPROC} procs]")
+else()
+  set(RUN_MPI_UNIT_TESTS_COMMENT "Running mpi_unit_tests [sequentially]")
+endif()
+
+add_custom_target(run_mpi_unit_tests
+  COMMAND ${MPI_LAUNCHER} "${_PLUGIN_UP__BINARY_DIR}/mpi_unit_tests" --allow-running-no-tests
+  WORKING_DIRECTORY ${_PLUGIN_UP__BINARY_DIR}
+  DEPENDS run_unit_tests
+  COMMENT ${RUN_MPI_UNIT_TESTS_COMMENT}
+  )
+
+add_custom_target(run_unit_tests
+  COMMAND "${_PLUGIN_UP__BINARY_DIR}/unit_tests" --allow-running-no-tests
+  DEPENDS all_unit_tests
+  COMMENT "Running unit_tests"
+  )
+
+#------------------------------------------------------
 
 add_library(_PLUGIN_NAME_
   _PLUGIN_NAME_Module.cpp
+  # add cpp sources files here
 )
+
+#------------------------------------------------------
+
+add_subdirectory(tests)
+
+#------------------------------------------------------
+
+install(TARGETS _PLUGIN_NAME_)
diff --git a/tools/plugin-template/tests-CMakeLists.txt-template b/tools/plugin-template/tests-CMakeLists.txt-template
new file mode 100644
index 0000000000000000000000000000000000000000..026ff2c2962ed988d35e2680b8b97919801c7a4b
--- /dev/null
+++ b/tools/plugin-template/tests-CMakeLists.txt-template
@@ -0,0 +1,95 @@
+set(EXECUTABLE_OUTPUT_PATH ${_PLUGIN_UP__BINARY_DIR})
+
+include_directories(${_PLUGIN_UP__SOURCE_DIR}/tests)
+
+add_executable (unit_tests
+  test_main.cpp
+
+  # add unit tests here
+  )
+
+  set(_PLUGIN_UP__checkpointing_TESTS
+  )
+
+if(PUGS_HAS_HDF5)
+  list(APPEND _PLUGIN_UP__checkpointing_TESTS
+  )
+endif(PUGS_HAS_HDF5)
+
+add_executable (mpi_unit_tests
+  mpi_test_main.cpp
+  ${_PLUGIN_UP__checkpointing_TESTS}
+
+  # add mpi unit tests here
+)
+
+add_library(test_MeshDataBase
+  MeshDataBaseForTests.cpp)
+
+add_library(test_ParallelCheckerTester
+  ParallelCheckerTester.cpp)
+
+target_link_libraries (test_ParallelCheckerTester
+  ${HIGHFIVE_TARGET})
+
+target_link_libraries (unit_tests
+  test_MeshDataBase
+  test_ParallelCheckerTester
+  PugsAlgebra
+  PugsAnalysis
+  PugsUtils
+  PugsLanguage
+  PugsLanguageAST
+  PugsLanguageModules
+  PugsMesh
+  PugsAlgebra
+  PugsUtils
+  PugsLanguageUtils
+  PugsScheme
+  PugsOutput
+  PugsUtils
+  PugsCheckpointing
+  PugsDev
+  PugsAlgebra
+  PugsMesh
+  Kokkos::kokkos
+  ${PARMETIS_LIBRARIES}
+  ${MPI_CXX_LINK_FLAGS} ${MPI_CXX_LIBRARIES}
+  ${PETSC_LIBRARIES}
+  Catch2
+  ${PUGS_STD_LINK_FLAGS}
+  ${HIGHFIVE_TARGET}
+  ${SLURM_LIBRARY}
+  stdc++fs
+  )
+
+target_link_libraries (mpi_unit_tests
+  test_MeshDataBase
+  test_ParallelCheckerTester
+  PugsAlgebra
+  PugsAnalysis
+  PugsUtils
+  PugsLanguage
+  PugsLanguageAST
+  PugsLanguageModules
+  PugsMesh
+  PugsAlgebra
+  PugsUtils
+  PugsLanguageUtils
+  PugsScheme
+  PugsOutput
+  PugsUtils
+  PugsCheckpointing
+  PugsDev
+  PugsAlgebra
+  PugsMesh
+  Kokkos::kokkos
+  ${PARMETIS_LIBRARIES}
+  ${MPI_CXX_LINK_FLAGS} ${MPI_CXX_LIBRARIES}
+  ${PETSC_LIBRARIES}
+  Catch2
+  ${PUGS_STD_LINK_FLAGS}
+  ${HIGHFIVE_TARGET}
+  ${SLURM_LIBRARY}
+  stdc++fs
+  )