diff --git a/app.c b/app.c
index 192b9d99ac05339f864e5fc718c20b92786fdb7d..81f31cac2e3a49071a6d416a0daa23009115256c 100755
--- a/app.c
+++ b/app.c
@@ -70,7 +70,7 @@ int ast_app_getvoice(struct ast_channel *c, char *dest, char *dstfmt, char *prom
 	int res;
 	struct ast_filestream *writer;
 	int rfmt;
-	int totalms, total;
+	int totalms=0, total;
 	
 	struct ast_frame *f;
 	struct ast_dsp *sildet;
@@ -141,7 +141,7 @@ int ast_app_getvoice(struct ast_channel *c, char *dest, char *dstfmt, char *prom
 	return 0;
 }
 
-int ast_app_has_voicemail(char *mailbox)
+int ast_app_has_voicemail(const char *mailbox)
 {
 	DIR *dir;
 	struct dirent *de;
@@ -177,3 +177,66 @@ int ast_app_has_voicemail(char *mailbox)
 		return 1;
 	return 0;
 }
+
+int ast_app_messagecount(const char *mailbox, int *newmsgs, int *oldmsgs)
+{
+	DIR *dir;
+	struct dirent *de;
+	char fn[256];
+	char tmp[256]="";
+	char *mb, *cur;
+	int ret;
+	if (newmsgs)
+		*newmsgs = 0;
+	if (oldmsgs)
+		*oldmsgs = 0;
+	/* If no mailbox, return immediately */
+	if (!strlen(mailbox))
+		return 0;
+	if (strchr(mailbox, ',')) {
+		int tmpnew, tmpold;
+		strncpy(tmp, mailbox, sizeof(tmp));
+		mb = tmp;
+		ret = 0;
+		while((cur = strsep(&mb, ", "))) {
+			if (strlen(cur)) {
+				if (ast_app_messagecount(cur, newmsgs ? &tmpnew : NULL, oldmsgs ? &tmpold : NULL))
+					return -1;
+				else {
+					if (newmsgs)
+						*newmsgs += tmpnew; 
+					if (oldmsgs)
+						*oldmsgs += tmpold;
+				}
+			}
+		}
+		return 0;
+	}
+	if (newmsgs) {
+		snprintf(fn, sizeof(fn), "%s/vm/%s/INBOX", (char *)ast_config_AST_SPOOL_DIR, mailbox);
+		dir = opendir(fn);
+		if (dir) {
+			while ((de = readdir(dir))) {
+				if ((strlen(de->d_name) > 3) && !strncasecmp(de->d_name, "msg", 3) &&
+					!strcasecmp(de->d_name + strlen(de->d_name) - 3, "txt"))
+						*newmsgs++;
+					
+			}
+			closedir(dir);
+		}
+	}
+	if (oldmsgs) {
+		snprintf(fn, sizeof(fn), "%s/vm/%s/Old", (char *)ast_config_AST_SPOOL_DIR, mailbox);
+		dir = opendir(fn);
+		if (dir) {
+			while ((de = readdir(dir))) {
+				if ((strlen(de->d_name) > 3) && !strncasecmp(de->d_name, "msg", 3) &&
+					!strcasecmp(de->d_name + strlen(de->d_name) - 3, "txt"))
+						*oldmsgs++;
+					
+			}
+			closedir(dir);
+		}
+	}
+	return 0;
+}
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 2582a1b10726c0f538ff8bbed6db845dba9a8ee3..3ec1a29e69a83f0f4f64b1fdba15dacd9698f221 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -2027,19 +2027,22 @@ static int transmit_invite(struct sip_pvt *p, char *cmd, int sdp, char *auth, ch
 	return send_request(p, &req);
 }
 
-static int transmit_notify(struct sip_pvt *p, int hasmsgs)
+static int transmit_notify(struct sip_pvt *p, int newmsgs, int oldmsgs)
 {
 	struct sip_request req;
 	char tmp[256];
+	char tmp2[256];
 	char clen[20];
 	initreqprep(&req, p, "NOTIFY", NULL);
 	add_header(&req, "Event", "message-summary");
 	add_header(&req, "Content-Type", "text/plain");
 
-	snprintf(tmp, sizeof(tmp), "Message-Waiting: %s\n", hasmsgs ? "yes" : "no");
-	snprintf(clen, sizeof(clen), "%d", strlen(tmp));
+	snprintf(tmp, sizeof(tmp), "Message-Waiting: %s\n", (newmsgs + oldmsgs) ? "yes" : "no");
+	snprintf(tmp2, sizeof(tmp2), "Voicemail: %d/%d\n", newmsgs, oldmsgs);
+	snprintf(clen, sizeof(clen), "%d", strlen(tmp) + strlen(tmp2));
 	add_header(&req, "Content-Length", clen);
 	add_line(&req, tmp);
+	add_line(&req, tmp2);
 
 	if (!p->initreq.headers) {
 		/* Use this as the basis */
@@ -3694,15 +3697,15 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer)
 {
 	/* Called with peerl lock, but releases it */
 	struct sip_pvt *p;
-	int hasmsgs;
 	char name[256] = "";
+	int newmsgs, oldmsgs;
 	/* Check for messages */
-	hasmsgs = ast_app_has_voicemail(peer->mailbox);
+	ast_app_messagecount(peer->mailbox, &newmsgs, &oldmsgs);
 	
 	time(&peer->lastmsgcheck);
 	
 	/* Return now if it's the same thing we told them last time */
-	if (hasmsgs == peer->lastmsgssent) {
+	if (((newmsgs << 8) | (oldmsgs)) == peer->lastmsgssent) {
 		ast_pthread_mutex_unlock(&peerl.lock);
 		return 0;
 	}
@@ -3714,7 +3717,7 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer)
 		return -1;
 	}
 	strncpy(name, peer->name, sizeof(name) - 1);
-	peer->lastmsgssent = hasmsgs;
+	peer->lastmsgssent = ((newmsgs << 8) | (oldmsgs));
 	ast_pthread_mutex_unlock(&peerl.lock);
 	if (create_addr(p, peer->name)) {
 		/* Maybe they're not registered, etc. */
@@ -3726,7 +3729,7 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer)
 	snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=%08x", inet_ntoa(p->ourip), ourport, p->branch);
 	build_callid(p->callid, sizeof(p->callid), p->ourip);
 	/* Send MWI */
-	transmit_notify(p, hasmsgs);
+	transmit_notify(p, newmsgs, oldmsgs);
 	/* Destroy channel */
 	sip_destroy(p);
 	return 0;
diff --git a/include/asterisk/app.h b/include/asterisk/app.h
index bcbccb726fd6e6d53661a9deb24029e56348f737..ef7b05c27dc40580caa5b107125884b7fc2162c6 100755
--- a/include/asterisk/app.h
+++ b/include/asterisk/app.h
@@ -40,7 +40,10 @@ extern int ast_app_getdata_full(struct ast_channel *c, char *prompt, char *s, in
 int ast_app_getvoice(struct ast_channel *c, char *dest, char *dstfmt, char *prompt, int silence, int maxsec);
 
 //! Determine if a given mailbox has any voicemail
-extern int ast_app_has_voicemail(char *mailbox);
+extern int ast_app_has_voicemail(const char *mailbox);
+
+//! Determine number of new/old messages in a mailbox
+extern int ast_app_messagecount(const char *mailbox, int *newmsgs, int *oldmsgs);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }