diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 950e7bf024d53f35b046f4d9028ea61fc9b0aba0..7e0b71299e152abe9c1f3f81ecf870ef36b821c9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -5,6 +5,7 @@ stages:
 ############ YAML ANCHORS ############
 .print_variables_template: &print_variables_definition
   # Print variables
+  - echo $WOLF_CORE_BRANCH
   - echo $CI_COMMIT_BRANCH
   - echo $WOLF_VISION_BRANCH
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f0eabcc9468ee1e408a7db99f0c314ec6df37a50..f89a00ef29372e9c39409616f1287a360f9198bb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,22 +1,20 @@
 # Pre-requisites about cmake itself
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
 
-if(COMMAND cmake_policy)
-  cmake_policy(SET CMP0005 NEW) 
-  cmake_policy(SET CMP0003 NEW)
-endif(COMMAND cmake_policy)
 # MAC OSX RPATH
 SET(CMAKE_MACOSX_RPATH true)
 
 # The project name
 PROJECT(vision)
-set(PLUGIN_NAME wolf${PROJECT_NAME})
+set(PLUGIN_NAME "wolf${PROJECT_NAME}")
 
 MESSAGE("Starting ${PROJECT_NAME} CMakeLists ...")
 
+# Paths
 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/wolf)
+set(LIB_INSTALL_DIR lib/)
 
 IF (NOT CMAKE_BUILD_TYPE)
   SET(CMAKE_BUILD_TYPE "DEBUG")
@@ -68,10 +66,6 @@ if(BUILD_TESTS)
     enable_testing()
 endif()
 
-#CMAKE modules
-SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake_modules")
-MESSAGE(STATUS ${CMAKE_MODULE_PATH})
-
 # Some wolf compilation options
 IF((CMAKE_BUILD_TYPE MATCHES DEBUG) OR (CMAKE_BUILD_TYPE MATCHES debug) OR (CMAKE_BUILD_TYPE MATCHES Debug))
   set(_WOLF_DEBUG true)
@@ -80,8 +74,10 @@ ENDIF()
 option(_WOLF_TRACE "Enable wolf tracing macro" ON)
 
 # ============ DEPENDENCIES ==================
-FIND_PACKAGE(wolfcore REQUIRED)
-FIND_PACKAGE(OpenCV REQUIRED)
+FIND_PACKAGE(wolfcore REQUIRED CONFIG)
+FIND_PACKAGE(OpenCV REQUIRED CONFIG
+  COMPONENTS core imgcodecs highgui features2d calib3d video
+)
 IF(OpenCV_FOUND)
   MESSAGE(STATUS "Found OpenCV: ${OpenCV_INCLUDE_DIRS}")
 ELSEIF()
@@ -89,8 +85,9 @@ ELSEIF()
 ENDIF()
 
 # ============ config.h ==================
-string(TOUPPER ${PROJECT_NAME} UPPER_NAME)
 set(_WOLF_ROOT_DIR ${CMAKE_SOURCE_DIR})
+# variable used to compile the config.h.in file
+string(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UPPER)
 
 # Define the directory where will be the configured config.h
 SET(WOLF_CONFIG_DIR ${PROJECT_BINARY_DIR}/conf/${PROJECT_NAME}/internal)
@@ -110,8 +107,6 @@ message("CONFIG DIRECTORY ${PROJECT_BINARY_DIR}")
 include_directories("${PROJECT_BINARY_DIR}/conf")
 
 # ============ INCLUDES ==================
-INCLUDE_DIRECTORIES(${wolfcore_INCLUDE_DIRS})
-INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
 INCLUDE_DIRECTORIES(BEFORE "include")
 
 # ============ HEADERS ============ 
@@ -189,10 +184,20 @@ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
   # using GCC
 endif()
 
-#Link the created libraries
+# Link the created libraries
 #===============EXAMPLE=========================
-TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${wolfcore_LIBRARIES})
-TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${OpenCV_LIBS})
+TARGET_LINK_LIBRARIES(${PLUGIN_NAME} wolfcore)
+# For OpenCV, link with respect to each required components, found in the find_package command
+# The required components have the same name as the include files e.g. <opencv2/core.hpp>
+# or the opencv2 subdirectory in which they are found, e.g. <opencv2/video/tracking.hpp>
+TARGET_LINK_LIBRARIES(${PLUGIN_NAME} 
+  opencv_core
+  opencv_imgcodecs
+  opencv_highgui
+  opencv_features2d
+  opencv_calib3d
+  opencv_video
+)
 
 #Build demos
 #===============EXAMPLE=========================
@@ -211,40 +216,60 @@ ENDIF(BUILD_TESTS)
 #install library
 #=============================================================
 INSTALL(TARGETS ${PLUGIN_NAME} EXPORT ${PLUGIN_NAME}Targets
-      RUNTIME DESTINATION bin
-      LIBRARY DESTINATION lib
-      ARCHIVE DESTINATION lib)
+  RUNTIME DESTINATION bin
+  LIBRARY DESTINATION ${LIB_INSTALL_DIR}
+  ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
+)
+install(EXPORT ${PLUGIN_NAME}Targets DESTINATION lib/${PLUGIN_NAME}/cmake)
+
+
+# Configure the package installation
+include(CMakePackageConfigHelpers)
+configure_package_config_file(
+  ${CMAKE_SOURCE_DIR}/cmake_modules/${PLUGIN_NAME}Config.cmake.in
+  ${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME}Config.cmake
+  INSTALL_DESTINATION ${LIB_INSTALL_DIR}/${PLUGIN_NAME}/cmake
+  PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR
+)
+
+install(
+  FILES 
+  ${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME}Config.cmake
+  DESTINATION 
+  ${LIB_INSTALL_DIR}/${PLUGIN_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(${PLUGIN_NAME} INTERFACE
+  $<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
+)
+
 
-install(EXPORT ${PLUGIN_NAME}Targets DESTINATION lib/cmake/${PLUGIN_NAME})
 #install headers
 INSTALL(FILES ${HDRS_CAPTURE}
-  DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/capture)
+  DESTINATION ${INCLUDE_INSTALL_DIR}/${PROJECT_NAME}/capture)
 INSTALL(FILES ${HDRS_FACTOR}
-  DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/factor)
+  DESTINATION ${INCLUDE_INSTALL_DIR}/${PROJECT_NAME}/factor)
 INSTALL(FILES ${HDRS_FEATURE}
-  DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/feature)
+  DESTINATION ${INCLUDE_INSTALL_DIR}/${PROJECT_NAME}/feature)
 INSTALL(FILES ${HDRS_LANDMARK}
-  DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/landmark)
+  DESTINATION ${INCLUDE_INSTALL_DIR}/${PROJECT_NAME}/landmark)
 INSTALL(FILES ${HDRS_MATH}
-  DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/math)
+  DESTINATION ${INCLUDE_INSTALL_DIR}/${PROJECT_NAME}/math)
 INSTALL(FILES ${HDRS_PROCESSOR}
-  DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/processor)
+  DESTINATION ${INCLUDE_INSTALL_DIR}/${PROJECT_NAME}/processor)
 INSTALL(FILES ${HDRS_SENSOR}
-  DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/sensor)
+  DESTINATION ${INCLUDE_INSTALL_DIR}/${PROJECT_NAME}/sensor)
 
-FILE(WRITE ${PROJECT_NAME}.found "")
-INSTALL(FILES ${PROJECT_NAME}.found
-  DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME})
 INSTALL(FILES "${WOLF_CONFIG_DIR}/config.h"
-  DESTINATION include/iri-algorithms/wolf/plugin_${PROJECT_NAME}/${PROJECT_NAME}/internal)
-
-INSTALL(FILES "${CMAKE_SOURCE_DIR}/cmake_modules/${PLUGIN_NAME}Config.cmake" DESTINATION "lib/cmake/${PLUGIN_NAME}")
+  DESTINATION ${INCLUDE_INSTALL_DIR}/${PROJECT_NAME}/internal)
 
 INSTALL(DIRECTORY ${SPDLOG_INCLUDE_DIRS} DESTINATION "include/iri-algorithms/")
 
 export(PACKAGE ${PLUGIN_NAME})
 
