diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 94ecb602501c329bbeb15408654f06126e624631..b6b8c3c7b1861d2447a7141d8402ed39c7855ac7 100755
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -148,6 +148,8 @@ struct ast_vm_user {
 	int review;
 	int operator;
 	int envelope;
+	int forcename;
+	int forcegreetings;
 	struct ast_vm_user *next;
 };
 
@@ -264,6 +266,8 @@ static int saycidinfo;
 static int svmailinfo;
 static int hearenv;
 static int skipaftercmd;
+static int forcenm;
+static int forcegrt;
 static char dialcontext[80];
 static char callcontext[80];
 static char exitcontext[80];
@@ -301,6 +305,10 @@ static void populate_defaults(struct ast_vm_user *vmu)
 		vmu->svmail = 1; 
 	if (hearenv)
 		vmu->envelope = 1;
+	if (forcenm)
+		vmu->forcename = 1;
+	if (forcegrt)
+		vmu->forcegreetings = 1;
 	if (callcontext)
 		strncpy(vmu->callback, callcontext, sizeof(vmu->callback) -1);
 	if (dialcontext)
@@ -357,6 +365,16 @@ static void apply_options(struct ast_vm_user *vmu, char *options)
 					vmu->envelope = 1;
 				else
 					vmu->envelope = 0;
