diff --git a/debian/psrdadacpp-dev.install b/debian/psrdadacpp-dev.install
index d5d3da340d851c9c90e8b3bd2222cff004e56658..3055b2a883ace743badf3ae4fe70613d9047727a 100644
--- a/debian/psrdadacpp-dev.install
+++ b/debian/psrdadacpp-dev.install
@@ -1,6 +1,6 @@
 usr/include
 usr/lib/*.a
-usr/lib/cmake/psrdada_cpp/psrdada_cppTargets-none.cmake
+usr/lib/cmake/psrdada_cpp/psrdada_cppTargets-release.cmake
 usr/lib/cmake/psrdada_cpp/psrdada_cppTargets.cmake
 usr/lib/cmake/psrdada_cpp/psrdada_cppConfig.cmake
 usr/lib/cmake/psrdada_cpp/psrdada_cppConfigVersion.cmake
diff --git a/psrdada_cpp/CMakeLists.txt b/psrdada_cpp/CMakeLists.txt
index a2aa701b057cf86198661f38e4e45de7c04f8080..03bf5ed7ee3c23ab184048bc2467f8d61a29f8fa 100644
--- a/psrdada_cpp/CMakeLists.txt
+++ b/psrdada_cpp/CMakeLists.txt
@@ -3,15 +3,9 @@ include_directories(${CMAKE_SOURCE_DIR})
 # Collect all include and source files from th current directory
 file(GLOB PSRDADA_CPP_INC "${CMAKE_CURRENT_SOURCE_DIR}/*.cuh" "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp")
 file(GLOB PSRDADA_CPP_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cu")
-add_library(${CMAKE_PROJECT_NAME}_core ${PSRDADA_CPP_SRC})
-target_link_libraries(${CMAKE_PROJECT_NAME}_core PUBLIC ${DEPENDENCY_LIBRARIES})
-install (TARGETS ${CMAKE_PROJECT_NAME}_core
-    EXPORT ${CMAKE_PROJECT_NAME}Targets
-    RUNTIME DESTINATION bin
-    LIBRARY DESTINATION lib
-    ARCHIVE DESTINATION lib)
-
-set(PSRDADA_CPP_LIBRARIES ${CMAKE_PROJECT_NAME}_core ${DEPENDENCY_LIBRARIES})
+add_library(${CMAKE_PROJECT_NAME} ${PSRDADA_CPP_SRC})
+target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC ${DEPENDENCY_LIBRARIES})
+set(PSRDADA_CPP_LIBRARIES ${CMAKE_PROJECT_NAME} ${DEPENDENCY_LIBRARIES})
 
 # ----------------------------- #
 # -- Build DADA tools / apps -- #
@@ -68,6 +62,9 @@ if (BUILD_DADAFLOW)
   add_subdirectory(dadaflow)
 endif()
 
+# --------------------------------- #
+# -- Build and install benchmark -- #
+# --------------------------------- #
 # Add benchmark binaries here to get executed with 'make -C <path-to-build> run_benchmark'
 if(ENABLE_BENCHMARK AND BUILD_SUBMODULES)
     add_custom_target(run_benchmark
@@ -79,21 +76,6 @@ endif()
 # --------------------------------------------------------------------- #
 # Install targets: lib, bin and include - Also export the cmake project #
 # --------------------------------------------------------------------- #
-add_library(${CMAKE_PROJECT_NAME} 
-    ${PSRDADA_CPP_SRC} 
-    ${PSRDADA_CPP_COMMON_SRC} 
-    ${PSRDADA_CPP_DADAFLOW_SRC})
-target_link_libraries (${CMAKE_PROJECT_NAME} PUBLIC 
-    ${CMAKE_PROJECT_NAME}_core 
-    ${CMAKE_PROJECT_NAME}_dadaflow 
-    ${CMAKE_PROJECT_NAME}_common)
-
-target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC
-    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
-    $<INSTALL_INTERFACE:include/${CMAKE_PROJECT_NAME}>
-)
-
-
 install (TARGETS ${CMAKE_PROJECT_NAME}
     EXPORT ${CMAKE_PROJECT_NAME}Targets
     RUNTIME DESTINATION bin
diff --git a/psrdada_cpp/common/CMakeLists.txt b/psrdada_cpp/common/CMakeLists.txt
index f5ab4b332171e94bee6ee8672894a1f355fdce7e..18c807b938c07c20b779d241012146d24bc1ace5 100644
--- a/psrdada_cpp/common/CMakeLists.txt
+++ b/psrdada_cpp/common/CMakeLists.txt
@@ -1,18 +1,9 @@
 if(ENABLE_CUDA)
     file(GLOB PSRDADA_CPP_COMMON_INC "${CMAKE_CURRENT_SOURCE_DIR}/*.cuh" "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp")
     file(GLOB PSRDADA_CPP_COMMON_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cu")
-    add_library(${CMAKE_PROJECT_NAME}_common ${PSRDADA_CPP_COMMON_SRC})
-    target_link_libraries (${CMAKE_PROJECT_NAME}_common PUBLIC ${PSRDADA_CPP_LIBRARIES})
-
+    target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${PSRDADA_CPP_COMMON_SRC})
     install(FILES ${PSRDADA_CPP_COMMON_INC} DESTINATION include/psrdada_cpp/common)
     install(DIRECTORY src DESTINATION include/psrdada_cpp/common)
-    install (TARGETS ${CMAKE_PROJECT_NAME}_common
-        EXPORT ${CMAKE_PROJECT_NAME}Targets
-        RUNTIME DESTINATION bin
-        LIBRARY DESTINATION lib
-        ARCHIVE DESTINATION lib
-        INCLUDES DESTINATION include/)
-
     if (ENABLE_TESTING)
         add_subdirectory(test)
     endif()
diff --git a/psrdada_cpp/common/test/CMakeLists.txt b/psrdada_cpp/common/test/CMakeLists.txt
index 25e99885235c54dcd96ad75ce58f7550b03122db..9e7cdd2588f250125c00e7628960e8ee0bb4d636 100644
--- a/psrdada_cpp/common/test/CMakeLists.txt
+++ b/psrdada_cpp/common/test/CMakeLists.txt
@@ -9,5 +9,5 @@ set(gtest_common
 )
 
 add_executable(gtest_common ${gtest_common} )
-target_link_libraries(gtest_common ${PSRDADA_CPP_LIBRARIES} ${GTEST_LIBRARIES} ${CMAKE_PROJECT_NAME}_common)
+target_link_libraries(gtest_common ${PSRDADA_CPP_LIBRARIES} ${GTEST_LIBRARIES})
 add_test(gtest_common gtest_common --test_data "${CMAKE_CURRENT_LIST_DIR}/data")
diff --git a/psrdada_cpp/dadaflow/AsyncDadaReadClient.hpp b/psrdada_cpp/dadaflow/AsyncDadaReadClient.hpp
index 00c8a1b5f8333165215eb8a3ba1ea0d0f63fc659..2fa5007de954b278349072b56ddab7cb9d75b7b7 100644
--- a/psrdada_cpp/dadaflow/AsyncDadaReadClient.hpp
+++ b/psrdada_cpp/dadaflow/AsyncDadaReadClient.hpp
@@ -1,5 +1,4 @@
-#ifndef PSRDADA_CPP_DADA_READ_CLIENT_HPP
-#define PSRDADA_CPP_DADA_READ_CLIENT_HPP
+#pragma once
 
 #include "psrdada_cpp/common.hpp"
 #include "psrdada_cpp/dada_client_base.hpp"
@@ -191,4 +190,3 @@ class AsyncDadaReadClient: public DadaClientBase
 
 } // namespace psrdada_cpp
 
-#endif // PSRDADA_CPP_DADA_READ_CLIENT_HPP
\ No newline at end of file
diff --git a/psrdada_cpp/dadaflow/CMakeLists.txt b/psrdada_cpp/dadaflow/CMakeLists.txt
index 0d31d9d05d67ee337cc8313c519d1565404d7012..97f339d6e82b991271719c396c7799d208d72558 100644
--- a/psrdada_cpp/dadaflow/CMakeLists.txt
+++ b/psrdada_cpp/dadaflow/CMakeLists.txt
@@ -1,8 +1,4 @@
 if(ENABLE_CUDA)
-  set(PSRDADA_CPP_DADAFLOW_LIBRARIES
-      ${CMAKE_PROJECT_NAME}_dadaflow
-      ${PSRDADA_CPP_LIBRARIES}
-  )
 
   set(PSRDADA_CPP_DADAFLOW_SRC
       ${CMAKE_CURRENT_SOURCE_DIR}/src/AsyncDadaReadClient.cpp
@@ -12,15 +8,18 @@ if(ENABLE_CUDA)
       ${CMAKE_CURRENT_SOURCE_DIR}/io/sigproc/src/SigprocIO.cpp
   )
 
-  file(GLOB PSRDADA_CPP_DADAFLOW_INC 
-    "${CMAKE_CURRENT_SOURCE_DIR}/*.cuh" 
-    "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp")
-  install(FILES ${PSRDADA_CPP_DADAFLOW_INC} DESTINATION include/psrdada_cpp/dadaflow)
-  install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/detail DESTINATION include/psrdada_cpp/dadaflow/detail)
+  # Install all include files and exclude unnecessary folders
+  install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 
+      DESTINATION include/psrdada_cpp
+      PATTERN "test" EXCLUDE
+      PATTERN "examples" EXCLUDE
+      PATTERN "cli" EXCLUDE
+      PATTERN "doc" EXCLUDE)
+      # PATTERN "src" EXCLUDE)
+
+  # Add the sources to the psrdada_cpp library
+  target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${PSRDADA_CPP_DADAFLOW_SRC})
 
-  add_library(${CMAKE_PROJECT_NAME}_dadaflow ${PSRDADA_CPP_DADAFLOW_SRC})
-  target_link_libraries (${CMAKE_PROJECT_NAME}_dadaflow PUBLIC ${PSRDADA_CPP_LIBRARIES})
-  list(APPEND PSRDADA_CPP_LIBRARIES ${CMAKE_PROJECT_NAME}_dadaflow)
 
   # ----------------------------- #
   # -- Build DADAFLOW examples -- #
@@ -35,30 +34,24 @@ if(ENABLE_CUDA)
       switch_example
       node_selector_example
   )
-  # Install the DADA tools using the DADA_TOOLS_NAMES list
+  # Install the dadaflow examples using the DADAFLOW_EXAMPLE_CLI list
   foreach(EXEC_NAME ${DADAFLOW_EXAMPLE_CLI})
       set(EXEC_SRC "examples/${EXEC_NAME}.cpp")
       add_executable(${EXEC_NAME} ${EXEC_SRC})
-      target_link_libraries(${EXEC_NAME} PUBLIC ${PSRDADA_CPP_DADAFLOW_LIBRARIES})
+      target_link_libraries(${EXEC_NAME} PUBLIC ${PSRDADA_CPP_LIBRARIES})
   endforeach()
 
   # ----------------------------- #
   # --   Build DADAFLOW CLIs   -- #
   # ----------------------------- #
   add_executable(rfsoc2tafp cli/rfsoc2tafp.cpp)
-  target_link_libraries (rfsoc2tafp PUBLIC ${PSRDADA_CPP_DADAFLOW_LIBRARIES})
+  target_link_libraries (rfsoc2tafp PUBLIC ${PSRDADA_CPP_LIBRARIES})
   install (TARGETS rfsoc2tafp DESTINATION bin)
 
+  
   # ----------------------------- #
-  # -- Install DADAFLOW Library-- #
+  # --        Add tests        -- #
   # ----------------------------- #
-  install (TARGETS ${CMAKE_PROJECT_NAME}_dadaflow
-    EXPORT ${CMAKE_PROJECT_NAME}Targets
-    RUNTIME DESTINATION bin
-    LIBRARY DESTINATION lib
-    ARCHIVE DESTINATION lib
-    INCLUDES DESTINATION include/)
-
   if (ENABLE_TESTING)
     add_subdirectory(test)
     add_subdirectory(io/sigproc/test)
diff --git a/psrdada_cpp/dadaflow/MessageQueue.hpp b/psrdada_cpp/dadaflow/MessageQueue.hpp
index 69883efa3be9b7295196bd800e77f1a67824194e..e473ce40261b2694a36354f39fe24d97a8815407 100644
--- a/psrdada_cpp/dadaflow/MessageQueue.hpp
+++ b/psrdada_cpp/dadaflow/MessageQueue.hpp
@@ -1,3 +1,4 @@
+#pragma once
 #include "boost/json.hpp"
 #include "psrdada_cpp/common.hpp"
 #include "psrdada_cpp/dadaflow/utils.hpp"
diff --git a/psrdada_cpp/dadaflow/io/sigproc/test/CMakeLists.txt b/psrdada_cpp/dadaflow/io/sigproc/test/CMakeLists.txt
index 64b0de1c604a3ac757b201b83bf0e050a1c789c6..1dd6dec57cb5691b839d1b031f2790b56cd2d1f9 100644
--- a/psrdada_cpp/dadaflow/io/sigproc/test/CMakeLists.txt
+++ b/psrdada_cpp/dadaflow/io/sigproc/test/CMakeLists.txt
@@ -11,7 +11,7 @@ set(gtest_dadaflow_io_sigproc
 
 add_executable(gtest_dadaflow_io_sigproc ${gtest_dadaflow_io_sigproc} )
 target_link_libraries(gtest_dadaflow_io_sigproc 
-    ${PSRDADA_CPP_DADAFLOW_LIBRARIES} 
+    ${PSRDADA_CPP_LIBRARIES} 
     ${GTEST_LIBRARIES} 
 )
 add_test(gtest_dadaflow_io_sigproc gtest_dadaflow_io_sigproc --test_data "${CMAKE_CURRENT_LIST_DIR}/data")
diff --git a/psrdada_cpp/dadaflow/test/CMakeLists.txt b/psrdada_cpp/dadaflow/test/CMakeLists.txt
index ffa7892021b5e7f4e117a083e21263275fccd6f5..714f826d4a77fc276c0b1dae0cac22bea1fe2712 100644
--- a/psrdada_cpp/dadaflow/test/CMakeLists.txt
+++ b/psrdada_cpp/dadaflow/test/CMakeLists.txt
@@ -1,5 +1,4 @@
 include_directories(${GTEST_INCLUDE_DIR})
-
 link_directories(${GTEST_LIBRARY_DIR})
 
 set(gtest_dadaflow
@@ -19,7 +18,7 @@ set(gtest_dadaflow
 
 add_executable(gtest_dadaflow ${gtest_dadaflow} )
 target_link_libraries(gtest_dadaflow 
-    ${PSRDADA_CPP_DADAFLOW_LIBRARIES} 
+    ${PSRDADA_CPP_LIBRARIES} 
     ${GTEST_LIBRARIES}
 )
 add_test(gtest_dadaflow gtest_dadaflow --test_data "${CMAKE_CURRENT_LIST_DIR}/data")
diff --git a/psrdada_cpp/fft_spectrometer/CMakeLists.txt b/psrdada_cpp/fft_spectrometer/CMakeLists.txt
index 79c14edef42a88cfb40ed84a28541c5f2673d549..b5dc91deeb4aae8001af174aa7e12e2c100e60d3 100644
--- a/psrdada_cpp/fft_spectrometer/CMakeLists.txt
+++ b/psrdada_cpp/fft_spectrometer/CMakeLists.txt
@@ -1,18 +1,10 @@
 if(ENABLE_CUDA)
-
-set(PSRDADA_CPP_FS_LIBRARIES
-    ${PSRDADA_CPP_LIBRARIES}
-    ${CMAKE_PROJECT_NAME}_common
-    CUDA::cufft
-)
-
-add_executable(fft_spectrometer cli/fft_spectrometer_cli.cu)
-target_include_directories(fft_spectrometer PRIVATE "${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/src")
-target_link_libraries(fft_spectrometer ${PSRDADA_CPP_FS_LIBRARIES})
-install(TARGETS fft_spectrometer DESTINATION bin)
-
-# if (ENABLE_TESTING)
-#     add_subdirectory(test)
-# endif()
-
-endif(ENABLE_CUDA)
\ No newline at end of file
+    set(PSRDADA_CPP_FS_LIBRARIES ${PSRDADA_CPP_LIBRARIES} CUDA::cufft)
+    add_executable(fft_spectrometer cli/fft_spectrometer_cli.cu)
+    target_include_directories(fft_spectrometer PRIVATE "${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/src")
+    target_link_libraries(fft_spectrometer ${PSRDADA_CPP_FS_LIBRARIES})
+    install(TARGETS fft_spectrometer DESTINATION bin)
+    # if (ENABLE_TESTING)
+    #     add_subdirectory(test)
+    # endif()
+endif(ENABLE_CUDA)
diff --git a/psrdada_cpp/fft_spectrometer/test/CMakeLists.txt b/psrdada_cpp/fft_spectrometer/test/CMakeLists.txt
index f1571ea8d2b268c41cd8acda6e6321bf7b81ee76..db0205ef8b1113742c5f6e11a0b770570b7c0ba2 100644
--- a/psrdada_cpp/fft_spectrometer/test/CMakeLists.txt
+++ b/psrdada_cpp/fft_spectrometer/test/CMakeLists.txt
@@ -8,5 +8,5 @@ set(gtest_fftspectrometer
 )
 
 add_executable(gtest_fftspectrometer ${gtest_fftspectrometer} )
-target_link_libraries(gtest_fftspectrometer ${PSRDADA_CPP_GS_LIBRARIES} ${PSRDADA_CPP_LIBRARIES} ${GTEST_LIBRARIES})
+target_link_libraries(gtest_fftspectrometer ${PSRDADA_CPP_GS_LIBRARIES} ${GTEST_LIBRARIES})
 add_test(gtest_fftspectrometer gtest_fftspectrometer --test_data "${CMAKE_CURRENT_LIST_DIR}/data")
diff --git a/psrdada_cpp/rs_spectrometer/CMakeLists.txt b/psrdada_cpp/rs_spectrometer/CMakeLists.txt
index 6d5512c536c4d01afe4ea4ccbaa8eb1d2e4c44f1..8e27cfc12eaa49fd49c86b85d3f915aef6f031ca 100644
--- a/psrdada_cpp/rs_spectrometer/CMakeLists.txt
+++ b/psrdada_cpp/rs_spectrometer/CMakeLists.txt
@@ -1,27 +1,11 @@
 if(ENABLE_CUDA)
-
-set(PSRDADA_CPP_RS_LIBRARIES
-    ${PSRDADA_CPP_LIBRARIES}
-    ${CMAKE_PROJECT_NAME}_common
-    ${CMAKE_PROJECT_NAME}_rs_spectrometer
-    CUDA::cufft
-)
-
-set(psrdada_cpp_rs_spectrometer_src
-    src/pipeline.cu
-)
-
-set(psrdada_cpp_rs_spectrometer_inc
-    pipeline.cuh
-    kernels.cuh
-)
-
-add_library(${CMAKE_PROJECT_NAME}_rs_spectrometer ${psrdada_cpp_rs_spectrometer_src})
-add_executable(rs_spectrometer cli/rs_spectrometer_cli.cu)
-target_link_libraries(rs_spectrometer ${PSRDADA_CPP_RS_LIBRARIES})
-install(TARGETS rs_spectrometer DESTINATION bin)
-
-if (ENABLE_TESTING)
-    add_subdirectory(test)
-endif()
+    set(PSRDADA_CPP_RS_LIBRARIES ${PSRDADA_CPP_LIBRARIES} ${CMAKE_PROJECT_NAME}_rs_spectrometer CUDA::cufft)
+    add_library(${CMAKE_PROJECT_NAME}_rs_spectrometer src/pipeline.cu)
+    add_executable(rs_spectrometer cli/rs_spectrometer_cli.cu)
+    target_link_libraries(rs_spectrometer ${PSRDADA_CPP_RS_LIBRARIES})
+    install(TARGETS rs_spectrometer DESTINATION bin)
+
+    if (ENABLE_TESTING)
+        add_subdirectory(test)
+    endif()
 endif(ENABLE_CUDA)