diff --git a/system/bta/dm/bta_dm_api.cc b/system/bta/dm/bta_dm_api.cc
index baa49e56255ee85b2b3cc9dc61d8fa8dbcbf131c..1ac0975aa5810e162c794b0d32266675a8bfede6 100644
--- a/system/bta/dm/bta_dm_api.cc
+++ b/system/bta/dm/bta_dm_api.cc
@@ -1159,15 +1159,13 @@ void BTA_DmBleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
                                  tBTM_BLE_PF_COND_TYPE cond_type,
                                  tBTM_BLE_PF_FILT_INDEX filt_index,
                                  tBTM_BLE_PF_COND_PARAM* p_cond,
-                                 tBTM_BLE_PF_CFG_CBACK* p_cmpl_cback,
-                                 tBTM_BLE_REF_VALUE ref_value) {
+                                 tBTM_BLE_PF_CFG_CBACK update_cb) {
   APPL_TRACE_API("BTA_DmBleCfgFilterCondition: %d, %d", action, cond_type);
 
   if (!p_cond) {
-    do_in_bta_thread(
-        FROM_HERE,
-        base::Bind(base::IgnoreResult(&BTM_BleCfgFilterCondition), action,
-                   cond_type, filt_index, nullptr, p_cmpl_cback, ref_value));
+    do_in_bta_thread(FROM_HERE,
+                     base::Bind(&BTM_BleCfgFilterCondition, action, cond_type,
+                                filt_index, nullptr, update_cb));
   }
 
   uint16_t len = sizeof(tBTM_BLE_PF_COND_PARAM);
@@ -1244,19 +1242,18 @@ void BTA_DmBleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
   }
 
   do_in_bta_thread(
-      FROM_HERE, base::Bind(base::IgnoreResult(&BTM_BleCfgFilterCondition),
-                            action, cond_type, filt_index,
-                            base::Owned((tBTM_BLE_PF_COND_PARAM*)p_cond_param),
-                            p_cmpl_cback, ref_value));
+      FROM_HERE,
+      base::Bind(&BTM_BleCfgFilterCondition, action, cond_type, filt_index,
+                 base::Owned((tBTM_BLE_PF_COND_PARAM*)p_cond_param),
+                 update_cb));
 }
 
-void BTA_DmBleScanFilterClear(tBTM_BLE_REF_VALUE ref_value,
-                              tBTM_BLE_PF_FILT_INDEX filt_index,
-                              tBTM_BLE_PF_CFG_CBACK* p_cmpl_cback) {
-  do_in_bta_thread(FROM_HERE,
-                   base::Bind(base::IgnoreResult(&BTM_BleCfgFilterCondition),
-                              BTM_BLE_SCAN_COND_CLEAR, BTM_BLE_PF_TYPE_ALL,
-                              filt_index, nullptr, p_cmpl_cback, ref_value));
+void BTA_DmBleScanFilterClear(tBTM_BLE_PF_FILT_INDEX filt_index,
+                              tBTM_BLE_PF_CFG_CBACK update_cb) {
+  do_in_bta_thread(
+      FROM_HERE,
+      base::Bind(&BTM_BleCfgFilterCondition, BTM_BLE_SCAN_COND_CLEAR,
+                 BTM_BLE_PF_TYPE_ALL, filt_index, nullptr, update_cb));
 }
 
 /*******************************************************************************
@@ -1268,22 +1265,19 @@ void BTA_DmBleScanFilterClear(tBTM_BLE_REF_VALUE ref_value,
  *
  * Parameters       filt_index - Filter index
  *                  p_filt_params -Filter parameters
- *                  ref_value - Reference value
  *                  action - Add, delete or clear
- *                  p_cmpl_back - Command completed callback
- *
- * Returns          void
+ *                  cb - Command completed callback
  *
  ******************************************************************************/
 void BTA_DmBleScanFilterSetup(
     uint8_t action, tBTM_BLE_PF_FILT_INDEX filt_index,
     std::unique_ptr<btgatt_filt_param_setup_t> p_filt_params,
-    tBTM_BLE_PF_PARAM_CBACK p_cmpl_cback, tBTM_BLE_REF_VALUE ref_value) {
+    tBTM_BLE_PF_PARAM_CB cb) {
   APPL_TRACE_API("%s: %d", __func__, action);
+
   do_in_bta_thread(FROM_HERE,
-                   base::Bind(base::IgnoreResult(&BTM_BleAdvFilterParamSetup),
-                              action, filt_index, base::Passed(&p_filt_params),
-                              p_cmpl_cback, ref_value));
+                   base::Bind(&BTM_BleAdvFilterParamSetup, action, filt_index,
+                              base::Passed(&p_filt_params), cb));
 }
 
 /*******************************************************************************
@@ -1309,30 +1303,6 @@ void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK* p_cmpl_cback) {
   bta_sys_sendmsg(p_msg);
 }
 
-/*******************************************************************************
- *
- * Function         BTA_DmEnableScanFilter
- *
- * Description      This function is called to enable the adv data payload
- *                  filter
- *
- * Parameters       action - enable or disable the APCF feature
- *                  p_cmpl_cback - Command completed callback
- *                  ref_value - Reference value
- *
- * Returns          void
- *
- ******************************************************************************/
-void BTA_DmEnableScanFilter(uint8_t action,
-                            tBTM_BLE_PF_STATUS_CBACK* p_cmpl_cback,
-                            tBTM_BLE_REF_VALUE ref_value) {
-  APPL_TRACE_API("%s: %d", __func__, action);
-  do_in_bta_thread(
-      FROM_HERE,
-      base::Bind(base::IgnoreResult(&BTM_BleEnableDisableFilterFeature), action,
-                 p_cmpl_cback, ref_value));
-}
-
 /*******************************************************************************
  *
  * Function         BTA_DmBleUpdateConnectionParams
diff --git a/system/bta/include/bta_api.h b/system/bta/include/bta_api.h
index da42ebbcaa49277f08c83821090317bc1b7f91ce..18ba01a837a8a25dcd0ddfed0331a7b538e7ba91 100644
--- a/system/bta/include/bta_api.h
+++ b/system/bta/include/bta_api.h
@@ -1835,24 +1835,6 @@ extern void BTA_DmBleReadScanReports(tBTA_BLE_BATCH_SCAN_MODE scan_type,
  ******************************************************************************/
 extern void BTA_DmBleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value);
 
-/*******************************************************************************
- *
- * Function         BTA_DmEnableScanFilter
- *
- * Description      This function is called to enable the adv data payload
- *                  filter
- *
- * Parameters       action - enable or disable the APCF feature
- *                  p_cmpl_cback - Command completed callback
- *                  ref_value - Reference value
- *
- * Returns          void
- *
- ******************************************************************************/
-extern void BTA_DmEnableScanFilter(uint8_t action,
-                                   tBTM_BLE_PF_STATUS_CBACK* p_cmpl_cback,
-                                   tBTM_BLE_REF_VALUE ref_value);
-
 /*******************************************************************************
  *
  * Function         BTA_DmBleScanFilterSetup
@@ -1863,15 +1845,13 @@ extern void BTA_DmEnableScanFilter(uint8_t action,
  *                  p_filt_params -Filter parameters
  *                  ref_value - Reference value
  *                  action - Add, delete or clear
- *                  p_cmpl_back - Command completed callback
- *
- * Returns          void
+ *                  cb - Command completed callback
  *
  ******************************************************************************/
 extern void BTA_DmBleScanFilterSetup(
     uint8_t action, tBTM_BLE_PF_FILT_INDEX filt_index,
     std::unique_ptr<btgatt_filt_param_setup_t> p_filt_params,
-    tBTM_BLE_PF_PARAM_CBACK p_cmpl_cback, tBTM_BLE_REF_VALUE ref_value);
+    tBTM_BLE_PF_PARAM_CB cb);
 
 /*******************************************************************************
  *
@@ -1884,22 +1864,19 @@ extern void BTA_DmBleScanFilterSetup(
  *                  cond_type: filter condition type
  *                  filt_index - Filter index
  *                  p_cond: filter condition parameter
- *                  p_cmpl_back - Command completed callback
- *                  ref_value - Reference value
+ *                  cb - Command completed callback
  *
  * Returns          void
  *
  ******************************************************************************/
