Index: /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/Gembx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/Gembx.cpp	(revision 22741)
+++ /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/Gembx.cpp	(revision 22742)
@@ -1356,4 +1356,5 @@
 		for(int i=0;i<n;i++)if(d[i]>dIce-Dtol)d[i]=dIce;
 		for(int i=0;i<n;i++) dz[i]= m[i]/d[i];
+
 	}
 
@@ -1375,25 +1376,26 @@
 		// LF/CI = 159.1342)
 		surpT=xNew<IssmDouble>(n); for(int i=0;i<n;i++)surpT[i] = fmax(0.0, exsT[i]- LF/CI);
-        
-		if (cellsum(surpT,n) > 0.0 + Ttol){
+
+		if (cellsum(surpT,n) > 0.0 + Ttol ){
 			// _printf_("T Surplus");
 			// calculate surplus energy
 			surpE=xNew<IssmDouble>(n); for(int i=0;i<n;i++)surpE[i] = surpT[i] * CI * m[i];
-            
+
 			int i = 0;
-			while (cellsum(surpE,n) > 0.0 + Ttol && i<n-1){
-
+			while (cellsum(surpE,n) > 0.0 + Ttol){
 				// use surplus energy to increase the temperature of lower cell
 				T[i+1] = surpE[i]/m[i+1]/CI + T[i+1];
-				surpT[i+1] = fmax(0.0, (T[i+1] - CtoK - LF/CI));
+
+				exsT[i+1] = fmax(0.0, T[i+1] - CtoK) + exsT[i+1];
+				T[i+1] = fmin(CtoK, T[i+1]);
+
+				surpT[i+1] = fmax(0.0, exsT[i+1] - LF/CI);
 				surpE[i+1] = surpT[i+1] * CI * m[i+1];
 
 				// adjust current cell properties (again 159.1342 is the max T)
-				T[i] = T[i]-surpE[i]/m[i+1]/CI;
+				exsT[i] = LF/CI;
 				surpE[i] = 0.0;
 				i = i + 1;
 			}
-			// recalculate temperature excess above 0 deg C 
-			for(int i=0;i<n;i++) exsT[i] = fmax(0.0, T[i] - CtoK);  
 		}
 