+			} else if (!strcasecmp(var, "forcename")){
+				if(ast_true(value))
+					vmu->forcename = 1;
+				else
+					vmu->forcename = 0;
+			} else if (!strcasecmp(var, "forcegreetings")){
+				if(ast_true(value))
+					vmu->forcegreetings = 1;
+				else
+					vmu->forcegreetings = 0;
 			} else if (!strcasecmp(var, "callback")) {
 				strncpy(vmu->callback, value, sizeof(vmu->callback) -1);
 			} else if (!strcasecmp(var, "dialout")) {
@@ -3012,6 +3030,75 @@ static int vm_instructions(struct ast_channel *chan, struct vm_state *vms, int s
 	return res;
 }
 
+static int vm_newuser(struct ast_channel *chan, struct ast_vm_user *vmu, struct vm_state *vms, char *fmtc)
+{
+	int cmd = 0;
+	int duration = 0;
+	char newpassword[80] = "";
+	char newpassword2[80] = "";
+	char prefile[256]="";
+	char buf[256];
+	int bytes=0;
+
+	if (adsi_available(chan))
+	{
+		bytes += adsi_logo(buf + bytes);
+		bytes += adsi_display(buf + bytes, ADSI_COMM_PAGE, 3, ADSI_JUST_CENT, 0, "New User Setup", "");
+		bytes += adsi_display(buf + bytes, ADSI_COMM_PAGE, 4, ADSI_JUST_CENT, 0, "Not Done", "");
+		bytes += adsi_set_line(buf + bytes, ADSI_COMM_PAGE, 1);
+		bytes += adsi_voice_mode(buf + bytes, 0);
+		adsi_transmit_message(chan, buf, bytes, ADSI_MSG_DISPLAY);
+	}
+
+	/* First, have the user change their password 
+	   so they won't get here again */
+	newpassword[1] = '\0';
+	newpassword[0] = cmd = ast_play_and_wait(chan,"vm-newpassword");
+	if (cmd < 0 || cmd == 't' || cmd == '#')
+		return cmd;
+	cmd = ast_readstring(chan,newpassword + strlen(newpassword),sizeof(newpassword)-1,2000,10000,"#");
+	if (cmd < 0 || cmd == 't' || cmd == '#')
+		return cmd;
+	newpassword2[1] = '\0';
+	newpassword2[0] = cmd = ast_play_and_wait(chan,"vm-reenterpassword");
+		return cmd;
+	cmd = ast_readstring(chan,newpassword2 + strlen(newpassword2),sizeof(newpassword2)-1,2000,10000,"#");
+	if (cmd < 0 || cmd == 't' || cmd == '#')
+		return cmd;
+	if (strcmp(newpassword, newpassword2)) {
+		ast_log(LOG_NOTICE,"Password mismatch for user %s (%s != %s)\n", vms->username, newpassword, newpassword2);
+		cmd = ast_play_and_wait(chan, "vm-mismatch");
+	}
+	if(ast_strlen_zero(ext_pass_cmd)) 
+		vm_change_password(vmu,newpassword);
+	else 
+		vm_change_password_shell(vmu,newpassword);
+	ast_log(LOG_DEBUG,"User %s set password to %s of length %i\n",vms->username,newpassword,(int)strlen(newpassword));
+	cmd = ast_play_and_wait(chan,"vm-passchanged");
+
+	/* If forcename is set, have the user record their name */	
+	if (vmu->forcename) {
+		snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/greet",vmu->context, vms->username);
+		cmd = play_record_review(chan,"vm-rec-name",prefile, maxgreet, fmtc, 0, vmu, &duration);
+		if (cmd < 0 || cmd == 't' || cmd == '#')
+			return cmd;
+	}
+
+	/* If forcegreetings is set, have the user record their greetings */
+	if (vmu->forcegreetings) {
+		snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/unavail",vmu->context, vms->username);
+		cmd = play_record_review(chan,"vm-rec-unv",prefile, maxgreet, fmtc, 0, vmu, &duration);
+		if (cmd < 0 || cmd == 't' || cmd == '#')
+			return cmd;
+		snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/busy",vmu->context, vms->username);
+		cmd = play_record_review(chan,"vm-rec-busy",prefile, maxgreet, fmtc, 0, vmu, &duration);
+		if (cmd < 0 || cmd == 't' || cmd == '#')
+			return cmd;
+	}
+
+	return cmd;
+}
+
 static int vm_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct vm_state *vms, char *fmtc)
 {
 	int cmd = 0;
@@ -3322,7 +3409,6 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 		open_mailbox(&vms, vmu, 0);
 		vms.newmessages = vms.lastmsg + 1;
 		
-
 		/* Select proper mailbox FIRST!! */
 		if (!vms.newmessages && vms.oldmessages) {
 			/* If we only have old messages start here */
@@ -3332,6 +3418,24 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 		if (useadsi)
 			adsi_status(chan, &vms);
 		res = 0;
+
+		/* Check to see if this is a new user */
+		if (!strcasecmp(vmu->mailbox, vmu->password) && 
+			(vmu->forcename || vmu->forcegreetings)) {
+			if (ast_play_and_wait(chan, "vm-newuser") == -1)
+				ast_log(LOG_WARNING, "Couldn't stream new user file\n");
+			cmd = vm_newuser(chan, vmu, &vms, vmfmts);
+			if ((cmd == 't') || (cmd == '#')) {
+				/* Timeout */
+				res = 0;
+				goto out;
+			} else if (cmd < 0) {
+				/* Hangup */
+				res = -1;
+				goto out;
+			}
+		}
+
 		/* Play voicemail intro - syntax is different for different languages */
 		if (!strcasecmp(chan->language, "de")) {	/* GERMAN syntax */
 			cmd = vm_intro_de(chan, &vms);
@@ -3348,6 +3452,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 		} else {	/* Default to ENGLISH */
 			cmd = vm_intro(chan, &vms);
 		}
+
 		vms.repeats = 0;
 		vms.starting = 1;
 		while((cmd > -1) && (cmd != 't') && (cmd != '#')) {
@@ -4018,6 +4123,18 @@ static int load_config(void)
 			}
 		}
 
+		/* Force new user to record name ? */
+		forcenm = 0;
+		if (!(astattach = ast_variable_retrieve(cfg, "general", "forcename"))) 
+			astattach = "no";
+		forcenm = ast_true(astattach);
+
+		/* Force new user to record greetings ? */
+		forcegrt = 0;
+		if (!(astattach = ast_variable_retrieve(cfg, "general", "forcegreetings"))) 
+			astattach = "no";
+		forcegrt = ast_true(astattach);
+
 		if ((s = ast_variable_retrieve(cfg, "general", "cidinternalcontexts"))){
 			ast_log(LOG_DEBUG,"VM_CID Internal context string: %s\n",s);
 			stringp = ast_strdupa(s);
diff --git a/configs/voicemail.conf.sample b/configs/voicemail.conf.sample
index 315611a768aa827cdc6d64c69c62a56c28bc64a2..9dd76fc35012db82903107f31fe2bd3ebea36d40 100755
--- a/configs/voicemail.conf.sample
+++ b/configs/voicemail.conf.sample
@@ -122,7 +122,12 @@ sendvoicemail=yes	; Context to Send voicemail from [option 5 from the advanced m
 			;     This is intended for use with users who wish to receive their voicemail ONLY by email.
 ; nextaftercmd=yes	; Skips to the next message after hitting 7 or 9 to delete/save current message.
 			;     [global option only at this time] 
-			
+; forcename=yes		; Forces a new user to record their name.  A new user is
+			;     determined by the password being the same as
+			;     the mailbox number.  The default is "no".
+; forcegreetings=no	; This is the same as forcename, except for recording
+			;     greetings.  The default is "no".			
+
 [zonemessages]
 eastern=America/New_York|'vm-received' Q 'digits/at' IMp
 central=America/Chicago|'vm-received' Q 'digits/at' IMp
@@ -136,6 +141,8 @@ central24=America/Chicago|'vm-received' q 'digits/at' H 'digits/hundred' M 'hour
 ;4069 => 6522,Matt Brooks,matt@marko.net,,|tz=central|attach=yes|saycid=yes|dialout=fromvm|callback=fromvm|review=yes|operator=yes|envelope=yes
 ;4073 => 1099,Bianca Paige,bianca@biancapaige.com,,delete=1
 ;4110 => 3443,Rob Flynn,rflynn@blueridge.net
+;4321 => 4321,Russell Bryant,russelb@clemson.edu,,|tz=central|attach=no|saycid=yes|dialout=fromvm|callback=fromvm|review=yes|operator=yes|envelope=yes|forcename=yes|forcegreetings=yes
+
 
 ;
 ; Mailboxes may be organized into multiple contexts for