-extern void BTA_DmBleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
-                                        tBTM_BLE_PF_COND_TYPE cond_type,
-                                        tBTM_BLE_PF_FILT_INDEX filt_index,
-                                        tBTM_BLE_PF_COND_PARAM* p_cond,
-                                        tBTM_BLE_PF_CFG_CBACK* p_cmpl_cback,
-                                        tBTM_BLE_REF_VALUE ref_value);
-
-extern void BTA_DmBleScanFilterClear(tBTM_BLE_REF_VALUE ref_value,
-                                     tBTM_BLE_PF_FILT_INDEX filt_index,
-                                     tBTM_BLE_PF_CFG_CBACK* p_cmpl_cback);
+extern void BTA_DmBleCfgFilterCondition(
+    tBTM_BLE_SCAN_COND_OP action, tBTM_BLE_PF_COND_TYPE cond_type,
+    tBTM_BLE_PF_FILT_INDEX filt_index, tBTM_BLE_PF_COND_PARAM* p_cond,
+    base::Callback<void(uint8_t, uint8_t, uint8_t)> cb);
+
+extern void BTA_DmBleScanFilterClear(
+    tBTM_BLE_PF_FILT_INDEX filt_index,
+    base::Callback<void(uint8_t, uint8_t, uint8_t)> cb);
 
 /*******************************************************************************
  *
diff --git a/system/btif/src/btif_ble_scanner.cc b/system/btif/src/btif_ble_scanner.cc
index b26fbcc3ba85f24af42e500cc40fc91ebb82a8f7..1af772e159744d8c66dfe3b5c0835878fd61b6b9 100644
--- a/system/btif/src/btif_ble_scanner.cc
+++ b/system/btif/src/btif_ble_scanner.cc
@@ -185,24 +185,22 @@ void bta_scan_param_setup_cb(tGATT_IF client_if, tBTM_STATUS status) {
                     btif_gattc_translate_btm_status(status));
 }
 
-void bta_scan_filt_cfg_cb(tBTM_BLE_PF_ACTION action,
-                          tBTM_BLE_SCAN_COND_OP cfg_op,
-                          tBTM_BLE_PF_AVBL_SPACE avbl_space, tBTA_STATUS status,
-                          tBTM_BLE_REF_VALUE ref_value) {
-  SCAN_CBACK_IN_JNI(scan_filter_cfg_cb, action, ref_value, status, cfg_op,
+void bta_scan_filt_cfg_cb(uint8_t filt_type, uint8_t client_if,
+                          tBTM_BLE_PF_AVBL_SPACE avbl_space,
+                          tBTM_BLE_PF_ACTION action, tBTA_STATUS status) {
+  SCAN_CBACK_IN_JNI(scan_filter_cfg_cb, action, client_if, status, filt_type,
                     avbl_space);
 }
 
-void bta_scan_filt_param_setup_cb(uint8_t action_type,
+void bta_scan_filt_param_setup_cb(tBTM_BLE_REF_VALUE ref_value,
                                   tBTM_BLE_PF_AVBL_SPACE avbl_space,
-                                  tBTM_BLE_REF_VALUE ref_value,
-                                  tBTA_STATUS status) {
+                                  uint8_t action_type, tBTA_STATUS status) {
   SCAN_CBACK_IN_JNI(scan_filter_param_cb, action_type, ref_value, status,
                     avbl_space);
 }
 
-void bta_scan_filt_status_cb(uint8_t action, tBTA_STATUS status,
-                             tBTM_BLE_REF_VALUE ref_value) {
+void bta_scan_filt_status_cb(tBTM_BLE_REF_VALUE ref_value, uint8_t action,
+                             tBTA_STATUS status) {
   SCAN_CBACK_IN_JNI(scan_filter_status_cb, action, ref_value, status);
 }
 
@@ -364,8 +362,9 @@ void btif_gattc_scan_filter_add_srvc_uuid(tBT_UUID uuid,
   cond.srvc_uuid.uuid = uuid;
   cond.srvc_uuid.p_uuid_mask = p_uuid_mask;
 
-  BTA_DmBleCfgFilterCondition(action, filt_type, filt_index, &cond,
-                              &bta_scan_filt_cfg_cb, client_if);
+  BTA_DmBleCfgFilterCondition(
+      action, filt_type, filt_index, &cond,
+      Bind(&bta_scan_filt_cfg_cb, filt_type, client_if));
 }
 
 void btif_gattc_scan_filter_add_local_name(vector<uint8_t> data, int action,
@@ -376,8 +375,9 @@ void btif_gattc_scan_filter_add_local_name(vector<uint8_t> data, int action,
 
   cond.local_name.data_len = data.size();
   cond.local_name.p_data = const_cast<uint8_t*>(data.data());
-  BTA_DmBleCfgFilterCondition(action, filt_type, filt_index, &cond,
-                              &bta_scan_filt_cfg_cb, client_if);
+  BTA_DmBleCfgFilterCondition(
+      action, filt_type, filt_index, &cond,
+      Bind(&bta_scan_filt_cfg_cb, filt_type, client_if));
 }
 
 void btif_gattc_scan_filter_add_manu_data(int company_id, int company_id_mask,
@@ -393,8 +393,9 @@ void btif_gattc_scan_filter_add_manu_data(int company_id, int company_id_mask,
   cond.manu_data.data_len = pattern.size();
   cond.manu_data.p_pattern = const_cast<uint8_t*>(pattern.data());
   cond.manu_data.p_pattern_mask = const_cast<uint8_t*>(pattern_mask.data());
-  BTA_DmBleCfgFilterCondition(action, filt_type, filt_index, &cond,
-                              &bta_scan_filt_cfg_cb, client_if);
+  BTA_DmBleCfgFilterCondition(
+      action, filt_type, filt_index, &cond,
+      Bind(&bta_scan_filt_cfg_cb, filt_type, client_if));
 }
 
 void btif_gattc_scan_filter_add_data_pattern(vector<uint8_t> pattern,
@@ -407,8 +408,9 @@ void btif_gattc_scan_filter_add_data_pattern(vector<uint8_t> pattern,
   cond.srvc_data.data_len = pattern.size();
   cond.srvc_data.p_pattern = const_cast<uint8_t*>(pattern.data());
   cond.srvc_data.p_pattern_mask = const_cast<uint8_t*>(pattern_mask.data());
-  BTA_DmBleCfgFilterCondition(action, filt_type, filt_index, &cond,
-                              &bta_scan_filt_cfg_cb, client_if);
+  BTA_DmBleCfgFilterCondition(
+      action, filt_type, filt_index, &cond,
+      Bind(&bta_scan_filt_cfg_cb, filt_type, client_if));
 }
 
 class BleScannerInterfaceImpl : public BleScannerInterface {
@@ -459,10 +461,9 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
             BTA_DmBleTrackAdvertiser(client_if, bta_track_adv_event_cb);
           }
 
-          BTA_DmBleScanFilterSetup(action, filt_index,
-                                   std::move(adv_filt_param),
-                                   bta_scan_filt_param_setup_cb, client_if);
-
+          BTA_DmBleScanFilterSetup(
+              action, filt_index, std::move(adv_filt_param),
+              base::Bind(&bta_scan_filt_param_setup_cb, client_if));
         },
         client_if, action, filt_index, base::Passed(&filt_param)));
   }
@@ -487,16 +488,17 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
 
         bdcpy(cond->target_addr.bda, bd_addr->address);
         cond->target_addr.type = addr_type;
-        do_in_jni_thread(Bind(&BTA_DmBleCfgFilterCondition, action, filt_type,
-                              filt_index, base::Owned(cond),
-                              &bta_scan_filt_cfg_cb, client_if));
+        do_in_jni_thread(
+            Bind(&BTA_DmBleCfgFilterCondition, action, filt_type, filt_index,
+                 base::Owned(cond),
+                 Bind(&bta_scan_filt_cfg_cb, filt_type, client_if)));
         return;
       }
 
       case BTM_BLE_PF_SRVC_DATA:
-        do_in_jni_thread(Bind(&BTA_DmBleCfgFilterCondition, action, filt_type,
-                              filt_index, nullptr, &bta_scan_filt_cfg_cb,
-                              client_if));
+        do_in_jni_thread(
+            Bind(&BTA_DmBleCfgFilterCondition, action, filt_type, filt_index,
+                 nullptr, Bind(&bta_scan_filt_cfg_cb, filt_type, client_if)));
         return;
 
       case BTM_BLE_PF_SRVC_UUID: {
@@ -526,9 +528,10 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
         cond->solicitate_uuid.cond_logic = BTM_BLE_PF_LOGIC_AND;
         btif_to_bta_uuid(&cond->solicitate_uuid.uuid, p_uuid);
 
-        do_in_jni_thread(Bind(&BTA_DmBleCfgFilterCondition, action, filt_type,
-                              filt_index, base::Owned(cond),
-                              &bta_scan_filt_cfg_cb, client_if));
+        do_in_jni_thread(
+            Bind(&BTA_DmBleCfgFilterCondition, action, filt_type, filt_index,
+                 base::Owned(cond),
+                 Bind(&bta_scan_filt_cfg_cb, filt_type, client_if)));
         return;
       }
 
@@ -561,16 +564,25 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
 
   void ScanFilterClear(int client_if, int filter_index) override {
     BTIF_TRACE_DEBUG("%s: filter_index: %d", __func__, filter_index);
-    do_in_jni_thread(Bind(&BTA_DmBleScanFilterClear, client_if, filter_index,
-                          &bta_scan_filt_cfg_cb));
+
+    do_in_jni_thread(
+        Bind(&BTA_DmBleScanFilterClear, filter_index,
+             Bind(&bta_scan_filt_cfg_cb, BTM_BLE_PF_TYPE_ALL, client_if)));
   }
 
   void ScanFilterEnable(int client_if, bool enable) override {
     BTIF_TRACE_DEBUG("%s: enable: %d", __func__, enable);
 
     uint8_t action = enable ? 1 : 0;
-    do_in_jni_thread(Bind(&BTA_DmEnableScanFilter, action,
-                          &bta_scan_filt_status_cb, client_if));
+    do_in_jni_thread(Bind(
+        [](int client_if, bool action) {
+          do_in_bta_thread(
+              FROM_HERE,
+              base::Bind(&BTM_BleEnableDisableFilterFeature, action,
+                         base::Bind(&bta_scan_filt_status_cb, client_if)));
+
+        },
+        client_if, action));
   }
 
   void SetScanParameters(int client_if, int scan_interval,
diff --git a/system/btif/src/btif_dm.cc b/system/btif/src/btif_dm.cc
index 2a725fd85b1caeef366551059a3ea5eecf29e3a5..6429e9980c6e7618bfe7cad83939a0869c06d961 100644
--- a/system/btif/src/btif_dm.cc
+++ b/system/btif/src/btif_dm.cc
@@ -29,6 +29,7 @@
 
 #include "btif_dm.h"
 
+#include <base/bind.h>
 #include <base/logging.h>
 #include <signal.h>
 #include <stdio.h>
@@ -228,10 +229,8 @@ static void btif_dm_ble_key_nc_req_evt(tBTA_DM_SP_KEY_NOTIF* p_notif_req);
 static void btif_dm_ble_oob_req_evt(tBTA_DM_SP_RMT_OOB* req_oob_type);
 static void btif_dm_ble_sc_oob_req_evt(tBTA_DM_SP_RMT_OOB* req_oob_type);
 
-static void bte_scan_filt_param_cfg_evt(uint8_t action_type,
-                                        tBTM_BLE_PF_AVBL_SPACE avbl_space,
-                                        tBTM_BLE_REF_VALUE ref_value,
-                                        tBTA_STATUS status);
+static void bte_scan_filt_param_cfg_evt(uint8_t action_type, uint8_t avbl_space,
+                                        uint8_t ref_value, uint8_t status);
 
 static char* btif_get_default_local_name();
 
@@ -1347,7 +1346,7 @@ static void btif_dm_search_devices_evt(uint16_t event, char* p_param) {
 
     case BTA_DM_INQ_CMPL_EVT: {
       BTA_DmBleScanFilterSetup(BTM_BLE_SCAN_COND_DELETE, 0, nullptr,
-                               bte_scan_filt_param_cfg_evt, 0);
+                               base::Bind(&bte_scan_filt_param_cfg_evt, 0));
     } break;
     case BTA_DM_DISC_CMPL_EVT: {
       HAL_CBACK(bt_hal_cbacks, discovery_state_changed_cb,
@@ -1367,7 +1366,7 @@ static void btif_dm_search_devices_evt(uint16_t event, char* p_param) {
         btgatt_filt_param_setup_t adv_filt_param;
         memset(&adv_filt_param, 0, sizeof(btgatt_filt_param_setup_t));
         BTA_DmBleScanFilterSetup(BTM_BLE_SCAN_COND_DELETE, 0, nullptr,
-                                 bte_scan_filt_param_cfg_evt, 0);
+                                 base::Bind(&bte_scan_filt_param_cfg_evt, 0));
         HAL_CBACK(bt_hal_cbacks, discovery_state_changed_cb,
                   BT_DISCOVERY_STOPPED);
       }
@@ -2118,19 +2117,9 @@ static void bta_energy_info_cb(tBTA_DM_BLE_TX_TIME_MS tx_time,
                         NULL);
 }
 
-/*******************************************************************************
- *
- * Function         bte_scan_filt_param_cfg_evt
- *
- * Description      Scan filter param config event
- *
- * Returns          void
- *
- ******************************************************************************/
-static void bte_scan_filt_param_cfg_evt(uint8_t action_type,
-                                        tBTM_BLE_PF_AVBL_SPACE avbl_space,
-                                        tBTM_BLE_REF_VALUE ref_value,
-                                        tBTA_STATUS status) {
+/* Scan filter param config event */
+static void bte_scan_filt_param_cfg_evt(uint8_t ref_value, uint8_t avbl_space,
+                                        uint8_t action_type, uint8_t status) {
   /* This event occurs on calling BTA_DmBleCfgFilterCondition internally,
   ** and that is why there is no HAL callback
   */
@@ -2164,7 +2153,7 @@ bt_status_t btif_dm_start_discovery(void) {
 
   /* Cleanup anything remaining on index 0 */
   BTA_DmBleScanFilterSetup(BTM_BLE_SCAN_COND_DELETE, 0, nullptr,
-                           bte_scan_filt_param_cfg_evt, 0);
+                           base::Bind(&bte_scan_filt_param_cfg_evt, 0));
 
   auto adv_filt_param = std::make_unique<btgatt_filt_param_setup_t>();
   /* Add an allow-all filter on index 0*/
@@ -2175,7 +2164,7 @@ bt_status_t btif_dm_start_discovery(void) {
   adv_filt_param->rssi_low_thres = LOWEST_RSSI_VALUE;
   adv_filt_param->rssi_high_thres = LOWEST_RSSI_VALUE;
   BTA_DmBleScanFilterSetup(BTM_BLE_SCAN_COND_ADD, 0, std::move(adv_filt_param),
-                           bte_scan_filt_param_cfg_evt, 0);
+                           base::Bind(&bte_scan_filt_param_cfg_evt, 0));
 
   /* TODO: Do we need to handle multiple inquiries at the same time? */
 
diff --git a/system/stack/btm/btm_ble_adv_filter.cc b/system/stack/btm/btm_ble_adv_filter.cc
index 3b222b4bae249e117574a06f88f9b8ba765994c2..d26a5e0d232360c7efef400e919b9fbca913b34d 100644
--- a/system/stack/btm/btm_ble_adv_filter.cc
+++ b/system/stack/btm/btm_ble_adv_filter.cc
@@ -18,6 +18,7 @@
 
 #define LOG_TAG "bt_btm_ble"
 
+#include <base/bind.h>
 #include <string.h>
 
 #include "bt_target.h"
@@ -97,77 +98,6 @@ tBTM_STATUS btm_ble_obtain_vsc_details() {
   return st;
 }
 
-/*******************************************************************************
- *
- * Function         btm_ble_advfilt_enq_op_q
- *
- * Description      enqueue an adv filter operation in the q to check command
- *                  complete status
- *
- * Returns          void
- *
- ******************************************************************************/
-void btm_ble_advfilt_enq_op_q(uint8_t action, uint8_t ocf,
-                              tBTM_BLE_FILT_CB_EVT cb_evt,
-                              tBTM_BLE_REF_VALUE ref,
-                              tBTM_BLE_PF_CFG_CBACK* p_cmpl_cback,
-                              tBTM_BLE_PF_PARAM_CBACK* p_filt_param_cback) {
-  btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx] =
-      (action | (ocf << 4));
-  btm_ble_adv_filt_cb.op_q.ref_value[btm_ble_adv_filt_cb.op_q.next_idx] = ref;
-  btm_ble_adv_filt_cb.op_q.cb_evt[btm_ble_adv_filt_cb.op_q.next_idx] = cb_evt;
-  btm_ble_adv_filt_cb.op_q.p_scan_cfg_cback[btm_ble_adv_filt_cb.op_q.next_idx] =
-      p_cmpl_cback;
-  btm_ble_adv_filt_cb.op_q
-      .p_filt_param_cback[btm_ble_adv_filt_cb.op_q.next_idx] =
-      p_filt_param_cback;
-  BTM_TRACE_DEBUG(
-      "btm_ble_advfilt_enq_op_q: act_ocf:%d, action:%d, ocf:%d,cb_evt;%d, "
-      "cback:%x",
-      btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx],
-      action, ocf, cb_evt, p_cmpl_cback);
-  btm_ble_adv_filt_cb.op_q.next_idx =
-      (btm_ble_adv_filt_cb.op_q.next_idx + 1) % BTM_BLE_PF_TYPE_MAX;
-}
-
-/*******************************************************************************
- *
- * Function         btm_ble_advfilt_deq_op_q
- *
- * Description      dequeue an adv filter operation from q when command complete
- *                  is received
- *
- * Returns          void
- *
- ******************************************************************************/
-void btm_ble_advfilt_deq_op_q(uint8_t* p_action, uint8_t* p_ocf,
-                              tBTM_BLE_FILT_CB_EVT* p_cb_evt,
-                              tBTM_BLE_REF_VALUE* p_ref,
-                              tBTM_BLE_PF_CFG_CBACK** p_cmpl_cback,
-                              tBTM_BLE_PF_PARAM_CBACK** p_filt_param_cback) {
-  *p_ocf = (btm_ble_adv_filt_cb.op_q
-                .action_ocf[btm_ble_adv_filt_cb.op_q.pending_idx] >>
-            4);
-  *p_action = (btm_ble_adv_filt_cb.op_q
-                   .action_ocf[btm_ble_adv_filt_cb.op_q.pending_idx] &
-               BTM_BLE_ADV_FILT_SUBCODE_MASK);
-  *p_ref =
-      btm_ble_adv_filt_cb.op_q.ref_value[btm_ble_adv_filt_cb.op_q.pending_idx];
-  *p_cb_evt =
-      btm_ble_adv_filt_cb.op_q.cb_evt[btm_ble_adv_filt_cb.op_q.pending_idx];
-  *p_cmpl_cback = btm_ble_adv_filt_cb.op_q
-                      .p_scan_cfg_cback[btm_ble_adv_filt_cb.op_q.pending_idx];
-  *p_filt_param_cback =
-      btm_ble_adv_filt_cb.op_q
-          .p_filt_param_cback[btm_ble_adv_filt_cb.op_q.pending_idx];
-
-  btm_ble_adv_filt_cb.op_q.pending_idx =
-      (btm_ble_adv_filt_cb.op_q.pending_idx + 1) % BTM_BLE_PF_TYPE_MAX;
-  BTM_TRACE_DEBUG(
-      "btm_ble_advfilt_deq_op_q: ocf:%d, action:%d, ref_value:%d, cb_evt:%x",
-      *p_ocf, *p_action, *p_ref, *p_cb_evt);
-}
-
 /*******************************************************************************
  *
  * Function         btm_ble_condtype_to_ocf
@@ -253,118 +183,46 @@ uint8_t btm_ble_ocf_to_condtype(uint8_t ocf) {
   return cond_type;
 }
 
-/*******************************************************************************
- *
- * Function         btm_ble_scan_pf_cmpl_cback
- *
- * Description      the BTM BLE customer feature VSC complete callback for ADV
- *                  PF filtering
- *
- * Returns          pointer to the counter if found; NULL otherwise.
- *
- ******************************************************************************/
-void btm_ble_scan_pf_cmpl_cback(tBTM_VSC_CMPL* p_params) {
-  uint8_t status = 0;
-  uint8_t *p = p_params->p_param_buf, op_subcode = 0, action = 0xff;
-  uint16_t evt_len = p_params->param_len;
-  uint8_t ocf = BTM_BLE_META_PF_ALL, cond_type = 0;
-  uint8_t num_avail = 0, cb_evt = 0;
-  tBTM_BLE_REF_VALUE ref_value = 0;
-  tBTM_BLE_PF_CFG_CBACK* p_scan_cfg_cback = NULL;
-  tBTM_BLE_PF_PARAM_CBACK* p_filt_param_cback = NULL;
-
-  if (evt_len < 3 || evt_len > 4) {
-    BTM_TRACE_ERROR(
-        "%s cannot interpret APCF callback status = %d, length = %d", __func__,
-        status, evt_len);
-    btm_ble_advfilt_deq_op_q(&action, &ocf, &cb_evt, &ref_value,
-                             &p_scan_cfg_cback, &p_filt_param_cback);
+void btm_flt_update_cb(uint8_t expected_ocf, tBTM_BLE_PF_CFG_CBACK cb,
+                       uint8_t* p, uint16_t evt_len) {
+  if (evt_len != 4) {
+    BTM_TRACE_ERROR("%s: bad length: %d", __func__, evt_len);
     return;
   }
 
-  btm_ble_advfilt_deq_op_q(&action, &ocf, &cb_evt, &ref_value,
-                           &p_scan_cfg_cback, &p_filt_param_cback);
-
+  uint8_t status, op_subcode, action, num_avail;
   STREAM_TO_UINT8(status, p);
   STREAM_TO_UINT8(op_subcode, p);
   STREAM_TO_UINT8(action, p);
+  STREAM_TO_UINT8(num_avail, p);
 
-  /* Ignore the event, if it is not the same one expected */
-  if (3 == evt_len) {
-    if (ocf != op_subcode) {
-      BTM_TRACE_ERROR(
-          "btm_ble_scan_pf_cmpl_cback:3-Incorrect opcode :%d, %d, %d, %d, %d, "
-          "%d",
-          ocf, op_subcode, action, evt_len, ref_value, status);
-      return;
-    } else {
-      if (NULL != btm_ble_adv_filt_cb.p_filt_stat_cback)
-        btm_ble_adv_filt_cb.p_filt_stat_cback(action, status, ref_value);
-      BTM_TRACE_DEBUG(
-          "btm_ble_scan_pf_cmpl_cback enabled/disabled, %d, %d, %d, %d", ocf,
-          action, status, ref_value);
-      return;
-    }
+  if (expected_ocf != op_subcode) {
+    BTM_TRACE_ERROR("%s: Incorrect opcode: 0x%02x, expected: 0x%02x", __func__,
+                    expected_ocf, op_subcode);
+    return;
   }
 
-  if (4 == evt_len && ocf != op_subcode) {
-    BTM_TRACE_ERROR(
-        "btm_ble_scan_pf_cmpl_cback:4-Incorrect opcode: %d, %d, %d, %d, %d",
-        ocf, op_subcode, action, status, ref_value);
+  if (op_subcode == BTM_BLE_META_PF_FEAT_SEL) {
+    cb.Run(num_avail, action, status);
     return;
   }
 
-  STREAM_TO_UINT8(num_avail, p);
-  switch (op_subcode) {
-    case BTM_BLE_META_PF_ADDR:
-    case BTM_BLE_META_PF_UUID:
-    case BTM_BLE_META_PF_SOL_UUID:
-    case BTM_BLE_META_PF_LOCAL_NAME:
-    case BTM_BLE_META_PF_MANU_DATA:
-    case BTM_BLE_META_PF_SRVC_DATA:
-      cond_type = btm_ble_ocf_to_condtype(ocf);
-      BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback Recd: %d, %d, %d, %d, %d, %d",
-                      op_subcode, ocf, action, status, ref_value, num_avail);
-      if (HCI_SUCCESS == status) {
-        if (memcmp(&btm_ble_adv_filt_cb.cur_filter_target.bda, &na_bda,
-                   BD_ADDR_LEN) == 0)
-          btm_ble_cs_update_pf_counter(action, cond_type, NULL, num_avail);
-        else
-          btm_ble_cs_update_pf_counter(action, cond_type,
-                                       &btm_ble_adv_filt_cb.cur_filter_target,
-                                       num_avail);
-      }
-
-      /* send ADV PF operation complete */
-      btm_ble_adv_filt_cb.op_type = 0;
-      break;
-
-    case BTM_BLE_META_PF_FEAT_SEL:
-      BTM_TRACE_DEBUG(
-          "btm_ble_scan_pf_cmpl_cback-Feat sel event: %d, %d, %d, %d", action,
-          status, ref_value, num_avail);
-      break;
-
-    default:
-      BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback: unknown operation: %d",
-                      op_subcode);
-      break;
+  uint8_t cond_type = btm_ble_ocf_to_condtype(expected_ocf);
+  BTM_TRACE_DEBUG("%s: Recd: %d, %d, %d, %d, %d", __func__, op_subcode,
+                  expected_ocf, action, status, num_avail);
+  if (HCI_SUCCESS == status) {
+    if (memcmp(&btm_ble_adv_filt_cb.cur_filter_target.bda, &na_bda,
+               BD_ADDR_LEN) == 0)
+      btm_ble_cs_update_pf_counter(action, cond_type, NULL, num_avail);
+    else
+      btm_ble_cs_update_pf_counter(
+          action, cond_type, &btm_ble_adv_filt_cb.cur_filter_target, num_avail);
   }
 
-  switch (cb_evt) {
-    BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback: calling the cback: %d",
-                    cb_evt);
-    case BTM_BLE_FILT_CFG:
-      if (NULL != p_scan_cfg_cback)
-        p_scan_cfg_cback(action, cond_type, num_avail, status, ref_value);
-      break;
-    case BTM_BLE_FILT_ADV_PARAM:
-      if (NULL != p_filt_param_cback)
-        p_filt_param_cback(action, num_avail, ref_value, status);
-      break;
-    default:
-      break;
-  }
+  /* send ADV PF operation complete */
+  btm_ble_adv_filt_cb.op_type = 0;
+
+  cb.Run(num_avail, action, status);
 }
 
 /*******************************************************************************
@@ -465,7 +323,8 @@ bool btm_ble_dealloc_addr_filter_counter(tBLE_BD_ADDR* p_bd_addr,
  ******************************************************************************/
 tBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action,
                                          tBTM_BLE_PF_FILT_INDEX filt_index,
-                                         tBTM_BLE_PF_COND_PARAM* p_cond) {
+                                         tBTM_BLE_PF_COND_PARAM* p_cond,
+                                         tBTM_BLE_PF_CFG_CBACK cb) {
   tBTM_BLE_PF_LOCAL_NAME_COND* p_local_name =
       (p_cond == NULL) ? NULL : &p_cond->local_name;
   uint8_t param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
@@ -491,8 +350,10 @@ tBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action,
   }
 
   /* send local name filter */
-  BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF, len, param,
-                            btm_ble_scan_pf_cmpl_cback);
+  btu_hcif_send_cmd_with_cb(
+      FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, len,
+      base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_LOCAL_NAME, cb));
+
   memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
   return BTM_CMD_STARTED;
 }
