diff --git a/common/cpp/CMakeLists.txt b/common/cpp/CMakeLists.txt
index b76ce0d2df43a5a6c04f9b26ef1ba0ae60947544..da4dc3aedc86409141cf2583ee68a295defb77c1 100644
--- a/common/cpp/CMakeLists.txt
+++ b/common/cpp/CMakeLists.txt
@@ -15,6 +15,11 @@ ENDIF(WIN32)
 ################################
 # Library
 ################################
+IF(WIN32)
+    SET_PROPERTY(GLOBAL PROPERTY HIDRA2_COMMON_IO_LIBRARIES "Threads::Threads wsock32 ws2_32")
+ELSEIF(UNIX)
+    SET_PROPERTY(GLOBAL PROPERTY HIDRA2_COMMON_IO_LIBRARIES "Threads::Threads")
+ENDIF(WIN32)
 add_library(${TARGET_NAME} OBJECT ${SOURCE_FILES})
 #add_library(${TARGET_NAME} SHARED ${SOURCE_FILES})
 target_include_directories(${TARGET_NAME} PUBLIC include)
diff --git a/common/cpp/src/system_io_windows.cpp b/common/cpp/src/system_io_windows.cpp
index 6a2302bef5706fd82f12556e20b15fa7b4eb1f2e..1d42b4fcdc68cc0b0a95be2c9dce02488ce59d0b 100644
--- a/common/cpp/src/system_io_windows.cpp
+++ b/common/cpp/src/system_io_windows.cpp
@@ -85,8 +85,7 @@ std::chrono::system_clock::time_point FileTime2TimePoint(const FILETIME& ft, IOE
     return tp;
 }
 
-FileInfo hidra2::SystemIO::GetFileInfo(const std::string & path, const std::string & name, IOErrors * err) const
-{
+FileInfo hidra2::SystemIO::GetFileInfo(const std::string& path, const std::string& name, IOErrors* err) const {
     return FileInfo();
 }
 
@@ -144,43 +143,38 @@ void SystemIO::CollectFileInformationRecursivly(const std::string& path,
     }
 }
 
