diff --git a/web/root/newuser.ssjs b/web/root/newuser.ssjs
index c67304a5a61907117b748e4ccd652e973ffd8956..bab06121a731177c665291f22b831a25073f8b35 100644
--- a/web/root/newuser.ssjs
+++ b/web/root/newuser.ssjs
@@ -4,11 +4,15 @@
 
 /* $Id$ */
 
+var required_str="*";
+var	optional_str="";
+
 load("sbbsdefs.js");
 load("html_inc/template.ssjs");
 
-var fields=new Array("alias","name","handle","netmail","address","location","zipcode","phone","birthdate","gender");
-var required=new Array("name","netmail","address","location","zipcode","phone","birthdate","gender");
+template.required=required_str;
+var fields=new Array("alias","name","handle","netmail","address","location","zipcode","phone","birthdate","gender", "shell", "editor");
+var required=new Array;
 var maxlengths={alias:25,name:25,handle:8,netmail:60,address:30,location:30,zipcode:10,phone:12,birthdate:8,gender:1};
 var err=0;
 template.err_message='';
@@ -20,9 +24,117 @@ template.title=system.name+" new user signup";
 template.posted=http_request.query;
 template.errs=new Object;
 
+/* System is closed to new users */
+if(system.settings & SYS_CLOSED) {
+	write_template("header.inc");
+	write("This system is closed to new users, sorry.");
+	write_template("footer.inc");
+	exit(0);
+}
+
+/* Set up fields and required array */
+template.RealNameIs="Real Name";
+if(system.newuser_questions & UQ_ALIASES) {
+	required.push("alias");
+	template.alias_required=required_str;
+}
+else
+	template.alias_required=optional_str;
+
+if(system.newuser_questions & UQ_LOCATION) {
+	required.push("location");
+	template.loc_required=required_str;
+}
+else
+	template.loc_required=optional_str;
+
+if(system.newuser_questions & UQ_ADDRESS) {
+	required.push("zipcode");
+	template.zip_required=required_str;
+	required.push("address");
+	template.addr_required=required_str;
+}
+else {
+	template.zip_required=optional_str;
+	template.addr_required=optional_str;
+}
+
+if(system.newuser_questions & UQ_PHONE) {
+	required.push("phone");
+	template.ph_required=required_str;
+}
+else
+	template.ph_required=optional_str;
+
+if(system.newuser_questions & UQ_HANDLE) {
+	required.push("handle");
+	template.handle_required=required_str;
+}
+else
+	template.handle_required=optional_str;
+
+if(system.newuser_questions & UQ_SEX) {
+	required.push("gender");
+	template.sex_required=required_str;
+}
+else
+	template.sex_required=optional_str;
+
+if(system.newuser_questions & UQ_BIRTH) {
+	required.push("birthdate");
+	template.bd_required=required_str;
+}
+else
+	template.bd_required=optional_str;
+
+if(system.newuser_questions & UQ_REALNAME) {
+	required.push("name");
+	template.name_required=required_str;
+}
+else
+	template.name_required=optional_str;
+
+if(!(system.newuser_questions & UQ_ALIASES && system.newuser_questions & UQ_REALNAME)) {
+	if(system.newuser_questions & UQ_COMPANY) {
+		template.RealNameIs="Company Name";
+		required.push("name");
+		template.name_required=required_str;
+	}
+}
+
+/* List of shells is on the ToDo list */
+http_request.query.shell=system.newuser_command_shell;
+if(system.newuser_questions & UQ_CMDSHELL) {
+	required.push("shell");
+	template.shell_required=required_str;
+}
+else
+	template.shell_required=optional_str;
+
+if(system.newuser_questions & UQ_XEDIT) {
+	required.push("editor");
+	template.editor_required=required_str;
+}
+else
+	template.editor_required=optional_str;
+
+if(system.newuser_questions & UQ_NONETMAIL)
+	template.email_required=optional_str;
+else {
+	required.push("email");
+	template.email_required=required_str;
+}
+
+/* ToDo: Deal with UQ_DUPREAL, UQ_NOEXASC, UQ_NODEF, UQ_NOCOMMAS, UQ_NOUPRLWR */
+
 /* Plain GET with no query, just display the sign-up page */
 if(http_request.method=='GET') {
-	template.gender_list='<select name="gender">\n<option value="M">Male</option>\n<option value="F">Female</option>\n</select>';
+	if(system.newuser_questions & UQ_SEX)
+		template.gender_list='<select name="gender">\n<option value="M">Male</option>\n<option value="F">Female</option>\n</select>';
+	else
+		template.gender_list='<select name="gender">\n<option value="">Unspecified</option>\n<option value="M">Male</option>\n<option value="F">Female</option>\n</select>';
+	template.shell_list=gen_shell_list(system.newuser_command_shell);
+	template.editor_list=gen_editor_list(system.newuser_editor);
 	showform();
 }
 else {
@@ -30,15 +142,28 @@ else {
 	if(http_request.query["gender"] != undefined)
 		gender=http_request.query["gender"].toString().toUpperCase();
 	template.gender_list='<select name="gender">\n';
+	if(!(system.newuser_questions & UQ_SEX))
+		template.gender_list+='<option value=""'+(gender==''?' selected':'')+'>Unspecified</option>\n';
 	template.gender_list+='<option value="M"'+(gender=='M'?' selected':'')+'>Male</option>\n';
 	template.gender_list+='<option value="F"'+(gender=='F'?' selected':'')+'>Female</option>\n</select>';
 
+	if(http_request.query["shell"] != undefined)
+		template.shell_list=gen_shell_list(http_request.query.shell[0]);
+	else
+		template.shell_list=gen_shell_list(system.newuser_command_shell);
+	if(http_request.query["editor"] != undefined)
+		template.editor_list=gen_editor_list(http_request.query.editor[0]);
+	else
+		template.editor_list=gen_editor_list(system.newuser_editor);
+
 	/* POST request... should be a valid application */
 	for(field in fields) {
 		if(http_request.query[fields[field]]==undefined) {
 			template.gender_list='<select name="gender">\n<option value="M">Male</option>\n<option value="F">Female</option>\n</select>';
- 		err=1;
+			err=1;
 			template.errs[fields[field]]="MISSING";
+write(fields[field]);
+write("Fields: "+fields);
 			template.err_message+="Some fields missing from POST data... possible browser issue.\r\n";
 		}
 		if(err)
@@ -84,7 +209,7 @@ else {
 			}
 		}
 	}
-	if(system.new_user_questions & UQ_DUPHAND & system.matchuserdata(50,http_request.query["handle"])) {
+	if(system.newuser_questions & UQ_DUPHAND & system.matchuserdata(50,http_request.query["handle"])) {
 		err=1;
 		template.err_message+="Please choose a different chat handle\r\n";
 		template.errs["handle"]="Duplicate handle";
@@ -105,37 +230,39 @@ else {
 	}
 
 	/* Generate and send email */
-	var hdrs = new Object;
-	hdrs.to=http_request.query.name;
-	hdrs.to_net_type=netaddr_type(http_request.query.netmail);
-	if(hdrs.to_net_type!=NET_NONE) {
-		hdrs.to_net_addr=http_request.query.netmail;
-	}
-	else {
-		err=1;
-		template.err_message+="Cannot mail password to new email address!\r\n";
-		showform();
-	}
-	hdrs.from=system.name;
-	hdrs.from_net_addr='sysop@'+system.inet_addr;
-	hdrs.from_net_type=NET_INTERNET;
-	hdrs.subject="New user signup";
-	var msgbase = new MsgBase("mail");
-	if(msgbase.open!=undefined && msgbase.open()==false) {
-		err=1;
-		template.err_message+=msgbase.last_error+"\r\n";
-		showform();
-	}
-	var msg="Your account on "+system.name+" has been created!\n\n";
-	msg += "User name: "+http_request.query.name+"\n";
-	msg += "Password: "+newpw+"\n";
+	if(http_request.query.netmail != undefined && http_request.query.netmail != '') {
+		var hdrs = new Object;
+		hdrs.to=http_request.query.name;
+		hdrs.to_net_type=netaddr_type(http_request.query.netmail);
+		if(hdrs.to_net_type!=NET_NONE) {
+			hdrs.to_net_addr=http_request.query.netmail;
+		}
+		else {
+			err=1;
+			template.err_message+="Cannot mail password to new email address!\r\n";
+			showform();
+		}
+		hdrs.from=system.name;
+		hdrs.from_net_addr='sysop@'+system.inet_addr;
+		hdrs.from_net_type=NET_INTERNET;
+		hdrs.subject="New user signup";
+		var msgbase = new MsgBase("mail");
+		if(msgbase.open!=undefined && msgbase.open()==false) {
+			err=1;
+			template.err_message+=msgbase.last_error+"\r\n";
+			showform();
+		}
+		var msg="Your account on "+system.name+" has been created!\n\n";
+		msg += "User name: "+http_request.query.name+"\n";
+		msg += "Password: "+newpw+"\n";
 
-	if(!msgbase.save_msg(hdrs,msg))  {
-		err=1;
-		template.err_message+=msgbase.last_error+"\r\n";
-		showform();
+		if(!msgbase.save_msg(hdrs,msg))  {
+			err=1;
+			template.err_message+=msgbase.last_error+"\r\n";
+			showform();
+		}
+		msgbase.close();
 	}
-	msgbase.close();
 
 	nuser=system.new_user(http_request.query.name);
 	nuser.name=http_request.query.name;
@@ -149,10 +276,15 @@ else {
 	nuser.gender=http_request.query.gender;
 	nuser.security.password=newpw;
 	nuser.phone=http_request.query.phone;
+	nuser.shell=http_request.query.shell;
+	nuser.editor=http_request.query.editor;
 
 	template.title="New user created";
 	write_template("header.inc");
-	write("Your account has been created and the password has been mailed to: "+http_request.query.netmail);
+	if(http_request.query.netmail != undefined && http_request.query.netmail != '')
+		write("Your account has been created and the password has been mailed to: "+http_request.query.netmail);
+	else
+		write("Your account has been created and the password is: "+newpw);
 	write_template("footer.inc");
 }
 
@@ -171,3 +303,20 @@ function genpass() {
 	}
 	return(pw);
 }
+
+/* List of shells is on the ToDo list */
+function gen_shell_list(current) {
+	return("");
+}
+
+/* List of editors is on the ToDo list */
+function gen_editor_list(current) {
+	var retval="";
+	retval='<select name="editor">\n';
+	retval+='<option value=""'+(current==''?' selected':'')+'>Internal Editor</option>\n';
+	for(ed in xtrn_area.editor) {
+		retval+='<option value="'+ed+'"'+(current==ed?' selected':'')+'>'+xtrn_area.editor[ed].name+'</option>\n';
+	}
+	retval+='</select>';
+	return(retval);
+}
diff --git a/web/templates/default/newuser.inc b/web/templates/default/newuser.inc
index f5bb3e132f6495d99071df133c7181e8a08d581a..3fec8d813b6872ddc96ee858d490ee125e7c7381 100644
--- a/web/templates/default/newuser.inc
+++ b/web/templates/default/newuser.inc
@@ -1,48 +1,55 @@
 <!-- $Id$ -->
 <p class="navigation"><a class="navigation" href="http://^^JS:system.inet_addr^^/">Home</a> : New User Application</p>
+<center>
+	(%%required%% indicates required fields)<br>
 	%%err_message%%
+</center>
 	<form action="newuser.ssjs" method="post">
 		<table class="newuser" cellpadding="0" cellspacing="2">
 			<tr>
-				<td class="newuser" align="right">%%errs:alias%% Alias:</td>
+				<td class="newuser" align="right">%%errs:alias%% %%alias_required%% Alias:</td>
 				<td class="newuser" align="left"><input type="text" name="alias" size="25" maxlength="25" value="%%posted:alias%%" /></td>
 			</tr>
 			<tr>
-				<td class="newuser" align="right">%%errs:name%% Real Name:</td>
+				<td class="newuser" align="right">%%errs:name%% %%name_required%% %%RealNameIs%%:</td>
 				<td class="newuser" align="left"><input type="text" name="name" size="25" maxlength="25" value="%%posted:name%%" /></td>
 			</tr>
 			<tr>
-				<td class="newuser" align="right">%%errs:handle%% Chat Handle:</td>
+				<td class="newuser" align="right">%%errs:handle%% %%handle_required%% Chat Handle:</td>
 				<td class="newuser" align="left"><input type="text" name="handle" size="8" maxlength="8" value="%%posted:handle%%" /></td>
 			</tr>
 			<tr>
-				<td class="newuser" align="right">%%errs:netmail%% E-Mail Address:</td>
+				<td class="newuser" align="right">%%errs:netmail%% %%email_required%% E-Mail Address:</td>
 				<td class="newuser" align="left"><input type="text" name="netmail" size="60" maxlength="60" value="%%posted:netmail%%" /></td>
 			</tr>
 			<tr>
-				<td class="newuser" align="right">%%errs:address%% Mailing Address:</td>
+				<td class="newuser" align="right">%%errs:address%% %%addr_required%% Mailing Address:</td>
 				<td class="newuser" align="left"><input type="text" name="address" size="30" maxlength="30" value="%%posted:address%%" /></td>
 			</tr>
 			<tr>
-				<td class="newuser" align="right">%%errs:location%% City and Province/State:</td>
+				<td class="newuser" align="right">%%errs:location%% %%loc_required%% City and Province/State:</td>
 				<td class="newuser" align="left"><input type="text" name="location" size="30" maxlength="30" value="%%posted:location%%" /></td>
 			</tr>
 			<tr>
-				<td class="newuser" align="right">%%errs:zipcode%% Postal/Zip Code:</td>
+				<td class="newuser" align="right">%%errs:zipcode%%  %%zip_required%% Postal/Zip Code:</td>
 				<td class="newuser" align="left"><input type="text" name="zipcode" size="10" maxlength="10" value="%%posted:zipcode%%" /></td>
 			</tr>
 			<tr>
-				<td class="newuser" align="right">%%errs:phone%% Phone Number (###-###-####):</td>
+				<td class="newuser" align="right">%%errs:phone%% %%ph_required%% Phone Number (###-###-####):</td>
 				<td class="newuser" align="left"><input type="text" name="phone" size="12" maxlength="12" value="%%posted:phone%%" /></td>
 			</tr>
 			<tr>
-				<td class="newuser" align="right">%%errs:birthdate%% Birthdate (MM/DD/YY):</td>
+				<td class="newuser" align="right">%%errs:birthdate%% %%bd_required%% Birthdate (MM/DD/YY):</td>
 				<td class="newuser" align="left"><input type="text" name="birthdate" size="8" maxlength="8" value="%%posted:birthdate%%" /></td>
 			</tr>
 			<tr>
-				<td class="newuser" align="right">%%errs:gender%% Gender:</td>
+				<td class="newuser" align="right">%%errs:gender%% %%sex_required%% Gender:</td>
 				<td class="newuser">@@gender_list@@</td>
 			</tr>
+			<tr>
+				<td class="newuser" align="right">%%errs:editor%% %%editor_required%% External Editor:</td>
+				<td class="newuser">@@editor_list@@</td>
+			</tr>
             <tr>
             <td class="newuser">&nbsp;</td>
             <td class="newuser">