diff --git a/CMakeLists.txt b/CMakeLists.txt
index 08782444aaad92cb5142f5940b19272dfea18249..6fade4d59f21e68559cc68a92fdaaea908f8996d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -141,8 +141,16 @@ endif()
 #------------------------------------------------------
 # Search for ParMETIS
 
+find_package(ParMETIS)
+if(PARMETIS_LIBRARIES)
+  add_library(PkgConfig::ParMETIS STATIC IMPORTED)
+  set_property(TARGET PkgConfig::ParMETIS PROPERTY
+    IMPORTED_LOCATION "${PARMETIS_LIBRARIES}")
+
+  set(PARMETIS_TARGET PkgConfig::ParMETIS)
+endif()
+
 if(${MPI_FOUND})
-  find_package(ParMETIS)
   if (NOT PARMETIS_LIBRARIES)
     if(PUGS_ENABLE_MPI MATCHES "^AUTO$")
       message(STATUS "MPI support deactivated: ParMETIS cannot be found!")
@@ -168,7 +176,16 @@ set(PUGS_ENABLE_PETSC AUTO CACHE STRING
 if (PUGS_ENABLE_PETSC MATCHES "^(AUTO|ON)$")
   if (MPI_FOUND)
     # PETSc support is deactivated if MPI is not found
-    pkg_check_modules(PETSC PETSc)
+    pkg_check_modules(PETSC IMPORTED_TARGET GLOBAL PETSc)
+
+    set_property(TARGET PkgConfig::PETSC PROPERTY
+      IMPORTED_LOCATION "${PETSC_LIBRARIES}"
+    )
+    set_property(TARGET PkgConfig::PETSC PROPERTY
+      INTERFACE_INCLUDE_DIRECTORIES "${PETSC_INCLUDE_DIRS}"
+    )
+
+    set(PETSC_TARGET PkgConfig::PETSC)
   else()
     message(STATUS "PETSc support is deactivated since pugs will not be build with MPI support")
     set(PETSC_FOUND FALSE)
@@ -196,7 +213,16 @@ set(PUGS_ENABLE_SLEPC AUTO CACHE STRING
 if (PUGS_ENABLE_SLEPC MATCHES "^(AUTO|ON)$")
   if (PETSC_FOUND)
     # SLEPc support is deactivated if PETSc is not found
-    pkg_check_modules(SLEPC SLEPc)
+    pkg_check_modules(SLEPC IMPORTED_TARGET GLOBAL SLEPc)
+
+    set_property(TARGET PkgConfig::SLEPC PROPERTY
+      IMPORTED_LOCATION "${SLEPC_LIBRARIES}"
+    )
+    set_property(TARGET PkgConfig::SLEPC PROPERTY
+      INTERFACE_INCLUDE_DIRECTORIES "${SLEPC_INCLUDE_DIRS}"
+    )
+
+    set(SLEPC_TARGET PkgConfig::SLEPC)
   else()
     message(STATUS "SLEPc support is deactivated since pugs will not be build with PETSc support")
     set(SLEPC_FOUND FALSE)
@@ -233,18 +259,23 @@ set(PUGS_ENABLE_HDF5 AUTO CACHE STRING
   "Choose one of: AUTO ON OFF")
 
 if (PUGS_ENABLE_HDF5 MATCHES "^(AUTO|ON)$")
-  # May be risky. (make to show pugs build options)
-  set(HDF5_PREFER_PARALLEL TRUE)
-  find_package(HDF5)
-  if (HDF5_FOUND)
-    # HighFive
-    set(HIGHFIVE_USE_BOOST  OFF)   # no Boost
-    set(HIGHFIVE_BUILD_DOCS OFF)   # no doc
-    set(HIGHFIVE_UNIT_TESTS OFF)   # no unit tests
-    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)
+  if (MPI_FOUND)
+    # May be risky. (make to show pugs build options)
+    set(HDF5_PREFER_PARALLEL TRUE)
+    find_package(HDF5)
+    if (HDF5_FOUND)
+      # HighFive
+      set(HIGHFIVE_USE_BOOST  OFF)   # no Boost
+      set(HIGHFIVE_BUILD_DOCS OFF)   # no doc
+      set(HIGHFIVE_UNIT_TESTS OFF)   # no unit tests
+      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)
+    endif()
+  else()
+    message(STATUS "HDF5 support is deactivated since pugs will not be build with MPI support")
+    set(HDF5_FOUND FALSE)
   endif()
   set(PUGS_HAS_HDF5 ${HDF5_FOUND})
 else()
@@ -259,7 +290,14 @@ find_package(Slurm)
 
 set(PUGS_HAS_SLURM ${SLURM_FOUND})
 
