diff --git a/system/bta/dm/bta_dm_act.cc b/system/bta/dm/bta_dm_act.cc
index b7adf9e07d9f223bd35abb8502cb663e59181e32..e08b8943cc04cee81937e895899f4c6dc2ec292a 100644
--- a/system/bta/dm/bta_dm_act.cc
+++ b/system/bta/dm/bta_dm_act.cc
@@ -4378,155 +4378,6 @@ void bta_dm_ble_set_data_length(tBTA_DM_MSG* p_data) {
   }
 }
 
-/*******************************************************************************
- *
- * Function         bta_dm_ble_setup_storage
- *
- * Description      This function configures up the storage parameters for ADV
- *                  batch scanning
- *
- * Parameters:
- *
- ******************************************************************************/
-void bta_dm_ble_setup_storage(uint8_t batch_scan_full_max,
-                              uint8_t batch_scan_trunc_max,
-                              uint8_t batch_scan_notify_threshold,
-                              tBTA_BLE_SCAN_SETUP_CBACK* p_setup_cback,
-                              tBTA_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback,
-                              tBTA_BLE_SCAN_REP_CBACK* p_read_rep_cback,
-                              tBTM_BLE_REF_VALUE ref_value) {
-  tBTM_STATUS btm_status = BTM_BleSetStorageConfig(
-      batch_scan_full_max, batch_scan_trunc_max, batch_scan_notify_threshold,
-      p_setup_cback, p_thres_cback, p_read_rep_cback, ref_value);
-  if (btm_status != BTM_CMD_STARTED)
-    bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, ref_value,
-                          btm_status);
-}
-
-/*******************************************************************************
- *
- * Function         bta_dm_ble_enable_batch_scan
- *
- * Description      This function sets up the parameters and enables batch scan
- *
- * Parameters:
- *
- ******************************************************************************/
-void bta_dm_ble_enable_batch_scan(tBTA_BLE_BATCH_SCAN_MODE scan_mode,
-                                  uint32_t scan_int, uint32_t scan_window,
-                                  tBTA_BLE_DISCARD_RULE discard_rule,
-                                  tBLE_ADDR_TYPE addr_type,
-                                  tBTM_BLE_REF_VALUE ref_value) {
-  tBTM_STATUS btm_status = BTM_BleEnableBatchScan(
-      scan_mode, scan_int, scan_window, discard_rule, addr_type, ref_value);
-  if (BTM_CMD_STARTED != btm_status)
-    bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_ENABLE_EVT, ref_value, btm_status);
-}
-
-/*******************************************************************************
- *
- * Function         bta_dm_ble_disable_batch_scan
- *
- * Description      This function disables the batch scan
- *
- * Parameters:
- *
- ******************************************************************************/
-void bta_dm_ble_disable_batch_scan(tBTM_BLE_REF_VALUE ref_value) {
-  tBTM_STATUS btm_status = BTM_BleDisableBatchScan(ref_value);
-  if (btm_status != BTM_CMD_STARTED)
-    bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_DISABLE_EVT, ref_value,
-                          btm_status);
-}
-
-/*******************************************************************************
- *
- * Function         bta_dm_ble_read_scan_reports
- *
- * Description      This function reads the batch scan reports
- *
- * Parameters:
- *
- ******************************************************************************/
-void bta_dm_ble_read_scan_reports(tBTA_BLE_BATCH_SCAN_MODE scan_type,
-                                  tBTM_BLE_REF_VALUE ref_value) {
-  tBTM_STATUS btm_status = BTM_BleReadScanReports(scan_type, ref_value);
-  if (btm_status != BTM_CMD_STARTED)
-    bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, ref_value,
-                          btm_status);
-}
-
-/*******************************************************************************
- *
- * Function         bta_dm_ble_track_advertiser
- *
- * Description      This function tracks the specific advertiser
- *
- * Parameters:
- *
- ******************************************************************************/
-void bta_dm_ble_track_advertiser(tBTA_DM_MSG* p_data) {
-  tBTM_STATUS btm_status = 0;
-  BD_ADDR bda;
-  memset(&bda, 0, sizeof(BD_ADDR));
-  tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
-  tBTA_DM_BLE_TRACK_ADV_DATA track_adv_data;
-
-  BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-
-  if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) {
-    btm_status = BTM_BleTrackAdvertiser(
-        (tBTM_BLE_TRACK_ADV_CBACK*)p_data->ble_track_advert.p_track_adv_cback,
-        p_data->ble_track_advert.ref_value);
-  }
-
-  if (BTM_CMD_STARTED != btm_status) {
-    memset(&track_adv_data, 0, sizeof(tBTA_DM_BLE_TRACK_ADV_DATA));
-    track_adv_data.advertiser_info_present =
-        NO_ADV_INFO_PRESENT; /* Indicates failure */
-    track_adv_data.client_if = (uint8_t)p_data->ble_track_advert.ref_value;
-    p_data->ble_track_advert.p_track_adv_cback(&track_adv_data);
-  }
-}
-
-/*******************************************************************************
- *
- * Function         bta_ble_scan_setup_cb
- *
- * Description      Handle the setup callback from BTM layer and forward it to
- *                  app layer
- *
- * Parameters:
- *
- ******************************************************************************/
-void bta_ble_scan_setup_cb(tBTM_BLE_BATCH_SCAN_EVT evt,
-                           tBTM_BLE_REF_VALUE ref_value, tBTM_STATUS status) {
-  tBTA_BLE_BATCH_SCAN_EVT bta_evt = 0;
-
-  APPL_TRACE_DEBUG("bta_ble_scan_setup_cb : evt: %d, ref_value: %d, status:%d",
-                   evt, ref_value, status);
-
-  switch (evt) {
-    case BTM_BLE_BATCH_SCAN_ENABLE_EVT:
-      bta_evt = BTA_BLE_BATCH_SCAN_ENB_EVT;
-      break;
-    case BTM_BLE_BATCH_SCAN_CFG_STRG_EVT:
-      bta_evt = BTA_BLE_BATCH_SCAN_CFG_STRG_EVT;
-      break;
-    case BTM_BLE_BATCH_SCAN_DISABLE_EVT:
-      bta_evt = BTA_BLE_BATCH_SCAN_DIS_EVT;
-      break;
-    case BTM_BLE_BATCH_SCAN_PARAM_EVT:
-      bta_evt = BTA_BLE_BATCH_SCAN_PARAM_EVT;
-      break;
-    default:
-      break;
-  }
-
-  if (NULL != bta_dm_cb.p_setup_cback)
-    bta_dm_cb.p_setup_cback(bta_evt, ref_value, status);
-}
-
 /*******************************************************************************
  *
  * Function         bta_ble_enable_scan_cmpl
diff --git a/system/bta/dm/bta_dm_api.cc b/system/bta/dm/bta_dm_api.cc
index 8c750441e2163ef26d68ef42f5bded324ec73209..91d38a68009e8f3413dbf08ff738a031b5769881 100644
--- a/system/bta/dm/bta_dm_api.cc
+++ b/system/bta/dm/bta_dm_api.cc
@@ -783,160 +783,6 @@ void BTA_DmSetBleConnScanParams(uint32_t scan_interval, uint32_t scan_window) {
   bta_sys_sendmsg(p_msg);
 }
 
-/*******************************************************************************
- *
- * Function         BTA_DmSetBleScanParams
- *
- * Description      This function is called to set scan parameters
- *
- * Parameters:      client_if - Client IF
- *                  scan_interval - scan interval
- *                  scan_window - scan window
- *                  scan_mode - scan mode
- *                  scan_param_setup_status_cback - Set scan param status
- *                                                  callback
- *
- * Returns          void
- *
- ******************************************************************************/
-
-void BTA_DmSetBleScanParams(
-    tGATT_IF client_if, uint32_t scan_interval, uint32_t scan_window,
-    tBLE_SCAN_MODE scan_mode,
-    tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback) {
-  do_in_bta_thread(FROM_HERE,
-                   base::Bind(&BTM_BleSetScanParams, client_if, scan_interval,
-                              scan_window, scan_mode, scan_param_setup_cback));
-}
-
-/*******************************************************************************
- *                      BLE ADV data management API
- ******************************************************************************/
-
-/*******************************************************************************
- *
- * Function         BTA_DmBleSetStorageParams
- *
- * Description      This function is called to override the BTA scan response.
- *
- * Parameters       batch_scan_full_max -Max storage space (in %) allocated to
- *                                       full scanning
- *                  batch_scan_trunc_max -Max storage space (in %) allocated to
- *                                        truncated scanning
- *                  batch_scan_notify_threshold -Setup notification level based
- *                                               on total space
- *                  p_setup_cback - Setup callback pointer
- *                  p_thres_cback - Threshold callback pointer
- *                  p_rep_cback - Reports callback pointer
- *                  ref_value - Ref value
- *
- * Returns          None
- *
- ******************************************************************************/
-extern void BTA_DmBleSetStorageParams(
-    uint8_t batch_scan_full_max, uint8_t batch_scan_trunc_max,
-    uint8_t batch_scan_notify_threshold,
-    tBTA_BLE_SCAN_SETUP_CBACK* p_setup_cback,
-    tBTA_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback,
-    tBTA_BLE_SCAN_REP_CBACK* p_rep_cback, tBTM_BLE_REF_VALUE ref_value) {
-  bta_dm_cb.p_setup_cback = p_setup_cback;
-  do_in_bta_thread(
-      FROM_HERE,
-      base::Bind(&bta_dm_ble_setup_storage, batch_scan_full_max,
-                 batch_scan_trunc_max, batch_scan_notify_threshold,
-                 bta_ble_scan_setup_cb, p_thres_cback, p_rep_cback, ref_value));
-}
-
-/*******************************************************************************
- *
- * Function         BTA_DmBleEnableBatchScan
- *
- * Description      This function is called to enable the batch scan
- *
- * Parameters       scan_mode -Batch scan mode
- *                  scan_interval - Scan interval
- *                  scan_window - Scan window
- *                  discard_rule -Discard rules
- *                  addr_type - Address type
- *                  ref_value - Reference value
- *
- * Returns          None
- *
- ******************************************************************************/
-extern void BTA_DmBleEnableBatchScan(tBTA_BLE_BATCH_SCAN_MODE scan_mode,
-                                     uint32_t scan_interval,
-                                     uint32_t scan_window,
-                                     tBTA_BLE_DISCARD_RULE discard_rule,
-                                     tBLE_ADDR_TYPE addr_type,
-                                     tBTM_BLE_REF_VALUE ref_value) {
-  do_in_bta_thread(FROM_HERE, base::Bind(&bta_dm_ble_enable_batch_scan,
-                                         scan_mode, scan_interval, scan_window,
-                                         discard_rule, addr_type, ref_value));
-}
-
-/*******************************************************************************
- *
- * Function         BTA_DmBleDisableBatchScan
- *
- * Description      This function is called to disable the batch scan
- *
- * Parameters       ref_value - Reference value
- *
- * Returns          None
- *
- ******************************************************************************/
-extern void BTA_DmBleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value) {
-  do_in_bta_thread(FROM_HERE,
-                   base::Bind(&bta_dm_ble_disable_batch_scan, ref_value));
-}
-
-/*******************************************************************************
- *
- * Function         BTA_DmBleReadScanReports
- *
- * Description      This function is called to read scan reports
- *
- * Parameters       scan_type -Batch scan mode
- *                  ref_value - Reference value
- *
- * Returns          None
- *
- ******************************************************************************/
-extern void BTA_DmBleReadScanReports(tBTA_BLE_BATCH_SCAN_MODE scan_type,
-                                     tBTM_BLE_REF_VALUE ref_value) {
-  do_in_bta_thread(FROM_HERE, base::Bind(&bta_dm_ble_read_scan_reports,
-                                         scan_type, ref_value));
-}
-
-/*******************************************************************************
- *
- * Function         BTA_DmBleTrackAdvertiser
- *
- * Description      This function is called to track advertiser
- *
- * Parameters       ref_value - Reference value
- *                  p_track_adv_cback - Track ADV callback
- *
- * Returns          None
- *
- ******************************************************************************/
-extern void BTA_DmBleTrackAdvertiser(
-    tBTM_BLE_REF_VALUE ref_value, tBTA_BLE_TRACK_ADV_CBACK* p_track_adv_cback) {
-  tBTA_DM_API_TRACK_ADVERTISER* p_msg =
-      (tBTA_DM_API_TRACK_ADVERTISER*)osi_malloc(
-          sizeof(tBTA_DM_API_TRACK_ADVERTISER));
-
-  p_msg->hdr.event = BTA_DM_API_BLE_TRACK_ADVERTISER_EVT;
-  p_msg->p_track_adv_cback = p_track_adv_cback;
-  p_msg->ref_value = ref_value;
-
-  bta_sys_sendmsg(p_msg);
-}
-
-/*******************************************************************************
- *                      BLE ADV data management API
- ******************************************************************************/
-
 /**
  * Set BLE connectable mode to auto connect
  */