@@ -507,7 +368,8 @@ tBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action,
  * Returns          BTM_SUCCESS if sucessful,
  *                  BTM_ILLEGAL_VALUE if paramter is not valid.
  *
- ******************************************************************************/
+4
+******************************************************************************/
 tBTM_STATUS btm_ble_update_srvc_data_change(tBTM_BLE_SCAN_COND_OP action,
                                             tBTM_BLE_PF_FILT_INDEX filt_index,
                                             tBTM_BLE_PF_COND_PARAM* p_cond) {
@@ -538,23 +400,20 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
                                         tBTM_BLE_PF_FILT_INDEX filt_index,
                                         tBTM_BLE_PF_COND_PARAM* p_data,
                                         tBTM_BLE_PF_COND_TYPE cond_type,
-                                        tBTM_BLE_FILT_CB_EVT cb_evt,
-                                        tBTM_BLE_REF_VALUE ref_value) {
-  tBTM_BLE_PF_MANU_COND* p_manu_data =
-      (p_data == NULL) ? NULL : &p_data->manu_data;
-  tBTM_BLE_PF_SRVC_PATTERN_COND* p_srvc_data =
-      (p_data == NULL) ? NULL : &p_data->srvc_data;
-
-  uint8_t param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX +
-                BTM_BLE_ADV_FILT_META_HDR_LENGTH],
-      *p = param, len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
-  tBTM_STATUS st = BTM_ILLEGAL_VALUE;
+                                        tBTM_BLE_PF_CFG_CBACK cb) {
+  if (!p_data) return BTM_ILLEGAL_VALUE;
 
-  if (NULL == p_data) return st;
+  tBTM_BLE_PF_MANU_COND* p_manu_data = &p_data->manu_data;
+  tBTM_BLE_PF_SRVC_PATTERN_COND* p_srvc_data = &p_data->srvc_data;
 
-  memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX +
-                       BTM_BLE_ADV_FILT_META_HDR_LENGTH);
+  int param_len = BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX +
+                  BTM_BLE_ADV_FILT_META_HDR_LENGTH;
+  uint8_t len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
 
