diff --git a/src/sbbs3/js_user.c b/src/sbbs3/js_user.c
index 0bc0568696960743e66b445d5360242c0779b369..87e774dc58a5130d5955572f120589dd127c7902 100644
--- a/src/sbbs3/js_user.c
+++ b/src/sbbs3/js_user.c
@@ -574,9 +574,11 @@ static JSBool js_user_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict,
 			putuserstr(scfg, p->user->number, USER_CURXTRN, str);
 			break;
 		case USER_PROP_XEDIT:
+			p->user->xedit = getxeditnum(scfg, str);
 			putuserstr(scfg, p->user->number, USER_XEDIT, str);
 			break;
 		case USER_PROP_SHELL:
+			p->user->shell = getshellnum(scfg, str);
 			putuserstr(scfg, p->user->number, USER_SHELL, str);
 			break;
 		case USER_PROP_MISC:
diff --git a/src/sbbs3/scfglib.h b/src/sbbs3/scfglib.h
index 36df5f496491568ab853deb1430e02744fc1b9ac..aa3e089d076cffa62b96ce91264c9a6159932d0b 100644
--- a/src/sbbs3/scfglib.h
+++ b/src/sbbs3/scfglib.h
@@ -63,6 +63,8 @@ int		getgrpnum_from_name(scfg_t*, const char* name);
 int		getxtrnsec(scfg_t*, const char* code);
 int		getgurunum(scfg_t*, const char* code);
 int		getchatactset(scfg_t*, const char* name);
+int		getxeditnum(scfg_t*, const char* code);
+int		getshellnum(scfg_t*, const char* code);
 
 DLLEXPORT BOOL	is_valid_dirnum(scfg_t*, int);
 DLLEXPORT BOOL	is_valid_libnum(scfg_t*, int);
diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c
index d0abdcb375aa5c971f62344d7dfff6c89f940ea9..2daba463ee589f0f5efe2c315ca35c62c1a1101d 100644
--- a/src/sbbs3/scfglib1.c
+++ b/src/sbbs3/scfglib1.c
@@ -791,6 +791,30 @@ int getchatactset(scfg_t* cfg, const char* name)
 	return i;
 }
 
+// Returns 0 (internal editor) or 1-based external editor index
+int getxeditnum(scfg_t* cfg, const char* code)
+{
+	int i;
+
+	for(i = 0; i < cfg->total_xedits; ++i) {
+		if(stricmp(cfg->xedit[i]->code, code) == 0)
+			return i + 1;
+	}
+	return 0;
+}
+
+// Returns 0 (first shell) if shell code isn't valid
+int getshellnum(scfg_t* cfg, const char* code)
+{
+	int i;
+
+	for(i = 0; i < cfg->total_shells; ++i) {
+		if(stricmp(cfg->shell[i]->code, code) == 0)
+			return i;
+	}
+	return 0;
+}
+
 BOOL is_valid_dirnum(scfg_t* cfg, int dirnum)
 {
 	return (dirnum >= 0) && (cfg != NULL) && (dirnum < cfg->total_dirs);
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index cbc10bd805178206d1416039e1d0cbc0e11242f4..81b1d7b0b83e039eadda71e0ce2cf31fa62e25fe 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -419,18 +419,8 @@ int parseuserdat(scfg_t* cfg, char *userdat, user_t *user, char* field[])
 	user->rows = strtoul(field[USER_ROWS], NULL, 0);
 	user->cols = strtoul(field[USER_COLS], NULL, 0);
 
-	for(int i = 0; i < cfg->total_xedits; i++) {
-		if(stricmp(field[USER_XEDIT], cfg->xedit[i]->code) == 0) {
-			user->xedit = i + 1;
-			break;
-		}
-	}
-	for(int i=0; i < cfg->total_shells; i++) {
-		if(stricmp(field[USER_SHELL], cfg->shell[i]->code) == 0) {
-			user->shell = i;
-			break;
-		}
-	}
+	user->xedit = getxeditnum(cfg, field[USER_XEDIT]);
+	user->shell = getshellnum(cfg, field[USER_SHELL]);
 
 	SAFECOPY(user->tmpext, field[USER_TMPEXT]);
 	user->prot = *field[USER_PROT];