diff --git a/Containerfile b/Containerfile
index 2c3fc19e..d9b49483 100644
--- a/Containerfile
+++ b/Containerfile
@@ -216,7 +216,7 @@ RUN rpm-ostree override replace \
         glibc32 \
         || true
 
-# Install Valve's patched Mesa & Pipewire
+# Install Valve's patched Mesa, Pipewire & Bluez
 # Install patched switcheroo control with proper discrete GPU support
 RUN rpm-ostree override remove \
         mesa-va-drivers-freeworld && \
@@ -231,6 +231,10 @@ RUN rpm-ostree override remove \
         mesa-libEGL \
         mesa-vulkan-drivers \
         mesa-libGL \
+        bluez \
+        bluez-cups \
+        bluez-libs \
+        bluez-obexd \
         pipewire \
         pipewire-alsa \
         pipewire-gstreamer \
@@ -704,15 +708,8 @@ RUN rpm-ostree install \
     mv -v /tmp/jupiter-dock-updater-bin/packaged/usr/lib/jupiter-dock-updater /usr/lib/jupiter-dock-updater && \
     rm -rf /tmp/jupiter-dock-updater-bin
 
-# Install Steam Deck patched Wireplumber, Bluez & UPower
+# Install Steam Deck patched Wireplumber & UPower
 RUN rpm-ostree override replace \
-    --experimental \
-    --from repo=copr:copr.fedorainfracloud.org:kylegospo:bazzite-multilib \
-        bluez \
-        bluez-cups \
-        bluez-libs \
-        bluez-obexd && \
-    rpm-ostree override replace \
     --experimental \
     --from repo=copr:copr.fedorainfracloud.org:kylegospo:bazzite \
         wireplumber \
