diff -urN asterisk-14.3.0/channels/chan_sip.c asterisk-14.3.0-rtcpmux/channels/chan_sip.c
--- asterisk-14.3.0/channels/chan_sip.c	2017-02-13 21:00:19.000000000 +0100
+++ asterisk-14.3.0-rtcpmux/channels/chan_sip.c	2017-03-02 18:47:16.787010530 +0100
@@ -6018,6 +6018,7 @@
 		ast_rtp_instance_set_hold_timeout(dialog->vrtp, dialog->rtpholdtimeout);
 		ast_rtp_instance_set_keepalive(dialog->vrtp, dialog->rtpkeepalive);
 
+		ast_rtp_instance_set_prop(dialog->vrtp, AST_RTP_PROPERTY_RTCPMUX, dialog->rtcpmux);
 		ast_rtp_instance_set_prop(dialog->vrtp, AST_RTP_PROPERTY_RTCP, 1);
 		ast_rtp_instance_set_qos(dialog->vrtp, global_tos_video, global_cos_video, "SIP VIDEO");
 	}
@@ -6038,6 +6039,7 @@
 		/* Do not timeout text as its not constant*/
 		ast_rtp_instance_set_keepalive(dialog->trtp, dialog->rtpkeepalive);
 
+		ast_rtp_instance_set_prop(dialog->trtp, AST_RTP_PROPERTY_RTCPMUX, dialog->rtcpmux);
 		ast_rtp_instance_set_prop(dialog->trtp, AST_RTP_PROPERTY_RTCP, 1);
 	}
 
@@ -6045,6 +6047,7 @@
 	ast_rtp_instance_set_hold_timeout(dialog->rtp, dialog->rtpholdtimeout);
 	ast_rtp_instance_set_keepalive(dialog->rtp, dialog->rtpkeepalive);
 
+	ast_rtp_instance_set_prop(dialog->rtp, AST_RTP_PROPERTY_RTCPMUX, dialog->rtcpmux);
 	ast_rtp_instance_set_prop(dialog->rtp, AST_RTP_PROPERTY_RTCP, 1);
 	ast_rtp_instance_set_prop(dialog->rtp, AST_RTP_PROPERTY_DTMF, ast_test_flag(&dialog->flags[0], SIP_DTMF) == SIP_DTMF_RFC2833);
 	ast_rtp_instance_set_prop(dialog->rtp, AST_RTP_PROPERTY_DTMF_COMPENSATE, ast_test_flag(&dialog->flags[1], SIP_PAGE2_RFC2833_COMPENSATE));
@@ -11388,6 +11391,10 @@
 			}
 			ao2_ref(format, -1);
 		}
+	} else if (!strcasecmp(a, "rtcp-mux")) {
+		p->rtcpmux = 1;
+		ast_rtp_instance_set_prop(p->rtp, AST_RTP_PROPERTY_RTCPMUX, 1);
+		found = TRUE;
 	}
 
 	return found;
@@ -11442,6 +11449,10 @@
 			}
 			ao2_ref(format, -1);
 		}
+	} else if (!strcasecmp(a, "rtcp-mux")) {
+		p->rtcpmux = 1;
+		ast_rtp_instance_set_prop(p->vrtp, AST_RTP_PROPERTY_RTCPMUX, 1);
+		found = TRUE;
 	}
 
 	return found;
@@ -13590,6 +13601,9 @@
 
 		ast_debug(3, "-- Done with adding codecs to SDP\n");
 
+		ast_str_append(&a_audio, 0, "a=rtcp-mux\r\n");
+		ast_str_append(&a_video, 0, "a=rtcp-mux\r\n");
+
 		if (!p->owner || ast_channel_timingfd(p->owner) == -1) {
 			ast_str_append(&a_audio, 0, "a=silenceSupp:off - - - -\r\n");
 		}
diff -urN asterisk-14.3.0/channels/sip/include/sip.h asterisk-14.3.0-rtcpmux/channels/sip/include/sip.h
--- asterisk-14.3.0/channels/sip/include/sip.h	2017-02-13 21:00:19.000000000 +0100
+++ asterisk-14.3.0-rtcpmux/channels/sip/include/sip.h	2017-03-02 17:36:04.386530487 +0100
@@ -1083,6 +1083,7 @@
 	                                       */
 	unsigned short req_secure_signaling:1;/*!< Whether we are required to have secure signaling or not */
 	unsigned short natdetected:1;         /*!< Whether we detected a NAT when processing the Via */
