Index: /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 16719)
+++ /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 16720)
@@ -216,4 +216,77 @@
 }/*}}}*/
 void MasstransportAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
-	_error_("not implemented yet");
-}/*}}}*/
+
+	int        i,hydroadjustment;
+	int*       doflist=NULL;
+	IssmDouble rho_ice,rho_water,minthickness;
+	//Element* basalelement=element->SpawnBasalElement();
+	Element* basalelement=element;
+
+	/*Fetch number of nodes for this finite element*/
+	int numnodes = basalelement->GetNumberOfNodes();
+
+	/*Fetch dof list and allocate solution vector*/
+	basalelement->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
+	IssmDouble* newthickness = xNew<IssmDouble>(numnodes);
+	IssmDouble* newbed       = xNew<IssmDouble>(numnodes);
+	IssmDouble* newsurface   = xNew<IssmDouble>(numnodes);
+	IssmDouble* oldthickness = xNew<IssmDouble>(numnodes);
+	IssmDouble* oldbed       = xNew<IssmDouble>(numnodes);
+	IssmDouble* oldsurface   = xNew<IssmDouble>(numnodes);
+	IssmDouble* phi          = xNew<IssmDouble>(numnodes);
+
+	/*Use the dof list to index into the solution vector: */
+	basalelement->FindParam(&minthickness,MasstransportMinThicknessEnum);
+	for(i=0;i<numnodes;i++){
+		newthickness[i]=solution[doflist[i]];
+		if(xIsNan<IssmDouble>(newthickness[i])) _error_("NaN found in solution vector");
+		/*Constrain thickness to be at least 1m*/
+		if(newthickness[i]<minthickness) newthickness[i]=minthickness;
+	}
+
+	/*Get previous bed, thickness and surface*/
+	basalelement->GetInputListOnNodes(&oldbed[0],BedEnum);
+	basalelement->GetInputListOnNodes(&oldsurface[0],SurfaceEnum);
+	basalelement->GetInputListOnNodes(&oldthickness[0],ThicknessEnum);
+	basalelement->GetInputListOnNodes(&phi[0],MaskGroundediceLevelsetEnum);
+
+	/*Find MasstransportHydrostaticAdjustment to figure out how to update the geometry:*/
+	basalelement->FindParam(&hydroadjustment,MasstransportHydrostaticAdjustmentEnum);
+	rho_ice   = basalelement->GetMaterialParameter(MaterialsRhoIceEnum);
+	rho_water = basalelement->GetMaterialParameter(MaterialsRhoWaterEnum);
+
+	for(i=0;i<numnodes;i++) {
+		/*If shelf: hydrostatic equilibrium*/
+		if (phi[i]>0.){
+			newsurface[i] = oldbed[i]+newthickness[i]; //surface = oldbed + newthickness
+			newbed[i]     = oldbed[i];                 //same bed: do nothing
+		}
+		else{ //this is an ice shelf
+			if(hydroadjustment==AbsoluteEnum){
+				newsurface[i] = newthickness[i]*(1-rho_ice/rho_water);
+				newbed[i]     = newthickness[i]*(-rho_ice/rho_water);
+			}
+			else if(hydroadjustment==IncrementalEnum){
+				newsurface[i] = oldsurface[i]+(1.0-rho_ice/rho_water)*(newthickness[i]-oldthickness[i]); //surface = oldsurface + (1-di) * dH
+				newbed[i]     = oldbed[i]-rho_ice/rho_water*(newthickness[i]-oldthickness[i]); //bed               = oldbed + di * dH
+			}
+			else _error_("Hydrostatic adjustment " << hydroadjustment << " (" << EnumToStringx(hydroadjustment) << ") not supported yet");
+		}
+	}
+
+	/*Add input to the element: */
+	element->AddBasalInput(ThicknessEnum,newthickness,P1Enum);
+	element->AddBasalInput(SurfaceEnum,newsurface,P1Enum);
+	element->AddBasalInput(BedEnum,newbed,P1Enum);
+
+	/*Free ressources:*/
+	xDelete<IssmDouble>(newthickness);
+	xDelete<IssmDouble>(newbed);
+	xDelete<IssmDouble>(newsurface);
+	xDelete<IssmDouble>(oldthickness);
+	xDelete<IssmDouble>(oldbed);
+	xDelete<IssmDouble>(oldsurface);
+	xDelete<IssmDouble>(phi);
+	xDelete<int>(doflist);
+	if(basalelement!=element) delete element;
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 16719)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 16720)
@@ -39,4 +39,5 @@
 		virtual void   SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters)=0;
 		virtual void   SetwiseNodeConnectivity(int* d_nz,int* o_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum)=0;