diff --git a/spec_files/bluez/0001-device-Add-btd_device_bearer_is_connected.patch b/spec_files/bluez/0001-device-Add-btd_device_bearer_is_connected.patch
new file mode 100644
index 00000000..2a6c7453
--- /dev/null
+++ b/spec_files/bluez/0001-device-Add-btd_device_bearer_is_connected.patch
@@ -0,0 +1,67 @@
+From 036583f9bbec8540fbd85b980674aad4916d3093 Mon Sep 17 00:00:00 2001
+From: Dimitris <dimitris.on.linux@gmail.com>
+Date: Thu, 4 Apr 2024 11:30:50 -0700
+Subject: [PATCH] device: Add btd_device_bearer_is_connected
+
+This adds btd_device_bearer_is_connected and use it when testing if
+device needs to be disconnected.
+
+Fixes: https://github.com/bluez/bluez/issues/785
+---
+ src/adapter.c | 2 +-
+ src/device.c  | 7 ++++++-
+ src/device.h  | 1 +
+ 3 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/src/adapter.c b/src/adapter.c
+index 4bcc464de..017e60233 100644
+--- a/src/adapter.c
++++ b/src/adapter.c
+@@ -7486,7 +7486,7 @@ static void adapter_remove_connection(struct btd_adapter *adapter,
+ 		device_cancel_authentication(device, TRUE);
+ 
+ 	/* If another bearer is still connected */
+-	if (btd_device_is_connected(device))
++	if (btd_device_bearer_is_connected(device))
+ 		return;
+ 
+ 	adapter->connections = g_slist_remove(adapter->connections, device);
+diff --git a/src/device.c b/src/device.c
+index 5e74633c6..74dd67a09 100644
+--- a/src/device.c
++++ b/src/device.c
+@@ -3273,13 +3273,18 @@ uint8_t btd_device_get_bdaddr_type(struct btd_device *dev)
+ 
+ bool btd_device_is_connected(struct btd_device *dev)
+ {
+-	if (dev->bredr_state.connected || dev->le_state.connected)
++	if (btd_device_bearer_is_connected(dev))
+ 		return true;
+ 
+ 	return find_service_with_state(dev->services,
+ 						BTD_SERVICE_STATE_CONNECTED);
+ }
+ 
++bool btd_device_bearer_is_connected(struct btd_device *dev)
++{
++	return dev->bredr_state.connected || dev->le_state.connected;
++}
++
+ static void clear_temporary_timer(struct btd_device *dev)
+ {
+ 	if (dev->temporary_timer) {
+diff --git a/src/device.h b/src/device.h
+index d4e70b7ef..5722ca9ca 100644
+--- a/src/device.h
++++ b/src/device.h
+@@ -104,6 +104,7 @@ void device_set_rssi(struct btd_device *device, int8_t rssi);
+ void device_set_tx_power(struct btd_device *device, int8_t tx_power);
+ void device_set_flags(struct btd_device *device, uint8_t flags);
+ bool btd_device_is_connected(struct btd_device *dev);
++bool btd_device_bearer_is_connected(struct btd_device *dev);
+ uint8_t btd_device_get_bdaddr_type(struct btd_device *dev);
+ bool device_is_retrying(struct btd_device *device);
+ void device_bonding_complete(struct btd_device *device, uint8_t bdaddr_type,
+-- 
+2.44.0
+
diff --git a/spec_files/bluez/0006-shared-gatt-Prevent-security-level-change-for-PTS-GA.patch b/spec_files/bluez/0006-shared-gatt-Prevent-security-level-change-for-PTS-GA.patch
deleted file mode 100644
index f6bf33e6..00000000
--- a/spec_files/bluez/0006-shared-gatt-Prevent-security-level-change-for-PTS-GA.patch
+++ /dev/null
@@ -1,104 +0,0 @@
-From 805b1f5bf596d747f28f53191b7a28507efb7797 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Danis?= <frederic.danis@collabora.com>
-Date: Thu, 25 Jan 2024 20:08:01 +0100
-Subject: [PATCH BlueZ 1/5] shared/gatt: Prevent security level change for PTS
- GATT tests
-Content-Type: text/plain; charset="utf-8"
-Content-Transfer-Encoding: 8bit
-
-Some PTS GATT tests like GATT/CL/GAR/BI-04-C request to be able to get the
-security error and do not try to change the security level.
-
-This commit adds the ability to prevent to change the security level for
-an operation.
----
- src/shared/att.c         | 26 ++++++++++++++++++++++++++
- src/shared/att.h         |  1 +
- src/shared/gatt-client.c | 19 +++++++++++++++++++
- src/shared/gatt-client.h |  3 +++
- 4 files changed, 49 insertions(+)
-
-diff --git a/src/shared/att.c b/src/shared/att.c
-index 85feead77..64544f89b 100644
---- a/src/shared/att.c
-+++ b/src/shared/att.c
-@@ -2034,3 +2034,29 @@ bool bt_att_has_crypto(struct bt_att *att)
- 
- 	return att->crypto ? true : false;
- }
-+
-+bool bt_att_set_retry(struct bt_att *att, unsigned int id, bool retry)
-+{
-+	struct att_send_op *op;
-+
-+	if (!id)
-+		return false;
-+
-+	op = queue_find(att->req_queue, match_op_id, UINT_TO_PTR(id));
-+	if (op)
-+		goto done;
-+
-+	op = queue_find(att->ind_queue, match_op_id, UINT_TO_PTR(id));
-+	if (op)
-+		goto done;
-+
-+	op = queue_find(att->write_queue, match_op_id, UINT_TO_PTR(id));
-+
-+done:
-+	if (!op)
-+		return false;
-+
-+	op->retry = !retry;
-+
-+	return true;
-+}
-diff --git a/src/shared/att.h b/src/shared/att.h
-index 4aa3de87b..6fd78636e 100644
---- a/src/shared/att.h
-+++ b/src/shared/att.h
-@@ -110,3 +110,4 @@ bool bt_att_set_local_key(struct bt_att *att, uint8_t sign_key[16],
- bool bt_att_set_remote_key(struct bt_att *att, uint8_t sign_key[16],
- 			bt_att_counter_func_t func, void *user_data);
- bool bt_att_has_crypto(struct bt_att *att);
-+bool bt_att_set_retry(struct bt_att *att, unsigned int id, bool retry);
-diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c
-index efc013a20..2c16e78be 100644
---- a/src/shared/gatt-client.c
-+++ b/src/shared/gatt-client.c
-@@ -3817,3 +3817,22 @@ bool bt_gatt_client_idle_unregister(struct bt_gatt_client *client,
- 
- 	return false;
- }
-+
-+bool bt_gatt_client_set_retry(struct bt_gatt_client *client,
-+					unsigned int id,
-+					bool retry)
-+{
-+	struct request *req;
-+
-+	if (!client || !id)
-+		return false;
-+
-+	req = queue_find(client->pending_requests, match_req_id,
-+							UINT_TO_PTR(id));
-+	if (!req)
-+		return false;
-+
-+	bt_att_set_retry(client->att, req->att_id, retry);
-+
-+	return true;
-+}
-diff --git a/src/shared/gatt-client.h b/src/shared/gatt-client.h
-index bccd04a62..63cf99500 100644
---- a/src/shared/gatt-client.h
-+++ b/src/shared/gatt-client.h
-@@ -134,3 +134,6 @@ unsigned int bt_gatt_client_idle_register(struct bt_gatt_client *client,
- 					bt_gatt_client_destroy_func_t destroy);
- bool bt_gatt_client_idle_unregister(struct bt_gatt_client *client,
- 						unsigned int id);
-+bool bt_gatt_client_set_retry(struct bt_gatt_client *client,
-+					unsigned int id,
-+					bool retry);
--- 
-2.34.1
-
diff --git a/spec_files/bluez/0007-btgatt-client-Add-command-to-prevent-security-level-.patch b/spec_files/bluez/0007-btgatt-client-Add-command-to-prevent-security-level-.patch
deleted file mode 100644
index 9f0fb9c2..00000000
--- a/spec_files/bluez/0007-btgatt-client-Add-command-to-prevent-security-level-.patch
+++ /dev/null
@@ -1,224 +0,0 @@
-From c92872e79bdf835060e7a6d2cab2103841f428ac Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Danis?= <frederic.danis@collabora.com>
-Date: Thu, 25 Jan 2024 20:08:02 +0100
-Subject: [PATCH BlueZ 2/5] btgatt-client: Add command to prevent security
- level change
-Content-Type: text/plain; charset="utf-8"
-Content-Transfer-Encoding: 8bit
-
-Some PTS GATT tests like GATT/CL/GAR/BI-04-C request to be able to get the
-security error and do not try to change the security level.
-
-This commit adds the ability to prevent to change the security level.
----
- tools/btgatt-client.c | 84 ++++++++++++++++++++++++++++++++++++-------
- 1 file changed, 72 insertions(+), 12 deletions(-)
-
-diff --git a/tools/btgatt-client.c b/tools/btgatt-client.c
-index 58a03bd48..3bcb7e1cf 100644
---- a/tools/btgatt-client.c
-+++ b/tools/btgatt-client.c
-@@ -57,6 +57,7 @@ struct client {
- 	struct bt_gatt_client *gatt;
- 
- 	unsigned int reliable_session_id;
-+	bool sec_retry;
- };
- 
- static void print_prompt(void)
-@@ -172,6 +173,7 @@ static struct client *client_create(int fd, uint16_t mtu)
- 		fprintf(stderr, "Failed to allocate memory for client\n");
- 		return NULL;
- 	}
-+	cli->sec_retry = true;
- 
- 	cli->att = bt_att_new(fd, false);
- 	if (!cli->att) {
-@@ -488,6 +490,7 @@ static void cmd_read_multiple(struct client *cli, char *cmd_str)
- 	char *argv[512];
- 	int i;
- 	char *endptr = NULL;
-+	unsigned int id;
- 
- 	if (!bt_gatt_client_is_ready(cli->gatt)) {
- 		printf("GATT client not initialized\n");
-@@ -514,9 +517,12 @@ static void cmd_read_multiple(struct client *cli, char *cmd_str)
- 		}
- 	}
- 
--	if (!bt_gatt_client_read_multiple(cli->gatt, value, argc,
--						read_multiple_cb, NULL, NULL))
-+	id = bt_gatt_client_read_multiple(cli->gatt, value, argc,
-+						read_multiple_cb, NULL, NULL);
-+	if (!id)
- 		printf("Failed to initiate read multiple procedure\n");
-+	else if (!cli->sec_retry)
-+		bt_gatt_client_set_retry(cli->gatt, id, false);
- 
- 	free(value);
- }
-@@ -558,6 +564,7 @@ static void cmd_read_value(struct client *cli, char *cmd_str)
- 	int argc = 0;
- 	uint16_t handle;
- 	char *endptr = NULL;
-+	unsigned int id;
- 
- 	if (!bt_gatt_client_is_ready(cli->gatt)) {
- 		printf("GATT client not initialized\n");
-@@ -575,9 +582,12 @@ static void cmd_read_value(struct client *cli, char *cmd_str)
- 		return;
- 	}
- 
--	if (!bt_gatt_client_read_value(cli->gatt, handle, read_cb,
--								NULL, NULL))
-+	id = bt_gatt_client_read_value(cli->gatt, handle, read_cb,
-+					NULL, NULL);
-+	if (!id)
- 		printf("Failed to initiate read value procedure\n");
-+	else if (!cli->sec_retry)
-+		bt_gatt_client_set_retry(cli->gatt, id, false);
- }
- 
- static void read_long_value_usage(void)
-@@ -592,6 +602,7 @@ static void cmd_read_long_value(struct client *cli, char *cmd_str)
- 	uint16_t handle;
- 	uint16_t offset;
- 	char *endptr = NULL;
-+	unsigned int id;
- 
- 	if (!bt_gatt_client_is_ready(cli->gatt)) {
- 		printf("GATT client not initialized\n");
-@@ -616,9 +627,12 @@ static void cmd_read_long_value(struct client *cli, char *cmd_str)
- 		return;
- 	}
- 
--	if (!bt_gatt_client_read_long_value(cli->gatt, handle, offset, read_cb,
--								NULL, NULL))
-+	id = bt_gatt_client_read_long_value(cli->gatt, handle, offset, read_cb,
-+								NULL, NULL);
-+	if (!id)
- 		printf("Failed to initiate read long value procedure\n");
-+	else if (!cli->sec_retry)
-+		bt_gatt_client_set_retry(cli->gatt, id, false);
- }
- 
- static void write_value_usage(void)
-@@ -659,6 +673,7 @@ static void cmd_write_value(struct client *cli, char *cmd_str)
- 	uint8_t *value = NULL;
- 	bool without_response = false;
- 	bool signed_write = false;
-+	unsigned int id;
- 
- 	if (!bt_gatt_client_is_ready(cli->gatt)) {
- 		printf("GATT client not initialized\n");
-@@ -740,10 +755,13 @@ static void cmd_write_value(struct client *cli, char *cmd_str)
- 		goto done;
- 	}
- 
--	if (!bt_gatt_client_write_value(cli->gatt, handle, value, length,
-+	id = bt_gatt_client_write_value(cli->gatt, handle, value, length,
- 								write_cb,
--								NULL, NULL))
-+								NULL, NULL);
-+	if (!id)
- 		printf("Failed to initiate write procedure\n");
-+	else if (!cli->sec_retry)
-+		bt_gatt_client_set_retry(cli->gatt, id, false);
- 
- done:
- 	free(value);
-@@ -789,6 +807,7 @@ static void cmd_write_long_value(struct client *cli, char *cmd_str)
- 	int length;
- 	uint8_t *value = NULL;
- 	bool reliable_writes = false;
-+	unsigned int id;
- 
- 	if (!bt_gatt_client_is_ready(cli->gatt)) {
- 		printf("GATT client not initialized\n");
-@@ -863,11 +882,14 @@ static void cmd_write_long_value(struct client *cli, char *cmd_str)
- 		}
- 	}
- 
--	if (!bt_gatt_client_write_long_value(cli->gatt, reliable_writes, handle,
-+	id = bt_gatt_client_write_long_value(cli->gatt, reliable_writes, handle,
- 							offset, value, length,
- 							write_long_cb,
--							NULL, NULL))
-+							NULL, NULL);
-+	if (!id)
- 		printf("Failed to initiate long write procedure\n");
-+	else if (!cli->sec_retry)
-+		bt_gatt_client_set_retry(cli->gatt, id, false);
- 
- 	free(value);
- }
-@@ -999,12 +1021,18 @@ done:
- 							value, length,
- 							write_long_cb, NULL,
- 							NULL);
--	if (!cli->reliable_session_id)
-+	if (!cli->reliable_session_id) {
- 		printf("Failed to proceed prepare write\n");
--	else
-+	} else {
-+		if (!cli->sec_retry)
-+			bt_gatt_client_set_retry(cli->gatt,
-+						cli->reliable_session_id,
-+						false);
-+
- 		printf("Prepare write success.\n"
- 				"Session id: %d to be used on next write\n",
- 						cli->reliable_session_id);
-+	}
- 
- 	free(value);
- }
-@@ -1236,6 +1264,36 @@ static void cmd_get_security(struct client *cli, char *cmd_str)
- 		printf("Security level: %u\n", level);
- }
- 
-+static void set_security_retry_usage(void)
-+{
-+	printf("Usage: set-security-retry <y/n>\n"
-+		"e.g.:\n"
-+		"\tset-security-retry n\n");
-+}
-+
-+static void cmd_set_security_retry(struct client *cli, char *cmd_str)
-+{
-+	char *argv[2];
-+	int argc = 0;
-+
-+	if (!bt_gatt_client_is_ready(cli->gatt)) {
-+		printf("GATT client not initialized\n");
-+		return;
-+	}
-+
-+	if (!parse_args(cmd_str, 1, argv, &argc) || argc != 1) {
-+		set_security_retry_usage();
-+		return;
-+	}
-+
-+	if (argv[0][0] == 'y')
-+		cli->sec_retry = true;
-+	else if (argv[0][0] == 'n')
-+		cli->sec_retry = false;
-+	else
-+		printf("Invalid argument: %s\n", argv[0]);
-+}
-+
- static bool convert_sign_key(char *optarg, uint8_t key[16])
- {
- 	int i;
-@@ -1327,6 +1385,8 @@ static struct {
- 				"\tSet security level on le connection"},
- 	{ "get-security", cmd_get_security,
- 				"\tGet security level on le connection"},
-+	{ "set-security-retry", cmd_set_security_retry,
-+			"\tSet retry on security error by elevating security"},
- 	{ "set-sign-key", cmd_set_sign_key,
- 				"\tSet signing key for signed write command"},
- 	{ }
--- 
-2.34.1
-
diff --git a/spec_files/bluez/0008-btgatt-client-Add-function-to-search-service-based-o.patch b/spec_files/bluez/0008-btgatt-client-Add-function-to-search-service-based-o.patch
deleted file mode 100644
index fa6cace4..00000000
--- a/spec_files/bluez/0008-btgatt-client-Add-function-to-search-service-based-o.patch
+++ /dev/null
@@ -1,110 +0,0 @@
-From fd39b61b38336cba2ef6fb3d0e2884f88e4ef0a8 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Danis?= <frederic.danis@collabora.com>
-Date: Thu, 25 Jan 2024 20:08:03 +0100
-Subject: [PATCH BlueZ 3/5] btgatt-client: Add function to search service based
- on UUID
-Content-Type: text/plain; charset="utf-8"
-Content-Transfer-Encoding: 8bit
-
-This is requested to pass PTS GATT/CL/GAD/BV-02-C test.
----
- tools/btgatt-client.c | 69 +++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 69 insertions(+)
-
-diff --git a/tools/btgatt-client.c b/tools/btgatt-client.c
-index 3bcb7e1cf..99a123697 100644
---- a/tools/btgatt-client.c
-+++ b/tools/btgatt-client.c
-@@ -33,6 +33,7 @@
- #include "src/shared/queue.h"
- #include "src/shared/gatt-db.h"
- #include "src/shared/gatt-client.h"
-+#include "src/shared/gatt-helpers.h"
- 
- #define ATT_CID 4
- 
-@@ -1353,6 +1354,72 @@ static void cmd_set_sign_key(struct client *cli, char *cmd_str)
- 		set_sign_key_usage();
- }
- 
-+static void search_service_usage(void)
-+{
-+	printf("Usage: search-service <uuid>\n"
-+		"e.g.:\n"
-+		"\tsearch-service 1800\n");
-+}
-+
-+static void search_service_cb(bool success, uint8_t att_ecode,
-+					struct bt_gatt_result *result,
-+					void *user_data)
-+{
-+	struct bt_gatt_iter iter;
-+	uint16_t start_handle, end_handle;
-+	uint128_t u128;
-+	bt_uuid_t uuid;
-+	char uuid_str[MAX_LEN_UUID_STR];
-+
-+	if (!success) {
-+		PRLOG("\nService discovery failed: %s (0x%02x)\n",
-+				ecode_to_string(att_ecode), att_ecode);
-+		return;
-+	}
-+
-+	if (!result || !bt_gatt_iter_init(&iter, result))
-+		return;
-+
-+	printf("\n");
-+	while (bt_gatt_iter_next_service(&iter, &start_handle, &end_handle,
-+						u128.data)) {
-+		bt_uuid128_create(&uuid, u128);
-+		bt_uuid_to_string(&uuid, uuid_str, sizeof(uuid_str));
-+		printf("Found start handle: 0x%04x, end handle: 0x%04x, "
-+			"UUID: %s\n",
-+			start_handle, end_handle, uuid_str);
-+	}
-+	PRLOG("\n");
-+}
-+
-+static void cmd_search_service(struct client *cli, char *cmd_str)
-+{
-+	char *argv[2];
-+	int argc = 0;
-+	bt_uuid_t uuid;
-+
-+	if (!bt_gatt_client_is_ready(cli->gatt)) {
-+		printf("GATT client not initialized\n");
-+		return;
-+	}
-+
-+	if (!parse_args(cmd_str, 1, argv, &argc) || argc != 1) {
-+		search_service_usage();
-+		return;
-+	}
-+
-+	if (bt_string_to_uuid(&uuid, argv[0]) < 0) {
-+		printf("Invalid UUID: %s\n", argv[0]);
-+		return;
-+	}
-+
-+	bt_gatt_discover_primary_services(bt_gatt_client_get_att(cli->gatt),
-+						&uuid, 0x0001, 0xFFFF,
-+						search_service_cb,
-+						NULL,
-+						NULL);
-+}
-+
- static void cmd_help(struct client *cli, char *cmd_str);
- 
- typedef void (*command_func_t)(struct client *cli, char *cmd_str);
-@@ -1389,6 +1456,8 @@ static struct {
- 			"\tSet retry on security error by elevating security"},
- 	{ "set-sign-key", cmd_set_sign_key,
- 				"\tSet signing key for signed write command"},
-+	{ "search-service", cmd_search_service,
-+				"\tSearch service"},
- 	{ }
- };
- 
--- 
-2.34.1
-
diff --git a/spec_files/bluez/0009-btgatt-client-Add-function-to-search-characteristics.patch b/spec_files/bluez/0009-btgatt-client-Add-function-to-search-characteristics.patch
deleted file mode 100644
index 3585853f..00000000
--- a/spec_files/bluez/0009-btgatt-client-Add-function-to-search-characteristics.patch
+++ /dev/null
@@ -1,117 +0,0 @@
-From b36be985e700374f815c21fa7a787c4740edc1f4 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Danis?= <frederic.danis@collabora.com>
-Date: Thu, 25 Jan 2024 20:08:04 +0100
-Subject: [PATCH BlueZ 4/5] btgatt-client: Add function to search
- characteristics
-Content-Type: text/plain; charset="utf-8"
-Content-Transfer-Encoding: 8bit
-
-This is requested to pass PTS GATT/CL/GAD/BV-05-C test.
-This search characteristics based on UUID, start and end handles.
----
- tools/btgatt-client.c | 82 +++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 82 insertions(+)
-
-diff --git a/tools/btgatt-client.c b/tools/btgatt-client.c
-index 99a123697..04fd3ce0f 100644
---- a/tools/btgatt-client.c
-+++ b/tools/btgatt-client.c
-@@ -1420,6 +1420,86 @@ static void cmd_search_service(struct client *cli, char *cmd_str)
- 						NULL);
- }
- 
-+static void search_characteristics_usage(void)
-+{
-+	printf("Usage: search-characteristics <start_hanlde> <end_handle> "
-+		"<uuid>\n"
-+		"e.g.:\n"
-+		"\tsearch-characteristics 0x0001 0xFFFF 1800\n");
-+}
-+
-+static void search_characteristics_cb(bool success, uint8_t att_ecode,
-+					struct bt_gatt_result *result,
-+					void *user_data)
-+{
-+	struct bt_gatt_iter iter;
-+	uint16_t handle, length;
-+	const uint8_t *value;
-+	int i;
-+
-+	if (!success) {
-+		PRLOG("\nCharacteristics discovery failed: %s (0x%02x)\n",
-+				ecode_to_string(att_ecode), att_ecode);
-+		return;
-+	}
-+
-+	if (!result || !bt_gatt_iter_init(&iter, result))
-+		return;
-+
-+	printf("\n");
-+	while (bt_gatt_iter_next_read_by_type(&iter, &handle, &length,
-+						&value)) {
-+		printf("Found handle: 0x%04x value: ", handle);
-+		for (i = 0; i < length; i++)
-+			printf("%02x ", value[i]);
-+		printf("\n");
-+	}
-+	PRLOG("\n");
-+}
-+
-+static void cmd_search_characteristics(struct client *cli, char *cmd_str)
-+{
-+	char *argv[4];
-+	int argc = 0;
-+	uint16_t start_handle, end_handle;
-+	char *endptr = NULL;
-+	bt_uuid_t uuid;
-+
-+	if (!bt_gatt_client_is_ready(cli->gatt)) {
-+		printf("GATT client not initialized\n");
-+		return;
-+	}
-+
-+	if (!parse_args(cmd_str, 3, argv, &argc) || argc != 3) {
-+		search_characteristics_usage();
-+		return;
-+	}
-+
-+	start_handle = strtol(argv[0], &endptr, 0);
-+	if (!endptr || *endptr != '\0') {
-+		printf("Invalid start handle: %s\n", argv[0]);
-+		return;
-+	}
-+
-+	end_handle = strtol(argv[1], &endptr, 0);
-+	if (!endptr || *endptr != '\0') {
-+		printf("Invalid end handle: %s\n", argv[1]);
-+		return;
-+	}
-+
-+	if (bt_string_to_uuid(&uuid, argv[2]) < 0) {
-+		printf("Invalid UUID: %s\n", argv[2]);
-+		return;
-+	}
-+
-+	bt_gatt_read_by_type(bt_gatt_client_get_att(cli->gatt), start_handle,
-+						end_handle,
-+						&uuid,
-+						search_characteristics_cb,
-+						NULL,
-+						NULL);
-+}
-+
- static void cmd_help(struct client *cli, char *cmd_str);
- 
- typedef void (*command_func_t)(struct client *cli, char *cmd_str);
-@@ -1458,6 +1538,8 @@ static struct {
- 				"\tSet signing key for signed write command"},
- 	{ "search-service", cmd_search_service,
- 				"\tSearch service"},
-+	{ "search-characteristics", cmd_search_characteristics,
-+				"\tSearch characteristics"},
- 	{ }
- };
- 
--- 
-2.34.1
-
diff --git a/spec_files/bluez/0010-btgatt-client-Add-function-to-search-all-primary-ser.patch b/spec_files/bluez/0010-btgatt-client-Add-function-to-search-all-primary-ser.patch
deleted file mode 100644
index 1521de3c..00000000
--- a/spec_files/bluez/0010-btgatt-client-Add-function-to-search-all-primary-ser.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From 52aa25f70651df9e9357fdab47bddd25e096d150 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Danis?= <frederic.danis@collabora.com>
-Date: Thu, 25 Jan 2024 20:08:05 +0100
-Subject: [PATCH BlueZ 5/5] btgatt-client: Add function to search all primary
- services
-Content-Type: text/plain; charset="utf-8"
-Content-Transfer-Encoding: 8bit
-
-This is requested to pass PTS GATT/CL/GAD/BV-01-C test.
----
- tools/btgatt-client.c | 30 +++++++++++++++++++++++-------
- 1 file changed, 23 insertions(+), 7 deletions(-)
-
-diff --git a/tools/btgatt-client.c b/tools/btgatt-client.c
-index 04fd3ce0f..b47914da3 100644
---- a/tools/btgatt-client.c
-+++ b/tools/btgatt-client.c
-@@ -1354,13 +1354,6 @@ static void cmd_set_sign_key(struct client *cli, char *cmd_str)
- 		set_sign_key_usage();
- }
- 
--static void search_service_usage(void)
--{
--	printf("Usage: search-service <uuid>\n"
--		"e.g.:\n"
--		"\tsearch-service 1800\n");
--}
--
- static void search_service_cb(bool success, uint8_t att_ecode,
- 					struct bt_gatt_result *result,
- 					void *user_data)
-@@ -1392,6 +1385,27 @@ static void search_service_cb(bool success, uint8_t att_ecode,
- 	PRLOG("\n");
- }
- 
-+static void cmd_search_all_primary_services(struct client *cli, char *cmd_str)
-+{
-+	if (!bt_gatt_client_is_ready(cli->gatt)) {
-+		printf("GATT client not initialized\n");
-+		return;
-+	}
-+
-+	bt_gatt_discover_all_primary_services(bt_gatt_client_get_att(cli->gatt),
-+						NULL,
-+						search_service_cb,
-+						NULL,
-+						NULL);
-+}
-+
-+static void search_service_usage(void)
-+{
-+	printf("Usage: search-service <uuid>\n"
-+		"e.g.:\n"
-+		"\tsearch-service 1800\n");
-+}
-+
- static void cmd_search_service(struct client *cli, char *cmd_str)
- {
- 	char *argv[2];
-@@ -1536,6 +1550,8 @@ static struct {
- 			"\tSet retry on security error by elevating security"},
- 	{ "set-sign-key", cmd_set_sign_key,
- 				"\tSet signing key for signed write command"},
-+	{ "search-all-primary-services", cmd_search_all_primary_services,
-+				"\tSearch all primary services"},
- 	{ "search-service", cmd_search_service,
- 				"\tSearch service"},
- 	{ "search-characteristics", cmd_search_characteristics,
--- 
-2.34.1
-
diff --git a/spec_files/bluez/AVRCP_TG_MDI_BV-04-C.patch b/spec_files/bluez/AVRCP_TG_MDI_BV-04-C.patch
deleted file mode 100644
index 38478f05..00000000
--- a/spec_files/bluez/AVRCP_TG_MDI_BV-04-C.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-diff -ru bluez-5.66.orig/profiles/audio/avrcp.c bluez-5.66/profiles/audio/avrcp.c
---- bluez-5.66.orig/profiles/audio/avrcp.c	2022-03-16 08:06:20.000000000 -0700
-+++ bluez-5.66/profiles/audio/avrcp.c	2023-07-30 08:03:17.414213611 -0700
-@@ -1210,6 +1210,10 @@
- 					GUINT_TO_POINTER(str_to_metadata(key)));
- 	}
- 
-+	if (attrs == NULL)
-+		return g_list_prepend(NULL,
-+				GUINT_TO_POINTER(AVRCP_MEDIA_ATTRIBUTE_TITLE));
-+
- 	return attrs;
- }
- 
-Only in bluez-5.66/profiles/audio: avrcp.c.orig
diff --git a/spec_files/bluez/bluez.spec b/spec_files/bluez/bluez.spec
index dc4f0257..6940ad94 100644
--- a/spec_files/bluez/bluez.spec
+++ b/spec_files/bluez/bluez.spec
@@ -5,7 +5,7 @@
 %endif
 
 Name:    bluez
