Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 25238)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 25239)
@@ -1291,5 +1291,5 @@
 		case Domain3DEnum:
 			if(!element->IsOnBase()) return NULL;
-			basalelement = element->SpawnBasalElement();
+			basalelement = element->SpawnBasalElement(true);
 			break;
 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
@@ -1377,5 +1377,5 @@
 		case Domain3DEnum: case Domain2DverticalEnum:
 			if(!element->IsOnBase()) return NULL;
-			basalelement = element->SpawnBasalElement();
+			basalelement = element->SpawnBasalElement(true);
 			break;
 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
@@ -2075,5 +2075,5 @@
 
 	/*Get element on base*/
-	Element* basalelement = element->GetBasalElement()->SpawnBasalElement();
+	Element* basalelement = element->GetBasalElement()->SpawnBasalElement(true);
 
 	/*Fetch number of nodes and dof for this finite element*/
@@ -6268,5 +6268,5 @@
 	/*Find penta on bed as this is a SSA elements: */
 	Element* pentabase=element->GetBasalElement();
-	Element* basaltria=pentabase->SpawnBasalElement();
+	Element* basaltria=pentabase->SpawnBasalElement(true);
 
 	/*Initialize Element matrix*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 25238)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 25239)
@@ -338,5 +338,5 @@
 		virtual void       SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters)=0;
 		virtual void       SetTemporaryElementType(int element_type_in)=0;
-	   virtual Element*   SpawnBasalElement(void)=0;
+	   virtual Element*   SpawnBasalElement(bool depthaverage_materials=false)=0;
 		virtual Element*   SpawnTopElement(void)=0;
 		virtual IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa)=0;
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 25238)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 25239)
@@ -3421,30 +3421,26 @@
 }
 /*}}}*/
-Element*   Penta::SpawnBasalElement(void){/*{{{*/
+Element*   Penta::SpawnBasalElement(bool depthaverage_materials){/*{{{*/
 
 	_assert_(this->IsOnBase());
 
-	switch(this->material->ObjectEnum()){
-		case MaticeEnum:
-			this->InputDepthAverageAtBase(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
-			if(this->material->IsDamage())this->InputDepthAverageAtBase(DamageDEnum,DamageDbarEnum);
-			if(this->material->IsEnhanced())this->InputDepthAverageAtBase(MaterialsRheologyEEnum,MaterialsRheologyEbarEnum);
-			break;
-		case MatestarEnum:
-			this->InputDepthAverageAtBase(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
-			this->InputDepthAverageAtBase(MaterialsRheologyEcEnum,MaterialsRheologyEcbarEnum);
-			this->InputDepthAverageAtBase(MaterialsRheologyEsEnum,MaterialsRheologyEsbarEnum);
-			break;
-		default:
-			_error_("not supported yet");
-	}
-	if(this->GetInput2(VxEnum)) this->InputDepthAverageAtBase(VxEnum,VxAverageEnum);
-	if(this->GetInput2(VyEnum)) this->InputDepthAverageAtBase(VyEnum,VyAverageEnum);
-	if(this->GetInput2(CalvingratexEnum)) this->InputDepthAverageAtBase(CalvingratexEnum,CalvingratexAverageEnum);
-	if(this->GetInput2(CalvingrateyEnum)) this->InputDepthAverageAtBase(CalvingrateyEnum,CalvingrateyAverageEnum);
-
-	Tria* tria=(Tria*)SpawnTria(0,1,2);
-
-	return tria;
+	if(depthaverage_materials){
+		switch(this->material->ObjectEnum()){
+			case MaticeEnum:
+				this->InputDepthAverageAtBase(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
+				if(this->material->IsDamage())this->InputDepthAverageAtBase(DamageDEnum,DamageDbarEnum);
+				if(this->material->IsEnhanced())this->InputDepthAverageAtBase(MaterialsRheologyEEnum,MaterialsRheologyEbarEnum);
+				break;
+			case MatestarEnum:
+				this->InputDepthAverageAtBase(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
+				this->InputDepthAverageAtBase(MaterialsRheologyEcEnum,MaterialsRheologyEcbarEnum);
+				this->InputDepthAverageAtBase(MaterialsRheologyEsEnum,MaterialsRheologyEsbarEnum);
+				break;
+			default:
+				_error_("not supported yet");
+		}
+	}
+
+	return SpawnTria(0,1,2);
 }
 /*}}}*/
@@ -3452,8 +3448,5 @@
 
 	_assert_(this->IsOnSurface());
-
-	Tria* tria=(Tria*)SpawnTria(3,4,5);
-
-	return tria;
+	return SpawnTria(3,4,5);
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 25238)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 25239)
@@ -171,5 +171,5 @@
 		void           SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
 		void           SetTemporaryElementType(int element_type_in);
-	   Element*       SpawnBasalElement(void);
+	   Element*       SpawnBasalElement(bool depthaverage_materials);
 		Element*       SpawnTopElement(void);
 		Tria*	         SpawnTria(int index1,int index2,int index3);
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 25238)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 25239)
@@ -138,5 +138,5 @@
 		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters){_error_("not implemented yet");};
 		void        SetTemporaryElementType(int element_type_in){_error_("not implemented yet");};
