Index: /issm/trunk-jpl/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 24339)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 24340)
@@ -1318,28 +1318,4 @@
 	if(!input) _error_("Input " << EnumToStringx(inputenum) << " not found in element");
 	input->GetInputValue(pvalue,gauss);
-
-}/*}}}*/
-void       Element::GetInputsInterpolations(Vector<IssmDouble>* interpolations){/*{{{*/
-
-	int interpolation;
-
-	/*Go through all inputs and assign interpolation in vector*/
-	_assert_(this->inputs);
-	for(int i=0;i<this->inputs->Size();i++){
-		Input* input=xDynamicCast<Input*>(this->inputs->GetObjectByOffset(i));
-		switch(input->ObjectEnum()){
-			case BoolInputEnum:
-			case DoubleInputEnum:
-			case IntInputEnum:
-				interpolations->SetValue(input->InstanceEnum(),reCast<IssmDouble>(input->ObjectEnum()),INS_VAL);
-				break;
-			case TriaInputEnum:
-				interpolation = input->GetResultInterpolation();
-				interpolations->SetValue(input->InstanceEnum(),interpolation,INS_VAL);
-				break;
-			default:
-				_error_("Input "<<EnumToStringx(input->ObjectEnum())<<" not supported yet");
-		}
-	}
 
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 24339)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 24340)
@@ -18,4 +18,5 @@
 #include "../analyses/analyses.h"
 #include "./Inputs2/DatasetInput2.h"
+#include "./Inputs2/ElementInput2.h"
 
 #if _HAVE_CODIPACK_
@@ -3071,4 +3072,7 @@
 	}
 
+	/*Creating inputs*/
+	Inputs2* new_inputs2=new Inputs2(newnumberofelements,newnumberofvertices);
+
 	/*Creating materials*/
 	Materials* new_materials=new Materials();
@@ -3134,16 +3138,17 @@
 		}
 
-		ConfigureObjectsx(new_elements,this->loads,new_nodes_list[i],new_vertices,new_materials,this->parameters,this->inputs2);
+		ConfigureObjectsx(new_elements,this->loads,new_nodes_list[i],new_vertices,new_materials,this->parameters,new_inputs2);
 		SpcNodesx(new_nodes_list[i],new_constraints_list[i],this->parameters);
 		NodesDofx(new_nodes_list[i],this->parameters);
 	}
 
-	/*Finally: interpolate all inputs and insert them into the new elements.*/
-	this->InterpolateInputs(new_vertices,new_elements);
+	/*Interpolate all inputs and insert them into the new elements.*/
+	this->InterpolateInputs(new_vertices,new_elements,new_inputs2);
 
 	/*Delete old structure and set new pointers*/
