diff --git a/ampel-firmware/ampel-firmware.h b/ampel-firmware/ampel-firmware.h
index e477735e63c1ad71e03a855eee7c5e69821184b8..5f8a41fd768ea78dfc3a89a9b51d25174386f873 100644
--- a/ampel-firmware/ampel-firmware.h
+++ b/ampel-firmware/ampel-firmware.h
@@ -21,8 +21,11 @@
 #include "co2_sensor.h"
 #include "led_effects.h"
 
+void wifiConnecting();
 void wifiConnected();
 void wifiFailed();
+void apModeStarts();
+
 void keepServicesAlive();
 void checkFlashButton();
 
diff --git a/ampel-firmware/ampel-firmware.ino b/ampel-firmware/ampel-firmware.ino
index 2270f517ebcac2295397571682f2421b6b3026ec..ba505c9cdfb47422b327d24eec6b3fbb3da72d6b 100644
--- a/ampel-firmware/ampel-firmware.ino
+++ b/ampel-firmware/ampel-firmware.ino
@@ -67,9 +67,10 @@ void setup() {
 
   web_config::initialize();
 
+  web_config::setWifiConnectingCallback(wifiConnecting);
   web_config::setWifiConnectionCallback(wifiConnected);
-
   web_config::setWifiFailCallback(wifiFailed);
+  web_config::setApModeCallback(apModeStarts);
 
   pinMode(0, INPUT); // Flash button (used for forced calibration)
 
@@ -160,8 +161,16 @@ void loop() {
 /*****************************************************************
  * Callbacks                                                     *
  *****************************************************************/
+void wifiConnecting() {
+  Serial.print(F("WiFi - Trying to connect to "));
+  Serial.print(config::selected_ssid());
+  Serial.print(F(" for "));
+  Serial.print(config::wifi_timeout);
+  Serial.println(F("s."));
+  led_effects::showRainbowWheel();
+}
+
 void wifiConnected() {
-  led_effects::showKITTWheel(color::green);
   Serial.println();
   Serial.print(F("WiFi - Connected to "));
   Serial.print(WiFi.SSID());
@@ -169,6 +178,7 @@ void wifiConnected() {
   IPAddress address = WiFi.localIP();
   snprintf(wifi::local_ip, sizeof(wifi::local_ip), "%d.%d.%d.%d", address[0], address[1], address[2], address[3]);
   Serial.println(wifi::local_ip);
+  led_effects::showKITTWheel(color::green);
 
   ntp::connect();
 
@@ -184,11 +194,19 @@ void wifiConnected() {
 
 void wifiFailed() {
   // Ampel will go back to Access Point mode for AP_TIMEOUT seconds, and try connection again after
+  Serial.println();
   Serial.print(F("WiFi - Could not connect to "));
   Serial.println(config::selected_ssid());
   led_effects::showKITTWheel(color::red);
 }
 
+void apModeStarts() {
+  Serial.print(F("WiFi - Starting Access Point mode ("));
+  Serial.print(config::ampel_name());
+  Serial.println(F(")."));
+  led_effects::alert(color::turquoise);
+}
+
 /*****************************************************************
  * Helper functions                                              *
  *****************************************************************/
diff --git a/ampel-firmware/led_effects.h b/ampel-firmware/led_effects.h
index d37cb5c3bd569ab1a19d273df6c2bbbb5ae5fe37..21be765d9f2b2c54efb2db3193b8081beaf01cab 100644
--- a/ampel-firmware/led_effects.h
+++ b/ampel-firmware/led_effects.h
@@ -9,6 +9,7 @@ namespace color {
   const uint32_t blue = 0x0000FF;
   const uint32_t black = 0x000000;
   const uint32_t magenta = 0xFF00FF;
+  const uint32_t turquoise = 0x1CFF68;
 }
 
 namespace led_effects {
diff --git a/ampel-firmware/web_config.cpp b/ampel-firmware/web_config.cpp
index f96b38ad3510eeab2c6627da6c401241133a63a1..e5db28b68483512aa885f8a1b96dcdab65f64347 100644
--- a/ampel-firmware/web_config.cpp
+++ b/ampel-firmware/web_config.cpp
@@ -19,7 +19,6 @@
 #include "src/lib/IotWebConf/src/IotWebConfOptionalGroup.h"
 
 //TODO: Convert all strings to F-strings
-//TODO: Add callbacks for states, e.g. AP mode or connecting?
 
 namespace web_config {
 #if defined(ESP8266)
@@ -34,6 +33,8 @@ namespace web_config {
 
   const char config_version[IOTWEBCONF_CONFIG_VERSION_LENGTH] = AMPEL_CONFIG_VERSION; // -- Configuration specific key. The value should be modified if config structure was changed.
   using namespace iotwebconf;
+  std::function<void()> _wifiConnectingCallback = nullptr;
+  std::function<void()> _apModeCallback= nullptr;
 
   /**
    * WiFi params
@@ -160,6 +161,14 @@ namespace web_config {
     iotWebConf->setWifiConnectionCallback(success_function);
   }
 
+  void setWifiConnectingCallback(void (*fn)()) {
+    _wifiConnectingCallback = fn;
+  }
+
+  void setApModeCallback(void (*fn)()) {
+    _apModeCallback = fn;
+  }
+
   void setWifiFailCallback(void (*fail_function)()) {
     std::function<WifiAuthInfo* ()> fail_and_return_null = [fail_function]() {
       fail_function();
@@ -277,7 +286,6 @@ namespace web_config {
 
     //NOTE: Can only work if wifi is on.
     sensor_console::defineIntCommand("ap", [](int onOff) {
-      //TODO: Add On-board LED effects to show the changes?
       if (onOff) {
         Serial.print(F("Enable "));
       } else {
@@ -287,6 +295,15 @@ namespace web_config {
       iotWebConf->forceApMode(onOff);
     }, F("0/1 (Enables/disables access point)"));
 
+    iotWebConf->setStateChangedCallback([](NetworkState in, NetworkState out){
+      if (out == NetworkState::Connecting && _wifiConnectingCallback != nullptr){
+        _wifiConnectingCallback();
+      } else if (out == NetworkState::ApMode && _apModeCallback != nullptr){
+        _apModeCallback();
+      }
+    });
+
+
     iotWebConf->setWifiConnectionTimeoutMs(1000UL * config::wifi_timeout);
 
     iotWebConf->skipApStartup();
diff --git a/ampel-firmware/web_config.h b/ampel-firmware/web_config.h
index f0ab8d92be12dee72be7bc994d12595b8c1f289f..820b46bc33d7d08d3b17803cddabeb598599129e 100644
--- a/ampel-firmware/web_config.h
+++ b/ampel-firmware/web_config.h
@@ -69,6 +69,8 @@ namespace web_config {
   void initialize();
   void setWifiConnectionCallback(void (*success_function)());
   void setWifiFailCallback(void (*fail_function)());
+  void setWifiConnectingCallback(void (*connecting_function)());
+  void setApModeCallback(void (*ap_mode_function)());
   void update();
 
 #if defined(ESP8266)
diff --git a/ampel-firmware/wifi_util.cpp b/ampel-firmware/wifi_util.cpp
index 795eeeb9a826f1745e2df9268ce4c5ddc54625ca..4e50ec52e219afac95f0710e6a3bd250ecf9e309 100644
--- a/ampel-firmware/wifi_util.cpp
+++ b/ampel-firmware/wifi_util.cpp
@@ -37,7 +37,7 @@ namespace wifi {
       web_config::update();
       sensor_console::checkSerialInput(); // To allow reset or ssid ... during startup
       if (isAccessPoint()) {
-        led_effects::alert(0x1cff68);
+        led_effects::alert(color::turquoise);
       } else if (connected()) {
         break;
       } else {