diff --git a/libraries/WebServer/src/WebServer.cpp b/libraries/WebServer/src/WebServer.cpp
index 2057b230eea..5dfb14f4767 100644
--- a/libraries/WebServer/src/WebServer.cpp
+++ b/libraries/WebServer/src/WebServer.cpp
@@ -55,6 +55,7 @@ WebServer::WebServer(IPAddress addr, int port)
 , _currentHeaders(nullptr)
 , _contentLength(0)
 , _chunked(false)
+, _corsEnabled(false)
 {
 }
 
@@ -75,6 +76,7 @@ WebServer::WebServer(int port)
 , _currentHeaders(nullptr)
 , _contentLength(0)
 , _chunked(false)
+, _corsEnabled(false)
 {
 }
 
@@ -104,7 +106,7 @@ void WebServer::begin(uint16_t port) {
 
 String WebServer::_extractParam(String& authReq,const String& param,const char delimit){
   int _begin = authReq.indexOf(param);
-  if (_begin == -1) 
+  if (_begin == -1)
     return "";
   return authReq.substring(_begin+param.length(),authReq.indexOf(delimit,_begin+param.length()));
 }
@@ -366,6 +368,14 @@ void WebServer::setContentLength(const size_t contentLength) {
     _contentLength = contentLength;
 }
 
+void WebServer::enableCORS(boolean value) {
+  _corsEnabled = value;
+}
+
+void WebServer::enableCrossOrigin(boolean value) {
+  enableCORS(value);
+}
+
 void WebServer::_prepareHeader(String& response, int code, const char* content_type, size_t contentLength) {
     response = String(F("HTTP/1.")) + String(_currentVersion) + ' ';
     response += String(code);
@@ -388,6 +398,9 @@ void WebServer::_prepareHeader(String& response, int code, const char* content_t
       sendHeader(String(F("Accept-Ranges")),String(F("none")));
       sendHeader(String(F("Transfer-Encoding")),String(F("chunked")));
     }
+    if (_corsEnabled) {
+        sendHeader(String(FPSTR("Access-Control-Allow-Origin")), String("*"));
+    }
     sendHeader(String(F("Connection")), String(F("close")));
 
     response += _responseHeaders;
@@ -494,7 +507,7 @@ void WebServer::_streamFileCore(const size_t fileSize, const String & fileName,
   send(200, contentType, "");
 }
 
-String WebServer::pathArg(unsigned int i) { 
+String WebServer::pathArg(unsigned int i) {
   if (_currentHandler != nullptr)
     return _currentHandler->pathArg(i);
   return "";
diff --git a/libraries/WebServer/src/WebServer.h b/libraries/WebServer/src/WebServer.h
index aedfb40fb49..97aa032e1f4 100644
--- a/libraries/WebServer/src/WebServer.h
+++ b/libraries/WebServer/src/WebServer.h
@@ -122,6 +122,9 @@ class WebServer
   void send_P(int code, PGM_P content_type, PGM_P content);
   void send_P(int code, PGM_P content_type, PGM_P content, size_t contentLength);
 
+  void enableCORS(boolean value = true);
+  void enableCrossOrigin(boolean value = true);
+
   void setContentLength(const size_t contentLength);
   void sendHeader(const String& name, const String& value, bool first = false);
   void sendContent(const String& content);
@@ -130,12 +133,12 @@ class WebServer
 
   static String urlDecode(const String& text);
 
-  template<typename T> 
+  template<typename T>
   size_t streamFile(T &file, const String& contentType) {
     _streamFileCore(file.size(), file.name(), contentType);
     return _currentClient.write(file);
   }
-  
+
 protected:
   virtual size_t _currentClientWrite(const char* b, size_t l) { return _currentClient.write( b, l ); }
   virtual size_t _currentClientWrite_P(PGM_P b, size_t l) { return _currentClient.write_P( b, l ); }
@@ -151,7 +154,7 @@ class WebServer
   int _uploadReadByte(WiFiClient& client);
   void _prepareHeader(String& response, int code, const char* content_type, size_t contentLength);
   bool _collectHeader(const char* headerName, const char* headerValue);
- 
+
   void _streamFileCore(const size_t fileSize, const String & fileName, const String & contentType);
 
   String _getRandomHexString();
@@ -163,6 +166,7 @@ class WebServer
     String value;
   };
 
+  boolean     _corsEnabled;
   WiFiServer  _server;
 
   WiFiClient  _currentClient;