diff --git a/res/res_pjsip_caller_id.c b/res/res_pjsip_caller_id.c
index f15a66c05085372a180b3a4686a85b46a4fabfde..2481a3f529eb6da1fa30787f70370374ca241dbe 100644
--- a/res/res_pjsip_caller_id.c
+++ b/res/res_pjsip_caller_id.c
@@ -542,6 +542,33 @@ static void add_pai_header(const struct ast_sip_session *session, pjsip_tx_data
 	pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)pai_hdr);
 }
 
+/*!
+ * \internal
+ * \brief Add party parameter to a Remote-Party-ID header.
+ *
+ * \param tdata The message where the Remote-Party-ID header is
+ * \param hdr The header on which the parameters are being added
+ * \param session The session involved
+ */
+static void add_party_param(pjsip_tx_data *tdata, pjsip_fromto_hdr *hdr, const struct ast_sip_session *session)
+{
+	static const pj_str_t party_str = { "party", 5 };
+	static const pj_str_t calling_str = { "calling", 7 };
+	static const pj_str_t called_str = { "called", 6 };
+	pjsip_param *party;
+
+	/* The party value can't change throughout the lifetime, so it is set only once */
+	party = pjsip_param_find(&hdr->other_param, &party_str);
+	if (party) {
+		return;
+	}
+
+	party = PJ_POOL_ALLOC_T(tdata->pool, pjsip_param);
+	party->name = party_str;
+	party->value = (session->inv_session->role == PJSIP_ROLE_UAC) ? calling_str : called_str;
+	pj_list_insert_before(&hdr->other_param, party);
+}
+
 /*!
  * \internal
  * \brief Add privacy and screen parameters to a Remote-Party-ID header.
@@ -631,6 +658,7 @@ static void add_rpid_header(const struct ast_sip_session *session, pjsip_tx_data
 			pj_list_erase(old_rpid);
 		} else {
 			ast_sip_modify_id_header(tdata->pool, old_rpid, id);
+			add_party_param(tdata, old_rpid, session);
 			add_privacy_params(tdata, old_rpid, id);
 			return;
 		}
@@ -646,6 +674,7 @@ static void add_rpid_header(const struct ast_sip_session *session, pjsip_tx_data
 	if (!rpid_hdr) {
 		return;
 	}
+	add_party_param(tdata, rpid_hdr, session);
 	add_privacy_params(tdata, rpid_hdr, id);
 	pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)rpid_hdr);
 }