diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c
index e8a392d13fdd762e728a5bfa88b5d3e65ec7bafd..1b1d5ce836c7c9cd718472c0f9dfd09c736ca118 100644
--- a/src/sbbs3/js_global.c
+++ b/src/sbbs3/js_global.c
@@ -346,26 +346,30 @@ js_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if(isfullpath(filename))
 		SAFECOPY(path,filename);
 	else {
-		path[0]=0;
+		JSObject* js_load_list = NULL;
+
+		path[0]=0;	/* Empty path, indicates load file not found (yet) */
+
 		if(JS_GetProperty(cx, obj, "js", &val) && val!=JSVAL_VOID && JSVAL_IS_OBJECT(val)) {
-			JSObject* js = JSVAL_TO_OBJECT(val);
-			if(JS_GetProperty(cx, js, "exec_dir", &val) && val!=JSVAL_VOID && JSVAL_IS_STRING(val)) {
+			JSObject* js_obj = JSVAL_TO_OBJECT(val);
+			
+			/* if js.exec_dir is defined (location of executed script), search their first */
+			if(JS_GetProperty(cx, js_obj, "exec_dir", &val) && val!=JSVAL_VOID && JSVAL_IS_STRING(val)) {
 				SAFEPRINTF2(path,"%s%s",js_ValueToStringBytes(cx, val, NULL),filename);
 				if(!fexistcase(path))
 					path[0]=0;
 			}
-			if(path[0]==0
-				&& JS_GetProperty(cx, js, JAVASCRIPT_LOAD_PATH_LIST, &val) 
-				&& val!=JSVAL_VOID
-				&& JSVAL_IS_OBJECT(val)) {
-				JSObject*	list = JSVAL_TO_OBJECT(val);
+			if(JS_GetProperty(cx, js_obj, JAVASCRIPT_LOAD_PATH_LIST, &val) && val!=JSVAL_VOID && JSVAL_IS_OBJECT(val))
+				js_load_list = JSVAL_TO_OBJECT(val);
+
+			/* if mods_dir is defined, search mods/js.load_path_list[n] next */
+			if(path[0]==0 && p->cfg->mods_dir[0]!=0 && js_load_list!=NULL) {
 				jsuint		i;
 				char		prefix[MAX_PATH+1];
+
 				for(i=0;path[0]==0;i++) {
-					if(!JS_GetElement(cx, list, i, &val) || val==JSVAL_VOID)
+					if(!JS_GetElement(cx, js_load_list, i, &val) || val==JSVAL_VOID)
 						break;
-					if(!JSVAL_IS_STRING(val))
-						continue;
 					SAFECOPY(prefix,js_ValueToStringBytes(cx, val, NULL));
 					if(prefix[0]==0)
 						continue;
@@ -377,20 +381,45 @@ js_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 					} else {
 						/* relative path */
 						SAFEPRINTF3(path,"%s%s%s",p->cfg->mods_dir,prefix,filename);
-						if(p->cfg->mods_dir[0]==0 || !fexistcase(path)) {
-							SAFEPRINTF3(path,"%s%s%s",p->cfg->exec_dir,prefix,filename);
-							if(!fexistcase(path))
-								path[0]=0;
-						}
+						if(!fexistcase(path))
+							path[0]=0;
 					}
 				}
 			}
 		}
-		if(path[0]==0) {
+		/* if mods_dir is defined, search their next */
+		if(path[0]==0 && p->cfg->mods_dir[0]!=0) {
 			SAFEPRINTF2(path,"%s%s",p->cfg->mods_dir,filename);
-			if(p->cfg->mods_dir[0]==0 || !fexistcase(path))
-				SAFEPRINTF2(path,"%s%s",p->cfg->exec_dir,filename);
+			if(!fexistcase(path))
+				path[0]=0;
+		}
+		/* if js.load_path_list is defined, search exec/load_path_list[n] next */
+		if(path[0]==0 && js_load_list!=NULL) {
+			jsuint		i;
+			char		prefix[MAX_PATH+1];
+
+			for(i=0;path[0]==0;i++) {
+				if(!JS_GetElement(cx, js_load_list, i, &val) || val==JSVAL_VOID)
+					break;
+				SAFECOPY(prefix,js_ValueToStringBytes(cx, val, NULL));
+				if(prefix[0]==0)
+					continue;
+				backslash(prefix);
+				if(isfullpath(prefix)) {
+					SAFEPRINTF2(path,"%s%s",prefix,filename);
+					if(!fexistcase(path))
+						path[0]=0;
+				} else {
+					/* relative path */
+					SAFEPRINTF3(path,"%s%s%s",p->cfg->exec_dir,prefix,filename);
+					if(!fexistcase(path))
+						path[0]=0;
+				}
+			}
 		}
+		/* lastly, search exec dir */
+		if(path[0]==0)
+			SAFEPRINTF2(path,"%s%s",p->cfg->exec_dir,filename);
 	}
 	JS_RESUMEREQUEST(cx, rc);