diff --git a/apps/app_queue.c b/apps/app_queue.c
index f2bd0128a47d6d24f2e7a82a85b6bc212e65a32d..7f748209a554caeaa6631f0227273d25871d0a0a 100755
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -156,7 +156,8 @@ static int join_queue(char *queuename, struct queue_ent *qe)
 				q->count++;
 				res = 0;
 				manager_event(EVENT_FLAG_CALL, "Join", 
-									 "Queue: %s\r\nPosition: %d\r\n", q->name, qe->pos );
+							 	"Channel: %s\r\nQueue: %s\r\nPosition: %d\r\n",
+								qe->chan->name, q->name, qe->pos );
 
 			}
 			ast_pthread_mutex_unlock(&q->lock);
@@ -212,7 +213,8 @@ static void leave_queue(struct queue_ent *qe)
 	ast_pthread_mutex_lock(&q->lock);
 	/* Take us out of the queue */
 	manager_event(EVENT_FLAG_CALL, "Leave",
-						 "Queue: %s\r\n", q->name );
+						 "Channel: %s\r\nQueue: %s\r\n", 
+						 qe->chan->name, q->name );
 	prev = NULL;
 	cur = q->head;
 	while(cur) {
diff --git a/channels/chan_agent.c b/channels/chan_agent.c
index 61f5bb29b492e4b27b506f22704d11c05d967d32..0b3d74e8491cdca64761a575faf3ddce0c93f771 100755
--- a/channels/chan_agent.c
+++ b/channels/chan_agent.c
@@ -223,21 +223,36 @@ static int agent_call(struct ast_channel *ast, char *dest, int timeout)
 	struct agent_pvt *p = ast->pvt->pvt;
 	int res = -1;
 	ast_pthread_mutex_lock(&p->lock);
+	ast_verbose( VERBOSE_PREFIX_3 "agent_call, call to agent '%s' call on '%s'\n", p->agent, p->chan->name);
+	ast_log( LOG_DEBUG, "Playing beep, lang '%s'\n", p->chan->language);
 	res = ast_streamfile(p->chan, "beep", p->chan->language);
-	if (!res)
+	ast_log( LOG_DEBUG, "Played beep, result '%d'\n", res);
+	if (!res) {
 		res = ast_waitstream(p->chan, "");
+		ast_log( LOG_DEBUG, "Waited for stream, result '%d'\n", res);
+	}
 	if (!res) {
 		res = ast_set_read_format(p->chan, ast_best_codec(p->chan->nativeformats));
+		ast_log( LOG_DEBUG, "Set read format, result '%d'\n", res);
 		if (res)
 			ast_log(LOG_WARNING, "Unable to set read format to %d\n", ast_best_codec(p->chan->nativeformats));
 	}
+	else {
+		// Agent hung-up
+		p->chan = NULL;
+	}
+
 	if (!res) {
 		ast_set_write_format(p->chan, ast_best_codec(p->chan->nativeformats));
+		ast_log( LOG_DEBUG, "Set write format, result '%d'\n", res);
 		if (res)
 			ast_log(LOG_WARNING, "Unable to set write format to %d\n", ast_best_codec(p->chan->nativeformats));
 	}
-	/* Call is immediately up */
-	ast_setstate(ast, AST_STATE_UP);
+	if( !res )
+	{
+		/* Call is immediately up */
+		ast_setstate(ast, AST_STATE_UP);
+	}
 	CLEANUP(ast,p);
 	ast_pthread_mutex_unlock(&p->lock);
 	return res;
@@ -250,9 +265,6 @@ static int agent_hangup(struct ast_channel *ast)
 	p->owner = NULL;
 	ast->pvt->pvt = NULL;
 	p->app_sleep_cond = 1;
-	ast_pthread_mutex_unlock(&p->lock);
-	/* Release ownership of the agent to other threads (presumably running the login app). */
-	ast_pthread_mutex_unlock(&p->app_lock);
 	if (p->chan) {
 		/* If they're dead, go ahead and hang up on the agent now */
 		ast_pthread_mutex_lock(&p->chan->lock);
@@ -260,9 +272,20 @@ static int agent_hangup(struct ast_channel *ast)
 			ast_softhangup(p->chan, AST_SOFTHANGUP_EXPLICIT);
 		ast_moh_start(p->chan, p->moh);
 		ast_pthread_mutex_unlock(&p->chan->lock);
-	} else if (p->dead)
+		ast_pthread_mutex_unlock(&p->lock);
+		/* Release ownership of the agent to other threads (presumably running the login app). */
+		ast_pthread_mutex_unlock(&p->app_lock);
+	} else if (p->dead) {
 		/* Go ahead and lose it */
+		ast_pthread_mutex_unlock(&p->lock);
+		/* Release ownership of the agent to other threads (presumably running the login app). */
+		ast_pthread_mutex_unlock(&p->app_lock);
 		free(p);
+	} else {
+		ast_pthread_mutex_unlock(&p->lock);
+		/* Release ownership of the agent to other threads (presumably running the login app). */
+		ast_pthread_mutex_unlock(&p->app_lock);
+	}
 
 	return 0;
 }
