diff --git a/channel.c b/channel.c
index 72540bc53f6a767cfcccbfc396ded1154b695f7d..9e6495533c546c623a13b5a903a43334775a735b 100755
--- a/channel.c
+++ b/channel.c
@@ -1929,7 +1929,7 @@ static int ast_do_masquerade(struct ast_channel *original)
 	int x,i;
 	int res=0;
 	char *tmp;
-	void *tmpv;
+	struct ast_var_t *varptr;
 	struct ast_frame *cur, *prev;
 	struct ast_channel_pvt *p;
 	struct ast_channel *clone = original->masq;
@@ -2037,10 +2037,19 @@ static int ast_do_masquerade(struct ast_channel *original)
 	for (x=0;x<AST_MAX_FDS;x++) {
 		original->fds[x] = clone->fds[x];
 	}
-	/* Move the variables */
-	tmpv = original->varshead.first;
+	/* Append variables from clone channel into original channel */
+	/* XXX Is this always correct?  We have to in order to keep MACROS working XXX */
+	varptr = original->varshead.first;
+	if (varptr) {
+		while(varptr->entries.next) {
+			varptr = varptr->entries.next;
+		}
+		varptr->entries.next = clone->varshead.first;
+	} else {
+		original->varshead.first = clone->varshead.first;
+	}
+	clone->varshead.first = NULL;
 	original->varshead.first = clone->varshead.first;
-	clone->varshead.first = tmpv;
 	/* Presense of ADSI capable CPE follows clone */
 	original->adsicpe = clone->adsicpe;
 	/* Bridge remains the same */