-int hidra2::SystemIO::AddressFamilyToPosixFamily(AddressFamilies address_family) const
-{
+int hidra2::SystemIO::AddressFamilyToPosixFamily(AddressFamilies address_family) const {
     return 0;
 }
 
-int hidra2::SystemIO::SocketTypeToPosixType(SocketTypes socket_type) const
-{
+int hidra2::SystemIO::SocketTypeToPosixType(SocketTypes socket_type) const {
     return 0;
 }
 
-int hidra2::SystemIO::SocketProtocolToPosixProtocol(SocketProtocols socket_protocol) const
-{
+int hidra2::SystemIO::SocketProtocolToPosixProtocol(SocketProtocols socket_protocol) const {
     return 0;
 }
 
-void hidra2::SystemIO::InetBind(FileDescriptor socket_fd, const std::string & address, uint16_t port, IOErrors * err) const
-{
+void hidra2::SystemIO::InetBind(FileDescriptor socket_fd, const std::string& address, uint16_t port,
+                                IOErrors* err) const {
 
 }
 
-std::unique_ptr<std::tuple<std::string, FileDescriptor>> SystemIO::InetAccept(FileDescriptor socket_fd, IOErrors * err) const
-{
+std::unique_ptr<std::tuple<std::string, FileDescriptor>> SystemIO::InetAccept(FileDescriptor socket_fd,
+IOErrors* err) const {
     return std::unique_ptr<std::tuple<std::string, FileDescriptor>>();
 }
 
-void hidra2::SystemIO::InetConnect(FileDescriptor socket_fd, const std::string & address, IOErrors * err) const
-{
+void hidra2::SystemIO::InetConnect(FileDescriptor socket_fd, const std::string& address, IOErrors* err) const {
 
 }
 
-size_t hidra2::SystemIO::ReceiveTimeout(FileDescriptor socket_fd, void * buf, size_t length, uint16_t timeout_in_sec, IOErrors * err) const
-{
+size_t hidra2::SystemIO::ReceiveTimeout(FileDescriptor socket_fd, void* buf, size_t length, uint16_t timeout_in_sec,
+                                        IOErrors* err) const {
     return size_t();
 }
 
-FileDescriptor hidra2::SystemIO::_open(const char * filename, int posix_open_flags) const
-{
+FileDescriptor hidra2::SystemIO::_open(const char* filename, int posix_open_flags) const {
     int fd;
     errno = _sopen_s(&fd, filename, posix_open_flags, _SH_DENYNO, _S_IREAD | _S_IWRITE);
     return fd;
diff --git a/examples/producer/dummy-data-producer/CMakeLists.txt b/examples/producer/dummy-data-producer/CMakeLists.txt
index aea16d6f0130f90d283267b798fe2a0b339a55bb..e4f8921a2666be1b427dd889d7c59dea07d70729 100644
--- a/examples/producer/dummy-data-producer/CMakeLists.txt
+++ b/examples/producer/dummy-data-producer/CMakeLists.txt
@@ -1,11 +1,16 @@
-set(TARGET_NAME dummy-event-detector)
+set(TARGET_NAME dummy-data-producer)
 set(SOURCE_FILES
         dummy_data_producer.cpp
         )
 
 add_executable(${TARGET_NAME} ${SOURCE_FILES} $<TARGET_OBJECTS:common>)
 target_include_directories(${TARGET_NAME} PUBLIC include ${CMAKE_SOURCE_DIR}/common/cpp/include)
-target_link_libraries(${TARGET_NAME} Threads::Threads producer-api)
+
+#Add all necessary common libraries
+GET_PROPERTY(HIDRA2_COMMON_IO_LIBRARIES GLOBAL PROPERTY HIDRA2_COMMON_IO_LIBRARIES)
+target_link_libraries(${TARGET_NAME} ${HIDRA2_COMMON_IO_LIBRARIES})
+
+target_link_libraries(${TARGET_NAME} producer-api)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
 
 if (CMAKE_COMPILER_IS_GNUCXX)
diff --git a/examples/worker/process_folder/CMakeLists.txt b/examples/worker/process_folder/CMakeLists.txt
index a9879c3e243fc4ce4295683faa5beac5b6ac2fa3..6153ecbb142e428d0db3749788a5d2be2d6ffcaf 100644
--- a/examples/worker/process_folder/CMakeLists.txt
+++ b/examples/worker/process_folder/CMakeLists.txt
@@ -2,7 +2,12 @@ set(TARGET_NAME worker_processfolder)
 set(SOURCE_FILES process_folder.cpp)
 
 add_executable(${TARGET_NAME} ${SOURCE_FILES})
-target_link_libraries(${TARGET_NAME} hidra2-worker Threads::Threads)
+
+#Add all necessary common libraries
+GET_PROPERTY(HIDRA2_COMMON_IO_LIBRARIES GLOBAL PROPERTY HIDRA2_COMMON_IO_LIBRARIES)
+target_link_libraries(${TARGET_NAME} ${HIDRA2_COMMON_IO_LIBRARIES})
+
+target_link_libraries(${TARGET_NAME} hidra2-worker)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
 #use expression generator to get rid of VS adding Debug/Release folders
 set_target_properties(${TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
diff --git a/receiver/CMakeLists.txt b/receiver/CMakeLists.txt
index 74916a466fb16cae207ded0b041d9ee2800e3306..88ac9b4fa53a29ad715558d06f245f3388004045 100644
--- a/receiver/CMakeLists.txt
+++ b/receiver/CMakeLists.txt
@@ -11,7 +11,11 @@ set(SOURCE_FILES
 ################################
 add_executable(${TARGET_NAME} ${SOURCE_FILES} $<TARGET_OBJECTS:common>)
 target_include_directories(${TARGET_NAME} PUBLIC include ${CMAKE_SOURCE_DIR}/common/cpp/include)
-target_link_libraries(${TARGET_NAME} Threads::Threads)
+
+#Add all necessary common libraries
+GET_PROPERTY(HIDRA2_COMMON_IO_LIBRARIES GLOBAL PROPERTY HIDRA2_COMMON_IO_LIBRARIES)
+target_link_libraries(${TARGET_NAME} ${HIDRA2_COMMON_IO_LIBRARIES})
+
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
 
 ################################
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 59f4f821490ae92d100eb149f744ba95710c5ff6..73ad6a96381baa49e2b6b79d4938e848352da3a0 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,5 +1,5 @@
 CMAKE_MINIMUM_REQUIRED(VERSION 3.7) # needed for fixtures
-find_package(Threads)
+find_package(Threads REQUIRED)
 
 add_subdirectory(common/cpp)
 add_subdirectory(system_io)
diff --git a/tests/common/cpp/CMakeLists.txt b/tests/common/cpp/CMakeLists.txt
index 1eec82d9fb06edce8549838ed1a56c15b5a20f45..520d0153db6a34e18e9aeaf68448af3dfe6c0b5e 100644
--- a/tests/common/cpp/CMakeLists.txt
+++ b/tests/common/cpp/CMakeLists.txt
@@ -8,3 +8,7 @@ set(SOURCE_FILES
 add_library(${TARGET_NAME} STATIC ${SOURCE_FILES})
 target_include_directories(${TARGET_NAME} PUBLIC include)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
+
+#Add all necessary common libraries
+GET_PROPERTY(HIDRA2_COMMON_IO_LIBRARIES GLOBAL PROPERTY HIDRA2_COMMON_IO_LIBRARIES)
+target_link_libraries(${TARGET_NAME} ${HIDRA2_COMMON_IO_LIBRARIES})
diff --git a/tests/system_io/read_file_content/CMakeLists.txt b/tests/system_io/read_file_content/CMakeLists.txt
index 205f02310ef471dee2405d6d57eb45f8b96dbc8f..a8a2b328aeec5238646c73bb7fd145c45109d73e 100644
--- a/tests/system_io/read_file_content/CMakeLists.txt
+++ b/tests/system_io/read_file_content/CMakeLists.txt
@@ -6,7 +6,12 @@ set(SOURCE_FILES read_file_content.cpp)
 # Executable and link
 ################################
 add_executable(${TARGET_NAME} ${SOURCE_FILES} $<TARGET_OBJECTS:common> )
-target_link_libraries(${TARGET_NAME} test_common Threads::Threads)
+
+#Add all necessary common libraries
+GET_PROPERTY(HIDRA2_COMMON_IO_LIBRARIES GLOBAL PROPERTY HIDRA2_COMMON_IO_LIBRARIES)
+target_link_libraries(${TARGET_NAME} ${HIDRA2_COMMON_IO_LIBRARIES})
+
+target_link_libraries(${TARGET_NAME} test_common)
 target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/common/cpp/include)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
 
diff --git a/tests/system_io/read_files_in_folder/CMakeLists.txt b/tests/system_io/read_files_in_folder/CMakeLists.txt
index 3e2df78a2cc62723e8885b80b00b1df3cc0953d6..41ac8e62a551ca0f37d45acf7dfd1676aa09efcb 100644
--- a/tests/system_io/read_files_in_folder/CMakeLists.txt
+++ b/tests/system_io/read_files_in_folder/CMakeLists.txt
@@ -6,7 +6,12 @@ set(SOURCE_FILES read_folder_content.cpp)
 # Executable and link
 ################################
 add_executable(${TARGET_NAME} ${SOURCE_FILES}  $<TARGET_OBJECTS:common>)
-target_link_libraries(${TARGET_NAME} test_common Threads::Threads)
+
+#Add all necessary common libraries
+GET_PROPERTY(HIDRA2_COMMON_IO_LIBRARIES GLOBAL PROPERTY HIDRA2_COMMON_IO_LIBRARIES)
+target_link_libraries(${TARGET_NAME} ${HIDRA2_COMMON_IO_LIBRARIES})
+
+target_link_libraries(${TARGET_NAME} test_common)
 target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/common/cpp/include)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
 
diff --git a/tests/worker/connect_multithread/CMakeLists.txt b/tests/worker/connect_multithread/CMakeLists.txt
index 31364d77e74b1b833bc6d06d63105fbdf967f9f6..abe83367dc6b2796d7ca4d734b6ed4d37b8ed167 100644
--- a/tests/worker/connect_multithread/CMakeLists.txt
+++ b/tests/worker/connect_multithread/CMakeLists.txt
@@ -6,7 +6,7 @@ set(SOURCE_FILES content_multithread.cpp)
 # Executable and link
 ################################
 add_executable(${TARGET_NAME} ${SOURCE_FILES})
-target_link_libraries(${TARGET_NAME} test_common hidra2-worker ${CMAKE_THREAD_LIBS_INIT})
+target_link_libraries(${TARGET_NAME} test_common hidra2-worker ${HIDRA2_COMMON_IO_LIBRARIES})
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
 if (CMAKE_COMPILER_IS_GNUCXX)
     set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS_DEBUG "--coverage")
diff --git a/tests/worker/next_multithread/CMakeLists.txt b/tests/worker/next_multithread/CMakeLists.txt
index ebcabc40c0bfff2b9947f1d7cdbe4e80fb73b77c..db2a6e5c0c41bbb83d18f4283234164f11fed104 100644
--- a/tests/worker/next_multithread/CMakeLists.txt
+++ b/tests/worker/next_multithread/CMakeLists.txt
@@ -6,7 +6,12 @@ set(SOURCE_FILES next_multithread.cpp)
 # Executable and link
 ################################
 add_executable(${TARGET_NAME} ${SOURCE_FILES})
-target_link_libraries(${TARGET_NAME} test_common hidra2-worker Threads::Threads)
+
+#Add all necessary common libraries
+GET_PROPERTY(HIDRA2_COMMON_IO_LIBRARIES GLOBAL PROPERTY HIDRA2_COMMON_IO_LIBRARIES)
+target_link_libraries(${TARGET_NAME} ${HIDRA2_COMMON_IO_LIBRARIES})
+
+target_link_libraries(${TARGET_NAME} test_common hidra2-worker)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
 if (CMAKE_COMPILER_IS_GNUCXX)
     set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS_DEBUG "--coverage")