diff --git a/src/ble/sm.c b/src/ble/sm.c
index afbeaddde..c9bf36aae 100644
--- a/src/ble/sm.c
+++ b/src/ble/sm.c
@@ -1288,11 +1288,15 @@ static void sm_address_resolution_handle_event(address_resolution_event_t event)
 
                     if (sm_connection->sm_role) {
 #ifdef ENABLE_LE_PERIPHERAL
-                        // LTK request received before, IRK required -> start LTK calculation
+                        // IRK required before, continue
                         if (sm_connection->sm_engine_state == SM_RESPONDER_PH0_RECEIVED_LTK_W4_IRK){
                             sm_connection->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST;
                             break;
                         }
+                        if (sm_connection->sm_engine_state == SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK){
+                            sm_connection->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED;
+                            break;
+                        }
                         bool trigger_security_request = (sm_connection->sm_pairing_requested != 0) || (sm_slave_request_security != 0);
                         sm_connection->sm_pairing_requested = 0;
 #ifdef ENABLE_LE_PROACTIVE_AUTHENTICATION
@@ -3781,6 +3785,9 @@ static void sm_pdu_handler(uint8_t packet_type, hci_con_handle_t con_handle, uin
         return;
     }
 
+    int have_ltk;
+    uint8_t ltk[16];
+
     switch (sm_conn->sm_engine_state){
 
         // a sm timeout requires a new physical connection
@@ -3797,8 +3804,6 @@ static void sm_pdu_handler(uint8_t packet_type, hci_con_handle_t con_handle, uin
             }
 
             // IRK complete?
-            int have_ltk;
-            uint8_t ltk[16];
             switch (sm_conn->sm_irk_lookup_state){
                 case IRK_LOOKUP_FAILED:
                     // start pairing
@@ -3932,9 +3937,18 @@ static void sm_pdu_handler(uint8_t packet_type, hci_con_handle_t con_handle, uin
             }
 
             // store pairing request
-            (void)memcpy(&sm_conn->sm_m_preq, packet,
-                         sizeof(sm_pairing_packet_t));
-            sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED;
+            (void)memcpy(&sm_conn->sm_m_preq, packet, sizeof(sm_pairing_packet_t));
+
+            // check if IRK completed
+            switch (sm_conn->sm_irk_lookup_state){
+                case IRK_LOOKUP_SUCCEEDED:
+                case IRK_LOOKUP_FAILED:
+                    sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED;
+                    break;
+                default:
+                    sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK;
+                    break;
+            }
             break;
 #endif
 
diff --git a/src/hci.h b/src/hci.h
index 035be11ef..a9101eb8e 100644
--- a/src/hci.h
+++ b/src/hci.h
@@ -330,6 +330,7 @@ typedef enum {
     SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY,
     SM_RESPONDER_PH1_W4_PAIRING_REQUEST,
     SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED,
+    SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK,
     SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE,
     SM_RESPONDER_PH1_W4_PAIRING_CONFIRM,
     SM_RESPONDER_PH2_W4_PAIRING_RANDOM,