diff --git a/CHANGES b/CHANGES
index 066275c0a94ac099f19b450885a19fd8cc2cbc83..edec34511e22d4b1f292dc1b22048710b7fedb9f 100755
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,4 @@
+ -- Add ability to purge callers from queue if no agents are logged in
  -- Fix inband PRI indication detection
  -- Fix for MGCP - always request digits if no RTP stream
  -- Fixed seg fault for ast_control_streamfile
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 542ede24635158ce97876d04eca239bfa17fa7eb..aa54749b558c27d4cd8119a04634be9e0b26d5a2 100755
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -226,6 +226,7 @@ struct ast_call_queue {
 	int wrapped;			/* Round Robin - wrapped around? */
 	int joinempty;			/* Do we care if the queue has no members? */
 	int eventwhencalled;			/* Generate an event when the agent is called (before pickup) */
+	int leavewhenempty;		/* If all agents leave the queue, remove callers from the queue */
 
 	struct member *members;		/* Member channels to be tried */
 	struct queue_ent *head;		/* Start of the actual queue */
@@ -912,6 +913,12 @@ static int wait_our_turn(struct queue_ent *qe, int ringing)
 			break;
 		}
 
+		/* leave the queue if no agents, if enabled */
+		if (!(qe->parent->members) && qe->parent->leavewhenempty) {
+			leave_queue(qe);
+			break;
+		}
+
 		/* Make a position announcement, if enabled */
 		if (qe->parent->announcefrequency && !ringing)
 			say_position(qe);
@@ -1626,7 +1633,7 @@ check_turns:
 				/* This is the wait loop for the head caller*/
 				/* To exit, they may get their call answered; */
 				/* they may dial a digit from the queue context; */
-				/* or, they may may timeout. */
+				/* or, they may timeout. */
 
 				/* Leave if we have exceeded our queuetimeout */
 				if (qe.queuetimeout && ( (time(NULL) - qe.start) >= qe.queuetimeout) ) {
@@ -1634,6 +1641,12 @@ check_turns:
 					break;
 				}
 
+				/* leave the queue if no agents, if enabled */
+				if (!((qe.parent)->members) && (qe.parent)->leavewhenempty) {
+					leave_queue(&qe);
+					break;
+				}
+
 				/* Make a position announcement, if enabled */
 				if (qe.parent->announcefrequency && !ringing)
 					say_position(&qe);
@@ -1872,6 +1885,8 @@ static void reload_queues(void)
 						}
 					} else if (!strcasecmp(var->name, "joinempty")) {
 						q->joinempty = ast_true(var->value);
+					} else if (!strcasecmp(var->name, "leavewhenempty")) {
+						q->leavewhenempty = ast_true(var->value);
 					} else if (!strcasecmp(var->name, "eventwhencalled")) {
 						q->eventwhencalled = ast_true(var->value);
 					} else {
diff --git a/configs/queues.conf.sample b/configs/queues.conf.sample
index 7ba488ad38d975c7e61fff32080304d0ee0c714d..32e2c7fd18041811f31c1092d2d9043a0d433dfc 100755
--- a/configs/queues.conf.sample
+++ b/configs/queues.conf.sample
@@ -113,6 +113,10 @@
 ;
 ; joinempty = yes
 ;
+; If you wish to remove callers from the queue if there are no agents present, set this to yes
+;
+; leavewhenempty = yes
+;
 ; Asterisk can generate AgentCalled events when an agent is rung, if this is turned on
 ; (may generate a LOT of extra manager events)
 ;