Index: main/manager.c
===================================================================
--- main/manager.c	(revision 216996)
+++ main/manager.c	(working copy)
@@ -354,12 +354,21 @@
 			
 				Extension to transfer to.
 			
+			
+				Extension to transfer extrachannel to (optional).
+			
 			
 				Context to transfer to.
 			
+			
+				Context to transfer extrachannel to (optional).
+			
 			
 				Priority to transfer to.
 			
+			
+				Priority to transfer extrachannel to (optional).
+			
 		
 		
 			Redirect (transfer) a call.
@@ -2963,10 +2972,13 @@
 	const char *name = astman_get_header(m, "Channel");
 	const char *name2 = astman_get_header(m, "ExtraChannel");
 	const char *exten = astman_get_header(m, "Exten");
+	const char *exten2 = astman_get_header(m, "ExtraExten");
 	const char *context = astman_get_header(m, "Context");
+	const char *context2 = astman_get_header(m, "ExtraContext");
 	const char *priority = astman_get_header(m, "Priority");
+	const char *priority2 = astman_get_header(m, "ExtraPriority");
 	struct ast_channel *chan, *chan2 = NULL;
-	int pi = 0;
+	int pi, pi2 = 0;
 	int res;
 
 	if (ast_strlen_zero(name)) {
@@ -2981,6 +2993,13 @@
 		}
 	}
 
+	if (!ast_strlen_zero(priority2) && (sscanf(priority2, "%30d", &pi2) != 1)) {
+		if ((pi2 = ast_findlabel_extension(NULL, context2, exten2, priority2, NULL)) < 1) {
+			astman_send_error(s, m, "Invalid ExtraPriority");
+			return 0;
+		}
+	}
+
 	if (!(chan = ast_channel_get_by_name(name))) {
 		char buf[256];
 		snprintf(buf, sizeof(buf), "Channel does not exist: %s", name);
@@ -3020,7 +3039,11 @@
 					ast_set_flag(chan2, AST_FLAG_BRIDGE_HANGUP_DONT); /* don't let the after-bridge code run the h-exten */
 					ast_channel_unlock(chan2);
 				}
-				res = ast_async_goto(chan2, context, exten, pi);
+				if (context2) {
+					res = ast_async_goto(chan2, context2, exten2, pi2);
+				} else {
+					res = ast_async_goto(chan2, context, exten, pi);
+				}
 			} else {
 				res = -1;
 			}