+  uint8_t param[param_len];
+  memset(param, 0, param_len);
+
+  uint8_t* p = param;
   if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type) {
     UINT8_TO_STREAM(p, BTM_BLE_META_PF_SRVC_DATA);
   } else {
@@ -562,13 +421,11 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
   }
 
   UINT8_TO_STREAM(p, action);
-
-  /* Filter index */
   UINT8_TO_STREAM(p, filt_index);
 
   if (BTM_BLE_SCAN_COND_ADD == action || BTM_BLE_SCAN_COND_DELETE == action) {
     if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type) {
-      if (NULL == p_srvc_data) return st;
+      if (NULL == p_srvc_data) return BTM_ILLEGAL_VALUE;
       if (p_srvc_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2))
         p_srvc_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2);
 
@@ -582,11 +439,10 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
       BTM_TRACE_DEBUG("Service data length: %d", len);
     } else {
       if (NULL == p_manu_data) {
-        BTM_TRACE_ERROR("btm_ble_update_pf_manu_data - No manuf data");
-        return st;
+        BTM_TRACE_ERROR("%s: No manuf data", __func__);
+        return BTM_ILLEGAL_VALUE;
       }
-      BTM_TRACE_EVENT("btm_ble_update_pf_manu_data length: %d",
-                      p_manu_data->data_len);
+      BTM_TRACE_EVENT("%s: length: %d", __func__, p_manu_data->data_len);
       if (p_manu_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2))
         p_manu_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2);
 