+	unsigned short rtcpmux:1;             /*!< Whether RTCP multiplexing should be done or not */
 	int timer_t1;                     /*!< SIP timer T1, ms rtt */
 	int timer_b;                      /*!< SIP timer B, ms */
 	unsigned int sipoptions;          /*!< Supported SIP options on the other end */
diff -urN asterisk-14.3.0/include/asterisk/rtp_engine.h asterisk-14.3.0-rtcpmux/include/asterisk/rtp_engine.h
--- asterisk-14.3.0/include/asterisk/rtp_engine.h	2017-02-13 21:00:19.000000000 +0100
+++ asterisk-14.3.0-rtcpmux/include/asterisk/rtp_engine.h	2017-03-02 17:51:18.768332221 +0100
@@ -114,6 +114,8 @@
 	AST_RTP_PROPERTY_STUN,
 	/*! Enable RTCP support */
 	AST_RTP_PROPERTY_RTCP,
+	/*! Enable RTCP multiplexing */
+	AST_RTP_PROPERTY_RTCPMUX,
 
 	/*!
 	 * \brief Maximum number of RTP properties supported
diff -urN asterisk-14.3.0/res/res_rtp_asterisk.c asterisk-14.3.0-rtcpmux/res/res_rtp_asterisk.c
--- asterisk-14.3.0/res/res_rtp_asterisk.c	2017-02-13 21:00:19.000000000 +0100
+++ asterisk-14.3.0-rtcpmux/res/res_rtp_asterisk.c	2017-03-02 18:47:00.328906378 +0100
@@ -290,6 +290,7 @@
 	struct io_context *io;
 	void *data;
 	struct ast_rtcp *rtcp;
+	unsigned short rtcpmux:1;
 	struct ast_rtp *bridged;        /*!< Who we are Packet bridged to */
 
 	enum strict_rtp_state strict_rtp_state; /*!< Current state that strict RTP protection is in */
@@ -775,11 +776,11 @@
 		ast_log(LOG_WARNING, "No RTP candidates; skipping ICE checklist (%p)\n", instance);
 	}
 
-	if (!has_rtcp) {
+	if (!has_rtcp && !rtp->rtcpmux) {
 		ast_log(LOG_WARNING, "No RTCP candidates; skipping ICE checklist (%p)\n", instance);
 	}
 
-	if (has_rtp && has_rtcp) {
+	if (has_rtp && (has_rtcp || rtp->rtcpmux)) {
 		pj_status_t res = pj_ice_sess_create_check_list(rtp->ice, &ufrag, &passwd, cand_cnt, &candidates[0]);
 		char reason[80];
 
@@ -2310,14 +2311,14 @@
 	if (rtp->ice) {
 		pj_thread_register_check();
 
-		if (pj_ice_sess_send_data(rtp->ice, rtcp ? AST_RTP_ICE_COMPONENT_RTCP : AST_RTP_ICE_COMPONENT_RTP, temp, len) == PJ_SUCCESS) {
+		if (pj_ice_sess_send_data(rtp->ice, rtcp && !rtp->rtcpmux ? AST_RTP_ICE_COMPONENT_RTCP : AST_RTP_ICE_COMPONENT_RTP, temp, len) == PJ_SUCCESS) {
 			*ice = 1;
 			return len;
 		}
 	}
 #endif
 
-	res = ast_sendto(rtcp ? rtp->rtcp->s : rtp->s, temp, len, flags, sa);
+	res = ast_sendto(rtcp && !rtp->rtcpmux ? rtp->rtcp->s : rtp->s, temp, len, flags, sa);
 	if (res > 0) {
 		ast_rtp_instance_set_last_tx(instance, time(NULL));
 	}
@@ -4907,7 +4908,9 @@
 {
 	struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
 
-	if (property == AST_RTP_PROPERTY_RTCP) {
+	if (property == AST_RTP_PROPERTY_RTCPMUX) {
+		rtp->rtcpmux = 1;
+	} else if (property == AST_RTP_PROPERTY_RTCP) {
 		if (value) {
 			struct ast_sockaddr local_addr;
 
