diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml
index 706ccb4c..a5cfe26b 100644
--- a/.github/workflows/compile-examples.yml
+++ b/.github/workflows/compile-examples.yml
@@ -35,26 +35,41 @@ jobs:
             platforms: |
               - name: arduino:samd
             artifact-name-suffix: arduino-samd-mkrwifi1010
+            type: nina
           - fqbn: arduino:samd:nano_33_iot
             platforms: |
               - name: arduino:samd
             artifact-name-suffix: arduino-samd-nano_33_iot
+            type: nina
           - fqbn: arduino:megaavr:uno2018:mode=on
             platforms: |
               - name: arduino:megaavr
             artifact-name-suffix: arduino-megaavr-uno2018
+            type: nina
           - fqbn: arduino:mbed_nano:nano33ble
             platforms: |
               - name: arduino:mbed_nano
             artifact-name-suffix: arduino-mbed_nano-nano33ble
+            type: nina
           - fqbn: arduino:mbed_nano:nanorp2040connect
             platforms: |
               - name: arduino:mbed_nano
             artifact-name-suffix: arduino-mbed_nano-nanorp2040connect
+            type: nina
           - fqbn: arduino:renesas_uno:unor4wifi
             platforms: |
               - name: arduino:renesas_uno
             artifact-name-suffix: arduino-renesas_uno-unor4wifi
+            type: unor4wifi
+
+        include:
+          - board:
+              type: nina
+            libraries: |
+              - name: WiFiNINA
+          - board:
+              type: unor4wifi
+            libraries:
 
     steps:
       - name: Checkout repository
@@ -69,6 +84,7 @@ jobs:
           libraries: |
             # Install the library from the local path.
             - source-path: ./
+            ${{ matrix.libraries }}
           sketch-paths: |
             - examples
           enable-deltas-report: true
@@ -83,7 +99,7 @@ jobs:
 
   build-for-esp32:
     runs-on: ubuntu-latest
-    
+
     strategy:
       matrix:
         fqbn:
@@ -101,6 +117,8 @@ jobs:
         with:
           github-token: ${{ secrets.GITHUB_TOKEN }}
           fqbn: ${{ matrix.fqbn }}
+          libraries: |
+            ${{ matrix.libraries }}
           platforms: |
             - name: esp32:esp32
               source-url: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
diff --git a/library.properties b/library.properties
index 543998b7..4196e767 100644
--- a/library.properties
+++ b/library.properties
@@ -8,3 +8,4 @@ category=Communication
 url=https://www.arduino.cc/en/Reference/ArduinoBLE
 architectures=samd,megaavr,mbed,apollo3,mbed_nano,mbed_portenta,mbed_nicla,esp32,mbed_giga,renesas,renesas_portenta,mbed_opta,renesas_uno,silabs
 includes=ArduinoBLE.h
+depends=WiFiNINA
diff --git a/src/local/BLELocalDevice.cpp b/src/local/BLELocalDevice.cpp
index 5792353f..7c2ae2c7 100644
--- a/src/local/BLELocalDevice.cpp
+++ b/src/local/BLELocalDevice.cpp
@@ -50,26 +50,7 @@ BLELocalDevice::~BLELocalDevice()
 
 int BLELocalDevice::begin()
 {
-#if defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_NANO_RP2040_CONNECT)
-  // reset the NINA in BLE mode
-  pinMode(SPIWIFI_SS, OUTPUT);
-  pinMode(NINA_RESETN, OUTPUT);
-  
-  digitalWrite(SPIWIFI_SS, LOW);
-#endif
-
-#if defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
-  digitalWrite(NINA_RESETN, HIGH);
-  delay(100);
-  digitalWrite(NINA_RESETN, LOW);
-  delay(750);
-#elif defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_NANO_RP2040_CONNECT)
-  // inverted reset
-  digitalWrite(NINA_RESETN, LOW);
-  delay(100);
-  digitalWrite(NINA_RESETN, HIGH);
-  delay(750);
-#elif defined(PORTENTA_H7_PINS) || defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA)
+#if defined(PORTENTA_H7_PINS) || defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA)
   // BT_REG_ON -> HIGH
   pinMode(BT_REG_ON, OUTPUT);
   digitalWrite(BT_REG_ON, LOW);
@@ -182,10 +163,10 @@ int BLELocalDevice::begin()
   //     }
   //     Serial.println();
 
-  //     // save this 
+  //     // save this
   //     uint8_t zeros[16];
   //     for(int k=0; k<16; k++) zeros[15-k] = 0;
-      
+
   //     // HCI.leAddResolvingAddress((*BADDR_Type)[i],(*BADDRs)[i],(*IRKs)[i], zeros);
 
   //     delete[] (*BADDRs)[i];
@@ -197,7 +178,7 @@ int BLELocalDevice::begin()
   //   delete BADDRs;
   //   delete[] (*IRKs);
   //   delete IRKs;
-    
+
   //   memcheck = new uint8_t[1];
   //   Serial.print("nIRK location: 0x");
   //   Serial.println((int)memcheck,HEX);
@@ -216,15 +197,9 @@ void BLELocalDevice::end()
 
   HCI.end();
 
-#if defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
-  // disable the NINA
-  digitalWrite(NINA_RESETN, HIGH);
-#elif defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_NANO_RP2040_CONNECT)
-  // disable the NINA
-  digitalWrite(NINA_RESETN, LOW);
-#elif defined(ARDUINO_PORTENTA_H7_M4) || defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA)
+#if defined(ARDUINO_PORTENTA_H7_M4) || defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA)
   digitalWrite(BT_REG_ON, LOW);
-#endif 
+#endif
   _advertisingData.clear();
   _scanResponseData.clear();
 }
