diff --git a/UPGRADE.txt b/UPGRADE.txt
index 63eaf563c45c88a4cda44107a06b8124e8425e76..67fa6a628ea882aecd314a1dc83e76e8b350d4a1 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -78,6 +78,10 @@ From 1.6.2 to 1.8:
 * The Manager event 'iax2 show peers' output has been updated.  It now has a
   similar output of 'sip show peers'.
 
+* VoiceMailMain and VMAuthenticate, if a '*' is entered in the first position
+  of a Mailbox or Password, will, if it exists, jump to the 'a' extension in
+  the current dialplan context.
+
 From 1.6.1 to 1.6.2:
 
 * SIP no longer sends the 183 progress message for early media by
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index fece02aca6e0eec2f66f528730e7825f6e75cc68..a311b6e8d829996461a595ffdb46f4b6ea21a01d 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -250,6 +250,13 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 			may be specified. If a <replaceable>mailbox</replaceable> is not provided, the calling party will
 			be prompted to enter one. If a <replaceable>context</replaceable> is not specified, the
 			<literal>default</literal> context will be used.</para>
+			<para>The VoiceMailMain application will exit if the following DTMF digit is entered as Mailbox
+			or Password, and the extension exists:</para>
+			<enumlist>
+				<enum name="*">
+					<para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
+				</enum>
+			</enumlist>
 		</description>
 	</application>
 	<application name="MailboxExists" language="en_US">
@@ -303,6 +310,13 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 			specified, only that mailbox's password will be considered valid. If the <replaceable>mailbox</replaceable>
 			is not specified, the channel variable <variable>AUTH_MAILBOX</variable> will be set with the authenticated
 			mailbox.</para>
+			<para>The VMAuthenticate application will exit if the following DTMF digit is entered as Mailbox
+			or Password, and the extension exists:</para>
+			<enumlist>
+				<enum name="*">
+					<para>Jump to the <literal>a</literal> extension in the current dialplan context.</para>
+				</enum>
+			</enumlist>
 		</description>
 	</application>
 	<application name="VMSayName" language="en_US">
@@ -9342,7 +9356,14 @@ static int vm_authenticate(struct ast_channel *chan, char *mailbox, int mailbox_
 				ast_verb(3, "Username not entered\n");	
 				return -1;
 			}
+		} else if (mailbox[0] == '*') {
+			/* user entered '*' */
+			if (ast_exists_extension(chan, chan->context, "a", 1, chan->cid.cid_num)) {
+				return -1;
+			}
+			mailbox[0] = '\0';
 		}
+
 		if (useadsi)
 			adsi_password(chan);
 
@@ -9366,6 +9387,13 @@ static int vm_authenticate(struct ast_channel *chan, char *mailbox, int mailbox_
 			if (ast_readstring(chan, password, sizeof(password) - 1, 2000, 10000, "#") < 0) {
 				ast_log(AST_LOG_WARNING, "Unable to read password\n");
 				return -1;
+			} else if (password[0] == '*') {
+				/* user entered '*' */
+				if (ast_exists_extension(chan, chan->context, "a", 1, chan->cid.cid_num)) {
+					mailbox[0] = '*';
+					return -1;
+				}
+				mailbox[0] = '\0';
 			}
 		}
 
@@ -9531,6 +9559,17 @@ static int vm_execmain(struct ast_channel *chan, const char *data)
 		res = vm_authenticate(chan, vms.username, sizeof(vms.username), &vmus, context, prefixstr, skipuser, maxlogins, 0);
 
 	ast_debug(1, "After vm_authenticate\n");
+
+	if (vms.username[0] == '*') {
+		ast_debug(1, "user pressed * in context '%s'\n", chan->context);
+
+		/* user entered '*' */
+		if (!ast_goto_if_exists(chan, chan->context, "a", 1)) {
+			res = 0;	/* prevent hangup */
+			goto out;
+		}
+	}
+
 	if (!res) {
 		valid = 1;
 		if (!skipuser)
@@ -10536,6 +10575,11 @@ static int vmauthenticate(struct ast_channel *chan, const char *data)
 		pbx_builtin_setvar_helper(chan, "AUTH_CONTEXT", vmus.context);
 		ast_play_and_wait(chan, "auth-thankyou");
 		res = 0;
+	} else if (mailbox[0] == '*') {
+		/* user entered '*' */
+		if (!ast_goto_if_exists(chan, chan->context, "a", 1)) {
+			res = 0;	/* prevent hangup */
+		}
 	}
 
 	return res;