diff --git a/exec/load/recordfile.js b/exec/load/recordfile.js
index 1bdfe9a1c86bd8b5f0248752074cd33eaf959960..431825db0297e0ea1816b00ca5f331be7007ac62 100644
--- a/exec/load/recordfile.js
+++ b/exec/load/recordfile.js
@@ -37,6 +37,8 @@ function RecordFile(filename, definition)
 	this.file=new File(filename);
 	this.fields=definition;
 	this.RecordLength=GetRecordLength(this.fields);
+	// Hopefully a vbuf of record length prevents stale data?
+	// It likely doesn't though.
 	if(!this.file.open(file_exists(this.file.name)?"rb+":"wb+",true,this.RecordLength))
 		return(null);
 	this.__defineGetter__("length", function() {return parseInt(this.file.length/this.RecordLength);});
@@ -49,14 +51,30 @@ function RecordFileRecord(parent, num)
 	this.Record=num;
 }
 
-RecordFileRecord.prototype.ReLoad = function()
+RecordFileRecord.prototype.ReLoad = function(keeplocked)
 {
 	var i;
+	var lock;
 
+	lock = (this.parent.locks.indexOf(this.Record) == -1);
+	if (keeplocked === undefined) {
+		if (lock)
+			keeplocked = false;
+		else
+			keeplocked = true;
+	}
+
+// Locks don't work because threads hate them. :(
 	this.parent.file.position=(this.Record)*this.parent.RecordLength;
+	if (lock)
+		while(!this.Lock());	// Forever
+
 	for(i=0; i<this.parent.fields.length; i++)
 		this[this.parent.fields[i].prop]=this.parent.ReadField(this.parent.fields[i].type);
-}
+
+	if (!keeplocked)
+		this.UnLock();
+};
 
 RecordFile.prototype.Lock = function(rec, timeout)
 {
@@ -83,7 +101,7 @@ RecordFile.prototype.Lock = function(rec, timeout)
 		this.locks.push(rec);
 
 	return ret;
-}
+};
 
 RecordFile.prototype.UnLock = function(rec)
 {
@@ -101,38 +119,56 @@ RecordFile.prototype.UnLock = function(rec)
 	this.locks.splice(lck, 1);
 
 	return ret;
-}
+};
 
 RecordFileRecord.prototype.UnLock = function()
 {
 	return this.parent.UnLock(this.Record);
-}
+};
 
 RecordFileRecord.prototype.Lock = function(timeout)
 {
 	return this.parent.Lock(this.Record, timeout);
-}
+};
 
-RecordFileRecord.prototype.Put = function()
+RecordFileRecord.prototype.Put = function(keeplocked)
 {
 	var i;
+	var lock;
+
+	lock = (this.parent.locks.indexOf(this.Record) == -1);
+	if (keeplocked === undefined) {
+		if (lock)
+			keeplocked = false;
+		else
+			keeplocked = true;
+	}
 
 	this.parent.file.position=this.Record * this.parent.RecordLength;
+
+	if (lock)
+		while(!this.Lock());	// Forever
+
 	for(i=0; i<this.parent.fields.length; i++)
-		this.parent.WriteField(this[this.parent.fields[i].prop], this.parent.fields[i].type, this.parent.fields[i].def);
-}
+		this.parent.WriteField(this[this.parent.fields[i].prop], this.parent.fields[i].type, eval(this.parent.fields[i].def.toSource()).valueOf());
+
+	if (!keeplocked)
+		this.UnLock();
+};
 
 RecordFileRecord.prototype.ReInit = function()
 {
 	var i;
 
-	for(i=0; i<this.parent.fields.length; i++)
-		this[this.parent.fields[i].prop]=eval(this.parent.fields[i].def.toSource());
-}
+	for(i=0; i<this.parent.fields.length; i++) {
+		this[this.parent.fields[i].prop]=eval(this.parent.fields[i].def.toSource()).valueOf();
+	}
+};
 
-RecordFile.prototype.Get = function(num)
+RecordFile.prototype.Get = function(num, keeplocked)
 {
 	var rec=0;
+	var lock;
 	var i;
 
 	if(num==undefined || num < 0 || parseInt(num)!=num)
@@ -142,33 +178,61 @@ RecordFile.prototype.Get = function(num)
 	if(num>=this.length)
 		return(null);
 
+	lock = (this.locks.indexOf(num) == -1);
+	if (keeplocked === undefined) {
+		if (lock)
+			keeplocked = false;
+		else
+			keeplocked = true;
+	}
+
 	var ret = new RecordFileRecord(this, num);
 
 	this.file.position=ret.Record * this.RecordLength;
+
+	if (lock)
+		while(!ret.Lock());	// Forever
+
 	for(i=0; i<this.fields.length; i++)
 		ret[this.fields[i].prop]=this.ReadField(this.fields[i].type);
 
+	if (!keeplocked)
+		ret.UnLock();
+
 	return(ret);
-}
+};
 
-RecordFile.prototype.New = function(timeout)
+RecordFile.prototype.New = function(timeout, keeplocked)
 {
 	var i;
 	var ret;
+	var lock;
+
+	lock = (this.locks.indexOf(this.Record) == -1);
+	if (keeplocked === undefined) {
+		if (lock)
+			keeplocked = false;
+		else
+			keeplocked = true;
+	}
 
-	if (!this.Lock(this.length, timeout))
-		return undefined;
 
 	ret = new RecordFileRecord(this, this.length);
 
+	if (lock) {
+		if (!ret.Lock(timeout))
+			return undefined;
+	}
+
 	for(i=0; i<this.fields.length; i++)
-		ret[this.fields[i].prop]=eval(this.fields[i].def.toSource());
+		ret[this.fields[i].prop]=eval(this.fields[i].def.toSource()).valueOf();
 
 	ret.Put();
-	ret.UnLock();
+	if (!keeplocked)
+		ret.UnLock();
 
 	return(ret);
-}
+};
 
 RecordFile.prototype.ReadField = function(fieldtype)
 {
@@ -211,7 +275,7 @@ RecordFile.prototype.ReadField = function(fieldtype)
 				return(null);
 		}
 	}
-}
+};
 
 RecordFile.prototype.WriteField = function(val, fieldtype, def)
 {
@@ -276,5 +340,5 @@ RecordFile.prototype.WriteField = function(val, fieldtype, def)
 				break;
 		}
 	}
-}
+};