diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 4189b8bd7a4322e86bf5323637ab50a173bf1992..f8ae0961ae9f7d7b1dce75110071dccd7e3e0c09 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -3442,7 +3442,7 @@ static int add_sdp(struct sip_request *resp, struct sip_pvt *p)
 				snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(0, x));
 				strncat(a, costr, sizeof(a) - strlen(a) - 1);
 				if (x == AST_RTP_DTMF) {
-				  /* Indicate we support DTMF...  Not sure about 16, but MSN supports it so dang it, we will too... */
+				  /* Indicate we support DTMF and FLASH... */
 				  snprintf(costr, sizeof costr, "a=fmtp:%d 0-16\r\n",
 					   codec);
 				  strncat(a, costr, sizeof(a) - strlen(a) - 1);
diff --git a/rtp.c b/rtp.c
index d79309312ba3e0c93b273ec6fffe959f23762595..55d79ca305cb7b142dfcfc2a0a2ee833d9baa20f 100755
--- a/rtp.c
+++ b/rtp.c
@@ -192,8 +192,13 @@ static struct ast_frame *send_dtmf(struct ast_rtp *rtp)
 		return &null_frame;
 	}
 	ast_log(LOG_DEBUG, "Sending dtmf: %d (%c), at %s\n", rtp->resp, rtp->resp, ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr));
-	rtp->f.frametype = AST_FRAME_DTMF;
-	rtp->f.subclass = rtp->resp;
+	if (rtp->resp == 'X') {
+		rtp->f.frametype = AST_FRAME_CONTROL;
+		rtp->f.subclass = AST_CONTROL_FLASH;
+	} else {
+		rtp->f.frametype = AST_FRAME_DTMF;
+		rtp->f.subclass = rtp->resp;
+	}
 	rtp->f.datalen = 0;
 	rtp->f.samples = 0;
 	rtp->f.mallocd = 0;
@@ -235,6 +240,8 @@ static struct ast_frame *process_cisco_dtmf(struct ast_rtp *rtp, unsigned char *
 		resp = '#';
 	} else if (event < 16) {
 		resp = 'A' + (event - 12);
+	} else if (event < 17) {
+		resp = 'X';
 	}
 	if (rtp->resp && (rtp->resp != resp)) {
 		f = send_dtmf(rtp);
@@ -269,6 +276,8 @@ static struct ast_frame *process_rfc2833(struct ast_rtp *rtp, unsigned char *dat
 		resp = '#';
 	} else if (event < 16) {
 		resp = 'A' + (event - 12);
+	} else if (event < 17) {
+		resp = 'X';
 	}
 	if (rtp->resp && (rtp->resp != resp)) {
 		f = send_dtmf(rtp);