@@ -614,9 +470,10 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
     }
   }
 
-  /* send manufacturer*/
-  BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF, len, param,
-                            btm_ble_scan_pf_cmpl_cback);
+  uint8_t expected_ocf = btm_ble_condtype_to_ocf(cond_type);
+  btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, len,
+                            base::Bind(&btm_flt_update_cb, expected_ocf, cb));
+
   memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
   return BTM_CMD_STARTED;
 }
@@ -698,12 +555,13 @@ uint8_t btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
  ******************************************************************************/
 tBTM_STATUS btm_ble_update_addr_filter(tBTM_BLE_SCAN_COND_OP action,
                                        tBTM_BLE_PF_FILT_INDEX filt_index,
-                                       tBTM_BLE_PF_COND_PARAM* p_cond) {
-  uint8_t param[BTM_BLE_META_ADDR_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
-      *p = param;
+                                       tBTM_BLE_PF_COND_PARAM* p_cond,
+                                       tBTM_BLE_PF_CFG_CBACK cb) {
+  const uint8_t len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN;
+  uint8_t param[len], *p = param;
   tBLE_BD_ADDR* p_addr = (p_cond == NULL) ? NULL : &p_cond->target_addr;
 
-  memset(param, 0, BTM_BLE_META_ADDR_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH);
+  memset(param, 0, len);
 
   UINT8_TO_STREAM(p, BTM_BLE_META_PF_ADDR);
   UINT8_TO_STREAM(p, action);
@@ -717,11 +575,12 @@ tBTM_STATUS btm_ble_update_addr_filter(tBTM_BLE_SCAN_COND_OP action,
     BDADDR_TO_STREAM(p, p_addr->bda);
     UINT8_TO_STREAM(p, p_addr->type);
   }
+
   /* send address filter */
-  BTM_VendorSpecificCommand(
-      HCI_BLE_ADV_FILTER_OCF,
-      (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN),
-      param, btm_ble_scan_pf_cmpl_cback);
+  btu_hcif_send_cmd_with_cb(
+      FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, len,
+      base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_ADDR, cb));
+
   memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
   return BTM_CMD_STARTED;
 }
@@ -742,8 +601,7 @@ tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action,
                                        tBTM_BLE_PF_FILT_INDEX filt_index,
                                        tBTM_BLE_PF_COND_TYPE filter_type,
                                        tBTM_BLE_PF_COND_PARAM* p_cond,
-                                       tBTM_BLE_FILT_CB_EVT cb_evt,
-                                       tBTM_BLE_REF_VALUE ref_value) {
+                                       tBTM_BLE_PF_CFG_CBACK cb) {
   uint8_t param[BTM_BLE_META_UUID_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
       *p = param, len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
   tBTM_BLE_PF_UUID_COND* p_uuid_cond;
@@ -778,13 +636,12 @@ tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action,
     BDADDR_TO_STREAM(p, p_uuid_cond->p_target_addr->bda);
     UINT8_TO_STREAM(p, p_uuid_cond->p_target_addr->type);
 
+    tBTM_BLE_PF_CFG_CBACK fDoNothing;
     /* send address filter */
-    BTM_VendorSpecificCommand(
-        HCI_BLE_ADV_FILTER_OCF,
+    btu_hcif_send_cmd_with_cb(
+        FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param,
         (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN),
-        param, btm_ble_scan_pf_cmpl_cback);
-    btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_ADDR, cb_evt, ref_value,
-                             NULL, NULL);
+        base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_ADDR, fDoNothing));
     BTM_TRACE_DEBUG("Updated Address filter");
   }
 
