diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index cb7fba9d766dede21ccab9eb36ca0d50b3954310..793a31b3cf54875b6e281aa1f9e9135ae3a7063a 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -8791,7 +8791,19 @@ static void get_our_media_address(struct sip_pvt *p, int needvideo, int needtext
 		dest->sin_port = p->redirip.sin_port;
 		dest->sin_addr = p->redirip.sin_addr;
 	} else {
-		dest->sin_addr = media_address.sin_addr.s_addr ? media_address.sin_addr : p->ourip.sin_addr;
+		/*
+		 * Audio Destination IP:
+		 *
+		 * 1. Specifically configured media address.
+		 * 2. Local address as specified by the RTP engine.
+		 * 3. The local IP as defined by chan_sip.
+		 *
+		 * Audio Destination Port:
+		 *
+		 * 1. Provided by the RTP engine.
+		 */
+		dest->sin_addr = media_address.sin_addr.s_addr ? media_address.sin_addr :
+					(sin->sin_addr.s_addr ? sin->sin_addr : p->ourip.sin_addr);
 		dest->sin_port = sin->sin_port;
 	}
 	if (needvideo) {
@@ -8800,7 +8812,19 @@ static void get_our_media_address(struct sip_pvt *p, int needvideo, int needtext
 			vdest->sin_addr = p->vredirip.sin_addr;
 			vdest->sin_port = p->vredirip.sin_port;
 		} else {
-			vdest->sin_addr = media_address.sin_addr.s_addr ? media_address.sin_addr : p->ourip.sin_addr;
+			/*
+			 * Video Destination IP:
+			 *
+			 * 1. Specifically configured media address.
+			 * 2. Local address as specified by the RTP engine.
+			 * 3. The local IP as defined by chan_sip.
+			 *
+			 * Video Destination Port:
+			 *
+			 * 1. Provided by the RTP engine.
+			 */
+			vdest->sin_addr = media_address.sin_addr.s_addr ? media_address.sin_addr :
+						(vsin->sin_addr.s_addr ? vsin->sin_addr : p->ourip.sin_addr);
 			vdest->sin_port = vsin->sin_port;
 		}
 	}
@@ -8810,7 +8834,19 @@ static void get_our_media_address(struct sip_pvt *p, int needvideo, int needtext
 			tdest->sin_addr = p->tredirip.sin_addr;
 			tdest->sin_port = p->tredirip.sin_port;
 		} else {
-			tdest->sin_addr = media_address.sin_addr.s_addr ? media_address.sin_addr : p->ourip.sin_addr;
+			/*
+			 * Text Destination IP:
+			 *
+			 * 1. Specifically configured media address.
+			 * 2. Local address as specified by the RTP engine.
+			 * 3. The local IP as defined by chan_sip.
+			 *
+			 * Text Destination Port:
+			 *
+			 * 1. Provided by the RTP engine.
+			 */
+			tdest->sin_addr = media_address.sin_addr.s_addr ? media_address.sin_addr :
+						(tsin->sin_addr.s_addr ? tsin->sin_addr : p->ourip.sin_addr);
 			tdest->sin_port = tsin->sin_port;
 		}
 	}
@@ -9235,6 +9271,7 @@ static int transmit_response_with_sdp(struct sip_pvt *p, const char *msg, const
 			ast_debug(1, "Setting framing from config on incoming call\n");
 			ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(p->rtp), p->rtp, &p->prefs);
 		}
+		ast_rtp_instance_activate(p->rtp);
 		try_suggested_sip_codec(p);
 		if (p->t38.state == T38_ENABLED) {
 			add_sdp(&resp, p, oldsdp, TRUE, TRUE);
@@ -16671,6 +16708,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
 				/* Queue a progress frame only if we have SDP in 180 or 182 */
 				ast_queue_control(p->owner, AST_CONTROL_PROGRESS);
 			}
+			ast_rtp_instance_activate(p->rtp);
 		}
 		check_pendings(p);
 		break;
@@ -16708,6 +16746,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
 				/* Queue a progress frame */
 				ast_queue_control(p->owner, AST_CONTROL_PROGRESS);
 			}
+			ast_rtp_instance_activate(p->rtp);
 		} else {
 			/* Alcatel PBXs are known to send 183s with no SDP after sending
 			 * a 100 Trying response. We're just going to treat this sort of thing
@@ -16730,6 +16769,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
 					/* This 200 OK's SDP is not acceptable, so we need to ack, then hangup */
 					/* For re-invites, we try to recover */
 					ast_set_flag(&p->flags[0], SIP_PENDINGBYE);
+			ast_rtp_instance_activate(p->rtp);
 		}
 
 		if (!req->ignore && p->owner && (get_rpid(p, req) || !reinvite)) {