-	delete this->vertices;		this->vertices		= new_vertices;
-	delete this->elements;		this->elements		= new_elements;
-	delete this->materials;		this->materials	= new_materials;
+	delete this->inputs2;   this->inputs2 = new_inputs2;
+	delete this->vertices;  this->vertices = new_vertices;
+	delete this->elements;  this->elements = new_elements;
+	delete this->materials; this->materials = new_materials;
 	if(this->constraints_list && this->nummodels){
 		for(int i=0;i<this->nummodels;i++) delete this->constraints_list[i];
@@ -3157,4 +3162,5 @@
 	this->nodes_list = new_nodes_list;
 
+	/*Reset mask*/
 	GetMaskOfIceVerticesLSMx0(this);
 
@@ -3268,33 +3274,23 @@
 void FemModel::GetInputs(int* pnumP0inputs,IssmDouble** pP0inputs,int** pP0input_enums,int** pP0input_interp,int* pnumP1inputs,IssmDouble** pP1inputs,int** pP1input_enums,int** pP1input_interp){/*{{{*/
 
-	int maxinputs										= MaximumNumberOfDefinitionsEnum;
-	int numberofvertices								= this->vertices->NumberOfVertices();
-	int numberofelements								= this->elements->NumberOfElements();
-	int elementswidth									= this->GetElementsWidth();
-	int numP0inputs									= -1;
+	int numberofvertices = this->vertices->NumberOfVertices();
+	int numberofelements = this->elements->NumberOfElements();
+	int elementswidth    = this->GetElementsWidth();
+	int numinputs,numP0inputs,numP1inputs;
 	IssmDouble* P0inputs								= NULL;
 	Vector<IssmDouble>* vP0inputs					= NULL;
 	int* P0input_enums								= NULL;
 	int* P0input_interp 								= NULL;
-	int numP1inputs									= -1;
 	IssmDouble* P1inputs								= NULL;
 	Vector<IssmDouble>* vP1inputs					= NULL;
 	int* P1input_enums  								= NULL;
 	int* P1input_interp 								= NULL;
-	Vector<IssmDouble>* input_interpolations	= NULL;
-	IssmDouble* input_interpolations_serial	= NULL;
+	int* input_interpolations                 = NULL;
+	int* input_enums                          = NULL;
    int* pos												= NULL;
 	IssmDouble value									= 0;
 
 	/*Figure out how many inputs we have and their respective interpolation*/
-	input_interpolations=new Vector<IssmDouble>(maxinputs);
-	if(this->elements->Size()){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(0));
-		element->GetInputsInterpolations(input_interpolations);
-	}
-
-	/*Assemble and serialize*/
-	input_interpolations->Assemble();
-	input_interpolations_serial = input_interpolations->ToMPISerial();
+	this->inputs2->GetInputsInterpolations(&numinputs,&input_interpolations,&input_enums);
 
 	/*Count and get enums of all inputs in old mesh*/
@@ -3308,6 +3304,6 @@
 		numP0inputs = 0;
 		numP1inputs = 0;
-		for(int i=0;i<maxinputs;i++){
-			int inputinterp = reCast<int>(input_interpolations_serial[i]);
+		for(int i=0;i<numinputs;i++){
+			int inputinterp = input_interpolations[i];
 			switch(inputinterp){
 				case 0:
@@ -3316,5 +3312,5 @@
 				case P1Enum:
 					if(step){
-						P1input_enums[numP1inputs]  = i;
+						P1input_enums[numP1inputs]  = input_enums[i];
 						P1input_interp[numP1inputs] = inputinterp;
 					}
@@ -3322,9 +3318,8 @@
 					break;
 				case P0Enum:
-				case DoubleInputEnum:
-				case IntInputEnum:
-				case BoolInputEnum:
+				case IntInput2Enum:
+				case BoolInput2Enum:
 					if(step){
-						P0input_enums[numP0inputs]  = i;
+						P0input_enums[numP0inputs]  = input_enums[i];
 						P0input_interp[numP0inputs] = inputinterp;
 					}
@@ -3332,5 +3327,5 @@
 					break;
 				default:
-					_error_(EnumToStringx(inputinterp)<<" Not supported yet");
+					_error_(EnumToStringx(inputinterp)<<" ("<<inputinterp<<") Not supported yet");
 			}
 		}
@@ -3346,6 +3341,25 @@
 		/*Get P0 inputs*/
 		for(int j=0;j<numP0inputs;j++){
-			TriaInput* input=xDynamicCast<TriaInput*>(element->GetInput(P0input_enums[j]));
-			input->GetInputAverage(&value);
+			switch(P0input_interp[j]){
+				case P0Enum:{
+					Input2* input=element->GetInput2(P0input_enums[j]);
+					input->GetInputAverage(&value);
+				}
+							 break;
+				case IntInput2Enum:{
+					int valueint;
+					element->GetInput2Value(&valueint,P0input_enums[j]);
+					value = reCast<IssmDouble>(valueint);
+				}
+									 break;
+				case BoolInput2Enum:{
+					bool valuebool;
+					element->GetInput2Value(&valuebool,P0input_enums[j]);
+					value = reCast<IssmDouble>(valuebool);
+				}
+					break;
+				default:
+					_error_(EnumToStringx(P0input_interp[j])<<" ("<<P0input_interp[j]<<") Not supported yet");
+			}
 			pos[0]=element->Sid()*numP0inputs+j;
 			/*Insert input in the vector*/
@@ -3355,10 +3369,11 @@
 		/*Get P1 inputs*/
 		for(int j=0;j<numP1inputs;j++){
-			TriaInput* input=xDynamicCast<TriaInput*>(element->GetInput(P1input_enums[j]));
+			Input2* temp = element->GetInput2(P1input_enums[j]); _assert_(temp);
+			ElementInput2* input=xDynamicCast<ElementInput2*>(temp);
 			pos[0]=element->vertices[0]->Sid()*numP1inputs+j;
 			pos[1]=element->vertices[1]->Sid()*numP1inputs+j;
 			pos[2]=element->vertices[2]->Sid()*numP1inputs+j;
 			/*Insert input in the vector*/
-			vP1inputs->SetValues(elementswidth,pos,input->values,INS_VAL);
+			vP1inputs->SetValues(elementswidth,pos,input->element_values,INS_VAL);
 		}
 	}
@@ -3381,12 +3396,11 @@
 
 	/*Cleanup*/
-	delete input_interpolations;
 	delete vP0inputs;
 	delete vP1inputs;
-	xDelete<IssmDouble>(input_interpolations_serial);
+	xDelete<int>(input_interpolations);
 	xDelete<int>(pos);
 }
 /*}}}*/
-void FemModel::InterpolateInputs(Vertices* newfemmodel_vertices,Elements* newfemmodel_elements){/*{{{*/
+void FemModel::InterpolateInputs(Vertices* newfemmodel_vertices,Elements* newfemmodel_elements,Inputs2* newinputs2){/*{{{*/
 
 	int numberofelements			= -1;												//global, entire old mesh
@@ -3449,35 +3463,34 @@
 
 	/*Insert P0 and P1 inputs into the new elements (just on the new partition)*/
+	int vertexlids[3];
 	values=xNew<IssmDouble>(elementswidth);
 	for(int i=0;i<newfemmodel_elements->Size();i++){//just on the new partition
 		Element* element=xDynamicCast<Element*>(newfemmodel_elements->GetObjectByOffset(i));
-		_error_("not supported");
 		/*newP0inputs is just on the new partition*/
 		for(int j=0;j<numP0inputs;j++){
 			switch(P0input_interp[j]){
 				case P0Enum:
-				case DoubleInputEnum:
-					element->AddInput(new DoubleInput(P0input_enums[j],newP0inputs[i*numP0inputs+j]));
+					element->SetElementInput(newinputs2,P0input_enums[j],newP0inputs[i*numP0inputs+j]);
 					break;
-				case IntInputEnum:
-					element->SetIntInput(this->inputs2,P0input_enums[j],reCast<int>(newP0inputs[i*numP0inputs+j]));
-					element->AddInput(new IntInput(P0input_enums[j],reCast<int>(newP0inputs[i*numP0inputs+j])));
+				case IntInput2Enum:
+					element->SetIntInput(newinputs2,P0input_enums[j],reCast<int>(newP0inputs[i*numP0inputs+j]));
 					break;
-				case BoolInputEnum:
-					element->SetBoolInput(this->inputs2,P0input_enums[j],reCast<bool>(newP0inputs[i*numP0inputs+j]));
-					element->AddInput(new BoolInput(P0input_enums[j],reCast<bool>(newP0inputs[i*numP0inputs+j])));
+				case BoolInput2Enum:
+					element->SetBoolInput(newinputs2,P0input_enums[j],reCast<bool>(newP0inputs[i*numP0inputs+j]));
 					break;
 				default:
-					_error_(EnumToStringx(P0input_enums[j])<<" Not supported yet");
+					_error_(EnumToStringx(P0input_interp[j])<<" Not supported yet");
 			}
 		}
 		/*newP1inputs is just on the new partition*/
+		for(int i=0;i<3;i++) vertexlids[i]=element->vertices[i]->lid;
 		for(int j=0;j<numP1inputs;j++){
 			values[0]=newP1inputs[sidtoindex[element->vertices[0]->Sid()]*numP1inputs+j];
 			values[1]=newP1inputs[sidtoindex[element->vertices[1]->Sid()]*numP1inputs+j];
 			values[2]=newP1inputs[sidtoindex[element->vertices[2]->Sid()]*numP1inputs+j];
-			element->inputs->AddInput(new TriaInput(P1input_enums[j],values,P1Enum));
-		}
-	}
+			newinputs2->SetTriaInput(P1input_enums[j],P1Enum,3,vertexlids,values);
+		}
+	}
+
 
 	/*Cleanup*/
@@ -3599,5 +3612,5 @@
 
 	/*newlementslist is in Matlab indexing*/
-
+	int lid=0;
 	for(int i=0;i<newnumberofelements;i++){
 		if(my_elements[i]){
@@ -3606,4 +3619,8 @@
 			newtria->id=i+1;
 			newtria->sid=i;
+			newtria->lid=lid++;
+			newtria->iscollapsed=0;
+			newtria->isonsurface = true;
+			newtria->isonbase = true;
 			newtria->parameters=NULL;
 			newtria->inputs=new Inputs();
Index: /issm/trunk-jpl/src/c/classes/FemModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 24339)
+++ /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 24340)
@@ -199,5 +199,5 @@
 		void CreateConstraints(Vertices* newfemmodel_vertices,int analysis_enum,Constraints* newfemmodel_constraints);
 		void GetInputs(int* pnumP0inputs,IssmDouble** pP0inputs,int** pP0input_enums,int** pP0input_interp,int* pnumP1inputs,IssmDouble** pP1inputs,int** pP1input_enums,int** pP1input_interp);
-		void InterpolateInputs(Vertices* newfemmodel_vertices,Elements* newfemmodel_elements);
+		void InterpolateInputs(Vertices* newfemmodel_vertices,Elements* newfemmodel_elements,Inputs2* new_inputs);
 		void UpdateElements(int newnumberofelements,int* newelementslist,bool* my_elements,int analysis_counter,Elements* newelements);
 		void WriteMeshInResults(void);
Index: /issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.cpp	(revision 24339)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.cpp	(revision 24340)
@@ -246,4 +246,46 @@
 }
 /*}}}*/