diff --git a/system/bta/dm/bta_dm_int.h b/system/bta/dm/bta_dm_int.h
index 96a293562f7e1097a02befa9102cdb4b27382c5a..de6b7284d5557bb1c07a09c70697add21755adef 100644
--- a/system/bta/dm/bta_dm_int.h
+++ b/system/bta/dm/bta_dm_int.h
@@ -89,7 +89,6 @@ enum {
   BTA_DM_API_LOCAL_PRIVACY_EVT,
 #endif
   BTA_DM_API_SET_DATA_LENGTH_EVT,
-  BTA_DM_API_BLE_TRACK_ADVERTISER_EVT,
   BTA_DM_API_BLE_ENERGY_INFO_EVT,
 
   BTA_DM_API_ENABLE_TEST_MODE_EVT,
@@ -414,13 +413,6 @@ typedef struct {
 
 } tBTA_DM_API_BLE_FEATURE;
 
-/* adv data structure */
-typedef struct {
-  BT_HDR hdr;
-  tBTM_BLE_REF_VALUE ref_value;
-  tBTA_BLE_TRACK_ADV_CBACK* p_track_adv_cback;
-} tBTA_DM_API_TRACK_ADVERTISER;
-
 typedef struct {
   BT_HDR hdr;
   tBTA_BLE_ENERGY_INFO_CBACK* p_energy_info_cback;
@@ -511,7 +503,6 @@ typedef union {
   tBTA_DM_API_UPDATE_CONN_PARAM ble_update_conn_params;
   tBTA_DM_API_BLE_SET_DATA_LENGTH ble_set_data_length;
 
-  tBTA_DM_API_TRACK_ADVERTISER ble_track_advert;
   tBTA_DM_API_ENERGY_INFO ble_energy_info;
 
   tBTA_DM_API_REMOVE_ACL remove_acl;
@@ -617,7 +608,6 @@ typedef struct {
   bool is_bta_dm_active;
   tBTA_DM_ACTIVE_LINK device_list;
   tBTA_DM_SEC_CBACK* p_sec_cback;
-  tBTA_BLE_SCAN_SETUP_CBACK* p_setup_cback;
   tBTA_BLE_ENERGY_INFO_CBACK* p_energy_info_cback;
   uint16_t state;
   bool disabling;
@@ -840,22 +830,6 @@ extern void bta_dm_ble_set_adv_params(uint16_t adv_int_min,
 
 extern void bta_dm_ble_set_data_length(tBTA_DM_MSG* p_data);
 
-extern void bta_dm_ble_setup_storage(
-    uint8_t batch_scan_full_max, uint8_t batch_scan_trunc_max,
-    uint8_t batch_scan_notify_threshold,
-    tBTA_BLE_SCAN_SETUP_CBACK* p_setup_cback,
-    tBTA_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback,
-    tBTA_BLE_SCAN_REP_CBACK* p_read_rep_cback, tBTM_BLE_REF_VALUE ref_value);
-extern void bta_dm_ble_enable_batch_scan(tBTA_BLE_BATCH_SCAN_MODE scan_mode,
-                                         uint32_t scan_int,
-                                         uint32_t scan_window,
-                                         tBTA_BLE_DISCARD_RULE discard_rule,
-                                         tBLE_ADDR_TYPE addr_type,
-                                         tBTM_BLE_REF_VALUE ref_value);
-extern void bta_dm_ble_disable_batch_scan(tBTM_BLE_REF_VALUE ref_value);
-extern void bta_dm_ble_read_scan_reports(tBTA_BLE_BATCH_SCAN_MODE scan_type,
-                                         tBTM_BLE_REF_VALUE ref_value);
-extern void bta_dm_ble_track_advertiser(tBTA_DM_MSG* p_data);
 extern void bta_dm_ble_get_energy_info(tBTA_DM_MSG* p_data);
 
 extern void bta_dm_set_encryption(tBTA_DM_MSG* p_data);
diff --git a/system/bta/dm/bta_dm_main.cc b/system/bta/dm/bta_dm_main.cc
index 72a356b6afebf7ac0fb334c138dd58fb6fa1ea76..d91eaba541876544caf3c632c9ca74d1917a0ca5 100644
--- a/system/bta/dm/bta_dm_main.cc
+++ b/system/bta/dm/bta_dm_main.cc
@@ -83,7 +83,6 @@ const tBTA_DM_ACTION bta_dm_action[] = {
     bta_dm_ble_config_local_privacy, /* BTA_DM_API_LOCAL_PRIVACY_EVT */
 #endif
     bta_dm_ble_set_data_length, /* BTA_DM_API_SET_DATA_LENGTH_EVT */
-    bta_dm_ble_track_advertiser,   /* BTA_DM_API_BLE_TRACK_ADVERTISER_EVT */
     bta_dm_ble_get_energy_info,    /* BTA_DM_API_BLE_ENERGY_INFO_EVT */
 
     bta_dm_enable_test_mode,  /*  BTA_DM_API_ENABLE_TEST_MODE_EVT     */
diff --git a/system/bta/include/bta_api.h b/system/bta/include/bta_api.h
index a8a7240cdc7b43586f8e9c2bf6592d64f2fff7b4..c1cfa8cd68d901291065557ca46a6c062b8c2427 100644
--- a/system/bta/include/bta_api.h
+++ b/system/bta/include/bta_api.h
@@ -332,18 +332,6 @@ typedef uint8_t tBTA_BLE_DISCARD_RULE;
 enum { BTA_BLE_ADV_SEEN_FIRST_TIME = 0, BTA_BLE_ADV_TRACKING_TIMEOUT = 1 };
 typedef uint8_t tBTA_BLE_ADV_CHANGE_REASON;
 
-enum {
-  BTA_BLE_BATCH_SCAN_ENB_EVT = 1,
-  BTA_BLE_BATCH_SCAN_CFG_STRG_EVT = 2,
-  BTA_BLE_BATCH_SCAN_DATA_EVT = 3,
-  BTA_BLE_BATCH_SCAN_THRES_EVT = 4,
-  BTA_BLE_BATCH_SCAN_PARAM_EVT = 5,
-  BTA_BLE_BATCH_SCAN_DIS_EVT = 6
-};
-typedef tBTM_BLE_BATCH_SCAN_EVT tBTA_BLE_BATCH_SCAN_EVT;
-
-typedef tBTM_BLE_TRACK_ADV_ACTION tBTA_BLE_TRACK_ADV_ACTION;
-
 /* BLE customer specific feature function type definitions */
 /* data type used on customer specific feature for RSSI monitoring */
 #define BTA_BLE_RSSI_ALERT_HI 0
@@ -828,25 +816,6 @@ typedef uint8_t tBTA_DM_BLE_ADV_INFO_PRESENT;
 typedef uint8_t tBTA_DM_BLE_RSSI_VALUE;
 typedef uint16_t tBTA_DM_BLE_ADV_INFO_TIMESTAMP;
 
-typedef tBTM_BLE_TRACK_ADV_DATA tBTA_DM_BLE_TRACK_ADV_DATA;
-
-typedef void(tBTA_BLE_SCAN_THRESHOLD_CBACK)(tBTM_BLE_REF_VALUE ref_value);
-
-typedef void(tBTA_BLE_SCAN_REP_CBACK)(tBTM_BLE_REF_VALUE ref_value,
-                                      uint8_t report_format,
-                                      uint8_t num_records, uint16_t data_len,
-                                      uint8_t* p_rep_data, tBTA_STATUS status);
-
-typedef void(tBTA_BLE_SCAN_SETUP_CBACK)(tBTA_BLE_BATCH_SCAN_EVT evt,
-                                        tBTM_BLE_REF_VALUE ref_value,
-                                        tBTA_STATUS status);
-
-typedef void(tBTA_BLE_TRACK_ADV_CMPL_CBACK)(int action, tBTA_STATUS status,
-                                            tBTM_BLE_PF_AVBL_SPACE avbl_space,
-                                            tBTM_BLE_REF_VALUE ref_value);
-
-typedef void(tBTA_BLE_TRACK_ADV_CBACK)(tBTA_DM_BLE_TRACK_ADV_DATA* p_adv_data);
-
 typedef void(tBTA_BLE_ENERGY_INFO_CBACK)(tBTA_DM_BLE_TX_TIME_MS tx_time,
                                          tBTA_DM_BLE_RX_TIME_MS rx_time,
                                          tBTA_DM_BLE_IDLE_TIME_MS idle_time,
@@ -1563,27 +1532,6 @@ extern void BTA_DmSetBlePrefConnParams(const BD_ADDR bd_addr,
 extern void BTA_DmSetBleConnScanParams(uint32_t scan_interval,
                                        uint32_t scan_window);
 
-/*******************************************************************************
- *
- * Function         BTA_DmSetBleScanParams
- *
- * Description      This function is called to set scan parameters
- *
- * Parameters:      client_if - Client IF
- *                  scan_interval - scan interval
- *                  scan_window - scan window
- *                  scan_mode - scan mode
- *                  scan_param_setup_status_cback - Set scan param status
- *                                                  callback
- *
- * Returns          void
- *
- ******************************************************************************/
-extern void BTA_DmSetBleScanParams(
-    tGATT_IF client_if, uint32_t scan_interval, uint32_t scan_window,
-    tBLE_SCAN_MODE scan_mode,
-    tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_status_cback);
-
 /*******************************************************************************
  *
  * Function         BTA_DmSearchExt
@@ -1754,102 +1702,6 @@ extern void BTA_DmBleUpdateConnectionParams(const BD_ADDR bd_addr,
 extern void BTA_DmBleSetDataLength(BD_ADDR remote_device,
                                    uint16_t tx_data_length);
 
-/*******************************************************************************
- *
- * Function         BTA_DmBleSetStorageParams
- *
- * Description      This function is called to set the storage parameters
- *
- * Parameters       batch_scan_full_max -Max storage space (in %) allocated to
- *                                       full scanning
- *                  batch_scan_trunc_max -Max storage space (in %) allocated to
- *                                        truncated scanning
- *                  batch_scan_notify_threshold - Setup notification level based
- *                                                on total space consumed by
- *                                                both pools. Setting it to 0
- *                                                will disable threshold
- *                                                notification
- *                  p_setup_cback - Setup callback
- *                  p_thres_cback - Threshold callback
- *                  p_rep_cback - Reports callback
- *                  ref_value - Reference value
- *
- * Returns           None
- *
- ******************************************************************************/
-extern void BTA_DmBleSetStorageParams(
-    uint8_t batch_scan_full_max, uint8_t batch_scan_trunc_max,
-    uint8_t batch_scan_notify_threshold,
-    tBTA_BLE_SCAN_SETUP_CBACK* p_setup_cback,
-    tBTA_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback,
-    tBTA_BLE_SCAN_REP_CBACK* p_rep_cback, tBTM_BLE_REF_VALUE ref_value);
-
-/*******************************************************************************
- *
- * Function         BTA_DmBleEnableBatchScan
- *
- * Description      This function is called to enable the batch scan
- *
- * Parameters       scan_mode -Batch scan mode
- *                  scan_interval - Scan interval
- *                  scan_window - Scan window
- *                  discard_rule -Discard rules
- *                  addr_type - Address type
- *                  ref_value - Reference value
- *
- * Returns           None
- *
- ******************************************************************************/
-extern void BTA_DmBleEnableBatchScan(tBTA_BLE_BATCH_SCAN_MODE scan_mode,
-                                     uint32_t scan_interval,
-                                     uint32_t scan_window,
-                                     tBTA_BLE_DISCARD_RULE discard_rule,
-                                     tBLE_ADDR_TYPE addr_type,
-                                     tBTM_BLE_REF_VALUE ref_value);
-
-/*******************************************************************************
- *
- * Function         BTA_DmBleReadScanReports
- *
- * Description      This function is called to read the batch scan reports
- *
- * Parameters       scan_mode -Batch scan mode
- *                  ref_value - Reference value
- *
- * Returns          None
- *
- ******************************************************************************/
-extern void BTA_DmBleReadScanReports(tBTA_BLE_BATCH_SCAN_MODE scan_type,
-                                     tBTM_BLE_REF_VALUE ref_value);
-
-/*******************************************************************************
- *
- * Function         BTA_DmBleDisableBatchScan
- *
- * Description      This function is called to disable the batch scanning
- *
- * Parameters       ref_value - Reference value
- *
- * Returns          None
- *
- ******************************************************************************/
-extern void BTA_DmBleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value);
-
-/*******************************************************************************
- *
- * Function         BTA_DmBleTrackAdvertiser
- *
- * Description      This function is called to track the advertiser
- *
- * Parameters    ref_value - Reference value
- *               p_track_adv_cback - ADV callback
- *
- * Returns          None
- *
- ******************************************************************************/
-extern void BTA_DmBleTrackAdvertiser(
-    tBTM_BLE_REF_VALUE ref_value, tBTA_BLE_TRACK_ADV_CBACK* p_track_adv_cback);
-
 /*******************************************************************************
  *
  * Function         BTA_DmBleGetEnergyInfo
diff --git a/system/btif/src/btif_ble_scanner.cc b/system/btif/src/btif_ble_scanner.cc
index 60aa5f3785da7e7febb42bb03b4ecc9d0ced5499..0dddfd73cc22a7be0e8d1aada094964a6f7dda18 100644
--- a/system/btif/src/btif_ble_scanner.cc
+++ b/system/btif/src/btif_ble_scanner.cc
@@ -204,64 +204,15 @@ void bta_scan_filt_status_cb(tBTM_BLE_REF_VALUE ref_value, uint8_t action,
   SCAN_CBACK_IN_JNI(scan_filter_status_cb, action, ref_value, status);
 }
 
-void bta_batch_scan_setup_cb(tBTA_BLE_BATCH_SCAN_EVT evt,
-                             tBTM_BLE_REF_VALUE ref_value, tBTA_STATUS status) {
-  BTIF_TRACE_DEBUG("bta_batch_scan_setup_cb-Status:%x, client_if:%d, evt=%d",
-                   status, ref_value, evt);
-
-  switch (evt) {
-    case BTA_BLE_BATCH_SCAN_ENB_EVT: {
-      SCAN_CBACK_IN_JNI(batchscan_enb_disable_cb, 1, ref_value, status);
-      return;
-    }
-
-    case BTA_BLE_BATCH_SCAN_DIS_EVT: {
-      SCAN_CBACK_IN_JNI(batchscan_enb_disable_cb, 0, ref_value, status);
-      return;
-    }
-
-    case BTA_BLE_BATCH_SCAN_CFG_STRG_EVT: {
-      SCAN_CBACK_IN_JNI(batchscan_cfg_storage_cb, ref_value, status);
-      return;
-    }
-
-    case BTA_BLE_BATCH_SCAN_DATA_EVT: {
-      SCAN_CBACK_IN_JNI(batchscan_reports_cb, ref_value, status, 0, 0,
-                        vector<uint8_t>());
-      return;
-    }
-
-    case BTA_BLE_BATCH_SCAN_THRES_EVT: {
-      SCAN_CBACK_IN_JNI(batchscan_threshold_cb, ref_value);
-      return;
-    }
-
-    default:
-      return;
-  }
-}
-
 void bta_batch_scan_threshold_cb(tBTM_BLE_REF_VALUE ref_value) {
   SCAN_CBACK_IN_JNI(batchscan_threshold_cb, ref_value);
 }
 
-void bta_batch_scan_reports_cb(tBTM_BLE_REF_VALUE ref_value,
+void bta_batch_scan_reports_cb(int client_id, tBTA_STATUS status,
                                uint8_t report_format, uint8_t num_records,
-                               uint16_t data_len, uint8_t* p_rep_data,
-                               tBTA_STATUS status) {
-  BTIF_TRACE_DEBUG("%s - client_if:%d, %d, %d, %d", __func__, ref_value, status,
-                   num_records, data_len);
-
-  if (data_len > 0) {
-    vector<uint8_t> data(p_rep_data, p_rep_data + data_len);
-    osi_free(p_rep_data);
-
-    SCAN_CBACK_IN_JNI(batchscan_reports_cb, ref_value, status, report_format,
-                      num_records, std::move(data));
-  } else {
-    SCAN_CBACK_IN_JNI(batchscan_reports_cb, ref_value, status, report_format,
-                      num_records, vector<uint8_t>());
-  }
+                               std::vector<uint8_t> data) {
+  SCAN_CBACK_IN_JNI(batchscan_reports_cb, client_id, status, report_format,
+                    num_records, std::move(data));
 }
 
 void bta_scan_results_cb_impl(bt_bdaddr_t bd_addr, tBT_DEVICE_TYPE device_type,
@@ -340,7 +291,7 @@ void bta_scan_results_cb(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {
                         p_data->inq_res.ble_addr_type, std::move(value)));
 }
 
-void bta_track_adv_event_cb(tBTA_DM_BLE_TRACK_ADV_DATA* p_track_adv_data) {
+void bta_track_adv_event_cb(tBTM_BLE_TRACK_ADV_DATA* p_track_adv_data) {
   btgatt_track_adv_info_t* btif_scan_track_cb = new btgatt_track_adv_info_t;
 
   BTIF_TRACE_DEBUG("%s", __func__);
@@ -392,7 +343,9 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
     BTIF_TRACE_DEBUG("%s", __func__);
 
     if (filt_param && filt_param->dely_mode == 1) {
-      BTA_DmBleTrackAdvertiser(client_if, bta_track_adv_event_cb);
+      do_in_bta_thread(
+          FROM_HERE, base::Bind(BTM_BleTrackAdvertiser, bta_track_adv_event_cb,
+                                client_if));
     }
 
     do_in_bta_thread(
@@ -509,35 +462,57 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
 
   void SetScanParameters(int client_if, int scan_interval,
                          int scan_window) override {
-    BTA_DmSetBleScanParams(
-        client_if, scan_interval, scan_window, BTM_BLE_SCAN_MODE_ACTI,
-        (tBLE_SCAN_PARAM_SETUP_CBACK)bta_scan_param_setup_cb);
+    do_in_bta_thread(
+        FROM_HERE,
+        base::Bind(&BTM_BleSetScanParams, client_if, scan_interval, scan_window,
+                   BTM_BLE_SCAN_MODE_ACTI, bta_scan_param_setup_cb));
   }
 
   void BatchscanConfigStorage(int client_if, int batch_scan_full_max,
                               int batch_scan_trunc_max,
                               int batch_scan_notify_threshold) override {
-    BTA_DmBleSetStorageParams(
-        batch_scan_full_max, batch_scan_trunc_max, batch_scan_notify_threshold,
-        (tBTA_BLE_SCAN_SETUP_CBACK*)bta_batch_scan_setup_cb,
-        (tBTA_BLE_SCAN_THRESHOLD_CBACK*)bta_batch_scan_threshold_cb,
-        (tBTA_BLE_SCAN_REP_CBACK*)bta_batch_scan_reports_cb,
-        (tBTM_BLE_REF_VALUE)client_if);
+    base::Callback<void(uint8_t /* status */)> cb = base::Bind(
+        [](int client_if, uint8_t status) {
+          SCAN_CBACK_IN_JNI(batchscan_cfg_storage_cb, client_if, status);
+        },
+        client_if);
+
+    do_in_bta_thread(
+        FROM_HERE,
+        base::Bind(&BTM_BleSetStorageConfig, (uint8_t)batch_scan_full_max,
+                   (uint8_t)batch_scan_trunc_max,
+                   (uint8_t)batch_scan_notify_threshold, cb,
+                   bta_batch_scan_threshold_cb, (tBTM_BLE_REF_VALUE)client_if));
   }
 
   void BatchscanEnable(int client_if, int scan_mode, int scan_interval,
                        int scan_window, int addr_type,
                        int discard_rule) override {
-    BTA_DmBleEnableBatchScan(scan_mode, scan_interval, scan_window,
-                             discard_rule, addr_type, client_if);
+    auto cb = base::Bind(
+        [](int client_if, uint8_t status) {
+          SCAN_CBACK_IN_JNI(batchscan_enb_disable_cb, 1, client_if, status);
+        },
+        client_if);
+
+    do_in_bta_thread(
+        FROM_HERE, base::Bind(&BTM_BleEnableBatchScan, scan_mode, scan_interval,
+                              scan_window, discard_rule, addr_type, cb));
   }
 
   void BatchscanDisable(int client_if) override {
-    BTA_DmBleDisableBatchScan(client_if);
+    auto cb = base::Bind(
+        [](int client_if, uint8_t status) {
+          SCAN_CBACK_IN_JNI(batchscan_enb_disable_cb, 1, client_if, status);
+        },
+        client_if);
+
+    do_in_bta_thread(FROM_HERE, base::Bind(&BTM_BleDisableBatchScan, cb));
   }
 
   void BatchscanReadReports(int client_if, int scan_mode) override {
-    BTA_DmBleReadScanReports(scan_mode, client_if);
+    do_in_bta_thread(FROM_HERE,
+                     base::Bind(&BTM_BleReadScanReports, (uint8_t)scan_mode,
+                                Bind(bta_batch_scan_reports_cb, client_if)));
   }
 };
 
diff --git a/system/stack/btm/btm_ble_batchscan.cc b/system/stack/btm/btm_ble_batchscan.cc
index 43db5ef6162a10576837cbd111f1ea034c7feea2..21900e995fed9461f2956175bb7c9f3cfed61a10 100644
--- a/system/stack/btm/btm_ble_batchscan.cc
+++ b/system/stack/btm/btm_ble_batchscan.cc
@@ -15,9 +15,11 @@
  *  limitations under the License.
  *
  ******************************************************************************/
+#include <base/bind.h>
 #include <stddef.h>
 #include <stdio.h>
 #include <string.h>
+#include <vector>
 #include "bt_target.h"
 
 #include "bt_types.h"
@@ -28,6 +30,11 @@
 #include "device/include/controller.h"
 #include "hcimsgs.h"
 
+using base::Bind;
+using base::Callback;
+using hci_cmd_cb = base::Callback<void(uint8_t* /* return_parameters */,
+                                       uint16_t /* return_parameters_length*/)>;
+
 tBTM_BLE_BATCH_SCAN_CB ble_batchscan_cb;
 tBTM_BLE_ADV_TRACK_CB ble_advtrack_cb;
 
@@ -37,24 +44,20 @@ tBTM_BLE_ADV_TRACK_CB ble_advtrack_cb;
 #define BTM_BLE_BATCH_SCAN_ENB_DISB_LEN 2
 #define BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN 2
 
-#define BTM_BLE_BATCH_SCAN_CB_EVT_MASK 0xF0
-#define BTM_BLE_BATCH_SCAN_SUBCODE_MASK 0x0F
+namespace {
 
-/*******************************************************************************
- *  Local functions
- ******************************************************************************/
-void btm_ble_batchscan_vsc_cmpl_cback(tBTM_VSC_CMPL* p_params);
-void btm_ble_batchscan_cleanup(void);
+bool can_do_batch_scan() {
+  if (!controller_get_interface()->supports_ble()) return false;
 
-/*******************************************************************************
- *
- * Function         btm_ble_batchscan_filter_track_adv_vse_cback
- *
- * Description      VSE callback for batch scan, filter, and tracking events.
- *
- * Returns          None
- *
- ******************************************************************************/
+  tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+  BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+  if (cmn_ble_vsc_cb.tot_scan_results_strg == 0) return false;
+
+  return true;
+}
+
+/* VSE callback for batch scan, filter, and tracking events */
 void btm_ble_batchscan_filter_track_adv_vse_cback(uint8_t len, uint8_t* p) {
   tBTM_BLE_TRACK_ADV_DATA adv_data;
 
@@ -126,348 +129,165 @@ void btm_ble_batchscan_filter_track_adv_vse_cback(uint8_t len, uint8_t* p) {
   }
 }
 
-/*******************************************************************************
- *
- * Function         btm_ble_batchscan_enq_op_q
- *
- * Description      enqueue a batchscan operation in q to check command complete
- *                  status
- *
- * Returns          void
- *
- ******************************************************************************/
-void btm_ble_batchscan_enq_op_q(uint8_t opcode,
-                                tBTM_BLE_BATCH_SCAN_STATE cur_state,
-                                uint8_t cb_evt, tBTM_BLE_REF_VALUE ref_value) {
-  ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.next_idx] =
-      (opcode | (cb_evt << 4));
-  ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.next_idx] = cur_state;
-  ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.next_idx] = ref_value;
-  BTM_TRACE_DEBUG(
-      "btm_ble_batchscan_enq_op_q: subcode:%d, Cur_state:%d, ref_value:%d",
-      ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.next_idx],
-      ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.next_idx],
-      ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.next_idx]);
-  ble_batchscan_cb.op_q.next_idx =
-      (ble_batchscan_cb.op_q.next_idx + 1) % BTM_BLE_BATCH_SCAN_MAX;
-}
+void feat_enable_cb(uint8_t* p, uint16_t len) {
+  if (len < 2) {
+    BTM_TRACE_ERROR("%s: wrong length", __func__);
+    return;
+  }
 
-/*******************************************************************************
- *
- * Function         btm_ble_batchscan_enq_rep_q
- *
- * Description      enqueue a batchscan report operation in q to check command
- *                  complete status
- *
- * Returns          void
- *
- ******************************************************************************/
-tBTM_STATUS btm_ble_batchscan_enq_rep_q(uint8_t report_format,
-                                        tBTM_BLE_REF_VALUE ref_value) {
-  int i = 0;
-  for (i = 0; i < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; i++) {
-    if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[i])
-      return BTM_ILLEGAL_VALUE;
+  uint8_t status, subcode;
+  STREAM_TO_UINT8(status, p);
+  STREAM_TO_UINT8(subcode, p);
+
+  uint8_t expected_opcode = BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE;
+  if (subcode != expected_opcode) {
+    BTM_TRACE_ERROR("%s: bad subcode, expected: %d got: %d", __func__,
+                    expected_opcode, subcode);
+    return;
   }
 
-  ble_batchscan_cb.main_rep_q.rep_mode[ble_batchscan_cb.main_rep_q.next_idx] =
-      report_format;
-  ble_batchscan_cb.main_rep_q.ref_value[ble_batchscan_cb.main_rep_q.next_idx] =
-      ref_value;
-  ble_batchscan_cb.main_rep_q
-      .num_records[ble_batchscan_cb.main_rep_q.next_idx] = 0;
-  ble_batchscan_cb.main_rep_q.data_len[ble_batchscan_cb.main_rep_q.next_idx] =
-      0;
-  ble_batchscan_cb.main_rep_q.p_data[ble_batchscan_cb.main_rep_q.next_idx] =
-      NULL;
-  BTM_TRACE_DEBUG("btm_ble_batchscan_enq_rep_q: index:%d, rep %d, ref %d",
-                  ble_batchscan_cb.main_rep_q.next_idx, report_format,
-                  ref_value);
-
-  ble_batchscan_cb.main_rep_q.next_idx =
-      (ble_batchscan_cb.main_rep_q.next_idx + 1) %
-      BTM_BLE_BATCH_REP_MAIN_Q_SIZE;
-  return BTM_SUCCESS;
-}
+  if (ble_batchscan_cb.cur_state != BTM_BLE_SCAN_ENABLE_CALLED)
+    BTM_TRACE_ERROR("%s: state should be ENABLE_CALLED", __func__);
 
-/*******************************************************************************
- *
- * Function         btm_ble_batchscan_enq_rep_data
- *
- * Description      setup the data in the main report queue
- *
- * Returns          void
- *
- ******************************************************************************/
-void btm_ble_batchscan_enq_rep_data(uint8_t report_format, uint8_t num_records,
-                                    uint8_t* p_data, uint8_t data_len) {
-  int index = 0;
+  ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLED_STATE;
+}
 
-  for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++) {
-    if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[index]) break;
+void storage_config_cb(Callback<void(uint8_t /* status */)> cb, uint8_t* p,
+                       uint16_t len) {
+  if (len < 2) {
+    BTM_TRACE_ERROR("%s: wrong length", __func__);
+    return;
   }
 
-  BTM_TRACE_DEBUG(
-      "btm_ble_batchscan_enq_rep_data: index:%d, rep %d, num %d len : %d",
-      index, report_format, num_records, data_len);
-
-  if (index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE && data_len > 0 &&
-      num_records > 0) {
-    int len = ble_batchscan_cb.main_rep_q.data_len[index];
-    uint8_t* p_orig_data = ble_batchscan_cb.main_rep_q.p_data[index];
-    uint8_t* p_app_data;
-
-    if (NULL != p_orig_data) {
-      p_app_data = static_cast<uint8_t*>(osi_malloc(len + data_len));
-      memcpy(p_app_data, p_orig_data, len);
-      memcpy(p_app_data + len, p_data, data_len);
-      osi_free(p_orig_data);
-      ble_batchscan_cb.main_rep_q.p_data[index] = p_app_data;
-      ble_batchscan_cb.main_rep_q.num_records[index] += num_records;
-      ble_batchscan_cb.main_rep_q.data_len[index] += data_len;
-    } else {
-      p_app_data = static_cast<uint8_t*>(osi_malloc(data_len));
-      memcpy(p_app_data, p_data, data_len);
-      ble_batchscan_cb.main_rep_q.p_data[index] = p_app_data;
-      ble_batchscan_cb.main_rep_q.num_records[index] = num_records;
-      ble_batchscan_cb.main_rep_q.data_len[index] = data_len;
-    }
+  uint8_t status, subcode;
+  STREAM_TO_UINT8(status, p);
+  STREAM_TO_UINT8(subcode, p);
+
+  uint8_t expected_opcode = BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM;
+  if (subcode != expected_opcode) {
+    BTM_TRACE_ERROR("%s: bad subcode, expected: %d got: %d", __func__,
+                    expected_opcode, subcode);
+    return;
   }
+
+  cb.Run(status);
 }
 
-/*******************************************************************************
- *
- * Function         btm_ble_batchscan_deq_rep_q
- *
- * Description      dequeue a batchscan report  in q when command complete
- *                  is received
- *
- * Returns          void
- *
- ******************************************************************************/
-void btm_ble_batchscan_deq_rep_data(uint8_t report_format,
-                                    tBTM_BLE_REF_VALUE* p_ref_value,
-                                    uint8_t* p_num_records, uint8_t** p_data,
-                                    uint16_t* p_data_len) {
-  int index = 0;
-
-  for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++) {
-    if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[index]) break;
+void param_enable_cb(Callback<void(uint8_t /* status */)> cb, uint8_t* p,
+                     uint16_t len) {
+  if (len < 2) {
+    BTM_TRACE_ERROR("%s: wrong length", __func__);
+    return;
   }
 
-  if (BTM_BLE_BATCH_REP_MAIN_Q_SIZE == index) {
-    BTM_TRACE_ERROR("btm_ble_batchscan_deq_rep_data: rep_format:%d not found",
-                    report_format);
+  uint8_t status, subcode;
+  STREAM_TO_UINT8(status, p);
+  STREAM_TO_UINT8(subcode, p);
+
+  uint8_t expected_opcode = BTM_BLE_BATCH_SCAN_SET_PARAMS;
+  if (subcode != expected_opcode) {
+    BTM_TRACE_ERROR("%s: bad subcode: 0x%02x 0x%02x", __func__, expected_opcode,
+                    subcode);
     return;
   }
 
-  *p_num_records = ble_batchscan_cb.main_rep_q.num_records[index];
-  *p_ref_value = ble_batchscan_cb.main_rep_q.ref_value[index];
-  *p_data = ble_batchscan_cb.main_rep_q.p_data[index];
-  *p_data_len = ble_batchscan_cb.main_rep_q.data_len[index];
+  cb.Run(status);
+}
 
-  ble_batchscan_cb.main_rep_q.p_data[index] = NULL;
-  ble_batchscan_cb.main_rep_q.data_len[index] = 0;
-  ble_batchscan_cb.main_rep_q.rep_mode[index] = 0;
-  ble_batchscan_cb.main_rep_q.ref_value[index] = 0;
-  ble_batchscan_cb.main_rep_q.num_records[index] = 0;
+void disable_cb(base::Callback<void(uint8_t /* status */)> cb, uint8_t* p,
+                uint16_t len) {
+  if (len < 2) {
+    BTM_TRACE_ERROR("%s: wrong length", __func__);
+    return;
+  }
 
-  BTM_TRACE_DEBUG(
-      "btm_ble_batchscan_deq_rep_data: index:%d, rep %d, num %d, data_len %d",
-      index, report_format, *p_num_records, *p_data_len);
+  uint8_t status, subcode;
+  STREAM_TO_UINT8(status, p);
+  STREAM_TO_UINT8(subcode, p);
 
-  ble_batchscan_cb.main_rep_q.pending_idx =
-      (ble_batchscan_cb.main_rep_q.pending_idx + 1) % BTM_BLE_BATCH_SCAN_MAX;
-}
+  uint8_t expected_opcode = BTM_BLE_BATCH_SCAN_SET_PARAMS;
+  if (subcode != expected_opcode) {
+    BTM_TRACE_ERROR("%s: bad subcode: 0x%02x 0x%02x", __func__, expected_opcode,
+                    subcode);
+    return;
+  }
 
-/*******************************************************************************
- *
- * Function         btm_ble_batchscan_deq_op_q
- *
- * Description      dequeue a batch scan operation from q when command complete
- *                  is received
- *
- * Returns          void
- *
- ******************************************************************************/
-void btm_ble_batchscan_deq_op_q(uint8_t* p_opcode,
-                                tBTM_BLE_BATCH_SCAN_STATE* cur_state,
-                                uint8_t* p_cb_evt, tBTM_BLE_REF_VALUE* p_ref) {
-  *p_cb_evt =
-      (ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.pending_idx] >> 4);
-  *p_opcode =
-      (ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.pending_idx] &
-       BTM_BLE_BATCH_SCAN_SUBCODE_MASK);
-  *p_ref = ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.pending_idx];
-  *cur_state =
-      (ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.pending_idx]);
-  ble_batchscan_cb.op_q.pending_idx =
-      (ble_batchscan_cb.op_q.pending_idx + 1) % BTM_BLE_BATCH_SCAN_MAX;
+  if (ble_batchscan_cb.cur_state != BTM_BLE_SCAN_DISABLE_CALLED) {
+    BTM_TRACE_ERROR("%s: state should be DISABLE_CALLED", __func__);
+  }
+
+  if (BTM_SUCCESS == status) {
+    ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLED_STATE;
+  } else {
+    BTM_TRACE_ERROR("%s: Invalid state after disabled", __func__);
+    ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE;
+  }
+
+  cb.Run(status);
 }
 
