diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 138021e82bdf68b21d5d1e36ea749cda3a336fb2..3891dada6b7be80e3f1755bc4cf55c9bdc39da36 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -25886,10 +25886,7 @@ static int handle_invite_replaces(struct sip_pvt *p, struct sip_request *req,
 
 	ast_raw_answer(c);
 
-	ast_channel_lock(replaces_chan);
-	bridge = ast_channel_get_bridge(replaces_chan);
-	ast_channel_unlock(replaces_chan);
-
+	bridge = ast_bridge_transfer_acquire_bridge(replaces_chan);
 	if (bridge) {
 		if (ast_bridge_impart(bridge, c, replaces_chan, NULL,
 			AST_BRIDGE_IMPART_CHAN_INDEPENDENT)) {
diff --git a/include/asterisk/bridge.h b/include/asterisk/bridge.h
index 8d5c502113e98d74507e415c19ff9fa7f3c9e3dd..484d9a2f5a6cb605c11cc0e77f72aa08120d526e 100644
--- a/include/asterisk/bridge.h
+++ b/include/asterisk/bridge.h
@@ -945,6 +945,17 @@ void ast_bridge_remove_video_src(struct ast_bridge *bridge, struct ast_channel *
  */
 const char *ast_bridge_video_mode_to_string(enum ast_bridge_video_mode_type video_mode);
 
+/*!
+ * \brief Acquire the channel's bridge for transfer purposes.
+ * \since 13.21.0
+ *
+ * \param chan Channel involved in a transfer.
+ *
+ * \return The bridge the channel is in or NULL if it either isn't
+ * in a bridge or should not be considered to be in a bridge.
+ */
+struct ast_bridge *ast_bridge_transfer_acquire_bridge(struct ast_channel *chan);
+
 enum ast_transfer_result {
 	/*! The transfer completed successfully */
 	AST_BRIDGE_TRANSFER_SUCCESS,
diff --git a/main/bridge.c b/main/bridge.c
index 1109c4b7653047f59fb1946af2981a0344d55225..21645adae6ce0b9dc7746d051cd7fdf0c1afe0c2 100644
--- a/main/bridge.c
+++ b/main/bridge.c
@@ -4420,7 +4420,7 @@ static void set_transfer_variables_all(struct ast_channel *transferer, struct ao
 	ao2_iterator_destroy(&iter);
 }
 
-static struct ast_bridge *acquire_bridge(struct ast_channel *chan)
+struct ast_bridge *ast_bridge_transfer_acquire_bridge(struct ast_channel *chan)
 {
 	struct ast_bridge *bridge;
 
@@ -4461,7 +4461,7 @@ enum ast_transfer_result ast_bridge_transfer_blind(int is_external,
 		return AST_BRIDGE_TRANSFER_FAIL;
 	}
 
-	bridge = acquire_bridge(transferer);
+	bridge = ast_bridge_transfer_acquire_bridge(transferer);
 	if (!bridge) {
 		transfer_result = AST_BRIDGE_TRANSFER_INVALID;
 		goto publish;
@@ -4708,8 +4708,8 @@ enum ast_transfer_result ast_bridge_transfer_attended(struct ast_channel *to_tra
 	const char *app = NULL;
 	int hangup_target = 0;
 
-	to_transferee_bridge = acquire_bridge(to_transferee);
-	to_target_bridge = acquire_bridge(to_transfer_target);
+	to_transferee_bridge = ast_bridge_transfer_acquire_bridge(to_transferee);
+	to_target_bridge = ast_bridge_transfer_acquire_bridge(to_transfer_target);
 
 	transfer_msg = ast_attended_transfer_message_create(1, to_transferee, to_transferee_bridge,
 			to_transfer_target, to_target_bridge, NULL, NULL);
diff --git a/res/res_pjsip_refer.c b/res/res_pjsip_refer.c
index 7d892f653e40c78b940b2e1c08b404f415b1a4bf..120203c95e1b7bef55d3c8c9bfe82a6408216d76 100644
--- a/res/res_pjsip_refer.c
+++ b/res/res_pjsip_refer.c
@@ -917,10 +917,7 @@ static int invite_replaces(void *data)
 	ast_channel_ref(invite->session->channel);
 	invite->channel = invite->session->channel;
 
-	ast_channel_lock(invite->channel);
-	invite->bridge = ast_channel_get_bridge(invite->channel);
-	ast_channel_unlock(invite->channel);
-
+	invite->bridge = ast_bridge_transfer_acquire_bridge(invite->channel);
 	return 0;
 }