Index: asterisk-22.10.1/res/res_pjsip_wazo_call_id.c
===================================================================
--- /dev/null
+++ asterisk-22.10.1/res/res_pjsip_wazo_call_id.c
@@ -0,0 +1,94 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2026, The Wazo Authors (see the AUTHORS file)
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*** MODULEINFO
+	<depend>pjproject</depend>
+	<depend>res_pjsip</depend>
+	<depend>res_pjsip_session</depend>
+	<support_level>extended</support_level>
+ ***/
+
+#include "asterisk.h"
+
+#include <pjsip.h>
+#include <pjsip_ua.h>
+
+#include "asterisk/res_pjsip.h"
+#include "asterisk/res_pjsip_session.h"
+#include "asterisk/module.h"
+#include "asterisk/channel.h"
+#include "asterisk/strings.h"
+
+/*
+ * Adds the channel uniqueid as X-Wazo-Call-ID to the INVITEs Asterisk sends
+ * and to INVITE responses (180/183/200), so SIP clients learn the Wazo call
+ * id of their own leg in-band, without having to fetch it from the REST API.
+ */
+
+static void add_wazo_call_id_header(struct ast_sip_session *session, pjsip_tx_data *tdata)
+{
+	static const pj_str_t hdr_name = { "X-Wazo-Call-ID", 14 };
+	char uniqueid[AST_MAX_UNIQUEID];
+
+	if (!session->channel) {
+		return;
+	}
+
+	/* The same tdata can go through the supplement more than once */
+	if (pjsip_msg_find_hdr_by_name(tdata->msg, &hdr_name, NULL)) {
+		return;
+	}
+
+	ast_channel_lock(session->channel);
+	ast_copy_string(uniqueid, ast_channel_uniqueid(session->channel), sizeof(uniqueid));
+	ast_channel_unlock(session->channel);
+
+	ast_sip_add_header(tdata, "X-Wazo-Call-ID", uniqueid);
+}
+
+static void wazo_call_id_outgoing_request(struct ast_sip_session *session, pjsip_tx_data *tdata)
+{
+	add_wazo_call_id_header(session, tdata);
+}
+
+static void wazo_call_id_outgoing_response(struct ast_sip_session *session, pjsip_tx_data *tdata)
+{
+	add_wazo_call_id_header(session, tdata);
+}
+
+static struct ast_sip_session_supplement wazo_call_id_supplement = {
+	.method = "INVITE",
+	.priority = AST_SIP_SUPPLEMENT_PRIORITY_CHANNEL,
+	.outgoing_request = wazo_call_id_outgoing_request,
+	.outgoing_response = wazo_call_id_outgoing_response,
+};
+
+static int load_module(void)
+{
+	ast_sip_session_register_supplement(&wazo_call_id_supplement);
+	return AST_MODULE_LOAD_SUCCESS;
+}
+
+static int unload_module(void)
+{
+	ast_sip_session_unregister_supplement(&wazo_call_id_supplement);
+	return 0;
+}
+
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "PJSIP Wazo Call-ID header",
+	.support_level = AST_MODULE_SUPPORT_EXTENDED,
+	.load = load_module,
+	.unload = unload_module,
+	.load_pri = AST_MODPRI_APP_DEPEND,
+	.requires = "res_pjsip,res_pjsip_session",
+);
