diff --git a/exec/xjs_handler.js b/exec/xjs_handler.js
index 9b0764702eae5fa437fc2a33dbfd04eba495caf8..066142c5825c54034ceb0c4f98733ae1f5c909ea 100644
--- a/exec/xjs_handler.js
+++ b/exec/xjs_handler.js
@@ -2,86 +2,99 @@
 
 /* $Id$ */
 
-var filename;
+var xjs_filename;
 
 if(this.http_request!=undefined)	/* Requested through web-server */
-	filename = http_request.real_path;
+	xjs_filename = http_request.real_path;
 else
-	filename = argv[0];
+	xjs_filename = argv[0];
 
-var ssjs_filename=filename+".ssjs";
+var last_cwd='';
 
-// Probably a race condition on Win32
-if(file_exists(ssjs_filename)) {
-	if(file_date(ssjs_filename)<=file_date(filename)) {
-		file_remove(ssjs_filename);
-	}
-}
+xjs_load(xjs_filename);
+
+function xjs_load(filename) {
+	var cwd=filename;
+	cwd=cwd.replace(/[^\\\/]*$/,'');
 
-if(!file_exists(ssjs_filename)) {
-	var file = new File(filename);
-	if(!file.open("r",true,8192)) {
-		writeln("!ERROR " + file.error + " opening " + filename);
-		exit();
+	if(last_cwd != '')
+		filename=last_cwd+'/'+filename;
+	var ssjs_filename=filename+".ssjs";
+
+	// Probably a race condition on Win32
+	if(file_exists(ssjs_filename)) {
+		if(file_date(ssjs_filename)<=file_date(filename)) {
+			file_remove(ssjs_filename);
+		}
 	}
-	var text = file.readAll(8192);
-	file.close();
 
-	var script="";
+	if(!file_exists(ssjs_filename)) {
+		var file = new File(filename);
+		if(!file.open("r",true,8192)) {
+			writeln("!ERROR " + file.error + " opening " + filename);
+			exit();
+		}
+		var text = file.readAll(8192);
+		file.close();
+
+		var script="";
 
-	var in_xjs=false;
-	for (line in text) {
-		var str=text[line];
-		while(str != '') {
-			if(!in_xjs) {
-				if(str=='<?xjs' || str=='<?') {
-					in_xjs=true;
-					str='';
+		var in_xjs=false;
+		for (line in text) {
+			var str=text[line];
+			while(str != '') {
+				if(!in_xjs) {
+					if(str=='<?xjs' || str=='<?') {
+						in_xjs=true;
+						str='';
+					}
+					else {
+						if(str.search(/<\?(xjs)?\s+/)==-1) {
+							script += "writeln("+escape_quotes(str)+");";
+							str='';
+						}
+						else {
+							str=str.replace(/^(.*?)<\?(xjs)?\s+/,
+								function (str, p1, p2, offset, s) {
+									if(p1 != '')
+										script += "write("+escape_quotes(p1)+");";
+									in_xjs=true;
+									return '';
+								}
+							);
+						}
+					}
 				}
 				else {
-					if(str.search(/<\?(xjs)?\s+/)==-1) {
-						script += "writeln("+escape_quotes(str)+");";
+					if(str.search(/\?>/)==-1) {
+						script += str;
 						str='';
 					}
 					else {
-						str=str.replace(/^(.*?)<\?(xjs)?\s+/,
-							function (str, p1, p2, offset, s) {
-								if(p1 != '')
-									script += "write("+escape_quotes(p1)+");";
-								in_xjs=true;
+						str=str.replace(/^(.*?)\?>/,
+							function (str, p1, offset, s) {
+								script += p1+";";
+								in_xjs=false;
 								return '';
 							}
 						);
 					}
 				}
 			}
-			else {
-				if(str.search(/\?>/)==-1) {
-					script += str;
-					str='';
-				}
-				else {
-					str=str.replace(/^(.*?)\?>/,
-						function (str, p1, offset, s) {
-							script += p1+";";
-							in_xjs=false;
-							return '';
-						}
-					);
-				}
-			}
+			script += '\n';
 		}
-		script += '\n';
-	}
 
-	var f=new File(ssjs_filename);
-	if(f.open("w",false)) {
-		f.write(script);
-		f.close();
+		var f=new File(ssjs_filename);
+		if(f.open("w",false)) {
+			f.write(script);
+			f.close();
+		}
 	}
-}
 
-load(ssjs_filename);
+	last_cwd=cwd;
+
+	load(ssjs_filename);
+}
 
 function escape_quotes(arg) {
 	return("'"+arg.replace(/'/g,"'+"+'"'+"'"+'"+'+"'")+"'");