-/*******************************************************************************
- *
- * Function         btm_ble_read_batchscan_reports
- *
- * Description      This function reads the reports from controller
- *
- * Parameters       scan_mode - The mode for which the reports are to be read
- *                              out from the controller
- *                  ref_value - Reference value
- *
- ******************************************************************************/
+/**
+ * This function reads the reports from controller. |scan_mode| is the mode for
+ * which the reports are to be read
+ */
 void btm_ble_read_batchscan_reports(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
-                                    tBTM_BLE_REF_VALUE ref_value) {
-  uint8_t param[BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN], *pp;
-  pp = param;
-
-  memset(param, 0, BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN);
+                                    hci_cmd_cb cb) {
+  uint8_t len = BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN;
+  uint8_t param[len];
+  memset(param, 0, len);
 
+  uint8_t* pp = param;
   UINT8_TO_STREAM(pp, BTM_BLE_BATCH_SCAN_READ_RESULTS);
   UINT8_TO_STREAM(pp, scan_mode);
 
-  BTM_VendorSpecificCommand(HCI_BLE_BATCH_SCAN_OCF,
-                            BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN, param,
-                            btm_ble_batchscan_vsc_cmpl_cback);
-
-  /* The user needs to be provided scan read reports event */
-  btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_READ_RESULTS,
-                             ble_batchscan_cb.cur_state,
-                             BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, ref_value);
+  btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_BATCH_SCAN_OCF, param, len, cb);
 }
 
