diff --git a/common/cpp/src/system_io/system_io.cpp b/common/cpp/src/system_io/system_io.cpp
index 29c2130170aa3a17b521caabd88dc1dde4969fee..51ac70d758e2dd537dbb7b1feac3255c7cb9c03d 100644
--- a/common/cpp/src/system_io/system_io.cpp
+++ b/common/cpp/src/system_io/system_io.cpp
@@ -5,7 +5,7 @@
 #include <cerrno>
 #include <cstring>
 #include <algorithm>
-
+#include <mutex>
 
 #if defined(__linux__) || defined (__APPLE__)
 #include <sys/socket.h>
@@ -290,8 +290,11 @@ int SystemIO::FileOpenModeToPosixFileOpenMode(int open_flags) const {
 }
 
 std::string SystemIO::ResolveHostnameToIp(const std::string& hostname, Error* err) const {
-    hostent* record = gethostbyname(hostname.c_str());
-    if (record == nullptr) {
+    static std::mutex lock;
+    std::unique_lock<std::mutex> local_lock(lock);
+
+    const hostent* record = gethostbyname(hostname.c_str()); // gethostbyname seems not to be thread safe!
+    if (record == nullptr || record->h_addr == nullptr) {
         *err = IOErrorTemplates::kUnableToResolveHostname.Generate();
         return "";
     }
@@ -312,12 +315,10 @@ std::unique_ptr<sockaddr_in> SystemIO::BuildSockaddrIn(const std::string& addres
     uint16_t port = 0;
     std::tie(host, port) = *hostname_port_tuple;
 
-// this is not thread safe call we should not resolve hostname here - we actually already have ip in address.
-// todo: remove this
-//    host = ResolveHostnameToIp(host, err);
-//    if (*err != nullptr) {
-//        return nullptr;
-//    }
+    host = ResolveHostnameToIp(host, err);
+    if (*err != nullptr) {
+        return nullptr;
+    }
 
     short family = AddressFamilyToPosixFamily(AddressFamilies::INET);
     if (family == -1) {