--- app_meetme-orig.c	2007-08-13 12:34:41.000000000 -0400
+++ app_meetme.c	2007-08-13 13:18:21.000000000 -0400
@@ -85,6 +85,7 @@
 "      'D' -- dynamically add conference, prompting for a PIN\n"
 "      'e' -- select an empty conference\n"
 "      'E' -- select an empty pinless conference\n"
+"      'F' -- Pass DTMF through the conference.\n"
 "      'i' -- announce user join/leave\n"
 "      'm' -- set monitor only mode (Listen only, no talking)\n"
 "      'M' -- enable music on hold when the conference has a single caller\n"
@@ -229,6 +230,7 @@
 #define CONFFLAG_EMPTY (1 << 19)
 #define CONFFLAG_EMPTYNOPIN (1 << 20)
 #define CONFFLAG_ALWAYSPROMPT (1 << 21)
+#define CONFFLAG_PASS_DTMF (1 << 22)
 
 enum {
 	OPT_ARG_WAITMARKED = 0,
@@ -257,6 +259,7 @@
 	AST_APP_OPTION('e', CONFFLAG_EMPTY ),
 	AST_APP_OPTION('E', CONFFLAG_EMPTYNOPIN ),
 	AST_APP_OPTION('P', CONFFLAG_ALWAYSPROMPT ),
+	AST_APP_OPTION('F', CONFFLAG_PASS_DTMF ),
 });
 
 static char *istalking(int x)
@@ -797,6 +800,18 @@
 	return 0;
 }
 
+static void conf_queue_dtmf(const struct ast_conference *conf,
+	const struct ast_conf_user *sender, struct ast_frame *f)
+{
+	struct ast_conf_user *user;
+
+	AST_LIST_TRAVERSE(&conf->userlist, user, list) {
+		if (user == sender)
+			continue;
+		if (ast_write(user->chan, f) < 0)
+			ast_log(LOG_WARNING, "Error writing frame to channel %s\n", user->chan->name);
+	}
+}
 /* Decrement reference counts, as incremented by find_conf() */
 static int dispose_conf(struct ast_conference *conf)
 {
@@ -1363,6 +1378,9 @@
 				} else if ((f->frametype == AST_FRAME_DTMF) && (confflags & CONFFLAG_EXIT_CONTEXT)) {
 					char tmp[2];
 
+					if (confflags & CONFFLAG_PASS_DTMF)
+						conf_queue_dtmf(conf, user, f);
+
 					tmp[0] = f->subclass;
 					tmp[1] = '\0';
 					if (!ast_goto_if_exists(chan, exitcontext, tmp, 1)) {
@@ -1372,10 +1390,14 @@
 					} else if (option_debug > 1)
 						ast_log(LOG_DEBUG, "Exit by single digit did not work in meetme. Extension %s does not exist in context %s\n", tmp, exitcontext);
 				} else if ((f->frametype == AST_FRAME_DTMF) && (f->subclass == '#') && (confflags & CONFFLAG_POUNDEXIT)) {
+					if (confflags & CONFFLAG_PASS_DTMF)
+						conf_queue_dtmf(conf, user, f);
 					ret = 0;
 					ast_frfree(f);
 					break;
 				} else if (((f->frametype == AST_FRAME_DTMF) && (f->subclass == '*') && (confflags & CONFFLAG_STARMENU)) || ((f->frametype == AST_FRAME_DTMF) && menu_active)) {
+					if (confflags & CONFFLAG_PASS_DTMF)
+						conf_queue_dtmf(conf, user, f);
 					if (ioctl(fd, ZT_SETCONF, &ztc_empty)) {
 						ast_log(LOG_WARNING, "Error setting conference\n");
 						close(fd);
@@ -1542,6 +1564,8 @@
 					}
 
 					conf_flush(fd, chan);
+				} else if ((f->frametype == AST_FRAME_DTMF) && confflags & CONFFLAG_PASS_DTMF) {
+					conf_queue_dtmf(conf, user, f);
 				} else if (option_debug) {
 					ast_log(LOG_DEBUG,
 						"Got unrecognized frame on channel %s, f->frametype=%d,f->subclass=%d\n",

