diff --git a/src/base/net/stratum/BaseClient.cpp b/src/base/net/stratum/BaseClient.cpp
index f44415d58..325fce1c8 100644
--- a/src/base/net/stratum/BaseClient.cpp
+++ b/src/base/net/stratum/BaseClient.cpp
@@ -42,7 +42,8 @@ xmrig::BaseClient::BaseClient(int id, IClientListener *listener) :
     m_retries(5),
     m_failures(0),
     m_state(UnconnectedState),
-    m_retryPause(5000)
+    m_retryPause(5000),
+    m_enabled(true)
 {
 }
 
diff --git a/src/base/net/stratum/BaseClient.h b/src/base/net/stratum/BaseClient.h
index 9e1c7ffbc..56bdc1263 100644
--- a/src/base/net/stratum/BaseClient.h
+++ b/src/base/net/stratum/BaseClient.h
@@ -64,7 +64,8 @@ protected:
         HostLookupState,
         ConnectingState,
         ConnectedState,
-        ClosingState
+        ClosingState,
+        ReconnectingState
     };
 
     inline bool isQuiet() const { return m_quiet || m_failures >= m_retries; }
diff --git a/src/base/net/stratum/Client.cpp b/src/base/net/stratum/Client.cpp
index 1da416928..229147ba2 100644
--- a/src/base/net/stratum/Client.cpp
+++ b/src/base/net/stratum/Client.cpp
@@ -70,21 +70,15 @@ static const char *states[] = {
     "host-lookup",
     "connecting",
     "connected",
-    "closing"
+    "closing",
+    "reconnecting"
 };
 #endif
 
 
 xmrig::Client::Client(int id, const char *agent, IClientListener *listener) :
     BaseClient(id, listener),
-    m_agent(agent),
-    m_tls(nullptr),
-    m_expire(0),
-    m_jobs(0),
-    m_keepAlive(0),
-    m_key(0),
-    m_stream(nullptr),
-    m_socket(nullptr)
+    m_agent(agent)
 {
     m_key = m_storage.add(this);
     m_dns = new Dns(this);
@@ -238,8 +232,12 @@ void xmrig::Client::tick(uint64_t now)
         return;
     }
 
-    if (m_expire && now > m_expire && m_state == ConnectingState) {
-        connect();
+    if (m_state == ReconnectingState && m_expire && now > m_expire) {
+        return connect();
+    }
+
+    if (m_state == ConnectingState && m_expire && now > m_expire) {
+        return reconnect();
     }
 }
 
@@ -449,7 +447,6 @@ int xmrig::Client::resolve(const String &host)
 {
     setState(HostLookupState);
 
-    m_expire = 0;
     m_recvBuf.reset();
 
     if (m_failures == -1) {
@@ -814,12 +811,10 @@ void xmrig::Client::reconnect()
         return m_listener->onClose(this, -1);
     }
 
-    setState(ConnectingState);
+    setState(ReconnectingState);
 
     m_failures++;
     m_listener->onClose(this, static_cast<int>(m_failures));
-
-    m_expire = Chrono::steadyMSecs() + m_retryPause;
 }
 
 
@@ -831,6 +826,23 @@ void xmrig::Client::setState(SocketState state)
         return;
     }
 
+    switch (state) {
+    case HostLookupState:
+        m_expire = 0;
+        break;
+
+    case ConnectingState:
+        m_expire = Chrono::steadyMSecs() + kConnectTimeout;
+        break;
+
+    case ReconnectingState:
+        m_expire = Chrono::steadyMSecs() + m_retryPause;
+        break;
+
+    default:
+        break;
+    }
+
     m_state = state;
 }
 
diff --git a/src/base/net/stratum/Client.h b/src/base/net/stratum/Client.h
index 46030abaf..ff2bf7f6a 100644
--- a/src/base/net/stratum/Client.h
+++ b/src/base/net/stratum/Client.h
@@ -56,12 +56,13 @@ class JobResult;
 class Client : public BaseClient, public IDnsListener, public ILineListener
 {
 public:
-    constexpr static int kResponseTimeout = 20 * 1000;
+    constexpr static uint64_t kConnectTimeout  = 20 * 1000;
+    constexpr static uint64_t kResponseTimeout = 20 * 1000;
 
 #   ifdef XMRIG_FEATURE_TLS
-    constexpr static int kInputBufferSize = 1024 * 16;
+    constexpr static size_t kInputBufferSize = 1024 * 16;
 #   else
-    constexpr static int kInputBufferSize = 1024 * 2;
+    constexpr static size_t kInputBufferSize = 1024 * 2;
 #   endif
 
     Client(int id, const char *agent, IClientListener *listener);
@@ -122,19 +123,19 @@ private:
 
     static inline Client *getClient(void *data) { return m_storage.get(data); }
 
-    char m_sendBuf[2048];
+    char m_sendBuf[2048] = { 0 };
     const char *m_agent;
     Dns *m_dns;
     RecvBuf<kInputBufferSize> m_recvBuf;
     std::bitset<EXT_MAX> m_extensions;
     String m_rpcId;
-    Tls *m_tls;
-    uint64_t m_expire;
-    uint64_t m_jobs;
-    uint64_t m_keepAlive;
-    uintptr_t m_key;
-    uv_stream_t *m_stream;
-    uv_tcp_t *m_socket;
+    Tls *m_tls                  = nullptr;
+    uint64_t m_expire           = 0;
+    uint64_t m_jobs             = 0;
+    uint64_t m_keepAlive        = 0;
+    uintptr_t m_key             = 0;
+    uv_stream_t *m_stream       = nullptr;
+    uv_tcp_t *m_socket          = nullptr;
 
     static Storage<Client> m_storage;
 };