diff --git a/producer/event_monitor_producer/CMakeLists.txt b/producer/event_monitor_producer/CMakeLists.txt
index dd3ec147dc90ddb8732c1520169c9f3787da3417..8809a62247447bf36f6b5f9c72df2be81b79ae96 100644
--- a/producer/event_monitor_producer/CMakeLists.txt
+++ b/producer/event_monitor_producer/CMakeLists.txt
@@ -7,7 +7,7 @@ set(SOURCE_FILES
 )
 
 IF(WIN32)
-    set(SOURCE_FILES ${SOURCE_FILES} src/system_folder_watch_windows.cpp)
+    set(SOURCE_FILES ${SOURCE_FILES} src/system_folder_watch_windows.cpp src/single_folder_monitor.cpp)
 ELSEIF(UNIX)
     set(SOURCE_FILES ${SOURCE_FILES} src/system_folder_watch_linux.cpp src/inotify_event.cpp src/inotify_linux.cpp)
 ENDIF(WIN32)
@@ -55,7 +55,9 @@ set(TEST_SOURCE_FILES
 
 IF(UNIX)
 set(TEST_SOURCE_FILES ${TEST_SOURCE_FILES} unittests/test_system_folder_watch_linux.cpp)
-ENDIF(WIN32)
+ELSE()
+set(TEST_SOURCE_FILES ${TEST_SOURCE_FILES} unittests/test_system_folder_watch_windows.cpp)
+ENDIF(UNIX)
 
 
 set(TEST_LIBRARIES "${TARGET_NAME}")
diff --git a/producer/event_monitor_producer/src/single_folder_monitor.cpp b/producer/event_monitor_producer/src/single_folder_monitor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..390e0fef8643af6bd3ff6b6d924ad46f1ba8ea14
--- /dev/null
+++ b/producer/event_monitor_producer/src/single_folder_monitor.cpp
@@ -0,0 +1,13 @@
+#include "single_folder_monitor.h"
+
+namespace asapo {
+
+SingleFolderMonitor::SingleFolderMonitor(std::string root_folder, std::string folder) : root_folder_{std::move(root_folder)},
+                                                                                        folder_{std::move(folder)} {
+
+}
+
+void SingleFolderMonitor::Monitor() {
+}
+
+}
diff --git a/producer/event_monitor_producer/src/single_folder_monitor.h b/producer/event_monitor_producer/src/single_folder_monitor.h
new file mode 100644
index 0000000000000000000000000000000000000000..0a537984de64dea44c03891805725eabde5c8299
--- /dev/null
+++ b/producer/event_monitor_producer/src/single_folder_monitor.h
@@ -0,0 +1,19 @@
+#ifndef ASAPO_SINGLE_FOLDER_MONITOR_H
+#define ASAPO_SINGLE_FOLDER_MONITOR_H
+
+#include <string>
+
+namespace asapo {
+
+class SingleFolderMonitor {
+  public:
+    explicit SingleFolderMonitor(std::string root_folder,std::string folder);
+    void Monitor();
+ private:
+  std::string root_folder_;
+  std::string folder_;
+};
+
+}
+
+#endif //ASAPO_SINGLE_FOLDER_MONITOR_H
diff --git a/producer/event_monitor_producer/src/system_folder_watch_windows.cpp b/producer/event_monitor_producer/src/system_folder_watch_windows.cpp
index c721862cd7dd254fbba4820cc85e78e5655cb85a..7c9367877d2ad5dbbf1565895de3bc956819d209 100644
--- a/producer/event_monitor_producer/src/system_folder_watch_windows.cpp
+++ b/producer/event_monitor_producer/src/system_folder_watch_windows.cpp
@@ -1,9 +1,35 @@
 #include "system_folder_watch_windows.h"
 
+#include <windows.h>
+#include <memory>
+
+#include "io/io_factory.h"
+#include "single_folder_monitor.h"
+
 namespace asapo {
 
 Error SystemFolderWatch::StartFolderMonitor(const std::string& root_folder,
                                             const std::vector<std::string>& monitored_folders) {
+    for (auto& folder:monitored_folders ) {
+    auto thread = io__->NewThread([root_folder, folder] {
+      auto folder_monitor = std::unique_ptr<SingleFolderMonitor>(new SingleFolderMonitor(root_folder, folder));
+      folder_monitor->Monitor();
+    });
+
+    if (thread) {
+        thread->detach();
+    }
+    }
+/*
+    HANDLE hDir = CreateFile(
+        root_folder.c_str(),
+        FILE_LIST_DIRECTORY,
+        FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
+        NULL,
+        OPEN_EXISTING,
+        FILE_FLAG_BACKUP_SEMANTICS,
+        NULL);
+*/
     return nullptr;
 }
 
@@ -12,7 +38,9 @@ FilesToSend SystemFolderWatch::GetFileList(Error* err) {
     *err = nullptr;
     return events;
 }
+SystemFolderWatch::SystemFolderWatch() :io__{GenerateDefaultIO()}{
 
+}
 
 }
 
diff --git a/producer/event_monitor_producer/src/system_folder_watch_windows.h b/producer/event_monitor_producer/src/system_folder_watch_windows.h
index 2cfe53a85d5f9ecc54eb150fabde463abc556389..b4d936e308f0997b4653151e8c5b36834ab1d41c 100644
--- a/producer/event_monitor_producer/src/system_folder_watch_windows.h
+++ b/producer/event_monitor_producer/src/system_folder_watch_windows.h
@@ -15,9 +15,13 @@ namespace asapo {
 
 class SystemFolderWatch {
   public:
-    VIRTUAL Error StartFolderMonitor(const std::string& root_folder,
+  SystemFolderWatch();
+  VIRTUAL Error StartFolderMonitor(const std::string& root_folder,
                                      const std::vector<std::string>& monitored_folders);
     VIRTUAL FilesToSend GetFileList(Error* err);
+    std::unique_ptr<IO> io__;
+  private:
+
 };
 
 }
diff --git a/producer/event_monitor_producer/unittests/test_system_folder_watch_windows.cpp b/producer/event_monitor_producer/unittests/test_system_folder_watch_windows.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..300f6f8f1882eeb8f2cd2c81cf8de3bdc94dc20c
--- /dev/null
+++ b/producer/event_monitor_producer/unittests/test_system_folder_watch_windows.cpp
@@ -0,0 +1,83 @@
+#include <gtest/gtest.h>
+#include <gmock/gmock.h>
+
+#include "../src/system_folder_watch_windows.h"
+#include "../src/event_monitor_error.h"
+#include "../src/common.h"
+
+#include <unittests/MockIO.h>
+
+
+
+using ::testing::Return;
+using ::testing::_;
+using ::testing::DoAll;
+using ::testing::SetArgReferee;
+using ::testing::SetArgPointee;
+using ::testing::Gt;
+using ::testing::Eq;
+using ::testing::Ne;
+using ::testing::Mock;
+using ::testing::InSequence;
+using ::testing::HasSubstr;
+using testing::StrEq;
+
+using ::asapo::Error;
+using ::asapo::ErrorInterface;
+using asapo::FilesToSend;
+using asapo::SystemFolderWatch;
+using asapo::FileInfos;
+using asapo::FileInfo;
+
+namespace {
+
+
+TEST(SystemFolderWatch, Constructor) {
+    SystemFolderWatch watch;
+    ASSERT_THAT(dynamic_cast<asapo::IO*>(watch.io__.get()), Ne(nullptr));
+}
+
+FileInfos CreateTestFileInfos() {
+    FileInfos file_infos;
+    FileInfo fi;
+    fi.size = 100;
+    fi.name = "file1";
+    file_infos.push_back(fi);
+    fi.name = "subfolder/file2";
+    file_infos.push_back(fi);
+    return file_infos;
+}
+
+
+class SystemFolderWatchTests : public testing::Test {
+  public:
+    Error err;
+    ::testing::NiceMock<asapo::MockIO> mock_io;
+    SystemFolderWatch watch{};
+    std::string expected_root_folder = "/tmp";
+    std::vector<std::string> expected_folders{"test1", "test2"};
+    void SetUp() override {
+        watch.io__ = std::unique_ptr<asapo::IO> {&mock_io};
+    }
+    void TearDown() override {
+        watch.io__.release();
+    }
+};
+
+TEST_F(SystemFolderWatchTests, ErrorInitInotifyStartMonitoring) {
+
+
+    EXPECT_CALL(mock_io, NewThread_t(_)).Times(expected_folders.size()).
+        WillRepeatedly(
+        Return(nullptr)
+    );
+
+    auto err = watch.StartFolderMonitor(expected_root_folder, expected_folders);
+    ASSERT_THAT(err, Eq(nullptr));
+}
+
+
+
+
+
+}
\ No newline at end of file