diff --git a/CHANGES b/CHANGES
index b2c18fff8362a2da8f0cc3a140c296bc62ba712a..4ddbb1199bfc7d3c586f1cd769b255b14caad6b8 100755
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,4 @@
+ -- Add 'C' flag to dial command to reset call detail record (handy for calling cards)
  -- Add NAT and dynamic support to MGCP
  -- Allow selection of in-band, out-of-band, or INFO based DTMF
  -- Add contributed "*80" support to blacklist numbers (Thanks James!)
diff --git a/apps/app_dial.c b/apps/app_dial.c
index cd26974fd23093cc7598a33c5fd59317d51501e0..8743e0baa2eed5227444dfa66cdf28459d6e118c 100755
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -64,6 +64,7 @@ static char *descrip =
 "      'm' -- provide hold music to the calling party until answered.\n"
 "      'd' -- data-quality (modem) call (minimum delay).\n"
 "      'H' -- allow caller to hang up by hitting *.\n"
+"      'C' -- reset call detail record for this call.\n"
 "      'P[(x)]' -- privacy mode, using 'x' as database if provided.\n"
 "  In addition to transferring the call, a call may be parked and then picked\n"
 "up by another user.\n"
@@ -295,6 +296,7 @@ static int dial_exec(struct ast_channel *chan, void *data)
 	int allowredir=0;
 	int allowdisconnect=0;
 	int privacy=0;
+	int resetcdr=0;
 	char numsubst[AST_MAX_EXTENSION];
 	char restofit[AST_MAX_EXTENSION];
 	char *transfer = NULL;
@@ -364,8 +366,12 @@ static int dial_exec(struct ast_channel *chan, void *data)
 		} else if (strchr(transfer, 'P')) {
 			/* No specified privdb */
 			privacy = 1;
+		} else if (strchr(transfer, 'C')) {
+			resetcdr = 1;
 		}
 	}
+	if (resetcdr && chan->cdr)
+		ast_cdr_reset(chan->cdr, 0);
 	if (!strlen(privdb) && privacy) {
 		/* If privdb is not specified and we are using privacy, copy from extension */
 		strncpy(privdb, chan->exten, sizeof(privdb) - 1);
diff --git a/channels/chan_modem_i4l.c b/channels/chan_modem_i4l.c
index 18b5a50399206b34164bc0f9dd8d4f8a4cc93da5..277c16b86065411cf547dfeb440c3ddf10f688a4 100755
--- a/channels/chan_modem_i4l.c
+++ b/channels/chan_modem_i4l.c
@@ -474,7 +474,7 @@ static char *i4l_identify(struct ast_modem_pvt *p)
 	return strdup("Linux ISDN");
 }
 
-static void i4l_incusecnt()
+static void i4l_incusecnt(void)
 {
 	ast_pthread_mutex_lock(&usecnt_lock);
 	usecnt++;
@@ -482,7 +482,7 @@ static void i4l_incusecnt()
 	ast_update_use_count();
 }
 
