diff --git a/CREDITS b/CREDITS
index ffeb395392a065344a6766025fb44b3c9e43c08a..ade729ebe04fbb0fa050a99a7e91beb441c09d6a 100755
--- a/CREDITS
+++ b/CREDITS
@@ -47,6 +47,9 @@ Tilghman Lesher - Route lookup code, gotoiftime application, and various
        other patches.  http://asterisk.drunkcoder.com/
 Jayson Vantuyl - Manager protocol changes, various other bugs.
 	jvantuyl@computingedge.net
+Thorsten Lockert - OpenBSD, FreeBSD ports, making MacOS X port run on 10.3,
+	dialplan include verification, route lookup on OpenBSD, various other
+	bugs. tholo@sigmasoft.com
 
 === OTHER CONTRIBUTIONS ===
 John Todd - Monkey sounds and associated teletorture prompt
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 1c3ab73b2f349dbc25b3295b5293150f0106becf..ee004f42971bc732a4f4371b95e0ac0052c92ef6 100755
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -609,10 +609,8 @@ static int wait_our_turn(struct queue_ent *qe)
 	struct queue_ent *ch;
 	int res = 0;
 	for (;;) {
-		/* Atomically read the parent head */
-		ast_mutex_lock(&qe->parent->lock);
+		/* Atomically read the parent head -- does not need a lock */
 		ch = qe->parent->head;
-		ast_mutex_unlock(&qe->parent->lock);
 		/* If we are now at the top of the head, break out */
 		if (qe->parent->head == qe)
 			break;
@@ -722,6 +720,7 @@ static int try_calling(struct queue_ent *qe, char *options, char *announceoverri
 		/* Get a technology/[device:]number pair */
 		tmp = malloc(sizeof(struct localuser));
 		if (!tmp) {
+			ast_mutex_unlock(&qe->parent->lock);
 			ast_log(LOG_WARNING, "Out of memory\n");
 			goto out;
 		}
@@ -859,11 +858,8 @@ out:
 
 static int wait_a_bit(struct queue_ent *qe)
 {
-	int retrywait;
-	/* Hold the lock while we setup the outgoing calls */
-	ast_mutex_lock(&qe->parent->lock);
-	retrywait = qe->parent->retry * 1000;
-	ast_mutex_unlock(&qe->parent->lock);
+	/* Don't need to hold the lock while we setup the outgoing calls */
+	int retrywait = qe->parent->retry * 1000;
 	return ast_waitfordigit(qe->chan, retrywait);
 }
 
@@ -1203,6 +1199,7 @@ static void reload_queues(void)
 	/* Mark all queues as dead for the moment */
 	q = queues;
 	while(q) {
+		q->dead = 1;
 		q = q->next;
 	}
 	/* Chug through config file */
@@ -1349,8 +1346,10 @@ static int queues_show(int fd, int argc, char **argv)
 	time(&now);
 	if (argc != 2)
 		return RESULT_SHOWUSAGE;
+	ast_mutex_lock(&qlock);
 	q = queues;
 	if (!q) {	
+		ast_mutex_unlock(&qlock);
 		ast_cli(fd, "No queues.\n");
 		return RESULT_SUCCESS;
 	}
@@ -1391,6 +1390,7 @@ static int queues_show(int fd, int argc, char **argv)
 		ast_mutex_unlock(&q->lock);
 		q = q->next;
 	}
+	ast_mutex_unlock(&qlock);
 	return RESULT_SUCCESS;
 }
 
@@ -1413,6 +1413,7 @@ static int manager_queues_status( struct mansession *s, struct message *m )
 	struct queue_ent *qe;
 	astman_send_ack(s, m, "Queue status will follow");
 	time(&now);
+	ast_mutex_lock(&qlock);
 	q = queues;
 	if (id && &id) {
 		snprintf(idText,256,"ActionID: %s\r\n",id);
@@ -1445,6 +1446,7 @@ static int manager_queues_status( struct mansession *s, struct message *m )
 		ast_mutex_unlock(&q->lock);
 		q = q->next;
 	}
+	ast_mutex_unlock(&qlock);
 	return RESULT_SUCCESS;
 }
 
diff --git a/channels/chan_agent.c b/channels/chan_agent.c
index 7421f5d53fd1b31154ec21e1367a9d531d195d86..593de03cf88dee5601e289b402afb55d388c3802 100755
--- a/channels/chan_agent.c
+++ b/channels/chan_agent.c
@@ -1154,10 +1154,14 @@ static int __login_exec(struct ast_channel *chan, void *data, int callbackmode)
 						if( options )
 							if( strchr( options, 's' ) )
 								play_announcement = 0;
+						ast_mutex_unlock(&p->lock);
+						ast_mutex_unlock(&agentlock);
 						if( !res && play_announcement )
 							res = ast_streamfile(chan, filename, chan->language);
 						if (!res)
 							ast_waitstream(chan, "");
+						ast_mutex_lock(&agentlock);
+						ast_mutex_lock(&p->lock);
 						if (!res) {
 							res = ast_set_read_format(chan, ast_best_codec(chan->nativeformats));
 							if (res)
@@ -1173,6 +1177,7 @@ static int __login_exec(struct ast_channel *chan, void *data, int callbackmode)
 							res = -1;
 						if (callbackmode && !res) {
 							/* Just say goodbye and be done with it */
+							ast_mutex_unlock(&agentlock);
 							if (!res)
 								res = ast_safe_sleep(chan, 500);
 							res = ast_streamfile(chan, "vm-goodbye", chan->language);
@@ -1181,7 +1186,6 @@ static int __login_exec(struct ast_channel *chan, void *data, int callbackmode)
 							if (!res)
 								res = ast_safe_sleep(chan, 1000);
 							ast_mutex_unlock(&p->lock);
-							ast_mutex_unlock(&agentlock);
 						} else if (!res) {
 #ifdef HONOR_MUSIC_CLASS
 							/* check if the moh class was changed with setmusiconhold */