-/*******************************************************************************
- *
- * Function         btm_ble_batchscan_vsc_cmpl_cback
- *
- * Description      Batch scan VSC complete callback
- *
- * Parameters       p_params - VSC completed callback parameters
- *
- * Returns          void
- *
- ******************************************************************************/
-void btm_ble_batchscan_vsc_cmpl_cback(tBTM_VSC_CMPL* p_params) {
-  uint8_t* p = p_params->p_param_buf;
-  uint16_t len = p_params->param_len;
-  tBTM_BLE_REF_VALUE ref_value = 0;
-
-  uint8_t status = 0, subcode = 0, opcode = 0;
-  uint8_t report_format = 0, num_records = 0, cb_evt = 0;
-  uint16_t data_len = 0;
-  tBTM_BLE_BATCH_SCAN_STATE cur_state = BTM_BLE_SCAN_INVALID_STATE;
-  uint8_t* p_data = NULL;
-
+/* read reports. data is accumulated in |data_all|, number of records is
+ * accumulated in |num_records_all| */
+void read_reports_cb(std::vector<uint8_t> data_all, uint8_t num_records_all,
+                     tBTM_BLE_SCAN_REP_CBACK cb, uint8_t* p, uint16_t len) {
   if (len < 2) {
-    BTM_TRACE_ERROR("wrong length for btm_ble_batch_scan_vsc_cmpl_cback");
-    btm_ble_batchscan_deq_op_q(&opcode, &cur_state, &cb_evt, &ref_value);
+    BTM_TRACE_ERROR("%s: wrong length", __func__);
     return;
   }
 
+  uint8_t status, subcode;
   STREAM_TO_UINT8(status, p);
   STREAM_TO_UINT8(subcode, p);
 
-  btm_ble_batchscan_deq_op_q(&opcode, &cur_state, &cb_evt, &ref_value);
-
-  BTM_TRACE_DEBUG(
-      "btm_ble_batchscan op_code = %02x state = %02x cb_evt = "
-      "%02x,ref_value=%d",
-      opcode, cur_state, cb_evt, ref_value);
-
-  if (opcode != subcode) {
-    BTM_TRACE_ERROR("Got unexpected VSC cmpl, expected: %d got: %d", subcode,
-                    opcode);
+  uint8_t expected_opcode = BTM_BLE_BATCH_SCAN_READ_RESULTS;
+  if (subcode != expected_opcode) {
+    BTM_TRACE_ERROR("%s: bad subcode, expected: %d got: %d", __func__,
+                    expected_opcode, subcode);
     return;
   }
 
-  switch (subcode) {
-    case BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE: {
-      if (BTM_SUCCESS == status && BTM_BLE_SCAN_ENABLE_CALLED == cur_state)
-        ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLED_STATE;
-      else if (BTM_BLE_SCAN_ENABLE_CALLED == cur_state) {
-        BTM_TRACE_ERROR(
-            "SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after enb");
-        ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE;
-      }
-
-      BTM_TRACE_DEBUG(
-          "BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEAT status = %d, state: "
-          "%d,evt=%d",
-          status, ble_batchscan_cb.cur_state, cb_evt);
-
-      if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
-        ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
-      break;
-    }
+  uint8_t report_format, num_records;
+  STREAM_TO_UINT8(report_format, p);
+  STREAM_TO_UINT8(num_records, p);
 
-    case BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM: {
-      BTM_TRACE_DEBUG(
-          "BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM status = %d, evt=%d", status,
-          cb_evt);
-      if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
-        ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
-      break;
-    }
+  BTM_TRACE_DEBUG("%s: status=%d,len=%d,rec=%d", __func__, status, len - 4,
+                  num_records);
 
-    case BTM_BLE_BATCH_SCAN_SET_PARAMS: {
-      BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_SET_PARAMS status = %d,evt=%d",
-                      status, cb_evt);
-
-      if (BTM_BLE_SCAN_DISABLE_CALLED == cur_state) {
-        if (BTM_SUCCESS == status) {
-          ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLED_STATE;
-        } else {
-          BTM_TRACE_ERROR(
-              "BTM_BLE_BATCH_SCAN_SET_PARAMS - Invalid state after disabled");
-          ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE;
-        }
-      }
+  if (num_records == 0) {
+    cb.Run(status, report_format, num_records_all, data_all);
+    return;
+  }
 
-      if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
-        ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
-      break;
-    }
+  if (len > 4) {
+    data_all.insert(data_all.end(), p, p + len - 4);
+    num_records_all += num_records;
 
-    case BTM_BLE_BATCH_SCAN_READ_RESULTS: {
-      if (cb_evt != 0 && NULL != ble_batchscan_cb.p_scan_rep_cback) {
-        STREAM_TO_UINT8(report_format, p);
-        STREAM_TO_UINT8(num_records, p);
-        p = (uint8_t*)(p_params->p_param_buf + 4);
-        BTM_TRACE_DEBUG(
-            "BTM_BLE_BATCH_SCAN_READ_RESULTS status=%d,len=%d,rec=%d", status,
-            len - 4, num_records);
-
-        if (0 == num_records) {
-          btm_ble_batchscan_deq_rep_data(report_format, &ref_value,
-                                         &num_records, &p_data, &data_len);
-          if (NULL != ble_batchscan_cb.p_scan_rep_cback)
-            ble_batchscan_cb.p_scan_rep_cback(ref_value, report_format,
-                                              num_records, data_len, p_data,
-                                              status);
-        } else {
-          if ((len - 4) > 0) {
-            btm_ble_batchscan_enq_rep_data(report_format, num_records, p,
-                                           len - 4);
-            /* More records could be in the buffer and needs to be pulled out */
-            btm_ble_read_batchscan_reports(report_format, ref_value);
-          }
-        }
-      }
-      break;
-    }
-
-    default:
-      break;
+    /* More records could be in the buffer and needs to be pulled out */
+    btm_ble_read_batchscan_reports(
+        report_format, base::Bind(&read_reports_cb, std::move(data_all),
+                                  num_records_all, std::move(cb)));
   }
-
-  return;
 }
 
-/*******************************************************************************
- *
- * Function         btm_ble_set_storage_config
- *
- * Description      This function writes the storage configuration in controller
+/**
+ * This function writes the storage configuration in controller
  *
  * Parameters       batch_scan_full_max - Max storage space (in %) allocated to
  *                                        full scanning
@@ -476,104 +296,65 @@ void btm_ble_batchscan_vsc_cmpl_cback(tBTM_VSC_CMPL* p_params) {
  *                  batch_scan_notify_threshold - Set up notification level
  *                                                based on total space
  *
- ******************************************************************************/
+ **/
 void btm_ble_set_storage_config(uint8_t batch_scan_full_max,
                                 uint8_t batch_scan_trunc_max,
-                                uint8_t batch_scan_notify_threshold) {
-  uint8_t param[BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN], *pp;
-
-  pp = param;
-  memset(param, 0, BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN);
+                                uint8_t batch_scan_notify_threshold,
+                                hci_cmd_cb cb) {
+  uint8_t len = BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN;
+  uint8_t param[len];
+  memset(param, 0, len);
 
+  uint8_t* pp = param;
   UINT8_TO_STREAM(pp, BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM);
   UINT8_TO_STREAM(pp, batch_scan_full_max);
   UINT8_TO_STREAM(pp, batch_scan_trunc_max);
   UINT8_TO_STREAM(pp, batch_scan_notify_threshold);
 
-  BTM_VendorSpecificCommand(HCI_BLE_BATCH_SCAN_OCF,
-                            BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN, param,
-                            btm_ble_batchscan_vsc_cmpl_cback);
+  btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_BATCH_SCAN_OCF, param, len, cb);
 }
 
-/*******************************************************************************
- *
- * Function         btm_ble_set_batchscan_param
- *
- * Description      This function writes the batch scan params in controller
- *
- * Parameters       scan_mode -Batch scan mode
- *                  scan_interval - Scan interval
- *                  scan_window  - Scan window
- *                  discard_rule -Discard rules
- *                  addr_type - Address type
- *
- ******************************************************************************/
+/* This function writes the batch scan params in controller */
 void btm_ble_set_batchscan_param(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
                                  uint32_t scan_interval, uint32_t scan_window,
                                  tBLE_ADDR_TYPE addr_type,
-                                 tBTM_BLE_DISCARD_RULE discard_rule) {
-  uint8_t scan_param[BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN], *pp_scan;
-
-  pp_scan = scan_param;
-  memset(scan_param, 0, BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN);
-
+                                 tBTM_BLE_DISCARD_RULE discard_rule,
+                                 hci_cmd_cb cb) {
   // Override param and decide addr_type based on own addr type
   // TODO: Remove upper layer parameter?
   addr_type = btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type;
 
-  UINT8_TO_STREAM(pp_scan, BTM_BLE_BATCH_SCAN_SET_PARAMS);
-  UINT8_TO_STREAM(pp_scan, scan_mode);
-  UINT32_TO_STREAM(pp_scan, scan_window);
-  UINT32_TO_STREAM(pp_scan, scan_interval);
-  UINT8_TO_STREAM(pp_scan, addr_type);
-  UINT8_TO_STREAM(pp_scan, discard_rule);
-
-  BTM_VendorSpecificCommand(HCI_BLE_BATCH_SCAN_OCF,
-                            BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN, scan_param,
-                            btm_ble_batchscan_vsc_cmpl_cback);
-}
-
-/*******************************************************************************
- *
- * Function         btm_ble_enable_disable_batchscan
- *
- * Description      This function enables the customer specific feature in
- *                  controller
- *
- * Parameters       enable_disable: true - enable, false - disable
- *
- ******************************************************************************/
-void btm_ble_enable_disable_batchscan(bool should_enable) {
-  uint8_t shld_enable = 0x01;
-  uint8_t enable_param[BTM_BLE_BATCH_SCAN_ENB_DISB_LEN], *pp_enable;
+  uint8_t len = BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN;
+  uint8_t param[len];
+  memset(param, 0, len);
 
-  if (!should_enable) shld_enable = 0x00;
+  uint8_t* p = param;
+  UINT8_TO_STREAM(p, BTM_BLE_BATCH_SCAN_SET_PARAMS);
+  UINT8_TO_STREAM(p, scan_mode);
+  UINT32_TO_STREAM(p, scan_window);
+  UINT32_TO_STREAM(p, scan_interval);
+  UINT8_TO_STREAM(p, addr_type);
+  UINT8_TO_STREAM(p, discard_rule);
 
-  if (should_enable) {
-    pp_enable = enable_param;
-    memset(enable_param, 0, BTM_BLE_BATCH_SCAN_ENB_DISB_LEN);
+  btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_BATCH_SCAN_OCF, param, len, cb);
+}
 
-    UINT8_TO_STREAM(pp_enable, BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE);
-    UINT8_TO_STREAM(pp_enable, shld_enable);
+/* This function enables the customer specific feature in controller */
+void btm_ble_enable_batchscan(hci_cmd_cb cb) {
+  uint8_t len = BTM_BLE_BATCH_SCAN_ENB_DISB_LEN;
+  uint8_t param[len];
+  memset(param, 0, len);
 
-    BTM_VendorSpecificCommand(HCI_BLE_BATCH_SCAN_OCF,
-                              BTM_BLE_BATCH_SCAN_ENB_DISB_LEN, enable_param,
-                              btm_ble_batchscan_vsc_cmpl_cback);
-  } else
-    btm_ble_set_batchscan_param(
-        BTM_BLE_BATCH_SCAN_MODE_DISABLE, ble_batchscan_cb.scan_interval,
-        ble_batchscan_cb.scan_window, ble_batchscan_cb.addr_type,
-        ble_batchscan_cb.discard_rule);
+  uint8_t* p = param;
+  UINT8_TO_STREAM(p, BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE);
+  UINT8_TO_STREAM(p, 0x01 /* enable */);
 
-  if (should_enable)
-    ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED;
-  else
-    ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLE_CALLED;
+  btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_BATCH_SCAN_OCF, param, len, cb);
 }
 
