diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp
index 033fd3e84..bad89074b 100644
--- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp
+++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp
@@ -256,7 +256,7 @@ void HTTPClient::setReuse(bool reuse)
  * set User Agent
  * @param userAgent const char *
  */
-void HTTPClient::setUserAgent(const char * userAgent)
+void HTTPClient::setUserAgent(const String& userAgent)
 {
     _userAgent = userAgent;
 }
@@ -359,7 +359,7 @@ int HTTPClient::sendRequest(const char * type, uint8_t * payload, size_t size)
     }
 
     if(payload && size > 0) {
-        addHeader("Content-Length", String(size));
+        addHeader(F("Content-Length"), String(size));
     }
 
     // send Header
@@ -644,8 +644,8 @@ String HTTPClient::getString(void)
     if(_size) {
         // try to reserve needed memmory
         if(!sstring.reserve((_size + 1))) {
-            DEBUG_HTTPCLIENT("[HTTP-Client][getString] too less memory to reserve as string! need: %d\n", (_size + 1));
-            return String("--too less memory--");
+            DEBUG_HTTPCLIENT("[HTTP-Client][getString] not enough memory to reserve a string! need: %d\n", (_size + 1));
+            return "";
         }
     }
 
@@ -662,27 +662,27 @@ String HTTPClient::errorToString(int error)
 {
     switch(error) {
     case HTTPC_ERROR_CONNECTION_REFUSED:
-        return String("connection refused");
+        return F("connection refused");
     case HTTPC_ERROR_SEND_HEADER_FAILED:
-        return String("send header failed");
+        return F("send header failed");
     case HTTPC_ERROR_SEND_PAYLOAD_FAILED:
-        return String("send payload failed");
+        return F("send payload failed");
     case HTTPC_ERROR_NOT_CONNECTED:
-        return String("not connected");
+        return F("not connected");
     case HTTPC_ERROR_CONNECTION_LOST:
-        return String("connection lost");
+        return F("connection lost");
     case HTTPC_ERROR_NO_STREAM:
-        return String("no stream");
+        return F("no stream");
     case HTTPC_ERROR_NO_HTTP_SERVER:
-        return String("no HTTP server");
+        return F("no HTTP server");
     case HTTPC_ERROR_TOO_LESS_RAM:
-        return String("too less ram");
+        return F("too less ram");
     case HTTPC_ERROR_ENCODING:
-        return String("Transfer-Encoding not supported");
+        return F("Transfer-Encoding not supported");
     case HTTPC_ERROR_STREAM_WRITE:
-        return String("Stream write error");
+        return F("Stream write error");
     case HTTPC_ERROR_READ_TIMEOUT:
-        return String("read Timeout");
+        return F("read Timeout");
     default:
         return String();
     }
@@ -698,7 +698,10 @@ void HTTPClient::addHeader(const String& name, const String& value, bool first)
 {
 
     // not allow set of Header handled by code
-    if(!name.equalsIgnoreCase("Connection") && !name.equalsIgnoreCase("User-Agent") && !name.equalsIgnoreCase("Host") && !(_base64Authorization.length() && name.equalsIgnoreCase("Authorization"))) {
+    if(!name.equalsIgnoreCase(F("Connection")) &&
+       !name.equalsIgnoreCase(F("User-Agent")) &&
+       !name.equalsIgnoreCase(F("Host")) &&
+       !(name.equalsIgnoreCase(F("Authorization")) && _base64Authorization.length())){
         String headerLine = name;
         headerLine += ": ";
         headerLine += value;
@@ -821,7 +824,7 @@ bool HTTPClient::sendHeader(const char * type)
         return false;
     }
 
-    String header = String(type) + " " + _uri + " HTTP/1.";
+    String header = String(type) + " " + _uri + F(" HTTP/1.");
 
     if(_useHTTP10) {
         header += "0";
@@ -829,24 +832,25 @@ bool HTTPClient::sendHeader(const char * type)
         header += "1";
     }
 
-    header += "\r\n"
-              "Host: " + _host + "\r\n"
-              "User-Agent: " + _userAgent + "\r\n"
-              "Connection: ";
+    header += String(F("\r\nHost: ")) + _host +
+              F("\r\nUser-Agent: ") + _userAgent +
+              F("\r\nConnection: ");
 
     if(_reuse) {
-        header += "keep-alive";
+        header += F("keep-alive");
     } else {
-        header += "close";
+        header += F("close");
     }
     header += "\r\n";
 
     if(!_useHTTP10) {
-        header += "Accept-Encoding: identity;q=1,chunked;q=0.1,*;q=0\r\n";
+        header += F("Accept-Encoding: identity;q=1,chunked;q=0.1,*;q=0\r\n");
     }
 
     if(_base64Authorization.length()) {
-        header += "Authorization: Basic " + _base64Authorization + "\r\n";
+        header += F("Authorization: Basic ");
+        header += _base64Authorization;
+        header += "\r\n";
     }
 
     header += _headers + "\r\n";
diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h
index d8c926359..1f5ef7fbc 100644
--- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h
+++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h
@@ -145,7 +145,7 @@ public:
     bool connected(void);
 
     void setReuse(bool reuse); /// keep-alive
-    void setUserAgent(const char * userAgent);
+    void setUserAgent(const String& userAgent);
     void setAuthorization(const char * user, const char * password);
     void setAuthorization(const char * auth);
     void setTimeout(uint16_t timeout);
diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp
index 910d8f901..b0020aad7 100644
--- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp
+++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp
@@ -125,31 +125,31 @@ String ESP8266HTTPUpdate::getLastErrorString(void)
         StreamString error;
         Update.printError(error);
         error.trim(); // remove line ending
-        return "Update error: " + error;
+        return String(F("Update error: ")) + error;
     }
 
     // error from http client
     if(_lastError > -100) {
-        return "HTTP error: " + HTTPClient::errorToString(_lastError);
+        return String(F("HTTP error: ")) + HTTPClient::errorToString(_lastError);
     }
 
     switch(_lastError) {
     case HTTP_UE_TOO_LESS_SPACE:
-        return String("To less space");
+        return F("To less space");
     case HTTP_UE_SERVER_NOT_REPORT_SIZE:
-        return String("Server not Report Size");
+        return F("Server not Report Size");
     case HTTP_UE_SERVER_FILE_NOT_FOUND:
-        return String("File not Found (404)");
+        return F("File not Found (404)");
     case HTTP_UE_SERVER_FORBIDDEN:
-        return String("Forbidden (403)");
+        return F("Forbidden (403)");
     case HTTP_UE_SERVER_WRONG_HTTP_CODE:
-        return String("Wrong HTTP code");
+        return F("Wrong HTTP code");
     case HTTP_UE_SERVER_FAULTY_MD5:
-        return String("Faulty MD5");
+        return F("Faulty MD5");
     case HTTP_UE_BIN_VERIFY_HEADER_FAILED:
-        return String("Verify bin header failed");
+        return F("Verify bin header failed");
     case HTTP_UE_BIN_FOR_WRONG_FLASH:
-        return String("bin for wrong flash size");
+        return F("bin for wrong flash size");
     }
 
     return String();
@@ -170,22 +170,22 @@ HTTPUpdateResult ESP8266HTTPUpdate::handleUpdate(HTTPClient& http, const String&
     // use HTTP/1.0 for update since the update handler not support any transfer Encoding
     http.useHTTP10(true);
     http.setTimeout(8000);
-    http.setUserAgent("ESP8266-http-Update");
-    http.addHeader("x-ESP8266-STA-MAC", WiFi.macAddress());
-    http.addHeader("x-ESP8266-AP-MAC", WiFi.softAPmacAddress());
-    http.addHeader("x-ESP8266-free-space", String(ESP.getFreeSketchSpace()));
-    http.addHeader("x-ESP8266-sketch-size", String(ESP.getSketchSize()));
-    http.addHeader("x-ESP8266-chip-size", String(ESP.getFlashChipRealSize()));
-    http.addHeader("x-ESP8266-sdk-version", ESP.getSdkVersion());
+    http.setUserAgent(F("ESP8266-http-Update"));
+    http.addHeader(F("x-ESP8266-STA-MAC"), WiFi.macAddress());
+    http.addHeader(F("x-ESP8266-AP-MAC"), WiFi.softAPmacAddress());
+    http.addHeader(F("x-ESP8266-free-space"), String(ESP.getFreeSketchSpace()));
+    http.addHeader(F("x-ESP8266-sketch-size"), String(ESP.getSketchSize()));
+    http.addHeader(F("x-ESP8266-chip-size"), String(ESP.getFlashChipRealSize()));
+    http.addHeader(F("x-ESP8266-sdk-version"), ESP.getSdkVersion());
 
     if(spiffs) {
-        http.addHeader("x-ESP8266-mode", "spiffs");
+        http.addHeader(F("x-ESP8266-mode"), F("spiffs"));
     } else {
-        http.addHeader("x-ESP8266-mode", "sketch");
+        http.addHeader(F("x-ESP8266-mode"), F("sketch"));
     }
 
     if(currentVersion && currentVersion[0] != 0x00) {
-        http.addHeader("x-ESP8266-version", currentVersion);
+        http.addHeader(F("x-ESP8266-version"), currentVersion);
     }
 
     const char * headerkeys[] = { "x-MD5" };