diff --git a/MSVC/config.h b/MSVC/config.h
index 70f6085abfbd71789e66e39daccb492b1bf4e57a..7b7f9b4a922c73d9e7e05317b330c9f8e09ce676 100644
--- a/MSVC/config.h
+++ b/MSVC/config.h
@@ -62,7 +62,7 @@ systems. This function is required for `alloca.c' support on those systems.
 #define HAVE_LIBINTL_H 0
 
 /* Define if you have libupnp */
-#define HAVE_LIBUPNP 0
+#define HAVE_LIBUPNP 1
 
 /* Define to 1 if you have the <limits.h> header file. */
 #define HAVE_LIMITS_H 1
diff --git a/MSVC/ring-daemon.vcxproj b/MSVC/ring-daemon.vcxproj
index 19635e1b9babd61e37c3e4402951cdf5a6e26fc1..af72c609dc5b31d2127c82b38949d874b7d5c877 100644
--- a/MSVC/ring-daemon.vcxproj
+++ b/MSVC/ring-daemon.vcxproj
@@ -442,7 +442,7 @@
       </Command>
     </PreBuildEvent>
     <Lib>
-      <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;kernel32.lib;advapi32.lib;avcodec.lib;avdevice.lib;avfilter.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;libsamplerate.lib;libsndfile.lib;libgnutls.lib;lib_json.lib;opendht.lib;argon.lib;blake.lib;pcre.lib;pjlib.lib;pjlib_util.lib;pjmedia.lib;pjmedia_codec.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;yaml-cpp.lib;PA_UWP_TEST.lib;libspeex-pj.lib;cryptlib.lib;libboost_random-vc140-mt-1_61.lib;libboost_random-vc140-mt-gd-1_61.lib;libboost_system-vc140-mt-1_61.lib;libboost_system-vc140-mt-gd-1_61.lib;libboost_thread-vc140-mt-1_61.lib;libboost_thread-vc140-mt-gd-1_61.lib;libboost_date_time-vc140-mt-1_61.lib;libboost_date_time-vc140-mt-gd-1_61.lib;libboost_chrono-vc140-mt-1_61.lib;libboost_chrono-vc140-mt-gd-1_61.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>ws2_32.lib;iphlpapi.lib;kernel32.lib;advapi32.lib;avcodec.lib;avdevice.lib;avfilter.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;libsamplerate.lib;libsndfile.lib;libgnutls.lib;lib_json.lib;opendht.lib;argon.lib;blake.lib;pcre.lib;pjlib.lib;pjlib_util.lib;pjmedia.lib;pjmedia_codec.lib;pjnath.lib;pjsip_core.lib;pjsip_simple.lib;pjsip_ua.lib;pjsua2_lib.lib;pjsua_lib.lib;yaml-cpp.lib;PA_UWP_TEST.lib;libupnp.lib;libspeex-pj.lib;cryptlib.lib;system.lib;random.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\..\FFmpegInterop\ffmpeg\Build\Windows10\x64\bin;..\contrib\lib\x64;..\contrib\boost\stage\lib</AdditionalLibraryDirectories>
       <AdditionalOptions>/ignore:4006 /ignore:4221 %(AdditionalOptions)</AdditionalOptions>
       <LinkTimeCodeGeneration>true</LinkTimeCodeGeneration>
diff --git a/src/client/ring_signal.cpp b/src/client/ring_signal.cpp
index b57fbdfb7f90c21ce35287950f9a92bc7ad1955d..86f6de1ed09f40fc61b95cabe1ac315858dd5782 100644
--- a/src/client/ring_signal.cpp
+++ b/src/client/ring_signal.cpp
@@ -77,6 +77,7 @@ getSignalHandlers()
 #endif
 #ifdef WIN32_NATIVE
         exported_callback<DRing::ConfigurationSignal::GetAppDataPath>(),
+        exported_callback<DRing::ConfigurationSignal::GetAppUserName>(),
 #endif
 
         /* Presence */
diff --git a/src/dring/configurationmanager_interface.h b/src/dring/configurationmanager_interface.h
index 050290b7b330706b1039f59c4ca1423052bc018a..6e2f24154b580310c654d86981d72643e6d4dba8 100644
--- a/src/dring/configurationmanager_interface.h
+++ b/src/dring/configurationmanager_interface.h
@@ -259,6 +259,10 @@ struct ConfigurationSignal {
                 constexpr static const char* name = "GetAppDataPath";
                 using cb_type = void(std::vector<std::string>* paths);
         };
+        struct GetAppUserName {
+                constexpr static const char* name = "GetAppUserName";
+                using cb_type = void(std::vector<std::string>* names);
+        };
 #endif
 };
 
diff --git a/src/fileutils.cpp b/src/fileutils.cpp
index 7b3a61c13c74845c4f46bef19e2d1e920d90c792..6cc11bfab4c5365900041d023fcfc41585860798 100644
--- a/src/fileutils.cpp
+++ b/src/fileutils.cpp
@@ -247,8 +247,12 @@ writeTime(const std::string& path)
     if (ret)
         throw std::runtime_error("Can't check write time for: " + path);
     return std::chrono::system_clock::from_time_t(s.st_mtime);
+#else
+#if WIN32_NATIVE
+    HANDLE h = CreateFile2(ring::to_wstring(path).c_str(), GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr);
 #else
     HANDLE h = CreateFileW(ring::to_wstring(path).c_str(), GENERIC_READ, FILE_SHARE_READ,  nullptr,  OPEN_EXISTING,  FILE_ATTRIBUTE_NORMAL, nullptr);
+#endif
     if (h == INVALID_HANDLE_VALUE)
         throw std::runtime_error("Can't open: " + path);
     FILETIME lastWriteTime;
diff --git a/src/fileutils.h b/src/fileutils.h
index 454f7d7e814a7b8eeefda99e35965f3ca4b9e300..95c0e2e6f0d51d046fb48ec9af8818f7ddd37d5b 100644
--- a/src/fileutils.h
+++ b/src/fileutils.h
@@ -25,8 +25,12 @@
 #include <vector>
 #include <chrono>
 
+#ifndef WIN32_NATIVE
 #define PROTECTED_GETENV(str) ({char *envvar_ = getenv((str)); \
                                                    envvar_ ? envvar_ : "";})
+#else
+#define PROTECTED_GETENV(str) ({char *envvar_ = "" })
+#endif
 
 #define XDG_DATA_HOME           (PROTECTED_GETENV("XDG_DATA_HOME"))
 #define XDG_CONFIG_HOME         (PROTECTED_GETENV("XDG_CONFIG_HOME"))
diff --git a/src/hooks/urlhook.cpp b/src/hooks/urlhook.cpp
index dedfc563bedcccdc815613e2a519763d2eadb7fd..f2fecb1bcc9ae7c8fbe16c76211be9c8993fdcde 100644
--- a/src/hooks/urlhook.cpp
+++ b/src/hooks/urlhook.cpp
@@ -28,7 +28,11 @@ int UrlHook::runAction(const std::string &command, const std::string &args)
     //FIXME : use fork and execve, so no need to escape shell arguments
     const std::string cmd = command + (args.empty() ? "" : " ") +
                             "\"" + args + "\" &";
+#ifndef WIN32_NATIVE
     return system(cmd.c_str());
+#else
+    return 0;
+#endif
 }
 
 } // namespace ring
diff --git a/src/logger.cpp b/src/logger.cpp
index 222ee91374a800c5b60d4c9c3e21176287741faf..ac8859494377f4cb7e162053baf5643c50fcffdd 100644
--- a/src/logger.cpp
+++ b/src/logger.cpp
@@ -174,12 +174,12 @@ vlogger(const int level, const char *format, va_list ap)
         WORD color_prefix = LIGHT_GREEN;
 #else
         WORD color_prefix = FOREGROUND_GREEN;
-#endif
-        WORD color_header = CYAN;
         HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
         CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
         WORD saved_attributes;
 #endif
+        WORD color_header = CYAN;
+#endif
 
         switch (level) {
             case LOG_ERR:
@@ -191,8 +191,10 @@ vlogger(const int level, const char *format, va_list ap)
         }
 
 #ifdef _WIN32
+#if !defined(WIN32_NATIVE)
         GetConsoleScreenBufferInfo(hConsole, &consoleInfo);
         saved_attributes = consoleInfo.wAttributes;
+#endif
 #endif
 
         // must exist, check LOG_FORMAT
@@ -201,7 +203,9 @@ vlogger(const int level, const char *format, va_list ap)
 #ifndef _WIN32
             fputs(color_header, stderr);
 #else
+#if !defined(WIN32_NATIVE)
             SetConsoleTextAttribute(hConsole, color_header);
+#endif
 #endif
             std::string ctx(format, sep - format);
             format = sep + 2;
@@ -214,13 +218,17 @@ vlogger(const int level, const char *format, va_list ap)
 #ifndef _WIN32
             fputs(END_COLOR, stderr);
 #else
+#if !defined(WIN32_NATIVE)
             SetConsoleTextAttribute(hConsole, saved_attributes);
+#endif
 #endif
         }
 #ifndef _WIN32
         fputs(color_prefix, stderr);
 #else
+#if !defined(WIN32_NATIVE)
         SetConsoleTextAttribute(hConsole, color_prefix);
+#endif
 #endif
 
         vfprintf(stderr, format, ap);
@@ -230,7 +238,9 @@ vlogger(const int level, const char *format, va_list ap)
 #ifndef _WIN32
         fputs(END_COLOR, stderr);
 #else
+#if !defined(WIN32_NATIVE)
         SetConsoleTextAttribute(hConsole, saved_attributes);
+#endif
 #endif
 
     } else {
diff --git a/src/manager.cpp b/src/manager.cpp
index a1db1e23df757958fa39726cae8d6723aee90968..ab0bd13ce8bab264f2c98ddc1d205c53b44324c0 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -141,7 +141,9 @@ static constexpr const char* SIPLOGLEVEL = "SIPLOGLEVEL";
 static void
 setSipLogLevel()
 {
+#ifndef WIN32_NATIVE
     char* envvar = getenv(SIPLOGLEVEL);
+
     int level = 0;
 
     if (envvar != nullptr) {
@@ -153,6 +155,9 @@ setSipLogLevel()
     }
 
     pj_log_set_level(level);
+#else
+    pj_log_set_level(0);
+#endif
 }
 
 /**
@@ -172,6 +177,7 @@ tls_print_logs(int level, const char* msg)
 static void
 setGnuTlsLogLevel()
 {
+#ifndef WIN32_NATIVE
     char* envvar = getenv("RING_TLS_LOGLEVEL");
     int level = RING_TLS_LOGLEVEL;
 
@@ -185,6 +191,9 @@ setGnuTlsLogLevel()
     }
 
     gnutls_global_set_log_level(level);
+#else
+    gnutls_global_set_log_level(RING_TLS_LOGLEVEL);
+#endif
     gnutls_global_set_log_function(tls_print_logs);
 }
 
diff --git a/src/media/libav_utils.cpp b/src/media/libav_utils.cpp
index e5072748977349c46f7c98fcde313bd2a781247d..76f73b0a8879cc5dd5ce99ef4b407ad5e4cd5ab2 100644
--- a/src/media/libav_utils.cpp
+++ b/src/media/libav_utils.cpp
@@ -76,6 +76,7 @@ static constexpr const char* AVLOGLEVEL = "AVLOGLEVEL";
 static void
 setAvLogLevel()
 {
+#ifndef WIN32_NATIVE
     char* envvar = getenv(AVLOGLEVEL);
     signed level = AV_LOG_WARNING;
 
@@ -86,6 +87,9 @@ setAvLogLevel()
         level = std::max(AV_LOG_QUIET, std::min(level, AV_LOG_DEBUG));
     }
     av_log_set_level(level);
+#else
+    av_log_set_level(AV_LOG_WARNING);
+#endif
 }
 
 static void
diff --git a/src/sip/sipaccount.cpp b/src/sip/sipaccount.cpp
index 61311bafcf1236be9d2c24cd267bf37687ccbdee..96142e2ad3573803ca0784329375f354ba45bde6 100644
--- a/src/sip/sipaccount.cpp
+++ b/src/sip/sipaccount.cpp
@@ -1294,13 +1294,9 @@ std::string SIPAccount::getLoginName()
     struct passwd * user_info = getpwuid(getuid());
     return user_info ? user_info->pw_name : "";
 #elif defined (WIN32_NATIVE)
-    TCHAR username[UNLEN + 1];
-    DWORD size = UNLEN + 1;
-    std::string uname;
-    if (GetUserName((TCHAR*)username, &size)) {
-        uname = username;
-    }
-    return uname;
+    std::vector<std::string> unames;
+    emitSignal<DRing::ConfigurationSignal::GetAppUserName>(&unames);
+    return unames[0];
 #else
     TCHAR username[UNLEN + 1];
     DWORD size = UNLEN + 1;
diff --git a/src/winsyslog.c b/src/winsyslog.c
index 66235b5b96dd3562bd15d0885162036b1cd66944..dd9522a42a61f8f646f32631759658856bc49b24 100644
--- a/src/winsyslog.c
+++ b/src/winsyslog.c
@@ -65,7 +65,9 @@ getLastErrorText(                   // converts "Lasr Error" code into text
 
 void closelog(void)
 {
+#ifndef WIN32_NATIVE
     DeregisterEventSource(loghdl);
+#endif
     free(loghdr);
 }
 
@@ -83,6 +85,7 @@ void closelog(void)
 
     vsprintf(tmp, format, arglist);
 
+#ifndef WIN32_NATIVE
     arr[0] = tmp;
     BOOL err = ReportEvent(loghdl, (unsigned short) level, (unsigned short)level,
         level, NULL, 1, 0, arr, NULL);
@@ -92,6 +95,7 @@ void closelog(void)
         CHAR errText[1024];
         puts(getLastErrorText(errText, 1024));
     }
+#endif
 }
 
 /* Emulator for BSD openlog() routine
@@ -106,7 +110,9 @@ void closelog(void)
     if (loghdl) {
         closelog();
     }
+#ifndef WIN32_NATIVE
     loghdl = RegisterEventSource(NULL, ident);
+#endif
     sprintf(tmp, (logopt & WINLOG_PID) ? "%s[%d]" : "%s", ident, getpid());
     loghdr = _strdup(tmp);  /* save header for later */
 }