-FIND_PACKAGE(Doxygen)
+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/wolfvisionConfig.cmake b/cmake_modules/wolfvisionConfig.cmake
deleted file mode 100644
index 7c5932179f98af699ea797793a0c4d0d1360138e..0000000000000000000000000000000000000000
--- a/cmake_modules/wolfvisionConfig.cmake
+++ /dev/null
@@ -1,90 +0,0 @@
-#edit the following line to add the librarie's header files
-FIND_PATH(
-    wolfvision_INCLUDE_DIRS
-    NAMES vision.found
-    PATHS /usr/local/include/iri-algorithms/wolf/plugin_vision)
-IF(wolfvision_INCLUDE_DIRS)
-  MESSAGE("Found vision include dirs: ${wolfvision_INCLUDE_DIRS}")
-ELSE(wolfvision_INCLUDE_DIRS)
-  MESSAGE("Couldn't find vision include dirs")
-ENDIF(wolfvision_INCLUDE_DIRS)
-
-FIND_LIBRARY(
-    wolfvision_LIBRARIES
-    NAMES libwolfvision.so libwolfvision.dylib
-    PATHS /usr/local/lib)
-IF(wolfvision_LIBRARIES)
-  MESSAGE("Found vision lib: ${wolfvision_LIBRARIES}")
-ELSE(wolfvision_LIBRARIES)
-  MESSAGE("Couldn't find wolf vision lib")
-ENDIF(wolfvision_LIBRARIES)
-
-IF (wolfvision_INCLUDE_DIRS AND wolfvision_LIBRARIES)
-   SET(wolfvision_FOUND TRUE)
- ELSE(wolfvision_INCLUDE_DIRS AND wolfvision_LIBRARIES)
-   set(wolfvision_FOUND FALSE)
-ENDIF (wolfvision_INCLUDE_DIRS AND wolfvision_LIBRARIES)
-
-IF (wolfvision_FOUND)
-   IF (NOT wolfvision_FIND_QUIETLY)
-      MESSAGE(STATUS "Found vision: ${wolfvision_LIBRARIES}")
-   ENDIF (NOT wolfvision_FIND_QUIETLY)
-ELSE (wolfvision_FOUND)
-   IF (wolfvision_FIND_REQUIRED)
-      MESSAGE(FATAL_ERROR "Could not find wolf vision")
-   ENDIF (wolfvision_FIND_REQUIRED)
-ENDIF (wolfvision_FOUND)
-
-
-macro(wolf_report_not_found REASON_MSG)
-  set(wolfvision_FOUND FALSE)
-  unset(wolfvision_INCLUDE_DIRS)
-  unset(wolfvision_LIBRARIES)
-
-  # Reset the CMake module path to its state when this script was called.
-  set(CMAKE_MODULE_PATH ${CALLERS_CMAKE_MODULE_PATH})
-
-  # Note <package>_FIND_[REQUIRED/QUIETLY] variables defined by
-  # FindPackage() use the camelcase library name, not uppercase.
-  if (wolfvision_FIND_QUIETLY)
-    message(STATUS "Failed to find wolfvision- " ${REASON_MSG} ${ARGN})
-  elseif (wolfvision_FIND_REQUIRED)
-    message(FATAL_ERROR "Failed to find wolfvision - " ${REASON_MSG} ${ARGN})
-  else()
-    # Neither QUIETLY nor REQUIRED, use SEND_ERROR which emits an error
-    # that prevents generation, but continues configuration.
-    message(SEND_ERROR "Failed to find wolfvision - " ${REASON_MSG} ${ARGN})
-  endif ()
-  return()
-endmacro(wolf_report_not_found)
-
-if(NOT wolfvision_FOUND)
-  wolf_report_not_found("Something went wrong while setting up wolf vision.")
-endif(NOT wolfvision_FOUND)
-# Set the include directories for wolf (itself).
-set(wolfvision_FOUND TRUE)
-
-# Now we gather all the required dependencies for Wolf Laser
-
-FIND_PACKAGE(OpenCV REQUIRED)
-list(APPEND wolfvision_INCLUDE_DIRS ${OpenCV_INCLUDE_DIRS})
-list(APPEND wolfvision_LIBRARIES ${OpenCV_LIBS})
-
-#Making sure wolf is looked for
-if(NOT wolf_FOUND)
-  FIND_PACKAGE(wolfcore REQUIRED)
-
-  #We reverse in order to insert at the start
-  list(REVERSE wolfvision_INCLUDE_DIRS)
-  list(APPEND wolfvision_INCLUDE_DIRS ${wolfcore_INCLUDE_DIRS})
-  list(REVERSE wolfvision_INCLUDE_DIRS)
-
-  list(REVERSE wolfvision_LIBRARIES)
-  list(APPEND wolfvision_LIBRARIES ${wolfcore_LIBRARIES})
-  list(REVERSE wolfvision_LIBRARIES)
-endif()
-
-# provide both INCLUDE_DIR and INCLUDE_DIRS
-SET(wolfvision_INCLUDE_DIR ${wolfvision_INCLUDE_DIRS})
-# provide both LIBRARY and LIBRARIES 
-SET(wolfvision_LIBRARY ${wolfvision_LIBRARIES})
\ No newline at end of file
diff --git a/cmake_modules/wolfvisionConfig.cmake.in b/cmake_modules/wolfvisionConfig.cmake.in
new file mode 100644
index 0000000000000000000000000000000000000000..6f428e250f0cea0882d26154d63faaa8150e099c
--- /dev/null
+++ b/cmake_modules/wolfvisionConfig.cmake.in
@@ -0,0 +1,17 @@
+set(@PLUGIN_NAME@_VERSION 0.0.1)
+
+
+@PACKAGE_INIT@
+
+set_and_check(@PLUGIN_NAME@_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
+set(@PLUGIN_NAME@_INCLUDE_DIRS @PLUGIN_NAME@_INCLUDE_DIR)
+set_and_check(@PLUGIN_NAME@_LIB_INSTALL_DIR "@PACKAGE_LIB_INSTALL_DIR@")
+set(@PLUGIN_NAME@_LIB_INSTALL_DIRS @PLUGIN_NAME@_LIB_INSTALL_DIR)
+
+# forwards the correct parameters given to FIND_DEPENDENCIES
+include(CMakeFindDependencyMacro)
+FIND_DEPENDENCY(OpenCV REQUIRED)
+
+include("${CMAKE_CURRENT_LIST_DIR}/@PLUGIN_NAME@Targets.cmake")
+
+check_required_components(@PLUGIN_NAME@)
\ No newline at end of file
diff --git a/demos/CMakeLists.txt b/demos/CMakeLists.txt
index e58fcf20d02050dfc0270ef8ea774f8428fa4ce7..4589b079c211bac6c29d6f20535e22d118100af5 100644
--- a/demos/CMakeLists.txt
+++ b/demos/CMakeLists.txt
@@ -1,18 +1,2 @@
-
-if (OpenCV_FOUND) 
-  if (${OpenCV_VERSION_MAJOR} GREATER 1)
-    message("-- [INFO] Found OpenCV support")
-    ADD_DEFINITIONS(-DHAVE_OPENCV_H)
-    SET(USE_CV true)
-  else(${OpenCV_VERSION_MAJOR} GREATER 1)
-    message("[WARN] OpenCV support not installed. Minimum 2.4 version required.")
-    message("[WARN] Current version ${OpenCV_VERSION_MAJOR}")    
-  endif(${OpenCV_VERSION_MAJOR} GREATER 1)
-else(OpenCV_FOUND)
-    message("[WARN] OpenCV support not installed. Minimum 2.4 version required.")
-endif(OpenCV_FOUND)
-
 ADD_EXECUTABLE(demo_visual_odometry demo_visual_odometry.cpp)
-TARGET_LINK_LIBRARIES(demo_visual_odometry ${PLUGIN_NAME} ${OpenCV_LIBS})
-
-
+TARGET_LINK_LIBRARIES(demo_visual_odometry ${PLUGIN_NAME} ${OpenCV_LIBS})
\ No newline at end of file
diff --git a/include/vision/processor/processor_visual_odometry.h b/include/vision/processor/processor_visual_odometry.h
index 2377c08aca6334e91a4cf61ffb1de8668ce9fd75..92d31464836a13f82835819d47ac8e60e6f14f70 100644
--- a/include/vision/processor/processor_visual_odometry.h
+++ b/include/vision/processor/processor_visual_odometry.h
@@ -41,7 +41,6 @@
 // Opencv includes
 #include <opencv2/core.hpp>
 #include <opencv2/imgcodecs.hpp>
-#include <opencv2/highgui.hpp>
 #include <opencv2/features2d.hpp>
 #include <opencv2/calib3d/calib3d.hpp>
 #include <opencv2/video/tracking.hpp>
diff --git a/internal/config.h.in b/internal/config.h.in
index 7014ca320e5c5fea1f59a6fe5d9d1ea0987bf95e..35f3468331656ba09a63ad7f26e5c0fb78c8d5bc 100644
--- a/internal/config.h.in
+++ b/internal/config.h.in
@@ -24,13 +24,13 @@
 //            which will be added to the include path for compilation,
 //            and installed with the public wolf headers.
 
-#ifndef WOLF_INTERNAL_${UPPER_NAME}_CONFIG_H_
-#define WOLF_INTERNAL_${UPPER_NAME}_CONFIG_H_
+#ifndef WOLF_INTERNAL_${PROJECT_NAME_UPPER}_CONFIG_H_
+#define WOLF_INTERNAL_${PROJECT_NAME_UPPER}_CONFIG_H_
 
 #cmakedefine _WOLF_DEBUG
 
 #cmakedefine _WOLF_TRACE
 
-#define _WOLF_${UPPER_NAME}_ROOT_DIR "${_WOLF_ROOT_DIR}"
+#define _WOLF_${PROJECT_NAME_UPPER}_ROOT_DIR "${_WOLF_ROOT_DIR}"
 
 #endif /* WOLF_INTERNAL_CONFIG_H_ */
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index ffd3390d04e0cceb6bb51e6eba877d932870b220..7beb4a968d006ebfe9e2e5f75b1790d53668f8be 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,38 +1,19 @@
 # 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     #
+# wolf_add_gtest(gtest_example gtest_example.cpp)         #
+#                                                         #
+###########################################################
 
 wolf_add_gtest(gtest_pinhole gtest_pinhole.cpp)
-target_link_libraries(gtest_pinhole ${PLUGIN_NAME})
 
 wolf_add_gtest(gtest_capture_image gtest_capture_image.cpp)
-target_link_libraries(gtest_capture_image ${PLUGIN_NAME})
 
 wolf_add_gtest(gtest_feature_point_image gtest_feature_point_image.cpp)
-target_link_libraries(gtest_feature_point_image ${PLUGIN_NAME})
-
 
 wolf_add_gtest(gtest_sensor_camera gtest_sensor_camera.cpp)
-target_link_libraries(gtest_sensor_camera ${PLUGIN_NAME})
-
-wolf_add_gtest(gtest_processor_visual_odometry gtest_processor_visual_odometry.cpp)
-target_link_libraries(gtest_processor_visual_odometry ${PLUGIN_NAME})
-
-# # FactorTrifocal test
-# wolf_add_gtest(gtest_factor_trifocal gtest_factor_trifocal.cpp)
-# target_link_libraries(gtest_factor_trifocal ${PLUGIN_NAME})
-
-# # FactorFeatureEpipolar test
-# wolf_add_gtest(gtest_factor_epipolar gtest_factor_epipolar.cpp)
-# target_link_libraries(gtest_factor_epipolar ${PLUGIN_NAME})
-
-# # ProcessorBundleAdjustment test
-# wolf_add_gtest(gtest_processor_bundle_adjustment gtest_processor_bundle_adjustment.cpp)
-# target_link_libraries(gtest_processor_bundle_adjustment ${PLUGIN_NAME})
 
-# # FactorPixelHp test -> depends on processor_bundle_adjustment.cpp
-# wolf_add_gtest(gtest_factor_pixel_hp gtest_factor_pixel_hp.cpp)
-# target_link_libraries(gtest_factor_pixel_hp ${PLUGIN_NAME})
+wolf_add_gtest(gtest_processor_visual_odometry gtest_processor_visual_odometry.cpp)
\ No newline at end of file
diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt
index 559756b02472653c655c44152c452ba8767ef6f2..2cae2569bf53ce0052f496edfe0ce56e99f4bd14 100644
--- a/test/gtest/CMakeLists.txt
+++ b/test/gtest/CMakeLists.txt
@@ -1,65 +1,73 @@
-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
 
-set(GTEST_FORCE_SHARED_CRT ON)
-set(GTEST_DISABLE_PTHREADS OFF)
+  # 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
+  )
 
-# 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()
+  # Get GTest source and binary directories from CMake project
 
-# 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 include dir
+  ExternalProject_Get_Property(googletest source_dir)
+  set(GTEST_INCLUDE_DIRS ${source_dir}/googletest/include PARENT_SCOPE)
 
-# Get GTest source and binary directories from CMake project
+  # Specify MainTest's link libraries
+  ExternalProject_Get_Property(googletest binary_dir)
+  set(GTEST_LIBS_DIR ${binary_dir}/googlemock/gtest PARENT_SCOPE)
 
-# Specify include dir
-ExternalProject_Get_Property(googletest source_dir)
-set(GTEST_INCLUDE_DIRS ${source_dir}/googletest/include PARENT_SCOPE)
+  # Create a libgtest target to be used as a dependency by test programs
+  add_library(libgtest IMPORTED STATIC GLOBAL)
+  add_dependencies(libgtest googletest)
 
-# Specify MainTest's link libraries
-ExternalProject_Get_Property(googletest binary_dir)
-set(GTEST_LIBS_DIR ${binary_dir}/googlemock/gtest 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}"
+  )
 
-# Create a libgtest target to be used as a dependency by test programs
-add_library(libgtest IMPORTED STATIC GLOBAL)
-add_dependencies(libgtest googletest)
+else()
 
-# Set libgtest properties
-set_target_properties(libgtest PROPERTIES
-    "IMPORTED_LOCATION" "${binary_dir}/googlemock/gtest/libgtest.a"
-    "IMPORTED_LINK_INTERFACE_LIBRARIES" "${CMAKE_THREAD_LIBS_INIT}"
-)
+  message("CMake version equal or greater than 3.11.0")
 
+  include(FetchContent)
+
+  FetchContent_Declare(
+    googletest
+    GIT_REPOSITORY https://github.com/google/googletest.git 
+    GIT_TAG main)
+
+  SET(INSTALL_GTEST OFF) # Disable installation of googletest
+  FetchContent_MakeAvailable(googletest)
+    
+endif()
+  
 function(wolf_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} libgtest ${PLUGIN_NAME})
+    target_include_directories(${target} PUBLIC ${GTEST_INCLUDE_DIRS})
+  else()
+    target_link_libraries(${target} PUBLIC gtest_main ${PLUGIN_NAME})
+  endif()
   add_test(NAME ${target} COMMAND ${target})
 endfunction()