@@ -829,13 +686,14 @@ tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action,
       memset(p, 0xff, p_uuid_cond->uuid.len);
       len += p_uuid_cond->uuid.len;
     }
-    BTM_TRACE_DEBUG("btm_ble_update_uuid_filter : %d, %d, %d, %d", filter_type,
-                    evt_type, p_uuid_cond->uuid.len, len);
+    BTM_TRACE_DEBUG("%s : %d, %d, %d, %d", __func__, filter_type, evt_type,
+                    p_uuid_cond->uuid.len, len);
   }
 
   /* send UUID filter update */
-  BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF, len, param,
-                            btm_ble_scan_pf_cmpl_cback);
+  btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, len,
+                            base::Bind(&btm_flt_update_cb, evt_type, cb));
+
   if (p_uuid_cond && p_uuid_cond->p_target_addr)
     memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_uuid_cond->p_target_addr,
            sizeof(tBLE_BD_ADDR));
@@ -860,12 +718,9 @@ tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action,
 tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action,
                                          tBTM_BLE_PF_FILT_INDEX filt_index,
                                          tBTM_BLE_PF_COND_PARAM* p_cond,
-                                         tBTM_BLE_PF_CFG_CBACK* p_cmpl_cback,
-                                         tBTM_BLE_FILT_CB_EVT cb_evt,
-                                         tBTM_BLE_REF_VALUE ref_value) {
+                                         tBTM_BLE_PF_CFG_CBACK cb) {
   tBLE_BD_ADDR* p_target = (p_cond == NULL) ? NULL : &p_cond->target_addr;
   tBTM_BLE_PF_COUNT* p_bda_filter;
-  tBTM_STATUS st = BTM_WRONG_MODE;
   uint8_t param[20], *p;
 
   if (BTM_BLE_SCAN_COND_CLEAR != action) {
@@ -884,51 +739,34 @@ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action,
       (p_target != NULL && p_bda_filter)) {
     BTM_TRACE_ERROR(
         "Error: Can not clear filter, No PF filter has been configured!");
-    return st;
+    return BTM_WRONG_MODE;
   }
 
+  tBTM_BLE_PF_CFG_CBACK fDoNothing;
+
   /* clear the general filter entry */
   if (NULL == p_target) {
     /* clear manufactuer data filter */
-    st = btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL,
-                                     BTM_BLE_PF_MANU_DATA, cb_evt, ref_value);
-    if (BTM_CMD_STARTED == st)
-      btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_MANU_DATA, cb_evt,
-                               ref_value, NULL, NULL);
+    btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL,
+                                BTM_BLE_PF_MANU_DATA, fDoNothing);
 
     /* clear local name filter */
-    st =
-        btm_ble_update_pf_local_name(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL);
-    if (BTM_CMD_STARTED == st)
-      btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_LOCAL_NAME, cb_evt,
-                               ref_value, NULL, NULL);
+    btm_ble_update_pf_local_name(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL,
+                                 fDoNothing);
 
     /* update the counter for service data */
-    st = btm_ble_update_srvc_data_change(BTM_BLE_SCAN_COND_CLEAR, filt_index,
-                                         NULL);
+    btm_ble_update_srvc_data_change(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL);
 
     /* clear UUID filter */
-    st = btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index,
-                                    BTM_BLE_PF_SRVC_UUID, NULL, cb_evt,
-                                    ref_value);
-    if (BTM_CMD_STARTED == st)
-      btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_UUID, cb_evt, ref_value,
-                               NULL, NULL);
-
-    st = btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index,
-                                    BTM_BLE_PF_SRVC_SOL_UUID, NULL, cb_evt,
-                                    ref_value);
-    if (BTM_CMD_STARTED == st)
-      btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SOL_UUID, cb_evt,
-                               ref_value, NULL, NULL);
+    btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index,
+                               BTM_BLE_PF_SRVC_UUID, NULL, fDoNothing);
+
+    btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index,
+                               BTM_BLE_PF_SRVC_SOL_UUID, NULL, fDoNothing);
 
     /* clear service data filter */
-    st = btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL,
-                                     BTM_BLE_PF_SRVC_DATA_PATTERN, cb_evt,
-                                     ref_value);
-    if (BTM_CMD_STARTED == st)
-      btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SRVC_DATA, cb_evt,
-                               ref_value, NULL, NULL);
+    btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL,
+                                BTM_BLE_PF_SRVC_DATA_PATTERN, fDoNothing);
   }
 
   /* select feature based on control block settings */
@@ -943,10 +781,11 @@ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action,
   /* set logic condition as OR as default */
   UINT8_TO_STREAM(p, BTM_BLE_PF_LOGIC_OR);
 
-  BTM_VendorSpecificCommand(
-      HCI_BLE_ADV_FILTER_OCF,
+  btu_hcif_send_cmd_with_cb(
+      FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param,
       (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_PF_FEAT_SEL_LEN),
-      param, btm_ble_scan_pf_cmpl_cback);
+      base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_FEAT_SEL, cb));
+
   if (p_target)
     memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_target,
            sizeof(tBLE_BD_ADDR));
@@ -965,25 +804,21 @@ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action,
  * Parameters       action - Type of action to be performed
  *                       filt_index - Filter index
  *                       p_filt_params - Filter parameters
- *                       p_cmpl_back - Callback pointer
- *                       ref_value - reference value
- *
- * Returns          void
+ *                       cb - Callback
  *
  ******************************************************************************/
-tBTM_STATUS BTM_BleAdvFilterParamSetup(
+void BTM_BleAdvFilterParamSetup(
     int action, tBTM_BLE_PF_FILT_INDEX filt_index,
     std::unique_ptr<btgatt_filt_param_setup_t> p_filt_params,
-    tBTM_BLE_PF_PARAM_CBACK* p_cmpl_cback, tBTM_BLE_REF_VALUE ref_value) {
+    tBTM_BLE_PF_PARAM_CB cb) {
   tBTM_BLE_PF_COUNT* p_bda_filter = NULL;
   uint8_t len = BTM_BLE_ADV_FILT_META_HDR_LENGTH +
                 BTM_BLE_ADV_FILT_FEAT_SELN_LEN + BTM_BLE_ADV_FILT_TRACK_NUM;
   uint8_t param[len], *p;
 
   if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) {
-    if (p_cmpl_cback)
-      p_cmpl_cback(BTM_BLE_PF_ENABLE, 0, ref_value, 1 /* BTA_FAILURE */);
-    return BTM_WRONG_MODE;
+    cb.Run(0, BTM_BLE_PF_ENABLE, 1 /* BTA_FAILURE */);
+    return;
   }
 
   p = param;
@@ -994,9 +829,8 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(
     p_bda_filter = btm_ble_find_addr_filter_counter(nullptr);
     if (NULL == p_bda_filter) {
       BTM_TRACE_ERROR("BD Address not found!");
-      if (p_cmpl_cback)
-        p_cmpl_cback(BTM_BLE_PF_ENABLE, 0, ref_value, 1 /* BTA_FAILURE */);
-      return BTM_WRONG_MODE;
+      cb.Run(0, BTM_BLE_PF_ENABLE, 1 /* BTA_FAILURE */);
+      return;
     }
 
     BTM_TRACE_DEBUG("%s : Feat mask:%d", __func__, p_filt_params->feat_seln);
@@ -1038,11 +872,9 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(
       len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_ADV_FILT_FEAT_SELN_LEN +
             BTM_BLE_ADV_FILT_TRACK_NUM;
 
-    BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF, (uint8_t)len, param,
-                              btm_ble_scan_pf_cmpl_cback);
-    btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL,
-                             BTM_BLE_FILT_ADV_PARAM, ref_value, NULL,
-                             p_cmpl_cback);
+    btu_hcif_send_cmd_with_cb(
+        FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, len,
+        base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_FEAT_SEL, cb));
   } else if (BTM_BLE_SCAN_COND_DELETE == action) {
     /* select feature based on control block settings */
     UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
@@ -1050,12 +882,10 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(
     /* Filter index */
     UINT8_TO_STREAM(p, filt_index);
 
-    BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF,
-                              (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH),
-                              param, btm_ble_scan_pf_cmpl_cback);
-    btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL,
-                             BTM_BLE_FILT_ADV_PARAM, ref_value, NULL,
-                             p_cmpl_cback);
+    btu_hcif_send_cmd_with_cb(
+        FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param,
+        (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH),
+        base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_FEAT_SEL, cb));
   } else if (BTM_BLE_SCAN_COND_CLEAR == action) {
     /* Deallocate all filters here */
     btm_ble_dealloc_addr_filter_counter(NULL, BTM_BLE_PF_TYPE_ALL);
@@ -1064,14 +894,32 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(
     UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
     UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_CLEAR);
 
-    BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF,
-                              (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH - 1),
-                              param, btm_ble_scan_pf_cmpl_cback);
-    btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL,
-                             BTM_BLE_FILT_ADV_PARAM, ref_value, NULL,
-                             p_cmpl_cback);
+    btu_hcif_send_cmd_with_cb(
+        FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param,
+        (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH - 1),
+        base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_FEAT_SEL, cb));
   }
