diff --git a/system/main/shim/hci_layer.cc b/system/main/shim/hci_layer.cc
index b8efd8a2537cecd67cf39c8e3446d722afb10e6b..d3f16054884b8c7d44d26974a17efd254cd14cb2 100644
--- a/system/main/shim/hci_layer.cc
+++ b/system/main/shim/hci_layer.cc
@@ -63,7 +63,6 @@ namespace {
 bool register_event_code(bluetooth::hci::EventCode event_code) {
   switch (event_code) {
     // Inquiry
-    case bluetooth::hci::EventCode::INQUIRY_RESULT_WITH_RSSI:
     case bluetooth::hci::EventCode::EXTENDED_INQUIRY_RESULT:
 
     // SCO
diff --git a/system/stack/btm/btm_inq.cc b/system/stack/btm/btm_inq.cc
index bd5857f1e155c833b6c9f970810383a7c62aa697..f3bd777627a7b27d228452c70ec499e43c43ad98 100644
--- a/system/stack/btm/btm_inq.cc
+++ b/system/stack/btm/btm_inq.cc
@@ -695,6 +695,11 @@ tBTM_STATUS BTM_StartInquiry(tBTM_INQ_RESULTS_CB* p_results_cb,
         get_main_thread()->Bind([](bluetooth::hci::EventView event) {
           on_incoming_hci_event(event);
         }));
+    bluetooth::shim::GetHciLayer()->RegisterEventHandler(
+        bluetooth::hci::EventCode::INQUIRY_RESULT_WITH_RSSI,
+        get_main_thread()->Bind([](bluetooth::hci::EventView event) {
+          on_incoming_hci_event(event);
+        }));
 
     btm_cb.btm_inq_vars.registered_for_hci_events = true;
   }
@@ -1443,9 +1448,7 @@ static void btm_process_inq_results_standard(bluetooth::hci::EventView event) {
  * Returns          void
  *
  ******************************************************************************/
-static void btm_process_inq_results_rssi(const uint8_t* p,
-                                         uint8_t hci_evt_len) {
-  uint8_t num_resp, xx;
+static void btm_process_inq_results_rssi(bluetooth::hci::EventView event) {
   RawAddress bda;
   tINQ_DB_ENT* p_i;
   tBTM_INQ_RESULTS* p_cur = NULL;
@@ -1470,27 +1473,26 @@ static void btm_process_inq_results_rssi(const uint8_t* p,
     return;
   }
 
-  STREAM_TO_UINT8(num_resp, p);
-
-  {
-    constexpr uint16_t inquiry_result_size = 14;
-    if (hci_evt_len < num_resp * inquiry_result_size) {
-      log::error("can't fit {} results in {} bytes", num_resp, hci_evt_len);
-      return;
-    }
-  }
+  auto rssi_view = bluetooth::hci::InquiryResultWithRssiView::Create(event);
+  ASSERT(rssi_view.IsValid());
+  auto responses = rssi_view.GetResponses();
 
-  btm_cb.neighbor.classic_inquiry.results += num_resp;
-  for (xx = 0; xx < num_resp; xx++) {
+  btm_cb.neighbor.classic_inquiry.results += responses.size();
+  for (const auto& response : responses) {
     update = false;
     /* Extract inquiry results */
-    STREAM_TO_BDADDR(bda, p);
-    STREAM_TO_UINT8(page_scan_rep_mode, p);
-    STREAM_TO_UINT8(page_scan_per_mode, p);
+    bda = bluetooth::ToRawAddress(response.address_);
+    page_scan_rep_mode =
+        static_cast<uint8_t>(response.page_scan_repetition_mode_);
+    page_scan_per_mode = 0;  // reserved
+    page_scan_mode = 0;      // reserved
 
-    STREAM_TO_DEVCLASS(dc, p);
-    STREAM_TO_UINT16(clock_offset, p);
-    STREAM_TO_UINT8(rssi, p);
+    dc[0] = response.class_of_device_.cod[2];
+    dc[1] = response.class_of_device_.cod[1];
+    dc[2] = response.class_of_device_.cod[0];
+
+    clock_offset = response.clock_offset_;
+    rssi = response.rssi_;
 
     p_i = btm_inq_db_find(bda);
 
@@ -1770,7 +1772,7 @@ void btm_process_inq_results(const uint8_t* p, uint8_t hci_evt_len,
       LOG_ALWAYS_FATAL("Please use PDL for STANDARD results");
       break;
     case BTM_INQ_RESULT_WITH_RSSI:
-      btm_process_inq_results_rssi(p, hci_evt_len);
+      LOG_ALWAYS_FATAL("Please use PDL for RSSI results");
       break;
     case BTM_INQ_RESULT_EXTENDED:
       btm_process_inq_results_extended(p, hci_evt_len);
@@ -2529,6 +2531,9 @@ static void on_incoming_hci_event(bluetooth::hci::EventView event) {
     case bluetooth::hci::EventCode::INQUIRY_RESULT:
       btm_process_inq_results_standard(event);
       break;
+    case bluetooth::hci::EventCode::INQUIRY_RESULT_WITH_RSSI:
+      btm_process_inq_results_rssi(event);
+      break;
     default:
       log::warn("Dropping unhandled event: {}",
                 bluetooth::hci::EventCodeText(event_code));
diff --git a/system/stack/btu/btu_hcif.cc b/system/stack/btu/btu_hcif.cc
index c9276b9759ef78f3bced8b3c58a09f18f7c96360..52a07ddd415a9b4dd11fd397620f56597da01905 100644
--- a/system/stack/btu/btu_hcif.cc
+++ b/system/stack/btu/btu_hcif.cc
@@ -232,9 +232,6 @@ void btu_hcif_process_event(UNUSED_ATTR uint8_t controller_id,
   btu_hcif_log_event_metrics(hci_evt_code, p);
 
   switch (hci_evt_code) {
-    case HCI_INQUIRY_RSSI_RESULT_EVT:
-      btm_process_inq_results(p, hci_evt_len, BTM_INQ_RESULT_WITH_RSSI);
-      break;
     case HCI_EXTENDED_INQUIRY_RESULT_EVT:
       btm_process_inq_results(p, hci_evt_len, BTM_INQ_RESULT_EXTENDED);
       break;