--- res_features.c.orig	2004-09-26 15:47:01.000000000 -0500
+++ res_features.c	2004-10-22 18:58:20.000000000 -0500
@@ -299,6 +299,14 @@
 	struct ast_channel *transferee;
 	struct timeval start, end;
 	char *transferer_real_context;
+
+/* BEGIN PATCH FOR DOUBLE-HASH */
+       int ms;
+       int result;
+       int sip_chan;
+       struct ast_frame *ft;
+/* END PATCH FOR DOUBLE-HASH */
+
 	int allowdisconnect_in,allowdisconnect_out,allowredirect_in,allowredirect_out;
 	char *monitor_exec;
 
@@ -407,6 +415,36 @@
 					transferer = chan;
 					transferee = peer;
 				}
+
+/* BEGIN PATCH FOR DOUBLE-HASH */
+               sip_chan = ( !strcmp(transferer->type,"SIP") || !strcmp(transferer->type, "sip") );
+               result = 0;
+               if( sip_chan) {
+                       ms = 1000; /* ms */
+                       ft = 0;
+                       while(ms ) {
+                               ms = ast_waitfor(transferer, ms);
+                               if (ms > 0) {
+                                       ft = ast_read(transferer);
+                                       if (ft) {      /* Got second keypress */
+                                               if (ft->frametype == AST_FRAME_DTMF) {
+                                                       result = ft->subclass;
+                                                       if( result != '#') {
+                                                               ast_write(transferee,f);
+                                                               ast_write(transferee,ft);
+                                                       }
+                                                       ast_frfree(ft);
+                                                       break;
+                                               } else
+                                                       ast_frfree(ft);
+                                       }
+                               } else
+                                       ast_write( transferee, f);
+                       }
+               }
+       if( !sip_chan || result == '#') {
+/* END PATCH FOR DOUBLE-HASH */
+
 				if (!(transferer_real_context=pbx_builtin_getvar_helper(transferee, "TRANSFER_CONTEXT")) &&
 				   !(transferer_real_context=pbx_builtin_getvar_helper(transferer, "TRANSFER_CONTEXT"))) {
 					/* Use the non-macro context to transfer the call */
@@ -482,6 +520,10 @@
 				} else if (ast_exists_extension(transferee, transferer_real_context, newext, 1, transferer->callerid)) {
 					ast_moh_stop(transferee);
 					res=ast_autoservice_stop(transferee);
+/* BEGIN PATCH FOR DOUBLE-HASH */
+                                       ast_streamfile(transferer, "auth-thankyou", transferer->language);
+/* END PATCH FOR DOUBLE-HASH */
+
 					if (!transferee->pbx) {
 						/* Doh!  Use our handy async_goto funcitons */
 						if (option_verbose > 2) 
@@ -489,12 +531,22 @@
 								,transferee->name, newext, transferer_real_context);
 						if (ast_async_goto(transferee, transferer_real_context, newext, 1))
 							ast_log(LOG_WARNING, "Async goto fialed :(\n");
+
+/* BEGIN PATCH FOR DOUBLE-HASH */
+                                               ast_waitstream(transferer, 1000);
+/* END PATCH FOR DOUBLE-HASH */
+
 						res = -1;
 					} else {
 						/* Set the channel's new extension, since it exists, using transferer context */
 						strncpy(transferee->exten, newext, sizeof(transferee->exten)-1);
 						strncpy(transferee->context, transferer_real_context, sizeof(transferee->context)-1);
 						transferee->priority = 0;
+
+/* BEGIN PATCH FOR DOUBLE-HASH */
+                                               ast_waitstream(transferer, 1000);
+/* END PATCH FOR DOUBLE-HASH */
+
 						ast_frfree(f);
 					}
 					break;
@@ -516,6 +568,11 @@
 					if (option_verbose > 1)
 						ast_verbose(VERBOSE_PREFIX_2 "Hungup during autoservice stop on '%s'\n", transferee->name);
 				}
+
+/* BEGIN PATCH FOR DOUBLE-HASH */
+                          }
+/* END PATCH FOR DOUBLE-HASH */
+
 			} else {
             if (f && (f->frametype == AST_FRAME_DTMF)) {
                   if (who == peer)