+void Inputs2::GetInputsInterpolations(int* pnuminputs,int** pinterpolations,int** pinputenums){/*{{{*/
+
+	/*First count number of inputs*/
+	int count = 0;
+	for(int i=0;i<NUMINPUTS;i++){
+		if(this->inputs[i]) count++;
+	}
+	int numinputs = count;
+
+	/*Allocate output*/
+	int* interpolations = xNew<int>(count);
+	int* enumlist       = xNew<int>(count);
+
+	/*Go through all inputs and assign interpolation in vector*/
+	count = 0;
+	for(int i=0;i<NUMINPUTS;i++){
+
+		Input2* input=this->inputs[i];
+		if(!input) continue;
+
+		enumlist[count] = i+InputsSTARTEnum+1;
+		switch(input->ObjectEnum()){
+			case BoolInput2Enum:
+			case IntInput2Enum:
+				interpolations[count] = input->ObjectEnum();
+				break;
+			case TriaInput2Enum:
+				interpolations[count] = input->GetResultInterpolation();
+				break;
+			default:
+				_error_("Input "<<EnumToStringx(input->ObjectEnum())<<" not supported yet");
+		}
+		count++;
+	}
+	_assert_(count == numinputs);
+
+	/*Return pointer*/
+	*pnuminputs = numinputs;
+	*pinterpolations = interpolations;
+	*pinputenums = enumlist;
+
+}/*}}}*/
 SegInput2* Inputs2::GetSegInput(int enum_in){/*{{{*/
 
Index: /issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.h	(revision 24339)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.h	(revision 24340)
@@ -49,4 +49,5 @@
 		void     Echo(void);
 		bool     Exist(int enum_type);
+		void     GetInputsInterpolations(int* pnuminputs,int** pinterpolations,int** penum);
 		SegInput2*       GetSegInput(int enum_type);
 		TriaInput2*      GetTriaInput(int enum_type);
