diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp
index 221b230..c50df87 100644
--- a/src/MqttClient.cpp
+++ b/src/MqttClient.cpp
@@ -657,6 +657,20 @@ int MqttClient::connect(const char *host, uint16_t port)
   return connect((uint32_t)0, host, port);
 }
 
+#ifdef ARDUINO_ARCH_ESP32
+int MqttClient::connect(IPAddress ip, uint16_t port, int32_t timeout)
+{
+  setConnectionTimeout(timeout);
+  return connect(ip, port);
+}
+
+int MqttClient::connect(const char *host, uint16_t port, int32_t timeout)
+{
+  setConnectionTimeout(timeout);
+  return connect(host, port);
+}
+#endif
+
 size_t MqttClient::write(uint8_t b)
 {
   return write(&b, sizeof(b));
diff --git a/src/MqttClient.h b/src/MqttClient.h
index 522f023..4efc82b 100644
--- a/src/MqttClient.h
+++ b/src/MqttClient.h
@@ -83,6 +83,10 @@ class MqttClient : public Client {
   virtual int connect(const char *host, uint16_t port = 1883);
 #ifdef ESP8266
   virtual int connect(const IPAddress& ip, uint16_t port) { return 0; }; /* ESP8266 core defines this pure virtual in Client.h */
+#endif
+#ifdef ARDUINO_ARCH_ESP32
+  virtual int connect(IPAddress ip, uint16_t port, int32_t timeout);
+  virtual int connect(const char *host, uint16_t port, int32_t timeout);
 #endif
   virtual size_t write(uint8_t);
   virtual size_t write(const uint8_t *buf, size_t size);