diff --git a/src/sbbs3/js_system.c b/src/sbbs3/js_system.c
index f8c73b84460e5e28c896588b03ab4708d17ad659..1b46da84533fe71d433bfe0ae16a41782ad210c8 100644
--- a/src/sbbs3/js_system.c
+++ b/src/sbbs3/js_system.c
@@ -621,7 +621,7 @@ static JSBool
 js_alias(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
-	char		buf[80];
+	char		buf[128];
 	JSString*	js_str;
 	scfg_t*		cfg;
 
@@ -644,10 +644,31 @@ js_alias(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		return(JS_FALSE);
 
 	*rval = STRING_TO_JSVAL(js_str);
+	return(JS_TRUE);
+}
+
+static JSBool
+js_username(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	int32		val;
+	char		buf[128];
+	JSString*	js_str;
+	scfg_t*		cfg;
+
+	if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
+		return(JS_FALSE);
+
+	val=0;
+	JS_ValueToInt32(cx,argv[0],&val);
+
+	if((js_str = JS_NewStringCopyZ(cx, username(cfg,val,buf)))==NULL)
+		return(JS_FALSE);
 
+	*rval = STRING_TO_JSVAL(js_str);
 	return(JS_TRUE);
 }
 
+
 static JSBool
 js_matchuser(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
@@ -1147,6 +1168,9 @@ js_new_user(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 
 
 static jsMethodSpec js_system_functions[] = {
+	{"username",		js_username,		1,	JSTYPE_STRING,	JSDOCSTR("number")
+	,JSDOCSTR("return user name for specified user number")
+	},
 	{"alias",			js_alias,			1,	JSTYPE_STRING,	JSDOCSTR("string alias")
 	,JSDOCSTR("return user name for alias")
 	},