diff --git a/cores/esp32/IPAddress.cpp b/cores/esp32/IPAddress.cpp
index 74fabaf0f9c..1fd2a08e9c5 100644
--- a/cores/esp32/IPAddress.cpp
+++ b/cores/esp32/IPAddress.cpp
@@ -201,7 +201,13 @@ bool IPAddress::fromString6(const char *address) {
       colons++;
       acc = 0;
     } else if (c == '%') {
-      _zone = netif_name_to_index(address);
+      // netif_index_to_name crashes on latest esp-idf
+      // _zone = netif_name_to_index(address);
+      // in the interim, we parse the suffix as a zone number
+      while ((*address != '\0') && (!isdigit(*address))) {  // skip all non-digit after '%'
+        address++;
+      }
+      _zone = atol(address) + 1;  // increase by one by convention, so we can have zone '0'
       while (*address != '\0') {
         address++;
       }
@@ -351,6 +357,19 @@ size_t IPAddress::printTo(Print &p, bool includeZone) const {
     //   netif_index_to_name(_zone, if_name);
     //   n += p.print(if_name);
     // }
+    // In the interim, we just output the index number
+    if (_zone > 0 && includeZone) {
+      n += p.print('%');
+      // look for the interface name
+      for (netif *intf = netif_list; intf != nullptr; intf = intf->next) {
+        if (_zone - 1 == intf->num) {
+          n += p.print(intf->name[0]);
+          n += p.print(intf->name[1]);
+          break;
+        }
+      }
+      n += p.print(_zone - 1);
+    }
     return n;
   }