diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index db13741a3e48b940af3bc614a8318a796a37dc9b..252fdb26efd7b308be7075610877d31ed42f3715 100755
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -200,6 +200,7 @@ static int maxsilence;
 static int silencethreshold = 128;
 static char serveremail[80];
 static char mailcmd[160];	/* Configurable mail cmd */
+static char externnotify[160]; 
 
 static char vmfmts[80];
 static int vmminmessage;
@@ -1564,6 +1565,18 @@ leave_vm_out:
 	}
 	/* Leave voicemail for someone */
 	manager_event(EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", ext, ast_app_has_voicemail(ext));
+
+	/* If an external program is specified to be run after leaving a voicemail */
+	if (externnotify[0]) {
+		char arguments[255];
+		ast_log(LOG_DEBUG, "App voicemail ran the external notify program\n");
+		strncpy(tmp, externnotify, sizeof(tmp));
+		snprintf(arguments, sizeof(arguments)-1, " %s %s %d&", chan->context, ext, ast_app_has_voicemail(ext));
+		strncat(tmp, arguments, sizeof(tmp) - strlen(arguments));
+		tmp[sizeof(tmp) - 1] = '\0';
+		ast_safe_system(tmp);
+	}
+
 	return res;
 }
 
@@ -2361,6 +2374,15 @@ static int forward_message(struct ast_channel *chan, char *context, char *dir, i
 		}
 		/* Leave voicemail for someone */
 		manager_event(EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", vmtmp->mailbox, ast_app_has_voicemail(vmtmp->mailbox));
+		if (externnotify[0]) {
+			char arguments[255];
+			ast_log(LOG_DEBUG, "Running external notify program from vm_execmain\n");
+			strncpy(tmp, externnotify, sizeof(tmp));
+			snprintf(arguments, sizeof(arguments)-1, " %s %s %d&", chan->context, vmtmp->mailbox, ast_app_has_voicemail(vmtmp->mailbox));
+			strncat(tmp, arguments, sizeof(tmp) - strlen(arguments));
+			tmp[sizeof(tmp) - 1] = '\0';
+			ast_safe_system(tmp);
+		}
 
 		saved_messages++;
 		vmfree = vmtmp;
@@ -3012,8 +3034,18 @@ out:
 		free_user(vmu);
 	if (valid) {
 		manager_event(EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", vms.username, ast_app_has_voicemail(vms.username));
+		if (externnotify[0]) {
+			char arguments[255];
+			ast_log(LOG_DEBUG, "Running external notify program from vm_execmain\n");
+			strncpy(tmp, externnotify, sizeof(tmp));
+			snprintf(arguments, sizeof(arguments)-1, " %s %s %d&", chan->context, vms.username, ast_app_has_voicemail(vms.username));
+			strncat(tmp, arguments, sizeof(tmp) - strlen(arguments));
+			tmp[sizeof(tmp) - 1] = '\0';
+			ast_safe_system(tmp);
+		}
 	}
 	LOCAL_USER_REMOVE(u);
+
 	return res;
 
 }
@@ -3263,6 +3295,7 @@ static int load_config(void)
 	struct ast_config *cfg;
 	char *cat;
 	struct ast_variable *var;
+	char *notifystr = NULL;
 	char *astattach;
 	char *silencestr;
 	char *thresholdstr;
@@ -3270,6 +3303,7 @@ static int load_config(void)
 	char *astemail;
  	char *astmailcmd = SENDMAIL;
 	char *s;
+
 	int x;
 
 	cfg = ast_load(VOICEMAIL_CONFIG);
@@ -3312,6 +3346,13 @@ static int load_config(void)
 				maxsilence *= 1000;
 		}
 		
+		/* External voicemail notify application */
+		
+		if ((notifystr = ast_variable_retrieve(cfg, "general", "externnotify"))) {
+			strncpy(externnotify, notifystr, sizeof(externnotify) - 1);
+		} else {
+			externnotify[0] = '\0';
+		}
 
 		/* Silence treshold */
 		silencethreshold = 256;
diff --git a/configs/voicemail.conf.sample b/configs/voicemail.conf.sample
index 6dec0498a5913d02f153dfba9c80ad730c8f8411..3a97fbd54cece3c2487110a4e3b6d80135c08de3 100755
--- a/configs/voicemail.conf.sample
+++ b/configs/voicemail.conf.sample
@@ -24,6 +24,11 @@ maxsilence=10
 silencethreshold=128
 ; Max number of failed login attempts
 maxlogins=3
+; If you need to have an external program, i.e. /usr/bin/myapp
+; called when a voicemail is left, delivered, or your voicemailbox 
+; changes, uncomment this:
+;externnotify=/usr/bin/myapp
+
 
 ; Skip the "[PBX]:" string from the message title
 ;pbxskip=yes