diff --git a/.gitignore b/.gitignore
index 1b5cabe689d85cfd5c0ce42d1075e665e2d98137..2846ab35ec82c4ab7659933c48ac750d7c7f13c4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,9 @@
 
-lib/*
-build/*
-bin/*
+lib/
+build*/
+bin/
 .settings/language.settings.xml
 .project
 .cproject
 deps/RTKLIB
-.vscode/*
+.vscode/
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d36785ffb82b26bbff6e5be422c1e9a0c5c17f35..3892399b43771edd5c7d5cbd7ddde5724aba1179 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,13 +2,7 @@
 MESSAGE("Starting gnss-utils CMakeLists ...")
 
 # Pre-requisites about cmake itself
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
-
-if(COMMAND cmake_policy)
-  cmake_policy(SET CMP0005 NEW)
-  cmake_policy(SET CMP0003 NEW)
-
-endif(COMMAND cmake_policy)
+CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
 
 # MAC OSX RPATH
 set(CMAKE_MACOSX_RPATH true)
@@ -18,7 +12,8 @@ PROJECT(gnss_utils)
 
 SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin)
 SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib)
-SET(CMAKE_INSTALL_PREFIX /usr/local)
+set(INCLUDE_INSTALL_DIR include/iri-algorithms)
+set(LIB_INSTALL_DIR lib/)
 
 IF (NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE "RELEASE")
@@ -45,12 +40,6 @@ endif()
 
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive")
 
-FIND_PACKAGE(Eigen3 3.3 REQUIRED)
-IF(Eigen3_FOUND)
-    INCLUDE_DIRECTORIES(${EIGEN3_INCLUDE_DIRS})
-ENDIF(Eigen3_FOUND)
-
-
 # Testing
 IF(NOT BUILD_TESTS)
   OPTION(BUILD_TESTS "Build Unit tests" ON)
@@ -84,14 +73,13 @@ message("CONFIG DIRECTORY ${PROJECT_BINARY_DIR}")
 include_directories("${PROJECT_BINARY_DIR}/conf")
 
 # rtklib path
-SET(RTKLIB_DIR deps/RTKLIB)
-SET(RTKLIB_SRC_DIR ${RTKLIB_DIR}/src)
+SET(RTKLIB_SRC_DIR deps/RTKLIB/src)
 
 # driver source files
 SET(SOURCES
     src/navigation.cpp
     src/observations.cpp
-	src/range.cpp
+	  src/range.cpp
     src/receiver_raw_base.cpp
     src/receivers/ublox_raw.cpp
     src/receivers/novatel_raw.cpp
@@ -131,41 +119,68 @@ SET(RTKLIB_SRC
     ${RTKLIB_SRC_DIR}/rcv/tersus.c
     ${RTKLIB_SRC_DIR}/rcv/ublox.c)
 
-# application header files
-# NOT SET SINCE WE COPY THE WHOLE include FOLDER
-
-# Eigen #######
-FIND_PACKAGE(Eigen3 REQUIRED)
-
-# Adding libraries' directories
-link_directories(/usr/lib/x86_64-linux-gnu/)
+    
+FIND_PACKAGE(Eigen3 3.3 REQUIRED CONFIG)
 
 # Adding include directories
-INCLUDE_DIRECTORIES(include/ ${EIGEN3_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ${RTKLIB_SRC_DIR})
+INCLUDE_DIRECTORIES(BEFORE include ${RTKLIB_SRC_DIR})
 
 # create the shared library
 ADD_LIBRARY(gnss_utils SHARED ${SOURCES} ${RTKLIB_SRC})
-TARGET_LINK_LIBRARIES(gnss_utils ${Boost_LIBRARIES})
+
+# Link this library wrt. its dependencies
+TARGET_LINK_LIBRARIES(gnss_utils Eigen3::Eigen)
 
 # Examples
 ADD_SUBDIRECTORY(src/examples)
+
 # Testing
 if(BUILD_TESTS)
   	add_subdirectory(test)
 endif()
 
 # Installing
-INSTALL(TARGETS ${PROJECT_NAME}
-        RUNTIME DESTINATION bin
-        LIBRARY DESTINATION lib
-        ARCHIVE DESTINATION lib)
-INSTALL(DIRECTORY include/gnss_utils DESTINATION include/iri-algorithms)
-INSTALL(FILES ${RTKLIB_SRC_DIR}/rtklib.h DESTINATION include/iri-algorithms/gnss_utils)
-INSTALL(FILES Findgnss_utils.cmake DESTINATION ${CMAKE_ROOT}/Modules/)
+INSTALL(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets
+  RUNTIME DESTINATION bin
+  LIBRARY DESTINATION ${LIB_INSTALL_DIR}
+  ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
+)
+install(EXPORT ${PROJECT_NAME}Targets DESTINATION lib/${PROJECT_NAME}/cmake)
+
+# Configure the package installation
+include(CMakePackageConfigHelpers)
+configure_package_config_file(
+  ${CMAKE_SOURCE_DIR}/cmake_modules/${PROJECT_NAME}Config.cmake.in
+  ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
+  INSTALL_DESTINATION ${LIB_INSTALL_DIR}/${PROJECT_NAME}/cmake
+  PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR
+)
+
+install(
+  FILES 
+  ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
+  DESTINATION 
+  ${LIB_INSTALL_DIR}/${PROJECT_NAME}/cmake
+)
+
+# Specifies include directories to use when compiling the plugin target
+# This way, include_directories does not need to be called in plugins depending on this one
+target_include_directories(${PROJECT_NAME} INTERFACE
+  $<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
+)
+
+INSTALL(DIRECTORY include/gnss_utils DESTINATION ${INCLUDE_INSTALL_DIR})
+
+INSTALL(FILES ${RTKLIB_SRC_DIR}/rtklib.h DESTINATION ${INCLUDE_INSTALL_DIR}/gnss_utils)
+
 INSTALL(FILES "${GNSS_UTILS_CONFIG_DIR}/config.h"
-  DESTINATION include/iri-algorithms/gnss_utils/internal)
+  DESTINATION ${INCLUDE_INSTALL_DIR}/gnss_utils/internal)
+
 
-FIND_PACKAGE(Doxygen)
+###############
+# Documentation
+###############
+FIND_PACKAGE(Doxygen MODULE)
 
 FIND_PATH(IRI_DOC_DIR doxygen.conf ${CMAKE_SOURCE_DIR}/doc/iri_doc/)
 IF (IRI_DOC_DIR)
diff --git a/cmake_modules/gnss_utilsConfig.cmake.in b/cmake_modules/gnss_utilsConfig.cmake.in
new file mode 100644
index 0000000000000000000000000000000000000000..ae01299238be6d3b5da20044665ea893e38ba378
--- /dev/null
+++ b/cmake_modules/gnss_utilsConfig.cmake.in
@@ -0,0 +1,13 @@
+set(@PROJECT_NAME@_VERSION 0.0.1)
+
+
+@PACKAGE_INIT@
+
+set_and_check(@PROJECT_NAME@_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
+set(@PROJECT_NAME@_INCLUDE_DIRS @PROJECT_NAME@_INCLUDE_DIR)
+set_and_check(@PROJECT_NAME@_LIB_INSTALL_DIR "@PACKAGE_LIB_INSTALL_DIR@")
+set(@PROJECT_NAME@_LIB_INSTALL_DIRS @PROJECT_NAME@_LIB_INSTALL_DIR)
+
+include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
+
+check_required_components(@PROJECT_NAME@)
\ No newline at end of file
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index c180b0041c8d6001ce578b5c25b9813061259dec..03f45caae714c3b208ec8a8cfa21cdd2d3702a5e 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,33 +1,24 @@
 # Retrieve googletest from github & compile
 add_subdirectory(gtest)
 
-# Include gtest directory.
-include_directories(${GTEST_INCLUDE_DIRS})
-
 ############# USE THIS TEST AS AN EXAMPLE ####################
 #                                                            #
 # Create a specific test executable for gtest_example        #
 # gnss_utils_add_gtest(gtest_example gtest_example.cpp)      #
-# target_link_libraries(gtest_example ${PROJECT_NAME})       #
 #                                                            #
 ##############################################################
 
 # Navigation test
 gnss_utils_add_gtest(gtest_navigation gtest_navigation.cpp)
-target_link_libraries(gtest_navigation libgtest ${PROJECT_NAME})
 
 # Observations test
 gnss_utils_add_gtest(gtest_observations gtest_observations.cpp)
-target_link_libraries(gtest_observations libgtest ${PROJECT_NAME})
 
 # TDCP test
 gnss_utils_add_gtest(gtest_tdcp gtest_tdcp.cpp)
-target_link_libraries(gtest_tdcp ${PROJECT_NAME})
 
 # Transformations test
 gnss_utils_add_gtest(gtest_transformations gtest_transformations.cpp)
-target_link_libraries(gtest_transformations ${PROJECT_NAME})
 
 # ChiSquare test
-gnss_utils_add_gtest(gtest_chisquare gtest_chisquare.cpp)
-target_link_libraries(gtest_chisquare ${PROJECT_NAME})
\ No newline at end of file
+gnss_utils_add_gtest(gtest_chisquare gtest_chisquare.cpp)
\ No newline at end of file
diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt
index 3c3c48c74516488a8c4eb24c2492bd81a5edc7f9..d066e223567d362f5b253ef7dd55e8f8f8ace188 100644
--- a/test/gtest/CMakeLists.txt
+++ b/test/gtest/CMakeLists.txt
@@ -1,65 +1,78 @@
-cmake_minimum_required(VERSION 2.8.8)
-project(gtest_builder C CXX)
+if(${CMAKE_VERSION} VERSION_LESS "3.11.0") 
+  message("CMake version less than 3.11.0")
 
-# We need thread support
-#find_package(Threads REQUIRED)
+  # Enable ExternalProject CMake module
+  include(ExternalProject)
 
-# Enable ExternalProject CMake module
-include(ExternalProject)
+  set(GTEST_FORCE_SHARED_CRT ON)
+  set(GTEST_DISABLE_PTHREADS ON) # without this in ubuntu 18.04 we get linking errors
+  
+  # Download GoogleTest
+  ExternalProject_Add(googletest
+      GIT_REPOSITORY https://github.com/google/googletest.git
+      GIT_TAG        v1.8.x
+      # TIMEOUT 1 # We'll try this
+      CMAKE_ARGS -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=DebugLibs
+      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=ReleaseLibs
+      -DCMAKE_CXX_FLAGS=${MSVC_COMPILER_DEFS}
+      -Dgtest_force_shared_crt=${GTEST_FORCE_SHARED_CRT}
+      -Dgtest_disable_pthreads=${GTEST_DISABLE_PTHREADS}
+      -DBUILD_GTEST=ON
+      PREFIX "${CMAKE_CURRENT_BINARY_DIR}"
+      # Disable install step
+      INSTALL_COMMAND ""
+      UPDATE_DISCONNECTED 1 # 1: do not update googletest; 0: update googletest via github
+  )
 
-set(GTEST_FORCE_SHARED_CRT ON)
-set(GTEST_DISABLE_PTHREADS OFF)
+  # Get GTest source and binary directories from CMake project
 
-# For some reason I need to disable PTHREADS
-# with g++ (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3
-# This is a known issue for MinGW :
-# https://github.com/google/shaderc/pull/174
-#if(MINGW)
-    set(GTEST_DISABLE_PTHREADS ON)
-#endif()
+  # Specify include dir
+  ExternalProject_Get_Property(googletest source_dir)
+  set(GTEST_INCLUDE_DIRS ${source_dir}/googletest/include PARENT_SCOPE)
 
-# Download GoogleTest
-ExternalProject_Add(googletest
-    GIT_REPOSITORY https://github.com/google/googletest.git
-    GIT_TAG        v1.8.x
-    # TIMEOUT 1 # We'll try this
-    CMAKE_ARGS -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=DebugLibs
-    -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=ReleaseLibs
-    -DCMAKE_CXX_FLAGS=${MSVC_COMPILER_DEFS}
-    -Dgtest_force_shared_crt=${GTEST_FORCE_SHARED_CRT}
-    -Dgtest_disable_pthreads=${GTEST_DISABLE_PTHREADS}
-    -DBUILD_GTEST=ON
-    PREFIX "${CMAKE_CURRENT_BINARY_DIR}"
-    # Disable install step
-    INSTALL_COMMAND ""
-    UPDATE_DISCONNECTED 1 # 1: do not update googletest; 0: update googletest via github
-)
+  # Specify MainTest's link libraries
+  ExternalProject_Get_Property(googletest binary_dir)
+  set(GTEST_LIBS_DIR ${binary_dir}/googlemock/gtest PARENT_SCOPE)
 
-# Get GTest source and binary directories from CMake project
+  # Create a libgtest target to be used as a dependency by test programs
+  add_library(libgtest IMPORTED STATIC GLOBAL)
+  add_dependencies(libgtest googletest)
 
-# Specify include dir
-ExternalProject_Get_Property(googletest source_dir)
-set(GTEST_INCLUDE_DIRS ${source_dir}/googletest/include PARENT_SCOPE)
+  # Set libgtest properties
+  set_target_properties(libgtest PROPERTIES
+      "IMPORTED_LOCATION" "${binary_dir}/googlemock/gtest/libgtest.a"
+      "IMPORTED_LINK_INTERFACE_LIBRARIES" "${CMAKE_THREAD_LIBS_INIT}"
+  )
 
-# Specify MainTest's link libraries
-ExternalProject_Get_Property(googletest binary_dir)
-set(GTEST_LIBS_DIR ${binary_dir}/googlemock/gtest PARENT_SCOPE)
+else()
 
-# Create a libgtest target to be used as a dependency by test programs
-add_library(libgtest IMPORTED STATIC GLOBAL)
-add_dependencies(libgtest googletest)
+  message("CMake version equal or greater than 3.11.0")
 
-# Set libgtest properties
-set_target_properties(libgtest PROPERTIES
-    "IMPORTED_LOCATION" "${binary_dir}/googlemock/gtest/libgtest.a"
-    "IMPORTED_LINK_INTERFACE_LIBRARIES" "${CMAKE_THREAD_LIBS_INIT}"
-)
+  include(FetchContent)
 
+  FetchContent_Declare(
+    googletest
+    GIT_REPOSITORY https://github.com/google/googletest.git 
+    GIT_TAG main)
+
+  #FetchContent_MakeAvailable(googletest)
+  # Disable installation of googletest: https://stackoverflow.com/questions/65527126/disable-install-for-fetchcontent
+  FetchContent_GetProperties(googletest)
+  if(NOT googletest_POPULATED)
+    FetchContent_Populate(googletest)
+    add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR} EXCLUDE_FROM_ALL)
+  endif()
+    
+endif()
+  
 function(gnss_utils_add_gtest target)
   add_executable(${target} ${ARGN})
-  add_dependencies(${target} libgtest)
-  target_link_libraries(${target} libgtest)
-
-  #WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin
+  if(${CMAKE_VERSION} VERSION_LESS "3.11.0") 
+    add_dependencies(${target} libgtest)
+    target_link_libraries(${target} PUBLIC libgtest ${PROJECT_NAME})
+    target_include_directories(${target} PUBLIC ${GTEST_INCLUDE_DIRS})
+  else()
+    target_link_libraries(${target} PUBLIC gtest_main ${PROJECT_NAME})
+  endif()
   add_test(NAME ${target} COMMAND ${target})
 endfunction()