+}  // namespace
+
 /*******************************************************************************
- *
- * Function         BTM_BleSetStorageConfig
  *
  * Description      This function is called to write storage config params.
  *
@@ -583,104 +364,66 @@ void btm_ble_enable_disable_batchscan(bool should_enable) {
  *                                         trunc style
  *                  batch_scan_notify_threshold - Setup notification level based
  *                                                on total space
- *                  p_setup_cback - Setup callback pointer
+ *                  cb - Setup callback pointer
  *                  p_thres_cback - Threshold callback pointer
- *                  p_rep_cback - Reports callback pointer
  *                  ref_value - Reference value
  *
- * Returns          tBTM_STATUS
- *
  ******************************************************************************/
-tBTM_STATUS BTM_BleSetStorageConfig(
-    uint8_t batch_scan_full_max, uint8_t batch_scan_trunc_max,
-    uint8_t batch_scan_notify_threshold,
-    tBTM_BLE_SCAN_SETUP_CBACK* p_setup_cback,
-    tBTM_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback,
-    tBTM_BLE_SCAN_REP_CBACK* p_rep_cback, tBTM_BLE_REF_VALUE ref_value) {
-  tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+void BTM_BleSetStorageConfig(uint8_t batch_scan_full_max,
+                             uint8_t batch_scan_trunc_max,
+                             uint8_t batch_scan_notify_threshold,
+                             Callback<void(uint8_t /* status */)> cb,
+                             tBTM_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback,
+                             tBTM_BLE_REF_VALUE ref_value) {
+  if (!can_do_batch_scan()) {
+    cb.Run(BTM_ERR_PROCESSING);
+    return;
+  }
 
-  BTM_TRACE_EVENT(" BTM_BleSetStorageConfig: %d, %d, %d, %d, %d",
+  BTM_TRACE_EVENT("%s: %d, %d, %d, %d, %d", __func__,
                   ble_batchscan_cb.cur_state, ref_value, batch_scan_full_max,
                   batch_scan_trunc_max, batch_scan_notify_threshold);
 
-  if (!controller_get_interface()->supports_ble()) return BTM_ILLEGAL_VALUE;
-
-  BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-
-  if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) {
-    BTM_TRACE_ERROR("Controller does not support batch scan");
-    return BTM_ERR_PROCESSING;
-  }
-
-  ble_batchscan_cb.p_setup_cback = p_setup_cback;
   ble_batchscan_cb.p_thres_cback = p_thres_cback;
-  ble_batchscan_cb.p_scan_rep_cback = p_rep_cback;
   ble_batchscan_cb.ref_value = ref_value;
 
   if (batch_scan_full_max > BTM_BLE_ADV_SCAN_FULL_MAX ||
       batch_scan_trunc_max > BTM_BLE_ADV_SCAN_TRUNC_MAX ||
       batch_scan_notify_threshold > BTM_BLE_ADV_SCAN_THR_MAX) {
     BTM_TRACE_ERROR("Illegal set storage config params");
-    return BTM_ILLEGAL_VALUE;
+    cb.Run(BTM_ILLEGAL_VALUE);
+    return;
   }
 
   if (BTM_BLE_SCAN_INVALID_STATE == ble_batchscan_cb.cur_state ||
       BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state ||
       BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state) {
-    btm_ble_enable_disable_batchscan(true);
+    btm_ble_enable_batchscan(Bind(&feat_enable_cb));
     ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED;
-    btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE,
-                               BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value);
   }
 
   btm_ble_set_storage_config(batch_scan_full_max, batch_scan_trunc_max,
-                             batch_scan_notify_threshold);
-  /* The user needs to be provided scan config storage event */
-  btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM,
-                             ble_batchscan_cb.cur_state,
-                             BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, ref_value);
-
-  return BTM_CMD_STARTED;
+                             batch_scan_notify_threshold,
+                             Bind(&storage_config_cb, cb));
+  return;
 }
 