-if (${SLURM_FOUND})
+if (SLURM_FOUND)
+  add_library(PkgConfig::Slurm STATIC IMPORTED)
+  set_property(TARGET PkgConfig::Slurm PROPERTY
+    IMPORTED_LOCATION "${SLURM_LIBRARY}")
+  set_property(TARGET PkgConfig::Slurm PROPERTY
+    INTERFACE_INCLUDE_DIRECTORIES "${SLURM_INCLUDE_DIR}")
+
+  set(SLURM_TARGET PkgConfig::Slurm)
   include_directories(SYSTEM "${SLURM_INCLUDE_DIR}")
 else()
   set(SLURM_LIBRARY "")
@@ -442,7 +480,6 @@ add_custom_target(run_mpi_unit_tests
   COMMENT ${RUN_MPI_UNIT_TESTS_COMMENT}
   )
 
-
 add_custom_target(run_unit_tests
   COMMAND "${PUGS_BINARY_DIR}/unit_tests"
   DEPENDS all_unit_tests
@@ -632,17 +669,19 @@ target_link_libraries(
   PugsLanguageUtils
   PugsCheckpointing
   Kokkos::kokkos
-  ${PETSC_LIBRARIES}
-  ${SLEPC_LIBRARIES}
-  ${PARMETIS_LIBRARIES}
+  ${PETSC_TARGET}
+  ${SLEPC_TARGET}
+  ${PARMETIS_TARGET}
   ${MPI_CXX_LINK_FLAGS} ${MPI_CXX_LIBRARIES}
   ${KOKKOS_CXX_FLAGS}
   ${OPENMP_LINK_FLAGS}
   ${PUGS_STD_LINK_FLAGS}
   ${HIGHFIVE_TARGET}
-  ${SLURM_LIBRARY}
+  ${SLURM_TARGET}
   stdc++fs
-  )
+)
+
+target_include_directories(pugs PUBLIC ${PETSC_INCLUDE_DIRS})
 
 # Checkpoint management tool
 add_executable(
@@ -667,19 +706,18 @@ target_link_libraries(
   PugsMesh
   PugsOutput
   Kokkos::kokkos
-  ${PETSC_LIBRARIES}
-  ${SLEPC_LIBRARIES}
-  ${PARMETIS_LIBRARIES}
+  ${PETSC_TARGET}
+  ${SLEPC_TARGET}
+  ${PARMETIS_TARGET}
   ${MPI_CXX_LINK_FLAGS} ${MPI_CXX_LIBRARIES}
   ${KOKKOS_CXX_FLAGS}
   ${OPENMP_LINK_FLAGS}
   ${PUGS_STD_LINK_FLAGS}
   ${HIGHFIVE_TARGET}
-  ${SLURM_LIBRARY}
+  ${SLURM_TARGET}
   stdc++fs
   )
 
-
 # -------------------- Documentation --------------------
 
 include(PugsDoc)
@@ -692,7 +730,6 @@ include(PugsDoxygen)
 install(TARGETS
   pugs
   pugs_checkpoint
-  PugsMesh
   PugsAlgebra
   PugsAnalysis
   PugsCheckpointing
@@ -701,18 +738,33 @@ install(TARGETS
   PugsLanguage
   PugsLanguageAST
   PugsLanguageModules
-  PugsLanguageAlgorithms
+  PugsLanguageUtils
   PugsMesh
-  PugsAlgebra
-  PugsScheme
-  PugsUtils
   PugsOutput
-  PugsLanguageUtils
+  PugsScheme
   kokkos
+  Catch2
+
+  EXPORT "${PROJECT_NAME}Targets"
 
   RUNTIME DESTINATION bin
   LIBRARY DESTINATION lib
-  ARCHIVE DESTINATION lib)
+  ARCHIVE DESTINATION lib
+)
+
+include(CMakePackageConfigHelpers)
+
+write_basic_package_version_file(
+  PugsConfigVersion.cmake
+  VERSION ${PACKAGE_VERSION}
+  COMPATIBILITY AnyNewerVersion
+)
+
+install(EXPORT PugsTargets
+  FILE PugsTargets.cmake
+  NAMESPACE Pugs::
+  DESTINATION lib/cmake/pugs
+)
 
 # ------------------- Build options -------------------
 message("")
diff --git a/cmake/FindParMETIS.cmake b/cmake/FindParMETIS.cmake
index d9b91d33d92617f3282d4eac2184549b62f62418..5fb1bb961c53897ab8f9cd33a2bf6bedfa41a783 100644
--- a/cmake/FindParMETIS.cmake
+++ b/cmake/FindParMETIS.cmake
@@ -1,6 +1,5 @@
 # Looking for ParMETIS
 
-
 find_path(PARMETIS_INCLUDE_DIR parmetis.h
   PATH_SUFFIX include parmetis $ENV{PARMETIS_INCDIR})
 
@@ -17,7 +16,8 @@ if(EXISTS "${PARMETIS_INCLUDE_DIR}/parmetis.h")
   find_path(METIS_INCLUDE_DIR metis.h $ENV{METIS_INCDIR})
   if(EXISTS "${METIS_INCLUDE_DIR}/metis.h")
     message(STATUS "Found metis.h in ${METIS_INCLUDE_DIR}")
-    set(PARMETIS_LIBRARIES ${LIB_PARMETIS} ${LIB_METIS})
+    set(PARMETIS_LIBRARIES ${LIB_PARMETIS})
+    set(METIS_LIBRARIES  ${LIB_METIS})
     message(STATUS "Found parmetis/metis libraries ${PARMETIS_LIBRARIES}")
     else()
       message(WARNING "** Could not find metis.h.\n** Is METIS_INCDIR correctly set (Actual: \"$ENV{METIS_INCDIR}\")?")
@@ -27,3 +27,4 @@ else()
 endif()
 
 mark_as_advanced(PARMETIS_INCLUDE_DIR PARMETIS_LIBRARIES)
+mark_as_advanced(METIS_INCLUDE_DIR METIS_LIBRARIES)
diff --git a/src/algebra/CMakeLists.txt b/src/algebra/CMakeLists.txt
index 74f40290a2f9250cc2296ec62358b44c366ffc85..d215b09b50d9933f84aab02855388bb4bd25dced 100644
--- a/src/algebra/CMakeLists.txt
+++ b/src/algebra/CMakeLists.txt
@@ -9,7 +9,10 @@ add_library(
 
 target_link_libraries(
   PugsAlgebra
-  ${PETSC_LIBRARIES}
-  ${SLEPC_LIBRARIES}
+  ${PETSC_TARGET}
+  ${SLEPC_TARGET}
   ${HIGHFIVE_TARGET}
 )
+
+target_include_directories(PugsAlgebra PUBLIC ${PETSC_INCLUDE_DIRS})
+target_include_directories(PugsAlgebra PUBLIC ${SLEPC_INCLUDE_DIRS})
diff --git a/src/mesh/CMakeLists.txt b/src/mesh/CMakeLists.txt
index 78b72bcafc640ecc888c0997eeb3ff8f3056db58..76f5f96d0b98944d3bcd65e42e36a705541886f9 100644
--- a/src/mesh/CMakeLists.txt
+++ b/src/mesh/CMakeLists.txt
@@ -48,5 +48,6 @@ add_library(
 
 target_link_libraries(
   PugsMesh
+  ${PARMETIS_TARGET}
   ${HIGHFIVE_TARGET}
 )
diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt
index 39e8cb35925fb1417222080e2ac0e060814ad353..4d74c5e195fe0361819315cd3732661ba7589e56 100644
--- a/src/utils/CMakeLists.txt
+++ b/src/utils/CMakeLists.txt
@@ -33,11 +33,15 @@ endif()
 
 target_link_libraries(
   PugsUtils
-  ${PETSC_LIBRARIES}
-  ${SLEPC_LIBRARIES}
+  ${PETSC_TARGET}
+  ${SLEPC_TARGET}
+  ${SLURM_TARGET}
   ${HIGHFIVE_TARGET}
 )
 
+target_include_directories(PugsUtils PUBLIC ${PETSC_INCLUDE_DIRS})
+target_include_directories(PugsUtils PUBLIC ${SLURM_INCLUDE_DIRS})
+
 # --------------- get git revision info ---------------
 
 # Generates revision header file
@@ -59,12 +63,11 @@ set_source_files_properties(
 add_custom_command(TARGET PugsGitRevison
   COMMAND ${CMAKE_COMMAND} -E remove -f
   ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision
-  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision.hpp
+  POST_BUILD
   COMMENT ""
   )
 
 add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision.hpp
-  PRE_BUILD
   COMMAND ${CMAKE_COMMAND} -E copy_if_different
   ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision
   ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision.hpp
@@ -74,7 +77,6 @@ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision.hpp
   )
 
 add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision
-  PRE_BUILD
   COMMAND ${CMAKE_COMMAND} -DPUGS_VERSION=${PUGS_VERSION} -DPUGS_SOURCE_DIR=${PUGS_SOURCE_DIR} -P ${PUGS_SOURCE_DIR}/cmake/GetPugsGitRevision.cmake
   COMMENT "Check pugs git status"
   VERBATIM
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 871bfbe45bded361f68b64b0a315f7daa9e508a7..23a4ac3094424515b6d488a577781cfe6bbcce5e 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -4,6 +4,20 @@ include_directories(${PUGS_SOURCE_DIR}/src)
 include_directories(${PUGS_BINARY_DIR}/src)
 include_directories(${PUGS_SOURCE_DIR}/tests)
 
+install(
+  DIRECTORY "${PUGS_SOURCE_DIR}/packages/Catch2/src/catch2"
+  DESTINATION "include"
+  FILES_MATCHING
+  PATTERN "*.hpp"
+)
+
+install(
+  DIRECTORY "${PUGS_BINARY_DIR}/generated-includes/catch2"
+  DESTINATION "include"
+  FILES_MATCHING
+  PATTERN "*.hpp"
+)
+
 set(checkpointing_sequential_TESTS
   # this one should enventually integrate parallel tests
   test_checkpointing_Checkpoint_sequential.cpp