-  return BTM_CMD_STARTED;
+}
+
+void enable_cmpl_cback(tBTM_BLE_PF_STATUS_CBACK p_stat_cback, uint8_t* p,
+                       uint16_t evt_len) {
+  uint8_t status, op_subcode, action;
+
+  if (evt_len != 3) {
+    BTM_TRACE_ERROR("%s: APCF callback length = %d", __func__, evt_len);
+    return;
+  }
+
+  STREAM_TO_UINT8(status, p);
+  STREAM_TO_UINT8(op_subcode, p);
+  STREAM_TO_UINT8(action, p);
+
+  if (op_subcode != BTM_BLE_META_PF_ENABLE) {
+    BTM_TRACE_ERROR("%s :bad subcode: 0x%02x", __func__, op_subcode);
+    return;
+  }
+
+  p_stat_cback.Run(action, status);
 }
 
 /*******************************************************************************
@@ -1080,40 +928,27 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(
  *
  * Description      This function is called to enable / disable the APCF feature
  *
- * Parameters  enable the generic scan condition.
- *                  enable: enable or disable the filter condition
+ * Parameters       enable: enable or disable the filter condition
  *                  p_stat_cback - Status callback pointer
- *                  ref_value   - Ref value
- * Returns          void
  *
  ******************************************************************************/
-tBTM_STATUS BTM_BleEnableDisableFilterFeature(
-    uint8_t enable, tBTM_BLE_PF_STATUS_CBACK* p_stat_cback,
-    tBTM_BLE_REF_VALUE ref_value) {
-  uint8_t param[20], *p;
-  tBTM_STATUS st = BTM_WRONG_MODE;
-
+void BTM_BleEnableDisableFilterFeature(uint8_t enable,
+                                       tBTM_BLE_PF_STATUS_CBACK p_stat_cback) {
   if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) {
-    if (p_stat_cback)
-      p_stat_cback(BTM_BLE_PF_ENABLE, ref_value, 1 /* BTA_FAILURE */);
-    return st;
+    if (p_stat_cback) p_stat_cback.Run(BTM_BLE_PF_ENABLE, 1 /* BTA_FAILURE */);
+    return;
   }
 
-  p = param;
+  uint8_t param[20];
   memset(param, 0, 20);
 
-  /* enable the content filter in controller */
-  p = param;
+  uint8_t* p = param;
   UINT8_TO_STREAM(p, BTM_BLE_META_PF_ENABLE);
-  /* enable adv data payload filtering */
   UINT8_TO_STREAM(p, enable);
 
-  BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF, BTM_BLE_PCF_ENABLE_LEN,
-                            param, btm_ble_scan_pf_cmpl_cback);
-  btm_ble_adv_filt_cb.p_filt_stat_cback = p_stat_cback;
-  btm_ble_advfilt_enq_op_q(enable, BTM_BLE_META_PF_ENABLE,
-                           BTM_BLE_FILT_ENABLE_DISABLE, ref_value, NULL, NULL);
-  return BTM_CMD_STARTED;
+  btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param,
+                            BTM_BLE_PCF_ENABLE_LEN,
+                            base::Bind(&enable_cmpl_cback, p_stat_cback));
 }
 
 /*******************************************************************************
@@ -1127,89 +962,77 @@ tBTM_STATUS BTM_BleEnableDisableFilterFeature(
  *                  cond_type: filter condition type.
  *                  filt_index - Filter index
  *                  p_cond: filter condition parameter
- *                  p_cmpl_cback  - Config callback pointer
- *                  ref_value - Reference value
- *
- * Returns          void
+ *                  cb  - Config callback
  *
  ******************************************************************************/
-tBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
-                                      tBTM_BLE_PF_COND_TYPE cond_type,
-                                      tBTM_BLE_PF_FILT_INDEX filt_index,
-                                      tBTM_BLE_PF_COND_PARAM* p_cond,
-                                      tBTM_BLE_PF_CFG_CBACK* p_cmpl_cback,
-                                      tBTM_BLE_REF_VALUE ref_value) {
-  tBTM_STATUS st = BTM_ILLEGAL_VALUE;
+void BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
+                               tBTM_BLE_PF_COND_TYPE cond_type,
+                               tBTM_BLE_PF_FILT_INDEX filt_index,
+                               tBTM_BLE_PF_COND_PARAM* p_cond,
+                               tBTM_BLE_PF_CFG_CBACK cb) {
   BTM_TRACE_EVENT("%s action:%d, cond_type:%d, index:%d", __func__, action,
                   cond_type, filt_index);
 
   if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) {
-    if (p_cmpl_cback) {
-      p_cmpl_cback(BTM_BLE_PF_CONFIG, cond_type, 0, 1 /*BTA_FAILURE*/,
-                   ref_value);
-    }
-    return st;
+    cb.Run(0, BTM_BLE_PF_CONFIG, 1 /*BTA_FAILURE*/);
+    return;
   }
 
+  // uint8_t ocf = btm_ble_condtype_to_ocf(cond_type);
+  uint8_t st;
+
   switch (cond_type) {
     /* write service data filter */
     case BTM_BLE_PF_SRVC_DATA_PATTERN:
     /* write manufacturer data filter */
     case BTM_BLE_PF_MANU_DATA:
-      st = btm_ble_update_pf_manu_data(action, filt_index, p_cond, cond_type, 0,
-                                       ref_value);
+      st = btm_ble_update_pf_manu_data(action, filt_index, p_cond, cond_type,
+                                       cb);
       break;
 
     /* write local name filter */
     case BTM_BLE_PF_LOCAL_NAME:
-      st = btm_ble_update_pf_local_name(action, filt_index, p_cond);
+      st = btm_ble_update_pf_local_name(action, filt_index, p_cond, cb);
       break;
 
     /* filter on advertiser address */
     case BTM_BLE_PF_ADDR_FILTER:
-      st = btm_ble_update_addr_filter(action, filt_index, p_cond);
+      st = btm_ble_update_addr_filter(action, filt_index, p_cond, cb);
       break;
 
     /* filter on service/solicitated UUID */
     case BTM_BLE_PF_SRVC_UUID:
     case BTM_BLE_PF_SRVC_SOL_UUID:
-      st = btm_ble_update_uuid_filter(action, filt_index, cond_type, p_cond, 0,
-                                      ref_value);
+      st =
+          btm_ble_update_uuid_filter(action, filt_index, cond_type, p_cond, cb);
       break;
 
     case BTM_BLE_PF_SRVC_DATA:
       st = btm_ble_update_srvc_data_change(action, filt_index, p_cond);
+
+      // TODO(jpawlowski): btm_ble_update_srvc_data_change was not scheduling
+      // any operation, callback was never called in success case. Must
+      // investigeate more if this was bug, or just never used.
+      // cb.Run(0, BTM_BLE_PF_CONFIG, 0 /*BTA_SUCCESS */);
+      // equivalent of old:
+      // ocf = btm_ble_condtype_to_ocf(cond_type);
+      // btm_ble_advfilt_enq_op_q(action, ocf, BTM_BLE_FILT_CFG, ref_value,
+      //                          p_cmpl_cback, NULL);
       break;
 
     case BTM_BLE_PF_TYPE_ALL: /* only used to clear filter */
-      st = btm_ble_clear_scan_pf_filter(action, filt_index, p_cond,
-                                        p_cmpl_cback, 0, ref_value);
+      st = btm_ble_clear_scan_pf_filter(action, filt_index, p_cond, cb);
       break;
 
     default:
       BTM_TRACE_WARNING("condition type [%d] not supported currently.",
                         cond_type);
-      break;
+      return;
   }
 
   if (st != BTM_CMD_STARTED) {
-    if (p_cmpl_cback) {
-      p_cmpl_cback(BTM_BLE_PF_CONFIG, cond_type, 0, 1 /*BTA_FAILURE*/,
-                   ref_value);
-    }
-    return st;
+    cb.Run(0, BTM_BLE_PF_CONFIG, 1 /*BTA_FAILURE*/);
   }
