diff --git a/system/bta/include/bta_api.h b/system/bta/include/bta_api.h
index 7335609dae70c7227ecf930623dc7b7927b97e74..8ac26359c64c72609afabcc41d07488aa546c7b5 100644
--- a/system/bta/include/bta_api.h
+++ b/system/bta/include/bta_api.h
@@ -65,7 +65,11 @@ typedef enum : uint8_t {
 #define BTA_BIP_SERVICE_ID 13        /* Basic Imaging profile */
 #define BTA_A2DP_SINK_SERVICE_ID 18  /* A2DP Sink */
 #define BTA_HID_SERVICE_ID 20        /* HID */
+#define BTA_PBAP_SERVICE_ID 22       /* PhoneBook Access Server*/
 #define BTA_HFP_HS_SERVICE_ID 24     /* HSP HS role */
+#define BTA_MAP_SERVICE_ID 25        /* Message Access Profile */
+#define BTA_MN_SERVICE_ID 26         /* Message Notification Service */
+#define BTA_PCE_SERVICE_ID 28        /* PhoneBook Access Client */
 #define BTA_SDP_SERVICE_ID 29        /* SDP Search */
 #define BTA_HIDD_SERVICE_ID 30       /* HID Device */
 
diff --git a/system/btif/src/btif_dm.cc b/system/btif/src/btif_dm.cc
index 4f0097fe1939ccce1dfc9a4d173abdabba500e38..3fd506c3d7910cf5a1126194f188d56fc4abf317 100644
--- a/system/btif/src/btif_dm.cc
+++ b/system/btif/src/btif_dm.cc
@@ -307,6 +307,22 @@ bt_status_t btif_in_execute_service_request(tBTA_SERVICE_ID service_id,
     case BTA_HIDD_SERVICE_ID: {
       btif_hd_execute_service(b_enable);
     } break;
+    case BTA_PBAP_SERVICE_ID:
+      FALLTHROUGH_INTENDED; /* FALLTHROUGH */
+    case BTA_PCE_SERVICE_ID:
+      FALLTHROUGH_INTENDED; /* FALLTHROUGH */
+    case BTA_MAP_SERVICE_ID:
+      FALLTHROUGH_INTENDED; /* FALLTHROUGH */
+    case BTA_MN_SERVICE_ID: {
+      /**
+       * Do nothing; these services were started elsewhere. However, we need to flow through this
+       * codepath in order to properly report back the local UUIDs back to adapter properties in
+       * Java. To achieve this, we need to catch these service IDs in order for {@link
+       * btif_in_execute_service_request} to return {@code BT_STATUS_SUCCESS}, so that in {@link
+       * btif_dm_enable_service} the check passes and the UUIDs are allowed to be passed up into
+       * the Java layer.
+       */
+    } break;
     default:
       BTIF_TRACE_ERROR("%s: Unknown service %d being %s", __func__, service_id,
                        (b_enable) ? "enabled" : "disabled");
diff --git a/system/btif/src/btif_sdp_server.cc b/system/btif/src/btif_sdp_server.cc
index cab45200da6db43e1e1c15ea17b9a6310a75f0ba..ba166b60675cc4449c2f1f09ca593e41f59a0235 100644
--- a/system/btif/src/btif_sdp_server.cc
+++ b/system/btif/src/btif_sdp_server.cc
@@ -288,6 +288,38 @@ bt_status_t create_sdp_record(bluetooth_sdp_record* record,
 bt_status_t remove_sdp_record(int record_id) {
   int handle;
 
+  bluetooth_sdp_record* record;
+  bluetooth_sdp_types sdp_type = SDP_TYPE_RAW;
+  {
+    std::unique_lock<std::recursive_mutex> lock(sdp_lock);
+    record = sdp_slots[record_id].record_data;
+    if (record != NULL) {
+      sdp_type = record->hdr.type;
+    }
+  }
+  tBTA_SERVICE_ID service_id = -1;
+  switch (sdp_type) {
+    case SDP_TYPE_MAP_MAS:
+      service_id = BTA_MAP_SERVICE_ID;
+      break;
+    case SDP_TYPE_MAP_MNS:
+      service_id = BTA_MN_SERVICE_ID;
+      break;
+    case SDP_TYPE_PBAP_PSE:
+      service_id = BTA_PBAP_SERVICE_ID;
+      break;
+    case SDP_TYPE_PBAP_PCE:
+      service_id = BTA_PCE_SERVICE_ID;
+      break;
+    default:
+      /* other enumeration values were not enabled in {@link on_create_record_event} */
+      break;
+  }
+  if (service_id > 0) {
+    // {@link btif_disable_service} sets the mask {@link btif_enabled_services}.
+    btif_disable_service(service_id);
+  }
+
   /* Get the Record handle, and free the slot */
   handle = free_sdp_slot(record_id);
   BTIF_TRACE_DEBUG("Sdp Server %s id=%d to handle=0x%08x", __func__, record_id,
@@ -317,6 +349,7 @@ void on_create_record_event(int id) {
    * */
   BTIF_TRACE_DEBUG("Sdp Server %s", __func__);
   const sdp_slot_t* sdp_slot = start_create_sdp(id);
+  tBTA_SERVICE_ID service_id = -1;
   /* In the case we are shutting down, sdp_slot is NULL */
   if (sdp_slot != NULL) {
     bluetooth_sdp_record* record = sdp_slot->record_data;
@@ -324,12 +357,15 @@ void on_create_record_event(int id) {
     switch (record->hdr.type) {
       case SDP_TYPE_MAP_MAS:
         handle = add_maps_sdp(&record->mas);
+        service_id = BTA_MAP_SERVICE_ID;
         break;
       case SDP_TYPE_MAP_MNS:
         handle = add_mapc_sdp(&record->mns);
+        service_id = BTA_MN_SERVICE_ID;
         break;
       case SDP_TYPE_PBAP_PSE:
         handle = add_pbaps_sdp(&record->pse);
+        service_id = BTA_PBAP_SERVICE_ID;
         break;
       case SDP_TYPE_OPP_SERVER:
         handle = add_opps_sdp(&record->ops);
@@ -339,6 +375,7 @@ void on_create_record_event(int id) {
         break;
       case SDP_TYPE_PBAP_PCE:
         handle = add_pbapc_sdp(&record->pce);
+        service_id = BTA_PCE_SERVICE_ID;
         break;
       default:
         BTIF_TRACE_DEBUG("Record type %d is not supported", record->hdr.type);
@@ -346,6 +383,18 @@ void on_create_record_event(int id) {
     }
     if (handle != -1) {
       set_sdp_handle(id, handle);
+      if (service_id > 0) {
+        /**
+         * {@link btif_enable_service} calls {@link btif_dm_enable_service}, which calls {@link
+         * btif_in_execute_service_request}.
+         *     - {@link btif_enable_service} sets the mask {@link btif_enabled_services}.
+         *     - {@link btif_dm_enable_service} invokes the java callback to return uuids based
+         *       on the enabled services mask.
+         *     - {@link btif_in_execute_service_request} gates the java callback in {@link
+         *       btif_dm_enable_service}.
+         */
+        btif_enable_service(service_id);
+      }
     }
   }
 }
diff --git a/system/btif/src/btif_storage.cc b/system/btif/src/btif_storage.cc
index 38640e235d9d070cdd827f23b6774a8425826696..af84a225b6938b488555aae22733b38ea9d1f641 100644
--- a/system/btif/src/btif_storage.cc
+++ b/system/btif/src/btif_storage.cc
@@ -698,11 +698,27 @@ bt_status_t btif_storage_get_adapter_property(bt_property_t* property) {
             *(p_uuid + num_uuids) = Uuid::From16Bit(UUID_SERVCLASS_AUDIO_SINK);
             num_uuids++;
           } break;
+          case BTA_PBAP_SERVICE_ID: {
+            *(p_uuid + num_uuids) = Uuid::From16Bit(UUID_SERVCLASS_PBAP_PSE);
+            num_uuids++;
+          } break;
           case BTA_HFP_HS_SERVICE_ID: {
             *(p_uuid + num_uuids) =
                 Uuid::From16Bit(UUID_SERVCLASS_HF_HANDSFREE);
             num_uuids++;
           } break;
+          case BTA_MAP_SERVICE_ID: {
+            *(p_uuid + num_uuids) = Uuid::From16Bit(UUID_SERVCLASS_MESSAGE_ACCESS);
+            num_uuids++;
+          } break;
+          case BTA_MN_SERVICE_ID: {
+            *(p_uuid + num_uuids) = Uuid::From16Bit(UUID_SERVCLASS_MESSAGE_NOTIFICATION);
+            num_uuids++;
+          } break;
+          case BTA_PCE_SERVICE_ID: {
+            *(p_uuid + num_uuids) = Uuid::From16Bit(UUID_SERVCLASS_PBAP_PCE);
+            num_uuids++;
+          } break;
         }
       }
     }