diff --git a/apps/app_queue.c b/apps/app_queue.c
index fe3373b7add9822296a58f906484ad1aa87f0bda..7c7d65ff448a79d2802d46a219c44bc651ce3167 100755
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -153,27 +153,27 @@ LOCAL_USER_DECL;
 
 struct queue_ent {
 	struct ast_call_queue *parent;	/* What queue is our parent */
-	char moh[80];				/* Name of musiconhold to be used */
+	char moh[80];			/* Name of musiconhold to be used */
 	char announce[80];		/* Announcement to play for member when call is answered */
 	char context[80];		/* Context when user exits queue */
-	int pos;					/* Where we are in the queue */
+	int pos;			/* Where we are in the queue */
 	int last_pos_said;              /* Last position we told the user */
 	time_t last_pos;                /* Last time we told the user their position */
-	int opos;					/* Where we started in the queue */
-	int handled;				/* Whether our call was handled */
-	time_t start;				/* When we started holding */
+	int opos;			/* Where we started in the queue */
+	int handled;			/* Whether our call was handled */
+	time_t start;			/* When we started holding */
 	int queuetimeout;               /* How many seconds before timing out of queue */
 	struct ast_channel *chan;	/* Our channel */
 	struct queue_ent *next;		/* The next queue entry */
 };
 
 struct member {
-	char tech[80];				/* Technology */
-	char loc[256];				/* Location */
-	int penalty;				/* Are we a last resort? */
+	char tech[80];			/* Technology */
+	char loc[256];			/* Location */
+	int penalty;			/* Are we a last resort? */
 	int calls;
-	int dynamic;				/* Are we dynamically added? */
-	time_t lastcall;	/* When last successful call was hungup */
+	int dynamic;			/* Are we dynamically added? */
+	time_t lastcall;		/* When last successful call was hungup */
 	struct member *next;		/* Next member */
 };
 
@@ -192,6 +192,7 @@ struct ast_call_queue {
 	int servicelevel;               /* seconds setting for servicelevel*/
 	int callscompletedinsl;         /* Number of queue calls answererd with servicelevel*/
 	char monfmt[8];                 /* Format to use when recording calls */
+	int monjoin;                    /* Should we join the two files when we are done with the call */
 	char sound_next[80];            /* Sound file: "Your call is now first in line" (def. queue-youarenext) */
 	char sound_thereare[80];        /* Sound file: "There are currently" (def. queue-thereare) */
 	char sound_calls[80];           /* Sound file: "calls waiting to speak to a representative." (def. queue-callswaiting)*/
@@ -199,20 +200,20 @@ struct ast_call_queue {
 	char sound_minutes[80];         /* Sound file: "minutes." (def. queue-minutes) */
 	char sound_thanks[80];          /* Sound file: "Thank you for your patience." (def. queue-thankyou) */
 
-	int count;				/* How many entries are in the queue */
-	int maxlen;				/* Max number of entries in queue */
+	int count;			/* How many entries are in the queue */
+	int maxlen;			/* Max number of entries in queue */
 
-	int dead;				/* Whether this queue is dead or not */
-	int retry;				/* Retry calling everyone after this amount of time */
+	int dead;			/* Whether this queue is dead or not */
+	int retry;			/* Retry calling everyone after this amount of time */
 	int timeout;			/* How long to wait for an answer */
 	
 	/* Queue strategy things */
 	
-	int rrpos;				/* Round Robin - position */
+	int rrpos;			/* Round Robin - position */
 	int wrapped;			/* Round Robin - wrapped around? */
 
-	struct member *members;	/* Member channels to be tried */
-	struct queue_ent *head;	/* Start of the actual queue */
+	struct member *members;		/* Member channels to be tried */
+	struct queue_ent *head;		/* Start of the actual queue */
 	struct ast_call_queue *next;	/* Next call queue */
 };
 
@@ -905,6 +906,7 @@ static int try_calling(struct queue_ent *qe, char *options, char *announceoverri
 	char oldcontext[AST_MAX_EXTENSION]="";
 	char queuename[256]="";
 	char *newnum;
+	char *monitorfilename;
 	struct ast_channel *peer;
 	struct localuser *lpeer;
 	int res = 0, bridge = 0;
@@ -1063,7 +1065,15 @@ static int try_calling(struct queue_ent *qe, char *options, char *announceoverri
 		}
 		/* Begin Monitoring */
 		if (qe->parent->monfmt && *qe->parent->monfmt) {
-			ast_monitor_start( peer, qe->parent->monfmt, qe->chan->cdr->uniqueid, 1 );
+			monitorfilename = pbx_builtin_getvar_helper( peer, "MONITOR_FILENAME");
+			if(monitorfilename) {
+				ast_monitor_start( peer, qe->parent->monfmt, monitorfilename, 1 );
+			} else {
+				ast_monitor_start( peer, qe->parent->monfmt, qe->chan->cdr->uniqueid, 1 );
+			}
+			if(qe->parent->monjoin) {
+				ast_monitor_setjoinfiles( peer, 1);
+			}
 		}
 		/* Drop out of the queue at this point, to prepare for next caller */
 		leave_queue(qe);			
@@ -1641,6 +1651,8 @@ static void reload_queues(void)
 						strncpy(q->context, var->value, sizeof(q->context) - 1);
 					} else if (!strcasecmp(var->name, "timeout")) {
 						q->timeout = atoi(var->value);
+					} else if (!strcasecmp(var->name, "monitor-join")) {
+						q->monjoin = ast_true(var->value);
 					} else if (!strcasecmp(var->name, "monitor-format")) {
 						strncpy(q->monfmt, var->value, sizeof(q->monfmt) - 1);
 					} else if (!strcasecmp(var->name, "queue-youarenext")) {
diff --git a/configs/queues.conf.sample b/configs/queues.conf.sample
index 3f9596ff4258553957deb79cd850fb91569ec540..1a59819fa7ca83fc2d2d7a8533889c9351c95812 100755
--- a/configs/queues.conf.sample
+++ b/configs/queues.conf.sample
@@ -86,8 +86,15 @@
 ; To enable monitoring, simply specify "monitor-format";  it will be disabled
 ; otherwise.
 ;
+; You can specify the monitor filename with by calling SetVar(MONITOR_FILENAME=foo)
+; Otherwise it will use ${UNIQUEID}
+;
 ; monitor-format = gsm|wav|wav49
 ;
+; If you wish to have the two files joined together when the call ends set this to yes
+;
+; monitor-join = yes
+;
 ; Each member of this call queue is listed on a separate line in
 ; the form technology/dialstring.  "member" means a normal member of a
 ; queue.  An optional penalty may be specified after a comma, such that