diff --git a/system/btcore/include/bdaddr.h b/system/btcore/include/bdaddr.h
index 3ef8b16eab31eeb8f3ab8192f3e921639083559d..b9a99ce0796aaa2a468823e8fefd60ccdba281dd 100644
--- a/system/btcore/include/bdaddr.h
+++ b/system/btcore/include/bdaddr.h
@@ -38,6 +38,10 @@ bool bdaddr_is_empty(const bt_bdaddr_t *addr);
 // may be NULL.
 bool bdaddr_equals(const bt_bdaddr_t *first, const bt_bdaddr_t *second);
 
+// Returns destination bdaddr |dest| after copying |src| to |dest|.
+// |dest| and |src| must not be NULL.
+bt_bdaddr_t *bdaddr_copy(bt_bdaddr_t *dest, const bt_bdaddr_t *src);
+
 // Makes a string representation of |addr| and places it into |string|. |size|
 // refers to the size of |string|'s buffer and must be >= 18. On success, this
 // function returns |string|, otherwise it returns NULL. Neither |addr| nor |string|
diff --git a/system/btcore/src/bdaddr.c b/system/btcore/src/bdaddr.c
index 8503c69768cb3850580b50949bd3f9398cec0ebf..f0f85ddf1c92b4b2a5d4f69bbd838681ba19ca65 100644
--- a/system/btcore/src/bdaddr.c
+++ b/system/btcore/src/bdaddr.c
@@ -37,6 +37,13 @@ bool bdaddr_equals(const bt_bdaddr_t *first, const bt_bdaddr_t *second) {
   return memcmp(first, second, sizeof(bt_bdaddr_t)) == 0;
 }
 
+bt_bdaddr_t *bdaddr_copy(bt_bdaddr_t *dest, const bt_bdaddr_t *src) {
+  assert(dest != NULL);
+  assert(src != NULL);
+
+  return (bt_bdaddr_t *)memcpy(dest, src, sizeof(bt_bdaddr_t));
+}
+
 const char *bdaddr_to_string(const bt_bdaddr_t *addr, char *string, size_t size) {
   assert(addr != NULL);
   assert(string != NULL);