diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4f0a10ab591212ab9611e39b286c2c94bea682cf..9fa7ba33102558c1a6262cc7cd24b4af65ce55ef 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,6 @@
 cmake_minimum_required(VERSION 2.8)
 set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
 
 project(HIDRA2)
 
diff --git a/CMakeModules/testing_cpp.cmake b/CMakeModules/testing_cpp.cmake
index 3cb0222d560610bc6a47c653953f4680a0dc9863..2702cef342c133313c7b037d46d7c93f491be6fa 100644
--- a/CMakeModules/testing_cpp.cmake
+++ b/CMakeModules/testing_cpp.cmake
@@ -4,13 +4,23 @@ if (BUILD_TESTS)
     find_package(Threads)
     find_program(MEMORYCHECK_COMMAND valgrind)
     set(MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full --error-exitcode=1")
+    set (gtest_SOURCE_DIR "C:/googletest")
 endif ()
 
 function(gtest target test_source_files test_libraries)
     if (BUILD_TESTS)
         include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
+        link_directories(${gtest_SOURCE_DIR}/lib)
         add_executable(test-${target} ${test_source_files})
-        target_link_libraries(test-${target} gtest gmock gtest_main ${CMAKE_THREAD_LIBS_INIT})
+
+        IF(WIN32 AND ${CMAKE_BUILD_TYPE} STREQUAL "Debug")
+            set(GTEST_LIBS gtestd gtest_maind gmockd)
+        ELSE()
+            set(GTEST_LIBS gtest gmock gtest_main)
+        ENDIF(WIN32 AND ${CMAKE_BUILD_TYPE} STREQUAL "Debug")
+        target_link_libraries(test-${target} ${GTEST_LIBS} ${CMAKE_THREAD_LIBS_INIT})
+#        set_target_properties(test-${target} PROPERTIES COMPILE_FLAGS "-DGTEST_LINKED_AS_SHARED_LIBRARY=1")
+
         if (NOT ${test_libraries} STREQUAL "")
             target_link_libraries(test-${target} ${test_libraries})
         endif ()
diff --git a/common/cpp/CMakeLists.txt b/common/cpp/CMakeLists.txt
index 9fef72369fe9e54a7a690a3582b413860c83b879..0cf8083f69350326fd392932637447988a07dffc 100644
--- a/common/cpp/CMakeLists.txt
+++ b/common/cpp/CMakeLists.txt
@@ -6,7 +6,7 @@ set(SOURCE_FILES
         include/system_wrappers/system_io.h
         src/system_io.cpp)
 IF(WIN32)
-    # Do windows specific includes
+    set(SOURCE_FILES ${SOURCE_FILES} src/system_io_windows.cpp)
 ELSEIF(UNIX)
     set(SOURCE_FILES ${SOURCE_FILES} src/system_io_linux.cpp)
 ENDIF(WIN32)
@@ -15,7 +15,7 @@ ENDIF(WIN32)
 ################################
 # Library
 ################################
-#add_library(${TARGET_NAME} SHARED STATIC ${SOURCE_FILES})
-add_library(${TARGET_NAME} SHARED ${SOURCE_FILES})
+add_library(${TARGET_NAME} STATIC ${SOURCE_FILES})
+#add_library(${TARGET_NAME} SHARED ${SOURCE_FILES})
 target_include_directories(${TARGET_NAME} PUBLIC include)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
diff --git a/common/cpp/include/system_wrappers/io.h b/common/cpp/include/system_wrappers/io.h
index 059b376c50001b308fca8b5110a2e876e8beef9c..ad34debca7861a7d1744aa9727f63c14b606b599 100644
--- a/common/cpp/include/system_wrappers/io.h
+++ b/common/cpp/include/system_wrappers/io.h
@@ -9,6 +9,14 @@
 
 #include "common/file_info.h"
 
+#ifdef __linux__
+#include <unistd.h>
+#elif defined(_MSC_VER)
+#include <BaseTsd.h>
+typedef SSIZE_T ssize_t;
+#endif
+
+
 namespace hidra2 {
 
 
diff --git a/common/cpp/src/system_io.cpp b/common/cpp/src/system_io.cpp
index c92dbb0f15e223ac173818e4eed196501abad5df..f445aca170622a6e68134e18d726883cd41e5a5a 100644
--- a/common/cpp/src/system_io.cpp
+++ b/common/cpp/src/system_io.cpp
@@ -1,7 +1,15 @@
 #include <fcntl.h>
-#include <unistd.h>
 #include <iostream>
 
+#ifdef __linux__
+#include <unistd.h>
+#elif defined(_MSC_VER)
+#include <BaseTsd.h>
+typedef SSIZE_T ssize_t;
+#endif
+
+#include <io.h>
+
 #include <system_wrappers/system_io.h>
 
 namespace hidra2 {
diff --git a/common/cpp/src/system_io_windows.cpp b/common/cpp/src/system_io_windows.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c013110c2460c84662210e7bf1b7ffa2f6a3c564
--- /dev/null
+++ b/common/cpp/src/system_io_windows.cpp
@@ -0,0 +1,43 @@
+#include "system_wrappers/system_io.h"
+
+#include <cstring>
+
+//#include <dirent.h>
+
+#include <sys/stat.h>
+#include <algorithm>
+
+#include <cerrno>
+
+using std::string;
+using std::vector;
+using std::chrono::system_clock;
+
+namespace hidra2 {
+
+IOErrors IOErrorFromErrno() {
+    IOErrors err;
+    switch (errno) {
+    case 0:
+        err = IOErrors::NO_ERROR;
+        break;
+    case ENOENT:
+    case ENOTDIR:
+        err = IOErrors::FILE_NOT_FOUND;
+        break;
+    case EACCES:
+        err = IOErrors::PERMISSIONS_DENIED;
+        break;
+    default:
+        err = IOErrors::UNKWOWN_ERROR;
+        break;
+    }
+    return err;
+}
+
+std::vector<FileInfo> SystemIO::FilesInFolder(const string& folder, IOErrors* err) {
+    std::vector<FileInfo> files{};
+    return files;
+}
+
+}
diff --git a/examples/worker/CMakeLists.txt b/examples/worker/CMakeLists.txt
index 29337dc4b69ef7ab0e9d611340302fa61a26b871..6e1b685bef619d6cb4fe8f70002c4fd1a85d7caf 100644
--- a/examples/worker/CMakeLists.txt
+++ b/examples/worker/CMakeLists.txt
@@ -1,3 +1,5 @@
+find_package(Threads)
+
 add_subdirectory(process_folder)
 
 
diff --git a/examples/worker/process_folder/CMakeLists.txt b/examples/worker/process_folder/CMakeLists.txt
index eeb7f2dbc28f3ef201cc503f870f361745627d58..4bfa9c3d6c9b34c45dfa04c75bf6f372d167143a 100644
--- a/examples/worker/process_folder/CMakeLists.txt
+++ b/examples/worker/process_folder/CMakeLists.txt
@@ -9,7 +9,7 @@ set(SOURCE_FILES process_folder.cpp)
 #set(CMAKE_FIND_STATIC FIRST)
 #endif()
 add_executable(${TARGET_NAME} ${SOURCE_FILES})
-target_link_libraries(${TARGET_NAME} common worker-api pthread)
+target_link_libraries(${TARGET_NAME} common worker-api ${CMAKE_THREAD_LIBS_INIT})
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
 #set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS "-static-libstdc++")
 
diff --git a/producer/api/CMakeLists.txt b/producer/api/CMakeLists.txt
index 40d5bc8d8b6be2872438fab2b77b918ac6e67ae3..b09e6b457682248e75714f06ae09abac04db1761 100644
--- a/producer/api/CMakeLists.txt
+++ b/producer/api/CMakeLists.txt
@@ -5,7 +5,7 @@ set(SOURCE_FILES src/producer/producer.cpp include/producer/producer.h)
 ################################
 # Library
 ################################
-add_library(${TARGET_NAME} SHARED ${SOURCE_FILES})
+add_library(${TARGET_NAME} STATIC ${SOURCE_FILES})
 target_include_directories(${TARGET_NAME} PUBLIC include)
 target_link_libraries(${TARGET_NAME} common)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 4eea8d27aa7eff0f085f0ca752702bfc8af8dff2..59f4f821490ae92d100eb149f744ba95710c5ff6 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,4 +1,5 @@
 CMAKE_MINIMUM_REQUIRED(VERSION 3.7) # needed for fixtures
+find_package(Threads)
 
 add_subdirectory(common/cpp)
 add_subdirectory(system_io)
diff --git a/tests/common/cpp/CMakeLists.txt b/tests/common/cpp/CMakeLists.txt
index 1857e8929b889ab4f74f5fe5abb029b4e475c74b..1eec82d9fb06edce8549838ed1a56c15b5a20f45 100644
--- a/tests/common/cpp/CMakeLists.txt
+++ b/tests/common/cpp/CMakeLists.txt
@@ -5,6 +5,6 @@ set(SOURCE_FILES
 ################################
 # Library
 ################################
-add_library(${TARGET_NAME} SHARED ${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)
diff --git a/tests/worker/connect_multithread/CMakeLists.txt b/tests/worker/connect_multithread/CMakeLists.txt
index b4baf2ec9273079d95493404753e2d3ed913e3f1..5d7cc640fff60b4ffddd5207355edc0583992cbd 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 common worker-api pthread)
+target_link_libraries(${TARGET_NAME} test_common common worker-api ${CMAKE_THREAD_LIBS_INIT})
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
 
 ################################
diff --git a/tests/worker/next_multithread/CMakeLists.txt b/tests/worker/next_multithread/CMakeLists.txt
index 2e4fc652fb1ede80cd8bc116c52e05a74c119ebd..48cab62017f08a1d36b21d66dec918c141e98634 100644
--- a/tests/worker/next_multithread/CMakeLists.txt
+++ b/tests/worker/next_multithread/CMakeLists.txt
@@ -6,7 +6,7 @@ set(SOURCE_FILES next_multithread.cpp)
 # Executable and link
 ################################
 add_executable(${TARGET_NAME} ${SOURCE_FILES})
-target_link_libraries(${TARGET_NAME} test_common common worker-api pthread)
+target_link_libraries(${TARGET_NAME} test_common common worker-api  ${CMAKE_THREAD_LIBS_INIT})
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
 
 ################################
diff --git a/worker/api/cpp/CMakeLists.txt b/worker/api/cpp/CMakeLists.txt
index bb138ff79884ed7a8e66acc2d3a33eea849b6cda..da84ebcfb01cfd3b01e0b9d196ee5fe41d0398ef 100644
--- a/worker/api/cpp/CMakeLists.txt
+++ b/worker/api/cpp/CMakeLists.txt
@@ -6,8 +6,8 @@ set(SOURCE_FILES include/worker/data_broker.h src/data_broker.cpp src/folder_dat
 ################################
 # Library
 ################################
-add_library(${TARGET_NAME} SHARED ${SOURCE_FILES})
-#add_library(${TARGET_NAME} SHARED STATIC ${SOURCE_FILES})
+#add_library(${TARGET_NAME} SHARED ${SOURCE_FILES})
+add_library(${TARGET_NAME} STATIC ${SOURCE_FILES})
 
 target_include_directories(${TARGET_NAME} PUBLIC include)
 target_link_libraries(${TARGET_NAME} common)
diff --git a/worker/api/cpp/src/folder_data_broker.cpp b/worker/api/cpp/src/folder_data_broker.cpp
index 2696f73eb08567c67e57025b6a9ed7ad79394c29..b989170dbe180b735216cd72313d77a72fd75980 100644
--- a/worker/api/cpp/src/folder_data_broker.cpp
+++ b/worker/api/cpp/src/folder_data_broker.cpp
@@ -58,7 +58,7 @@ WorkerErrorCode FolderDataBroker::CanGetData(FileInfo* info, FileData* data, int
         return WorkerErrorCode::WRONG_INPUT;
     }
 
-    if (nfile >= filelist_.size()) {
+    if (nfile >= (int) filelist_.size()) {
         return WorkerErrorCode::NO_DATA;
     }
     return WorkerErrorCode::OK;
diff --git a/worker/api/cpp/src/folder_data_broker.h b/worker/api/cpp/src/folder_data_broker.h
index 5fd4f08e432af9b3b383c8c97178652f513bcada..27d960172df27455c55688a5aead4c7f9dcb05e4 100644
--- a/worker/api/cpp/src/folder_data_broker.h
+++ b/worker/api/cpp/src/folder_data_broker.h
@@ -20,7 +20,7 @@ class FolderDataBroker final : public hidra2::DataBroker {
 
   private:
     bool is_connected_;
-    int64_t current_file_;
+    int current_file_;
     std::string base_path_;
     std::vector<FileInfo>  filelist_;
     WorkerErrorCode CanGetData(FileInfo* info, FileData* data, int nfile) const;