Index: /issm/trunk-jpl/src/m/classes/clusters/generic.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/clusters/generic.js	(revision 20994)
+++ /issm/trunk-jpl/src/m/classes/clusters/generic.js	(revision 20995)
@@ -46,5 +46,5 @@
 			fclose(fid);
 	} //}}}
-	this.UploadAndRun = function (md,callbackfunction,callbackid,fid,toolkitsstring,solutionstring,name,runtimename) { //{{{
+	this.UploadAndRun = function (md,callbackfunction,callbackerrorfunction,callbackid,fid,toolkitsstring,solutionstring,name,runtimename) { //{{{
 
 		var request = new XMLHttpRequest();
@@ -91,16 +91,25 @@
 				return buf;
 			}
-			var responseText = request.responseText.slice(request.position + 10).replace(/\s/g, '');
-            var buffer = str2ab(window.atob(responseText));
+			var responseText = window.atob(request.responseText.slice(request.position + 10).replace(/\s/g, ''));
+            var buffer = str2ab(responseText);
 			var returnBuffer = new Uint8Array(buffer);
 			var returnBuffer_size = returnBuffer.byteLength;
 			try {
 				md.results = parseresultsfrombuffer(md,returnBuffer,returnBuffer_size);
+				$(callbackid).html(sprintf("%-16s", "RUN")).prop("disabled", false);
+				callbackfunction();
 			}
 			catch (e) {
-				console.log(e);
+				if (responseText.startsWith('Error')) {
+					console.log(responseText);
+					$(callbackid).html(sprintf("%-16s", "ISSM ERROR")).prop("disabled", false);
+				}
+				else {
+					$(callbackid).html(sprintf("%-16s", "JS ERROR")).prop("disabled", false);
+					console.log(e);
+				}
+				callbackerrorfunction();
 			}
-			$(callbackid).html(sprintf("%-16s", "RUN")).prop("disabled", false);
-			callbackfunction();
+			
 		}; //}}}
 		
Index: /issm/trunk-jpl/src/m/solve/solve.js
===================================================================
--- /issm/trunk-jpl/src/m/solve/solve.js	(revision 20994)
+++ /issm/trunk-jpl/src/m/solve/solve.js	(revision 20995)
@@ -108,4 +108,10 @@
 	}
 	
+	//callback error function: 
+	function callbackerrorfunction(){}; //default, do nothing if no callback function requested.
+	if (options.getfieldvalue('callbackerrorfunction',false)){
+		callbackerrorfunction=options.getfieldvalue('callbackerrorfunction');
+	}
+	
 	//callback id: 
 	var callbackid = '.run-button'; //default, update .run-button elements with progress updates.
@@ -137,5 +143,5 @@
 
 		/*We are running somewhere else on a computational server. Send the buffer to that server and retrieve output: */
-		cluster.UploadAndRun(md,callbackfunction,callbackid,fid,toolkitsstring,solutionstring,md.miscellaneous.name,md.priv.runtimename);
+		cluster.UploadAndRun(md,callbackfunction,callbackerrorfunction,callbackid,fid,toolkitsstring,solutionstring,md.miscellaneous.name,md.priv.runtimename);
 
 		return md;