@@ -333,6 +356,15 @@ static struct ast_channel *agent_new(struct agent_pvt *p, int state)
 			ast_pthread_mutex_unlock(&p->lock);	/* For other thread to read the condition. */
 			ast_pthread_mutex_lock(&p->app_lock);
 			ast_pthread_mutex_lock(&p->lock);
+			if( !p->chan )
+			{
+				ast_log(LOG_WARNING, "Agent disconnected while we were connecting the call\n");
+				p->owner = NULL;
+				tmp->pvt->pvt = NULL;
+				p->app_sleep_cond = 1;
+				ast_channel_free( tmp );
+				return NULL;
+			}
 		}
 		p->owning_app = pthread_self();
 		/* After the above step, there should not be any blockers. */
@@ -486,9 +518,6 @@ static int login_exec(struct ast_channel *chan, void *data)
 	char *opt_user = NULL;
 	char *options = NULL;
 	int play_announcement;
-	struct timespec required;
-	struct timespec remaining;
-	int delay;
 	
 	LOCAL_USER_ADD(u);
 
@@ -577,21 +606,12 @@ static int login_exec(struct ast_channel *chan, void *data)
 							ast_pthread_mutex_unlock(&p->lock);
 							ast_pthread_mutex_unlock(&agentlock);
 							while (res >= 0) {
-								/* If we are not the owner, delay here for a while
-								 * so other interested threads can kick in. */
-								delay = 0;
 								ast_pthread_mutex_lock(&p->lock);
 								if (p->chan != chan)
 									res = -1;
-								if (p->owner) 
-									delay = 1;
 								ast_pthread_mutex_unlock(&p->lock);
-								if (delay) {
-									sched_yield();
-									required.tv_sec = 0;
-									required.tv_nsec = 20 * 1000 * 1000;
-									nanosleep( &required, &remaining );
-								}
+								/* Yield here so other interested threads can kick in. */
+								sched_yield();
 								if (res)
 									break;
 
@@ -603,12 +623,15 @@ static int login_exec(struct ast_channel *chan, void *data)
 								res = ast_safe_sleep_conditional( chan, 1000,
 														agent_cont_sleep, p );
 								pthread_mutex_unlock( &p->app_lock );
+								sched_yield();
 							}
+							ast_pthread_mutex_lock(&p->lock);
 							if (res && p->owner) 
 								ast_log(LOG_WARNING, "Huh?  We broke out when there was still an owner?\n");
 							/* Log us off if appropriate */
 							if (p->chan == chan)
 								p->chan = NULL;
