diff --git a/ampel-firmware/csv_writer.cpp b/ampel-firmware/csv_writer.cpp
index f8310fa15bca16d3b47a47077fc34db72f62b53a..7720e67493b4b3205296826686aac68454489842 100644
--- a/ampel-firmware/csv_writer.cpp
+++ b/ampel-firmware/csv_writer.cpp
@@ -132,11 +132,11 @@ namespace csv_writer {
     return csv_file;
   }
 
-  void log(const String &timeStamp, const int16_t &co2, const float &temperature, const float &humidity) {
+  void log(const char *timestamp, const int16_t &co2, const float &temperature, const float &humidity) {
     led_effects::onBoardLEDOn();
     File csv_file = openOrCreate();
     char csv_line[42];
-    snprintf(csv_line, sizeof(csv_line), "%s;%d;%.1f;%.1f\r\n", timeStamp.c_str(), co2, temperature, humidity);
+    snprintf(csv_line, sizeof(csv_line), "%s;%d;%.1f;%.1f\r\n", timestamp, co2, temperature, humidity);
     if (csv_file) {
       size_t written_bytes = csv_file.print(csv_line);
       csv_file.close();
@@ -156,7 +156,7 @@ namespace csv_writer {
     led_effects::onBoardLEDOff();
   }
 
-  void logIfTimeHasCome(const String &timeStamp, const int16_t &co2, const float &temperature, const float &humidity) {
+  void logIfTimeHasCome(const char *timeStamp, const int16_t &co2, const float &temperature, const float &humidity) {
     unsigned long now = seconds();
     if (now - last_written_at > config::csv_interval) {
       last_written_at = now;
diff --git a/ampel-firmware/csv_writer.h b/ampel-firmware/csv_writer.h
index 80cdcf91f31e67c0fdba44ab8a9db7041f428f50..ab4a87b2972e8b3ae597e637a6f309da0d829658 100644
--- a/ampel-firmware/csv_writer.h
+++ b/ampel-firmware/csv_writer.h
@@ -22,7 +22,7 @@ namespace config {
 namespace csv_writer {
   extern char last_successful_write[23];
   void initialize();
-  void logIfTimeHasCome(const String &timeStamp, const int16_t &co2, const float &temperature, const float &humidity);
+  void logIfTimeHasCome(const char* timestamp, const int16_t &co2, const float &temperature, const float &humidity);
   int getAvailableSpace();
   extern const String filename;
 
diff --git a/ampel-firmware/mqtt.cpp b/ampel-firmware/mqtt.cpp
index 2fa8143b2bc4c7a95b158fd555531e42ab19da2e..1037aa5c64a1701bbda39e984ee8ed0904f5cf27 100644
--- a/ampel-firmware/mqtt.cpp
+++ b/ampel-firmware/mqtt.cpp
@@ -41,13 +41,13 @@ namespace mqtt {
         " (Sends local IP and SSID via MQTT. Can be useful to find sensor)");
   }
 
-  void publish(const String &timestamp, int16_t co2, float temperature, float humidity) {
+  void publish(const char *timestamp, int16_t co2, float temperature, float humidity) {
     if (WiFi.status() == WL_CONNECTED && mqttClient.connected()) {
       led_effects::onBoardLEDOn();
       Serial.print(F("MQTT - Publishing message ... "));
 
       char payload[75]; // Should be enough for json...
-      snprintf(payload, sizeof(payload), json_sensor_format, timestamp.c_str(), co2, temperature, humidity);
+      snprintf(payload, sizeof(payload), json_sensor_format, timestamp, co2, temperature, humidity);
       // Topic is the same as clientID. e.g. 'CO2sensors/ESP3d03da'
       if (mqttClient.publish(publish_topic.c_str(), payload)) {
         Serial.println(F("OK"));
@@ -120,12 +120,12 @@ namespace mqtt {
     }
   }
 
-  void publishIfTimeHasCome(const String &timeStamp, const int16_t &co2, const float &temp, const float &hum) {
+  void publishIfTimeHasCome(const char *timestamp, const int16_t &co2, const float &temp, const float &hum) {
     // Send message via MQTT according to sending interval
     unsigned long now = seconds();
     if (now - last_sent_at > config::mqtt_sending_interval) {
       last_sent_at = now;
-      publish(timeStamp, co2, temp, hum);
+      publish(timestamp, co2, temp, hum);
     }
   }
 
diff --git a/ampel-firmware/mqtt.h b/ampel-firmware/mqtt.h
index ea39b6d727b5827d9d3c8896c3a755707cd783c5..9167c47dda720528f138ff048630d399e6656984 100644
--- a/ampel-firmware/mqtt.h
+++ b/ampel-firmware/mqtt.h
@@ -15,7 +15,7 @@ namespace mqtt {
   extern bool connected;
   void initialize(String &topic);
   void keepConnection();
-  void publishIfTimeHasCome(const String &timeStamp, const int16_t &co2, const float &temp, const float &hum);
+  void publishIfTimeHasCome(const char *timestamp, const int16_t &co2, const float &temp, const float &hum);
 
   void setMQTTinterval(int32_t sending_interval);
   void sendInfoAboutLocalNetwork();
diff --git a/ampel-firmware/src/lib/NTPClient-master/NTPClient.cpp b/ampel-firmware/src/lib/NTPClient-master/NTPClient.cpp
index 3d5191207cb4b5e9b92b068cd990fd4c75d0be52..1b52de5af6eefae690044fa9138222fb3aa78d1b 100644
--- a/ampel-firmware/src/lib/NTPClient-master/NTPClient.cpp
+++ b/ampel-firmware/src/lib/NTPClient-master/NTPClient.cpp
@@ -152,19 +152,17 @@ int NTPClient::getSeconds() {
   return (this->getEpochTime() % 60);
 }
 
-String NTPClient::getFormattedTime(unsigned long secs) {
+void NTPClient::getFormattedTime(char *formatted_time, unsigned long secs) {
   unsigned long rawTime = secs ? secs : this->getEpochTime();
   unsigned int hours = (rawTime % 86400L) / 3600;
   unsigned int minutes = (rawTime % 3600) / 60;
   unsigned int seconds = rawTime % 60;
 
-  char formatted_time[9];
-  snprintf(formatted_time, sizeof(formatted_time), "%02d:%02d:%02d", hours, minutes, seconds);
-  return String(formatted_time);
+  snprintf(formatted_time, 9, "%02d:%02d:%02d", hours, minutes, seconds);
 }
 
 // Based on https://github.com/PaulStoffregen/Time/blob/master/Time.cpp
-void NTPClient::getFormattedDate(char * formatted_date, unsigned long secs) {
+void NTPClient::getFormattedDate(char *formatted_date, unsigned long secs) {
   unsigned long rawTime = (secs ? secs : this->getEpochTime()) / 86400L;  // in days
   unsigned long days = 0, year = 1970;
   uint8_t month;
@@ -187,8 +185,9 @@ void NTPClient::getFormattedDate(char * formatted_date, unsigned long secs) {
   month++; // jan is month 1
   rawTime++; // first day is day 1
 
-  snprintf(formatted_date, 23, "%4lu-%02d-%02lu %s%+03d",
-      year, month, rawTime, this->getFormattedTime(secs).c_str(), this->_timeOffset / 3600);
+  char formatted_time[9];
+  this->getFormattedTime(formatted_time, secs);
+  snprintf(formatted_date, 23, "%4lu-%02d-%02lu %s%+03d", year, month, rawTime, formatted_time, this->_timeOffset / 3600);
 }
 
 void NTPClient::end() {
diff --git a/ampel-firmware/src/lib/NTPClient-master/NTPClient.h b/ampel-firmware/src/lib/NTPClient-master/NTPClient.h
index dcd4d3260e6fc2ea8ca201f8e41a3d1c310de1a2..3349dbb7df998fc931874c3f1ec86cda07fc3f80 100644
--- a/ampel-firmware/src/lib/NTPClient-master/NTPClient.h
+++ b/ampel-firmware/src/lib/NTPClient-master/NTPClient.h
@@ -80,7 +80,7 @@ class NTPClient {
     /**
     * @return secs argument (or 0 for current time) formatted like `hh:mm:ss`
     */
-    String getFormattedTime(unsigned long secs = 0);
+    void getFormattedTime(char *formatted_time, unsigned long secs = 0);
 
     /**
      * @return time in seconds since Jan. 1, 1970