-/*******************************************************************************
- *
- * Function         BTM_BleEnableBatchScan
- *
- * Description      This function is called to configure and enable batch
- *                  scanning
- *
- * Parameters:      scan_mode -Batch scan mode
- *                  scan_interval - Scan interval value
- *                  scan_window - Scan window value
- *                  discard_rule - Data discard rule
- *                  ref_value - Reference value
- *
- * Returns          tBTM_STATUS
- *
- ******************************************************************************/
-tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
-                                   uint32_t scan_interval, uint32_t scan_window,
-                                   tBLE_ADDR_TYPE addr_type,
-                                   tBTM_BLE_DISCARD_RULE discard_rule,
-                                   tBTM_BLE_REF_VALUE ref_value) {
-  tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
-  BTM_TRACE_EVENT(" BTM_BleEnableBatchScan: %d, %d, %d, %d, %d, %d", scan_mode,
-                  scan_interval, scan_window, addr_type, discard_rule,
-                  ref_value);
-
-  if (!controller_get_interface()->supports_ble()) return BTM_ILLEGAL_VALUE;
-
-  BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-
-  if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) {
-    BTM_TRACE_ERROR("Controller does not support batch scan");
-    return BTM_ERR_PROCESSING;
+/* This function is called to configure and enable batch scanning */
+void BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
+                            uint32_t scan_interval, uint32_t scan_window,
+                            tBLE_ADDR_TYPE addr_type,
+                            tBTM_BLE_DISCARD_RULE discard_rule,
+                            Callback<void(uint8_t /* status */)> cb) {
+  BTM_TRACE_EVENT("%s: %d, %d, %d, %d, %d, %d", __func__, scan_mode,
+                  scan_interval, scan_window, addr_type, discard_rule);
+
+  if (!can_do_batch_scan()) {
+    cb.Run(BTM_ERR_PROCESSING);
+    return;
   }
 
-  BTM_TRACE_DEBUG("BTM_BleEnableBatchScan: %d, %x, %x, %d, %d", scan_mode,
-                  scan_interval, scan_window, discard_rule,
-                  ble_batchscan_cb.cur_state);
+  BTM_TRACE_DEBUG("%s: %d, %x, %x, %d, %d", __func__, scan_mode, scan_interval,
+                  scan_window, discard_rule, ble_batchscan_cb.cur_state);
 
   /* Only 16 bits will be used for scan interval and scan window as per
    * agreement with Google */
@@ -694,91 +437,56 @@ tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
        BTM_BLE_BATCH_SCAN_MODE_PASS_ACTI == scan_mode) &&
       (BTM_BLE_DISCARD_OLD_ITEMS == discard_rule ||
        BTM_BLE_DISCARD_LOWER_RSSI_ITEMS == discard_rule)) {
-    if (BTM_BLE_SCAN_INVALID_STATE == ble_batchscan_cb.cur_state ||
-        BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state ||
-        BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state) {
-      btm_ble_enable_disable_batchscan(true);
-      btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE,
-                                 BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value);
-    }
-
-    ble_batchscan_cb.scan_mode = scan_mode;
-    ble_batchscan_cb.scan_interval = scan_interval;
-    ble_batchscan_cb.scan_window = scan_window;
-    ble_batchscan_cb.addr_type = addr_type;
-    ble_batchscan_cb.discard_rule = discard_rule;
-    /* This command starts batch scanning, if enabled */
-    btm_ble_set_batchscan_param(scan_mode, scan_interval, scan_window,
-                                addr_type, discard_rule);
-
-    /* The user needs to be provided scan enable event */
-    btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_PARAMS,
-                               ble_batchscan_cb.cur_state,
-                               BTM_BLE_BATCH_SCAN_ENABLE_EVT, ref_value);
   } else {
-    BTM_TRACE_ERROR("Illegal enable scan params");
-    return BTM_ILLEGAL_VALUE;
+    BTM_TRACE_ERROR("%s: Illegal enable scan params", __func__);
+    cb.Run(BTM_ILLEGAL_VALUE);
+    return;
   }
