diff --git a/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino b/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino
index fe93d98a43..34f1a85ed6 100644
--- a/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino
+++ b/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino
@@ -8,6 +8,7 @@
     - Connect to WiFi with strongest signal (RSSI)
     - Fall back to connect to next WiFi when a connection failed or lost
     - Fall back to connect to hidden SSID's which are not reported by WiFi scan
+    - Static IP assigned depending on which SSID is connected
 
     To enable debugging output, select in the Arduino iDE:
     - Tools | Debug Port: Serial
@@ -35,9 +36,26 @@ void setup() {
   wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1");
   wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
   wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");
+
+  wifiMulti.onSSIDSelected(connectedToSSID);
+
   // More is possible
 }
 
+void connectedToSSID(const char *ssid) {
+  // On connecting to the second AP, assign static IP using config(...).
+  if (strcmp(ssid, "ssid_from_AP_2") == 0) {
+    IPAddress ip2(192, 168, 1, 123);
+    IPAddress gw2(192, 168, 1, 1);
+    IPAddress subnet2(255, 255, 255, 0);
+    WiFi.config(ip2, gw2, subnet2);
+    return;
+  }
+
+  // For other SSID DHCP will be used.
+  WiFi.config(0U, 0U, 0U);
+}
+
 void loop() {
   // Maintain WiFi connection
   if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED) {
diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp
index bcd433e1b1..a052d85c7f 100644
--- a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp
+++ b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp
@@ -329,6 +329,11 @@ wl_status_t ESP8266WiFiMulti::connectWiFiMulti(uint32_t connectTimeoutMs)
             if (ssid == entry.ssid) {
                 DEBUG_WIFI_MULTI("[WIFIM] Connecting %s\n", ssid.c_str());
 
+                // User-defined callback
+                if (_onSSIDSelected) {
+                    _onSSIDSelected(entry.ssid);
+                }
+
                 // Connect to WiFi
                 WiFi.begin(ssid, entry.passphrase, channel, bssid);
 
@@ -350,6 +355,11 @@ wl_status_t ESP8266WiFiMulti::connectWiFiMulti(uint32_t connectTimeoutMs)
         if (!connectSkipIndex[i]) {
             DEBUG_WIFI_MULTI("[WIFIM] Try hidden connect %s\n", entry.ssid);
 
+            // User-defined callback
+            if (_onSSIDSelected) {
+                _onSSIDSelected(entry.ssid);
+            }
+
             // Connect to WiFi
             WiFi.begin(entry.ssid, entry.passphrase);
 
diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h
index 3c77df02d4..9d57345d27 100644
--- a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h
+++ b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h
@@ -50,29 +50,31 @@
 #define WIFI_SCAN_TIMEOUT_MS        5000
 #endif
 
-struct WifiAPEntry {
-    char *ssid;
-    char *passphrase;
-};
-
-typedef std::vector<WifiAPEntry> WifiAPlist;
-
 class ESP8266WiFiMulti
 {
 public:
+    using SSIDSelectedCallback = void (*)(const char *ssid);
+
     ESP8266WiFiMulti();
     ~ESP8266WiFiMulti();
 
     bool addAP(const char *ssid, const char *passphrase = NULL);
     bool existsAP(const char *ssid, const char *passphrase = NULL);
+    void onSSIDSelected(SSIDSelectedCallback callback) { _onSSIDSelected = callback; }
 
     wl_status_t run(uint32_t connectTimeoutMs=WIFI_CONNECT_TIMEOUT_MS);
 
     void cleanAPlist();
     int count() { return _APlist.size(); }
 private:
-    WifiAPlist _APlist;
+    struct WifiAPEntry {
+        char *ssid;
+        char *passphrase;
+    };
+
+    std::vector<WifiAPEntry> _APlist;
     bool _firstRun;
+    SSIDSelectedCallback _onSSIDSelected = NULL;
 
     bool APlistAdd(const char *ssid, const char *passphrase = NULL);
     bool APlistExists(const char *ssid, const char *passphrase = NULL);