diff --git a/main/channel.c b/main/channel.c
index c93d6ade9e02d3cbcda0bea583a738116e570fc1..8acee81f9d9c9c4a9811c0422b924310a8bf54c7 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -2543,27 +2543,27 @@ int ast_senddigit_begin(struct ast_channel *chan, char digit)
 		res = chan->tech->send_digit_begin(chan, digit);
 
 	if (res) {
-		/*
-		 * Device does not support DTMF tones, lets fake
-		 * it by doing our own generation. (PM2002)
-		 */
+		/* Device does not support DTMF tones, lets fake
+		 * it by doing our own generation. */
 		static const char* dtmf_tones[] = {
-			"!941+1336/100,!0/100",	/* 0 */
-			"!697+1209/100,!0/100",	/* 1 */
-			"!697+1336/100,!0/100",	/* 2 */
-			"!697+1477/100,!0/100",	/* 3 */
-			"!770+1209/100,!0/100",	/* 4 */
-			"!770+1336/100,!0/100",	/* 5 */
-			"!770+1477/100,!0/100",	/* 6 */
-			"!852+1209/100,!0/100",	/* 7 */
-			"!852+1336/100,!0/100",	/* 8 */
-			"!852+1477/100,!0/100",	/* 9 */
-			"!697+1633/100,!0/100",	/* A */
-			"!770+1633/100,!0/100",	/* B */
-			"!852+1633/100,!0/100",	/* C */
-			"!941+1633/100,!0/100",	/* D */
-			"!941+1209/100,!0/100",	/* * */
-			"!941+1477/100,!0/100" };	/* # */
+			"941+1336", /* 0 */
+			"697+1209", /* 1 */
+			"697+1336", /* 2 */
+			"697+1477", /* 3 */
+			"770+1209", /* 4 */
+			"770+1336", /* 5 */
+			"770+1477", /* 6 */
+			"852+1209", /* 7 */
+			"852+1336", /* 8 */
+			"852+1477", /* 9 */
+			"697+1633", /* A */
+			"770+1633", /* B */
+			"852+1633", /* C */
+			"941+1633", /* D */
+			"941+1209", /* * */
+			"941+1477"  /* # */
+		};
+
 		if (digit >= '0' && digit <='9')
 			ast_playtones_start(chan, 0, dtmf_tones[digit-'0'], 0);
 		else if (digit >= 'A' && digit <= 'D')
@@ -2657,6 +2657,17 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr)
 		if (ast_test_flag(chan, AST_FLAG_WRITE_INT))
 			ast_deactivate_generator(chan);
 		else {
+			if (fr->frametype == AST_FRAME_DTMF_END) {
+				/* There is a generator running while we're in the middle of a digit.
+				 * It's probably inband DTMF, so go ahead and pass it so it can
+				 * stop the generator */
+				ast_clear_flag(chan, AST_FLAG_BLOCKING);
+				ast_channel_unlock(chan);
+				res = ast_senddigit_end(chan, fr->subclass, fr->len);
+				ast_channel_lock(chan);
+				CHECK_BLOCKING(chan);
+			}
+
 			res = 0;	/* XXX explain, why 0 ? */
 			goto done;
 		}