+							ast_pthread_mutex_unlock(&p->lock);
 							if (option_verbose > 2)
 								ast_verbose(VERBOSE_PREFIX_3 "Agent '%s' logged out\n", p->agent);
 							manager_event(EVENT_FLAG_AGENT, "Agentlogoff",
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 824aa7c8af5ee2a8a1a750c93799ae44e614f7b2..d1fa8148450b19c714f4a24adce16fa96e341039 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -77,6 +77,8 @@ static char context[AST_MAX_EXTENSION] = "default";
 
 static char language[MAX_LANGUAGE] = "";
 
+static char callerid[AST_MAX_EXTENSION] = "asterisk";
+
 static int usecnt =0;
 static pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
 
@@ -1951,17 +1953,17 @@ static void initreqprep(struct sip_request *req, struct sip_pvt *p, char *cmd, c
 	char to[256];
 	char tmp[80];
 	char cid[256];
-	char *l = "asterisk", *n=NULL;
+	char *l = callerid, *n=NULL;
 	if (p->owner && p->owner->callerid) {
 		strcpy(cid, p->owner->callerid);
 		ast_callerid_parse(cid, &n, &l);
 		if (l) 
 			ast_shrink_phone_number(l);
 		if (!l || !ast_isphonenumber(l))
-				l = "asterisk";
+				l = callerid;
 	}
 	if (!n)
-		n = l;
+		n = callerid;
 	snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=%08x", n, l, inet_ntoa(p->ourip), p->tag);
 	if (strlen(p->username)) {
 		if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
@@ -4212,6 +4214,8 @@ static int reload_config(void)
 			}
 		} else if (!strcasecmp(v->name, "language")) {
 			strncpy(language, v->value, sizeof(language)-1);
+		} else if (!strcasecmp(v->name, "callerid")) {
+			strncpy(callerid, v->value, sizeof(callerid)-1);
 		} else if (!strcasecmp(v->name, "nat")) {
 			globalnat = ast_true(v->value);
 		} else if (!strcasecmp(v->name, "maxexpirey")) {
diff --git a/manager.c b/manager.c
index be1bb28fb6ff8cc02ef8b71f855a50000b20fe42..1b954c845c62ae769dd62f830a9f8014116924f2 100755
--- a/manager.c
+++ b/manager.c
@@ -16,8 +16,11 @@
 #include <pthread.h>
 #include <string.h>
 #include <sys/time.h>
+#include <sys/types.h>
+#include <netdb.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <netinet/tcp.h>
 #include <arpa/inet.h>
 #include <signal.h>
 #include <errno.h>
@@ -432,6 +435,7 @@ static int process_message(struct mansession *s, struct message *m)
 	struct manager_action *tmp = first_action;
 
 	strncpy(action, get_header(m, "Action"), sizeof(action));
+	ast_log( LOG_DEBUG, "Manager received command '%s'\n", action );
 
 	if (!strlen(action)) {
 		send_error(s, "Missing action in request");
@@ -569,10 +573,13 @@ static void *accept_thread(void *ignore)
 	struct sockaddr_in sin;
 	int sinlen;
 	struct mansession *s;
+	struct protoent *p;
+	int arg = 1;
 	pthread_attr_t attr;
 
 	pthread_attr_init(&attr);
 	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
 	for (;;) {
 		sinlen = sizeof(sin);
 		as = accept(asock, &sin, &sinlen);
@@ -580,6 +587,12 @@ static void *accept_thread(void *ignore)
 			ast_log(LOG_NOTICE, "Accept returned -1: %s\n", strerror(errno));
 			continue;
 		}
+		p = getprotobyname("tcp");
+		if( p ) {
+			if( setsockopt(as, p->p_proto, TCP_NODELAY, (char *)&arg, sizeof(arg) ) < 0 ) {
+				ast_log(LOG_WARNING, "Failed to set manager tcp connection to TCP_NODELAY mode: %s\n", strerror(errno));
+			}
+		}
 		s = malloc(sizeof(struct mansession));
 		if (!s) {
 			ast_log(LOG_WARNING, "Failed to allocate management session: %s\n", strerror(errno));