diff --git a/doc/README.variables b/doc/README.variables
index 050bd1285d9cf355724f9202fd905636d529c6d2..e84d937574715d574ddb06b53141313fda974f68 100755
--- a/doc/README.variables
+++ b/doc/README.variables
@@ -319,7 +319,7 @@ only read in the dialplan.  Writes to such variables are silently
 ignored.
 
 ${ACCOUNTCODE} 	 	* Account code (if specified)
-${BLINDTRANSFER} 	The name of the channel on the other side a blind transfer
+${BLINDTRANSFER} 	The name of the channel on the other side of a blind transfer
 ${BRIDGEPEER}	 	Bridged peer
 ${CALLERANI}	 	* Caller ANI (PRI channels)
 ${CALLERID}	 	* Caller ID
@@ -336,6 +336,10 @@ ${DNID}          	* Dialed Number Identifier
 ${EPOCH}	 	* Current unix style epoch
 ${EXTEN}	 	* Current extension
 ${ENV(VAR)}	 	* Environmental variable VAR
+${GOTO_ON_BLINDXFR}	Transfer to the specified context/extension/priority
+			after a blind transfer (use ^ characters in place of
+			| to separate context/extension/priority when setting
+			this variable from the dialplan)
 ${HANGUPCAUSE}	 	* Asterisk cause of hangup (inbound/outbound)
 ${HINT}          	* Channel hints for this extension
 ${HINTNAME}      	* Suggested Caller*ID name for this extension
diff --git a/pbx.c b/pbx.c
index 68b55e126e82e120727915687b14a793c16a0c39..2d1c42951c01e50de856c489ad2ee923b5e0c0de 100755
--- a/pbx.c
+++ b/pbx.c
@@ -6271,8 +6271,7 @@ int ast_parseable_goto(struct ast_channel *chan, const char *goto_string)
 	if (mode) 
 		ipri = chan->priority + (ipri * mode);
 
-	/* This channel is currently in the PBX */
-	ast_explicit_goto(chan, context, exten, ipri - 1);
+	ast_explicit_goto(chan, context, exten, chan->pbx ? ipri - 1 : ipri);
 	ast_cdr_update(chan);
 	return 0;
 
diff --git a/res/res_features.c b/res/res_features.c
index b177549d9f104f159b251347cced64a288dc71d4..6f404ca252fd6279131e5987c80d5060d5198815 100755
--- a/res/res_features.c
+++ b/res/res_features.c
@@ -144,6 +144,40 @@ struct ast_bridge_thread_obj
 	struct ast_channel *peer;
 };
 
+static void check_goto_on_transfer(struct ast_channel *chan) 
+{
+	struct ast_channel *xferchan;
+	char *goto_on_transfer;
+
+	goto_on_transfer = pbx_builtin_getvar_helper(chan, "GOTO_ON_BLINDXFR");
+
+	if (goto_on_transfer && !ast_strlen_zero(goto_on_transfer) && (xferchan = ast_channel_alloc(0))) {
+		char *x;
+		struct ast_frame *f;
+		
+		for (x = goto_on_transfer; x && *x; x++)
+			if (*x == '^')
+				*x = '|';
+
+		strcpy(xferchan->name, chan->name);
+		/* Make formats okay */
+		xferchan->readformat = chan->readformat;
+		xferchan->writeformat = chan->writeformat;
+		ast_channel_masquerade(xferchan, chan);
+		ast_parseable_goto(xferchan, goto_on_transfer);
+		xferchan->_state = AST_STATE_UP;
+		ast_clear_flag(xferchan, AST_FLAGS_ALL);	
+		xferchan->_softhangup = 0;
+		if ((f = ast_read(xferchan))) {
+			ast_frfree(f);
+			f = NULL;
+			ast_pbx_start(xferchan);
+		} else {
+			ast_hangup(xferchan);
+		}
+	}
+}
+
 static void *ast_bridge_call_thread(void *data) 
 {
 	struct ast_bridge_thread_obj *tobj = data;
@@ -550,6 +584,7 @@ static int builtin_blindtransfer(struct ast_channel *chan, struct ast_channel *p
 			strncpy(transferee->context, transferer_real_context, sizeof(transferee->context)-1);
 			transferee->priority = 0;
 		}
+		check_goto_on_transfer(transferer);
 		return res;
 	} else {
 		if (option_verbose > 2)