-static void i4l_decusecnt()
+static void i4l_decusecnt(void)
 {
 	ast_pthread_mutex_lock(&usecnt_lock);
 	usecnt++;
diff --git a/configs/sip.conf.sample b/configs/sip.conf.sample
index c1aee752119320fa578359e62a63f8b37ed71d2f..7559d4f2be9733a3e87f39dc354d4ed280ce7ab1 100755
--- a/configs/sip.conf.sample
+++ b/configs/sip.conf.sample
@@ -17,12 +17,11 @@ context = default		; Default for incoming calls
 ;type=friend
 ;secret=blah
 ;host=dynamic
-;dtmf=inband			; Choices are inband, rfc2833, or info
+;dtmfmode=inband		; Choices are inband, rfc2833, or info
 ;defaultip=192.168.0.59
 
 ;[pingtel]
 ;type=friend
-;insecure=yes			; Pingtel sends from different portno
 ;username=pingtel
 ;secret=blah
 ;host=dynamic
@@ -32,6 +31,7 @@ context = default		; Default for incoming calls
 ;type=friend
 ;username=cisco
 ;secret=blah
+;nat=yes			; This phone may be natted
 ;host=dynamic
 ;canreinvite=no			; Cisco poops on reinvite sometimes
 ;qualify=200			; Qualify peer is no more than 200ms away
@@ -39,7 +39,6 @@ context = default		; Default for incoming calls
 
 ;[cisco1]
 ;type=friend
-;insecure=yes
 ;username=cisco1
 ;secret=blah
 ;host=dynamic
diff --git a/include/asterisk/manager.h b/include/asterisk/manager.h
index 4a267747fffbdc2276d7cdb957e3acbdaf4ec2d7..980909e8879ae70f25c3af5223625dd9f2d457b3 100755
--- a/include/asterisk/manager.h
+++ b/include/asterisk/manager.h
@@ -57,6 +57,7 @@ struct mansession {
 	int fd;
 	int blocking;
 	char username[80];
+	char challenge[10];
 	int authenticated;
 	int readperm;
 	int writeperm;
diff --git a/include/asterisk/vmodem.h b/include/asterisk/vmodem.h
index 2dfc43a7b512b223ec9f21bf291f49fffa62d0db..2d80a14400c95a5ac7405adbcdacec3ed48ba040 100755
--- a/include/asterisk/vmodem.h
+++ b/include/asterisk/vmodem.h
@@ -40,8 +40,8 @@ struct ast_modem_driver {
 	char **idents;
 	int formats;
 	int fullduplex;
-	void (*incusecnt)();
-	void (*decusecnt)();
+	void (*incusecnt)(void);
+	void (*decusecnt)(void);
 	char * (*identify)(struct ast_modem_pvt *);
 	int (*init)(struct ast_modem_pvt *);
 	int (*setdev)(struct ast_modem_pvt *, int dev);
diff --git a/manager.c b/manager.c
index f9d224d6ee3b43da7e63f06f5fc4207fb21debed..0305c9f77a33464f8b39961ecd86d3e91573682c 100755
--- a/manager.c
+++ b/manager.c
@@ -32,6 +32,7 @@
 #include <asterisk/cli.h>
 #include <asterisk/app.h>
 #include <asterisk/pbx.h>
+#include <asterisk/md5.h>
 
 static int enabled = 0;
 static int portno = DEFAULT_MANAGER_PORT;
@@ -191,6 +192,9 @@ static int authenticate(struct mansession *s, struct message *m)
 	char *cat;
 	char *user = get_header(m, "Username");
 	char *pass = get_header(m, "Secret");
+	char *authtype = get_header(m, "AuthType");
+	char *key = get_header(m, "Key");
+
 	cfg = ast_load("manager.conf");
 	if (!cfg)
 		return -1;
@@ -200,7 +204,27 @@ static int authenticate(struct mansession *s, struct message *m)
 			/* This is a user */
 			if (!strcasecmp(cat, user)) {
 				char *password = ast_variable_retrieve(cfg, cat, "secret");
-				if (password && !strcasecmp(password, pass)) {
+				if (!strcasecmp(authtype, "MD5")) {
+					if (key && strlen(key) && s->challenge) {
+						int x;
+						int len=0;
+						char md5key[256] = "";
+						struct MD5Context md5;
+						unsigned char digest[16];
+						MD5Init(&md5);
+						MD5Update(&md5, s->challenge, strlen(s->challenge));
+						MD5Update(&md5, password, strlen(password));
+						MD5Final(digest, &md5);
+						for (x=0;x<16;x++)
+							len += sprintf(md5key + len, "%2.2x", digest[x]);
+						if (!strcmp(md5key, key))
+							break;
+						else {
+							ast_destroy(cfg);
+							return -1;
+						}
+					}
+				} else if (password && !strcasecmp(password, pass)) {
 					break;
 				} else {
 					ast_log(LOG_NOTICE, "%s failed to authenticate as '%s'\n", inet_ntoa(s->sin.sin_addr), user);
@@ -414,7 +438,22 @@ static int process_message(struct mansession *s, struct message *m)
 		return 0;
 	}
 	if (!s->authenticated) {
-		if (!strcasecmp(action, "Login")) {
+		if (!strcasecmp(action, "Challenge")) {
+			char *authtype;
+			authtype = get_header(m, "AuthType");
+			if (!strcasecmp(authtype, "MD5")) {
+				if (!s->challenge || !strlen(s->challenge)) {
+					ast_pthread_mutex_lock(&s->lock);
+					snprintf(s->challenge, sizeof(s->challenge), "%d", rand());
+					ast_pthread_mutex_unlock(&s->lock);
+				}
+				ast_cli(s->fd, "Challenge: %s\r\n\r\n", s->challenge);
+				return 0;
+			} else {
+				send_error(s, "Must specify AuthType");
+				return 0;
+			}
+		} else if (!strcasecmp(action, "Login")) {
 			if (authenticate(s, m)) {
 				sleep(1);
 				send_error(s, "Authentication failed");