diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4c5664b679647b3658fc33569b6852e9741f6819..625032372c892e9e745f6fecc235ecb1b842b247 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -313,19 +313,14 @@ if (LWS_WITH_SQLITE3)
 endif()
 
 
-# FIXME: This must be runtime-only option.
 # The base dir where the test-apps look for the SSL certs.
 set(LWS_OPENSSL_CLIENT_CERTS ../share CACHE PATH "Server SSL certificate directory")
 if (WIN32)
 	set(LWS_OPENSSL_CLIENT_CERTS . CACHE PATH "Client SSL certificate directory")
 
-	if (LWS_IPV6)
-		set(LWS_IPV6 OFF)
-		message(WARNING "IPv6 does not currently work on Windows!")
-	endif()
-        if (LWS_UNIX_SOCK)
+	if (LWS_UNIX_SOCK)
 		set(LWS_UNIX_SOCK OFF)
-                message(WARNING "Windows does not support UNIX domain sockets")
+		message(WARNING "Windows does not support UNIX domain sockets")
 	endif()
 else()
 	set(LWS_OPENSSL_CLIENT_CERTS /etc/pki/tls/certs/ CACHE PATH "Client SSL certificate directory")
diff --git a/lib/client-handshake.c b/lib/client-handshake.c
index acb8044b3392c42e019dc81f83e747a8dfc8038a..5da5c2191faffb1ecb002b038b11b5869fd8468c 100644
--- a/lib/client-handshake.c
+++ b/lib/client-handshake.c
@@ -101,6 +101,8 @@ lws_client_connect_2(struct lws *wsi)
 			memcpy(&server_addr6.sin6_addr,
 			  &((struct sockaddr_in6 *)result->ai_addr)->sin6_addr,
 						sizeof(struct in6_addr));
+			server_addr6.sin6_scope_id = ((struct sockaddr_in6 *)result->ai_addr)->sin6_scope_id;
+			server_addr6.sin6_flowinfo = ((struct sockaddr_in6 *)result->ai_addr)->sin6_flowinfo;
 			break;
 		default:
 			lwsl_err("Unknown address family\n");
diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c
index 560219f9c68b982b00324f4db7ecaa9b504adc2d..3bd48fbd0eefc5514fbfd1f0991cc0d33f6cefba 100755
--- a/lib/libwebsockets.c
+++ b/lib/libwebsockets.c
@@ -1769,10 +1769,10 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port,
 #endif
 	struct sockaddr_in serv_addr4;
 #ifndef LWS_PLAT_OPTEE
-	socklen_t len = sizeof(struct sockaddr);
+	socklen_t len = sizeof(struct sockaddr_storage);
 #endif
 	int n;
-	struct sockaddr_in sin;
+	struct sockaddr_storage sin;
 	struct sockaddr *v;
 
 #ifdef LWS_USE_UNIX_SOCK
@@ -1804,6 +1804,7 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port,
 			return -1;
 		}
 
+#ifndef WIN32
 		if (iface) {
 			struct ifaddrs *addrs, *addr;
 			char ip[NI_MAXHOST];
@@ -1835,6 +1836,7 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port,
 			}
 			freeifaddrs(addrs);
 		}
+#endif
 
 		serv_addr6.sin6_family = AF_INET6;
 		serv_addr6.sin6_port = htons(port);
@@ -1877,7 +1879,13 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port,
 		lwsl_warn("getsockname: %s\n", strerror(LWS_ERRNO));
 	else
 #endif
-		port = ntohs(sin.sin_port);
+#if defined(LWS_USE_IPV6)
+		port = (sin.ss_family == AF_INET6) ?
+				  ntohs(((struct sockaddr_in6 *) &sin)->sin6_port) :
+				  ntohs(((struct sockaddr_in *) &sin)->sin_port);
+#else
+		port = ntohs(((struct sockaddr_in *) &sin)->sin_port);
+#endif
 #endif
 
 	return port;
diff --git a/lib/server.c b/lib/server.c
index 8973041538c8534ee98c4cf1fd16cc47c379df1c..c93877ecd97cfb469424e51edcc7bfa3cc564bfb 100644
--- a/lib/server.c
+++ b/lib/server.c
@@ -2004,7 +2004,7 @@ lws_server_socket_service(struct lws_context *context, struct lws *wsi,
 	lws_sockfd_type accept_fd = LWS_SOCK_INVALID;
 	struct allocated_headers *ah;
 #if LWS_POSIX
-	struct sockaddr_in cli_addr;
+	struct sockaddr_storage cli_addr;
 	socklen_t clilen;
 #endif
 	int n, len;
@@ -2251,8 +2251,17 @@ try_pollout:
 
 			lws_plat_set_socket_options(wsi->vhost, accept_fd);
 
-			lwsl_debug("accepted new conn  port %u on fd=%d\n",
-					  ntohs(cli_addr.sin_port), accept_fd);
+#if defined(LWS_USE_IPV6)
+			lwsl_debug("accepted new conn port %u on fd=%d\n",
+					  ((cli_addr.ss_family == AF_INET6) ?
+					  ntohs(((struct sockaddr_in6 *) &cli_addr)->sin6_port) :
+					  ntohs(((struct sockaddr_in *) &cli_addr)->sin_port)),
+					  accept_fd);
+#else
+			lwsl_debug("accepted new conn port %u on fd=%d\n",
+					  ntohs(((struct sockaddr_in *) &cli_addr)->sin_port),
+					  accept_fd);
+#endif
 
 #else
 			/* not very beautiful... */