-Version: 5.72
+Version: 5.73
 Release: 3%{?dist}.bazzite.{{{ git_dir_version }}}
 Summary: Bluetooth utilities
 License: GPLv2+
@@ -14,18 +14,16 @@ URL:     https://www.bluez.org/
 Source0: https://www.kernel.org/pub/linux/bluetooth/%{name}-%{version}.tar.xz
 Source1: bluez.gitignore
 
-# https://lore.kernel.org/linux-bluetooth/20220901110719.176944-1-hadess@hadess.net/T/#m9c08d004cd5422783ee1d93154f42303bba9169f
-Patch2: power-state-adapter-property.patch
+Patch0:   device-fix-device_is_connected-checking-for-services.patch
+# https://git.kernel.org/pub/scm/bluetooth/bluez.git/commit/?id=036583f9bbec8540fbd85b980674aad4916d3093
+# https://github.com/bluez/bluez/issues/785
+# https://bugzilla.redhat.com/show_bug.cgi?id=2269516
+# Fix busy loop when disabling interface while device is connected
+Patch1:   0001-device-Add-btd_device_bearer_is_connected.patch
 
 # Valve
-Patch3: AVRCP_TG_MDI_BV-04-C.patch
 Patch4: 0001-valve-bluetooth-config.patch
 Patch5: 0002-valve-bluetooth-phy.patch
