diff --git a/libraries/NetworkClientSecure/src/ssl_client.cpp b/libraries/NetworkClientSecure/src/ssl_client.cpp
index 4ca512292be..787dd69b311 100644
--- a/libraries/NetworkClientSecure/src/ssl_client.cpp
+++ b/libraries/NetworkClientSecure/src/ssl_client.cpp
@@ -62,21 +62,32 @@ int start_ssl_client(sslclient_context *ssl_client, const IPAddress& ip, uint32_
         return -1;
     }
 
-    log_v("Starting socket");
+    int domain = ip.type() == IPv6 ? AF_INET6 : AF_INET;
+    log_v("Starting socket (domain %d)", domain);
     ssl_client->socket = -1;
 
-    ssl_client->socket = lwip_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    ssl_client->socket = lwip_socket(domain, SOCK_STREAM, IPPROTO_TCP);
     if (ssl_client->socket < 0) {
         log_e("ERROR opening socket");
         return ssl_client->socket;
     }
 
     fcntl( ssl_client->socket, F_SETFL, fcntl( ssl_client->socket, F_GETFL, 0 ) | O_NONBLOCK );
-    struct sockaddr_in serv_addr;
-    memset(&serv_addr, 0, sizeof(serv_addr));
-    serv_addr.sin_family = AF_INET;
-    serv_addr.sin_addr.s_addr = ip;
-    serv_addr.sin_port = htons(port);
+    struct sockaddr_storage serv_addr = {};
+    if (domain == AF_INET6) {
+        struct sockaddr_in6 *tmpaddr = (struct sockaddr_in6 *)&serv_addr;
+        tmpaddr->sin6_family = AF_INET6;
+        for (int index = 0; index < 16; index++) {
+            tmpaddr->sin6_addr.s6_addr[index] = ip[index];
+        }
+        tmpaddr->sin6_port = htons(port);
+        tmpaddr->sin6_scope_id = ip.zone();
+    } else {
+        struct sockaddr_in *tmpaddr = (struct sockaddr_in *)&serv_addr;
+        tmpaddr->sin_family = AF_INET;
+        tmpaddr->sin_addr.s_addr = ip;
+        tmpaddr->sin_port = htons(port);
+    }
 
     if(timeout <= 0){
         timeout = 30000; // Milli seconds.