diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 987538f53b17c9443fe860d90eb666f29b717705..a93d6c00ad56bf948c0d01235eb965cd1713c234 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -3105,8 +3105,10 @@ static int reqprep(struct sip_request *req, struct sip_pvt *p, char *msg, int se
 		else /* Some implementations (e.g. Uniden UIP200) can't handle rport being in the message!! */
 			snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", ast_inet_ntoa(iabuf, sizeof(iabuf), p->ourip), ourport, p->branch);
 	}
-
-	if (!ast_strlen_zero(p->uri)) {
+	if (!strcasecmp(msg, "CANCEL")) {
+		/* MUST use original URI */
+		c = p->initreq.rlPart2;
+	} else if (!ast_strlen_zero(p->uri)) {
 		c = p->uri;
 	} else {
 		if (p->outgoing)