diff --git a/src/HTTPConnection.cpp b/src/HTTPConnection.cpp
index 0ab739c..c36a1a9 100644
--- a/src/HTTPConnection.cpp
+++ b/src/HTTPConnection.cpp
@@ -67,6 +67,10 @@ IPAddress HTTPConnection::getClientIP() {
     struct sockaddr_in *sockAddrIn = (struct sockaddr_in *)(&_sockAddr);
     return IPAddress(sockAddrIn->sin_addr.s_addr);
   }
+  if (_addrLen > 0 && _sockAddr.sa_family == AF_INET6) {
+    struct sockaddr_in6 *sockAddrIn = (struct sockaddr_in6 *)(&_sockAddr);
+    return IPAddress(sockAddrIn->sin6_addr.s6_addr);
+  }
   return IPAddress(0, 0, 0, 0);
 }
 
diff --git a/src/HTTPServer.cpp b/src/HTTPServer.cpp
index 9705e0c..825628b 100644
--- a/src/HTTPServer.cpp
+++ b/src/HTTPServer.cpp
@@ -1,4 +1,5 @@
 #include "HTTPServer.hpp"
+#include <WiFi.h>
 
 namespace httpsserver {
 
@@ -168,15 +169,38 @@ int HTTPServer::createConnection(int idx) {
  * This method prepares the tcp server socket
  */
 uint8_t HTTPServer::setupSocket() {
-  // (AF_INET = IPv4, SOCK_STREAM = TCP)
-  _socket = socket(AF_INET, SOCK_STREAM, 0);
+  bool IPv6 = WiFi.localIPv6() == IPv6Address();
+
+  if (!IPv6)
+  {
+    // (AF_INET = IPv4, SOCK_STREAM = TCP)
+    _socket = socket(AF_INET, SOCK_STREAM, 0);
+  } else {
+    _socket = socket(AF_INET6, SOCK_STREAM, IPPROTO_IPV6);
+    int opt = 0;
+    //Allow to bind to both ipv4 and ipv6
+    setsockopt(_socket, IPPROTO_IPV6, IPV6_V6ONLY, &opt, sizeof(opt));
+  }
 
   if (_socket>=0) {
-    _sock_addr.sin_family = AF_INET;
-    // Listen on all interfaces
-    _sock_addr.sin_addr.s_addr = _bindAddress;
-    // Set the server port
-    _sock_addr.sin_port = htons(_port);
+    if (!IPv6)
+    {
+      struct sockaddr_in *dest_addr = (struct sockaddr_in *)&_sock_addr;
+      dest_addr->sin_family = AF_INET;
+      // Listen on all interfaces
+      dest_addr->sin_addr.s_addr = _bindAddress;
+      // Set the server port
+      dest_addr->sin_port = htons(_port);
+    }
+    else
+    {
+      struct sockaddr_in6 *dest_addr_ip6 = (struct sockaddr_in6 *)&_sock_addr;
+      bzero(&dest_addr_ip6->sin6_addr.un, sizeof(dest_addr_ip6->sin6_addr.un));
+
+      dest_addr_ip6->sin6_family = AF_INET6;
+      // Set the server port
+      dest_addr_ip6->sin6_port = htons(_port);
+    }
 
     // Now bind the TCP socket we did create above to the socket address we specified
     // (The TCP-socket now listens on 0.0.0.0:port)
diff --git a/src/HTTPServer.hpp b/src/HTTPServer.hpp
index 47746c1..895aa48 100644
--- a/src/HTTPServer.hpp
+++ b/src/HTTPServer.hpp
@@ -59,7 +59,7 @@ class HTTPServer : public ResourceResolver {
   int _socket;
 
   // The server socket address, that our service is bound to
-  sockaddr_in _sock_addr;
+  sockaddr_storage _sock_addr;
   // Headers that are included in every response
   HTTPHeaders _defaultHeaders;