-  return BTM_CMD_STARTED;
-}
 
-/*******************************************************************************
- *
- * Function         BTM_BleDisableBatchScan
- *
- * Description      This function is called to disable batch scanning
- *
- * Parameters:      ref_value - Reference value
- *
- ******************************************************************************/
-tBTM_STATUS BTM_BleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value) {
-  tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
-  BTM_TRACE_EVENT(" BTM_BleDisableBatchScan");
+  if (BTM_BLE_SCAN_INVALID_STATE == ble_batchscan_cb.cur_state ||
+      BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state ||
+      BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state) {
+    btm_ble_enable_batchscan(Bind(&feat_enable_cb));
+    ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED;
+  }
 
-  if (!controller_get_interface()->supports_ble()) return BTM_ILLEGAL_VALUE;
+  ble_batchscan_cb.scan_mode = scan_mode;
+  ble_batchscan_cb.scan_interval = scan_interval;
+  ble_batchscan_cb.scan_window = scan_window;
+  ble_batchscan_cb.addr_type = addr_type;
+  ble_batchscan_cb.discard_rule = discard_rule;
+  /* This command starts batch scanning, if enabled */
+  btm_ble_set_batchscan_param(scan_mode, scan_interval, scan_window, addr_type,
+                              discard_rule, Bind(&param_enable_cb, cb));
+}
 
-  BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+/* This function is called to disable batch scanning */
+void BTM_BleDisableBatchScan(base::Callback<void(uint8_t /* status */)> cb) {
+  BTM_TRACE_EVENT(" BTM_BleDisableBatchScan");
 
-  if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) {
-    BTM_TRACE_ERROR("Controller does not support batch scan");
-    return BTM_ERR_PROCESSING;
+  if (!can_do_batch_scan()) {
+    cb.Run(BTM_ERR_PROCESSING);
+    return;
   }
 
-  btm_ble_enable_disable_batchscan(false);
-  /* The user needs to be provided scan disable event */
-  btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_PARAMS,
-                             BTM_BLE_SCAN_DISABLE_CALLED,
-                             BTM_BLE_BATCH_SCAN_DISABLE_EVT, ref_value);
-  return BTM_CMD_STARTED;
+  btm_ble_set_batchscan_param(
+      BTM_BLE_BATCH_SCAN_MODE_DISABLE, ble_batchscan_cb.scan_interval,
+      ble_batchscan_cb.scan_window, ble_batchscan_cb.addr_type,
+      ble_batchscan_cb.discard_rule, Bind(&disable_cb, cb));
+  ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLE_CALLED;
 }
 
