diff --git a/src/sbbs3/js_bbs.cpp b/src/sbbs3/js_bbs.cpp
index 183c35666bb06791a4a6d371a9aaedd7787af7fe..2e0e324614f35e54284b2dc48c60febc3738fb10 100644
--- a/src/sbbs3/js_bbs.cpp
+++ b/src/sbbs3/js_bbs.cpp
@@ -4055,7 +4055,7 @@ js_msgscan_reinit(JSContext *cx, uintN argc, jsval *arglist)
 	jsrefcount	rc;
 
 	if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
-		return(JS_FALSE);
+		return JS_FALSE;
 
 	JS_SET_RVAL(cx, arglist, JSVAL_VOID);
 
@@ -4064,6 +4064,42 @@ js_msgscan_reinit(JSContext *cx, uintN argc, jsval *arglist)
 	sbbs->bputs(sbbs->text[MsgPtrsInitialized]);
 	JS_RESUMEREQUEST(cx, rc);
 
+	return JS_TRUE;
+}
+
+static JSBool
+js_save_msg_scan(JSContext *cx, uintN argc, jsval *arglist)
+{
+	sbbs_t*		sbbs;
+	jsrefcount	rc;
+
+	if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
+		return JS_FALSE;
+
+	JS_SET_RVAL(cx, arglist, JSVAL_VOID);
+
+	rc=JS_SUSPENDREQUEST(cx);
+	sbbs->putmsgptrs();
+	JS_RESUMEREQUEST(cx, rc);
+
+	return JS_TRUE;
+}
+
+static JSBool
+js_reload_msg_scan(JSContext *cx, uintN argc, jsval *arglist)
+{
+	sbbs_t*		sbbs;
+	jsrefcount	rc;
+
+	if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL)
+		return(JS_FALSE);
+
+	JS_SET_RVAL(cx, arglist, JSVAL_VOID);
+
+	rc=JS_SUSPENDREQUEST(cx);
+	sbbs->getmsgptrs();
+	JS_RESUMEREQUEST(cx, rc);
+
 	return(JS_TRUE);
 }
 
@@ -4642,6 +4678,14 @@ static jsSyncMethodSpec js_bbs_functions[] = {
 	,JSDOCSTR("re-initialize new message scan pointers to values at logon")
 	,310
 	},
+	{"save_msg_scan",	js_save_msg_scan,	0,	JSTYPE_VOID,	JSDOCSTR("")
+	,JSDOCSTR("save message scan configuration and pointers to userbase")
+	,320
+	},
+	{"reload_msg_scan",	js_reload_msg_scan,	0,	JSTYPE_VOID,	JSDOCSTR("")
+	,JSDOCSTR("re-loads message scan configuration and pointers from userbase")
+	,320
+	},
 	{"scan_subs",		js_scansubs,		0,	JSTYPE_VOID,	JSDOCSTR("[mode=<tt>SCAN_NEW</tt>] [,all=<tt>false</tt>]")
 	,JSDOCSTR("scan sub-boards for messages")
 	,310