@@ -310,7 +285,7 @@ bool BLELocalDevice::setManufacturerData(const uint16_t companyId, const uint8_t
 
 bool BLELocalDevice::setLocalName(const char *localName)
 {
-  return _scanResponseData.setLocalName(localName);  
+  return _scanResponseData.setLocalName(localName);
 }
 
 void BLELocalDevice::setAdvertisingData(BLEAdvertisingData& advertisingData)
@@ -355,7 +330,7 @@ int BLELocalDevice::advertise()
 {
   _advertisingData.updateData();
   _scanResponseData.updateData();
-  return GAP.advertise( _advertisingData.data(), _advertisingData.dataLength(), 
+  return GAP.advertise( _advertisingData.data(), _advertisingData.dataLength(),
                         _scanResponseData.data(), _scanResponseData.dataLength());
 }
 
diff --git a/src/utility/HCINinaSpiTransport.cpp b/src/utility/HCINinaSpiTransport.cpp
new file mode 100644
index 00000000..38d46766
--- /dev/null
+++ b/src/utility/HCINinaSpiTransport.cpp
@@ -0,0 +1,64 @@
+/*
+  This file is part of the ArduinoBLE library.
+
+  Copyright (c) 2024 Arduino SA
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*/
+
+#if defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(TARGET_NANO_RP2040_CONNECT)
+#include "HCINinaSpiTransport.h"
+#include <WiFiNINA.h>
+
+int HCINinaSpiTransportClass::begin()
+{
+  WiFiDrv::wifiDriverInit();
+  return WiFiDrv::bleBegin();
+}
+
+void HCINinaSpiTransportClass::end()
+{
+  WiFiDrv::bleEnd();
+}
+
+void HCINinaSpiTransportClass::wait(unsigned long timeout)
+{
+  for (unsigned long start = millis(); (millis() - start) < timeout;) {
+    if (available()) {
+      break;
+    }
+  }
+}
+
+int HCINinaSpiTransportClass::available()
+{
+  return WiFiDrv::bleAvailable();
+}
+
+int HCINinaSpiTransportClass::peek()
+{
+  int res=-1;
+  WiFiDrv::blePeek((uint8_t*)&res, 1); // read a single byte, if nothing is returned we return -1
+
+  return res;
+}
+
+int HCINinaSpiTransportClass::read()
+{
+  int res=-1;
+  WiFiDrv::bleRead((uint8_t*)&res, 1); // read a single byte, if nothing is returned we return -1
+
+  return res;
+}
+
+size_t HCINinaSpiTransportClass::write(const uint8_t* data, size_t length)
+{
+  return WiFiDrv::bleWrite(data, length);
+}
+
+HCINinaSpiTransportClass HCINinaSpiTransport;
+HCITransportInterface& HCITransport = HCINinaSpiTransport;
+
+#endif
diff --git a/src/utility/HCINinaSpiTransport.h b/src/utility/HCINinaSpiTransport.h
new file mode 100644
index 00000000..55cb1068
--- /dev/null
+++ b/src/utility/HCINinaSpiTransport.h
@@ -0,0 +1,32 @@
+/*
+  This file is part of the ArduinoBLE library.
+
+  Copyright (c) 2024 Arduino SA
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*/
+
+#ifndef _HCI_NINA_SPI_TRANSPORT_H_
+#define _HCI_NINA_SPI_TRANSPORT_H_
+
+#include "HCITransport.h"
+
+class HCINinaSpiTransportClass : public HCITransportInterface {
+public:
+  HCINinaSpiTransportClass() {}
+
+  virtual int begin();
+  virtual void end();
+
+  virtual void wait(unsigned long timeout);
+
+  virtual int available();
+  virtual int peek();
+  virtual int read();
+
+  virtual size_t write(const uint8_t* data, size_t length);
+};
+
+#endif
diff --git a/src/utility/HCIUartTransport.cpp b/src/utility/HCIUartTransport.cpp
index 191811a7..606c8148 100644
--- a/src/utility/HCIUartTransport.cpp
+++ b/src/utility/HCIUartTransport.cpp
@@ -17,24 +17,12 @@
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
 
-#if !defined(ARDUINO_ARCH_MBED) && !defined(ESP32) && !defined(ARDUINO_SILABS) && !defined(ARDUINO_UNOR4_WIFI) || defined(TARGET_NANO_RP2040_CONNECT) //|| defined(CORE_CM4)
+#if defined(ARDUINO_PORTENTA_C33)
 
 #include "HCIUartTransport.h"
 
-#if defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
-#define SerialHCI Serial2
-#elif defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_NANO_RP2040_CONNECT)
-// SerialHCI is already defined in the variant
-#elif defined(ARDUINO_PORTENTA_H7_M4)
-// SerialHCI is already defined in the variant
-#elif defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION)
-#define SerialHCI Serial2
-#elif defined(ARDUINO_OPTA)
-#define SerialHCI Serial3
-#elif defined(ARDUINO_PORTENTA_C33)
+#if defined(ARDUINO_PORTENTA_C33)
 #define SerialHCI Serial5
-#elif defined(ARDUINO_GIGA)
-arduino::UART SerialHCI(CYBSP_BT_UART_TX, CYBSP_BT_UART_RX, CYBSP_BT_UART_RTS, CYBSP_BT_UART_CTS);
 #else
 #error "Unsupported board selected!"
 #endif