-	   Element*    SpawnBasalElement(void){_error_("not implemented yet");};
+	   Element*    SpawnBasalElement(bool depthaverage_materials){_error_("not implemented yet");};
 		Element*    SpawnTopElement(void){_error_("not implemented yet");};
 		IssmDouble  StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tetra.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tetra.cpp	(revision 25238)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tetra.cpp	(revision 25239)
@@ -769,5 +769,5 @@
 }
 /*}}}*/
-Element* Tetra::SpawnBasalElement(void){/*{{{*/
+Element* Tetra::SpawnBasalElement(bool depthaverage_materials){/*{{{*/
 
 	_assert_(HasFaceOnBase());
Index: /issm/trunk-jpl/src/c/classes/Elements/Tetra.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 25238)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 25239)
@@ -144,5 +144,5 @@
 		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
 		void        SetTemporaryElementType(int element_type_in){_error_("not implemented yet");};
-	   Element*    SpawnBasalElement(void);
+	   Element*    SpawnBasalElement(bool depthaverage_materials);
 		Element*    SpawnTopElement(void);
 		Tria*       SpawnTria(int index1,int index2,int index3);
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 25238)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 25239)
@@ -4030,5 +4030,5 @@
 }
 /*}}}*/
-Element*   Tria::SpawnBasalElement(void){/*{{{*/
+Element*   Tria::SpawnBasalElement(bool depthaverage_materials){/*{{{*/
 
 	int index1,index2;
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 25238)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 25239)
@@ -132,5 +132,5 @@
 		void        SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
 		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
-	   Element*    SpawnBasalElement(void);
+	   Element*    SpawnBasalElement(bool depthaverage_materials);
 		Element*    SpawnTopElement(void);
 		void			StrainRateparallel();
Index: /issm/trunk-jpl/src/c/cores/balancethickness_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/balancethickness_core.cpp	(revision 25238)
+++ /issm/trunk-jpl/src/c/cores/balancethickness_core.cpp	(revision 25239)
@@ -12,14 +12,25 @@
 void balancethickness_core(FemModel* femmodel){
 
-	/*parameters: */
-	bool save_results;
-
-	/*activate formulation: */
-	femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum);
 
 	/*recover parameters: */
+	bool save_results;
 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
 
+	/*Depth average velocities if necessary*/
+	int domaintype;
+	femmodel->parameters->FindParam(&domaintype,DomainTypeEnum);
+	if(domaintype!=Domain2DhorizontalEnum){
+		femmodel->parameters->SetParam(VxEnum,InputToDepthaverageInEnum);
+		femmodel->parameters->SetParam(VxAverageEnum,InputToDepthaverageOutEnum);
+		depthaverage_core(femmodel);
+		if(domaintype==Domain3DEnum){
+			femmodel->parameters->SetParam(VyEnum,InputToDepthaverageInEnum);
+			femmodel->parameters->SetParam(VyAverageEnum,InputToDepthaverageOutEnum);
+			depthaverage_core(femmodel);
+		}
+	}
+
 	if(VerboseSolution()) _printf0_("   call computational core:\n");
+	femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum);
 	solutionsequence_linear(femmodel);
 
Index: /issm/trunk-jpl/src/c/cores/movingfront_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/movingfront_core.cpp	(revision 25238)
+++ /issm/trunk-jpl/src/c/cores/movingfront_core.cpp	(revision 25239)
@@ -34,4 +34,17 @@
 
 	if(!ismovingfront) return;
+
+	/* Many calving parameterizations and the level set equations require depth
+	 * average velocities so do this calculation once for all here */
+	if(domaintype!=Domain2DhorizontalEnum){
+		femmodel->parameters->SetParam(VxEnum,InputToDepthaverageInEnum);
+		femmodel->parameters->SetParam(VxAverageEnum,InputToDepthaverageOutEnum);
+		depthaverage_core(femmodel);
+		if(domaintype==Domain3DEnum){
+			femmodel->parameters->SetParam(VyEnum,InputToDepthaverageInEnum);
+			femmodel->parameters->SetParam(VyAverageEnum,InputToDepthaverageOutEnum);
+			depthaverage_core(femmodel);
+		}
+	}
 
 	/* start the work from here */
