diff --git a/apps/app_queue.c b/apps/app_queue.c
index 41e787be570f1f5516067b26622f04053d874ee9..e2f0295caafa7fffd9abd207e9043fe609179776 100755
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -244,7 +244,7 @@ ast_log(LOG_NOTICE, "Queue '%s' Join, Channel '%s', Position '%d'\n", q->name, q
 	return res;
 }
 
-static void free_members(struct ast_call_queue *q)
+static void free_members(struct ast_call_queue *q, int all)
 {
 	/* Free non-dynamic members */
 	struct member *curm, *next, *prev;
@@ -252,7 +252,7 @@ static void free_members(struct ast_call_queue *q)
 	prev = NULL;
 	while(curm) {
 		next = curm->next;
-		if (!curm->dynamic) {
+		if (all || !curm->dynamic) {
 			if (prev)
 				prev->next = next;
 			else
@@ -281,7 +281,7 @@ static void destroy_queue(struct ast_call_queue *q)
 		cur = cur->next;
 	}
 	ast_mutex_unlock(&qlock);
-	free_members(q);
+	free_members(q, 1);
 	free(q);
 }
 
@@ -1237,11 +1237,16 @@ static void reload_queues(void)
 				q->retry = 0;
 				q->timeout = -1;
 				q->maxlen = 0;
-				free_members(q);
+				free_members(q, 0);
 				strcpy(q->moh, "");
 				strcpy(q->announce, "");
 				strcpy(q->context, "");
-				prev = NULL;
+				prev = q->members;
+				if (prev) {
+					/* find the end of any dynamic members */
+					while(prev->next)
+						prev = prev->next;
+				}
 				var = ast_variable_browse(cfg, cat);
 				while(var) {
 					if (!strcasecmp(var->name, "member")) {