diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 1aeeb2888cf20553887d866961a4680260121ae7..94c35a441a0283b23c1a584eec53207476815315 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -182,6 +182,7 @@ static struct sip_pvt {
 	int tag;							/* Another random number */
 	int nat;							/* Whether to try to support NAT */
 	struct sockaddr_in sa;				/* Our peer */
+	struct sockaddr_in redirip;			/* Where our RTP should be going if not to us */
 	struct sockaddr_in recv;			/* Received as */
 	struct in_addr ourip;				/* Our IP */
 	struct ast_channel *owner;			/* Who owns us */
@@ -2163,7 +2164,10 @@ static int add_sdp(struct sip_request *resp, struct sip_pvt *p, struct ast_rtp *
 		return -1;
 	}
 	ast_rtp_get_us(p->rtp, &sin);
-	if (rtp) {
+	if (p->redirip.sin_addr.s_addr) {
+		dest.sin_port = p->redirip.sin_port;
+		dest.sin_addr = p->redirip.sin_addr;
+	} else if (rtp) {
 		ast_rtp_get_peer(rtp, &dest);
 	} else {
 		dest.sin_addr = p->ourip;
@@ -5297,6 +5301,10 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp)
 	struct sip_pvt *p;
 	p = chan->pvt->pvt;
 	if (p) {
+		if (rtp)
+			ast_rtp_get_peer(rtp, &p->redirip);
+		else
+			memset(&p->redirip, 0, sizeof(p->redirip));
 		transmit_reinvite_with_sdp(p, rtp);
 		p->outgoing = 1;
 		return 0;