-Patch6: 0006-shared-gatt-Prevent-security-level-change-for-PTS-GA.patch
-Patch7: 0007-btgatt-client-Add-command-to-prevent-security-level-.patch
-Patch8: 0008-btgatt-client-Add-function-to-search-service-based-o.patch
-Patch9: 0009-btgatt-client-Add-function-to-search-characteristics.patch
-Patch10: 0010-btgatt-client-Add-function-to-search-all-primary-ser.patch
 
 BuildRequires: dbus-devel >= 1.6
 BuildRequires: glib2-devel
@@ -61,10 +59,7 @@ Utilities for use in Bluetooth applications:
 	- btattach
 	- btmon
 	- hex2hcd
-	- l2ping
-	- l2test
 	- mpris-proxy
-	- rctest
 
 The BLUETOOTH trademarks are owned by Bluetooth SIG, Inc., U.S.A.
 
@@ -92,6 +87,7 @@ be dropped by upstream. Utilities include:
 	- hciconfig
 	- hcidump
 	- hcitool
+	- meshctl
 	- rfcomm
 	- sdptool
 %endif
@@ -259,14 +255,12 @@ install emulator/btvirt ${RPM_BUILD_ROOT}/%{_libexecdir}/bluetooth/
 %{_bindir}/btmgmt
 %{_bindir}/btmon
 %{_bindir}/hex2hcd