-
-  if (cond_type == BTM_BLE_PF_TYPE_ALL) {
-    btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_CFG,
-                             ref_value, p_cmpl_cback, NULL);
-  } else {
-    uint8_t ocf = btm_ble_condtype_to_ocf(cond_type);
-    btm_ble_advfilt_enq_op_q(action, ocf, BTM_BLE_FILT_CFG, ref_value,
-                             p_cmpl_cback, NULL);
-  }
-
-  return st;
 }
 
 /*******************************************************************************
diff --git a/system/stack/include/btm_ble_api.h b/system/stack/include/btm_ble_api.h
index 2991337563aef719482b05caa66bc9d7ffcb1d20..b117dee42c2c23aa32d633e7b1734395c9d5458f 100644
--- a/system/stack/include/btm_ble_api.h
+++ b/system/stack/include/btm_ble_api.h
@@ -822,17 +822,11 @@ extern uint8_t BTM_BleGetSupportedKeySize(BD_ADDR bd_addr);
  * Description      This function is called to setup the adv data payload filter
  *                  condition.
  *
- * Parameters       p_target: enabble the filter condition on a target device;
- *                            if NULL enable the generic scan condition.
- *                  enable: enable or disable the filter condition
- *
- * Returns          void
- *
  ******************************************************************************/
-extern tBTM_STATUS BTM_BleAdvFilterParamSetup(
+extern void BTM_BleAdvFilterParamSetup(
     int action, tBTM_BLE_PF_FILT_INDEX filt_index,
     std::unique_ptr<btgatt_filt_param_setup_t> p_filt_params,
-    tBTM_BLE_PF_PARAM_CBACK* p_cmpl_cback, tBTM_BLE_REF_VALUE ref_value);
+    tBTM_BLE_PF_PARAM_CB cb);
 
 /*******************************************************************************
  *
@@ -845,13 +839,12 @@ extern tBTM_STATUS BTM_BleAdvFilterParamSetup(
  *                  cond_type: filter condition type.
  *                  p_cond: filter condition paramter
  *
- * Returns          tBTM_STATUS
- *
  ******************************************************************************/
-extern tBTM_STATUS BTM_BleCfgFilterCondition(
-    tBTM_BLE_SCAN_COND_OP action, tBTM_BLE_PF_COND_TYPE cond_type,
-    tBTM_BLE_PF_FILT_INDEX filt_index, tBTM_BLE_PF_COND_PARAM* p_cond,
-    tBTM_BLE_PF_CFG_CBACK* p_cmpl_cback, tBTM_BLE_REF_VALUE ref_value);
+extern void BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
+                                      tBTM_BLE_PF_COND_TYPE cond_type,
+                                      tBTM_BLE_PF_FILT_INDEX filt_index,
+                                      tBTM_BLE_PF_COND_PARAM* p_cond,
+                                      tBTM_BLE_PF_CFG_CBACK cb);
 
 /*******************************************************************************
  *
@@ -860,14 +853,10 @@ extern tBTM_STATUS BTM_BleCfgFilterCondition(
  * Description      Enable or disable the APCF feature
  *
  * Parameters       enable - true - enables APCF, false - disables APCF
- *                       ref_value - Ref value
- *
- * Returns          tBTM_STATUS
  *
  ******************************************************************************/
-extern tBTM_STATUS BTM_BleEnableDisableFilterFeature(
-    uint8_t enable, tBTM_BLE_PF_STATUS_CBACK* p_stat_cback,
-    tBTM_BLE_REF_VALUE ref_value);
+extern void BTM_BleEnableDisableFilterFeature(
+    uint8_t enable, tBTM_BLE_PF_STATUS_CBACK p_stat_cback);
 
 /*******************************************************************************
  *
diff --git a/system/stack/include/btm_ble_api_types.h b/system/stack/include/btm_ble_api_types.h
index 004b4c4d127195ed4af996c007c49015319b0659..4b3fb77e218256de72ea4e0e48fc19d04bd57d17 100644
--- a/system/stack/include/btm_ble_api_types.h
+++ b/system/stack/include/btm_ble_api_types.h
@@ -19,6 +19,7 @@
 #ifndef BTM_BLE_API_TYPES_H
 #define BTM_BLE_API_TYPES_H
 
+#include <base/callback_forward.h>
 #include <hardware/bt_common_types.h>
 
 #define CHNL_MAP_LEN 5
@@ -471,32 +472,17 @@ enum {
 };
 typedef uint8_t tBTM_BLE_SCAN_COND_OP;
 
-enum {
-  BTM_BLE_FILT_ENABLE_DISABLE = 1,
-  BTM_BLE_FILT_CFG = 2,
-  BTM_BLE_FILT_ADV_PARAM = 3
-};
-
-typedef uint8_t tBTM_BLE_FILT_CB_EVT;
-
 /* BLE adv payload filtering config complete callback */
-typedef void(tBTM_BLE_PF_CFG_CBACK)(tBTM_BLE_PF_ACTION action,
-                                    tBTM_BLE_SCAN_COND_OP cfg_op,
-                                    tBTM_BLE_PF_AVBL_SPACE avbl_space,
-                                    tBTM_STATUS status,
-                                    tBTM_BLE_REF_VALUE ref_value);
-
-typedef void(tBTM_BLE_PF_CMPL_CBACK)(tBTM_BLE_PF_CFG_CBACK);
+using tBTM_BLE_PF_CFG_CBACK = base::Callback<void(
+    uint8_t /* avbl_space */, uint8_t /* action */, uint8_t /* status */)>;
 
 /* BLE adv payload filtering status setup complete callback */
-typedef void(tBTM_BLE_PF_STATUS_CBACK)(uint8_t action, tBTM_STATUS status,
-                                       tBTM_BLE_REF_VALUE ref_value);
+using tBTM_BLE_PF_STATUS_CBACK =
+    base::Callback<void(uint8_t /*action*/, tBTM_STATUS /* status */)>;
 
 /* BLE adv payload filtering param setup complete callback */
-typedef void(tBTM_BLE_PF_PARAM_CBACK)(tBTM_BLE_PF_ACTION action_type,
-                                      tBTM_BLE_PF_AVBL_SPACE avbl_space,
-                                      tBTM_BLE_REF_VALUE ref_value,
-                                      tBTM_STATUS status);
+using tBTM_BLE_PF_PARAM_CB = base::Callback<void(
+    uint8_t /* avbl_space */, uint8_t /* action */, uint8_t /* status */)>;
 
 typedef union {
   uint16_t uuid16_mask;
@@ -547,16 +533,6 @@ typedef union {
   uint8_t additional_data[2000];
 } tBTM_BLE_PF_COND_PARAM;
 
-typedef struct {
-  uint8_t action_ocf[BTM_BLE_PF_TYPE_MAX];
-  tBTM_BLE_REF_VALUE ref_value[BTM_BLE_PF_TYPE_MAX];
-  tBTM_BLE_PF_PARAM_CBACK* p_filt_param_cback[BTM_BLE_PF_TYPE_MAX];
-  tBTM_BLE_PF_CFG_CBACK* p_scan_cfg_cback[BTM_BLE_PF_TYPE_MAX];
-  uint8_t cb_evt[BTM_BLE_PF_TYPE_MAX];
-  uint8_t pending_idx;
-  uint8_t next_idx;
-} tBTM_BLE_ADV_FILTER_ADV_OPQ;
-
 /* per device filter + one generic filter indexed by 0 */
 #define BTM_BLE_MAX_FILTER_COUNTER (BTM_BLE_MAX_ADDR_FILTER + 1)
 
@@ -576,8 +552,6 @@ typedef struct {
   uint8_t op_type;
   tBTM_BLE_PF_COUNT* p_addr_filter_count; /* per BDA filter array */
   tBLE_BD_ADDR cur_filter_target;
-  tBTM_BLE_PF_STATUS_CBACK* p_filt_stat_cback;
-  tBTM_BLE_ADV_FILTER_ADV_OPQ op_q;
 } tBTM_BLE_ADV_FILTER_CB;
 
 /* Sub codes */