diff --git a/source/board/microbitv2/kl27z/power.c b/source/board/microbitv2/kl27z/power.c
index 91b4dd20f8..fe67a21c72 100644
--- a/source/board/microbitv2/kl27z/power.c
+++ b/source/board/microbitv2/kl27z/power.c
@@ -106,7 +106,7 @@ void PORTCD_IRQHandler(void)
             USBD_Reset();
             usbd_reset_core();
             usb_pc_connected = false;
-            usb_state = USB_DISCONNECTED;
+            usb_state = USB_DISCONNECTING;
         }
         else {
             // Cable inserted
diff --git a/source/board/microbitv2/nrf52820/power.c b/source/board/microbitv2/nrf52820/power.c
index 1f4e6d31de..52f5dde1f9 100644
--- a/source/board/microbitv2/nrf52820/power.c
+++ b/source/board/microbitv2/nrf52820/power.c
@@ -247,7 +247,7 @@ void GPIOTE_IRQHandler(void)
                 USBD_Reset();
                 usbd_reset_core();
                 usb_pc_connected = false;
-                usb_state = USB_DISCONNECTED;
+                usb_state = USB_DISCONNECTING;
             } else {
                 // Cable inserted
                 wake_from_usb = 1;
@@ -272,7 +272,7 @@ void POWER_CLOCK_IRQHandler(void)
         USBD_Reset();
         usbd_reset_core();
         usb_pc_connected = false;
-        usb_state = USB_DISCONNECTED;
+        usb_state = USB_DISCONNECTING;
     }
 }
 #endif // POWER_IRQ_USBDETECTED
diff --git a/source/daplink/interface/main_interface.c b/source/daplink/interface/main_interface.c
index 76bd7240f3..0240455474 100644
--- a/source/daplink/interface/main_interface.c
+++ b/source/daplink/interface/main_interface.c
@@ -401,9 +401,13 @@ void main_task(void * arg)
             switch (usb_state) {
                 case USB_DISCONNECTING:
                     usb_state = USB_DISCONNECTED;
-                    // Disable board power before USB is disconnected.
+                    // Disable target power as USB was disconnected.
                     gpio_set_board_power(false);
-                    usbd_connect(0);
+                    // Clear the DAP queue buffers
+#if (USBD_HID_ENABLE)
+                    usbd_bulk_init();
+                    usbd_hid_init();
+#endif
                     break;
 
                 case USB_CONNECTING:
@@ -435,12 +439,16 @@ void main_task(void * arg)
                     break;
 
                 case USB_CONNECTED:
+                    if (!usbd_configured()) {
+                        usb_state = USB_DISCONNECTING;
+                    }
+                    break;
+
                 case USB_DISCONNECTED:
                     if (usbd_configured()) {
                         usb_state = USB_CONNECTED;
                     }
                     else {
-                        usb_state = USB_DISCONNECTED;
                         usb_state_count = USB_CONNECT_DELAY;
                         usb_no_config_count = USB_CONFIGURE_TIMEOUT;
                     }