diff --git a/system/bta/dm/bta_dm_act.cc b/system/bta/dm/bta_dm_act.cc
index 818b2ea9f789002e53ccf0159e01233ed212c5a2..2bb694fba86204d2afeed4d97307fdfc83759c34 100644
--- a/system/bta/dm/bta_dm_act.cc
+++ b/system/bta/dm/bta_dm_act.cc
@@ -177,6 +177,15 @@ WaitForAllAclConnectionsToDrain::FromAlarmCallbackData(void* data) {
 static void bta_dm_delay_role_switch_cback(void* data);
 static void bta_dm_wait_for_acl_to_drain_cback(void* data);
 
+/** Initialises the BT device manager */
+void bta_dm_enable(tBTA_DM_SEC_CBACK* p_sec_cback,
+                   tBTA_DM_ACL_CBACK *p_acl_cback) {
+
+  if (p_acl_cback != NULL) bta_dm_acl_cb.p_acl_cback = p_acl_cback;
+
+  bta_dm_sec_enable(p_sec_cback);
+}
+
 /*******************************************************************************
  *
  * Function         bta_dm_init_cb
@@ -189,6 +198,7 @@ static void bta_dm_wait_for_acl_to_drain_cback(void* data);
  ******************************************************************************/
 static void bta_dm_init_cb(void) {
   bta_dm_cb = {};
+  bta_dm_acl_cb = {};
   bta_dm_cb.disable_timer = alarm_new("bta_dm.disable_timer");
   bta_dm_cb.switch_delay_timer = alarm_new("bta_dm.switch_delay_timer");
   for (size_t i = 0; i < BTA_DM_NUM_PM_TIMER; i++) {
@@ -221,6 +231,7 @@ static void bta_dm_deinit_cb(void) {
     }
   }
   bta_dm_cb = {};
+  bta_dm_acl_cb = {};
 }
 
 void BTA_dm_on_hw_off() {
@@ -239,16 +250,22 @@ void BTA_dm_on_hw_off() {
 
 void BTA_dm_on_hw_on() {
   DEV_CLASS dev_class;
-  tBTA_DM_SEC_CBACK* temp_cback;
+  tBTA_DM_SEC_CBACK* temp_sec_cback;
+  tBTA_DM_ACL_CBACK* temp_acl_cback;
+
   uint8_t key_mask = 0;
   tBTA_BLE_LOCAL_ID_KEYS id_key;
 
-  /* save security callback */
-  temp_cback = bta_dm_cb.p_sec_cback;
+  /* save callbacks */
+  temp_sec_cback = bta_dm_cb.p_sec_cback;
+  temp_acl_cback = bta_dm_acl_cb.p_acl_cback;
+
   /* make sure the control block is properly initialized */
   bta_dm_init_cb();
-  /* and retrieve the callback */
-  bta_dm_cb.p_sec_cback = temp_cback;
+  /* and restore the callbacks */
+  bta_dm_cb.p_sec_cback = temp_sec_cback;
+  bta_dm_acl_cb.p_acl_cback = temp_acl_cback;
+
 
   /* hw is ready, go on with BTA DM initialization */
   alarm_free(bta_dm_search_cb.search_timer);
@@ -299,8 +316,8 @@ void BTA_dm_on_hw_on() {
     BTM_BleReadControllerFeatures(bta_dm_ctrl_features_rd_cmpl_cback);
   } else {
     /* Set controller features even if vendor support is not included */
-    if (bta_dm_cb.p_sec_cback)
-      bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL);
+    if (bta_dm_acl_cb.p_acl_cback)
+      bta_dm_acl_cb.p_acl_cback(BTA_DM_LE_FEATURES_READ, NULL);
   }
 
   btm_ble_scanner_init();
@@ -473,7 +490,7 @@ void bta_dm_process_remove_device(const RawAddress& bd_addr) {
 
   if (bta_dm_cb.p_sec_cback) {
     tBTA_DM_SEC sec_event;
-    sec_event.link_down.bd_addr = bd_addr;
+    sec_event.dev_unpair.bd_addr = bd_addr;
     bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event);
   }
 }
@@ -743,14 +760,13 @@ void bta_dm_acl_up(const RawAddress& bd_addr, tBT_TRANSPORT transport,
     device->set_both_device_ssr_capable();
   }
 
-  if (bta_dm_cb.p_sec_cback) {
-    tBTA_DM_SEC conn;
-    memset(&conn, 0, sizeof(tBTA_DM_SEC));
+  if (bta_dm_acl_cb.p_acl_cback) {
+    tBTA_DM_ACL conn{};
     conn.link_up.bd_addr = bd_addr;
     conn.link_up.transport_link_type = transport;
     conn.link_up.acl_handle = acl_handle;
 
-    bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, &conn);
+    bta_dm_acl_cb.p_acl_cback(BTA_DM_LINK_UP_EVT, &conn);
     LOG_DEBUG("Executed security callback for new connection available");
   }
   bta_dm_adjust_roles(true);
@@ -764,12 +780,12 @@ void BTA_dm_acl_up(const RawAddress bd_addr, tBT_TRANSPORT transport,
 
 static void bta_dm_acl_up_failed(const RawAddress bd_addr,
                                  tBT_TRANSPORT transport, tHCI_STATUS status) {
-  if (bta_dm_cb.p_sec_cback) {
-    tBTA_DM_SEC conn = {};
+  if (bta_dm_acl_cb.p_acl_cback) {
+    tBTA_DM_ACL conn = {};
     conn.link_up_failed.bd_addr = bd_addr;
     conn.link_up_failed.transport_link_type = transport;
     conn.link_up_failed.status = status;
-    bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_FAILED_EVT, &conn);
+    bta_dm_acl_cb.p_acl_cback(BTA_DM_LINK_UP_FAILED_EVT, &conn);
   }
 }
 
@@ -849,14 +865,21 @@ static void bta_dm_acl_down(const RawAddress& bd_addr,
     bta_dm_process_remove_device_no_callback(bd_addr);
   }
 
-  if (bta_dm_cb.p_sec_cback) {
-    tBTA_DM_SEC conn;
-    memset(&conn, 0, sizeof(tBTA_DM_SEC));
+  if (bta_dm_acl_cb.p_acl_cback) {
+    tBTA_DM_ACL conn{};
     conn.link_down.bd_addr = bd_addr;
     conn.link_down.transport_link_type = transport;
 
-    bta_dm_cb.p_sec_cback(BTA_DM_LINK_DOWN_EVT, &conn);
-    if (issue_unpair_cb) bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn);
+    bta_dm_acl_cb.p_acl_cback(BTA_DM_LINK_DOWN_EVT, &conn);
+  }
+
+  // TODO: reorganize and factor out the following logic
+  if (issue_unpair_cb && bta_dm_cb.p_sec_cback) {
+    tBTA_DM_SEC conn{};
+    conn.dev_unpair.bd_addr = bd_addr;
+    conn.dev_unpair.transport_link_type = transport;
+
+    bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn);
   }
 
   bta_dm_adjust_roles(true);
@@ -1700,8 +1723,8 @@ void bta_dm_ble_reset_id(void) {
 static void bta_dm_ctrl_features_rd_cmpl_cback(tHCI_STATUS result) {
   APPL_TRACE_DEBUG("%s  status = %d ", __func__, result);
   if (result == HCI_SUCCESS) {
-    if (bta_dm_cb.p_sec_cback)
-      bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL);
+    if (bta_dm_acl_cb.p_acl_cback)
+      bta_dm_acl_cb.p_acl_cback(BTA_DM_LE_FEATURES_READ, NULL);
   } else {
     APPL_TRACE_ERROR("%s Ctrl BLE feature read failed: status :%d", __func__,
                      result);
diff --git a/system/bta/dm/bta_dm_int.h b/system/bta/dm/bta_dm_int.h
index fb439e1435394946390c4e3c4f531fba8a590db6..55283d933e63ffa70022fcb9042a239c30a7baae 100644
--- a/system/bta/dm/bta_dm_int.h
+++ b/system/bta/dm/bta_dm_int.h
@@ -346,6 +346,10 @@ extern tBTA_DM_CONNECTED_SRVCS bta_dm_conn_srvcs;
 
 #define BTA_DM_NUM_PM_TIMER 7
 
+typedef struct {
+  tBTA_DM_ACL_CBACK* p_acl_cback;
+} tBTA_DM_ACL_CB;
+
 /* DM control block */
 typedef struct {
   tBTA_DM_ACTIVE_LINK device_list;
@@ -516,12 +520,16 @@ extern const tBTA_DM_EIR_CONF* p_bta_dm_eir_cfg;
 /* DM control block */
 extern tBTA_DM_CB bta_dm_cb;
 
+/* DM control block for ACL management */
+extern tBTA_DM_ACL_CB bta_dm_acl_cb;
+
 /* DM search control block */
 extern tBTA_DM_SEARCH_CB bta_dm_search_cb;
 
 /* DI control block */
 extern tBTA_DM_DI_CB bta_dm_di_cb;
 
+void bta_dm_enable(tBTA_DM_SEC_CBACK*, tBTA_DM_ACL_CBACK*);
 void bta_dm_disable();
 void bta_dm_set_dev_name(const std::vector<uint8_t>&);
 void bta_dm_remove_device(const RawAddress& bd_addr);
diff --git a/system/bta/dm/bta_dm_main.cc b/system/bta/dm/bta_dm_main.cc
index a89cc930bf2a96c5b3a68400bbb49b7065fbb990..000b53a123da783e7f5b2f5f480fd3827237247d 100644
--- a/system/bta/dm/bta_dm_main.cc
+++ b/system/bta/dm/bta_dm_main.cc
@@ -35,6 +35,7 @@
 #include "stack/include/bt_hdr.h"
 #include "stack/include/bt_types.h"
 
+tBTA_DM_ACL_CB bta_dm_acl_cb;
 tBTA_DM_CB bta_dm_cb;
 tBTA_DM_DI_CB bta_dm_di_cb;
 
diff --git a/system/bta/dm/bta_dm_sec.cc b/system/bta/dm/bta_dm_sec.cc
index 9a4c6bd650f5293dbf6d8fdf20c8eea204f146c9..2ce01765da5141a4072c130b999e81faec4f203a 100644
--- a/system/bta/dm/bta_dm_sec.cc
+++ b/system/bta/dm/bta_dm_sec.cc
@@ -104,7 +104,7 @@ void btm_dm_sec_init() {
 }
 
 /** Initialises the BT device security manager */
-void bta_dm_enable(tBTA_DM_SEC_CBACK* p_sec_cback) {
+void bta_dm_sec_enable(tBTA_DM_SEC_CBACK* p_sec_cback) {
   /* make sure security callback is saved - if no callback, do not erase the
   previous one,
   it could be an error recovery mechanism */
diff --git a/system/bta/dm/bta_dm_sec.h b/system/bta/dm/bta_dm_sec.h
index 8b81745af58caadabd1818ddce0109336cd8fd35..0b2d72f68e0ca592e83eae505334bc1910ed882f 100644
--- a/system/bta/dm/bta_dm_sec.h
+++ b/system/bta/dm/bta_dm_sec.h
@@ -22,6 +22,8 @@
 #include "bta/include/bta_api.h"
 #include "osi/include/osi.h"  // UNUSED_ATTR
 
+void bta_dm_sec_enable(tBTA_DM_SEC_CBACK* p_sec_cback);
+
 void bta_dm_add_ble_device(const RawAddress& bd_addr, tBLE_ADDR_TYPE addr_type,
                            tBT_DEVICE_TYPE dev_type);
 void bta_dm_add_blekey(const RawAddress& bd_addr, tBTA_LE_KEY_VALUE blekey,
diff --git a/system/bta/include/bta_api.h b/system/bta/include/bta_api.h
index 9c6dda3d1049142b19fe6c1321754fc3daa669de..46c88835718fc4ca0af5bfa99c5e8be5f0de74ed 100644
--- a/system/bta/include/bta_api.h
+++ b/system/bta/include/bta_api.h
@@ -217,16 +217,20 @@ typedef struct {
 
 typedef uint8_t tBTA_DM_BLE_RSSI_ALERT_TYPE;
 
+typedef enum: uint8_t {
+  BTA_DM_LINK_UP_EVT = 5,          /* Connection UP event */
+  BTA_DM_LINK_DOWN_EVT = 6,        /* Connection DOWN event */
+  BTA_DM_LE_FEATURES_READ = 27,    /* Cotroller specific LE features are read */
+  BTA_DM_LINK_UP_FAILED_EVT = 34,    /* Create connection failed event */
+} tBTA_DM_ACL_EVT;
+
 typedef enum : uint8_t {
   /* Security Callback Events */
   BTA_DM_PIN_REQ_EVT = 2,          /* PIN request. */
   BTA_DM_AUTH_CMPL_EVT = 3,        /* Authentication complete indication. */
   BTA_DM_AUTHORIZE_EVT = 4,        /* Authorization request. */
-  BTA_DM_LINK_UP_EVT = 5,          /* Connection UP event */
-  BTA_DM_LINK_DOWN_EVT = 6,        /* Connection DOWN event */
   BTA_DM_BOND_CANCEL_CMPL_EVT = 9, /* Bond cancel complete indication */
-  BTA_DM_SP_CFM_REQ_EVT = 10,   /* Simple Pairing User Confirmation request. \
-                                 */
+  BTA_DM_SP_CFM_REQ_EVT = 10,   /* Simple Pairing User Confirmation request */
   BTA_DM_SP_KEY_NOTIF_EVT = 11, /* Simple Pairing Passkey Notification */
   BTA_DM_BLE_KEY_EVT = 15,      /* BLE SMP key event for peer device keys */
   BTA_DM_BLE_SEC_REQ_EVT = 16,  /* BLE SMP security request */
@@ -240,15 +244,12 @@ typedef enum : uint8_t {
       23, /* Simple Pairing Remote OOB Extended Data request. */
   BTA_DM_BLE_AUTH_CMPL_EVT = 24, /* BLE Auth complete */
   BTA_DM_DEV_UNPAIRED_EVT = 25,
-  BTA_DM_LE_FEATURES_READ = 27,    /* Cotroller specific LE features are read \
-                                    */
   BTA_DM_ENER_INFO_READ = 28,      /* Energy info read */
   BTA_DM_BLE_SC_OOB_REQ_EVT = 29,  /* SMP SC OOB request event */
   BTA_DM_BLE_CONSENT_REQ_EVT = 30, /* SMP consent request event */
   BTA_DM_BLE_SC_CR_LOC_OOB_EVT = 31, /* SMP SC Create Local OOB request event */
   BTA_DM_REPORT_BONDING_EVT = 32,    /*handle for pin or key missing*/
   BTA_DM_LE_ADDR_ASSOC_EVT = 33,     /* identity address association event */
-  BTA_DM_LINK_UP_FAILED_EVT = 34,    /* Create connection failed event */
   BTA_DM_SIRK_VERIFICATION_REQ_EVT = 35,
 } tBTA_DM_SEC_EVT;
 
@@ -354,6 +355,12 @@ typedef struct {
   tHCI_STATUS status;
 } tBTA_DM_LINK_DOWN;
 
+/* Structure associated with BTA_DM_DEV_UNPAIRED_EVT */
+typedef struct {
+  RawAddress bd_addr; /* BD address peer device. */
+  tBT_TRANSPORT transport_link_type;
+} tBTA_DM_UNPAIR;
+
 #define BTA_AUTH_SP_YES                                                       \
   BTM_AUTH_SP_YES /* 1 MITM Protection Required - Single Profile/non-bonding  \
                     Use IO Capabilities to determine authentication procedure \
@@ -424,13 +431,19 @@ typedef struct {
   RawAddress id_addr;
 } tBTA_DM_PROC_ID_ADDR;
 
-/* Union of all security callback structures */
 typedef union {
-  tBTA_DM_PIN_REQ pin_req;        /* PIN request. */
-  tBTA_DM_AUTH_CMPL auth_cmpl;    /* Authentication complete indication. */
   tBTA_DM_LINK_UP link_up;        /* ACL connection up event */
   tBTA_DM_LINK_UP_FAILED link_up_failed; /* ACL connection up failure event */
   tBTA_DM_LINK_DOWN link_down;    /* ACL connection down event */
+} tBTA_DM_ACL;
+
+typedef void(tBTA_DM_ACL_CBACK)(tBTA_DM_ACL_EVT event, tBTA_DM_ACL* p_data);
+
+/* Union of all security callback structures */
+typedef union {
+  tBTA_DM_PIN_REQ pin_req;        /* PIN request. */
+  tBTA_DM_AUTH_CMPL auth_cmpl;    /* Authentication complete indication. */
+  tBTA_DM_UNPAIR dev_unpair;      /* Remove bonding complete indication */
   tBTA_DM_SP_CFM_REQ cfm_req;     /* user confirm request */
   tBTA_DM_SP_KEY_NOTIF key_notif; /* passkey notification */
   tBTA_DM_SP_RMT_OOB rmt_oob;     /* remote oob */
diff --git a/system/bta/test/bta_sec_test.cc b/system/bta/test/bta_sec_test.cc
index 63dedd8c58c4152a78a4368aefd4d87ca6494f3a..d80a7b5451431e6f80e39b90abbc8caf32799d27 100644
--- a/system/bta/test/bta_sec_test.cc
+++ b/system/bta/test/bta_sec_test.cc
@@ -64,7 +64,7 @@ TEST_F(BtaSecTest, bta_dm_sp_cback__BTM_SP_CFM_REQ_EVT_WithName) {
          tBT_TRANSPORT transport) -> tBTM_STATUS { return BTM_CMD_STARTED; };
 
   static tBTA_DM_SP_CFM_REQ cfm_req{};
-  bta_dm_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
+  bta_dm_sec_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
     callback_sent = true;
     cfm_req = p_data->cfm_req;
   });
@@ -115,7 +115,7 @@ TEST_F(BtaSecTest, bta_dm_sp_cback__BTM_SP_CFM_REQ_EVT_WithoutName_RNRSuccess) {
          tBT_TRANSPORT transport) -> tBTM_STATUS { return BTM_CMD_STARTED; };
 
   static tBTA_DM_SP_CFM_REQ cfm_req{};
-  bta_dm_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
+  bta_dm_sec_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
     callback_sent = true;
     cfm_req = p_data->cfm_req;
   });
@@ -156,7 +156,7 @@ TEST_F(BtaSecTest, bta_dm_sp_cback__BTM_SP_CFM_REQ_EVT_WithoutName_RNRFail) {
          tBT_TRANSPORT transport) -> tBTM_STATUS { return BTM_SUCCESS; };
 
   static tBTA_DM_SP_CFM_REQ cfm_req{};
-  bta_dm_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
+  bta_dm_sec_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
     callback_sent = true;
     cfm_req = p_data->cfm_req;
   });
@@ -205,7 +205,7 @@ TEST_F(BtaSecTest, bta_dm_sp_cback__BTM_SP_KEY_NOTIF_EVT) {
          tBT_TRANSPORT transport) -> tBTM_STATUS { return BTM_CMD_STARTED; };
 
   static tBTA_DM_SP_KEY_NOTIF key_notif{};
-  bta_dm_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
+  bta_dm_sec_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
     callback_sent = true;
     key_notif = p_data->key_notif;
   });
diff --git a/system/btif/include/btif_dm.h b/system/btif/include/btif_dm.h
index 9b7f407276501add2f6524eb346cdd64f9afb90a..fa3691cc4778b12c10ab12072a4de46a63b54c71 100644
--- a/system/btif/include/btif_dm.h
+++ b/system/btif/include/btif_dm.h
@@ -51,9 +51,14 @@ void btif_dm_init(uid_set_t* set);
 void btif_dm_cleanup(void);
 
 /**
- * BTIF callback to switch context from bte to btif
+ * BTIF callback for security events
  */
-void bte_dm_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data);
+void btif_dm_sec_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data);
+
+/**
+ * BTIF callback for ACL up/down and address consolidation events
+ */
+void btif_dm_acl_evt(tBTA_DM_ACL_EVT event, tBTA_DM_ACL* p_data);
 
 /**
  * Notify BT disable being initiated. DM may chose to abort
diff --git a/system/btif/src/btif_dm.cc b/system/btif/src/btif_dm.cc
index a4d481d3bb7cd91e6bb7cf4087ab1e32edca2525..41ea8f8a41d00c08051092d616c9636c1dd1fa2b 100644
--- a/system/btif/src/btif_dm.cc
+++ b/system/btif/src/btif_dm.cc
@@ -2168,15 +2168,14 @@ void BTIF_dm_disable() {
 
 /*******************************************************************************
  *
- * Function         btif_dm_upstreams_cback
+ * Function         btif_dm_sec_evt
  *
- * Description      Executes UPSTREAMS events in btif context
+ * Description      Executes security related events
  *
  * Returns          void
  *
  ******************************************************************************/
-static void btif_dm_upstreams_evt(uint16_t event, char* p_param) {
-  tBTA_DM_SEC* p_data = (tBTA_DM_SEC*)p_param;
+void btif_dm_sec_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
   RawAddress bd_addr;
 
   BTIF_TRACE_EVENT("%s: ev: %s", __func__, dump_dm_event(event));
@@ -2208,8 +2207,8 @@ static void btif_dm_upstreams_evt(uint16_t event, char* p_param) {
       break;
 
     case BTA_DM_DEV_UNPAIRED_EVT:
-      bd_addr = p_data->link_down.bd_addr;
-      btm_set_bond_type_dev(p_data->link_down.bd_addr,
+      bd_addr = p_data->dev_unpair.bd_addr;
+      btm_set_bond_type_dev(p_data->dev_unpair.bd_addr,
                             tBTM_SEC_DEV_REC::BOND_TYPE_UNKNOWN);
 
       GetInterfaceToProfiles()->removeDeviceFromProfiles(bd_addr);
@@ -2217,67 +2216,6 @@ static void btif_dm_upstreams_evt(uint16_t event, char* p_param) {
       bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_NONE);
       break;
 
-    case BTA_DM_LINK_UP_EVT:
-      bd_addr = p_data->link_up.bd_addr;
-      BTIF_TRACE_DEBUG("BTA_DM_LINK_UP_EVT. Sending BT_ACL_STATE_CONNECTED");
-
-      btif_update_remote_version_property(&bd_addr);
-
-      GetInterfaceToProfiles()->events->invoke_acl_state_changed_cb(
-          BT_STATUS_SUCCESS, bd_addr, BT_ACL_STATE_CONNECTED,
-          (int)p_data->link_up.transport_link_type, HCI_SUCCESS,
-          btm_is_acl_locally_initiated()
-              ? bt_conn_direction_t::BT_CONN_DIRECTION_OUTGOING
-              : bt_conn_direction_t::BT_CONN_DIRECTION_INCOMING,
-          p_data->link_up.acl_handle);
-      break;
-
-    case BTA_DM_LINK_UP_FAILED_EVT:
-      GetInterfaceToProfiles()->events->invoke_acl_state_changed_cb(
-          BT_STATUS_FAIL, p_data->link_up_failed.bd_addr,
-          BT_ACL_STATE_DISCONNECTED, p_data->link_up_failed.transport_link_type,
-          p_data->link_up_failed.status,
-          btm_is_acl_locally_initiated()
-              ? bt_conn_direction_t::BT_CONN_DIRECTION_OUTGOING
-              : bt_conn_direction_t::BT_CONN_DIRECTION_INCOMING,
-          INVALID_ACL_HANDLE);
-      break;
-
-    case BTA_DM_LINK_DOWN_EVT: {
-      bd_addr = p_data->link_down.bd_addr;
-      btm_set_bond_type_dev(p_data->link_down.bd_addr,
-                            tBTM_SEC_DEV_REC::BOND_TYPE_UNKNOWN);
-      GetInterfaceToProfiles()->onLinkDown(bd_addr);
-
-      bt_conn_direction_t direction;
-      switch (btm_get_acl_disc_reason_code()) {
-        case HCI_ERR_PEER_USER:
-        case HCI_ERR_REMOTE_LOW_RESOURCE:
-        case HCI_ERR_REMOTE_POWER_OFF:
-          direction = bt_conn_direction_t::BT_CONN_DIRECTION_INCOMING;
-          break;
-        case HCI_ERR_CONN_CAUSE_LOCAL_HOST:
-        case HCI_ERR_HOST_REJECT_SECURITY:
-          direction = bt_conn_direction_t::BT_CONN_DIRECTION_OUTGOING;
-          break;
-        default:
-          direction = bt_conn_direction_t::BT_CONN_DIRECTION_UNKNOWN;
-      }
-
-      GetInterfaceToProfiles()->events->invoke_acl_state_changed_cb(
-          BT_STATUS_SUCCESS, bd_addr, BT_ACL_STATE_DISCONNECTED,
-          (int)p_data->link_down.transport_link_type,
-          static_cast<bt_hci_error_code_t>(btm_get_acl_disc_reason_code()),
-          direction, INVALID_ACL_HANDLE);
-      LOG_DEBUG(
-          "Sent BT_ACL_STATE_DISCONNECTED upward as ACL link down event "
-          "device:%s reason:%s",
-          ADDRESS_TO_LOGGABLE_CSTR(bd_addr),
-          hci_reason_code_text(
-              static_cast<tHCI_REASON>(btm_get_acl_disc_reason_code()))
-              .c_str());
-    } break;
-
     case BTA_DM_BLE_KEY_EVT:
       BTIF_TRACE_DEBUG("BTA_DM_BLE_KEY_EVT key_type=0x%02x ",
                        p_data->ble_key.key_type);
@@ -2402,10 +2340,6 @@ static void btif_dm_upstreams_evt(uint16_t event, char* p_param) {
       btif_dm_ble_auth_cmpl_evt(&p_data->auth_cmpl);
       break;
 
-    case BTA_DM_LE_FEATURES_READ:
-      btif_get_adapter_property(BT_PROPERTY_LOCAL_LE_FEATURES);
-      break;
-
     case BTA_DM_LE_ADDR_ASSOC_EVT:
       GetInterfaceToProfiles()->events->invoke_le_address_associate_cb(
           p_data->proc_id_addr.pairing_bda, p_data->proc_id_addr.id_addr);
@@ -2424,16 +2358,86 @@ static void btif_dm_upstreams_evt(uint16_t event, char* p_param) {
 
 /*******************************************************************************
  *
- * Function         bte_dm_evt
+ * Function         bte_dm_acl_evt
  *
- * Description      Switches context from BTE to BTIF for all DM events
+ * Description      BTIF handler for ACL up/down, identity address report events
  *
  * Returns          void
  *
  ******************************************************************************/
+void btif_dm_acl_evt(tBTA_DM_ACL_EVT event, tBTA_DM_ACL* p_data) {
+  RawAddress bd_addr;
 
-void bte_dm_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
-  btif_dm_upstreams_evt(event, (char*)p_data);
+  switch (event) {
+    case BTA_DM_LINK_UP_EVT:
+      bd_addr = p_data->link_up.bd_addr;
+      BTIF_TRACE_DEBUG("BTA_DM_LINK_UP_EVT. Sending BT_ACL_STATE_CONNECTED");
+
+      btif_update_remote_version_property(&bd_addr);
+
+      GetInterfaceToProfiles()->events->invoke_acl_state_changed_cb(
+          BT_STATUS_SUCCESS, bd_addr, BT_ACL_STATE_CONNECTED,
+          (int)p_data->link_up.transport_link_type, HCI_SUCCESS,
+          btm_is_acl_locally_initiated()
+              ? bt_conn_direction_t::BT_CONN_DIRECTION_OUTGOING
+              : bt_conn_direction_t::BT_CONN_DIRECTION_INCOMING,
+          p_data->link_up.acl_handle);
+      break;
+
+    case BTA_DM_LINK_UP_FAILED_EVT:
+      GetInterfaceToProfiles()->events->invoke_acl_state_changed_cb(
+          BT_STATUS_FAIL, p_data->link_up_failed.bd_addr,
+          BT_ACL_STATE_DISCONNECTED, p_data->link_up_failed.transport_link_type,
+          p_data->link_up_failed.status,
+          btm_is_acl_locally_initiated()
+              ? bt_conn_direction_t::BT_CONN_DIRECTION_OUTGOING
+              : bt_conn_direction_t::BT_CONN_DIRECTION_INCOMING,
+          INVALID_ACL_HANDLE);
+      break;
+
+    case BTA_DM_LINK_DOWN_EVT: {
+      bd_addr = p_data->link_down.bd_addr;
+      btm_set_bond_type_dev(p_data->link_down.bd_addr,
+                            tBTM_SEC_DEV_REC::BOND_TYPE_UNKNOWN);
+      GetInterfaceToProfiles()->onLinkDown(bd_addr);
+
+      bt_conn_direction_t direction;
+      switch (btm_get_acl_disc_reason_code()) {
+        case HCI_ERR_PEER_USER:
+        case HCI_ERR_REMOTE_LOW_RESOURCE:
+        case HCI_ERR_REMOTE_POWER_OFF:
+          direction = bt_conn_direction_t::BT_CONN_DIRECTION_INCOMING;
+          break;
+        case HCI_ERR_CONN_CAUSE_LOCAL_HOST:
+        case HCI_ERR_HOST_REJECT_SECURITY:
+          direction = bt_conn_direction_t::BT_CONN_DIRECTION_OUTGOING;
+          break;
+        default:
+          direction = bt_conn_direction_t::BT_CONN_DIRECTION_UNKNOWN;
+      }
+      GetInterfaceToProfiles()->events->invoke_acl_state_changed_cb(
+          BT_STATUS_SUCCESS, bd_addr, BT_ACL_STATE_DISCONNECTED,
+          (int)p_data->link_down.transport_link_type,
+          static_cast<bt_hci_error_code_t>(btm_get_acl_disc_reason_code()),
+          direction, INVALID_ACL_HANDLE);
+      LOG_DEBUG(
+          "Sent BT_ACL_STATE_DISCONNECTED upward as ACL link down event "
+          "device:%s reason:%s",
+          ADDRESS_TO_LOGGABLE_CSTR(bd_addr),
+          hci_reason_code_text(
+              static_cast<tHCI_REASON>(btm_get_acl_disc_reason_code()))
+              .c_str());
+    } break;
+    case BTA_DM_LE_FEATURES_READ:
+      btif_get_adapter_property(BT_PROPERTY_LOCAL_LE_FEATURES);
+      break;
+
+
+  default: {
+      LOG_ERROR("Unexpected tBTA_DM_ACL_EVT: %d", event);
+    } break;
+
+  }
 }
 
 /*******************************************************************************
diff --git a/system/btif/src/stack_manager.cc b/system/btif/src/stack_manager.cc
index afaa52d6903461c4162ee2a76d183e25d481d474..d7c3f8d63be2b3cb49f0e4b96a600d3158e91ad8 100644
--- a/system/btif/src/stack_manager.cc
+++ b/system/btif/src/stack_manager.cc
@@ -332,7 +332,7 @@ static void event_start_up_stack(bluetooth::core::CoreInterface* interface,
 
   btif_init_ok();
   BTA_dm_init();
-  bta_dm_enable(bte_dm_evt);
+  bta_dm_enable(btif_dm_sec_evt, btif_dm_acl_evt);
 
   bta_set_forward_hw_failures(true);
   btm_acl_device_down();
diff --git a/system/test/mock/mock_btif_dm.cc b/system/test/mock/mock_btif_dm.cc
index 424e3ecefea6b9274a9ef9ca496b67ffd2c8da85..1ad58e9ebb820d35980fe2d4ca21302a34a1fb08 100644
--- a/system/test/mock/mock_btif_dm.cc
+++ b/system/test/mock/mock_btif_dm.cc
@@ -66,7 +66,7 @@ void BTIF_dm_on_hw_error() { inc_func_call_count(__func__); }
 void BTIF_dm_report_inquiry_status_change(uint8_t status) {
   inc_func_call_count(__func__);
 }
-void bte_dm_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
+void btif_dm_sec_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
   inc_func_call_count(__func__);
 }
 void btif_ble_receiver_test(uint8_t rx_freq) { inc_func_call_count(__func__); }