diff --git a/channel.c b/channel.c
index 8fe3ee538a2abc949e9c113464062d5c2394bfd7..b0894e3a6417297a665b466b3b200143c6bb1137 100755
--- a/channel.c
+++ b/channel.c
@@ -1966,6 +1966,14 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr)
 				res = 0;
 		}
 	}
+
+	/* It's possible this is a translated frame */
+	if (f && f->frametype == AST_FRAME_DTMF) {
+		ast_log(LOG_DTMF, "%s : %c\n", chan->name, f->subclass);
+	} else if (fr->frametype == AST_FRAME_DTMF) {
+		ast_log(LOG_DTMF, "%s : %c\n", chan->name, fr->subclass);
+	}
+
 	if (f && (f != fr))
 		ast_frfree(f);
 	ast_clear_flag(chan, AST_FLAG_BLOCKING);
diff --git a/configs/logger.conf.sample b/configs/logger.conf.sample
index fc000a1039c3eca904172e1b241610f3ac19e850..008554271a0e988eb08b4e1a8b86b5bd8af1f3b2 100755
--- a/configs/logger.conf.sample
+++ b/configs/logger.conf.sample
@@ -40,6 +40,7 @@
 ;    warning
 ;    error
 ;    verbose
+;    dtmf
 ;
 ; Special filename "console" represents the system console
 ;
diff --git a/include/asterisk/logger.h b/include/asterisk/logger.h
index 2e8a786b58812907566ac9512ec407b24e150202..c94fd96d262233f07a31d0b6a47c701f184e9afa 100755
--- a/include/asterisk/logger.h
+++ b/include/asterisk/logger.h
@@ -99,6 +99,12 @@ extern void ast_console_puts(const char *string);
 #define __LOG_VERBOSE  5
 #define LOG_VERBOSE    __LOG_VERBOSE, _A_
 
+#ifdef LOG_DTMF
+#undef LOG_DTMF
+#endif
+#define __LOG_DTMF  6
+#define LOG_DTMF    __LOG_DTMF, _A_
+
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif
diff --git a/logger.c b/logger.c
index 8e5cdbf167dfb0bcac7b2154b4d6164b951f90e6..be3b8c1769a6b93b5dec8011d1f89557bee27bc8 100755
--- a/logger.c
+++ b/logger.c
@@ -44,6 +44,7 @@ static int syslog_level_map[] = {
 	LOG_NOTICE,
 	LOG_WARNING,
 	LOG_ERR,
+	LOG_DEBUG,
 	LOG_DEBUG
 };
 
@@ -107,7 +108,8 @@ static char *levels[] = {
 	"NOTICE",
 	"WARNING",
 	"ERROR",
-	"VERBOSE"
+	"VERBOSE",
+	"DTMF"
 };
 
 static int colors[] = {
@@ -116,7 +118,8 @@ static int colors[] = {
 	COLOR_YELLOW,
 	COLOR_BRRED,
 	COLOR_RED,
-	COLOR_GREEN
+	COLOR_GREEN,
+	COLOR_BRGREEN
 };
 
 static int make_components(char *s, int lineno)
@@ -141,6 +144,8 @@ static int make_components(char *s, int lineno)
 			res |= (1 << __LOG_DEBUG);
 		else if (!strcasecmp(w, "verbose"))
 			res |= (1 << __LOG_VERBOSE);
+		else if (!strcasecmp(w, "dtmf"))
+			res |= (1 << __LOG_DTMF);
 		else {
 			fprintf(stderr, "Logfile Warning: Unknown keyword '%s' at line %d of logger.conf\n", w, lineno);
 		}
@@ -495,6 +500,8 @@ static int handle_logger_show_channels(int fd, int argc, char *argv[])
 		ast_cli(fd, " - ");
 		if (chan->logmask & (1 << __LOG_DEBUG)) 
 			ast_cli(fd, "Debug ");
+		if (chan->logmask & (1 << __LOG_DTMF)) 
+			ast_cli(fd, "DTMF ");
 		if (chan->logmask & (1 << __LOG_VERBOSE)) 
 			ast_cli(fd, "Verbose ");
 		if (chan->logmask & (1 << __LOG_WARNING)) 
@@ -653,6 +660,9 @@ static void ast_log_vsyslog(int level, const char *file, int line, const char *f
 	if (level == __LOG_VERBOSE) {
 		snprintf(buf, sizeof(buf), "VERBOSE[%ld]: ", (long)GETTID());
 		level = __LOG_DEBUG;
+	} else if (level == __LOG_DTMF) {
+		snprintf(buf, sizeof(buf), "DTMF[%ld]: ", (long)GETTID());
+		level = __LOG_DEBUG;
 	} else {
 		snprintf(buf, sizeof(buf), "%s[%ld]: %s:%d in %s: ",
 			 levels[level], (long)GETTID(), file, line, function);