diff --git a/src/sbbs3/gtkuseredit/events.c b/src/sbbs3/gtkuseredit/events.c
index 702fc45fdca2586db0457af054d5a8787e614e97..8240f22658486a3047e2d8e8dbcc726f09c1b3dc 100644
--- a/src/sbbs3/gtkuseredit/events.c
+++ b/src/sbbs3/gtkuseredit/events.c
@@ -76,14 +76,16 @@ void load_user(GtkWidget *wiggy, gpointer data)
 	GtkTextIter	start;
 	GtkTextIter	end;
 
-	user.number=current_user;
-	if(user.number < 1 || user.number > totalusers) {
-		fprintf(stderr,"Attempted to load illegal user number %d.\n",user.number);
-		return;
-	}
-	if(getuserdat(&cfg, &user)) {
-		fprintf(stderr,"Error loading user %d.\n",current_user);
-		return;
+	if(current_user != 0) {
+		user.number=current_user;
+		if(user.number < 1 || user.number > totalusers) {
+			fprintf(stderr,"Attempted to load illegal user number %d.\n",user.number);
+			return;
+		}
+		if(getuserdat(&cfg, &user)) {
+			fprintf(stderr,"Error loading user %d.\n",current_user);
+			return;
+		}
 	}
 
 	/* Toolbar indicators */
@@ -845,10 +847,12 @@ void save_user(GtkWidget *wiggy, gpointer data)
 			fprintf(stderr,"Cannot get the alias widget\n");
 		else {
 			strcpy(user.alias, gtk_entry_get_text(GTK_ENTRY(w)));
-			if(user.misc & DELETED)
-				putusername(&cfg, user.number, "");
-			else
-				putusername(&cfg, user.number, user.alias);
+			if(user.number) {
+				if(user.misc & DELETED)
+					putusername(&cfg, user.number, "");
+				else
+					putusername(&cfg, user.number, user.alias);
+			}
 		}
 
 		/* Real Name */
@@ -1775,14 +1779,72 @@ void save_user(GtkWidget *wiggy, gpointer data)
 			fclose(f);
 		}
 
-	putuserdat(&cfg, &user);
-
-	load_user(wiggy, data);
+	if(user.number) {
+		putuserdat(&cfg, &user);
+		load_user(wiggy, data);
+	}
+	else {
+		newuserdat(&cfg, &user);
+		update_current_user(user.number);
+	}
 }
 
 void new_user(GtkWidget *wiggy, gpointer data)
 {
-	/* ToDo */
+	GtkWidget	*eCurrentUser;
+	int			i;
+
+	memset(&user,0,sizeof(user));
+ 
+	/****************/   
+	/* Set Defaults */
+	/****************/
+ 
+	/* security */
+	user.level=cfg.new_level;
+	user.flags1=cfg.new_flags1;
+	user.flags2=cfg.new_flags2;
+	user.flags3=cfg.new_flags3;
+	user.flags4=cfg.new_flags4;
+	user.rest=cfg.new_rest;
+	user.exempt=cfg.new_exempt;
+ 
+	user.cdt=cfg.new_cdt;
+	user.min=cfg.new_min;
+	user.freecdt=cfg.level_freecdtperday[user.level];
+	 
+	if(cfg.total_fcomps)
+		strcpy(user.tmpext,cfg.fcomp[0]->ext);
+	else
+		strcpy(user.tmpext,"ZIP");
+	for(i=0;i<cfg.total_xedits;i++)
+		if(!stricmp(cfg.xedit[i]->code,cfg.new_xedit))
+			break;
+	if(i<cfg.total_xedits)
+		user.xedit=i+1;
+	 
+	user.shell=cfg.new_shell;
+	user.misc=(cfg.new_misc&~(DELETED|INACTIVE|QUIET|NETMAIL));
+	user.misc|=AUTOTERM;    /* No way to frob the default value... */
+	user.qwk=QWK_DEFAULT;
+	user.firston=time(NULL);
+	user.laston=time(NULL);	/* must set this or user may be purged prematurely */
+	user.pwmod=time(NULL);
+	user.sex=' ';
+	user.prot=cfg.new_prot;
+
+	if(cfg.new_expire)
+		user.expire=time(NULL)+((long)cfg.new_expire*24L*60L*60L);
+
+	eCurrentUser=glade_xml_get_widget(xml, "eCurrentUser");
+	if(eCurrentUser==NULL) {
+		fprintf(stderr,"Cannot get the current user widget\n");
+		load_user(wiggy, data);
+		return;
+	}
+	gtk_entry_set_text(GTK_ENTRY(eCurrentUser), "New"	);
+	current_user=0;
+	load_user(wiggy, data);
 }
 
 int update_current_user(int new_user)