Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 15612)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 15613)
@@ -63,5 +63,5 @@
 		virtual void   ListResultsInfo(int** results_enums,int** results_size,IssmDouble** results_times,int** results_steps,int* num_results)=0;
 		virtual void   DeleteResults(void)=0;
-		virtual void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type)=0;
+		virtual void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finite_element)=0;
 		virtual void   InputToResult(int enum_type,int step,IssmDouble time)=0;
 		virtual void   InputDuplicate(int original_enum,int new_enum)=0;
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 15613)
@@ -3090,10 +3090,9 @@
 	return dt;
 }/*}}}*/
-/*FUNCTION Penta::Update(int index,IoModel* iomodel,int analysis_counter,int analysis_type) {{{*/
-void Penta::Update(int index,IoModel* iomodel,int analysis_counter,int analysis_type){ 
+/*FUNCTION Penta::Update {{{*/
+void Penta::Update(int index,IoModel* iomodel,int analysis_counter,int analysis_type,int finiteelement_type){ 
 
 	/*Intermediaries*/
 	int        i;
-	int        penta_type;
 	int        penta_node_ids[6];
 	int        penta_vertex_ids[6];
@@ -3121,14 +3120,5 @@
 	/*}}}*/
 
-	/*Recover element type*/
-	if ((analysis_type==PrognosticAnalysisEnum || analysis_type==BalancethicknessAnalysisEnum) && stabilization==3){
-		/*P1 Discontinuous Galerkin*/
-		penta_type=P1DGEnum;
-	}
-	else{
-		/*P1 Continuous Galerkin*/
-		penta_type=P1Enum;
-	}
-	this->SetElementType(penta_type,analysis_counter);
+	this->SetElementType(finiteelement_type,analysis_counter);
 
 	/*Recover vertices ids needed to initialize inputs*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 15612)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 15613)
@@ -112,5 +112,5 @@
 		void   SmbGradients();
 		IssmDouble SurfaceArea(void);
-		void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type);
+		void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
 		int    NodalValue(IssmDouble* pvalue, int index, int natureofdataenum);
 		IssmDouble TimeAdapt();
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 15613)
@@ -2319,11 +2319,10 @@
 }
 /*}}}*/
-/*FUNCTION Tria::Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type){{{*/
-void Tria::Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type){ //i is the element index
+/*FUNCTION Tria::Update{{{*/
+void Tria::Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement_type){
 
 	/*Intermediaries*/
 	int        i,j;
 	int        tria_vertex_ids[3];
-	int        tria_type;
 	IssmDouble nodeinputs[3];
 	IssmDouble yts;
@@ -2347,14 +2346,5 @@
 
 	/*Recover element type*/
-	if ((analysis_type==PrognosticAnalysisEnum && progstabilization==3) || (analysis_type==BalancethicknessAnalysisEnum && balancestabilization==3)){
-		tria_type=P1DGEnum;
-	}
-	else if(analysis_type==DiagnosticHorizAnalysisEnum && fe_ssa==1){
-		tria_type=P2Enum;
-	}
-	else{
-		tria_type=P1Enum;
-	}
-	this->SetElementType(tria_type,analysis_counter);
+	this->SetElementType(finitelement_type,analysis_counter);
 
 	/*Recover vertices ids needed to initialize inputs*/
@@ -2364,5 +2354,5 @@
 
 	/*Recover nodes ids needed to initialize the node hook.*/
-	switch(tria_type){
+	switch(finitelement_type){
 		case P1Enum:
 			numnodes        = 3;
@@ -2390,5 +2380,5 @@
 			break;
 		default:
-			_error_("Finite element "<<EnumToStringx(tria_type)<<" not supported yet");
+			_error_("Finite element "<<EnumToStringx(finitelement_type)<<" not supported yet");
 	}
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 15612)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 15613)
@@ -112,5 +112,5 @@
 		void	 SmbGradients();
 		IssmDouble SurfaceArea(void);
-		void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type);
+		void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
 		IssmDouble TimeAdapt();
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/UpdateElementsBalancethickness.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/UpdateElementsBalancethickness.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/UpdateElementsBalancethickness.cpp	(revision 15613)
@@ -11,4 +11,15 @@
 void	UpdateElementsBalancethickness(Elements* elements, IoModel* iomodel,int analysis_counter,int analysis_type){
 
+	int    stabilization,finiteelement;
+
+	/*Fetch data needed: */
+	iomodel->Constant(&stabilization,BalancethicknessStabilizationEnum);
+
+	/*Finite element type*/
+	finiteelement = P1Enum;
+	if(stabilization==3){
+		finiteelement = P1DGEnum;
+	}
+
 	/*Update elements: */
 	int counter=0;
@@ -16,5 +27,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
 			counter++;
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/BedSlope/UpdateElementsBedSlope.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/BedSlope/UpdateElementsBedSlope.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/BedSlope/UpdateElementsBedSlope.cpp	(revision 15613)
@@ -16,5 +16,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp	(revision 15613)
@@ -16,6 +16,6 @@
 void	UpdateElementsDiagnosticHoriz(Elements* elements, IoModel* iomodel,int analysis_counter,int analysis_type){
 
-	int    materials_type;
-	bool   isSSA,isL1L2,isHO,isFS;
+	int    materials_type,finiteelement,temp;
+	bool   isSSA,isL1L2,isHO,isFS,iscoupling;
 	bool   control_analysis;
 	bool   dakota_analysis;
@@ -33,4 +33,32 @@
 	if(!isSSA & !isL1L2 & !isHO & !isFS) return;
 
+	/*Do we have coupling*/
+	if( (isSSA?1.:0.) + (isL1L2?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
+	 iscoupling = true;
+	else
+	 iscoupling = false;
+
+	/*Get finite element type*/
+	finiteelement = P1Enum;
+	if(!iscoupling){
+		if(isSSA){
+			iomodel->Constant(&temp,FlowequationFeSSAEnum);
+			switch(temp){
+				case 0 : finiteelement = P1Enum; break;
+				case 1 : finiteelement = P2Enum; break;
+				default: _error_("finite element "<<temp<<" not supported");
+			}
+		}
+		else if(isL1L2){
+			finiteelement = P1Enum;
+		}
+		else if(isHO){
+			finiteelement = P1Enum;
+		}
+		else if(isFS){
+			finiteelement = P1Enum;
+		}
+	}
+
 	/*Fetch data needed: */
 	iomodel->FetchData(1,FlowequationElementEquationEnum);
@@ -41,5 +69,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
 			counter++;
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/UpdateElementsDiagnosticHutter.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/UpdateElementsDiagnosticHutter.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/UpdateElementsDiagnosticHutter.cpp	(revision 15613)
@@ -25,5 +25,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/UpdateElementsDiagnosticVert.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/UpdateElementsDiagnosticVert.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/UpdateElementsDiagnosticVert.cpp	(revision 15613)
@@ -19,5 +19,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/UpdateElementsEnthalpy.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/UpdateElementsEnthalpy.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/UpdateElementsEnthalpy.cpp	(revision 15613)
@@ -22,5 +22,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Gia/UpdateElementsGia.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Gia/UpdateElementsGia.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Gia/UpdateElementsGia.cpp	(revision 15613)
@@ -16,5 +16,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/UpdateElementsHydrologyDCEfficient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/UpdateElementsHydrologyDCEfficient.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/UpdateElementsHydrologyDCEfficient.cpp	(revision 15613)
@@ -27,5 +27,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/UpdateElementsHydrologyDCInefficient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/UpdateElementsHydrologyDCInefficient.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/UpdateElementsHydrologyDCInefficient.cpp	(revision 15613)
@@ -28,5 +28,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyShreve/UpdateElementsHydrologyShreve.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyShreve/UpdateElementsHydrologyShreve.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyShreve/UpdateElementsHydrologyShreve.cpp	(revision 15613)
@@ -24,5 +24,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/UpdateElementsMelting.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/UpdateElementsMelting.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/UpdateElementsMelting.cpp	(revision 15613)
@@ -19,5 +19,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/UpdateElementsPrognostic.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/UpdateElementsPrognostic.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/UpdateElementsPrognostic.cpp	(revision 15613)
@@ -11,5 +11,5 @@
 void	UpdateElementsPrognostic(Elements* elements, IoModel* iomodel,int analysis_counter,int analysis_type){
 
-	int    stabilization;
+	int    stabilization,finiteelement;
 	bool   dakota_analysis;
 	bool   issmbgradients;
@@ -24,4 +24,10 @@
 	iomodel->Constant(&issmbgradients,SurfaceforcingsIssmbgradientsEnum);
 
+	/*Finite element type*/
+	finiteelement = P1Enum;
+	if(stabilization==3){
+		finiteelement = P1DGEnum;
+	}
+
 	/*Update elements: */
 	int counter=0;
@@ -29,5 +35,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
 			counter++;
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/SurfaceSlope/UpdateElementsSurfaceSlope.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/SurfaceSlope/UpdateElementsSurfaceSlope.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/SurfaceSlope/UpdateElementsSurfaceSlope.cpp	(revision 15613)
@@ -16,5 +16,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/UpdateElementsThermal.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/UpdateElementsThermal.cpp	(revision 15612)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/UpdateElementsThermal.cpp	(revision 15613)
@@ -19,5 +19,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type); //we need i to index into elements.
+			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
