diff --git a/xtrn/lord/lord.js b/xtrn/lord/lord.js
index 9b11dd68fc9afaf4b5f8655b2597f8fee5e60e1f..8c0d6e35da97abbbaaeeb270ab9fe25f55a38802 100644
--- a/xtrn/lord/lord.js
+++ b/xtrn/lord/lord.js
@@ -39,6 +39,7 @@ var whitelist = [];
 var rip = false;
 var lastrip = '';
 var syncterm_cache;
+var syncterm_cache_files={};
 
 var trainer_stats = [
 	{
@@ -17424,8 +17425,18 @@ function supports_syncterm_cache()
 
 	dk.console.print('\x1b_SyncTERM:C;L;test\x1b\\');
 	stat = read_apc(10000);
-	if (stat != undefined)
+	if (stat != undefined) {
+		dk.console.print('\x1b_SyncTERM:C;L;RIP/*.*\x1b\\');
+		var lst = read_apc(10000)
+		lst = lst.split('\n');
+		for (var entry in lst) {
+			var entryarr = lst[entry].split('\t');
+			if (entryarr.length == 2) {
+				syncterm_cache_files[entryarr[0]] = entryarr[1];
+			}
+		}
 		return true;
+	}
 	return false;
 }
 
@@ -17460,48 +17471,66 @@ function upload_if_newer(fname)
 
 	if (!file_exists(path))
 		return false;
+	if (syncterm_cache === undefined)
+		syncterm_cache = supports_syncterm_cache();
 	while (dk.console.waitkey(0))
 		dk.console.getkey();
 	dk.console.print('\r\x1b[K  Checking '+fname);
-	dk.console.print('\r!|1F030000'+fname+'\r\n');
-	stat = read_str(10000, /[01]\.[0-9]+\.[0-9]{2}\/[0-9]{2}\/[0-9]{2}\.[0-9]{2}:[0-9]{2}:[0-9]{2}/);
-	if (stat == '')
-		return false;
-	if (stat == '0') {
+	if (syncterm_cache) {
 		need_file = true;
+		if (syncterm_cache_files[fname] !== undefined) {
+			var f = new File(path);
+			var hash;
+			if (f.open("rb")) {
+				hash = f.md5_hex;
+				f.close();
+				if (hash === syncterm_cache_files[fname]) {
+					return true;
+				}
+			}
+		}
 	}
 	else {
-		// 1.20345.01/02/93.03:04:30
-		m = stat.match(/^1\.([0-9]+)\.([0-9]{2})\/([0-9]{2})\/([0-9]{2})\.([0-9]{2}):([0-9]{2}):([0-9]{2})$/);
-		if (m === null) {
+		dk.console.print('\r!|1F030000'+fname+'\r\n');
+		stat = read_str(10000, /[01]\.[0-9]+\.[0-9]{2}\/[0-9]{2}\/[0-9]{2}\.[0-9]{2}:[0-9]{2}:[0-9]{2}/);
+		if (stat == '')
+			return false;
+		if (stat == '0') {
 			need_file = true;
 		}
 		else {
-			if (parseInt(m[1], 10) != file_size(path)) {
+			// 1.20345.01/02/93.03:04:30
+			m = stat.match(/^1\.([0-9]+)\.([0-9]{2})\/([0-9]{2})\/([0-9]{2})\.([0-9]{2}):([0-9]{2}):([0-9]{2})$/);
+			if (m === null) {
 				need_file = true;
 			}
 			else {
-				fdate.setTime(file_date(path));
-				rdate.setUTCMilliseconds(0);
-				rdate.setUTCSeconds(parseInt(m[7], 10));
-				rdate.setUTCMinutes(parseInt(m[6], 10));
-				rdate.setUTCHours(parseInt(m[5], 10));
-				rdate.setUTCDate(1);
-				yr = parseInt(m[4], 10) + 1900;
-				if (yr < new Date().getUTCFullYear() - 50)
-					yr += 100;
-				rdate.setUTCFullYear(yr);
-				rdate.setUTCDate(parseInt(m[3], 10));
-				rdate.setUTCMonth(parseInt(m[2], 10));
-				if (rdate < fdate) {
+				if (parseInt(m[1], 10) != file_size(path)) {
 					need_file = true;
 				}
+				else {
+					fdate.setTime(file_date(path));
+					rdate.setUTCMilliseconds(0);
+					rdate.setUTCSeconds(parseInt(m[7], 10));
+					rdate.setUTCMinutes(parseInt(m[6], 10));
+					rdate.setUTCHours(parseInt(m[5], 10));
+					rdate.setUTCDate(1);
+					yr = parseInt(m[4], 10) + 1900;
+					if (yr < new Date().getUTCFullYear() - 50)
+						yr += 100;
+					rdate.setUTCFullYear(yr);
+					rdate.setUTCDate(parseInt(m[3], 10));
+					rdate.setUTCMonth(parseInt(m[2], 10));
+					if (rdate < fdate) {
+						need_file = true;
+					}
+				}
 			}
 		}
-	}
-	if (!need_file) {
-		dk.console.print('\r\x1b[K');
-		return true;
+		if (!need_file) {
+			dk.console.print('\r\x1b[K');
+			return true;
+		}
 	}
 	ret = upload(fname);
 	return ret;