diff --git a/cdr/cdr_mysql.c b/cdr/cdr_mysql.c
index 666a4e29a16c0149f674f91899f4c3001d1e5dd4..137febb46e748f1c7df7f06fbfada12748c133b0 100755
--- a/cdr/cdr_mysql.c
+++ b/cdr/cdr_mysql.c
@@ -39,21 +39,18 @@ static MYSQL *mysql;
 static int mysql_log(struct ast_cdr *cdr)
 {
   struct tm *tm;
-  struct timeval *tv;
-  struct timezone *tz;
-  char *sqlcmd, *timestr;
+  struct timeval tv;
+  struct timezone tz;
+  char *sqlcmd, timestr[128];
   time_t t;
 
 
-  tv = (struct timeval *)malloc(sizeof(struct timeval));
-  tz = (struct timezone *)malloc(sizeof(struct timezone));
   sqlcmd = (char *)malloc(2048);
-  timestr = (char*)malloc(128);
   memset(sqlcmd,0,2048);
 
 
-  gettimeofday(tv,tz);
-  t = tv->tv_sec;
+  gettimeofday(&tv,&tz);
+  t = tv.tv_sec;
   tm = localtime(&t);
   strftime(timestr,128,DATE_FORMAT,tm);
   
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index d5250831028cfc511ba7248767c90f3acc003dd3..c1afbf3932eecf632f0a7b094f18963783e15c4f 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -3189,6 +3189,22 @@ static int sip_poke_peer_s(void *data)
 	return 0;
 }
 
+static void parse_moved_contact(struct sip_pvt *p, struct sip_request *req)
+{
+	char tmp[256] = "";
+	char *s, *e;
+	strncpy(tmp, get_header(req, "Contact"), sizeof(tmp) - 1);
+	s = tmp;
+	e = strchr(tmp, '@');
+	if (e)
+		*e = '\0';
+	if (!strncasecmp(s, "sip:", 4))
+		s += 4;
+	ast_log(LOG_DEBUG, "Found 302 Redirect to extension '%s'\n", s);
+	if (p->owner)
+		strncpy(p->owner->call_forward, s, sizeof(p->owner->call_forward) - 1);
+}
+
 static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_request *req)
 {
 	char *to;
@@ -3361,6 +3377,11 @@ retrylock:
 				}
 				/* XXX Locking issues?? XXX */
 				switch(resp) {
+				case 302: /* Moved temporarily */
+					parse_moved_contact(p, req);
+					if (p->owner)
+						ast_queue_control(p->owner, AST_CONTROL_BUSY, 0);
+					break;
 				case 486: /* Busy here */
 				case 600: /* Busy everywhere */
 					if (p->owner)
diff --git a/pbx.c b/pbx.c
index 20d38b3ec7da80b3f44ecfddebecca2bf1a966c8..0c01820d5827dce3f5a078d500137ea1d1cd3334 100755
--- a/pbx.c
+++ b/pbx.c
@@ -504,7 +504,7 @@ int ast_extension_match(char *pattern, char *data)
 {
 	int match;
 	/* If they're the same return */
-	if (!strcasecmp(pattern, data))
+	if (!strcmp(pattern, data))
 		return 1;
 	EXTENSION_MATCH_CORE(data,pattern,match);
 	/* Must be at the end of both */
@@ -611,7 +611,7 @@ static struct ast_exten *pbx_find_extension(struct ast_channel *chan, char *cont
 	tmp = contexts;
 	while(tmp) {
 		/* Match context */
-		if (!strcasecmp(tmp->name, context)) {
+		if (!strcmp(tmp->name, context)) {
 			if (*status < STATUS_NO_EXTENSION)
 				*status = STATUS_NO_EXTENSION;
 			eroot = tmp->root;