diff --git a/common/cpp/src/system_io/system_io.h b/common/cpp/src/system_io/system_io.h
index 2bc41c66d5eaac28319b57fcca1cf25cbeb689e6..a78b7b73617c68272f1ce2468abd555abb774abd 100644
--- a/common/cpp/src/system_io/system_io.h
+++ b/common/cpp/src/system_io/system_io.h
@@ -74,6 +74,10 @@ class SystemIO final : public IO {
     const int kMaxEpollEvents = 10;
     mutable int epoll_fd_ = -1;
     Error AddToEpool(SocketDescriptor sd) const;
+    Error CreateEpoolIfNeeded(SocketDescriptor master_socket) const;
+    Error ProcessNewConnection(SocketDescriptor master_socket, std::vector<std::string>* new_connections,
+                               ListSocketDescriptors* sockets_to_listen) const;
+
 #endif
   public:
     ~SystemIO();
diff --git a/common/cpp/src/system_io/system_io_linux.cpp b/common/cpp/src/system_io/system_io_linux.cpp
index 778830af1a0bca7d2aae41aa2d49d1979ee5beb6..a072e24981609790b2291f92b4f3d98cd7af1982 100644
--- a/common/cpp/src/system_io/system_io_linux.cpp
+++ b/common/cpp/src/system_io/system_io_linux.cpp
@@ -303,36 +303,48 @@ Error SystemIO::AddToEpool(SocketDescriptor sd) const {
     return nullptr;
 }
 
+Error SystemIO::CreateEpoolIfNeeded(SocketDescriptor master_socket) const {
+    if (epoll_fd_ != kDisconnectedSocketDescriptor) {
+        return nullptr;
+    }
+
+    epoll_fd_ = epoll_create1(0);
+    if(epoll_fd_ == kDisconnectedSocketDescriptor) {
+        auto err = GetLastError();
+        err->Append("Create epoll");
+        return err;
+    }
+    return AddToEpool(master_socket);
+}
+
+
+Error SystemIO::ProcessNewConnection(SocketDescriptor master_socket, std::vector<std::string>* new_connections,
+                                     ListSocketDescriptors* sockets_to_listen) const {
+    Error err;
+    auto client_info_tuple = InetAcceptConnection(master_socket, &err);
+    if (err) {
+        return err;
+    }
+    std::string client_address;
+    SocketDescriptor client_fd;
+    std::tie(client_address, client_fd) = *client_info_tuple;
+    new_connections->emplace_back(std::move(client_address));
+    sockets_to_listen->push_back(client_fd);
+    return AddToEpool(client_fd);
+}
+
 ListSocketDescriptors SystemIO::WaitSocketsActivity(SocketDescriptor master_socket,
         ListSocketDescriptors* sockets_to_listen,
         std::vector<std::string>* new_connections,
         Error* err) const {
-    if (epoll_fd_ == kDisconnectedSocketDescriptor) {
-        epoll_fd_ = epoll_create1(0);
-        if(epoll_fd_ == kDisconnectedSocketDescriptor) {
-            *err = GetLastError();
-            (*err)->Append("Create epoll");
-            return {};
-        }
-    }
 
-    struct epoll_event events[kMaxEpollEvents];
+    CreateEpoolIfNeeded(master_socket);
 
-    *err = AddToEpool(master_socket);
-    if (*err) {
-        return {};
-    }
-    for (auto sd : *sockets_to_listen) {
-        *err = AddToEpool(sd);
-        if (*err) {
-            return {};
-        }
-    }
 
     ListSocketDescriptors active_sockets;
     bool client_activity = false;
     while (!client_activity) {
-
+        struct epoll_event events[kMaxEpollEvents];
         auto event_count = epoll_wait(epoll_fd_, events, kMaxEpollEvents, kWaitTimeoutMs);
         if (event_count == 0) { // timeout
             *err = IOErrorTemplates::kTimeout.Generate();
@@ -350,19 +362,10 @@ ListSocketDescriptors SystemIO::WaitSocketsActivity(SocketDescriptor master_sock
                 active_sockets.push_back(sd);
                 client_activity = true;
             } else {
-                auto client_info_tuple = InetAcceptConnection(master_socket, err);
-                if (*err) {
-                    return {};
-                }
-                std::string client_address;
-                SocketDescriptor client_fd;
-                std::tie(client_address, client_fd) = *client_info_tuple;
-                new_connections->emplace_back(std::move(client_address));
-                *err = AddToEpool(client_fd);
+                *err = ProcessNewConnection(master_socket, new_connections, sockets_to_listen);
                 if (*err) {
                     return {};
                 }
-                sockets_to_listen->push_back(client_fd);
             }
         }
     }
diff --git a/tests/automatic/system_io/ip_tcp_network/client_serv_multicon/multicon.cpp b/tests/automatic/system_io/ip_tcp_network/client_serv_multicon/multicon.cpp
index 2440ff2cae20516b31b0becc4db37564d3638476..37e5af9be97177eaae7c3c30f061a2cf3206736a 100644
--- a/tests/automatic/system_io/ip_tcp_network/client_serv_multicon/multicon.cpp
+++ b/tests/automatic/system_io/ip_tcp_network/client_serv_multicon/multicon.cpp
@@ -59,7 +59,7 @@ std::unique_ptr<std::thread> CreateEchoServerThread() {
                     ExitIfErrIsNotOk(&err, 106);
                     std::cout << "[SERVER] socket closed " << socket << std::endl;
                     sockets_to_listen.erase(std::remove(sockets_to_listen.begin(), sockets_to_listen.end(), socket),
-                    sockets_to_listen.end());
+                                            sockets_to_listen.end());
                     continue;
                 }
                 ExitIfErrIsNotOk(&err, 104);