-/*******************************************************************************
- *
- * Function         BTM_BleReadScanReports
- *
- * Description      This function is called to start reading batch scan reports
- *
- * Parameters:      scan_mode - Batch scan mode
- *                  ref_value - Reference value
- *
- * Returns          tBTM_STATUS
- *
- ******************************************************************************/
-tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
-                                   tBTM_BLE_REF_VALUE ref_value) {
-  tBTM_STATUS status = BTM_NO_RESOURCES;
-  tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+/* This function is called to start reading batch scan reports */
+void BTM_BleReadScanReports(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
+                            tBTM_BLE_SCAN_REP_CBACK cb) {
   uint8_t read_scan_mode = 0;
 
-  BTM_TRACE_EVENT(" BTM_BleReadScanReports; %d, %d", scan_mode, ref_value);
+  BTM_TRACE_EVENT("%s; %d", __func__, scan_mode);
 
-  if (!controller_get_interface()->supports_ble()) return BTM_ILLEGAL_VALUE;
-
-  BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-
-  if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) {
+  if (!can_do_batch_scan()) {
     BTM_TRACE_ERROR("Controller does not support batch scan");
-    return BTM_ERR_PROCESSING;
+    cb.Run(BTM_ERR_PROCESSING, 0, 0, {});
+    return;
   }
 
   /*  Check if the requested scan mode has already been setup by the user */
@@ -788,63 +496,44 @@ tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
 
   /* Check only for modes, as scan reports can be called after disabling batch
    * scan */
-  if (read_scan_mode > 0 && (BTM_BLE_BATCH_SCAN_MODE_PASS == scan_mode ||
-                             BTM_BLE_BATCH_SCAN_MODE_ACTI == scan_mode)) {
-    status = btm_ble_batchscan_enq_rep_q(scan_mode, ref_value);
-    if (BTM_SUCCESS == status) {
-      btm_ble_read_batchscan_reports(scan_mode, ref_value);
-      status = BTM_CMD_STARTED;
-    }
-  } else {
+  if (read_scan_mode < 0 || (scan_mode != BTM_BLE_BATCH_SCAN_MODE_PASS &&
+                             scan_mode != BTM_BLE_BATCH_SCAN_MODE_ACTI)) {
     BTM_TRACE_ERROR("Illegal read scan params: %d, %d, %d", read_scan_mode,
                     scan_mode, ble_batchscan_cb.cur_state);
-    return BTM_ILLEGAL_VALUE;
+    cb.Run(BTM_ILLEGAL_VALUE, 0, 0, {});
+    return;
   }
-  return status;
+
+  btm_ble_read_batchscan_reports(
+      scan_mode, base::Bind(&read_reports_cb, std::vector<uint8_t>(), 0, cb));
+  return;
 }
 
-/*******************************************************************************
- *
- * Function         BTM_BleTrackAdvertiser
- *
- * Description      This function is called to setup the callback for tracking
- *                  advertisers
- *
- * Parameters:      p_track_cback - Tracking callback pointer
- *                  ref_value - Reference value
- *
- * Returns          tBTM_STATUS
- *
- ******************************************************************************/
-tBTM_STATUS BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK* p_track_cback,
-                                   tBTM_BLE_REF_VALUE ref_value) {
-  tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
-  BTM_TRACE_EVENT(" BTM_BleTrackAdvertiser");
-  if (!controller_get_interface()->supports_ble()) return BTM_ILLEGAL_VALUE;
+/* This function is called to setup the callback for tracking */
+void BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK* p_track_cback,
+                            tBTM_BLE_REF_VALUE ref_value) {
+  BTM_TRACE_EVENT("%s:", __func__);
 
-  BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+  if (!can_do_batch_scan()) {
+    BTM_TRACE_ERROR("Controller does not support batch scan");
 
-  if (0 == cmn_ble_vsc_cb.tot_scan_results_strg) {
-    BTM_TRACE_ERROR("Controller does not support scan storage");
-    return BTM_ERR_PROCESSING;
+    tBTM_BLE_TRACK_ADV_DATA track_adv_data;
+    memset(&track_adv_data, 0, sizeof(tBTM_BLE_TRACK_ADV_DATA));
+    track_adv_data.advertiser_info_present =
+        NO_ADV_INFO_PRESENT; /* Indicates failure */
+    track_adv_data.client_if = (uint8_t)ref_value;
+    p_track_cback(&track_adv_data);
+    return;
   }
 
   ble_advtrack_cb.p_track_cback = p_track_cback;
   ble_advtrack_cb.ref_value = ref_value;
-  return BTM_CMD_STARTED;
+  return;
 }
 
-/*******************************************************************************
- *
- * Function         btm_ble_batchscan_init
- *
- * Description      This function initialize the batch scan control block.
- *
- * Parameters       None
- *
- * Returns          status
- *
- ******************************************************************************/
+/**
+ * This function initialize the batch scan control block.
+ **/
 void btm_ble_batchscan_init(void) {
   BTM_TRACE_EVENT(" btm_ble_batchscan_init");
   memset(&ble_batchscan_cb, 0, sizeof(tBTM_BLE_BATCH_SCAN_CB));
@@ -852,23 +541,11 @@ void btm_ble_batchscan_init(void) {
   BTM_RegisterForVSEvents(btm_ble_batchscan_filter_track_adv_vse_cback, true);
 }
 
-/*******************************************************************************
- *
- * Function         btm_ble_batchscan_cleanup
- *
- * Description      This function cleans the batch scan control block.
- *
- * Parameters       None
- *
- * Returns          void
- *
- ******************************************************************************/
+/**
+ * This function cleans the batch scan control block.
+ **/
 void btm_ble_batchscan_cleanup(void) {
-  int index = 0;
-  BTM_TRACE_EVENT(" btm_ble_batchscan_cleanup");
-
-  for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++)
-    osi_free_and_reset((void**)&ble_batchscan_cb.main_rep_q.p_data[index]);
+  BTM_TRACE_EVENT("%s", __func__);
 
   memset(&ble_batchscan_cb, 0, sizeof(tBTM_BLE_BATCH_SCAN_CB));
   memset(&ble_advtrack_cb, 0, sizeof(tBTM_BLE_ADV_TRACK_CB));
diff --git a/system/stack/include/btm_ble_api.h b/system/stack/include/btm_ble_api.h
index d7c8b79640cca9391f5ce6e7f13ef370a44a1523..3b16318819d679e300b89b27ff498b25b6f933fe 100644
--- a/system/stack/include/btm_ble_api.h
+++ b/system/stack/include/btm_ble_api.h
@@ -32,8 +32,6 @@
 #include "btm_ble_api_types.h"
 #include "osi/include/alarm.h"
 
-tBTM_BLE_SCAN_SETUP_CBACK bta_ble_scan_setup_cb;
-
 /*****************************************************************************
  *  EXTERNAL FUNCTION DECLARATIONS
  ****************************************************************************/
@@ -147,83 +145,36 @@ extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB* p_cmn_vsc_cb);
                     uint8_t batch_scan_trunc_max - Batch scan truncated value
  maximum
                     uint8_t batch_scan_notify_threshold - Threshold value
-                    tBTM_BLE_SCAN_SETUP_CBACK *p_setup_cback - Setup callback
+                    cb - Setup callback
                     tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback -Threshold
  callback
                     void *p_ref - Reference value
  *
- * Returns          tBTM_STATUS
  *
  ******************************************************************************/
-extern tBTM_STATUS BTM_BleSetStorageConfig(
+extern void BTM_BleSetStorageConfig(
     uint8_t batch_scan_full_max, uint8_t batch_scan_trunc_max,
     uint8_t batch_scan_notify_threshold,
-    tBTM_BLE_SCAN_SETUP_CBACK* p_setup_cback,
-    tBTM_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback,
-    tBTM_BLE_SCAN_REP_CBACK* p_cback, tBTM_BLE_REF_VALUE ref_value);
-
-/*******************************************************************************
- *
- * Function         BTM_BleEnableBatchScan
- *
- * Description      This function is called to enable batch scan
- *
- * Parameters       tBTM_BLE_BATCH_SCAN_MODE scan_mode - Batch scan mode
-                    uint32_t scan_interval -Scan interval
-                    uint32_t scan_window - Scan window value
-                    tBLE_ADDR_TYPE addr_type - Address type
-                    tBTM_BLE_DISCARD_RULE discard_rule - Data discard rules
- *
- * Returns          tBTM_STATUS
- *
- ******************************************************************************/
-extern tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
-                                          uint32_t scan_interval,
-                                          uint32_t scan_window,
-                                          tBTM_BLE_DISCARD_RULE discard_rule,
-                                          tBLE_ADDR_TYPE addr_type,
-                                          tBTM_BLE_REF_VALUE ref_value);
-
-/*******************************************************************************
- *
- * Function         BTM_BleDisableBatchScan
- *
- * Description      This function is called to disable batch scanning
- *
- * Parameters       void
- *
- ******************************************************************************/
-extern tBTM_STATUS BTM_BleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value);
-
-/*******************************************************************************
- *
- * Function         BTM_BleReadScanReports
- *
- * Description      This function is called to read batch scan reports
- *
- * Parameters       tBLE_SCAN_MODE scan_mode - Scan mode report to be read out
-                    tBTM_BLE_SCAN_REP_CBACK* p_cback - Reports callback
- *
- * Returns          tBTM_STATUS
- *
- ******************************************************************************/
-extern tBTM_STATUS BTM_BleReadScanReports(tBLE_SCAN_MODE scan_mode,
-                                          tBTM_BLE_REF_VALUE ref_value);
-
-/*******************************************************************************
- *
- * Function         BTM_BleTrackAdvertiser
- *
- * Description      This function is called to read batch scan reports
- *
- * Parameters       p_track_cback - Tracking callback
- *                  ref_value - Reference value
- *
- * Returns          tBTM_STATUS
- *
- ******************************************************************************/
-extern tBTM_STATUS BTM_BleTrackAdvertiser(
-    tBTM_BLE_TRACK_ADV_CBACK* p_track_cback, tBTM_BLE_REF_VALUE ref_value);
+    base::Callback<void(uint8_t /* status */)> cb,
+    tBTM_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback, tBTM_BLE_REF_VALUE ref_value);
+
+/* This function is called to enable batch scan */
+extern void BTM_BleEnableBatchScan(
+    tBTM_BLE_BATCH_SCAN_MODE scan_mode, uint32_t scan_interval,
+    uint32_t scan_window, tBTM_BLE_DISCARD_RULE discard_rule,
+    tBLE_ADDR_TYPE addr_type, base::Callback<void(uint8_t /* status */)> cb);
+
+/* This function is called to disable batch scanning */
+extern void BTM_BleDisableBatchScan(
+    base::Callback<void(uint8_t /* status */)> cb);
+
+/* This function is called to read batch scan reports */
+extern void BTM_BleReadScanReports(tBLE_SCAN_MODE scan_mode,
+                                   tBTM_BLE_SCAN_REP_CBACK cb);
+
+/* This function is called to setup the callback for tracking */
+extern void BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK* p_track_cback,
+                                   tBTM_BLE_REF_VALUE ref_value);
 
 /*******************************************************************************
  *
diff --git a/system/stack/include/btm_ble_api_types.h b/system/stack/include/btm_ble_api_types.h
index f295aae86f08967cb5f5f784a6d1f5ce9ca61385..9b20ad2bc29038884de7af33ce6a401b9bd3a11b 100644
--- a/system/stack/include/btm_ble_api_types.h
+++ b/system/stack/include/btm_ble_api_types.h
@@ -365,13 +365,9 @@ typedef void(tBTM_BLE_ADV_DATA_CMPL_CBACK)(tBTM_STATUS status);
 typedef uint8_t tGATT_IF;
 
 typedef void(tBTM_BLE_SCAN_THRESHOLD_CBACK)(tBTM_BLE_REF_VALUE ref_value);
-typedef void(tBTM_BLE_SCAN_REP_CBACK)(tBTM_BLE_REF_VALUE ref_value,
-                                      uint8_t report_format,
-                                      uint8_t num_records, uint16_t total_len,
-                                      uint8_t* p_rep_data, uint8_t status);
-typedef void(tBTM_BLE_SCAN_SETUP_CBACK)(uint8_t evt,
-                                        tBTM_BLE_REF_VALUE ref_value,
-                                        uint8_t status);
+using tBTM_BLE_SCAN_REP_CBACK =
+    base::Callback<void(uint8_t /* status */, uint8_t /* report_format */,
+                        uint8_t /* num_reports */, std::vector<uint8_t>)>;
 
 #ifndef BTM_BLE_BATCH_SCAN_MAX
 #define BTM_BLE_BATCH_SCAN_MAX 5
@@ -392,24 +388,6 @@ typedef enum {
 enum { BTM_BLE_DISCARD_OLD_ITEMS, BTM_BLE_DISCARD_LOWER_RSSI_ITEMS };
 typedef uint8_t tBTM_BLE_DISCARD_RULE;
 
-typedef struct {
-  uint8_t sub_code[BTM_BLE_BATCH_SCAN_MAX];
-  tBTM_BLE_BATCH_SCAN_STATE cur_state[BTM_BLE_BATCH_SCAN_MAX];
-  tBTM_BLE_REF_VALUE ref_value[BTM_BLE_BATCH_SCAN_MAX];
-  uint8_t pending_idx;
-  uint8_t next_idx;
-} tBTM_BLE_BATCH_SCAN_OPQ;
-
-typedef struct {
-  uint8_t rep_mode[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
-  tBTM_BLE_REF_VALUE ref_value[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
-  uint8_t num_records[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
-  uint16_t data_len[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
-  uint8_t* p_data[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
-  uint8_t pending_idx;
-  uint8_t next_idx;
-} tBTM_BLE_BATCH_SCAN_REP_Q;
-
 typedef struct {
   tBTM_BLE_BATCH_SCAN_STATE cur_state;
   tBTM_BLE_BATCH_SCAN_MODE scan_mode;
@@ -417,11 +395,7 @@ typedef struct {
   uint32_t scan_window;
   tBLE_ADDR_TYPE addr_type;
   tBTM_BLE_DISCARD_RULE discard_rule;
-  tBTM_BLE_BATCH_SCAN_OPQ op_q;
-  tBTM_BLE_BATCH_SCAN_REP_Q main_rep_q;
-  tBTM_BLE_SCAN_SETUP_CBACK* p_setup_cback;
   tBTM_BLE_SCAN_THRESHOLD_CBACK* p_thres_cback;
-  tBTM_BLE_SCAN_REP_CBACK* p_scan_rep_cback;
   tBTM_BLE_REF_VALUE ref_value;
 } tBTM_BLE_BATCH_SCAN_CB;
 
@@ -549,13 +523,6 @@ enum { BTM_BLE_TRACK_ADV_ADD, BTM_BLE_TRACK_ADV_REMOVE };
 
 typedef uint8_t tBTM_BLE_TRACK_ADV_ACTION;
 
-#define BTM_BLE_BATCH_SCAN_ENABLE_EVT 1
-#define BTM_BLE_BATCH_SCAN_CFG_STRG_EVT 2
-#define BTM_BLE_BATCH_SCAN_READ_REPTS_EVT 3
-#define BTM_BLE_BATCH_SCAN_THR_EVT 4
-#define BTM_BLE_BATCH_SCAN_PARAM_EVT 5
-#define BTM_BLE_BATCH_SCAN_DISABLE_EVT 6
-
 typedef uint8_t tBTM_BLE_BATCH_SCAN_EVT;
 
 typedef uint32_t tBTM_BLE_TX_TIME_MS;