-%{_bindir}/l2ping
 %{_bindir}/mpris-proxy
 %{_mandir}/man1/bluetoothctl.1.*
 %{_mandir}/man1/bluetoothctl-*.1.*
 %{_mandir}/man1/btmgmt.1.*
 %{_mandir}/man1/btattach.1.*
 %{_mandir}/man1/btmon.1.*
-%{_mandir}/man1/l2ping.1.*
 %{_mandir}/man8/bluetoothd.8.*
 %dir %{_libexecdir}/bluetooth
 %{_libexecdir}/bluetooth/bluetoothd
@@ -308,8 +302,10 @@ install emulator/btvirt ${RPM_BUILD_ROOT}/%{_libexecdir}/bluetooth/
 %doc doc/*txt
 %{_bindir}/isotest
 %{_bindir}/l2test
+%{_bindir}/l2ping
 %{_bindir}/rctest
 %{_mandir}/man1/isotest.1.*
+%{_mandir}/man1/l2ping.1.*
 %{_mandir}/man1/rctest.1.*
 %{_mandir}/man5/org.bluez.*.5.*
 %{_libdir}/libbluetooth.so
@@ -340,9 +336,19 @@ install emulator/btvirt ${RPM_BUILD_ROOT}/%{_libexecdir}/bluetooth/
 %files obexd
 %{_libexecdir}/bluetooth/obexd
 %{_datadir}/dbus-1/services/org.bluez.obex.service
+/usr/lib/systemd/user/dbus-org.bluez.obex.service
 %{_userunitdir}/obex.service
 
 %changelog
+* Thu Apr 04 2024 Adam Williamson <awilliam@redhat.com> - 5.73-3
+- Backport further upstream fix for connected device checks (#2269516) 
+
+* Mon Mar 18 2024 Peter Robinson <pbrobinson@fedoraproject.org> - 5.73-2
+- Upstream fix for connected device checks 
+
+* Fri Mar 08 2024 Peter Robinson <pbrobinson@fedoraproject.org> - 5.73-1
+- Update to 5.73 
+
 * Tue Jan 23 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.72-3
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
 
diff --git a/spec_files/bluez/device-fix-device_is_connected-checking-for-services.patch b/spec_files/bluez/device-fix-device_is_connected-checking-for-services.patch
new file mode 100644
index 00000000..defea3e2
--- /dev/null
+++ b/spec_files/bluez/device-fix-device_is_connected-checking-for-services.patch
@@ -0,0 +1,57 @@
+From 9a0e675193666a36d76fe7da89fdd74ef50217a5 Mon Sep 17 00:00:00 2001
+From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Date: Mon, 18 Mar 2024 16:08:31 +0000
+Subject: [PATCH] device: Fix device_is_connected checking for services being
+ connected
+
+Change 44d3f67277f83983e1e9697eda7b9aeb40ca231d since to have introduced
+quite a few bugs related to device_is_connected return true which
+prevents proper cleanup of connection.
+
+Fixes: https://github.com/bluez/bluez/issues/774
+Fixes: https://github.com/bluez/bluez/issues/778
+Fixes: https://github.com/bluez/bluez/issues/783
+Fixes: https://github.com/bluez/bluez/issues/784
+---
+ src/device.c | 22 ++++++++++++----------
+ 1 file changed, 12 insertions(+), 10 deletions(-)
+
+diff --git a/src/device.c b/src/device.c
+index aecceb100..b5b574233 100644
+--- a/src/device.c
++++ b/src/device.c
+@@ -3324,22 +3324,24 @@ void device_add_connection(struct btd_device *dev, uint8_t bdaddr_type,
+ 								"Connected");
+ }
+ 
++static bool device_service_connected(struct btd_device *dev)
++{
++	if (find_service_with_state(dev->services,
++					BTD_SERVICE_STATE_CONNECTING))
++		return true;
++
++	return find_service_with_state(dev->services,
++					BTD_SERVICE_STATE_CONNECTED);
++}
++
+ static bool device_disappeared(gpointer user_data)
+ {
+ 	struct btd_device *dev = user_data;
+ 
+-	if (btd_device_is_connected(dev)) {
+-		char addr[18];
+-		ba2str(&dev->bdaddr, addr);
+-		DBG("Device %s is marked as connected", dev->path);
+-		return TRUE;
+-	}
+-
+-	/* If there are services connecting restart the timer to give more time
++	/* If there are services connected restart the timer to give more time
+ 	 * for the service to either complete the connection or disconnect.
+ 	 */
+-	if (find_service_with_state(dev->services,
+-					BTD_SERVICE_STATE_CONNECTING))
++	if (device_service_connected(dev))
+ 		return TRUE;
+ 
+ 	dev->temporary_timer = 0;
diff --git a/spec_files/bluez/power-state-adapter-property.patch b/spec_files/bluez/power-state-adapter-property.patch
deleted file mode 100644
index 566d7c08..00000000
--- a/spec_files/bluez/power-state-adapter-property.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 70309219acd4c81e3a9e2b3652d2d93eb08b0aee Mon Sep 17 00:00:00 2001
-From: Bastien Nocera <hadess@hadess.net>
-Date: Wed, 31 Aug 2022 11:16:34 +0200
-Subject: [PATCH 6/6] adapter: Remove experimental flag for PowerState
-
-Now that the feature has been tested, that the API is deemed adequate
-and the reliability sufficient.
----
- src/adapter.c | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
-diff --git a/src/adapter.c b/src/adapter.c
-index 8fb2acdc8..841096d7f 100644
---- a/src/adapter.c
-+++ b/src/adapter.c
-@@ -3864,8 +3864,7 @@ static const GDBusPropertyTable adapter_properties[] = {
- 	{ "Alias", "s", property_get_alias, property_set_alias },
- 	{ "Class", "u", property_get_class },
- 	{ "Powered", "b", property_get_powered, property_set_powered },
--	{ "PowerState", "s", property_get_power_state, NULL, NULL,
--			     G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
-+	{ "PowerState", "s", property_get_power_state },
- 	{ "Discoverable", "b", property_get_discoverable,
- 					property_set_discoverable },
- 	{ "DiscoverableTimeout", "u", property_get_discoverable_timeout,
--- 
-2.37.2
-
diff --git a/system_files/desktop/shared/usr/etc/profile.d/bazzite-warnings.sh b/system_files/desktop/shared/usr/etc/profile.d/bazzite-warnings.sh
index e66dd7ee..06670300 100755
--- a/system_files/desktop/shared/usr/etc/profile.d/bazzite-warnings.sh
+++ b/system_files/desktop/shared/usr/etc/profile.d/bazzite-warnings.sh
@@ -6,7 +6,7 @@ if [[ $IMAGE_FLAVOR = "nvidia"  ]]; then
 		echo -e 'You are using a Nvidia image, but the Nvidia driver is not loaded:\n - If you are using secure boot, run "ujust enroll-secure-boot-key", then reboot and enter the password "ublue-os" when prompted.\n - If you are not using secure boot or have already enrolled the above key, ensure you have the needed kargs by running "ujust configure-nvidia kargs" and then rebooting.\n - This message will not appear if the issue is resolved.\n'
 	fi
 else
-	if ! grep -q "v4l2loopback" <<< $(lsmod); then
-		echo -e 'Requires drivers could not be loaded:\n - If you are using secure boot, run "ujust enroll-secure-boot-key", then reboot and enter the password "ublue-os" when prompted.\n - This message will not appear if the issue is resolved.\n'
+	if ! grep -q "xone-dongle" <<< $(lsmod); then
+		echo -e 'Required drivers could not be loaded:\n - If you are using secure boot, run "ujust enroll-secure-boot-key", then reboot and enter the password "ublue-os" when prompted.\n - This message will not appear if the issue is resolved.\n'
 	fi
 fi