diff --git a/src/hci.c b/src/hci.c
index 2f123eed3..3cc208325 100644
--- a/src/hci.c
+++ b/src/hci.c
@@ -3615,12 +3615,28 @@ static bool hci_run_general_gap_le(void){
     if (hci_stack->state != HCI_STATE_WORKING) return false;
     if ( (hci_stack->le_own_addr_type != BD_ADDR_TYPE_LE_PUBLIC) && (hci_stack->le_random_address_set == 0u) ) return false;
 
+    // check if whitelist needs modification
+    bool whitelist_modification_pending = false;
+    btstack_linked_list_iterator_t lit;
+    btstack_linked_list_iterator_init(&lit, &hci_stack->le_whitelist);
+    while (btstack_linked_list_iterator_has_next(&lit)){
+        whitelist_entry_t * entry = (whitelist_entry_t*) btstack_linked_list_iterator_next(&lit);
+        if (entry->state & (LE_WHITELIST_REMOVE_FROM_CONTROLLER | LE_WHITELIST_ADD_TO_CONTROLLER)){
+            whitelist_modification_pending = true;
+            break;
+        }
+    }
+
 #ifdef ENABLE_LE_CENTRAL
     // scanning control
     bool scanning_stop = false;
     if (hci_stack->le_scanning_active) {
-        // parameter change requires scanning to be off, or, it might be disabled
-        if ((hci_stack->le_scan_type != 0xffu) || !hci_stack->le_scanning_enabled){
+        // stop if:
+        // - parameter change required
+        // - it's disabled
+        // - whitelist change required but used for scanning
+        bool scanning_uses_whitelist = (hci_stack->le_scan_filter_policy & 1) == 1;
+        if ((hci_stack->le_scan_type != 0xffu) || !hci_stack->le_scanning_enabled || scanning_uses_whitelist){
             scanning_stop = false;
         }
     }
@@ -3638,20 +3654,34 @@ static bool hci_run_general_gap_le(void){
                      hci_stack->le_own_addr_type, hci_stack->le_scan_filter_policy);
         return true;
     }
+#endif
 
-    // finally, we can start scanning
-    if ((hci_stack->le_scanning_enabled && !hci_stack->le_scanning_active)){
-        hci_stack->le_scanning_active = true;
-        hci_send_cmd(&hci_le_set_scan_enable, 1, 0);
+#ifdef ENABLE_LE_CENTRAL
+    // connecting control
+    bool connecting_stop = false;
+    if (hci_stack->le_connecting_state != LE_CONNECTING_IDLE){
+        // stop connecting if modification pending
+        if (whitelist_modification_pending) {
+            connecting_stop = true;
+        }
+    }
+
+    if (connecting_stop){
+        hci_send_cmd(&hci_le_create_connection_cancel);
         return true;
     }
 #endif
+
 #ifdef ENABLE_LE_PERIPHERAL
     // le advertisement control
     bool advertising_stop = false;
     if (hci_stack->le_advertisements_active){
-        // parameter change requires scanning to be off, or, it might be disabled
-        if ((hci_stack->le_advertisements_todo != 0) && !hci_stack->le_advertisements_enabled_for_current_roles) {
+        // stop if:
+        // - parameter change required
+        // - it's disabled
+        // - whitelist change required but used for scanning
+        bool advertising_uses_whitelist = hci_stack->le_advertisements_filter_policy > 0;
+        if ((hci_stack->le_advertisements_todo != 0) || !hci_stack->le_advertisements_enabled_for_current_roles || advertising_uses_whitelist) {
             advertising_stop = true;
         }
     }
@@ -3695,46 +3725,14 @@ static bool hci_run_general_gap_le(void){
         hci_send_cmd(&hci_le_set_scan_response_data, hci_stack->le_scan_response_data_len, scan_data_clean);
         return true;
     }
-    if (hci_stack->le_advertisements_enabled_for_current_roles && (hci_stack->le_advertisements_active == 0)){
-        // check if advertisements should be enabled given
-        hci_stack->le_advertisements_active = 1;
-        hci_send_cmd(&hci_le_set_advertise_enable, 1);
-        return true;
-    }
 #endif
 
     //
     // LE Whitelist Management
     //
 
-    // check if whitelist needs modification
-    btstack_linked_list_iterator_t lit;
-    bool whitelist_modification_pending = false;
-    btstack_linked_list_iterator_init(&lit, &hci_stack->le_whitelist);
-    while (btstack_linked_list_iterator_has_next(&lit)){
-        whitelist_entry_t * entry = (whitelist_entry_t*) btstack_linked_list_iterator_next(&lit);
-        if (entry->state & (LE_WHITELIST_REMOVE_FROM_CONTROLLER | LE_WHITELIST_ADD_TO_CONTROLLER)){
-            whitelist_modification_pending = true;
-            break;
-        }
-    }
-
     if (whitelist_modification_pending){
 
-#ifdef ENABLE_LE_CENTRAL
-        bool connecting_stop = false;
-
-        // stop connecting if modification pending
-        if (hci_stack->le_connecting_state != LE_CONNECTING_IDLE) {
-            connecting_stop = true;
-        }
-
-        if (connecting_stop){
-            hci_send_cmd(&hci_le_create_connection_cancel);
-            return true;
-        }
-#endif
-
         // add/remove entries
         btstack_linked_list_iterator_init(&lit, &hci_stack->le_whitelist);
         while (btstack_linked_list_iterator_has_next(&lit)){
@@ -3756,6 +3754,24 @@ static bool hci_run_general_gap_le(void){
         }
     }
 
+#ifdef ENABLE_LE_PERIPHERAL
+    if (hci_stack->le_advertisements_enabled_for_current_roles && (hci_stack->le_advertisements_active == 0)){
+        // check if advertisements should be enabled given
+        hci_stack->le_advertisements_active = 1;
+        hci_send_cmd(&hci_le_set_advertise_enable, 1);
+        return true;
+    }
+#endif
+
+#ifdef ENABLE_LE_CENTRAL
+    // finally, we can start scanning
+    if ((hci_stack->le_scanning_enabled && !hci_stack->le_scanning_active)){
+        hci_stack->le_scanning_active = true;
+        hci_send_cmd(&hci_le_set_scan_enable, 1, 0);
+        return true;
+    }
+#endif
+
 #ifdef ENABLE_LE_CENTRAL
     // start connecting
     if ( (hci_stack->le_connecting_state == LE_CONNECTING_IDLE) &&