+		virtual void   AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum)=0;
 		virtual void   AddInput(int input_enum, IssmDouble* values, int interpolation_enum)=0;
 		virtual void   AddMaterialInput(int input_enum, IssmDouble* values, int interpolation_enum)=0;
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 16719)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 16720)
@@ -126,4 +126,31 @@
 	_assert_(this->inputs);
 	this->inputs->AddInput(new PentaInput(input_enum,values,interpolation_enum));
+}
+/*}}}*/
+/*FUNCTION Penta::AddBasalInput{{{*/
+void  Penta::AddBasalInput(int input_enum,IssmDouble* values, int interpolation_enum){
+
+	_assert_(this->inputs);
+	if(!IsOnBed()) return;
+	else{
+		if(interpolation_enum==P1Enum){
+			int        i;
+			IssmDouble extrudedvalues[NUMVERTICES];
+			Penta*     penta=NULL;
+
+			for(i=1;i<NUMVERTICES2D;i++){
+				extrudedvalues[i]=values[i];
+				extrudedvalues[i+NUMVERTICES2D]=values[i];
+			}
+			this->inputs->AddInput(new PentaInput(input_enum,&extrudedvalues[0],P1Enum));
+			penta=this;
+			for(;;){
+				penta->inputs->AddInput(new PentaInput(input_enum,&extrudedvalues[0],P1Enum));
+				if (penta->IsOnSurface()) break;
+				penta=penta->GetUpperElement(); _assert_(penta->Id()!=this->id);
+			}
+		}
+		else _error_("not implemented yet");
+	}
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 16719)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 16720)
@@ -184,4 +184,5 @@
 		/*}}}*/
 		/*Penta specific routines:{{{*/
+		void           AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum);
 		void           AddInput(int input_enum, IssmDouble* values, int interpolation_enum);
 		void           AddMaterialInput(int input_enum, IssmDouble* values, int interpolation_enum);
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 16719)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 16720)
@@ -68,4 +68,5 @@
 		/*}}}*/
 		/*Element virtual functions definitions: {{{*/
+		void        AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum){_error_("not implemented yet");};
 		void        AddInput(int input_enum, IssmDouble* values, int interpolation_enum){_error_("not implemented yet");};
 		void        AddMaterialInput(int input_enum, IssmDouble* values, int interpolation_enum){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 16719)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 16720)
@@ -164,4 +164,21 @@
 	*pd_nz=d_nz;
 	*po_nz=o_nz;
+}
+/*}}}*/
+/*FUNCTION Tria::AddBasalInput{{{*/
+void  Tria::AddBasalInput(int input_enum,IssmDouble* values, int interpolation_enum){
+
+	/*Call inputs method*/
+	_assert_(this->inputs);
+	
+	int meshtype;
+	parameters->FindParam(&meshtype,MeshTypeEnum);
+	switch(meshtype){
+		case Mesh2DhorizontalEnum:
+			this->inputs->AddInput(new TriaInput(input_enum,values,interpolation_enum));
+			break;
+		default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
+	}
+
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 16719)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 16720)
@@ -195,4 +195,5 @@
 		/*}}}*/
 		/*Tria specific routines:{{{*/
+		void           AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum);
 		void           AddInput(int input_enum, IssmDouble* values, int interpolation_enum);
 		void           AddMaterialInput(int input_enum, IssmDouble* values, int interpolation_enum);
