Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 24334)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 24335)
@@ -326,5 +326,16 @@
 					./modules/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp\
 					./classes/Inputs/PentaInput.cpp\
-					./classes/Inputs/TetraInput.cpp
+					./classes/Inputs/TetraInput.cpp\
+					./classes/Inputs2/Inputs2.cpp\
+					./classes/Inputs2/BoolInput2.cpp\
+					./classes/Inputs2/IntInput2.cpp\
+					./classes/Inputs2/ElementInput2.cpp\
+					./classes/Inputs2/SegInput2.cpp\
+					./classes/Inputs2/TriaInput2.cpp\
+					./classes/Inputs2/PentaInput2.cpp\
+					./classes/Inputs2/DatasetInput2.cpp\
+					./classes/Inputs2/ControlInput2.cpp\
+					./classes/Inputs2/TransientInput2.cpp\
+					./classes/Inputs2/ArrayInput2.cpp
 #}}}
 #ADJOINTMPI/MeDiPack sources {{{
Index: /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 24335)
@@ -4,4 +4,5 @@
 #include "../shared/shared.h"
 #include "../modules/modules.h"
+#include "../classes/Inputs2/DatasetInput2.h"
 
 /*Model processor*/
@@ -18,5 +19,5 @@
 	return 1;
 }/*}}}*/
-void AdjointBalancethickness2Analysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void AdjointBalancethickness2Analysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 	_error_("not implemented yet");
 }/*}}}*/
@@ -65,9 +66,9 @@
 	element->FindParam(&num_responses,InversionNumCostFunctionsEnum);
 	element->FindParam(&responses,NULL,InversionCostFunctionsEnum);
-	Input* surface_input      = element->GetInput(SurfaceEnum);                          _assert_(surface_input);
-	Input* surfaceobs_input   = element->GetInput(InversionSurfaceObsEnum);              _assert_(surfaceobs_input);
-	Input* weights_input      = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* vx_input           = element->GetInput(VxEnum);                                 _assert_(vx_input);
-	Input* vy_input           = element->GetInput(VyEnum);                                 _assert_(vy_input);
+	Input2* surface_input      = element->GetInput2(SurfaceEnum);                          _assert_(surface_input);
+	Input2* surfaceobs_input   = element->GetInput2(InversionSurfaceObsEnum);              _assert_(surfaceobs_input);
+	DatasetInput2* weights_input      = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* vx_input           = element->GetInput2(VxEnum);                                 _assert_(vx_input);
+	Input2* vy_input           = element->GetInput2(VyEnum);                                 _assert_(vy_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -171,5 +172,5 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* adjoint_input = element->GetInput(AdjointEnum);            _assert_(adjoint_input);
+	Input2* adjoint_input = element->GetInput2(AdjointEnum);            _assert_(adjoint_input);
 
 	Gauss* gauss=element->NewGauss(2);
@@ -215,10 +216,10 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* adjoint_input = element->GetInput(AdjointEnum);            _assert_(adjoint_input);
-	Input* omega_input   = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input);
-	Input* surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input); 
-	Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum); _assert_(surfaceslopex_input); 
-	Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum); _assert_(surfaceslopey_input); 
-	Input* velobs_input        = element->GetInput(InversionVelObsEnum); _assert_(velobs_input); 
+	Input2* adjoint_input = element->GetInput2(AdjointEnum);            _assert_(adjoint_input);
+	Input2* omega_input   = element->GetInput2(BalancethicknessOmegaEnum); _assert_(omega_input);
+	Input2* surface_input = element->GetInput2(SurfaceEnum); _assert_(surface_input); 
+	Input2* surfaceslopex_input = element->GetInput2(SurfaceSlopeXEnum); _assert_(surfaceslopex_input); 
+	Input2* surfaceslopey_input = element->GetInput2(SurfaceSlopeYEnum); _assert_(surfaceslopey_input); 
+	Input2* velobs_input        = element->GetInput2(InversionVelObsEnum); _assert_(velobs_input); 
 
 	Gauss* gauss=element->NewGauss(2);
@@ -272,6 +273,6 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* omega_input = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input);
-	Input* weights_input         = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* omega_input = element->GetInput2(BalancethicknessOmegaEnum); _assert_(omega_input);
+	DatasetInput2* weights_input         = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -321,7 +322,7 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* omega_input = element->GetInput(BalancethicknessOmegaEnum);   _assert_(omega_input);
-	Input* omega0_input = element->GetInput(BalancethicknessOmega0Enum); _assert_(omega0_input);
-	Input* weights_input = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* omega_input = element->GetInput2(BalancethicknessOmegaEnum);   _assert_(omega_input);
+	Input2* omega0_input = element->GetInput2(BalancethicknessOmega0Enum); _assert_(omega0_input);
+	DatasetInput2* weights_input = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp	(revision 24335)
@@ -4,4 +4,5 @@
 #include "../shared/shared.h"
 #include "../modules/modules.h"
+#include "../classes/Inputs2/DatasetInput2.h"
 
 /*Model processor*/
@@ -18,5 +19,5 @@
 	return 1;
 }/*}}}*/
-void AdjointBalancethicknessAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void AdjointBalancethicknessAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 	_error_("not implemented yet");
 }/*}}}*/
@@ -85,9 +86,9 @@
 	basalelement->FindParam(&num_responses,InversionNumCostFunctionsEnum);
 	basalelement->FindParam(&responses,NULL,InversionCostFunctionsEnum);
-	Input* thickness_input    = basalelement->GetInput(ThicknessEnum);                          _assert_(thickness_input);
-	Input* thicknessobs_input = basalelement->GetInput(InversionThicknessObsEnum);              _assert_(thicknessobs_input);
-	Input* weights_input      = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* vx_input           = basalelement->GetInput(VxEnum);                                 _assert_(vx_input);
-	Input* vy_input           = basalelement->GetInput(VyEnum);                                 _assert_(vy_input);
+	Input2* thickness_input    = basalelement->GetInput2(ThicknessEnum);                          _assert_(thickness_input);
+	Input2* thicknessobs_input = basalelement->GetInput2(InversionThicknessObsEnum);              _assert_(thicknessobs_input);
+	DatasetInput2* weights_input      = basalelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* vx_input           = basalelement->GetInput2(VxEnum);                                 _assert_(vx_input);
+	Input2* vy_input           = basalelement->GetInput2(VyEnum);                                 _assert_(vy_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -282,6 +283,6 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* adjoint_input   = element->GetInput(AdjointEnum);   _assert_(adjoint_input);
+	Input2* thickness_input = element->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* adjoint_input   = element->GetInput2(AdjointEnum);   _assert_(adjoint_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -329,6 +330,6 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* adjoint_input   = element->GetInput(AdjointEnum);   _assert_(adjoint_input);
+	Input2* thickness_input = element->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* adjoint_input   = element->GetInput2(AdjointEnum);   _assert_(adjoint_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 24335)
@@ -4,4 +4,5 @@
 #include "../shared/shared.h"
 #include "../modules/modules.h"
+#include "../classes/Inputs2/DatasetInput2.h"
 
 /*Model processing*/
@@ -18,5 +19,5 @@
 	_error_("not implemented");
 }/*}}}*/
-void AdjointHorizAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void AdjointHorizAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 	   _error_("not implemented yet");
 }/*}}}*/
@@ -86,9 +87,9 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* vx_input = element->GetInput(VxEnum);_assert_(vx_input);
-	Input* vy_input = element->GetInput(VyEnum);_assert_(vy_input);
-	Input* vz_input = NULL;
+	Input2* vx_input = element->GetInput2(VxEnum);_assert_(vx_input);
+	Input2* vy_input = element->GetInput2(VyEnum);_assert_(vy_input);
+	Input2* vz_input = NULL;
 	if(dim==3){
-		vz_input = element->GetInput(VzEnum);
+		vz_input = element->GetInput2(VzEnum);
 	}
 	else{
@@ -170,6 +171,6 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input);
+	Input2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input = element->GetInput2(VyEnum); _assert_(vy_input);
 
 	/*Allocate dbasis*/
@@ -275,7 +276,7 @@
 	/*Retrieve all inputs and parameters*/
 	basalelement->GetVerticesCoordinates(&xyz_list);
-	Input* vx_input        = basalelement->GetInput(VxEnum);       _assert_(vx_input);
-	Input* vy_input        = basalelement->GetInput(VyEnum);       _assert_(vy_input);
-	Input* thickness_input = basalelement->GetInput(ThicknessEnum); _assert_(thickness_input);
+	Input2* vx_input        = basalelement->GetInput2(VxEnum);       _assert_(vx_input);
+	Input2* vy_input        = basalelement->GetInput2(VyEnum);       _assert_(vy_input);
+	Input2* thickness_input = basalelement->GetInput2(ThicknessEnum); _assert_(thickness_input);
 
 	/*Allocate dbasis*/
@@ -374,12 +375,12 @@
 	element->FindParam(&num_responses,InversionNumCostFunctionsEnum);
 	element->FindParam(&responses,NULL,InversionCostFunctionsEnum);
-	Input* weights_input = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* vx_input      = element->GetInput(VxEnum);                                 _assert_(vx_input);
-	Input* vxobs_input   = element->GetInput(InversionVxObsEnum);                     _assert_(vxobs_input);
-	Input* vy_input    = NULL;
-	Input* vyobs_input = NULL;
+	DatasetInput2* weights_input = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* vx_input      = element->GetInput2(VxEnum);                                 _assert_(vx_input);
+	Input2* vxobs_input   = element->GetInput2(InversionVxObsEnum);                     _assert_(vxobs_input);
+	Input2* vy_input    = NULL;
+	Input2* vyobs_input = NULL;
 	if(domaintype!=Domain2DverticalEnum){
-		vy_input      = element->GetInput(VyEnum);                                 _assert_(vy_input);
-		vyobs_input   = element->GetInput(InversionVyObsEnum);                     _assert_(vyobs_input);
+		vy_input      = element->GetInput2(VyEnum);                                 _assert_(vy_input);
+		vyobs_input   = element->GetInput2(InversionVyObsEnum);                     _assert_(vyobs_input);
 	}
 	IssmDouble epsvel  = 2.220446049250313e-16;
@@ -611,12 +612,12 @@
 	element->FindParam(&num_responses,InversionNumCostFunctionsEnum);
 	element->FindParam(&responses,NULL,InversionCostFunctionsEnum);
-	Input* weights_input = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* vx_input      = element->GetInput(VxEnum);                                 _assert_(vx_input);
-	Input* vxobs_input   = element->GetInput(InversionVxObsEnum);                     _assert_(vxobs_input);
-	Input* vy_input=NULL;
-	Input* vyobs_input=NULL;
+	DatasetInput2* weights_input = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* vx_input      = element->GetInput2(VxEnum);                                 _assert_(vx_input);
+	Input2* vxobs_input   = element->GetInput2(InversionVxObsEnum);                     _assert_(vxobs_input);
+	Input2* vy_input=NULL;
+	Input2* vyobs_input=NULL;
 	if(domaintype!=Domain2DverticalEnum){
-		vy_input      = element->GetInput(VyEnum);                                 _assert_(vy_input);
-		vyobs_input   = element->GetInput(InversionVyObsEnum);                     _assert_(vyobs_input);
+		vy_input      = element->GetInput2(VyEnum);                                 _assert_(vy_input);
+		vyobs_input   = element->GetInput2(InversionVyObsEnum);                     _assert_(vyobs_input);
 	}
 	IssmDouble epsvel  = 2.220446049250313e-16;
@@ -862,12 +863,12 @@
 	basalelement->FindParam(&num_responses,InversionNumCostFunctionsEnum);
 	basalelement->FindParam(&responses,NULL,InversionCostFunctionsEnum);
-	Input* weights_input = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* vx_input      = basalelement->GetInput(VxEnum);                                 _assert_(vx_input);
-	Input* vxobs_input   = basalelement->GetInput(InversionVxObsEnum);                     _assert_(vxobs_input);
-	Input* vy_input=NULL;
-	Input* vyobs_input=NULL;
+	DatasetInput2* weights_input = basalelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* vx_input      = basalelement->GetInput2(VxEnum);                                               _assert_(vx_input);
+	Input2* vxobs_input   = basalelement->GetInput2(InversionVxObsEnum);                                   _assert_(vxobs_input);
+	Input2* vy_input=NULL;
+	Input2* vyobs_input=NULL;
 	if(domaintype!=Domain2DverticalEnum){
-		vy_input      = basalelement->GetInput(VyEnum);                                 _assert_(vy_input);
-		vyobs_input   = basalelement->GetInput(InversionVyObsEnum);                     _assert_(vyobs_input);
+		vy_input      = basalelement->GetInput2(VyEnum);              _assert_(vy_input);
+		vyobs_input   = basalelement->GetInput2(InversionVyObsEnum);  _assert_(vyobs_input);
 	}
 	IssmDouble epsvel  = 2.220446049250313e-16;
@@ -1214,6 +1215,6 @@
 	basalelement->GetVerticesCoordinates(&xyz_list);
 	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBbarEnum);              _assert_(rheologyb_input);
-	Input* weights_input   = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* rheologyb_input = basalelement->GetInput2(MaterialsRheologyBbarEnum);              _assert_(rheologyb_input);
+	DatasetInput2* weights_input   = basalelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -1303,10 +1304,10 @@
 	basalelement->GetVerticesCoordinates(&xyz_list);
 	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* thickness_input = basalelement->GetInput(ThicknessEnum);             _assert_(thickness_input);
-	Input* vx_input        = basalelement->GetInput(VxEnum);                    _assert_(vx_input);
-	Input* vy_input        = basalelement->GetInput(VyEnum);                    _assert_(vy_input);
-	Input* adjointx_input  = basalelement->GetInput(AdjointxEnum);              _assert_(adjointx_input);
-	Input* adjointy_input  = basalelement->GetInput(AdjointyEnum);              _assert_(adjointy_input);
-	Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input);
+	Input2* thickness_input = basalelement->GetInput2(ThicknessEnum);             _assert_(thickness_input);
+	Input2* vx_input        = basalelement->GetInput2(VxEnum);                    _assert_(vx_input);
+	Input2* vy_input        = basalelement->GetInput2(VyEnum);                    _assert_(vy_input);
+	Input2* adjointx_input  = basalelement->GetInput2(AdjointxEnum);              _assert_(adjointx_input);
+	Input2* adjointy_input  = basalelement->GetInput2(AdjointyEnum);              _assert_(adjointy_input);
+	Input2* rheologyb_input = basalelement->GetInput2(MaterialsRheologyBbarEnum); _assert_(rheologyb_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -1381,6 +1382,6 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* rheology_input = element->GetInput(MaterialsRheologyBEnum);              _assert_(rheology_input);
-	Input* weights_input   = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* rheology_input = element->GetInput2(MaterialsRheologyBEnum);              _assert_(rheology_input);
+	DatasetInput2* weights_input   = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
 	/* Start  looping on the number of gaussian points: */
 	Gauss* gauss=element->NewGauss(2);
@@ -1447,7 +1448,7 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* rheology_input  = element->GetInput(MaterialsRheologyBbarEnum);              _assert_(rheology_input);
-	Input* rheology0_input = element->GetInput(RheologyBInitialguessEnum);              _assert_(rheology0_input);
-	Input* weights_input   = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* rheology_input  = element->GetInput2(MaterialsRheologyBbarEnum);              _assert_(rheology_input);
+	Input2* rheology0_input = element->GetInput2(RheologyBInitialguessEnum);              _assert_(rheology0_input);
+	DatasetInput2* weights_input   = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -1502,13 +1503,13 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* thickness_input = element->GetInput(ThicknessEnum);             _assert_(thickness_input);
-	Input* vx_input        = element->GetInput(VxEnum);                    _assert_(vx_input);
-	Input* vy_input        = NULL;
-	Input* adjointx_input  = element->GetInput(AdjointxEnum);              _assert_(adjointx_input);
-	Input* adjointy_input  = NULL;
-	Input* rheologyb_input = element->GetInput(MaterialsRheologyBEnum); _assert_(rheologyb_input);
+	Input2* thickness_input = element->GetInput2(ThicknessEnum);             _assert_(thickness_input);
+	Input2* vx_input        = element->GetInput2(VxEnum);                    _assert_(vx_input);
+	Input2* vy_input        = NULL;
+	Input2* adjointx_input  = element->GetInput2(AdjointxEnum);              _assert_(adjointx_input);
+	Input2* adjointy_input  = NULL;
+	Input2* rheologyb_input = element->GetInput2(MaterialsRheologyBEnum); _assert_(rheologyb_input);
 	if(domaintype!=Domain2DverticalEnum){
-		vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
-		adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
+		vy_input        = element->GetInput2(VyEnum);                   _assert_(vy_input);
+		adjointy_input  = element->GetInput2(AdjointyEnum);             _assert_(adjointy_input);
 	}
 	/* Start  looping on the number of gaussian points: */
@@ -1597,10 +1598,10 @@
 	basalelement->GetVerticesCoordinates(&xyz_list);
 	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* thickness_input = basalelement->GetInput(ThicknessEnum);             _assert_(thickness_input);
-	Input* vx_input        = basalelement->GetInput(VxEnum);                    _assert_(vx_input);
-	Input* vy_input        = basalelement->GetInput(VyEnum);                    _assert_(vy_input);
-	Input* adjointx_input  = basalelement->GetInput(AdjointxEnum);              _assert_(adjointx_input);
-	Input* adjointy_input  = basalelement->GetInput(AdjointyEnum);              _assert_(adjointy_input);
-	Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBEnum); _assert_(rheologyb_input);
+	Input2* thickness_input = basalelement->GetInput2(ThicknessEnum);             _assert_(thickness_input);
+	Input2* vx_input        = basalelement->GetInput2(VxEnum);                    _assert_(vx_input);
+	Input2* vy_input        = basalelement->GetInput2(VyEnum);                    _assert_(vy_input);
+	Input2* adjointx_input  = basalelement->GetInput2(AdjointxEnum);              _assert_(adjointx_input);
+	Input2* adjointy_input  = basalelement->GetInput2(AdjointyEnum);              _assert_(adjointy_input);
+	Input2* rheologyb_input = basalelement->GetInput2(MaterialsRheologyBEnum); _assert_(rheologyb_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -1683,6 +1684,6 @@
 	basalelement->GetVerticesCoordinates(&xyz_list);
 	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* dragcoefficient_input = basalelement->GetInput(FrictionCoefficientEnum);                _assert_(dragcoefficient_input);
-	Input* weights_input         = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* dragcoefficient_input = basalelement->GetInput2(FrictionCoefficientEnum);                _assert_(dragcoefficient_input);
+	DatasetInput2* weights_input         = basalelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -1752,15 +1753,15 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* vx_input        = element->GetInput(VxEnum);                   _assert_(vx_input);
-	Input* vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
-	Input* adjointx_input  = element->GetInput(AdjointxEnum);             _assert_(adjointx_input);
-	Input* adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
-	Input* vz_input        = NULL;
-	Input* adjointz_input  = NULL;
+	Input2* vx_input        = element->GetInput2(VxEnum);                   _assert_(vx_input);
+	Input2* vy_input        = element->GetInput2(VyEnum);                   _assert_(vy_input);
+	Input2* adjointx_input  = element->GetInput2(AdjointxEnum);             _assert_(adjointx_input);
+	Input2* adjointy_input  = element->GetInput2(AdjointyEnum);             _assert_(adjointy_input);
+	Input2* vz_input        = NULL;
+	Input2* adjointz_input  = NULL;
 	if(domaintype!=Domain2DverticalEnum){
-		vz_input        = element->GetInput(VzEnum);                   _assert_(vy_input);
-		adjointz_input  = element->GetInput(AdjointzEnum);             _assert_(adjointz_input);
-	}
-	Input* dragcoeff_input = element->GetInput(FrictionCoefficientEnum);  _assert_(dragcoeff_input);
+		vz_input        = element->GetInput2(VzEnum);                   _assert_(vy_input);
+		adjointz_input  = element->GetInput2(AdjointzEnum);             _assert_(adjointz_input);
+	}
+	Input2* dragcoeff_input = element->GetInput2(FrictionCoefficientEnum);  _assert_(dragcoeff_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -1851,12 +1852,12 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* vx_input        = element->GetInput(VxEnum);                   _assert_(vx_input);
-	Input* vy_input        = NULL;
-	Input* adjointx_input  = element->GetInput(AdjointxEnum);             _assert_(adjointx_input);
-	Input* adjointy_input  = NULL;
-	Input* dragcoeff_input = element->GetInput(FrictionCoefficientEnum);  _assert_(dragcoeff_input);
+	Input2* vx_input        = element->GetInput2(VxEnum);                   _assert_(vx_input);
+	Input2* vy_input        = NULL;
+	Input2* adjointx_input  = element->GetInput2(AdjointxEnum);             _assert_(adjointx_input);
+	Input2* adjointy_input  = NULL;
+	Input2* dragcoeff_input = element->GetInput2(FrictionCoefficientEnum);  _assert_(dragcoeff_input);
 	if(domaintype!=Domain2DverticalEnum){
-		vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
-		adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
+		vy_input        = element->GetInput2(VyEnum);                   _assert_(vy_input);
+		adjointy_input  = element->GetInput2(AdjointyEnum);             _assert_(adjointy_input);
 	}
 	/* Start  looping on the number of gaussian points: */
@@ -1944,9 +1945,9 @@
 	basalelement->GetVerticesCoordinates(&xyz_list);
 	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* vx_input        = basalelement->GetInput(VxEnum);                   _assert_(vx_input);
-	Input* vy_input        = basalelement->GetInput(VyEnum);                   _assert_(vy_input);
-	Input* adjointx_input  = basalelement->GetInput(AdjointxEnum);             _assert_(adjointx_input);
-	Input* adjointy_input  = basalelement->GetInput(AdjointyEnum);             _assert_(adjointy_input);
-	Input* dragcoeff_input = basalelement->GetInput(FrictionCoefficientEnum);  _assert_(dragcoeff_input);
+	Input2* vx_input        = basalelement->GetInput2(VxEnum);                   _assert_(vx_input);
+	Input2* vy_input        = basalelement->GetInput2(VyEnum);                   _assert_(vy_input);
+	Input2* adjointx_input  = basalelement->GetInput2(AdjointxEnum);             _assert_(adjointx_input);
+	Input2* adjointy_input  = basalelement->GetInput2(AdjointyEnum);             _assert_(adjointy_input);
+	Input2* dragcoeff_input = basalelement->GetInput2(FrictionCoefficientEnum);  _assert_(dragcoeff_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -2016,13 +2017,13 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* vx_input        = element->GetInput(VxEnum);                   _assert_(vx_input);
-	Input* vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
-	Input* adjointx_input  = element->GetInput(AdjointxEnum);             _assert_(adjointx_input);
-	Input* adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
-	Input* vz_input        = NULL;
-	Input* adjointz_input  = NULL;
+	Input2* vx_input        = element->GetInput2(VxEnum);                   _assert_(vx_input);
+	Input2* vy_input        = element->GetInput2(VyEnum);                   _assert_(vy_input);
+	Input2* adjointx_input  = element->GetInput2(AdjointxEnum);             _assert_(adjointx_input);
+	Input2* adjointy_input  = element->GetInput2(AdjointyEnum);             _assert_(adjointy_input);
+	Input2* vz_input        = NULL;
+	Input2* adjointz_input  = NULL;
 	if(domaintype!=Domain2DverticalEnum){
-		vz_input        = element->GetInput(VzEnum);                   _assert_(vy_input);
-		adjointz_input  = element->GetInput(AdjointzEnum);             _assert_(adjointz_input);
+		vz_input        = element->GetInput2(VzEnum);                   _assert_(vy_input);
+		adjointz_input  = element->GetInput2(AdjointzEnum);             _assert_(adjointz_input);
 	}
 
@@ -2113,11 +2114,11 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* vx_input        = element->GetInput(VxEnum);                   _assert_(vx_input);
-	Input* vy_input        = NULL;
-	Input* adjointx_input  = element->GetInput(AdjointxEnum);             _assert_(adjointx_input);
-	Input* adjointy_input  = NULL;
+	Input2* vx_input        = element->GetInput2(VxEnum);                   _assert_(vx_input);
+	Input2* vy_input        = NULL;
+	Input2* adjointx_input  = element->GetInput2(AdjointxEnum);             _assert_(adjointx_input);
+	Input2* adjointy_input  = NULL;
 	if(domaintype!=Domain2DverticalEnum){
-		vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
-		adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
+		vy_input        = element->GetInput2(VyEnum);                   _assert_(vy_input);
+		adjointy_input  = element->GetInput2(AdjointyEnum);             _assert_(adjointy_input);
 	}
 	/* Start  looping on the number of gaussian points: */
@@ -2206,8 +2207,8 @@
 	basalelement->GetVerticesCoordinates(&xyz_list);
 	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* vx_input        = basalelement->GetInput(VxEnum);          _assert_(vx_input);
-	Input* vy_input        = basalelement->GetInput(VyEnum);          _assert_(vy_input);
-	Input* adjointx_input  = basalelement->GetInput(AdjointxEnum);    _assert_(adjointx_input);
-	Input* adjointy_input  = basalelement->GetInput(AdjointyEnum);    _assert_(adjointy_input);
+	Input2* vx_input        = basalelement->GetInput2(VxEnum);          _assert_(vx_input);
+	Input2* vy_input        = basalelement->GetInput2(VyEnum);          _assert_(vy_input);
+	Input2* adjointx_input  = basalelement->GetInput2(AdjointxEnum);    _assert_(adjointx_input);
+	Input2* adjointy_input  = basalelement->GetInput2(AdjointyEnum);    _assert_(adjointy_input);
 
 	IssmDouble  q_exp;
@@ -2222,9 +2223,9 @@
 
 	/*Recover parameters: */
-	Input* qinput = basalelement->GetInput(FrictionQEnum);
-	Input* cinput = basalelement->GetInput(FrictionCEnum);
-	Input* Asinput = basalelement->GetInput(FrictionAsEnum);
-	Input* nInput =basalelement->GetInput(MaterialsRheologyNEnum);
-	Input* Ninput = basalelement->GetInput(FrictionEffectivePressureEnum);	
+	Input2* qinput = basalelement->GetInput2(FrictionQEnum);
+	Input2* cinput = basalelement->GetInput2(FrictionCEnum);
+	Input2* Asinput = basalelement->GetInput2(FrictionAsEnum);
+	Input2* nInput =basalelement->GetInput2(MaterialsRheologyNEnum);
+	Input2* Ninput = basalelement->GetInput2(FrictionEffectivePressureEnum);	
 	/* Start  looping on the number of gaussian points: */
 	Gauss* gauss=basalelement->NewGauss(4);
@@ -2325,10 +2326,10 @@
 	basalelement->GetVerticesCoordinates(&xyz_list);
 	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* thickness_input = basalelement->GetInput(ThicknessEnum);             _assert_(thickness_input);
-	Input* vx_input        = basalelement->GetInput(VxEnum);                    _assert_(vx_input);
-	Input* vy_input        = basalelement->GetInput(VyEnum);                    _assert_(vy_input);
-	Input* adjointx_input  = basalelement->GetInput(AdjointxEnum);              _assert_(adjointx_input);
-	Input* adjointy_input  = basalelement->GetInput(AdjointyEnum);              _assert_(adjointy_input);
-	Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input);
+	Input2* thickness_input = basalelement->GetInput2(ThicknessEnum);             _assert_(thickness_input);
+	Input2* vx_input        = basalelement->GetInput2(VxEnum);                    _assert_(vx_input);
+	Input2* vy_input        = basalelement->GetInput2(VyEnum);                    _assert_(vy_input);
+	Input2* adjointx_input  = basalelement->GetInput2(AdjointxEnum);              _assert_(adjointx_input);
+	Input2* adjointy_input  = basalelement->GetInput2(AdjointyEnum);              _assert_(adjointy_input);
+	Input2* rheologyb_input = basalelement->GetInput2(MaterialsRheologyBbarEnum); _assert_(rheologyb_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -2450,11 +2451,11 @@
 
 	/*Add vx and vy as inputs to the tria element: */
-	element->AddInput(AdjointxEnum,lambdax,element->VelocityInterpolation());
-	element->AddInput(AdjointyEnum,lambday,element->VelocityInterpolation());
-	if(domaintype!=Domain2DverticalEnum) element->AddInput(AdjointzEnum,lambdaz,element->VelocityInterpolation());
+	element->AddInput2(AdjointxEnum,lambdax,element->VelocityInterpolation());
+	element->AddInput2(AdjointyEnum,lambday,element->VelocityInterpolation());
+	if(domaintype!=Domain2DverticalEnum) element->AddInput2(AdjointzEnum,lambdaz,element->VelocityInterpolation());
 
 	element->FindParam(&fe_FS,FlowequationFeFSEnum);
 	if(fe_FS!=LATaylorHoodEnum && fe_FS!=LACrouzeixRaviartEnum)	
-	 element->AddInput(AdjointpEnum,lambdap,element->PressureInterpolation());	
+	 element->AddInput2(AdjointpEnum,lambdap,element->PressureInterpolation());	
 
 	/*Free ressources:*/
@@ -2507,6 +2508,6 @@
 
 	/*Add vx and vy as inputs to the tria element: */
-	element->AddInput(AdjointxEnum,lambdax,element->GetElementType());
-	element->AddInput(AdjointyEnum,lambday,element->GetElementType());
+	element->AddInput2(AdjointxEnum,lambdax,element->GetElementType());
+	element->AddInput2(AdjointyEnum,lambday,element->GetElementType());
 
 	/*Free ressources:*/
Index: /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/Analysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/Analysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/Analysis.h	(revision 24335)
@@ -16,4 +16,5 @@
 
 class Parameters;
+class Inputs2;
 class IoModel;
 class Elements;
@@ -38,5 +39,5 @@
 		virtual void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false)=0;
 		virtual int  DofsPerNode(int** doflist,int domaintype,int approximation)=0;
-		virtual void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type)=0;
+		virtual void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type)=0;
 		virtual void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum)=0;
 
Index: /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 24335)
@@ -23,5 +23,5 @@
 	return 1;
 }/*}}}*/
-void Balancethickness2Analysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void Balancethickness2Analysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Finite element type*/
@@ -29,14 +29,14 @@
 
 	/*Load variables in element*/
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum);
-	iomodel->FetchDataToInput(elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
-	iomodel->FetchDataToInput(elements,"md.smb.mass_balance",SmbMassBalanceEnum);
-	iomodel->FetchDataToInput(elements,"md.balancethickness.thickening_rate",BalancethicknessThickeningRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.surface",SurfaceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.smb.mass_balance",SmbMassBalanceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.balancethickness.thickening_rate",BalancethicknessThickeningRateEnum);
 
 	/*Update elements: */
@@ -45,5 +45,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
 
 			counter++;
@@ -82,6 +82,6 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 
-	Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input);
+	Input2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input); 
+	Input2* vy_input = element->GetInput2(VyEnum); _assert_(vy_input);
 
 	/*Get element characteristic length*/
@@ -142,7 +142,7 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* ms_input   = element->GetInput(SmbMassBalanceEnum);                _assert_(ms_input);
-	Input* mb_input   = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);       _assert_(mb_input);
-	Input* dhdt_input = element->GetInput(BalancethicknessThickeningRateEnum);            _assert_(dhdt_input);
+	Input2* ms_input   = element->GetInput2(SmbMassBalanceEnum);                _assert_(ms_input);
+	Input2* mb_input   = element->GetInput2(BasalforcingsGroundediceMeltingRateEnum);       _assert_(mb_input);
+	Input2* dhdt_input = element->GetInput2(BalancethicknessThickeningRateEnum);            _assert_(dhdt_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.cpp	(revision 24335)
@@ -4,4 +4,5 @@
 #include "../shared/shared.h"
 #include "../modules/modules.h"
+#include "../classes/Inputs2/DatasetInput2.h"
 
 /*Model processing*/
@@ -72,5 +73,5 @@
 	return 1;
 }/*}}}*/
-void BalancethicknessAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void BalancethicknessAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	int    stabilization,finiteelement;
@@ -90,23 +91,23 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum);
-	iomodel->FetchDataToInput(elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
-	iomodel->FetchDataToInput(elements,"md.smb.mass_balance",SmbMassBalanceEnum);
-	iomodel->FetchDataToInput(elements,"md.balancethickness.thickening_rate",BalancethicknessThickeningRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.surface",SurfaceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.smb.mass_balance",SmbMassBalanceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.balancethickness.thickening_rate",BalancethicknessThickeningRateEnum);
 
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
 	}
 }/*}}}*/
@@ -171,13 +172,13 @@
 	element->FindParam(&domaintype,DomainTypeEnum);
 	element->FindParam(&stabilization,BalancethicknessStabilizationEnum);
-	Input* vxaverage_input=NULL;
-	Input* vyaverage_input=NULL;
+	Input2* vxaverage_input=NULL;
+	Input2* vyaverage_input=NULL;
 	if(domaintype==Domain2DhorizontalEnum){
-		vxaverage_input=element->GetInput(VxEnum); _assert_(vxaverage_input);
-		vyaverage_input=element->GetInput(VyEnum); _assert_(vyaverage_input);
+		vxaverage_input=element->GetInput2(VxEnum); _assert_(vxaverage_input);
+		vyaverage_input=element->GetInput2(VyEnum); _assert_(vyaverage_input);
 	}
 	else{
-		vxaverage_input=element->GetInput(VxAverageEnum); _assert_(vxaverage_input);
-		vyaverage_input=element->GetInput(VyAverageEnum); _assert_(vyaverage_input);
+		vxaverage_input=element->GetInput2(VxAverageEnum); _assert_(vxaverage_input);
+		vyaverage_input=element->GetInput2(VyAverageEnum); _assert_(vyaverage_input);
 	}
 	h = element->CharacteristicLength();
@@ -272,13 +273,13 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->FindParam(&domaintype,DomainTypeEnum);
-	Input* vxaverage_input=NULL;
-	Input* vyaverage_input=NULL;
+	Input2* vxaverage_input=NULL;
+	Input2* vyaverage_input=NULL;
 	if(domaintype==Domain2DhorizontalEnum){
-		vxaverage_input=element->GetInput(VxEnum); _assert_(vxaverage_input);
-		vyaverage_input=element->GetInput(VyEnum); _assert_(vyaverage_input);
+		vxaverage_input=element->GetInput2(VxEnum); _assert_(vxaverage_input);
+		vyaverage_input=element->GetInput2(VyEnum); _assert_(vyaverage_input);
 	}
 	else{
-		vxaverage_input=element->GetInput(VxAverageEnum); _assert_(vxaverage_input);
-		vyaverage_input=element->GetInput(VyAverageEnum); _assert_(vyaverage_input);
+		vxaverage_input=element->GetInput2(VxAverageEnum); _assert_(vxaverage_input);
+		vyaverage_input=element->GetInput2(VyAverageEnum); _assert_(vyaverage_input);
 	}
 
@@ -355,7 +356,7 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* mb_input   = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);       _assert_(mb_input);
-	Input* ms_input   = element->GetInput(SmbMassBalanceEnum);     _assert_(ms_input);
-	Input* dhdt_input = element->GetInput(BalancethicknessThickeningRateEnum); _assert_(dhdt_input);
+	Input2* mb_input   = element->GetInput2(BasalforcingsGroundediceMeltingRateEnum);       _assert_(mb_input);
+	Input2* ms_input   = element->GetInput2(SmbMassBalanceEnum);     _assert_(ms_input);
+	Input2* dhdt_input = element->GetInput2(BalancethicknessThickeningRateEnum); _assert_(dhdt_input);
 
 	/*Initialize mb_correction to 0, do not forget!:*/
@@ -396,7 +397,7 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* mb_input   = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);       _assert_(mb_input);
-	Input* ms_input   = element->GetInput(SmbMassBalanceEnum);     _assert_(ms_input);
-	Input* dhdt_input = element->GetInput(BalancethicknessThickeningRateEnum); _assert_(dhdt_input);
+	Input2* mb_input   = element->GetInput2(BasalforcingsGroundediceMeltingRateEnum);       _assert_(mb_input);
+	Input2* ms_input   = element->GetInput2(SmbMassBalanceEnum);     _assert_(ms_input);
+	Input2* dhdt_input = element->GetInput2(BalancethicknessThickeningRateEnum); _assert_(dhdt_input);
 
 	/*Initialize mb_correction to 0, do not forget!:*/
@@ -513,12 +514,12 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->GradientIndexing(&vertexpidlist[0],control_index);
-	Input* thickness_input            = element->GetInput(ThicknessEnum);                           _assert_(thickness_input);
-	Input* thicknessobs_input         = element->GetInput(InversionThicknessObsEnum);               _assert_(thicknessobs_input);
-	Input* weights_input              = element->GetInput(InversionCostFunctionsCoefficientsEnum);  _assert_(weights_input);
-	Input* vx_input                   = element->GetInput(VxEnum);                                  _assert_(vx_input);
-	Input* vy_input                   = element->GetInput(VyEnum);                                  _assert_(vy_input);
-	Input* surface_mass_balance_input = element->GetInput(SmbMassBalanceEnum);          _assert_(surface_mass_balance_input);
-	Input* basal_melting_input        = element->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(basal_melting_input);
-	Input* dhdt_input                 = element->GetInput(BalancethicknessThickeningRateEnum);      _assert_(dhdt_input);
+	DatasetInput2* weights_input       = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum);  _assert_(weights_input);
+	Input2* thickness_input            = element->GetInput2(ThicknessEnum);                           _assert_(thickness_input);
+	Input2* thicknessobs_input         = element->GetInput2(InversionThicknessObsEnum);               _assert_(thicknessobs_input);
+	Input2* vx_input                   = element->GetInput2(VxEnum);                                  _assert_(vx_input);
+	Input2* vy_input                   = element->GetInput2(VyEnum);                                  _assert_(vy_input);
+	Input2* surface_mass_balance_input = element->GetInput2(SmbMassBalanceEnum);          _assert_(surface_mass_balance_input);
+	Input2* basal_melting_input        = element->GetInput2(BasalforcingsGroundediceMeltingRateEnum); _assert_(basal_melting_input);
+	Input2* dhdt_input                 = element->GetInput2(BalancethicknessThickeningRateEnum);      _assert_(dhdt_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.cpp	(revision 24335)
@@ -12,5 +12,5 @@
 	   _error_("not implemented yet");
 }/*}}}*/
-void BalancethicknessSoftAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void BalancethicknessSoftAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 	   _error_("not implemented yet");
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/BalancethicknessSoftAnalysis.h	(revision 24335)
@@ -15,5 +15,5 @@
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
Index: /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp	(revision 24335)
@@ -26,5 +26,5 @@
 	return 1;
 }/*}}}*/
-void BalancevelocityAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void BalancevelocityAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Update elements: */
@@ -33,23 +33,23 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum);
-	iomodel->FetchDataToInput(elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
-	iomodel->FetchDataToInput(elements,"md.smb.mass_balance",SmbMassBalanceEnum);
-	iomodel->FetchDataToInput(elements,"md.balancethickness.thickening_rate",BalancethicknessThickeningRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.surface",SurfaceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.smb.mass_balance",SmbMassBalanceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.balancethickness.thickening_rate",BalancethicknessThickeningRateEnum);
 
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
 	}
 }/*}}}*/
@@ -92,5 +92,5 @@
 	/*Retrieve all Inputs and parameters: */
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* H_input = element->GetInput(ThicknessEnum); _assert_(H_input);
+	Input2* H_input = element->GetInput2(ThicknessEnum); _assert_(H_input);
 	h = element->CharacteristicLength();
 
@@ -184,8 +184,8 @@
 	/*Retrieve all inputs and parameters*/
 	basalelement->GetVerticesCoordinates(&xyz_list);
-	Input* ms_input   = basalelement->GetInput(SmbMassBalanceEnum);          _assert_(ms_input);
-	Input* mb_input   = basalelement->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(mb_input);
-	Input* dhdt_input = basalelement->GetInput(BalancethicknessThickeningRateEnum);      _assert_(dhdt_input);
-	Input* H_input    = basalelement->GetInput(ThicknessEnum);                           _assert_(H_input);
+	Input2* ms_input   = basalelement->GetInput2(SmbMassBalanceEnum);          _assert_(ms_input);
+	Input2* mb_input   = basalelement->GetInput2(BasalforcingsGroundediceMeltingRateEnum); _assert_(mb_input);
+	Input2* dhdt_input = basalelement->GetInput2(BalancethicknessThickeningRateEnum);      _assert_(dhdt_input);
+	Input2* H_input    = basalelement->GetInput2(ThicknessEnum);                           _assert_(H_input);
 	IssmDouble h = basalelement->CharacteristicLength();
 
Index: /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp	(revision 24335)
@@ -40,5 +40,5 @@
 	return 1;
 }/*}}}*/
-void DamageEvolutionAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void DamageEvolutionAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	int finiteelement;
@@ -54,5 +54,10 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
+
+			/*Need to know the type of approximation for this element*/
+			if(iomodel->Data("md.flowequation.element_equation")){
+				inputs2->SetInput(ApproximationEnum,counter,IoCodeToEnumElementEquation(reCast<int>(iomodel->Data("md.flowequation.element_equation")[i])));
+			}
 			counter++;
 		}
@@ -63,18 +68,15 @@
 	for(int i=0;i<elements->Size();i++){
 		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-		int numvertices = element->GetNumberOfVertices();
-		IssmDouble* values = xNewZeroInit<IssmDouble>(numvertices);
-		element->AddInput(DamageFEnum,values,P1Enum);
-		xDelete<IssmDouble>(values);
+		element->SetElementInput(inputs2,DamageFEnum,0.);
 	}
 
 
 	/*What input do I need to run my damage evolution model?*/
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum);
-	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchDataToInput(elements,"md.initialization.vz",VzEnum);
-	iomodel->FetchDataToInput(elements,"md.damage.D",DamageDEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.pressure",PressureEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum);
+	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vz",VzEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.damage.D",DamageDEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.pressure",PressureEnum);
 
 }/*}}}*/
@@ -137,5 +139,5 @@
 
 	/*Add input*/
-	element->AddInput(DamageFEnum,f,element->GetElementType());
+	element->AddInput2(DamageFEnum,f,element->GetElementType());
 
 	/*Clean up and return*/
@@ -172,13 +174,13 @@
 	element->ComputeDeviatoricStressTensor();
 
-	Input* principalDevStress1_input = element->GetInput(DeviatoricStress1Enum);     _assert_(principalDevStress1_input);
-	Input* principalDevStress2_input = element->GetInput(DeviatoricStress2Enum);     _assert_(principalDevStress2_input);
-
-	Input* damage_input = NULL;
+	Input2* principalDevStress1_input = element->GetInput2(DeviatoricStress1Enum);     _assert_(principalDevStress1_input);
+	Input2* principalDevStress2_input = element->GetInput2(DeviatoricStress2Enum);     _assert_(principalDevStress2_input);
+
+	Input2* damage_input = NULL;
 	if(domaintype==Domain2DhorizontalEnum){
-		damage_input = element->GetInput(DamageDbarEnum); 	_assert_(damage_input);
+		damage_input = element->GetInput2(DamageDbarEnum); 	_assert_(damage_input);
 	}
 	else{
-		damage_input = element->GetInput(DamageDEnum);   _assert_(damage_input);
+		damage_input = element->GetInput2(DamageDEnum);   _assert_(damage_input);
 	}
 
@@ -220,5 +222,5 @@
 
 	/*Add input*/
-	element->AddInput(DamageFEnum,f,element->GetElementType());
+	element->AddInput2(DamageFEnum,f,element->GetElementType());
 
 	/*Clean up and return*/
@@ -248,17 +250,17 @@
 
 	/*retrieve what we need: */
-	Input* eps_xx_input  = element->GetInput(StrainRatexxEnum);     _assert_(eps_xx_input);
-	Input* eps_xy_input  = element->GetInput(StrainRatexyEnum);     _assert_(eps_xy_input);
-	Input* eps_yy_input  = element->GetInput(StrainRateyyEnum);     _assert_(eps_yy_input);
-	Input*  n_input=element->GetInput(MaterialsRheologyNEnum); _assert_(n_input);
-	Input* damage_input = NULL;
-	Input* B_input = NULL;
+	Input2* eps_xx_input  = element->GetInput2(StrainRatexxEnum);     _assert_(eps_xx_input);
+	Input2* eps_xy_input  = element->GetInput2(StrainRatexyEnum);     _assert_(eps_xy_input);
+	Input2* eps_yy_input  = element->GetInput2(StrainRateyyEnum);     _assert_(eps_yy_input);
+	Input2*  n_input=element->GetInput2(MaterialsRheologyNEnum); _assert_(n_input);
+	Input2* damage_input = NULL;
+	Input2* B_input = NULL;
 	if(domaintype==Domain2DhorizontalEnum){
-		damage_input = element->GetInput(DamageDbarEnum); 	_assert_(damage_input);
-		B_input=element->GetInput(MaterialsRheologyBbarEnum); _assert_(B_input);
+		damage_input = element->GetInput2(DamageDbarEnum); 	_assert_(damage_input);
+		B_input=element->GetInput2(MaterialsRheologyBbarEnum); _assert_(B_input);
 	}
 	else{
-		damage_input = element->GetInput(DamageDEnum);   _assert_(damage_input);
-		B_input=element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
+		damage_input = element->GetInput2(DamageDEnum);   _assert_(damage_input);
+		B_input=element->GetInput2(MaterialsRheologyBEnum); _assert_(B_input);
 	}
 
@@ -295,5 +297,5 @@
 
 	/*Add input*/
-	element->AddInput(DamageFEnum,f,element->GetElementType());
+	element->AddInput2(DamageFEnum,f,P1DGEnum);
 
 	/*Clean up and return*/
@@ -335,23 +337,23 @@
 	}
 	/*retrieve what we need: */
-	Input* tau_xx_input  = element->GetInput(DeviatoricStressxxEnum);     _assert_(tau_xx_input);
-	Input* tau_xy_input  = element->GetInput(DeviatoricStressxyEnum);     _assert_(tau_xy_input);
-	Input* tau_yy_input  = element->GetInput(DeviatoricStressyyEnum);     _assert_(tau_yy_input);
-	Input* tau_xz_input  = NULL;
-	Input* tau_yz_input  = NULL;
-	Input* tau_zz_input  = NULL;
-	Input* stressMaxPrincipal_input = NULL;
+	Input2* tau_xx_input  = element->GetInput2(DeviatoricStressxxEnum);     _assert_(tau_xx_input);
+	Input2* tau_xy_input  = element->GetInput2(DeviatoricStressxyEnum);     _assert_(tau_xy_input);
+	Input2* tau_yy_input  = element->GetInput2(DeviatoricStressyyEnum);     _assert_(tau_yy_input);
+	Input2* tau_xz_input  = NULL;
+	Input2* tau_yz_input  = NULL;
+	Input2* tau_zz_input  = NULL;
+	Input2* stressMaxPrincipal_input = NULL;
 	if(dim==3){
-		tau_xz_input  = element->GetInput(DeviatoricStressxzEnum);     _assert_(tau_xz_input);
-		tau_yz_input  = element->GetInput(DeviatoricStressyzEnum);     _assert_(tau_yz_input);
-		tau_zz_input  = element->GetInput(DeviatoricStresszzEnum);     _assert_(tau_zz_input);
-		stressMaxPrincipal_input = element->GetInput(StressMaxPrincipalEnum); _assert_(stressMaxPrincipal_input);
-	}
-	Input* damage_input = NULL;
+		tau_xz_input  = element->GetInput2(DeviatoricStressxzEnum);     _assert_(tau_xz_input);
+		tau_yz_input  = element->GetInput2(DeviatoricStressyzEnum);     _assert_(tau_yz_input);
+		tau_zz_input  = element->GetInput2(DeviatoricStresszzEnum);     _assert_(tau_zz_input);
+		stressMaxPrincipal_input = element->GetInput2(StressMaxPrincipalEnum); _assert_(stressMaxPrincipal_input);
+	}
+	Input2* damage_input = NULL;
 	if(domaintype==Domain2DhorizontalEnum){
-		damage_input = element->GetInput(DamageDbarEnum); 	_assert_(damage_input);
+		damage_input = element->GetInput2(DamageDbarEnum); 	_assert_(damage_input);
 	}
 	else{
-		damage_input = element->GetInput(DamageDEnum);   _assert_(damage_input);
+		damage_input = element->GetInput2(DamageDEnum);   _assert_(damage_input);
 	}
 
@@ -414,5 +416,5 @@
 	}
 	/*Add input*/
-	element->AddInput(DamageFEnum,f,element->GetElementType());
+	element->AddInput2(DamageFEnum,f,P1DGEnum);
 
 	/*Clean up and return*/
@@ -461,9 +463,9 @@
 	//printf("dt %f\n", dt);
 	element->FindParam(&stabilization,DamageStabilizationEnum);
-	Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input);
-	Input* vz_input = NULL;
+	Input2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input = element->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* vz_input = NULL;
 	if(dim==3){
-		vz_input=element->GetInput(VzEnum); _assert_(vz_input);
+		vz_input=element->GetInput2(VzEnum); _assert_(vz_input);
 	}
 
@@ -634,11 +636,11 @@
 	}
 
-	Input* damaged_input = NULL;
-	Input* damagef_input = element->GetInput(DamageFEnum); _assert_(damagef_input);
+	Input2* damaged_input = NULL;
+	Input2* damagef_input = element->GetInput2(DamageFEnum); _assert_(damagef_input);
 	if(domaintype==Domain2DhorizontalEnum){
-		damaged_input = element->GetInput(DamageDbarEnum); _assert_(damaged_input);
+		damaged_input = element->GetInput2(DamageDbarEnum); _assert_(damaged_input);
 	}
 	else{
-		damaged_input = element->GetInput(DamageDEnum); _assert_(damaged_input);
+		damaged_input = element->GetInput2(DamageDEnum); _assert_(damaged_input);
 	}
 
@@ -755,8 +757,8 @@
 	element->FindParam(&domaintype,DomainTypeEnum);
 	if(domaintype==Domain2DhorizontalEnum){
-		element->AddInput(DamageDbarEnum,newdamage,element->GetElementType());
+		element->AddInput2(DamageDbarEnum,newdamage,element->GetElementType());
 	}
 	else{
-		element->AddInput(DamageDEnum,newdamage,element->GetElementType());
+		element->AddInput2(DamageDEnum,newdamage,element->GetElementType());
 	}
 
@@ -792,6 +794,6 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* vxaverage_input=element->GetInput(VxEnum); _assert_(vxaverage_input);
-	Input* vyaverage_input=element->GetInput(VyEnum); _assert_(vyaverage_input);
+	Input2* vxaverage_input=element->GetInput2(VxEnum); _assert_(vxaverage_input);
+	Input2* vyaverage_input=element->GetInput2(VyEnum); _assert_(vyaverage_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.cpp	(revision 24335)
@@ -18,5 +18,5 @@
 	return 1;
 }/*}}}*/
-void DepthAverageAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void DepthAverageAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	int counter=0;
@@ -24,5 +24,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
@@ -30,5 +30,5 @@
 
 	if(iomodel->domaintype==Domain2DverticalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
 	}
 }/*}}}*/
@@ -114,5 +114,5 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->FindParam(&input_enum,InputToDepthaverageInEnum);
-	Input* input = element->GetInput(input_enum); _assert_(input);
+	Input2* input = element->GetInput2(input_enum); _assert_(input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 24335)
@@ -99,5 +99,5 @@
 	return 1;
 }/*}}}*/
-void EnthalpyAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void EnthalpyAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	bool dakota_analysis,ismovingfront,isenthalpy;
@@ -124,5 +124,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
 			counter++;
 		}
@@ -134,28 +134,28 @@
 	iomodel->FindConstant(&materialstype,"md.materials.type");
 
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.surface",SurfaceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
-	}
-	iomodel->FetchDataToInput(elements,"md.initialization.pressure",PressureEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.temperature",TemperatureEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.waterfraction",WaterfractionEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.enthalpy",EnthalpyEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.watercolumn",WatercolumnEnum);
-	iomodel->FetchDataToInput(elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vz",VzEnum);
-	InputUpdateFromConstantx(elements,0.,VxMeshEnum);
-	InputUpdateFromConstantx(elements,0.,VyMeshEnum);
-	InputUpdateFromConstantx(elements,0.,VzMeshEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+	}
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.pressure",PressureEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.temperature",TemperatureEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.waterfraction",WaterfractionEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.enthalpy",EnthalpyEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.watercolumn",WatercolumnEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vz",VzEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,VxMeshEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,VyMeshEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,VzMeshEnum);
 	if(ismovingfront){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum); // required for updating active nodes
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum); // required for updating active nodes
 	}
 
@@ -166,24 +166,24 @@
 			break;
 		default:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.geothermalflux",BasalforcingsGeothermalfluxEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.geothermalflux",BasalforcingsGeothermalfluxEnum);
 			break;
 	}
 
 	/*Rheology type*/
-	iomodel->FetchDataToInput(elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
 	switch(materialstype){
 		case MatenhancediceEnum:
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_E",MaterialsRheologyEEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_E",MaterialsRheologyEEnum);
 			break;
 		case MatdamageiceEnum:
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
 			break;
 		case MatestarEnum:
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_Ec",MaterialsRheologyEcEnum);
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_Es",MaterialsRheologyEsEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_Ec",MaterialsRheologyEcEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_Es",MaterialsRheologyEsEnum);
 			break;
 		case MaticeEnum:
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
 			break;
 		default:
@@ -195,65 +195,65 @@
 		case 1:
 			iomodel->FindConstant(&FrictionCoupling,"md.friction.coupling");
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
 			if (FrictionCoupling==3){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
 			else if(FrictionCoupling==4){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",EffectivePressureEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",EffectivePressureEnum);
 			}
 			break;
 		case 2:
-			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.m",FrictionMEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.m",FrictionMEnum);
 			break;
 		case 3:
 			iomodel->FindConstant(&FrictionCoupling,"md.friction.coupling");
-			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.As",FrictionAsEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.As",FrictionAsEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
 			if (FrictionCoupling==3){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
 			else if(FrictionCoupling==4){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",EffectivePressureEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",EffectivePressureEnum);
 			}
 			break;
 		case 4:
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.pressure",PressureEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.temperature",TemperatureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.pressure",PressureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.temperature",TemperatureEnum);
 			iomodel->FindConstant(&FrictionCoupling,"md.friction.coupling");
 			break;
 		case 5:
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.water_layer",FrictionWaterLayerEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.water_layer",FrictionWaterLayerEnum);
 			break;
 		case 6:
-			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.m",FrictionMEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.pressure",PressureEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.temperature",TemperatureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.m",FrictionMEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.pressure",PressureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.temperature",TemperatureEnum);
 			break;
 		case 7:
 			iomodel->FindConstant(&FrictionCoupling,"md.friction.coupling");
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.coefficientcoulomb",FrictionCoefficientcoulombEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficientcoulomb",FrictionCoefficientcoulombEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
 			if (FrictionCoupling==3){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
 			else if(FrictionCoupling==4){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",EffectivePressureEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",EffectivePressureEnum);
 			}
 			break;
 		case 9:
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.pressure_adjusted_temperature",FrictionPressureAdjustedTemperatureEnum);
-			InputUpdateFromConstantx(elements,1.,FrictionPEnum);
-			InputUpdateFromConstantx(elements,1.,FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.pressure_adjusted_temperature",FrictionPressureAdjustedTemperatureEnum);
+			InputUpdateFromConstantx(inputs2,elements,1.,FrictionPEnum);
+			InputUpdateFromConstantx(inputs2,elements,1.,FrictionQEnum);
 			break;
 		default:
@@ -318,5 +318,5 @@
 
 	/*Get parameters and inputs: */
-	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
+	Input2* pressure_input		 = element->GetInput2(PressureEnum);							 _assert_(pressure_input);
 
 	/*Fetch indices of basal & surface nodes for this finite element*/
@@ -400,10 +400,10 @@
 
 	/*retrieve inputs*/
-	Input* enthalpy_input         = element->GetInput(enthalpy_enum);                    _assert_(enthalpy_input);
-	Input* pressure_input			= element->GetInput(PressureEnum);							 _assert_(pressure_input);
-	Input* geothermalflux_input   = element->GetInput(BasalforcingsGeothermalfluxEnum); _assert_(geothermalflux_input);
-	Input* vx_input               = element->GetInput(VxEnum);                          _assert_(vx_input);
-	Input* vy_input               = element->GetInput(VyEnum);                          _assert_(vy_input);
-	Input* vz_input               = element->GetInput(VzEnum);                          _assert_(vz_input);
+	Input2* enthalpy_input       = element->GetInput2(enthalpy_enum);                   _assert_(enthalpy_input);
+	Input2* pressure_input       = element->GetInput2(PressureEnum);                    _assert_(pressure_input);
+	Input2* geothermalflux_input = element->GetInput2(BasalforcingsGeothermalfluxEnum); _assert_(geothermalflux_input);
+	Input2* vx_input             = element->GetInput2(VxEnum);                          _assert_(vx_input);
+	Input2* vy_input             = element->GetInput2(VyEnum);                          _assert_(vy_input);
+	Input2* vz_input             = element->GetInput2(VzEnum);                          _assert_(vz_input);
 
 	/*Build friction element, needed later: */
@@ -503,8 +503,8 @@
 	/*feed updated variables back into model*/
 	if(dt!=0.){
-		element->AddInput(enthalpy_enum,enthalpies,element->GetElementType());
-		element->AddInput(WatercolumnEnum,watercolumns,element->GetElementType());
-	}
-	element->AddInput(BasalforcingsGroundediceMeltingRateEnum,basalmeltingrates,element->GetElementType());
+		element->AddInput2(enthalpy_enum,enthalpies,P1DGEnum);
+		element->AddInput2(WatercolumnEnum,watercolumns,P1DGEnum);
+	}
+	element->AddInput2(BasalforcingsGroundediceMeltingRateEnum,basalmeltingrates,P1DGEnum);
 
 	/*Clean up and return*/
@@ -595,10 +595,10 @@
 	IssmDouble  heatcapacity        = element->FindParam(MaterialsHeatcapacityEnum);
 	IssmDouble  thermalconductivity = element->FindParam(MaterialsThermalconductivityEnum);
-	Input* vx_input  = element->GetInput(VxEnum);     _assert_(vx_input);
-	Input* vy_input  = element->GetInput(VyEnum);     _assert_(vy_input);
-	Input* vz_input  = element->GetInput(VzEnum);     _assert_(vz_input);
-	Input* vxm_input = element->GetInput(VxMeshEnum); _assert_(vxm_input);
-	Input* vym_input = element->GetInput(VyMeshEnum); _assert_(vym_input);
-	Input* vzm_input = element->GetInput(VzMeshEnum); _assert_(vzm_input);
+	Input2* vx_input  = element->GetInput2(VxEnum);     _assert_(vx_input);
+	Input2* vy_input  = element->GetInput2(VyEnum);     _assert_(vy_input);
+	Input2* vz_input  = element->GetInput2(VzEnum);     _assert_(vz_input);
+	Input2* vxm_input = element->GetInput2(VxMeshEnum); _assert_(vxm_input);
+	Input2* vym_input = element->GetInput2(VyMeshEnum); _assert_(vym_input);
+	Input2* vzm_input = element->GetInput2(VzMeshEnum); _assert_(vzm_input);
 
 	/*Enthalpy diffusion parameter*/
@@ -818,11 +818,11 @@
 	element->FindParam(&dt,TimesteppingTimeStepEnum);
 	element->FindParam(&stabilization,ThermalStabilizationEnum);
-	Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
-	Input* vz_input=element->GetInput(VzEnum); _assert_(vz_input);
-	Input* enthalpypicard_input=element->GetInput(EnthalpyPicardEnum); _assert_(enthalpypicard_input);
-	Input* pressure_input=element->GetInput(PressureEnum); _assert_(pressure_input);
-	Input* enthalpy_input=NULL;
-	if(reCast<bool,IssmDouble>(dt)){enthalpy_input = element->GetInput(EnthalpyEnum); _assert_(enthalpy_input);}
+	Input2* vx_input=element->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input=element->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* vz_input=element->GetInput2(VzEnum); _assert_(vz_input);
+	Input2* enthalpypicard_input=element->GetInput2(EnthalpyPicardEnum); _assert_(enthalpypicard_input);
+	Input2* pressure_input=element->GetInput2(PressureEnum); _assert_(pressure_input);
+	Input2* enthalpy_input=NULL;
+	if(reCast<bool,IssmDouble>(dt)){enthalpy_input = element->GetInput2(EnthalpyEnum); _assert_(enthalpy_input);}
 
 	/* Start  looping on the number of gaussian points: */
@@ -940,12 +940,12 @@
 	if(dt==0. && !converged) enthalpy_enum=EnthalpyPicardEnum; // use enthalpy from last iteration
 	else enthalpy_enum=EnthalpyEnum; // use enthalpy from last time step
-	Input* vx_input             = element->GetInput(VxEnum);                          _assert_(vx_input);
-	Input* vy_input             = element->GetInput(VyEnum);                          _assert_(vy_input);
-	Input* vz_input             = element->GetInput(VzEnum);                          _assert_(vz_input);
-	Input* enthalpy_input		 = element->GetInput(enthalpy_enum);					 _assert_(enthalpy_input);
-	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
-	Input* watercolumn_input	 = element->GetInput(WatercolumnEnum);							 _assert_(watercolumn_input);
-	Input* meltingrate_input	 = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);							 _assert_(meltingrate_input);
-	Input* geothermalflux_input = element->GetInput(BasalforcingsGeothermalfluxEnum); _assert_(geothermalflux_input);
+	Input2* vx_input             = element->GetInput2(VxEnum);                          _assert_(vx_input);
+	Input2* vy_input             = element->GetInput2(VyEnum);                          _assert_(vy_input);
+	Input2* vz_input             = element->GetInput2(VzEnum);                          _assert_(vz_input);
+	Input2* enthalpy_input		 = element->GetInput2(enthalpy_enum);					 _assert_(enthalpy_input);
+	Input2* pressure_input		 = element->GetInput2(PressureEnum);							 _assert_(pressure_input);
+	Input2* watercolumn_input	 = element->GetInput2(WatercolumnEnum);							 _assert_(watercolumn_input);
+	Input2* meltingrate_input	 = element->GetInput2(BasalforcingsGroundediceMeltingRateEnum);							 _assert_(meltingrate_input);
+	Input2* geothermalflux_input = element->GetInput2(BasalforcingsGeothermalfluxEnum); _assert_(geothermalflux_input);
 	IssmDouble  rho_ice			 = element->FindParam(MaterialsRhoIceEnum);
 
@@ -1033,5 +1033,5 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
 	element->FindParam(&dt,TimesteppingTimeStepEnum);
-	Input*      pressure_input=element->GetInput(PressureEnum); _assert_(pressure_input);
+	Input2*      pressure_input=element->GetInput2(PressureEnum); _assert_(pressure_input);
 	IssmDouble  gravity             = element->FindParam(ConstantsGEnum);
 	IssmDouble  rho_water           = element->FindParam(MaterialsRhoSeawaterEnum);
@@ -1088,5 +1088,5 @@
 			drainage[k]=DrainageFunctionWaterfraction(waterfractions[k], dt);
 		}
-		element->AddInput(WaterfractionDrainageEnum,drainage,element->GetElementType());
+		element->AddInput2(WaterfractionDrainageEnum,drainage,P1DGEnum);
 
 		xDelete<IssmDouble>(waterfractions);
@@ -1121,5 +1121,5 @@
 			drainage_int[k]*=thicknesses[k];
 		}
-		element->AddInput(WaterfractionDrainageIntegratedEnum, drainage_int, element->GetElementType());
+		element->AddInput2(WaterfractionDrainageIntegratedEnum, drainage_int, P1DGEnum);
 
 		xDelete<IssmDouble>(drainage_int);
@@ -1144,5 +1144,5 @@
 			watercolumn[basalnodeindices[k]]+=dt*drainage_int[basalnodeindices[k]];
 		}
-		element->AddInput(WatercolumnEnum, watercolumn, element->GetElementType());
+		element->AddInput2(WatercolumnEnum, watercolumn,P1DGEnum);
 
 		xDelete<IssmDouble>(watercolumn);
@@ -1180,6 +1180,6 @@
 			element->ThermalToEnthalpy(&enthalpies[k], temperatures[k], waterfractions[k], pressures[k]);
 		}
-		element->AddInput(WaterfractionEnum,waterfractions,element->GetElementType());
-		element->AddInput(EnthalpyEnum,enthalpies,element->GetElementType());
+		element->AddInput2(WaterfractionEnum,waterfractions,P1DGEnum);
+		element->AddInput2(EnthalpyEnum,enthalpies,P1DGEnum);
 
 		xDelete<IssmDouble>(enthalpies);
@@ -1366,8 +1366,8 @@
 
 	/*Get parameters and inputs: */
-	Input* enthalpy_input		 = element->GetInput(EnthalpyPicardEnum);					 _assert_(enthalpy_input);
-	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
-	Input* watercolumn_input	 = element->GetInput(WatercolumnEnum);							 _assert_(watercolumn_input);
-	Input* meltingrate_input	 = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);							 _assert_(meltingrate_input);
+	Input2* enthalpy_input		 = element->GetInput2(EnthalpyPicardEnum);					 _assert_(enthalpy_input);
+	Input2* pressure_input		 = element->GetInput2(PressureEnum);							 _assert_(pressure_input);
+	Input2* watercolumn_input	 = element->GetInput2(WatercolumnEnum);							 _assert_(watercolumn_input);
+	Input2* meltingrate_input	 = element->GetInput2(BasalforcingsGroundediceMeltingRateEnum);							 _assert_(meltingrate_input);
 
 	/*Fetch indices of basal & surface nodes for this finite element*/
@@ -1437,8 +1437,8 @@
 
 	/*Get parameters and inputs: */
-	Input* enthalpy_input       = element->GetInput(EnthalpyEnum);                    _assert_(enthalpy_input); //TODO: check EnthalpyPicard?
-	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
-	Input* watercolumn_input	 = element->GetInput(WatercolumnEnum);							 _assert_(watercolumn_input);
-	Input* meltingrate_input	 = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);							 _assert_(meltingrate_input);
+	Input2* enthalpy_input    = element->GetInput2(EnthalpyEnum);                            _assert_(enthalpy_input); //TODO: check EnthalpyPicard?
+	Input2* pressure_input    = element->GetInput2(PressureEnum);                            _assert_(pressure_input);
+	Input2* watercolumn_input = element->GetInput2(WatercolumnEnum);                         _assert_(watercolumn_input);
+	Input2* meltingrate_input = element->GetInput2(BasalforcingsGroundediceMeltingRateEnum); _assert_(meltingrate_input);
 
 	/*Fetch indices of basal & surface nodes for this finite element*/
@@ -1608,7 +1608,8 @@
 			//if(waterfraction[i]>1.) _error_("Water fraction >1 found in solution vector");
 		}
-		element->AddInput(EnthalpyEnum,values,element->GetElementType());
-		element->AddInput(WaterfractionEnum,waterfraction,element->GetElementType());
-		element->AddInput(TemperatureEnum,temperature,element->GetElementType());
+		_assert_(element->GetElementType()==P1Enum);
+		element->AddInput2(EnthalpyEnum,values,P1DGEnum);
+		element->AddInput2(WaterfractionEnum,waterfraction,P1DGEnum);
+		element->AddInput2(TemperatureEnum,temperature,P1DGEnum);
 
 		IssmDouble* n = xNew<IssmDouble>(numnodes);
@@ -1630,36 +1631,36 @@
 			case BuddJackaEnum:
 				for(i=0;i<numnodes;i++) B[i]=BuddJacka(temperature[i]);
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],P1DGEnum);
 				break;
 			case CuffeyEnum:
 				for(i=0;i<numnodes;i++) B[i]=Cuffey(temperature[i]);
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],P1DGEnum);
 				break;
 			case CuffeyTemperateEnum:
 				for(i=0;i<numnodes;i++) B[i]=CuffeyTemperate(temperature[i], waterfraction[i],n[i]);
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],P1DGEnum);
 				break;
 			case PatersonEnum:
 				for(i=0;i<numnodes;i++) B[i]=Paterson(temperature[i]);
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],P1DGEnum);
 				break;
 			case NyeH2OEnum:
 				for(i=0;i<numnodes;i++) B[i]=NyeH2O(values[i]);
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],P1DGEnum);
 				break;
 			case NyeCO2Enum:
 				for(i=0;i<numnodes;i++) B[i]=NyeCO2(values[i]);
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],P1DGEnum);
 				break;
 			case ArrheniusEnum:{
 				element->GetVerticesCoordinates(&xyz_list);
 				for(i=0;i<numnodes;i++) B[i]=Arrhenius(temperature[i],surface[i]-xyz_list[i*3+2],n[i]);
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],P1DGEnum);
 				break;
 				}
 			case LliboutryDuvalEnum:{
-				for(i=0;i<numnodes;i++) B[i]=LliboutryDuval(values[i],pressure[i],n[i],element->FindParam(MaterialsBetaEnum),element->FindParam(ConstantsReferencetemperatureEnum),element->FindParam(MaterialsHeatcapacityEnum),element->FindParam(MaterialsLatentheatEnum));
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
-				break;
+				for(i=0;i<numnodes;i++) B[i]=LliboutryDuval(values[i],pressure[i],n[i],element->FindParam(MaterialsBetaEnum),element->FindParam(ConstantsReferencetemperatureEnum),element->FindParam(MaterialsHeatcapacityEnum),element->FindParam(MaterialsLatentheatEnum)); 
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],P1DGEnum); 
+				break; 
 				}
 			default: _error_("Rheology law " << EnumToStringx(rheology_law) << " not supported yet");
@@ -1668,5 +1669,5 @@
 	}
 	else{
-		element->AddInput(EnthalpyPicardEnum,values,element->GetElementType());
+		element->AddInput2(EnthalpyPicardEnum,values,P1DGEnum);
 	}
 
@@ -1691,6 +1692,10 @@
 	femmodel->parameters->FindParam(&isdrainicecolumn,ThermalIsdrainicecolumnEnum);
 
-	if(isdrainicecolumn)	DrainWaterfraction(femmodel);
-	if(computebasalmeltingrates)	ComputeBasalMeltingrate(femmodel);
+	if(isdrainicecolumn){
+		DrainWaterfraction(femmodel);
+	}
+	if(computebasalmeltingrates){
+		ComputeBasalMeltingrate(femmodel);
+	}
 
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.h	(revision 24335)
@@ -18,5 +18,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/EnumToAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/EnumToAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/EnumToAnalysis.h	(revision 24335)
@@ -10,5 +10,5 @@
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
Index: /issm/trunk-jpl/src/c/analyses/EsaAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/EsaAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/EsaAnalysis.cpp	(revision 24335)
@@ -18,5 +18,5 @@
 	return 1;
 }/*}}}*/
-void EsaAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void EsaAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Update elements: */
@@ -25,5 +25,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
@@ -31,6 +31,6 @@
 
 	/*Create inputs: */
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.esa.deltathickness",EsaDeltathicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.esa.deltathickness",EsaDeltathicknessEnum);
 
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/EsaAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/EsaAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/EsaAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp	(revision 24335)
@@ -26,5 +26,5 @@
 }
 /*}}}*/
-void ExtrapolationAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void ExtrapolationAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 	int    finiteelement;
 
@@ -37,11 +37,11 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
 			counter++;
 		}
 	}
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
 	}
 }
@@ -124,6 +124,6 @@
 
 	/*Retrieve all inputs and parameters*/
-	Input* lsf_slopex_input=workelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-	Input* lsf_slopey_input=workelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+	Input2* lsf_slopex_input=workelement->GetInput2(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+	Input2* lsf_slopey_input=workelement->GetInput2(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
 	workelement->GetVerticesCoordinates(&xyz_list);
 
@@ -338,6 +338,6 @@
 	element->FindParam(&extvar_enum, ExtrapolationVariableEnum);
 
-	Input* active_input=element->GetInput(IceMaskNodeActivationEnum); _assert_(active_input);
-	Input* extvar_input=element->GetInput(extvar_enum); _assert_(extvar_input);
+	Input2* active_input=element->GetInput2(IceMaskNodeActivationEnum); _assert_(active_input);
+	Input2* extvar_input=element->GetInput2(extvar_enum); _assert_(extvar_input);
 
 	Gauss* gauss=element->NewGauss();
Index: /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 	void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 	int  DofsPerNode(int** doflist,int domaintype,int approximation);
-	void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+	void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 	void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.cpp	(revision 24335)
@@ -18,5 +18,5 @@
 	return 1;
 }/*}}}*/
-void ExtrudeFromBaseAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void ExtrudeFromBaseAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	int counter=0;
@@ -24,5 +24,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
@@ -30,5 +30,5 @@
 
 	if(iomodel->domaintype==Domain2DverticalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
 	}
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.cpp	(revision 24335)
@@ -18,5 +18,5 @@
 	return 1;
 }/*}}}*/
-void ExtrudeFromTopAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void ExtrudeFromTopAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	int counter=0;
@@ -24,5 +24,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
@@ -30,5 +30,5 @@
 
 	if(iomodel->domaintype==Domain2DverticalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
 	}
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp	(revision 24335)
@@ -55,5 +55,5 @@
 	return 1;
 }/*}}}*/
-void FreeSurfaceBaseAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void FreeSurfaceBaseAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Now, is the model 3d? otherwise, do nothing: */
@@ -68,21 +68,21 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum,0.);
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.surface",SurfaceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum,0.);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum);
 	if(iomodel->domaindim==3){
-		iomodel->FetchDataToInput(elements,"md.initialization.vz",VzEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vz",VzEnum);
 	}
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
 	}
 
@@ -92,5 +92,5 @@
 	switch(basalforcing_model){
 		case FloatingMeltRateEnum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.floatingice_melting_rate",BasalforcingsFloatingiceMeltingRateEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.floatingice_melting_rate",BasalforcingsFloatingiceMeltingRateEnum);
 			break;
 		case LinearFloatingMeltRateEnum:
@@ -101,17 +101,17 @@
 			break;
 		case SpatialLinearFloatingMeltRateEnum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsDeepwaterMeltingRateEnum);
-			iomodel->FetchDataToInput(elements,"md.basalforcings.deepwater_elevation",BasalforcingsDeepwaterElevationEnum);
-			iomodel->FetchDataToInput(elements,"md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsDeepwaterMeltingRateEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.deepwater_elevation",BasalforcingsDeepwaterElevationEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum);
 			break;
 		case BasalforcingsPicoEnum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.basin_id",BasalforcingsPicoBasinIdEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.basin_id",BasalforcingsPicoBasinIdEnum);
 			break;
 		case BasalforcingsIsmip6Enum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.basin_id",BasalforcingsIsmip6BasinIdEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.basin_id",BasalforcingsIsmip6BasinIdEnum);
 			break;
 		case BeckmannGoosseFloatingMeltRateEnum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
-			iomodel->FetchDataToInput(elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
 			break;
 		default:
@@ -176,7 +176,7 @@
 	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
 	basalelement->FindParam(&stabilization,MasstransportStabilizationEnum);
-	Input* vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input=NULL;
-	if(dim>1){vy_input = basalelement->GetInput(VyEnum); _assert_(vy_input);}
+	Input2* vx_input=basalelement->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input=NULL;
+	if(dim>1){vy_input = basalelement->GetInput2(VyEnum); _assert_(vy_input);}
 	h = basalelement->CharacteristicLength();
 
@@ -295,12 +295,12 @@
 	basalelement->GetVerticesCoordinates(&xyz_list);
 	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
-	Input* groundedice_input   = basalelement->GetInput(MaskGroundediceLevelsetEnum);              _assert_(groundedice_input);
-	Input* gmb_input           = basalelement->GetInput(BasalforcingsGroundediceMeltingRateEnum);  _assert_(gmb_input);
-	Input* fmb_input           = basalelement->GetInput(BasalforcingsFloatingiceMeltingRateEnum);  _assert_(fmb_input);
-	Input* base_input          = basalelement->GetInput(BaseEnum);                                 _assert_(base_input);
-	Input* vz_input      = NULL;
+	Input2* groundedice_input   = basalelement->GetInput2(MaskGroundediceLevelsetEnum);              _assert_(groundedice_input);
+	Input2* gmb_input           = basalelement->GetInput2(BasalforcingsGroundediceMeltingRateEnum);  _assert_(gmb_input);
+	Input2* fmb_input           = basalelement->GetInput2(BasalforcingsFloatingiceMeltingRateEnum);  _assert_(fmb_input);
+	Input2* base_input          = basalelement->GetInput2(BaseEnum);                                 _assert_(base_input);
+	Input2* vz_input      = NULL;
 	switch(dim){
-		case 1: vz_input = basalelement->GetInput(VyEnum); _assert_(vz_input); break;
-		case 2: vz_input = basalelement->GetInput(VzEnum); _assert_(vz_input); break;
+		case 1: vz_input = basalelement->GetInput2(VyEnum); _assert_(vz_input); break;
+		case 2: vz_input = basalelement->GetInput2(VzEnum); _assert_(vz_input); break;
 		default: _error_("not implemented");
 	}
@@ -410,7 +410,7 @@
 
 		int             numnodes = element->GetNumberOfNodes();
-		Input* groundedice_input = element->GetInput(MaskGroundediceLevelsetEnum);  _assert_(groundedice_input);
-		Input* onbase_input       = element->GetInput(MeshVertexonbaseEnum);          _assert_(onbase_input);
-		Input* base_input        = element->GetInput(BaseEnum);                     _assert_(base_input);
+		Input2* groundedice_input = element->GetInput2(MaskGroundediceLevelsetEnum);  _assert_(groundedice_input);
+		Input2* onbase_input       = element->GetInput2(MeshVertexonbaseEnum);          _assert_(onbase_input);
+		Input2* base_input        = element->GetInput2(BaseEnum);                     _assert_(base_input);
 
 		Gauss* gauss=element->NewGauss();
Index: /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.cpp	(revision 24335)
@@ -55,5 +55,5 @@
 	return 1;
 }/*}}}*/
-void FreeSurfaceTopAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void FreeSurfaceTopAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Now, is the model 3d? otherwise, do nothing: */
@@ -71,23 +71,23 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.surface",SurfaceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
 	}
 	if(iomodel->domaindim==3){
-		iomodel->FetchDataToInput(elements,"md.initialization.vz",VzEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vz",VzEnum);
 	}
 	switch(smb_model){
 		case SMBforcingEnum:
-			iomodel->FetchDataToInput(elements,"md.smb.mass_balance",SmbMassBalanceEnum,0.);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.mass_balance",SmbMassBalanceEnum,0.);
 			break;
 		default:
@@ -153,7 +153,7 @@
 	topelement->FindParam(&dt,TimesteppingTimeStepEnum);
 	topelement->FindParam(&stabilization,MasstransportStabilizationEnum);
-	Input* vx_input=topelement->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input=NULL;
-	if(dim>1){vy_input = topelement->GetInput(VyEnum); _assert_(vy_input);}
+	Input2* vx_input=topelement->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input=NULL;
+	if(dim>1){vy_input = topelement->GetInput2(VyEnum); _assert_(vy_input);}
 	h = topelement->CharacteristicLength();
 
@@ -211,4 +211,5 @@
 				vx_input->GetInputAverage(&vx);
 				vy_input->GetInputAverage(&vy);
+
 				D[0*dim+0]=h/2.0*fabs(vx);
 				D[1*dim+1]=h/2.0*fabs(vy);
@@ -272,10 +273,10 @@
 	topelement->GetVerticesCoordinates(&xyz_list);
 	topelement->FindParam(&dt,TimesteppingTimeStepEnum);
-	Input* ms_input      = topelement->GetInput(SmbMassBalanceEnum);  _assert_(ms_input);
-	Input* surface_input = topelement->GetInput(SurfaceEnum);                     _assert_(surface_input);
-	Input* vz_input      = NULL;
+	Input2* ms_input      = topelement->GetInput2(SmbMassBalanceEnum);  _assert_(ms_input);
+	Input2* surface_input = topelement->GetInput2(SurfaceEnum);                     _assert_(surface_input);
+	Input2* vz_input      = NULL;
 	switch(dim){
-		case 1: vz_input = topelement->GetInput(VyEnum); _assert_(vz_input); break;
-		case 2: vz_input = topelement->GetInput(VzEnum); _assert_(vz_input); break;
+		case 1: vz_input = topelement->GetInput2(VyEnum); _assert_(vz_input); break;
+		case 2: vz_input = topelement->GetInput2(VzEnum); _assert_(vz_input); break;
 		default: _error_("not implemented");
 	}
Index: /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.cpp	(revision 24335)
@@ -24,5 +24,5 @@
 	return 1;
 }/*}}}*/
-void GLheightadvectionAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void GLheightadvectionAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Update elements: */
@@ -31,5 +31,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
@@ -37,8 +37,8 @@
 
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
-	}
-	iomodel->FetchDataToInput(elements,"md.mesh.vertexonboundary",MeshVertexonboundaryEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+	}
+	iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonboundary",MeshVertexonboundaryEnum);
 }/*}}}*/
 void GLheightadvectionAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
@@ -71,7 +71,7 @@
 	IssmDouble vel,vx,vy;
 	IssmDouble* xyz_list      = NULL;
-	Input* vx_input           = NULL;
-	Input* vy_input           = NULL;
-	Input* bc_input           = NULL;
+	Input2* vx_input           = NULL;
+	Input2* vy_input           = NULL;
+	Input2* bc_input           = NULL;
 
 	/*Get problem dimension*/
@@ -97,12 +97,12 @@
 	switch(domaintype){
 		case Domain2DhorizontalEnum:
-			vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
-			vy_input=basalelement->GetInput(VyEnum); _assert_(vy_input);
-		   bc_input=basalelement->GetInput(MeshVertexonboundaryEnum); _assert_(bc_input);
+			vx_input=basalelement->GetInput2(VxEnum); _assert_(vx_input);
+			vy_input=basalelement->GetInput2(VyEnum); _assert_(vy_input);
+		   bc_input=basalelement->GetInput2(MeshVertexonboundaryEnum); _assert_(bc_input);
 		break;
 		case Domain3DEnum:
-			vx_input=basalelement->GetInput(VxAverageEnum); _assert_(vx_input);
-			vy_input=basalelement->GetInput(VyAverageEnum); _assert_(vy_input);
-			bc_input=basalelement->GetInput(MeshVertexonboundaryEnum); _assert_(bc_input);
+			vx_input=basalelement->GetInput2(VxAverageEnum); _assert_(vx_input);
+			vy_input=basalelement->GetInput2(VyAverageEnum); _assert_(vy_input);
+			bc_input=basalelement->GetInput2(MeshVertexonboundaryEnum); _assert_(bc_input);
 		break;
 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
Index: /issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/GiaIvinsAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/GiaIvinsAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/GiaIvinsAnalysis.cpp	(revision 24335)
@@ -18,5 +18,5 @@
 	return 1;
 }/*}}}*/
-void GiaIvinsAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void GiaIvinsAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Update elements: */
@@ -25,13 +25,13 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.gia.mantle_viscosity",GiaMantleViscosityEnum);
-	iomodel->FetchDataToInput(elements,"md.gia.lithosphere_thickness",GiaLithosphereThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.gia.mantle_viscosity",GiaMantleViscosityEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.gia.lithosphere_thickness",GiaLithosphereThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
 }/*}}}*/
 void GiaIvinsAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
Index: /issm/trunk-jpl/src/c/analyses/GiaIvinsAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/GiaIvinsAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/GiaIvinsAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 24335)
@@ -9,5 +9,4 @@
 	return 1;
 }/*}}}*/
-
 void HydrologyDCEfficientAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
 
@@ -35,6 +34,5 @@
 	parameters->AddObject(new IntParam(HydrologydcEplThickCompEnum,eplthickcomp));
 }/*}}}*/
-
-void HydrologyDCEfficientAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void HydrologyDCEfficientAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	bool   isefficientlayer;
@@ -54,21 +52,20 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
 	}
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.epl_head",EplHeadSubstepEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.sediment_head",SedimentHeadSubstepEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.epl_thickness",HydrologydcEplThicknessSubstepEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.basal_moulin_input",HydrologydcBasalMoulinInputEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.epl_head",EplHeadSubstepEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.sediment_head",SedimentHeadSubstepEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.epl_thickness",HydrologydcEplThicknessSubstepEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.basal_moulin_input",HydrologydcBasalMoulinInputEnum);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
-	}
-}/*}}}*/
-
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+	}
+}/*}}}*/
 void HydrologyDCEfficientAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr){/*{{{*/
 
@@ -89,5 +86,4 @@
 	iomodel->DeleteData(2,"md.mesh.vertexonbase","md.mesh.vertexonsurface");
 }/*}}}*/
-
 void HydrologyDCEfficientAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
 
@@ -104,5 +100,4 @@
 	IoModelToConstraintsx(constraints,iomodel,"md.hydrology.spcepl_head",HydrologyDCEfficientAnalysisEnum,P1Enum);
 }/*}}}*/
-
 void HydrologyDCEfficientAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
 
@@ -139,5 +134,4 @@
 	iomodel->DeleteData(1,"md.mesh.vertexonbase");
 }/*}}}*/
-
 void HydrologyDCEfficientAnalysis::InitZigZagCounter(FemModel* femmodel){/*{{{*/
 
@@ -147,5 +141,4 @@
 	xDelete<int>(eplzigzag_counter);
 }/*}}}*/
-
 void HydrologyDCEfficientAnalysis::ResetCounter(FemModel* femmodel){/*{{{*/
 
@@ -163,14 +156,11 @@
 	_error_("not implemented");
 }/*}}}*/
-
 ElementVector* HydrologyDCEfficientAnalysis::CreateDVector(Element* element){/*{{{*/
 	/*Default, return NULL*/
 	return NULL;
 }/*}}}*/
-
 ElementMatrix* HydrologyDCEfficientAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
 _error_("Not implemented");
 }/*}}}*/
-
 ElementMatrix* HydrologyDCEfficientAnalysis::CreateKMatrix(Element* element){/*{{{*/
 
@@ -193,6 +183,5 @@
 	}
 
-	Input* active_element_input = basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
-	active_element_input->GetInputValue(&active_element);
+	basalelement->GetInputValue(&active_element,HydrologydcMaskEplactiveEltEnum);
 
 	/*Check that all nodes are active, else return empty matrix*/
@@ -224,8 +213,7 @@
 	basalelement->GetVerticesCoordinates(&xyz_list);
 	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
-
-	Input* epl_thick_input = basalelement->GetInput(HydrologydcEplThicknessSubstepEnum); _assert_(epl_thick_input);
-	Input* epl_head_input	= basalelement->GetInput(EplHeadSubstepEnum);  _assert_(epl_head_input);
-	Input* base_input			= basalelement->GetInput(BaseEnum); _assert_(base_input);
+	Input2* epl_thick_input = basalelement->GetInput2(HydrologydcEplThicknessSubstepEnum); _assert_(epl_thick_input);
+	Input2* epl_head_input  = basalelement->GetInput2(EplHeadSubstepEnum);  _assert_(epl_head_input);
+	Input2* base_input      = basalelement->GetInput2(BaseEnum); _assert_(base_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -279,5 +267,4 @@
 	return Ke;
 }/*}}}*/
-
 ElementVector* HydrologyDCEfficientAnalysis::CreatePVector(Element* element){/*{{{*/
 
@@ -300,6 +287,5 @@
 	}
 
-	Input* active_element_input = basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
-	active_element_input->GetInputValue(&active_element);
+	basalelement->GetInputValue(&active_element,HydrologydcMaskEplactiveEltEnum);
 
 	/*Check that all nodes are active, else return empty matrix*/
@@ -319,7 +305,7 @@
 	IssmDouble residual,connectivity;
 
-	IssmDouble		*xyz_list				 = NULL;
-	Input*			 old_wh_input			 = NULL;
-	Input*			 surface_runoff_input = NULL;
+	IssmDouble *xyz_list             = NULL;
+	Input2     *old_wh_input         = NULL;
+	Input2     *surface_runoff_input = NULL;
 
 	/*Fetch number of nodes and dof for this finite element*/
@@ -336,16 +322,16 @@
 	basalelement ->FindParam(&smb_model,SmbEnum);
 
-	Input*	epl_thick_input			 = basalelement->GetInput(HydrologydcEplThicknessSubstepEnum); _assert_(epl_thick_input);
-	Input*	sed_head_input			 = basalelement->GetInput(SedimentHeadSubstepEnum); _assert_(sed_head_input);
-	Input*	epl_head_input			 = basalelement->GetInput(EplHeadSubstepEnum); _assert_(epl_head_input);
-	Input*	basal_melt_input		 = basalelement->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(basal_melt_input);
-	Input*	residual_input			 = basalelement->GetInput(SedimentHeadResidualEnum); _assert_(residual_input);
-	Input*	base_input					 = basalelement->GetInput(BaseEnum); _assert_(base_input);
+	Input2*	epl_thick_input  = basalelement->GetInput2(HydrologydcEplThicknessSubstepEnum); _assert_(epl_thick_input);
+	Input2*	sed_head_input   = basalelement->GetInput2(SedimentHeadSubstepEnum); _assert_(sed_head_input);
+	Input2*	epl_head_input   = basalelement->GetInput2(EplHeadSubstepEnum); _assert_(epl_head_input);
+	Input2*	basal_melt_input = basalelement->GetInput2(BasalforcingsGroundediceMeltingRateEnum); _assert_(basal_melt_input);
+	Input2*	residual_input   = basalelement->GetInput2(SedimentHeadResidualEnum); _assert_(residual_input);
+	Input2*	base_input       = basalelement->GetInput2(BaseEnum); _assert_(base_input);
 
 	if(dt!= 0.){
-		old_wh_input = basalelement->GetInput(EplHeadOldEnum);            _assert_(old_wh_input);
+		old_wh_input = basalelement->GetInput2(EplHeadOldEnum);            _assert_(old_wh_input);
 	}
 	if(smb_model==SMBgradientscomponentsEnum){
-		surface_runoff_input = basalelement->GetInput(SmbRunoffEnum); _assert_(surface_runoff_input);
+		surface_runoff_input = basalelement->GetInput2(SmbRunoffEnum); _assert_(surface_runoff_input);
 	}
 
@@ -397,13 +383,10 @@
 	return pe;
 }/*}}}*/
-
 void HydrologyDCEfficientAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
 	element->GetSolutionFromInputsOneDof(solution,EplHeadSubstepEnum);
 }/*}}}*/
-
 void HydrologyDCEfficientAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
 	_error_("Not implemented yet");
 }/*}}}*/
-
 void HydrologyDCEfficientAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
 	/*Intermediaries*/
@@ -441,5 +424,6 @@
 	}
 	/*Add input to the element: */
-	element->AddBasalInput(EplHeadSubstepEnum,eplHeads,P1Enum);
+	element->AddBasalInput2(EplHeadSubstepEnum,eplHeads,P1Enum);
+
 	/*Free ressources:*/
 	xDelete<IssmDouble>(eplHeads);
@@ -447,5 +431,4 @@
 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
 } /*}}}*/
-
 void HydrologyDCEfficientAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
 	/*Default, do nothing*/
@@ -475,6 +458,5 @@
 	return transfer;
 }/*}}}*/
-
-IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input){/*{{{*/
+IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input2* sed_head_input){/*{{{*/
 
 	int transfermethod;
@@ -501,5 +483,4 @@
 	return transfer;
 }/*}}}*/
-
 void HydrologyDCEfficientAnalysis::ComputeEPLThickness(FemModel* femmodel){/*{{{*/
 
@@ -534,6 +515,5 @@
 		IssmDouble* bed           = xNew<IssmDouble>(numnodes);
 
-		Input* 	active_element_input=element->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
-		active_element_input->GetInputValue(&active_element);
+		element->GetInputValue(&active_element,HydrologydcMaskEplactiveEltEnum);
 		element->FindParam(&dt,TimesteppingTimeStepEnum);
 
@@ -590,5 +570,5 @@
 			}
 		}
-		element->AddInput(HydrologydcEplThicknessSubstepEnum,thickness,element->GetElementType());
+		element->AddInput2(HydrologydcEplThicknessSubstepEnum,thickness,element->GetElementType());
 		xDelete<IssmDouble>(thickness);
 		xDelete<IssmDouble>(eplhead);
@@ -602,5 +582,4 @@
 	}
 }/*}}}*/
-
 void HydrologyDCEfficientAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2.
@@ -630,6 +609,5 @@
 	xDelete<IssmDouble>(dbasis);
 }/*}}}*/
-
-void  HydrologyDCEfficientAnalysis::HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask, Vector<IssmDouble>* recurence, Element* element){
+void  HydrologyDCEfficientAnalysis::HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask, Vector<IssmDouble>* recurence, Element* element){/*{{{*/
 
 	bool        active_element;
@@ -663,6 +641,5 @@
 	IssmDouble colapse_thick =basalelement->FindParam(HydrologydcEplColapseThicknessEnum);
 
-	Input* active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
-	active_element_input->GetInputValue(&active_element);
+	basalelement->GetInputValue(&active_element,HydrologydcMaskEplactiveEltEnum);
 
 	basalelement-> GetInputListOnVertices(&old_active[0],HydrologydcMaskEplactiveNodeEnum);
@@ -712,5 +689,5 @@
 		}
 	}
-	basalelement->AddInput(HydrologydcEplThicknessSubstepEnum,epl_thickness,basalelement->GetElementType());
+	basalelement->AddInput2(HydrologydcEplThicknessSubstepEnum,epl_thickness,basalelement->GetElementType());
 
 	if(domaintype!=Domain2DhorizontalEnum){
@@ -726,5 +703,5 @@
 }
 /*}}}*/
-IssmDouble HydrologyDCEfficientAnalysis::EplStoring(Element* element,Gauss* gauss, Input* epl_thick_input, Input* epl_head_input, Input* base_input){/*{{{*/
+IssmDouble HydrologyDCEfficientAnalysis::EplStoring(Element* element,Gauss* gauss, Input2* epl_thick_input, Input2* epl_head_input, Input2* base_input){/*{{{*/
 	IssmDouble epl_storing;
 	IssmDouble water_sheet,storing;
@@ -757,6 +734,5 @@
 	return storing;
 }/*}}}*/
-
-IssmDouble HydrologyDCEfficientAnalysis::EplTransmitivity(Element* element,Gauss* gauss, Input* epl_thick_input, Input* epl_head_input, Input* base_input){/*{{{*/
+IssmDouble HydrologyDCEfficientAnalysis::EplTransmitivity(Element* element,Gauss* gauss, Input2* epl_thick_input, Input2* epl_head_input, Input2* base_input){/*{{{*/
 	IssmDouble epl_transmitivity;
 	IssmDouble water_sheet;
@@ -772,5 +748,4 @@
 	return epl_transmitivity;
 }/*}}}*/
-
 void HydrologyDCEfficientAnalysis::HydrologyEPLGetActive(Vector<IssmDouble>* active_vec, Element* element){/*{{{*/
 	/*Constants*/
@@ -798,6 +773,5 @@
 	/*Pass the activity mask from elements to nodes*/
 	basalelement->GetInputListOnVertices(&active[0],HydrologydcMaskEplactiveNodeEnum);
-	Input* 	active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
-	active_element_input->GetInputValue(&active_element);
+	basalelement->GetInputValue(&active_element,HydrologydcMaskEplactiveEltEnum);
 
 	for(int i=0;i<numnodes;i++) flag+=active[i];
@@ -822,5 +796,4 @@
 }
 /*}}}*/
-
 void HydrologyDCEfficientAnalysis::GetHydrologyDCInefficientHmax(IssmDouble* ph_max,Element* element, Node* innode){/*{{{*/
 
Index: /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h	(revision 24335)
@@ -9,5 +9,5 @@
 #include "./Analysis.h"
 class Node;
-class Input;
+class Input2;
 class HydrologyDCEfficientAnalysis: public Analysis{
 
@@ -16,5 +16,5 @@
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
@@ -37,7 +37,7 @@
 		void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
 		IssmDouble GetHydrologyKMatrixTransfer(Element* element);
-		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input);
-		IssmDouble EplStoring(Element* element,Gauss* gauss, Input* epl_thick_input, Input* epl_head_input, Input* base_input);
-		IssmDouble EplTransmitivity(Element* element,Gauss* gauss, Input* epl_thick_input, Input* epl_head_input, Input* base_input);
+		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input2* sed_head_input);
+		IssmDouble EplStoring(Element* element,Gauss* gauss, Input2* epl_thick_input, Input2* epl_head_input, Input2* base_input);
+		IssmDouble EplTransmitivity(Element* element,Gauss* gauss, Input2* epl_thick_input, Input2* epl_head_input, Input2* base_input);
 		void HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask, Vector<IssmDouble>* recurence, Element* element);
 		void HydrologyEPLGetActive(Vector<IssmDouble>* active_vec, Element* element);
Index: /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 24335)
@@ -5,4 +5,5 @@
 #include "../shared/shared.h"
 #include "../modules/modules.h"
+#include "../classes/Inputs2/TransientInput2.h"
 
 /*Model processing*/
@@ -74,5 +75,5 @@
   iomodel->DeleteData(&requestedoutputs,numoutputs,"md.hydrology.requested_outputs");
 }/*}}}*/
-void HydrologyDCInefficientAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void HydrologyDCInefficientAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	bool   isefficientlayer;
@@ -93,23 +94,23 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
 	}
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.basal_moulin_input",HydrologydcBasalMoulinInputEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.sediment_head",SedimentHeadSubstepEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.sediment_transmitivity",HydrologydcSedimentTransmitivityEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.mask_thawed_node",HydrologydcMaskThawedNodeEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.basal_moulin_input",HydrologydcBasalMoulinInputEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.sediment_head",SedimentHeadSubstepEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.sediment_transmitivity",HydrologydcSedimentTransmitivityEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.mask_thawed_node",HydrologydcMaskThawedNodeEnum);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
 	}
 	if(isefficientlayer){
-		iomodel->FetchDataToInput(elements,"md.hydrology.mask_eplactive_node",HydrologydcMaskEplactiveNodeEnum);
-		iomodel->FetchDataToInput(elements,"md.initialization.epl_head",EplHeadSubstepEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.mask_eplactive_node",HydrologydcMaskEplactiveNodeEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.initialization.epl_head",EplHeadSubstepEnum);
 	}
 
@@ -200,6 +201,5 @@
 	}
 
-	Input* thawed_element_input = basalelement->GetInput(HydrologydcMaskThawedEltEnum); _assert_(thawed_element_input);
-	thawed_element_input->GetInputValue(&thawed_element);
+	basalelement->GetInput2Value(&thawed_element,HydrologydcMaskThawedEltEnum);
 
 	/*Check that all nodes are active, else return empty matrix*/
@@ -219,7 +219,4 @@
 	IssmDouble *xyz_list  = NULL;
 
-	/*Define transfer related variables*/
-	Input* active_element_input =NULL;
-
 	/*Fetch number of nodes and dof for this finite element*/
 	int numnodes = basalelement->GetNumberOfNodes();
@@ -235,12 +232,12 @@
 	basalelement ->FindParam(&dt,TimesteppingTimeStepEnum);
 	basalelement ->FindParam(&isefficientlayer,HydrologydcIsefficientlayerEnum);
-	Input* SedTrans_input = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum); _assert_(SedTrans_input);
-	Input* sed_head_input = basalelement->GetInput(SedimentHeadSubstepEnum);
-	Input* base_input     = basalelement->GetInput(BaseEnum);
-	Input* old_wh_input = basalelement->GetInput(SedimentHeadOldEnum);                  _assert_(old_wh_input);
+	Input2* SedTrans_input = basalelement->GetInput2(HydrologydcSedimentTransmitivityEnum); _assert_(SedTrans_input);
+	Input2* sed_head_input = basalelement->GetInput2(SedimentHeadSubstepEnum);
+	Input2* base_input     = basalelement->GetInput2(BaseEnum);
+	Input2* old_wh_input   = basalelement->GetInput2(SedimentHeadOldEnum);                  _assert_(old_wh_input);
 
 	/*Transfer related Inputs*/
 	if(isefficientlayer){
-		active_element_input = basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
+		basalelement->GetInput2Value(&active_element,HydrologydcMaskEplactiveEltEnum);
 	}
 
@@ -279,5 +276,4 @@
 			/*Transfer EPL part*/
 			if(isefficientlayer){
-				active_element_input->GetInputValue(&active_element);
 				if(active_element){
 					transfer=GetHydrologyKMatrixTransfer(basalelement);
@@ -324,6 +320,5 @@
 	}
 
-	Input* thawed_element_input = basalelement->GetInput(HydrologydcMaskThawedEltEnum); _assert_(thawed_element_input);
-	thawed_element_input->GetInputValue(&thawed_element);
+	basalelement->GetInput2Value(&thawed_element,HydrologydcMaskThawedEltEnum);
 
 	/*Check that all nodes are active, else return empty matrix*/
@@ -345,9 +340,9 @@
 	IssmDouble Jdet;
 
-	IssmDouble *xyz_list             = NULL;
-	Input*      active_element_input = NULL;
-	Input*      old_wh_input         = NULL;
-	Input*      dummy_input          = NULL;
-	TransientInput*  surface_runoff_input          = NULL;
+	IssmDouble      *xyz_list             = NULL;
+	Input2          *active_element_input = NULL;
+	Input2          *old_wh_input         = NULL;
+	Input2          *dummy_input          = NULL;
+	TransientInput2 *surface_runoff_input = NULL;
 
 	/*Fetch number of nodes and dof for this finite element*/
@@ -364,9 +359,9 @@
 	basalelement->FindParam(&smb_model,SmbEnum);
 
-	Input*	sed_head_input			 = basalelement->GetInput(SedimentHeadSubstepEnum);
-	Input*	epl_head_input			 = basalelement->GetInput(EplHeadSubstepEnum);
-	Input*	base_input				 = basalelement->GetInput(BaseEnum);
-	Input*	basal_melt_input		 = basalelement->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(basal_melt_input);
-	Input*	SedTrans_input			 = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum); _assert_(SedTrans_input);
+	Input2*	sed_head_input   = basalelement->GetInput2(SedimentHeadSubstepEnum);
+	Input2*	epl_head_input   = basalelement->GetInput2(EplHeadSubstepEnum);
+	Input2*	base_input       = basalelement->GetInput2(BaseEnum);
+	Input2*	basal_melt_input = basalelement->GetInput2(BasalforcingsGroundediceMeltingRateEnum); _assert_(basal_melt_input);
+	Input2*	SedTrans_input   = basalelement->GetInput2(HydrologydcSedimentTransmitivityEnum); _assert_(SedTrans_input);
 
 	IssmDouble time;
@@ -375,20 +370,21 @@
 
 	if(dt!= 0.){
-		old_wh_input = basalelement->GetInput(SedimentHeadOldEnum);                  _assert_(old_wh_input);
+		old_wh_input = basalelement->GetInput2(SedimentHeadOldEnum);                  _assert_(old_wh_input);
 	}
 	if(smb_model==SMBgradientscomponentsEnum){
 		basalelement->FindParam(&smbsubstepping,SmbStepsPerStepEnum);
 		if(smbsubstepping>1) {
-			dummy_input = basalelement->GetInput(SmbRunoffTransientEnum); _assert_(dummy_input);
+			dummy_input = basalelement->GetInput2(SmbRunoffTransientEnum); _assert_(dummy_input);
 		}
 		else {
-			dummy_input = basalelement->GetInput(SmbRunoffEnum); _assert_(dummy_input);
-		}
-		surface_runoff_input=xDynamicCast<TransientInput*>(dummy_input); _assert_(surface_runoff_input);
+			dummy_input = basalelement->GetInput2(SmbRunoffEnum); _assert_(dummy_input);
+		}
+		_assert_(surface_runoff_input->InstanceEnum()==TransientInput2Enum);
+		surface_runoff_input=xDynamicCast<TransientInput2*>(dummy_input); _assert_(surface_runoff_input);
 	}
 
 	/*Transfer related Inputs*/
 	if(isefficientlayer){
-		active_element_input = basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
+		basalelement->GetInput2Value(&active_element,HydrologydcMaskEplactiveEltEnum);
 	}
 
@@ -419,5 +415,4 @@
 		else{
 			/*if EPL is present and active input is there not here*/
-			active_element_input->GetInputValue(&active_element);
 			if(!active_element){
 				basal_melt_input->GetInputValue(&water_load,gauss);
@@ -439,5 +434,4 @@
 			if(isefficientlayer){
 				/*Dealing with the sediment part of the transfer term*/
-				active_element_input->GetInputValue(&active_element);
 				if(active_element){
 					transfer=GetHydrologyPVectorTransfer(basalelement,gauss,epl_head_input);
@@ -575,7 +569,7 @@
 
 	/*Add input to the element: */
-	element->AddBasalInput(SedimentHeadSubstepEnum,values,P1Enum);
-	element->AddBasalInput(EffectivePressureSubstepEnum,pressure,P1Enum);
-	element->AddBasalInput(SedimentHeadResidualEnum,residual,P1Enum);
+	element->AddBasalInput2(SedimentHeadSubstepEnum,values,P1Enum);
+	element->AddBasalInput2(EffectivePressureSubstepEnum,pressure,P1Enum);
+	element->AddBasalInput2(SedimentHeadResidualEnum,residual,P1Enum);
 
 	/*Free ressources:*/
@@ -593,5 +587,5 @@
 	return;
 }/*}}}*/
-IssmDouble HydrologyDCInefficientAnalysis::SedimentStoring(Element* element,Gauss* gauss,Input* sed_head_input, Input* base_input){/*{{{*/
+IssmDouble HydrologyDCInefficientAnalysis::SedimentStoring(Element* element,Gauss* gauss,Input2* sed_head_input, Input2* base_input){/*{{{*/
 	int unconf_scheme;
 	IssmDouble expfac;
@@ -632,5 +626,5 @@
 	return sediment_storing;
 }/*}}}*/
-IssmDouble HydrologyDCInefficientAnalysis::SedimentTransmitivity(Element* element,Gauss* gauss,Input* sed_head_input, Input* base_input,Input* SedTrans_input){/*{{{*/
+IssmDouble HydrologyDCInefficientAnalysis::SedimentTransmitivity(Element* element,Gauss* gauss,Input2* sed_head_input, Input2* base_input,Input2* SedTrans_input){/*{{{*/
 	int unconf_scheme;
 	IssmDouble ratio,expfac;
@@ -722,5 +716,5 @@
 	return transfer;
 }/*}}}*/
-IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* epl_head_input){/*{{{*/
+IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input2* epl_head_input){/*{{{*/
 
 	int transfermethod;
@@ -753,7 +747,7 @@
 	for(int i=0;i<femmodel->elements->Size();i++){
 		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
-			Input* node_mask_input = element->GetInput(HydrologydcMaskEplactiveNodeEnum); _assert_(node_mask_input);
-
-		if(node_mask_input->Max()>0.){
+
+		Input2* input=element->GetInput2(HydrologydcMaskEplactiveNodeEnum); _assert_(input);
+		if(input->GetInputMax()>0.){
 			element_active = true;
 		}
@@ -761,5 +755,5 @@
 			element_active = false;
 		}
-		element->AddInput(new BoolInput(HydrologydcMaskEplactiveEltEnum,element_active));
+		element->SetBoolInput(element->inputs2,HydrologydcMaskEplactiveEltEnum,element_active);
 	}
 }/*}}}*/
@@ -813,7 +807,7 @@
 	for(int i=0;i<femmodel->elements->Size();i++){
 		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
-			Input* node_mask_input = element->GetInput(HydrologydcMaskThawedNodeEnum); _assert_(node_mask_input);
-
-		if(node_mask_input->Max()>0.){
+
+		Input2* input=element->GetInput2(HydrologydcMaskThawedNodeEnum); _assert_(input);
+		if(input->GetInputMax()>0.){
 			element_active = true;
 		}
@@ -821,5 +815,5 @@
 			element_active = false;
 		}
-		element->AddInput(new BoolInput(HydrologydcMaskThawedEltEnum,element_active));
+		element->SetBoolInput(element->inputs2,HydrologydcMaskThawedEltEnum,element_active);
 	}
 }/*}}}*/
@@ -849,6 +843,5 @@
 	/*Pass the activity mask from elements to nodes*/
 	basalelement->GetInputListOnVertices(&active[0],HydrologydcMaskThawedNodeEnum);
-	Input* 	active_element_input=basalelement->GetInput(HydrologydcMaskThawedEltEnum); _assert_(active_element_input);
-	active_element_input->GetInputValue(&active_element);
+	basalelement->GetInput2Value(&active_element,HydrologydcMaskThawedEltEnum);
 
 	for(int i=0;i<numnodes;i++) flag+=active[i];
Index: /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h	(revision 24335)
@@ -9,5 +9,5 @@
 #include "./Analysis.h"
 class Node;
-class Input;
+class Input2;
 class HydrologyDCInefficientAnalysis: public Analysis{
 
@@ -16,5 +16,5 @@
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
@@ -34,9 +34,9 @@
 		/*Intermediaries*/
 		void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
-		IssmDouble SedimentStoring(Element* element, Gauss* gauss, Input* sed_head_input, Input* base_input);
-		IssmDouble SedimentTransmitivity(Element* element,Gauss* gauss,Input* sed_head_input, Input* base_input,Input* SedTrans_input);
+		IssmDouble SedimentStoring(Element* element, Gauss* gauss, Input2* sed_head_input, Input2* base_input);
+		IssmDouble SedimentTransmitivity(Element* element,Gauss* gauss,Input2* sed_head_input, Input2* base_input,Input2* SedTrans_input);
 		void GetHydrologyDCInefficientHmax(IssmDouble* ph_max,Element* element, Node* innode);
 		IssmDouble GetHydrologyKMatrixTransfer(Element* element);
-		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* epl_head_input);
+		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input2* epl_head_input);
 		void ElementizeEplMask(FemModel* femmodel);
 		void HydrologyIDSGetMask(Vector<IssmDouble>* vec_mask, Element* element);
Index: /issm/trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.cpp	(revision 24335)
@@ -107,5 +107,5 @@
 	return 1;
 }/*}}}*/
-void HydrologyGlaDSAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void HydrologyGlaDSAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Fetch data needed: */
@@ -121,28 +121,28 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.bed",BedEnum);
-	iomodel->FetchDataToInput(elements,"md.basalforcings.geothermalflux",BasalforcingsGeothermalfluxEnum);
-	iomodel->FetchDataToInput(elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.bed",BedEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.geothermalflux",BasalforcingsGeothermalfluxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
-	}
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.bump_height",HydrologyBumpHeightEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.sheet_conductivity",HydrologySheetConductivityEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.neumannflux",HydrologyNeumannfluxEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.moulin_input",HydrologyMoulinInputEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.watercolumn",HydrologySheetThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.hydraulic_potential",HydraulicPotentialEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+	}
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.bump_height",HydrologyBumpHeightEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.sheet_conductivity",HydrologySheetConductivityEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.neumannflux",HydrologyNeumannfluxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.moulin_input",HydrologyMoulinInputEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.watercolumn",HydrologySheetThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.hydraulic_potential",HydraulicPotentialEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum);
 	iomodel->FindConstant(&frictionlaw,"md.friction.law");
 
@@ -150,10 +150,10 @@
 	switch(frictionlaw){
 		case 1:
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
 			break;
 		case 8:
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
 			break;
 		default:
@@ -242,11 +242,11 @@
 	IssmDouble g         = element->FindParam(ConstantsGEnum);
 	IssmDouble e_v       = element->FindParam(HydrologyEnglacialVoidRatioEnum);
-	Input* k_input   = element->GetInput(HydrologySheetConductivityEnum);_assert_(k_input);
-	Input* phi_input = element->GetInput(HydraulicPotentialEnum);      _assert_(phi_input);
-	Input* h_input   = element->GetInput(HydrologySheetThicknessEnum); _assert_(h_input);
-	Input* H_input      = element->GetInput(ThicknessEnum); _assert_(H_input);
-	Input* b_input      = element->GetInput(BedEnum); _assert_(b_input);
-	Input* B_input      = element->GetInput(MaterialsRheologyBEnum);         _assert_(B_input);
-	Input* n_input      = element->GetInput(MaterialsRheologyNEnum);         _assert_(n_input);
+	Input2* k_input   = element->GetInput2(HydrologySheetConductivityEnum);_assert_(k_input);
+	Input2* phi_input = element->GetInput2(HydraulicPotentialEnum);      _assert_(phi_input);
+	Input2* h_input   = element->GetInput2(HydrologySheetThicknessEnum); _assert_(h_input);
+	Input2* H_input      = element->GetInput2(ThicknessEnum); _assert_(H_input);
+	Input2* b_input      = element->GetInput2(BedEnum); _assert_(b_input);
+	Input2* B_input      = element->GetInput2(MaterialsRheologyBEnum);         _assert_(B_input);
+	Input2* n_input      = element->GetInput2(MaterialsRheologyNEnum);         _assert_(n_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -342,16 +342,16 @@
 	IssmDouble g         = element->FindParam(ConstantsGEnum);
 	IssmDouble e_v       = element->FindParam(HydrologyEnglacialVoidRatioEnum);
-	Input* hr_input     = element->GetInput(HydrologyBumpHeightEnum);_assert_(hr_input);
-	Input* vx_input     = element->GetInput(VxEnum);_assert_(vx_input);
-	Input* vy_input     = element->GetInput(VyEnum);_assert_(vy_input);
-	Input* h_input      = element->GetInput(HydrologySheetThicknessEnum);_assert_(h_input);
-	Input* H_input      = element->GetInput(ThicknessEnum); _assert_(H_input);
-	Input* b_input      = element->GetInput(BedEnum); _assert_(b_input);
-	Input* G_input      = element->GetInput(BasalforcingsGeothermalfluxEnum);_assert_(G_input);
-	Input* m_input      = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);_assert_(m_input);
-	Input* B_input      = element->GetInput(MaterialsRheologyBEnum);         _assert_(B_input);
-	Input* n_input      = element->GetInput(MaterialsRheologyNEnum);         _assert_(n_input);
-	Input* phiold_input = element->GetInput(HydraulicPotentialOldEnum);      _assert_(phiold_input);
-	Input* phi_input    = element->GetInput(HydraulicPotentialEnum);         _assert_(phi_input);
+	Input2* hr_input     = element->GetInput2(HydrologyBumpHeightEnum);_assert_(hr_input);
+	Input2* vx_input     = element->GetInput2(VxEnum);_assert_(vx_input);
+	Input2* vy_input     = element->GetInput2(VyEnum);_assert_(vy_input);
+	Input2* h_input      = element->GetInput2(HydrologySheetThicknessEnum);_assert_(h_input);
+	Input2* H_input      = element->GetInput2(ThicknessEnum); _assert_(H_input);
+	Input2* b_input      = element->GetInput2(BedEnum); _assert_(b_input);
+	Input2* G_input      = element->GetInput2(BasalforcingsGeothermalfluxEnum);_assert_(G_input);
+	Input2* m_input      = element->GetInput2(BasalforcingsGroundediceMeltingRateEnum);_assert_(m_input);
+	Input2* B_input      = element->GetInput2(MaterialsRheologyBEnum);         _assert_(B_input);
+	Input2* n_input      = element->GetInput2(MaterialsRheologyNEnum);         _assert_(n_input);
+	Input2* phiold_input = element->GetInput2(HydraulicPotentialOldEnum);      _assert_(phiold_input);
+	Input2* phi_input    = element->GetInput2(HydraulicPotentialEnum);         _assert_(phi_input);
 
 	/*Build friction element, needed later: */
@@ -479,13 +479,13 @@
 	IssmDouble rho_water = element->FindParam(MaterialsRhoFreshwaterEnum);
 	IssmDouble g         = element->FindParam(ConstantsGEnum);
-	Input* hr_input = element->GetInput(HydrologyBumpHeightEnum);_assert_(hr_input);
-	Input* vx_input = element->GetInput(VxEnum);_assert_(vx_input);
-	Input* vy_input = element->GetInput(VyEnum);_assert_(vy_input);
-	Input* H_input  = element->GetInput(ThicknessEnum); _assert_(H_input);
-	Input* b_input  = element->GetInput(BedEnum); _assert_(b_input);
-	Input* hold_input  = element->GetInput(HydrologySheetThicknessOldEnum);_assert_(hold_input);
-	Input* B_input  = element->GetInput(MaterialsRheologyBEnum);         _assert_(B_input);
-	Input* n_input  = element->GetInput(MaterialsRheologyNEnum);         _assert_(n_input);
-	Input* phi_input = element->GetInput(HydraulicPotentialEnum);         _assert_(phi_input);
+	Input2* hr_input = element->GetInput2(HydrologyBumpHeightEnum);_assert_(hr_input);
+	Input2* vx_input = element->GetInput2(VxEnum);_assert_(vx_input);
+	Input2* vy_input = element->GetInput2(VyEnum);_assert_(vy_input);
+	Input2* H_input  = element->GetInput2(ThicknessEnum); _assert_(H_input);
+	Input2* b_input  = element->GetInput2(BedEnum); _assert_(b_input);
+	Input2* hold_input  = element->GetInput2(HydrologySheetThicknessOldEnum);_assert_(hold_input);
+	Input2* B_input  = element->GetInput2(MaterialsRheologyBEnum);         _assert_(B_input);
+	Input2* n_input  = element->GetInput2(MaterialsRheologyNEnum);         _assert_(n_input);
+	Input2* phi_input = element->GetInput2(HydraulicPotentialEnum);         _assert_(phi_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -532,5 +532,5 @@
 	}
 
-	element->AddInput(HydrologySheetThicknessEnum,h_new,P1Enum);
+	element->AddInput2(HydrologySheetThicknessEnum,h_new,P1Enum);
 
 	/*Clean up and return*/
@@ -562,7 +562,7 @@
 	IssmDouble  rho_water = element->FindParam(MaterialsRhoFreshwaterEnum);
 	IssmDouble  g         = element->FindParam(ConstantsGEnum);
-	Input* H_input   = element->GetInput(ThicknessEnum); _assert_(H_input);
-	Input* b_input   = element->GetInput(BedEnum); _assert_(b_input);
-	Input* phi_input = element->GetInput(HydraulicPotentialEnum); _assert_(phi_input);
+	Input2* H_input   = element->GetInput2(ThicknessEnum); _assert_(H_input);
+	Input2* b_input   = element->GetInput2(BedEnum); _assert_(b_input);
+	Input2* phi_input = element->GetInput2(HydraulicPotentialEnum); _assert_(phi_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -592,5 +592,5 @@
 	}
 
-	element->AddInput(EffectivePressureEnum,N,element->FiniteElement());
+	element->AddInput2(EffectivePressureEnum,N,element->FiniteElement());
 
 	/*Clean up and return*/
Index: /issm/trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/HydrologyPismAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyPismAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyPismAnalysis.cpp	(revision 24335)
@@ -22,5 +22,5 @@
 	return 0;
 }/*}}}*/
-void HydrologyPismAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void HydrologyPismAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Fetch data needed: */
@@ -32,10 +32,10 @@
 
 	/*Add input to elements*/
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.drainage_rate",HydrologyDrainageRateEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.watercolumn_max",HydrologyWatercolumnMaxEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.watercolumn",WatercolumnEnum,0.);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.drainage_rate",HydrologyDrainageRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.watercolumn_max",HydrologyWatercolumnMaxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.watercolumn",WatercolumnEnum,0.);
 }/*}}}*/
 void HydrologyPismAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
@@ -117,5 +117,5 @@
 	IssmDouble* meltingrate  = xNew<IssmDouble>(numvertices);
  	IssmDouble* watercolumn_max  = xNew<IssmDouble>(numvertices);
-	element->GetInputListOnVertices(&watercolumn[0],WatercolumnEnum);
+	element->GetInputListOnVertices(&watercolumn[0],WaterColumnOldEnum);
 	element->GetInputListOnVertices(&drainagerate[0],HydrologyDrainageRateEnum);
 	element->GetInputListOnVertices(&meltingrate[0],BasalforcingsGroundediceMeltingRateEnum);
@@ -131,5 +131,6 @@
 
 	/* Divide by connectivity, add degree of channelization as an input */
-	element->AddInput(WatercolumnEnum,&watercolumn[0],P1Enum);
+	/*FIXME: should be changed to P1, this is due to the NR, IsFloating will return 0 on this element, but it should not be DG*/
+	element->AddInput2(WatercolumnEnum,&watercolumn[0],P1DGEnum);
 
 	/*Clean up and return*/
Index: /issm/trunk-jpl/src/c/analyses/HydrologyPismAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyPismAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyPismAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.cpp	(revision 24335)
@@ -80,5 +80,5 @@
 	return 1;
 }/*}}}*/
-void HydrologyShaktiAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void HydrologyShaktiAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Fetch data needed: */
@@ -94,29 +94,29 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
-	}
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
-	iomodel->FetchDataToInput(elements,"md.basalforcings.geothermalflux",BasalforcingsGeothermalfluxEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.head",HydrologyHeadEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.gap_height",HydrologyGapHeightEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.englacial_input",HydrologyEnglacialInputEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.moulin_input",HydrologyMoulinInputEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.bump_spacing",HydrologyBumpSpacingEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.bump_height",HydrologyBumpHeightEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.reynolds",HydrologyReynoldsEnum);
-	iomodel->FetchDataToInput(elements,"md.hydrology.neumannflux",HydrologyNeumannfluxEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+	}
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.geothermalflux",BasalforcingsGeothermalfluxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.head",HydrologyHeadEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.gap_height",HydrologyGapHeightEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.englacial_input",HydrologyEnglacialInputEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.moulin_input",HydrologyMoulinInputEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.bump_spacing",HydrologyBumpSpacingEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.bump_height",HydrologyBumpHeightEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.reynolds",HydrologyReynoldsEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.neumannflux",HydrologyNeumannfluxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum);
 	iomodel->FindConstant(&frictionlaw,"md.friction.law");
 
@@ -124,10 +124,10 @@
 	switch(frictionlaw){
 		case 1:
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
 			break;
 		case 8:
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
 			break;
 		default:
@@ -244,17 +244,17 @@
 	IssmDouble  rho_ice         = element->FindParam(MaterialsRhoIceEnum);
 	IssmDouble  rho_water       = element->FindParam(MaterialsRhoFreshwaterEnum);
-	Input* geothermalflux_input = element->GetInput(BasalforcingsGeothermalfluxEnum);_assert_(geothermalflux_input);
-	Input* head_input           = element->GetInput(HydrologyHeadEnum);              _assert_(head_input);
-	Input* gap_input            = element->GetInput(HydrologyGapHeightEnum);         _assert_(gap_input);
-	Input* thickness_input      = element->GetInput(ThicknessEnum);                  _assert_(thickness_input);
-	Input* base_input           = element->GetInput(BaseEnum);                       _assert_(base_input);
-	Input* B_input              = element->GetInput(MaterialsRheologyBEnum);         _assert_(B_input);
-	Input* n_input              = element->GetInput(MaterialsRheologyNEnum);         _assert_(n_input);
-	Input* englacial_input      = element->GetInput(HydrologyEnglacialInputEnum);    _assert_(englacial_input);
-	Input* vx_input             = element->GetInput(VxEnum);                         _assert_(vx_input);
-	Input* vy_input             = element->GetInput(VyEnum);                         _assert_(vy_input);
-	Input* lr_input             = element->GetInput(HydrologyBumpSpacingEnum);       _assert_(lr_input);
-	Input* br_input             = element->GetInput(HydrologyBumpHeightEnum);        _assert_(br_input);
-   Input* headold_input        = element->GetInput(HydrologyHeadOldEnum);           _assert_(headold_input);
+	Input2* geothermalflux_input = element->GetInput2(BasalforcingsGeothermalfluxEnum);_assert_(geothermalflux_input);
+	Input2* head_input           = element->GetInput2(HydrologyHeadEnum);              _assert_(head_input);
+	Input2* gap_input            = element->GetInput2(HydrologyGapHeightEnum);         _assert_(gap_input);
+	Input2* thickness_input      = element->GetInput2(ThicknessEnum);                  _assert_(thickness_input);
+	Input2* base_input           = element->GetInput2(BaseEnum);                       _assert_(base_input);
+	Input2* B_input              = element->GetInput2(MaterialsRheologyBEnum);         _assert_(B_input);
+	Input2* n_input              = element->GetInput2(MaterialsRheologyNEnum);         _assert_(n_input);
+	Input2* englacial_input      = element->GetInput2(HydrologyEnglacialInputEnum);    _assert_(englacial_input);
+	Input2* vx_input             = element->GetInput2(VxEnum);                         _assert_(vx_input);
+	Input2* vy_input             = element->GetInput2(VyEnum);                         _assert_(vy_input);
+	Input2* lr_input             = element->GetInput2(HydrologyBumpSpacingEnum);       _assert_(lr_input);
+	Input2* br_input             = element->GetInput2(HydrologyBumpHeightEnum);        _assert_(br_input);
+   Input2* headold_input        = element->GetInput2(HydrologyHeadOldEnum);           _assert_(headold_input);
 
 	/*Get conductivity from inputs*/
@@ -403,15 +403,19 @@
 
 	/*Add input to the element: */
-	element->AddInput(HydrologyHeadEnum,values,element->GetElementType());
-   element->AddInput(EffectivePressureEnum,eff_pressure,P1Enum);
+	element->AddInput2(HydrologyHeadEnum,values,element->GetElementType());
+   element->AddInput2(EffectivePressureEnum,eff_pressure,P1Enum);
 
 	/*Update reynolds number according to new solution*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* head_input = element->GetInput(HydrologyHeadEnum);_assert_(head_input);
-	head_input->GetInputDerivativeAverageValue(&dh[0],xyz_list);
+	Input2* head_input = element->GetInput2(HydrologyHeadEnum);_assert_(head_input);
 	IssmDouble conductivity = GetConductivity(element);
 
+	/*Get gap height derivatives at the center of the element*/
+	Gauss* gauss=element->NewGauss(0);
+	head_input->GetInputDerivativeValue(&dh[0],xyz_list,gauss);
+	delete gauss;
+
 	IssmDouble reynolds = conductivity*sqrt(dh[0]*dh[0]+dh[1]*dh[1])/NU;
-	element->AddInput(HydrologyReynoldsEnum,&reynolds,P0Enum);
+	element->AddInput2(HydrologyReynoldsEnum,&reynolds,P0Enum);
 
 	/*Free resources:*/
@@ -439,6 +443,6 @@
 
 	/*Get Reynolds and gap average values*/
-	Input* reynolds_input = element->GetInput(HydrologyReynoldsEnum);  _assert_(reynolds_input);
-	Input* gap_input      = element->GetInput(HydrologyGapHeightEnum); _assert_(gap_input);
+	Input2* reynolds_input = element->GetInput2(HydrologyReynoldsEnum);  _assert_(reynolds_input);
+	Input2* gap_input      = element->GetInput2(HydrologyGapHeightEnum); _assert_(gap_input);
 	reynolds_input->GetInputAverage(&reynolds);
 	gap_input->GetInputAverage(&gap);
@@ -482,16 +486,16 @@
 	IssmDouble  rho_ice         = element->FindParam(MaterialsRhoIceEnum);
 	IssmDouble  rho_water       = element->FindParam(MaterialsRhoFreshwaterEnum);
-	Input* geothermalflux_input = element->GetInput(BasalforcingsGeothermalfluxEnum);_assert_(geothermalflux_input);
-	Input* head_input           = element->GetInput(HydrologyHeadEnum);              _assert_(head_input);
-	Input* gap_input            = element->GetInput(HydrologyGapHeightEnum);         _assert_(gap_input);
-	Input* thickness_input      = element->GetInput(ThicknessEnum);                  _assert_(thickness_input);
-	Input* base_input           = element->GetInput(BaseEnum);                       _assert_(base_input);
-	Input* B_input              = element->GetInput(MaterialsRheologyBEnum);         _assert_(B_input);
-	Input* n_input              = element->GetInput(MaterialsRheologyNEnum);         _assert_(n_input);
-	Input* englacial_input      = element->GetInput(HydrologyEnglacialInputEnum);    _assert_(englacial_input);
-	Input* vx_input             = element->GetInput(VxEnum);                         _assert_(vx_input);
-	Input* vy_input             = element->GetInput(VyEnum);                         _assert_(vy_input);
-	Input* lr_input             = element->GetInput(HydrologyBumpSpacingEnum);       _assert_(lr_input);
-	Input* br_input             = element->GetInput(HydrologyBumpHeightEnum);        _assert_(br_input);
+	Input2* geothermalflux_input = element->GetInput2(BasalforcingsGeothermalfluxEnum);_assert_(geothermalflux_input);
+	Input2* head_input           = element->GetInput2(HydrologyHeadEnum);              _assert_(head_input);
+	Input2* gap_input            = element->GetInput2(HydrologyGapHeightEnum);         _assert_(gap_input);
+	Input2* thickness_input      = element->GetInput2(ThicknessEnum);                  _assert_(thickness_input);
+	Input2* base_input           = element->GetInput2(BaseEnum);                       _assert_(base_input);
+	Input2* B_input              = element->GetInput2(MaterialsRheologyBEnum);         _assert_(B_input);
+	Input2* n_input              = element->GetInput2(MaterialsRheologyNEnum);         _assert_(n_input);
+	Input2* englacial_input      = element->GetInput2(HydrologyEnglacialInputEnum);    _assert_(englacial_input);
+	Input2* vx_input             = element->GetInput2(VxEnum);                         _assert_(vx_input);
+	Input2* vy_input             = element->GetInput2(VyEnum);                         _assert_(vy_input);
+	Input2* lr_input             = element->GetInput2(HydrologyBumpSpacingEnum);       _assert_(lr_input);
+	Input2* br_input             = element->GetInput2(HydrologyBumpHeightEnum);        _assert_(br_input);
 
 	/*Get conductivity from inputs*/
@@ -578,13 +582,13 @@
 
 	/*Add new gap as an input*/
-	element->AddInput(HydrologyGapHeightEnum,&newgap,P0Enum);
+	element->AddInput2(HydrologyGapHeightEnum,&newgap,P0Enum);
 
 	/*Divide by connectivity, add basal flux as an input*/
 	q = q/totalweights;
-	element->AddInput(HydrologyBasalFluxEnum,&q,P0Enum);
+	element->AddInput2(HydrologyBasalFluxEnum,&q,P0Enum);
 
 	/* Divide by connectivity, add degree of channelization as an input */
 	channelization = channelization/totalweights;
-	element->AddInput(DegreeOfChannelizationEnum,&channelization,P0Enum);
+	element->AddInput2(DegreeOfChannelizationEnum,&channelization,P0Enum);
 
 	/*Clean up and return*/
Index: /issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp	(revision 24335)
@@ -36,5 +36,5 @@
 	return 1;
 }/*}}}*/
-void HydrologyShreveAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void HydrologyShreveAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Fetch data needed: */
@@ -50,23 +50,23 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.surface",SurfaceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
-	}
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.watercolumn",WatercolumnEnum);
-
-	elements->InputDuplicate(WatercolumnEnum,WaterColumnOldEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+	}
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.watercolumn",WatercolumnEnum);
+
+	inputs2->DuplicateInput(WatercolumnEnum,WaterColumnOldEnum);
 }/*}}}*/
 void HydrologyShreveAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
@@ -109,9 +109,9 @@
 	IssmDouble  g         = element->FindParam(ConstantsGEnum);
 	IssmDouble  mu_water  = element->FindParam(MaterialsMuWaterEnum);
-	Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum); _assert_(surfaceslopex_input);
-	Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum); _assert_(surfaceslopey_input);
-	Input* bedslopex_input     = element->GetInput(BedSlopeXEnum);     _assert_(bedslopex_input);
-	Input* bedslopey_input     = element->GetInput(BedSlopeYEnum);     _assert_(bedslopey_input);
-	Input* watercolumn_input   = element->GetInput(WatercolumnEnum);   _assert_(watercolumn_input);
+	Input2* surfaceslopex_input = element->GetInput2(SurfaceSlopeXEnum); _assert_(surfaceslopex_input);
+	Input2* surfaceslopey_input = element->GetInput2(SurfaceSlopeYEnum); _assert_(surfaceslopey_input);
+	Input2* bedslopex_input     = element->GetInput2(BedSlopeXEnum);     _assert_(bedslopex_input);
+	Input2* bedslopey_input     = element->GetInput2(BedSlopeYEnum);     _assert_(bedslopey_input);
+	Input2* watercolumn_input   = element->GetInput2(WatercolumnEnum);   _assert_(watercolumn_input);
 
 	/*Fetch number of vertices and allocate output*/
@@ -138,6 +138,6 @@
 
 	/*Add to inputs*/
-	element->AddInput(HydrologyWaterVxEnum,vx,P1Enum);
-	element->AddInput(HydrologyWaterVyEnum,vy,P1Enum);
+	element->AddInput2(HydrologyWaterVxEnum,vx,P1Enum);
+	element->AddInput2(HydrologyWaterVyEnum,vy,P1Enum);
 	xDelete<IssmDouble>(vx);
 	xDelete<IssmDouble>(vy);
@@ -172,6 +172,6 @@
 	element->FindParam(&dt,TimesteppingTimeStepEnum);
 	element->FindParam(&diffusivity,HydrologyshreveStabilizationEnum);
-	Input* vx_input=element->GetInput(HydrologyWaterVxEnum); _assert_(vx_input);
-	Input* vy_input=element->GetInput(HydrologyWaterVyEnum); _assert_(vy_input);
+	Input2* vx_input=element->GetInput2(HydrologyWaterVxEnum); _assert_(vx_input);
+	Input2* vy_input=element->GetInput2(HydrologyWaterVyEnum); _assert_(vy_input);
 	h = element->CharacteristicLength();
 
@@ -257,6 +257,6 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->FindParam(&dt,TimesteppingTimeStepEnum);
-	Input* mb_input   = element->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(mb_input);
-	Input* oldw_input = element->GetInput(WaterColumnOldEnum);                      _assert_(oldw_input);
+	Input2* mb_input   = element->GetInput2(BasalforcingsGroundediceMeltingRateEnum); _assert_(mb_input);
+	Input2* oldw_input = element->GetInput2(WaterColumnOldEnum);                      _assert_(oldw_input);
 
 	/*Initialize mb_correction to 0, do not forget!:*/
@@ -368,5 +368,5 @@
 
 	/*Add input to the element: */
-	element->AddInput(WatercolumnEnum,values,element->GetElementType());
+	element->AddInput2(WatercolumnEnum,values,element->GetElementType());
 
 	/*Free ressources:*/
Index: /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp	(revision 24335)
@@ -28,5 +28,5 @@
 	return 1;
 }/*}}}*/
-void L2ProjectionBaseAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void L2ProjectionBaseAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Update elements: */
@@ -35,16 +35,16 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
-   iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.surface",SurfaceEnum);
+   iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum & iomodel->domaintype!=Domain3DsurfaceEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
 	}
 }/*}}}*/
@@ -148,6 +148,6 @@
 	int         input_enum;
 	IssmDouble  Jdet,value,slopes[2];
-	Input      *input     = NULL;
-	Input      *input2    = NULL;
+	Input2     *input     = NULL;
+	Input2     *input2    = NULL;
 	IssmDouble *xyz_list  = NULL;
 
@@ -163,13 +163,13 @@
 	basalelement->FindParam(&input_enum,InputToL2ProjectEnum);
 	switch(input_enum){
-		case SurfaceSlopeXEnum: input2 = basalelement->GetInput(SurfaceEnum); _assert_(input2); break;
-		case SurfaceSlopeYEnum: input2 = basalelement->GetInput(SurfaceEnum); _assert_(input2); break;
-		case BedSlopeXEnum:     input2 = basalelement->GetInput(BaseEnum);     _assert_(input2); break;
-		case BedSlopeYEnum:     input2 = basalelement->GetInput(BaseEnum);     _assert_(input2); break;
-		case BaseSlopeXEnum:    input2 = basalelement->GetInput(BaseEnum);    _assert_(input2); break;
-		case BaseSlopeYEnum:    input2 = basalelement->GetInput(BaseEnum);    _assert_(input2); break;
-		case LevelsetfunctionSlopeXEnum: input2 = basalelement->GetInput(MaskIceLevelsetEnum);     _assert_(input2); break;
-		case LevelsetfunctionSlopeYEnum: input2 = basalelement->GetInput(MaskIceLevelsetEnum);     _assert_(input2); break;
-		default: input = element->GetInput(input_enum);
+		case SurfaceSlopeXEnum: input2 = basalelement->GetInput2(SurfaceEnum); _assert_(input2); break;
+		case SurfaceSlopeYEnum: input2 = basalelement->GetInput2(SurfaceEnum); _assert_(input2); break;
+		case BedSlopeXEnum:     input2 = basalelement->GetInput2(BaseEnum);     _assert_(input2); break;
+		case BedSlopeYEnum:     input2 = basalelement->GetInput2(BaseEnum);     _assert_(input2); break;
+		case BaseSlopeXEnum:    input2 = basalelement->GetInput2(BaseEnum);    _assert_(input2); break;
+		case BaseSlopeYEnum:    input2 = basalelement->GetInput2(BaseEnum);    _assert_(input2); break;
+		case LevelsetfunctionSlopeXEnum: input2 = basalelement->GetInput2(MaskIceLevelsetEnum);     _assert_(input2); break;
+		case LevelsetfunctionSlopeYEnum: input2 = basalelement->GetInput2(MaskIceLevelsetEnum);     _assert_(input2); break;
+		default: input = element->GetInput2(input_enum);
 	}
 
Index: /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp	(revision 24335)
@@ -37,5 +37,5 @@
 	return 1;
 }/*}}}*/
-void L2ProjectionEPLAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void L2ProjectionEPLAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	bool   isefficientlayer;
@@ -55,14 +55,14 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.initialization.epl_head",EplHeadSubstepEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.epl_head",EplHeadSubstepEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
 	}
 }/*}}}*/
@@ -105,6 +105,5 @@
 	}
 
-	Input* active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
-	active_element_input->GetInputValue(&active_element);
+	basalelement->GetInput2Value(&active_element,HydrologydcMaskEplactiveEltEnum);
 
 	/* Check that all nodes are active, else return empty matrix */
@@ -173,6 +172,5 @@
 	}
 
-	Input* active_element_input = basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
-	active_element_input->GetInputValue(&active_element);
+	basalelement->GetInput2Value(&active_element,HydrologydcMaskEplactiveEltEnum);
 
 	/*Check that all nodes are active, else return empty matrix*/
@@ -188,5 +186,5 @@
 	int         input_enum,index;
 	IssmDouble  Jdet,slopes[2];
-	Input      *input     = NULL;
+	Input2     *input     = NULL;
 	IssmDouble *xyz_list  = NULL;
 
@@ -202,6 +200,6 @@
 	basalelement->FindParam(&input_enum,InputToL2ProjectEnum);
 	switch(input_enum){
-		case EplHeadSlopeXEnum: input = basalelement->GetInput(EplHeadSubstepEnum); index = 0; _assert_(input); break;
-		case EplHeadSlopeYEnum: input = basalelement->GetInput(EplHeadSubstepEnum); index = 1; _assert_(input); break;
+		case EplHeadSlopeXEnum: input = basalelement->GetInput2(EplHeadSubstepEnum); index = 0; _assert_(input); break;
+		case EplHeadSlopeYEnum: input = basalelement->GetInput2(EplHeadSubstepEnum); index = 1; _assert_(input); break;
 		default: _error_("not implemented");
 	}
Index: /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 24335)
@@ -32,5 +32,5 @@
 }
 /*}}}*/
-void LevelsetAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void LevelsetAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Finite element type*/
@@ -43,12 +43,12 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum);
 
 	/*Get moving front parameters*/
@@ -57,26 +57,26 @@
 	switch(calvinglaw){
 		case DefaultCalvingEnum:
-			iomodel->FetchDataToInput(elements,"md.calving.calvingrate",CalvingCalvingrateEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.calving.calvingrate",CalvingCalvingrateEnum);
 			break;
 		case CalvingLevermannEnum:
-			iomodel->FetchDataToInput(elements,"md.calving.coeff",CalvinglevermannCoeffEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.calving.coeff",CalvinglevermannCoeffEnum);
 			break;
 		case CalvingVonmisesEnum:
-			iomodel->FetchDataToInput(elements,"md.calving.stress_threshold_groundedice",CalvingStressThresholdGroundediceEnum);
-			iomodel->FetchDataToInput(elements,"md.calving.stress_threshold_floatingice",CalvingStressThresholdFloatingiceEnum);
-			iomodel->FetchDataToInput(elements,"md.geometry.bed",BedEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.calving.stress_threshold_groundedice",CalvingStressThresholdGroundediceEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.calving.stress_threshold_floatingice",CalvingStressThresholdFloatingiceEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.geometry.bed",BedEnum);
 			break;
 		case CalvingMinthicknessEnum:
-			iomodel->FetchDataToInput(elements,"md.geometry.bed",BedEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.geometry.bed",BedEnum);
 			break;
 		case CalvingHabEnum:
-			iomodel->FetchDataToInput(elements,"md.calving.flotation_fraction",CalvingHabFractionEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.calving.flotation_fraction",CalvingHabFractionEnum);
 			break;
 		case CalvingCrevasseDepthEnum:
-			iomodel->FetchDataToInput(elements,"md.calving.water_height",WaterheightEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.calving.water_height",WaterheightEnum);
 			break;
 		case CalvingDev2Enum:
-			iomodel->FetchDataToInput(elements,"md.calving.stress_threshold_groundedice",CalvingStressThresholdGroundediceEnum);
-			iomodel->FetchDataToInput(elements,"md.calving.stress_threshold_floatingice",CalvingStressThresholdFloatingiceEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.calving.stress_threshold_groundedice",CalvingStressThresholdGroundediceEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.calving.stress_threshold_floatingice",CalvingStressThresholdFloatingiceEnum);
 			break;
 		default:
@@ -89,10 +89,10 @@
 	switch(melt_parameterization){
 		case FrontalForcingsDefaultEnum:
-			iomodel->FetchDataToInput(elements,"md.frontalforcings.meltingrate",CalvingMeltingrateEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.frontalforcings.meltingrate",CalvingMeltingrateEnum);
 			break;
 		case FrontalForcingsRignotEnum:
-			iomodel->FetchDataToInput(elements,"md.frontalforcings.basin",FrontalForcingsBasinIdEnum);
-			iomodel->FetchDataToInput(elements,"md.frontalforcings.subglacial_discharge",FrontalForcingsSubglacialDischargeEnum);
-			iomodel->FetchDataToInput(elements,"md.frontalforcings.thermalforcing",FrontalForcingsThermalForcingEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.frontalforcings.basin",FrontalForcingsBasinIdEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.frontalforcings.subglacial_discharge",FrontalForcingsSubglacialDischargeEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.frontalforcings.thermalforcing",FrontalForcingsThermalForcingEnum);
 			break;
 		default:
@@ -226,28 +226,28 @@
 	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
 	basalelement->FindParam(&calvingmax,CalvingMaxEnum);
-	Input* vx_input           = NULL;
-	Input* vy_input           = NULL;
-	Input* calvingratex_input = NULL;
-	Input* calvingratey_input = NULL;
-	Input* lsf_slopex_input   = NULL;
-	Input* lsf_slopey_input   = NULL;
-	Input* calvingrate_input  = NULL;
-	Input* meltingrate_input  = NULL;
-	Input* gr_input           = NULL;
+	Input2* vx_input           = NULL;
+	Input2* vy_input           = NULL;
+	Input2* calvingratex_input = NULL;
+	Input2* calvingratey_input = NULL;
+	Input2* lsf_slopex_input   = NULL;
+	Input2* lsf_slopey_input   = NULL;
+	Input2* calvingrate_input  = NULL;
+	Input2* meltingrate_input  = NULL;
+	Input2* gr_input           = NULL;
 
 	/*Load velocities*/
 	switch(domaintype){
 		case Domain2DverticalEnum:
-			vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
+			vx_input=basalelement->GetInput2(VxEnum); _assert_(vx_input);
 			break;
 		case Domain2DhorizontalEnum:
-			vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
-			vy_input=basalelement->GetInput(VyEnum); _assert_(vy_input);
-			gr_input=basalelement->GetInput(MaskGroundediceLevelsetEnum); _assert_(gr_input);
+			vx_input=basalelement->GetInput2(VxEnum); _assert_(vx_input);
+			vy_input=basalelement->GetInput2(VyEnum); _assert_(vy_input);
+			gr_input=basalelement->GetInput2(MaskGroundediceLevelsetEnum); _assert_(gr_input);
 			break;
 		case Domain3DEnum:
-			vx_input=basalelement->GetInput(VxAverageEnum); _assert_(vx_input);
-			vy_input=basalelement->GetInput(VyAverageEnum); _assert_(vy_input);
-			gr_input=basalelement->GetInput(MaskGroundediceLevelsetEnum); _assert_(gr_input);
+			vx_input=basalelement->GetInput2(VxAverageEnum); _assert_(vx_input);
+			vy_input=basalelement->GetInput2(VyAverageEnum); _assert_(vy_input);
+			gr_input=basalelement->GetInput2(MaskGroundediceLevelsetEnum); _assert_(gr_input);
 			break;
 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
@@ -258,47 +258,47 @@
 		case DefaultCalvingEnum:
 		case CalvingVonmisesEnum:
-			lsf_slopex_input  = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
-			calvingrate_input = basalelement->GetInput(CalvingCalvingrateEnum);     _assert_(calvingrate_input);
-			meltingrate_input = basalelement->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
+			lsf_slopex_input  = basalelement->GetInput2(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+			if(dim==2) lsf_slopey_input  = basalelement->GetInput2(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+			calvingrate_input = basalelement->GetInput2(CalvingCalvingrateEnum);     _assert_(calvingrate_input);
+			meltingrate_input = basalelement->GetInput2(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
 			break;
 		case CalvingLevermannEnum:
 			switch(domaintype){
 				case Domain2DverticalEnum:
-					calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+					calvingratex_input=basalelement->GetInput2(CalvingratexEnum); _assert_(calvingratex_input);
 					break;
 				case Domain2DhorizontalEnum:
-					calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-					calvingratey_input=basalelement->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
+					calvingratex_input=basalelement->GetInput2(CalvingratexEnum); _assert_(calvingratex_input);
+					calvingratey_input=basalelement->GetInput2(CalvingrateyEnum); _assert_(calvingratey_input);
 					break;
 				case Domain3DEnum:
-					calvingratex_input=basalelement->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
-					calvingratey_input=basalelement->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
+					calvingratex_input=basalelement->GetInput2(CalvingratexAverageEnum); _assert_(calvingratex_input);
+					calvingratey_input=basalelement->GetInput2(CalvingrateyAverageEnum); _assert_(calvingratey_input);
 					break;
 				default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
 			}
-			meltingrate_input = basalelement->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
+			meltingrate_input = basalelement->GetInput2(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
 			break;
 		case CalvingMinthicknessEnum:
-			lsf_slopex_input  = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
-			meltingrate_input = basalelement->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
+			lsf_slopex_input  = basalelement->GetInput2(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+			if(dim==2) lsf_slopey_input  = basalelement->GetInput2(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+			meltingrate_input = basalelement->GetInput2(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
 			break;
 		case CalvingHabEnum:
-			lsf_slopex_input  = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
-			meltingrate_input = basalelement->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
+			lsf_slopex_input  = basalelement->GetInput2(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+			if(dim==2) lsf_slopey_input  = basalelement->GetInput2(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+			meltingrate_input = basalelement->GetInput2(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
 			break;
 		case CalvingCrevasseDepthEnum:
-			lsf_slopex_input  = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
-			meltingrate_input = basalelement->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
+			lsf_slopex_input  = basalelement->GetInput2(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+			if(dim==2) lsf_slopey_input  = basalelement->GetInput2(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+			meltingrate_input = basalelement->GetInput2(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
 			break;
 		case CalvingDev2Enum:
 			basalelement->FindParam(&calvinghaf,CalvingHeightAboveFloatationEnum);
-			lsf_slopex_input  = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
-			if(dim==2) lsf_slopey_input  = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
-			calvingrate_input = basalelement->GetInput(CalvingCalvingrateEnum);     _assert_(calvingrate_input);
-			meltingrate_input = basalelement->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
+			lsf_slopex_input  = basalelement->GetInput2(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+			if(dim==2) lsf_slopey_input  = basalelement->GetInput2(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+			calvingrate_input = basalelement->GetInput2(CalvingCalvingrateEnum);     _assert_(calvingrate_input);
+			meltingrate_input = basalelement->GetInput2(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
 			break;
 		default:
@@ -571,5 +571,5 @@
 		/*Retrieve all inputs and parameters*/
 		basalelement->GetVerticesCoordinates(&xyz_list);
-		Input* levelset_input     = basalelement->GetInput(MaskIceLevelsetEnum);                    _assert_(levelset_input);
+		Input2* levelset_input     = basalelement->GetInput2(MaskIceLevelsetEnum);                    _assert_(levelset_input);
 
 		/* Start  looping on the number of gaussian points: */
@@ -718,7 +718,7 @@
 			int      numnodes = element->GetNumberOfNodes();
 			Gauss*   gauss    = element->NewGauss();
-			Input*   H_input  = element->GetInput(ThicknessEnum); _assert_(H_input);
-			Input*   b_input = element->GetInput(BedEnum); _assert_(b_input);
-			Input*   sl_input = element->GetInput(SealevelEnum); _assert_(sl_input);
+			Input2*   H_input  = element->GetInput2(ThicknessEnum); _assert_(H_input);
+			Input2*   b_input = element->GetInput2(BedEnum); _assert_(b_input);
+			Input2*   sl_input = element->GetInput2(SealevelEnum); _assert_(sl_input);
 
 			/*Potentially constrain nodes of this element*/
@@ -746,5 +746,5 @@
 
 		/*Get the fraction of the flotation thickness at the terminus*/
-		femmodel->elements->InputDuplicate(MaskIceLevelsetEnum, DistanceToCalvingfrontEnum);
+		InputDuplicatex(femmodel,MaskIceLevelsetEnum,DistanceToCalvingfrontEnum);
 		femmodel->DistanceToFieldValue(MaskIceLevelsetEnum,0,DistanceToCalvingfrontEnum);
 
@@ -758,8 +758,8 @@
 			int      numnodes           = element->GetNumberOfNodes();
 			Gauss*   gauss              = element->NewGauss();
-			Input*   H_input            = element->GetInput(ThicknessEnum); _assert_(H_input);
-			Input*   bed_input          = element->GetInput(BedEnum); _assert_(bed_input);
-			Input*   hab_fraction_input = element->GetInput(CalvingHabFractionEnum); _assert_(hab_fraction_input);
-			Input*   ls_input           = element->GetInput(DistanceToCalvingfrontEnum); _assert_(ls_input);
+			Input2*   H_input            = element->GetInput2(ThicknessEnum); _assert_(H_input);
+			Input2*   bed_input          = element->GetInput2(BedEnum); _assert_(bed_input);
+			Input2*   hab_fraction_input = element->GetInput2(CalvingHabFractionEnum); _assert_(hab_fraction_input);
+			Input2*   ls_input           = element->GetInput2(DistanceToCalvingfrontEnum); _assert_(ls_input);
 
 			/*Potentially constrain nodes of this element*/
@@ -793,5 +793,5 @@
 
 		/*Get the DistanceToCalvingfront*/
-		femmodel->elements->InputDuplicate(MaskIceLevelsetEnum,DistanceToCalvingfrontEnum);
+		InputDuplicatex(femmodel,MaskIceLevelsetEnum,DistanceToCalvingfrontEnum);
 		femmodel->DistanceToFieldValue(MaskIceLevelsetEnum,0,DistanceToCalvingfrontEnum);
 
@@ -803,9 +803,9 @@
 			int      numnodes              = element->GetNumberOfNodes();
 			Gauss*   gauss                 = element->NewGauss();
-			Input*   crevassedepth_input   = element->GetInput(CrevasseDepthEnum); _assert_(crevassedepth_input);
-			Input*   bed_input             = element->GetInput(BedEnum); _assert_(bed_input);
-			Input*   surface_crevasse_input = element->GetInput(SurfaceCrevasseEnum); _assert_(surface_crevasse_input);
-			Input*   thickness_input       = element->GetInput(ThicknessEnum); _assert_(thickness_input);
-			Input*   surface_input         = element->GetInput(SurfaceEnum); _assert_(surface_input);
+			Input2*   crevassedepth_input   = element->GetInput2(CrevasseDepthEnum); _assert_(crevassedepth_input);
+			Input2*   bed_input             = element->GetInput2(BedEnum); _assert_(bed_input);
+			Input2*   surface_crevasse_input = element->GetInput2(SurfaceCrevasseEnum); _assert_(surface_crevasse_input);
+			Input2*   thickness_input       = element->GetInput2(ThicknessEnum); _assert_(thickness_input);
+			Input2*   surface_input         = element->GetInput2(SurfaceEnum); _assert_(surface_input);
 
 			/*First, look at ice front and figure out if any of the nodes will be calved*/
@@ -841,10 +841,10 @@
 				int      numnodes               = element->GetNumberOfNodes();
 				Gauss*   gauss                  = element->NewGauss();
-				Input*   levelset_input         = element->GetInput(DistanceToCalvingfrontEnum); _assert_(levelset_input);
-				Input*   crevassedepth_input    = element->GetInput(CrevasseDepthEnum); _assert_(crevassedepth_input);
-				Input*   bed_input              = element->GetInput(BedEnum); _assert_(bed_input);
-				Input*   surface_crevasse_input = element->GetInput(SurfaceCrevasseEnum); _assert_(surface_crevasse_input);
-				Input*   thickness_input        = element->GetInput(ThicknessEnum); _assert_(thickness_input);
-				Input*   surface_input          = element->GetInput(SurfaceEnum); _assert_(surface_input);
+				Input2*   levelset_input         = element->GetInput2(DistanceToCalvingfrontEnum); _assert_(levelset_input);
+				Input2*   crevassedepth_input    = element->GetInput2(CrevasseDepthEnum); _assert_(crevassedepth_input);
+				Input2*   bed_input              = element->GetInput2(BedEnum); _assert_(bed_input);
+				Input2*   surface_crevasse_input = element->GetInput2(SurfaceCrevasseEnum); _assert_(surface_crevasse_input);
+				Input2*   thickness_input        = element->GetInput2(ThicknessEnum); _assert_(thickness_input);
+				Input2*   surface_input          = element->GetInput2(SurfaceEnum); _assert_(surface_input);
 
 				/*Is this element connected to a node that should be calved*/
Index: /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/LoveAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LoveAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/LoveAnalysis.cpp	(revision 24335)
@@ -15,5 +15,5 @@
 	_error_("not needed!");
 }/*}}}*/
-void LoveAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void LoveAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/LoveAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LoveAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/LoveAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 24335)
@@ -111,5 +111,5 @@
 	return 1;
 }/*}}}*/
-void MasstransportAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void MasstransportAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	int    stabilization,finiteelement;
@@ -140,23 +140,23 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum);
-	if(isgroundingline) 	iomodel->FetchDataToInput(elements,"md.geometry.bed",BedEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.surface",SurfaceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum);
+	if(isgroundingline) 	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.bed",BedEnum);
 	/*Initialize cumdeltalthickness input*/
-	InputUpdateFromConstantx(elements,0.,SealevelriseCumDeltathicknessEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,SealevelriseCumDeltathicknessEnum);
 	/*Initialize ThicknessResidual input*/
-	InputUpdateFromConstantx(elements,0.,ThicknessResidualEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,ThicknessResidualEnum);
 
 	/*Get what we need for ocean-induced basal melting*/
@@ -165,5 +165,5 @@
 	switch(basalforcing_model){
 		case FloatingMeltRateEnum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.floatingice_melting_rate",BasalforcingsFloatingiceMeltingRateEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.floatingice_melting_rate",BasalforcingsFloatingiceMeltingRateEnum);
 			break;
 		case LinearFloatingMeltRateEnum:
@@ -174,14 +174,14 @@
 			break;
 		case SpatialLinearFloatingMeltRateEnum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsDeepwaterMeltingRateEnum);
-			iomodel->FetchDataToInput(elements,"md.basalforcings.deepwater_elevation",BasalforcingsDeepwaterElevationEnum);
-			iomodel->FetchDataToInput(elements,"md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsDeepwaterMeltingRateEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.deepwater_elevation",BasalforcingsDeepwaterElevationEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum);
 			break;
 		case BasalforcingsPicoEnum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.basin_id",BasalforcingsPicoBasinIdEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.basin_id",BasalforcingsPicoBasinIdEnum);
 			break;
 		case BasalforcingsIsmip6Enum:{
-			iomodel->FetchDataToInput(elements,"md.basalforcings.basin_id",BasalforcingsIsmip6BasinIdEnum);
-			iomodel->FetchDataToInput(elements,"md.basalforcings.melt_anomaly",BasalforcingsIsmip6MeltAnomalyEnum,0.);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.basin_id",BasalforcingsIsmip6BasinIdEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.melt_anomaly",BasalforcingsIsmip6MeltAnomalyEnum,0.);
 			IssmDouble** array3d = NULL; int* Ms = NULL; int* Ns = NULL; int K;
 			iomodel->FetchData(&array3d,&Ms,&Ns,&K,"md.basalforcings.tf");
@@ -191,5 +191,5 @@
 				if(iomodel->domaintype!=Domain2DhorizontalEnum && !element->IsOnBase()) continue;
 				for(int kk=0;kk<K;kk++){
-					element->DatasetInputAdd(BasalforcingsIsmip6TfEnum,array3d[kk],iomodel,Ms[kk],Ns[kk],1,BasalforcingsIsmip6TfEnum,7,kk);
+					element->DatasetInputAdd(BasalforcingsIsmip6TfEnum,array3d[kk],inputs2,iomodel,Ms[kk],Ns[kk],1,BasalforcingsIsmip6TfEnum,7,kk);
 				}
 			}
@@ -200,6 +200,6 @@
 			break;
 		case BeckmannGoosseFloatingMeltRateEnum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
-			iomodel->FetchDataToInput(elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
 			break;
 		default:
@@ -208,16 +208,16 @@
 
 	if(!issmb){
-		iomodel->FetchDataToInput(elements,"md.smb.mass_balance",SmbMassBalanceEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.smb.mass_balance",SmbMassBalanceEnum);
 	}
 	if(stabilization==3){
-		iomodel->FetchDataToInput(elements,"md.masstransport.spcthickness",MasstransportSpcthicknessEnum); //for DG, we need the spc in the element
+		iomodel->FetchDataToInput(inputs2,elements,"md.masstransport.spcthickness",MasstransportSpcthicknessEnum); //for DG, we need the spc in the element
 	}
 	if(stabilization==4){
-		iomodel->FetchDataToInput(elements,"md.masstransport.spcthickness",MasstransportSpcthicknessEnum); //for FCT, we need the spc in the element (penlaties)
+		iomodel->FetchDataToInput(inputs2,elements,"md.masstransport.spcthickness",MasstransportSpcthicknessEnum); //for FCT, we need the spc in the element (penlaties)
 	}
 
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
 	}
 
@@ -318,8 +318,8 @@
 	element->FindParam(&domaintype,DomainTypeEnum);
 	element->FindParam(&stabilization,MasstransportStabilizationEnum);
-	Input* vxaverage_input=element->GetInput(VxAverageEnum); _assert_(vxaverage_input);
-	Input* vyaverage_input=NULL;
+	Input2* vxaverage_input=element->GetInput2(VxAverageEnum); _assert_(vxaverage_input);
+	Input2* vyaverage_input=NULL;
 	if(dim==2){
-		vyaverage_input=element->GetInput(VyAverageEnum); _assert_(vyaverage_input);
+		vyaverage_input=element->GetInput2(VyAverageEnum); _assert_(vyaverage_input);
 	}
 
@@ -507,6 +507,6 @@
 	element->FindParam(&dt,TimesteppingTimeStepEnum);
 	element->FindParam(&domaintype,DomainTypeEnum);
-	Input* vxaverage_input=element->GetInput(VxAverageEnum); _assert_(vxaverage_input);
-	Input* vyaverage_input=element->GetInput(VyAverageEnum); _assert_(vyaverage_input);
+	Input2* vxaverage_input=element->GetInput2(VxAverageEnum); _assert_(vxaverage_input);
+	Input2* vyaverage_input=element->GetInput2(VyAverageEnum); _assert_(vyaverage_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -617,11 +617,16 @@
 	element->FindParam(&dt,TimesteppingTimeStepEnum);
 	element->FindParam(&stabilization,MasstransportStabilizationEnum);
-	Input* gmb_input        = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);  _assert_(gmb_input);
-	Input* fmb_input        = element->GetInput(BasalforcingsFloatingiceMeltingRateEnum);  _assert_(fmb_input);
-	Input* gllevelset_input = element->GetInput(MaskGroundediceLevelsetEnum);              _assert_(gllevelset_input);
-	Input* ms_input         = element->GetInput(SmbMassBalanceEnum);                       _assert_(ms_input);
-	Input* thickness_input  = element->GetInput(ThicknessEnum);                            _assert_(thickness_input);
-	Input* vxaverage_input  = element->GetInput(VxAverageEnum);										_assert_(vxaverage_input);
-	Input* vyaverage_input  = element->GetInput(VyAverageEnum);										_assert_(vyaverage_input);
+	Input2* gmb_input        = element->GetInput2(BasalforcingsGroundediceMeltingRateEnum);  _assert_(gmb_input);
+	Input2* fmb_input        = element->GetInput2(BasalforcingsFloatingiceMeltingRateEnum);  _assert_(fmb_input);
+	Input2* gllevelset_input = element->GetInput2(MaskGroundediceLevelsetEnum);              _assert_(gllevelset_input);
+	Input2* ms_input         = element->GetInput2(SmbMassBalanceEnum);                       _assert_(ms_input);
+	Input2* thickness_input  = element->GetInput2(ThicknessEnum);                            _assert_(thickness_input);
+	Input2* vxaverage_input  = element->GetInput2(VxAverageEnum);										_assert_(vxaverage_input);
+	Input2* vyaverage_input  = element->GetInput2(VyAverageEnum);										_assert_(vyaverage_input);
+
+//	if(element->Id()==9){
+//		gmb_input->Echo();
+//		_error_("S");
+//	}
 
 	h=element->CharacteristicLength();
@@ -726,9 +731,9 @@
 	element->FindParam(&dt,TimesteppingTimeStepEnum);
 	element->FindParam(&melt_style,GroundinglineMeltInterpolationEnum);
-	Input* gmb_input        = element->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(gmb_input);
-	Input* fmb_input        = element->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(fmb_input);
-	Input* ms_input         = element->GetInput(SmbMassBalanceEnum);                      _assert_(ms_input);
-	Input* gllevelset_input = element->GetInput(MaskGroundediceLevelsetEnum);             _assert_(gllevelset_input);
-	Input* thickness_input  = element->GetInput(ThicknessEnum);                           _assert_(thickness_input);
+	Input2* gmb_input        = element->GetInput2(BasalforcingsGroundediceMeltingRateEnum); _assert_(gmb_input);
+	Input2* fmb_input        = element->GetInput2(BasalforcingsFloatingiceMeltingRateEnum); _assert_(fmb_input);
+	Input2* ms_input         = element->GetInput2(SmbMassBalanceEnum);                      _assert_(ms_input);
+	Input2* gllevelset_input = element->GetInput2(MaskGroundediceLevelsetEnum);             _assert_(gllevelset_input);
+	Input2* thickness_input  = element->GetInput2(ThicknessEnum);                           _assert_(thickness_input);
 
    /*Recover portion of element that is grounded*/
@@ -872,6 +877,6 @@
 		}
 	}
-	element->AddBasalInput(ThicknessEnum,newthickness,element->GetElementType());
-	element->AddBasalInput(ThicknessResidualEnum,thicknessresidual,element->GetElementType());
+	element->AddBasalInput2(ThicknessEnum,newthickness,element->GetElementType());
+	element->AddBasalInput2(ThicknessResidualEnum,thicknessresidual,element->GetElementType());
 	
 	xDelete<int>(doflist);
@@ -905,9 +910,9 @@
 	basalelement->GetInputListOnVertices(&newthickness[0],ThicknessEnum);
 	basalelement->GetInputListOnVertices(&oldthickness[0],ThicknessOldEnum);
-	basalelement->GetInputListOnVertices(&oldbase[0],BaseEnum);
-	basalelement->GetInputListOnVertices(&oldsurface[0],SurfaceEnum);
+	basalelement->GetInputListOnVertices(&oldbase[0],BaseOldEnum);
+	basalelement->GetInputListOnVertices(&oldsurface[0],SurfaceOldEnum);
 	basalelement->GetInputListOnVertices(&phi[0],MaskGroundediceLevelsetEnum);
 	basalelement->GetInputListOnVertices(&sealevel[0],SealevelEnum);
-	basalelement->GetInputListOnVertices(&cumdeltathickness[0],SealevelriseCumDeltathicknessEnum);
+	basalelement->GetInputListOnVertices(&cumdeltathickness[0],SealevelriseCumDeltathicknessOldEnum);
 
 	/*Do we do grounding line migration?*/
@@ -953,8 +958,8 @@
 
 	/*Add input to the element: */
-	element->AddBasalInput(SurfaceEnum,newsurface,P1Enum);
-	element->AddBasalInput(BaseEnum,newbase,P1Enum);
-	element->AddBasalInput(SealevelriseCumDeltathicknessEnum,cumdeltathickness,P1Enum);
-	element->AddBasalInput(SealevelriseDeltathicknessEnum,deltathickness,P1Enum);
+	element->AddBasalInput2(SurfaceEnum,newsurface,P1Enum);
+	element->AddBasalInput2(BaseEnum,newbase,P1Enum);
+	element->AddBasalInput2(SealevelriseCumDeltathicknessEnum,cumdeltathickness,P1Enum);
+	element->AddBasalInput2(SealevelriseDeltathicknessEnum,deltathickness,P1Enum);
 
 	/*Free ressources:*/
@@ -1000,6 +1005,6 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* vxaverage_input=element->GetInput(VxEnum); _assert_(vxaverage_input);
-	Input* vyaverage_input=element->GetInput(VyEnum); _assert_(vyaverage_input);
+	Input2* vxaverage_input=element->GetInput2(VxEnum); _assert_(vxaverage_input);
+	Input2* vyaverage_input=element->GetInput2(VyEnum); _assert_(vyaverage_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp	(revision 24335)
@@ -37,5 +37,5 @@
 	return 1;
 }/*}}}*/
-void MeltingAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void MeltingAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Now, is the model 3d? otherwise, do nothing: */
@@ -47,5 +47,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
@@ -53,14 +53,14 @@
 
 	/*Create inputs: */
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.surface",SurfaceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
 	}
-	iomodel->FetchDataToInput(elements,"md.initialization.pressure",PressureEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.pressure",PressureEnum);
 }/*}}}*/
 void MeltingAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
Index: /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.cpp	(revision 24335)
@@ -18,5 +18,5 @@
 	return 1;
 }/*}}}*/
-void SealevelriseAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void SealevelriseAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	int geodetic=0;
@@ -27,5 +27,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
@@ -33,6 +33,6 @@
 
 	/*Create inputs: */
-	iomodel->FetchDataToInput(elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
 	//those only if we have requested geodetic computations:
 	iomodel->FetchData(&geodetic,"md.slr.geodetic");
@@ -41,25 +41,25 @@
 		iomodel->FetchData(&masktype,"md.mask.type");
 		if (strcmp(masktype,"maskpsl")==0){
-			iomodel->FetchDataToInput(elements,"md.mask.ocean_levelset",MaskOceanLevelsetEnum);
-			iomodel->FetchDataToInput(elements,"md.mask.land_levelset",MaskLandLevelsetEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.mask.ocean_levelset",MaskOceanLevelsetEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.mask.land_levelset",MaskLandLevelsetEnum);
 		}
 		xDelete<char>(masktype);
 	}
-	iomodel->FetchDataToInput(elements,"md.slr.deltathickness",SealevelriseDeltathicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.spcthickness",SealevelriseSpcthicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
-	iomodel->FetchDataToInput(elements,"md.geometry.bed",BedEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.Ngia",SealevelNGiaRateEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.Ugia",SealevelUGiaRateEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.steric_rate",SealevelriseStericRateEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.hydro_rate",SealevelriseHydroRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.deltathickness",SealevelriseDeltathicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.spcthickness",SealevelriseSpcthicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.bed",BedEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.Ngia",SealevelNGiaRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.Ugia",SealevelUGiaRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.steric_rate",SealevelriseStericRateEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.hydro_rate",SealevelriseHydroRateEnum);
 
 	/*Initialize cumdeltalthickness and sealevel rise rate input*/
-	InputUpdateFromConstantx(elements,0.,SealevelriseCumDeltathicknessEnum);
-	InputUpdateFromConstantx(elements,0.,SealevelNEsaRateEnum);
-	InputUpdateFromConstantx(elements,0.,SealevelUEsaRateEnum);
-	InputUpdateFromConstantx(elements,0.,SealevelRSLRateEnum);
-	InputUpdateFromConstantx(elements,0.,SealevelEustaticMaskEnum);
-	InputUpdateFromConstantx(elements,0.,SealevelEustaticOceanMaskEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,SealevelriseCumDeltathicknessEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,SealevelNEsaRateEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,SealevelUEsaRateEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,SealevelRSLRateEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,SealevelEustaticMaskEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,SealevelEustaticOceanMaskEnum);
 
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/SmbAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SmbAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/SmbAnalysis.cpp	(revision 24335)
@@ -21,5 +21,5 @@
 	return 1;
 }/*}}}*/
-void SmbAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void SmbAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	int    smb_model;
@@ -31,5 +31,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
@@ -40,64 +40,64 @@
 	switch(smb_model){
 		case SMBforcingEnum:
-			iomodel->FetchDataToInput(elements,"md.smb.mass_balance",SmbMassBalanceEnum,0.);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.mass_balance",SmbMassBalanceEnum,0.);
 			break;
 		case SMBgembEnum:
-			iomodel->FetchDataToInput(elements,"md.smb.Ta",SmbTaEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.V",SmbVEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.dswrf",SmbDswrfEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.dlwrf",SmbDlwrfEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.P",SmbPEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.eAir",SmbEAirEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.pAir",SmbPAirEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.zTop",SmbZTopEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.dzTop",SmbDzTopEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.dzMin",SmbDzMinEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.zY",SmbZYEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.zMax",SmbZMaxEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.zMin",SmbZMinEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.Tmean",SmbTmeanEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.Vmean",SmbVmeanEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.C",SmbCEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.Tz",SmbTzEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.Vz",SmbVzEnum);
-			InputUpdateFromConstantx(elements,0.,SmbIsInitializedEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.Dzini",SmbDziniEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.Dini",SmbDiniEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.Reini",SmbReiniEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.Gdnini",SmbGdniniEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.Gspini",SmbGspiniEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.ECini",SmbECiniEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.Wini",SmbWiniEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.Aini",SmbAiniEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.Tini",SmbTiniEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.Sizeini",SmbSizeiniEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.aValue",SmbAValueEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.teValue",SmbTeValueEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Ta",SmbTaEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.V",SmbVEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.dswrf",SmbDswrfEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.dlwrf",SmbDlwrfEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.P",SmbPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.eAir",SmbEAirEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.pAir",SmbPAirEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.zTop",SmbZTopEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.dzTop",SmbDzTopEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.dzMin",SmbDzMinEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.zY",SmbZYEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.zMax",SmbZMaxEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.zMin",SmbZMinEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Tmean",SmbTmeanEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Vmean",SmbVmeanEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.C",SmbCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Tz",SmbTzEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Vz",SmbVzEnum);
+			InputUpdateFromConstantx(inputs2,elements,0.,SmbIsInitializedEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Dzini",SmbDziniEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Dini",SmbDiniEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Reini",SmbReiniEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Gdnini",SmbGdniniEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Gspini",SmbGspiniEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.ECini",SmbECiniEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Wini",SmbWiniEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Aini",SmbAiniEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Tini",SmbTiniEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.Sizeini",SmbSizeiniEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.aValue",SmbAValueEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.teValue",SmbTeValueEnum);
 			break;
 		case SMBpddEnum:
 			iomodel->FindConstant(&isdelta18o,"md.smb.isdelta18o");
 			iomodel->FindConstant(&ismungsm,"md.smb.ismungsm");
-			iomodel->FetchDataToInput(elements,"md.thermal.spctemperature",ThermalSpctemperatureEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.s0p",SmbS0pEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.s0t",SmbS0tEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.thermal.spctemperature",ThermalSpctemperatureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.s0p",SmbS0pEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.s0t",SmbS0tEnum);
 			if(isdelta18o || ismungsm){
-				iomodel->FetchDataToInput(elements,"md.smb.temperatures_lgm",SmbTemperaturesLgmEnum);
-				iomodel->FetchDataToInput(elements,"md.smb.temperatures_presentday",SmbTemperaturesPresentdayEnum);
-				iomodel->FetchDataToInput(elements,"md.smb.precipitations_presentday",SmbPrecipitationsPresentdayEnum);
-				iomodel->FetchDataToInput(elements,"md.smb.precipitations_lgm",SmbPrecipitationsLgmEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.smb.temperatures_lgm",SmbTemperaturesLgmEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.smb.temperatures_presentday",SmbTemperaturesPresentdayEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.smb.precipitations_presentday",SmbPrecipitationsPresentdayEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.smb.precipitations_lgm",SmbPrecipitationsLgmEnum);
 			}else{
-				iomodel->FetchDataToInput(elements,"md.smb.precipitation",SmbPrecipitationEnum);
-				iomodel->FetchDataToInput(elements,"md.smb.monthlytemperatures",SmbMonthlytemperaturesEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.smb.precipitation",SmbPrecipitationEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.smb.monthlytemperatures",SmbMonthlytemperaturesEnum);
 			}
 			break;
 		case SMBpddSicopolisEnum:
-			iomodel->FetchDataToInput(elements,"md.smb.s0p",SmbS0pEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.s0t",SmbS0tEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.s0p",SmbS0pEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.s0t",SmbS0tEnum);
 			iomodel->FindConstant(&isfirnwarming,"md.smb.isfirnwarming");
-			iomodel->FetchDataToInput(elements,"md.smb.smb_corr",SmbSmbCorrEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.precipitation",SmbPrecipitationEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.monthlytemperatures",SmbMonthlytemperaturesEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.precipitation_anomaly",SmbPrecipitationsAnomalyEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.temperature_anomaly",SmbTemperaturesAnomalyEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.smb_corr",SmbSmbCorrEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.precipitation",SmbPrecipitationEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.monthlytemperatures",SmbMonthlytemperaturesEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.precipitation_anomaly",SmbPrecipitationsAnomalyEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.temperature_anomaly",SmbTemperaturesAnomalyEnum);
 			break;
 		case SMBd18opddEnum:
@@ -107,67 +107,67 @@
 			iomodel->FindConstant(&isd18opd,"md.smb.isd18opd");
 			iomodel->FindConstant(&issetpddfac,"md.smb.issetpddfac");
-			iomodel->FetchDataToInput(elements,"md.thermal.spctemperature",ThermalSpctemperatureEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.s0p",SmbS0pEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.s0t",SmbS0tEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.thermal.spctemperature",ThermalSpctemperatureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.s0p",SmbS0pEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.s0t",SmbS0tEnum);
 			if(isd18opd){
-				iomodel->FetchDataToInput(elements,"md.smb.temperatures_presentday",SmbTemperaturesPresentdayEnum);
-				iomodel->FetchDataToInput(elements,"md.smb.precipitations_presentday",SmbPrecipitationsPresentdayEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.smb.temperatures_presentday",SmbTemperaturesPresentdayEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.smb.precipitations_presentday",SmbPrecipitationsPresentdayEnum);
 				if(!istemperaturescaled){
-					iomodel->FetchDataToInput(elements,"md.smb.temperatures_reconstructed",SmbTemperaturesReconstructedEnum);
+					iomodel->FetchDataToInput(inputs2,elements,"md.smb.temperatures_reconstructed",SmbTemperaturesReconstructedEnum);
 				}
 				if(!isprecipscaled){
-					iomodel->FetchDataToInput(elements,"md.smb.precipitations_reconstructed",SmbPrecipitationsReconstructedEnum);
+					iomodel->FetchDataToInput(inputs2,elements,"md.smb.precipitations_reconstructed",SmbPrecipitationsReconstructedEnum);
 				}
 			}
 			if(issetpddfac){
-				iomodel->FetchDataToInput(elements,"md.smb.pddfac_snow",SmbPddfacSnowEnum,-1.);
-				iomodel->FetchDataToInput(elements,"md.smb.pddfac_ice",SmbPddfacIceEnum,-1.);
+				iomodel->FetchDataToInput(inputs2,elements,"md.smb.pddfac_snow",SmbPddfacSnowEnum,-1.);
+				iomodel->FetchDataToInput(inputs2,elements,"md.smb.pddfac_ice",SmbPddfacIceEnum,-1.);
 			}
 			break;
 		case SMBgradientsEnum:
-			iomodel->FetchDataToInput(elements,"md.smb.href",SmbHrefEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.smbref",SmbSmbrefEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.b_pos",SmbBPosEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.b_neg",SmbBNegEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.href",SmbHrefEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.smbref",SmbSmbrefEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.b_pos",SmbBPosEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.b_neg",SmbBNegEnum);
 			break;
 		case SMBgradientselaEnum:
-			iomodel->FetchDataToInput(elements,"md.smb.ela",SmbElaEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.b_pos",SmbBPosEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.b_neg",SmbBNegEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.b_max",SmbBMaxEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.b_min",SmbBMinEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.ela",SmbElaEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.b_pos",SmbBPosEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.b_neg",SmbBNegEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.b_max",SmbBMaxEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.b_min",SmbBMinEnum);
 			break;
 		case SMBhenningEnum:
-			iomodel->FetchDataToInput(elements,"md.smb.smbref",SmbSmbrefEnum,0.);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.smbref",SmbSmbrefEnum,0.);
 			break;
 		case SMBcomponentsEnum:
-			iomodel->FetchDataToInput(elements,"md.smb.accumulation",SmbAccumulationEnum,0.);
-			iomodel->FetchDataToInput(elements,"md.smb.evaporation",SmbEvaporationEnum,0.);
-			iomodel->FetchDataToInput(elements,"md.smb.runoff",SmbRunoffEnum,0.);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.accumulation",SmbAccumulationEnum,0.);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.evaporation",SmbEvaporationEnum,0.);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.runoff",SmbRunoffEnum,0.);
 			break;
 		case SMBmeltcomponentsEnum:
-			iomodel->FetchDataToInput(elements,"md.smb.accumulation",SmbAccumulationEnum,0.);
-			iomodel->FetchDataToInput(elements,"md.smb.evaporation",SmbEvaporationEnum,0.);
-			iomodel->FetchDataToInput(elements,"md.smb.melt",SmbMeltEnum,0.);
-			iomodel->FetchDataToInput(elements,"md.smb.refreeze",SmbRefreezeEnum,0.);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.accumulation",SmbAccumulationEnum,0.);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.evaporation",SmbEvaporationEnum,0.);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.melt",SmbMeltEnum,0.);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.refreeze",SmbRefreezeEnum,0.);
 			break;
 		case SMBgradientscomponentsEnum:
-			iomodel->FetchDataToInput(elements,"md.smb.accualti",SmbAccualtiEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.accugrad",SmbAccugradEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.runoffalti",SmbRunoffaltiEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.runoffgrad",SmbRunoffgradEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.accualti",SmbAccualtiEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.accugrad",SmbAccugradEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.runoffalti",SmbRunoffaltiEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.runoffgrad",SmbRunoffgradEnum);
 			break;
 		case SMBsemicEnum:
-			iomodel->FetchDataToInput(elements,"md.thermal.spctemperature",ThermalSpctemperatureEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.s0gcm",SmbS0gcmEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.dailysnowfall",SmbDailysnowfallEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.dailyrainfall",SmbDailyrainfallEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.dailydsradiation",SmbDailydsradiationEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.dailydlradiation",SmbDailydlradiationEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.dailywindspeed",SmbDailywindspeedEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.dailypressure",SmbDailypressureEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.dailyairdensity",SmbDailyairdensityEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.dailyairhumidity",SmbDailyairhumidityEnum);
-			iomodel->FetchDataToInput(elements,"md.smb.dailytemperature",SmbDailytemperatureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.thermal.spctemperature",ThermalSpctemperatureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.s0gcm",SmbS0gcmEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.dailysnowfall",SmbDailysnowfallEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.dailyrainfall",SmbDailyrainfallEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.dailydsradiation",SmbDailydsradiationEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.dailydlradiation",SmbDailydlradiationEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.dailywindspeed",SmbDailywindspeedEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.dailypressure",SmbDailypressureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.dailyairdensity",SmbDailyairdensityEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.dailyairhumidity",SmbDailyairhumidityEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.smb.dailytemperature",SmbDailytemperatureEnum);
 			break;
 		default:
Index: /issm/trunk-jpl/src/c/analyses/SmbAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SmbAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/SmbAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/SmoothAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SmoothAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/SmoothAnalysis.cpp	(revision 24335)
@@ -18,5 +18,5 @@
 	return 1;
 }/*}}}*/
-void SmoothAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void SmoothAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Update elements: */
@@ -25,5 +25,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
@@ -70,5 +70,5 @@
 	element->FindParam(&l,SmoothThicknessMultiplierEnum); _assert_(l>0.);
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input);
+	Input2* thickness_input = element->GetInput2(ThicknessEnum); _assert_(thickness_input);
 
 	/* Start looping on the number of gaussian points: */
@@ -116,8 +116,8 @@
 	IssmDouble  Jdet,value;
 	IssmDouble *xyz_list  = NULL;
-	Input      *input = NULL;
+	Input2     *input = NULL;
 
 	/*SPECIFICS: Driving stress for balance velocities*/
-	Input*      H_input = NULL, *surface_input = NULL, *vx_input = NULL, *vy_input = NULL;
+	Input2*      H_input = NULL, *surface_input = NULL, *vx_input = NULL, *vy_input = NULL;
 	IssmDouble  taud_x,norms,normv,vx,vy;
 	IssmDouble  rho_ice,gravity,slope[2],thickness;
@@ -139,16 +139,16 @@
 			rho_ice       = element->FindParam(MaterialsRhoIceEnum);
 			gravity       = element->FindParam(ConstantsGEnum);
-			H_input       = element->GetInput(ThicknessEnum); _assert_(H_input);
-			surface_input = element->GetInput(SurfaceEnum);   _assert_(surface_input);
-			vx_input      = element->GetInput(VxEnum);
-			vy_input      = element->GetInput(VyEnum);
+			H_input       = element->GetInput2(ThicknessEnum); _assert_(H_input);
+			surface_input = element->GetInput2(SurfaceEnum);   _assert_(surface_input);
+			vx_input      = element->GetInput2(VxEnum);
+			vy_input      = element->GetInput2(VyEnum);
 			}
 			break;
 		case SurfaceSlopeXEnum:
 		case SurfaceSlopeYEnum:{
-			surface_input = element->GetInput(SurfaceEnum);   _assert_(surface_input);
-			}
-			break;
-		default: input = element->GetInput(input_enum);
+			surface_input = element->GetInput2(SurfaceEnum);   _assert_(surface_input);
+			}
+			break;
+		default: input = element->GetInput2(input_enum);
 	}
 
Index: /issm/trunk-jpl/src/c/analyses/SmoothAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SmoothAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/SmoothAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 24335)
@@ -659,5 +659,5 @@
 	return numdofs;
 }/*}}}*/
-void StressbalanceAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void StressbalanceAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Intermediaries*/
@@ -730,5 +730,11 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement_list[i]);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement_list[i]);
+
+			/*Need to know the type of approximation for this element*/
+			if(iomodel->Data("md.flowequation.element_equation")){
+				inputs2->SetInput(ApproximationEnum,counter,IoCodeToEnumElementEquation(reCast<int>(iomodel->Data("md.flowequation.element_equation")[i])));
+			}
+
 			counter++;
 		}
@@ -736,29 +742,29 @@
 
 	/*Create inputs: */
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum,0.);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum,0.);
-	iomodel->FetchDataToInput(elements,"md.stressbalance.loadingforcex",LoadingforceXEnum);
-	iomodel->FetchDataToInput(elements,"md.stressbalance.loadingforcey",LoadingforceYEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.surface",SurfaceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum,0.);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum,0.);
+	iomodel->FetchDataToInput(inputs2,elements,"md.stressbalance.loadingforcex",LoadingforceXEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.stressbalance.loadingforcey",LoadingforceYEnum);
 	#ifdef LATERALFRICTION
-	iomodel->FetchDataToInput(elements,"md.mesh.vertexonboundary",MeshVertexonboundaryEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonboundary",MeshVertexonboundaryEnum);
 	#endif
 
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
 	}
 	if(iomodel->domaintype==Domain3DEnum){
-		iomodel->FetchDataToInput(elements,"md.flowequation.borderFS",FlowequationBorderFSEnum);
-		iomodel->FetchDataToInput(elements,"md.stressbalance.loadingforcez",LoadingforceZEnum);
-		iomodel->FetchDataToInput(elements,"md.initialization.vz",VzEnum,0.);
+		iomodel->FetchDataToInput(inputs2,elements,"md.flowequation.borderFS",FlowequationBorderFSEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.stressbalance.loadingforcez",LoadingforceZEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vz",VzEnum,0.);
 	}
 	if(isFS){
-		iomodel->FetchDataToInput(elements,"md.initialization.pressure",PressureEnum,0.);
+		iomodel->FetchDataToInput(inputs2,elements,"md.initialization.pressure",PressureEnum,0.);
 
 		/*Add basal forcings to compute melt rate*/
@@ -767,5 +773,5 @@
 		switch(basalforcing_model){
 			case FloatingMeltRateEnum:
-				iomodel->FetchDataToInput(elements,"md.basalforcings.floatingice_melting_rate",BasalforcingsFloatingiceMeltingRateEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.floatingice_melting_rate",BasalforcingsFloatingiceMeltingRateEnum);
 				break;
 			case LinearFloatingMeltRateEnum:
@@ -776,17 +782,17 @@
 				break;
 			case SpatialLinearFloatingMeltRateEnum:
-				iomodel->FetchDataToInput(elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsDeepwaterMeltingRateEnum);
-				iomodel->FetchDataToInput(elements,"md.basalforcings.deepwater_elevation",BasalforcingsDeepwaterElevationEnum);
-				iomodel->FetchDataToInput(elements,"md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsDeepwaterMeltingRateEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.deepwater_elevation",BasalforcingsDeepwaterElevationEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum);
 				break;
 			case BasalforcingsPicoEnum:
-				iomodel->FetchDataToInput(elements,"md.basalforcings.basin_id",BasalforcingsPicoBasinIdEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.basin_id",BasalforcingsPicoBasinIdEnum);
 				break;
 			case BasalforcingsIsmip6Enum:
-				iomodel->FetchDataToInput(elements,"md.basalforcings.basin_id",BasalforcingsIsmip6BasinIdEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.basin_id",BasalforcingsIsmip6BasinIdEnum);
 				break;
 			case BeckmannGoosseFloatingMeltRateEnum:
-				iomodel->FetchDataToInput(elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
-				iomodel->FetchDataToInput(elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
 				break;
 			default:
@@ -797,5 +803,5 @@
 	iomodel->FindConstant(&fe_FS,"md.flowequation.fe_FS");
 	if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
-		InputUpdateFromConstantx(elements,0.,SigmaNNEnum);
+		InputUpdateFromConstantx(inputs2,elements,0.,SigmaNNEnum);
 	}
 
@@ -804,83 +810,83 @@
 		case 1:
 			iomodel->FindConstant(&FrictionCoupling,"md.friction.coupling");
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
 			if(FrictionCoupling==3){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
 			else if(FrictionCoupling==4){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",EffectivePressureEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",EffectivePressureEnum);
 			}
 			break;
 		case 2:
-			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.m",FrictionMEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.m",FrictionMEnum);
 			break;
 		case 3:
 			iomodel->FindConstant(&FrictionCoupling,"md.friction.coupling");
-			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.As",FrictionAsEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.As",FrictionAsEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
 			if(FrictionCoupling==3){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
 			else if(FrictionCoupling==4){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",EffectivePressureEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",EffectivePressureEnum);
 			}
 			break;
 		case 4:
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.pressure",PressureEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.temperature",TemperatureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.pressure",PressureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.temperature",TemperatureEnum);
 			iomodel->FindConstant(&FrictionCoupling,"md.friction.coupling");
 			break;
 		case 5:
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.water_layer",FrictionWaterLayerEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.water_layer",FrictionWaterLayerEnum);
 			break;
 		case 6:
-			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.m",FrictionMEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.pressure",PressureEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.temperature",TemperatureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.m",FrictionMEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.pressure",PressureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.temperature",TemperatureEnum);
 			break;
 		case 7:
 			iomodel->FindConstant(&FrictionCoupling,"md.friction.coupling");
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.coefficientcoulomb",FrictionCoefficientcoulombEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficientcoulomb",FrictionCoefficientcoulombEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
 			if(FrictionCoupling==3){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
 			else if(FrictionCoupling==4){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",EffectivePressureEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",EffectivePressureEnum);
 
 			}
 			break;
 		case 9:
-			iomodel->FetchDataToInput(elements,"md.initialization.temperature",TemperatureEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.pressure_adjusted_temperature",FrictionPressureAdjustedTemperatureEnum);
-			InputUpdateFromConstantx(elements,1.,FrictionPEnum);
-			InputUpdateFromConstantx(elements,1.,FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.temperature",TemperatureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.pressure_adjusted_temperature",FrictionPressureAdjustedTemperatureEnum);
+			InputUpdateFromConstantx(inputs2,elements,1.,FrictionPEnum);
+			InputUpdateFromConstantx(inputs2,elements,1.,FrictionQEnum);
 			break;
 		case 10:
-			iomodel->FetchDataToInput(elements,"md.friction.till_friction_angle",FrictionTillFrictionAngleEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.sediment_compressibility_coefficient",FrictionSedimentCompressibilityCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.hydrology.watercolumn_max",HydrologyWatercolumnMaxEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.watercolumn",WatercolumnEnum,0.);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.till_friction_angle",FrictionTillFrictionAngleEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.sediment_compressibility_coefficient",FrictionSedimentCompressibilityCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.hydrology.watercolumn_max",HydrologyWatercolumnMaxEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.watercolumn",WatercolumnEnum,0.);
 			break;
 		case 11:
-			iomodel->FetchDataToInput(elements,"md.friction.m",FrictionMEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.Cmax",FrictionCmaxEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.m",FrictionMEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.Cmax",FrictionCmaxEnum);
 			break;
 		case 12:
-			iomodel->FetchDataToInput(elements,"md.friction.m",FrictionMEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.f",FrictionfEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.m",FrictionMEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.f",FrictionfEnum);
 			break;
 		default:
@@ -889,5 +895,5 @@
 
 #ifdef _HAVE_ANDROID_
-	elements->InputDuplicate(FrictionCoefficientEnum,AndroidFrictionCoefficientEnum);
+	inputs2->DuplicateInput(FrictionCoefficientEnum,AndroidFrictionCoefficientEnum);
 #endif
 
@@ -1059,5 +1065,5 @@
 
 	int approximation;
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	switch(approximation){
 		case FSApproximationEnum:
@@ -1072,5 +1078,5 @@
 
 	int approximation;
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	switch(approximation){
 		case SSAApproximationEnum:
@@ -1088,5 +1094,5 @@
 ElementMatrix* StressbalanceAnalysis::CreateKMatrix(Element* element){/*{{{*/
 	int approximation;
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	switch(approximation){
 		case SIAApproximationEnum:
@@ -1115,5 +1121,5 @@
 
 	int approximation;
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	switch(approximation){
 		case SIAApproximationEnum:
@@ -1142,5 +1148,5 @@
 
 	int approximation;
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	switch(approximation){
 		case FSApproximationEnum: case NoneApproximationEnum:
@@ -1178,5 +1184,5 @@
 	int numnodes = element->GetNumberOfNodes();
 	int numdof   = numnodes*dofpernode;
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 
 	/*Fetch dof list and allocate solution vector*/
@@ -1185,7 +1191,7 @@
 
 	/*Get inputs*/
-	Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input=NULL;
-	if(domaintype!=Domain2DverticalEnum){vy_input=element->GetInput(VyEnum); _assert_(vy_input);}
+	Input2* vx_input=element->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input=NULL;
+	if(domaintype!=Domain2DverticalEnum){vy_input=element->GetInput2(VyEnum); _assert_(vy_input);}
 
 	/*Ok, we have vx and vy in values, fill in vx and vy arrays: */
@@ -1216,5 +1222,5 @@
 
 	int approximation;
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	switch(approximation){
 		case FSApproximationEnum: case NoneApproximationEnum:
@@ -1287,7 +1293,7 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* thickness_input = basalelement->GetInput(ThicknessEnum);_assert_(thickness_input);
-	Input* vx_input        = basalelement->GetInput(VxEnum);       _assert_(vx_input);
-	Input* vy_input        = basalelement->GetInput(VyEnum);       _assert_(vy_input);
+	Input2* thickness_input = basalelement->GetInput2(ThicknessEnum);_assert_(thickness_input);
+	Input2* vx_input        = basalelement->GetInput2(VxEnum);       _assert_(vx_input);
+	Input2* vy_input        = basalelement->GetInput2(VyEnum);       _assert_(vy_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -1406,6 +1412,6 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->FindParam(&friction_style,GroundinglineFrictionInterpolationEnum);
-	Input* surface_input    = element->GetInput(SurfaceEnum); _assert_(surface_input);
-	Input* gllevelset_input = NULL;
+	Input2* surface_input    = element->GetInput2(SurfaceEnum); _assert_(surface_input);
+	Input2* gllevelset_input = NULL;
 
 	/*build friction object, used later on: */
@@ -1415,5 +1421,5 @@
 	if(!(friction_style==SubelementFriction2Enum)) phi=element->GetGroundedPortion(xyz_list);
 	if(friction_style==SubelementFriction2Enum){
-		gllevelset_input=element->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
+		gllevelset_input=element->GetInput2(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
 		element->GetGroundedPart(&point1,&fraction1,&fraction2,&mainlyfloating);
 	   gauss = element->NewGauss(point1,fraction1,fraction2,mainlyfloating,2);
@@ -1501,5 +1507,5 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->GetLevelCoordinates(&xyz_list_boundary,xyz_list,MeshVertexonboundaryEnum,1.);
-	Input* icelevelset_input = element->GetInput(MaskIceLevelsetEnum); _assert_(icelevelset_input);
+	Input2* icelevelset_input = element->GetInput2(MaskIceLevelsetEnum); _assert_(icelevelset_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -1563,9 +1569,9 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* thickness_input=element->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* vx_input=element->GetInput(VxEnum);               _assert_(vx_input);
-	Input* vy_input    = NULL;
+	Input2* thickness_input=element->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* vx_input=element->GetInput2(VxEnum);               _assert_(vx_input);
+	Input2* vy_input    = NULL;
 	if(dim==2){
-		vy_input    = element->GetInput(VyEnum);       _assert_(vy_input);
+		vy_input    = element->GetInput2(VyEnum);       _assert_(vy_input);
 	}
 
@@ -1680,6 +1686,6 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input*     thickness_input=element->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input*     surface_input  =element->GetInput(SurfaceEnum);   _assert_(surface_input);
+	Input2*     thickness_input=element->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2*     surface_input  =element->GetInput2(SurfaceEnum);   _assert_(surface_input);
 	IssmDouble rhog = element->FindParam(MaterialsRhoIceEnum)*element->FindParam(ConstantsGEnum);
 
@@ -1744,7 +1750,7 @@
 
 	/*Retrieve all inputs and parameters*/
-	Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* base_input       = element->GetInput(BaseEnum);       _assert_(base_input);
-	Input* sealevel_input       = element->GetInput(SealevelEnum);       _assert_(sealevel_input);
+	Input2* thickness_input = element->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* base_input       = element->GetInput2(BaseEnum);       _assert_(base_input);
+	Input2* sealevel_input       = element->GetInput2(SealevelEnum);       _assert_(sealevel_input);
 	IssmDouble rho_water   = element->FindParam(MaterialsRhoSeawaterEnum);
 	IssmDouble rho_ice     = element->FindParam(MaterialsRhoIceEnum);
@@ -1941,5 +1947,5 @@
 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
 	}
-	element->AddInput(PressureEnum,pressure,P1Enum);
+	element->AddInput2(PressureEnum,pressure,P1Enum);
 	xDelete<IssmDouble>(pressure);
 	xDelete<IssmDouble>(thickness);
@@ -1964,9 +1970,9 @@
 	/*Fetch dof list and allocate solution vectors*/
 	basalelement->GetDofListLocal(&doflist,SSAApproximationEnum,GsetEnum);
-	IssmDouble* values    = xNew<IssmDouble>(numdof);
-	IssmDouble* vx        = xNew<IssmDouble>(numnodes);
-	IssmDouble* vy        = xNew<IssmDouble>(numnodes);
-	IssmDouble* vz        = xNew<IssmDouble>(numnodes);
-	IssmDouble* vel       = xNew<IssmDouble>(numnodes);
+	IssmDouble* values = xNew<IssmDouble>(numdof);
+	IssmDouble* vx     = xNew<IssmDouble>(numnodes);
+	IssmDouble* vy     = xNew<IssmDouble>(numnodes);
+	IssmDouble* vz     = xNew<IssmDouble>(numnodes);
+	IssmDouble* vel    = xNew<IssmDouble>(numnodes);
 
 	/*Use the dof list to index into the solution vector: */
@@ -2000,7 +2006,7 @@
 
 	/*Add vx and vy as inputs to the tria element: */
-	element->AddBasalInput(VxEnum,vx,element->GetElementType());
-	if(dim==2)element->AddBasalInput(VyEnum,vy,element->GetElementType());
-	element->AddBasalInput(VelEnum,vel,element->GetElementType());
+	element->AddBasalInput2(VxEnum,vx,element->GetElementType());
+	if(dim==2)element->AddBasalInput2(VyEnum,vy,element->GetElementType());
+	element->AddBasalInput2(VelEnum,vel,element->GetElementType());
 
 	/*Free ressources:*/
@@ -2062,7 +2068,7 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input);
-	Input* vx_input      = element->GetInput(VxEnum);      _assert_(vx_input);
-	Input* vy_input      = element->GetInput(VyEnum);      _assert_(vy_input);
+	Input2* surface_input = element->GetInput2(SurfaceEnum); _assert_(surface_input);
+	Input2* vx_input      = element->GetInput2(VxEnum);      _assert_(vx_input);
+	Input2* vy_input      = element->GetInput2(VyEnum);      _assert_(vy_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -2149,6 +2155,6 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input*     thickness_input=element->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input*     surface_input  =element->GetInput(SurfaceEnum);   _assert_(surface_input);
+	Input2*     thickness_input=element->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2*     surface_input  =element->GetInput2(SurfaceEnum);   _assert_(surface_input);
 	IssmDouble rhog = element->FindParam(MaterialsRhoIceEnum)*element->FindParam(ConstantsGEnum);
 
@@ -2200,7 +2206,7 @@
 
 	/*Retrieve all inputs and parameters*/
-	Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* base_input       = element->GetInput(BaseEnum);       _assert_(base_input);
-	Input* sealevel_input       = element->GetInput(SealevelEnum);       _assert_(sealevel_input);
+	Input2* thickness_input = element->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* base_input       = element->GetInput2(BaseEnum);       _assert_(base_input);
+	Input2* sealevel_input       = element->GetInput2(SealevelEnum);       _assert_(sealevel_input);
 	IssmDouble rho_water   = element->FindParam(MaterialsRhoSeawaterEnum);
 	IssmDouble rho_ice     = element->FindParam(MaterialsRhoIceEnum);
@@ -2270,5 +2276,5 @@
 		for(i=0;i<numvertices;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]);
 	}
-	element->AddInput(PressureEnum,pressure,P1Enum);
+	element->AddInput2(PressureEnum,pressure,P1Enum);
 	xDelete<IssmDouble>(pressure);
 	xDelete<IssmDouble>(thickness);
@@ -2323,7 +2329,7 @@
 
 	/*Add vx and vy as inputs to the tria element: */
-	element->AddBasalInput(VxEnum,vx,element->GetElementType());
-	element->AddBasalInput(VyEnum,vy,element->GetElementType());
-	element->AddBasalInput(VelEnum,vel,element->GetElementType());
+	element->AddBasalInput2(VxEnum,vx,element->GetElementType());
+	element->AddBasalInput2(VyEnum,vy,element->GetElementType());
+	element->AddBasalInput2(VelEnum,vel,element->GetElementType());
 
 	/*Free ressources:*/
@@ -2359,6 +2365,6 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input);
+	Input2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input = element->GetInput2(VyEnum); _assert_(vy_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -2445,5 +2451,5 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
 	element->FindParam(&friction_style,GroundinglineFrictionInterpolationEnum);
-	Input* gllevelset_input = NULL;
+	Input2* gllevelset_input = NULL;
 
 	/*build friction object, used later on: */
@@ -2453,5 +2459,5 @@
 	if(!(friction_style==SubelementFriction2Enum)) phi=element->GetGroundedPortion(xyz_list_base);
 	if(friction_style==SubelementFriction2Enum){
-		gllevelset_input=element->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
+		gllevelset_input=element->GetInput2(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
 		element->GetGroundedPart(&point1,&fraction1,&fraction2,&mainlyfloating);
 		gauss = element->NewGauss(point1,fraction1,fraction2,mainlyfloating,2);
@@ -2513,5 +2519,5 @@
 	/*Intermediaries*/
 	int         dim,bsize;
-	IssmDouble  viscosity,thickness,Jdet;
+	IssmDouble  viscosity,Jdet;
 	IssmDouble *xyz_list = NULL;
 
@@ -2529,8 +2535,8 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* vx_input    = element->GetInput(VxEnum);       _assert_(vx_input);
-	Input* vy_input    = NULL;
+	Input2* vx_input    = element->GetInput2(VxEnum);       _assert_(vx_input);
+	Input2* vy_input    = NULL;
 	if(dim==3){
-		vy_input=element->GetInput(VyEnum);          _assert_(vy_input);
+		vy_input=element->GetInput2(VyEnum);          _assert_(vy_input);
 	}
 
@@ -2677,5 +2683,5 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input*     surface_input = element->GetInput(SurfaceEnum);   _assert_(surface_input);
+	Input2*     surface_input = element->GetInput2(SurfaceEnum);   _assert_(surface_input);
 	IssmDouble rhog = element->FindParam(MaterialsRhoIceEnum)*element->FindParam(ConstantsGEnum);
 
@@ -2733,6 +2739,6 @@
 
 	/*Retrieve all inputs and parameters*/
-	Input* surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input);
-	Input* sealevel_input       = element->GetInput(SealevelEnum);       _assert_(sealevel_input);
+	Input2* surface_input = element->GetInput2(SurfaceEnum); _assert_(surface_input);
+	Input2* sealevel_input       = element->GetInput2(SealevelEnum);       _assert_(sealevel_input);
 	IssmDouble rho_water = element->FindParam(MaterialsRhoSeawaterEnum);
 	IssmDouble rho_ice   = element->FindParam(MaterialsRhoIceEnum);
@@ -2938,5 +2944,5 @@
 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
 	}
-	element->AddInput(PressureEnum,pressure,P1Enum);
+	element->AddInput2(PressureEnum,pressure,P1Enum);
 	xDelete<IssmDouble>(pressure);
 	xDelete<IssmDouble>(surface);
@@ -2983,7 +2989,7 @@
 
 	/*Add vx and vy as inputs to the element: */
-	element->AddInput(VxEnum,vx,element->GetElementType());
-	if(dim==3)element->AddInput(VyEnum,vy,element->GetElementType());
-	element->AddInput(VelEnum,vel,element->GetElementType());
+	element->AddInput2(VxEnum,vx,element->GetElementType());
+	if(dim==3)element->AddInput2(VyEnum,vy,element->GetElementType());
+	element->AddInput2(VelEnum,vel,element->GetElementType());
 
 	/*Free ressources:*/
@@ -3051,7 +3057,7 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input);
-	Input* vz_input = element->GetInput(VzEnum); _assert_(vz_input);
+	Input2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input = element->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* vz_input = element->GetInput2(VzEnum); _assert_(vz_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -3141,5 +3147,5 @@
 	/*If on not water or not FS, skip stiffness: */
 	int approximation,shelf_dampening;
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	if(approximation!=FSApproximationEnum && approximation!=SSAFSApproximationEnum && approximation!=HOFSApproximationEnum) return NULL;
 	element->FindParam(&shelf_dampening,StressbalanceShelfDampeningEnum);
@@ -3174,5 +3180,5 @@
 	IssmDouble  rho_water     = element->FindParam(MaterialsRhoSeawaterEnum);
 	IssmDouble  gravity       = element->FindParam(ConstantsGEnum);
-	Input*      base_input = element->GetInput(BaseEnum); _assert_(base_input);
+	Input2*      base_input = element->GetInput2(BaseEnum); _assert_(base_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -3232,8 +3238,8 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
-	Input* vx_input=element->GetInput(VxEnum);     _assert_(vx_input);
-	Input* vy_input=element->GetInput(VyEnum);     _assert_(vy_input);
-	Input* vz_input = NULL;
-	if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);}
+	Input2* vx_input=element->GetInput2(VxEnum);     _assert_(vx_input);
+	Input2* vy_input=element->GetInput2(VyEnum);     _assert_(vy_input);
+	Input2* vz_input = NULL;
+	if(dim==3){vz_input=element->GetInput2(VzEnum); _assert_(vz_input);}
 
 	/* Start  looping on the number of gaussian points: */
@@ -3382,8 +3388,8 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	//element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
-	Input* vx_input=element->GetInput(VxEnum);     _assert_(vx_input);
-	Input* vy_input=element->GetInput(VyEnum);     _assert_(vy_input);
-	Input* vz_input = NULL;
-	if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);}
+	Input2* vx_input=element->GetInput2(VxEnum);     _assert_(vx_input);
+	Input2* vy_input=element->GetInput2(VyEnum);     _assert_(vy_input);
+	Input2* vz_input = NULL;
+	if(dim==3){vz_input=element->GetInput2(VzEnum); _assert_(vz_input);}
 
 
@@ -3456,8 +3462,8 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* vx_input = element->GetInput(VxEnum);     _assert_(vx_input);
-	Input* vy_input = element->GetInput(VyEnum);     _assert_(vy_input);
-	Input* vz_input = NULL;
-	if(dim==3){vz_input = element->GetInput(VzEnum); _assert_(vz_input);}
+	Input2* vx_input = element->GetInput2(VxEnum);     _assert_(vx_input);
+	Input2* vy_input = element->GetInput2(VyEnum);     _assert_(vy_input);
+	Input2* vz_input = NULL;
+	if(dim==3){vz_input = element->GetInput2(VzEnum); _assert_(vz_input);}
 
 	/* Start  looping on the number of gaussian points: */
@@ -3581,8 +3587,8 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
-	Input* vx_input=element->GetInput(VxEnum);     _assert_(vx_input);
-	Input* vy_input=element->GetInput(VyEnum);     _assert_(vy_input);
-	Input* vz_input;
-	if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);}
+	Input2* vx_input=element->GetInput2(VxEnum);     _assert_(vx_input);
+	Input2* vy_input=element->GetInput2(VyEnum);     _assert_(vy_input);
+	Input2* vz_input;
+	if(dim==3){vz_input=element->GetInput2(VzEnum); _assert_(vz_input);}
 
 	/* Start  looping on the number of gaussian points: */
@@ -3623,5 +3629,5 @@
 	/*If on water or not FS, skip stiffness: */
 	int approximation;
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	if(approximation!=FSApproximationEnum && approximation!=SSAFSApproximationEnum && approximation!=HOFSApproximationEnum) return NULL;
 
@@ -3650,8 +3656,8 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* vx_input         = element->GetInput(VxEnum);      _assert_(vx_input);
-	Input* vy_input         = element->GetInput(VyEnum);      _assert_(vy_input);
-	Input* vz_input         = NULL;
-	if(dim==3){    vz_input = element->GetInput(VzEnum);      _assert_(vz_input);}
+	Input2* vx_input         = element->GetInput2(VxEnum);      _assert_(vx_input);
+	Input2* vy_input         = element->GetInput2(VyEnum);      _assert_(vy_input);
+	Input2* vz_input         = NULL;
+	if(dim==3){    vz_input = element->GetInput2(VzEnum);      _assert_(vz_input);}
 
 	/* Start  looping on the number of gaussian points: */
@@ -3728,5 +3734,5 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
-	Input*  alpha2_input=element->GetInput(FrictionCoefficientEnum); _assert_(alpha2_input);
+	Input2*  alpha2_input=element->GetInput2(FrictionCoefficientEnum); _assert_(alpha2_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -3782,7 +3788,7 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
-	Input*  sigmann_input=element->GetInput(VzEnum); _assert_(sigmann_input);
-	Input*  sigmant_input=element->GetInput(TemperatureEnum); _assert_(sigmant_input);
-	Input*  bedslope_input=element->GetInput(BedSlopeXEnum);     _assert_(bedslope_input);
+	Input2*  sigmann_input=element->GetInput2(VzEnum); _assert_(sigmann_input);
+	Input2*  sigmant_input=element->GetInput2(TemperatureEnum); _assert_(sigmant_input);
+	Input2*  bedslope_input=element->GetInput2(BedSlopeXEnum);     _assert_(bedslope_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -3899,5 +3905,5 @@
 	/*If on water or not FS, skip stiffness: */
 	int approximation;
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	if(approximation!=FSApproximationEnum && approximation!=SSAFSApproximationEnum && approximation!=HOFSApproximationEnum) return NULL;
 
@@ -3927,5 +3933,5 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
 	element->FindParam(&friction_style,GroundinglineFrictionInterpolationEnum);
-	Input* gllevelset_input = NULL;
+	Input2* gllevelset_input = NULL;
 
 	/*build friction object, used later on: */
@@ -3936,5 +3942,5 @@
 	if(friction_style==SubelementFriction2Enum){
 		if(domaintype==Domain2DverticalEnum) _error_("Subelement Friction 2 not implemented yet for Flowline");
-		gllevelset_input=element->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
+		gllevelset_input=element->GetInput2(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
 		element->GetGroundedPart(&point1,&fraction1,&fraction2,&mainlyfloating);
 		//gauss = element->NewGauss(point1,fraction1,fraction2,mainlyfloating,2);
@@ -4068,9 +4074,9 @@
 	IssmDouble  rho_ice =element->FindParam(MaterialsRhoIceEnum);
 	IssmDouble  gravity =element->FindParam(ConstantsGEnum);
-	Input*      loadingforcex_input=element->GetInput(LoadingforceXEnum);  _assert_(loadingforcex_input);
-	Input*      loadingforcey_input=element->GetInput(LoadingforceYEnum);  _assert_(loadingforcey_input);
-	Input*      loadingforcez_input=NULL;
+	Input2*      loadingforcex_input=element->GetInput2(LoadingforceXEnum);  _assert_(loadingforcex_input);
+	Input2*      loadingforcey_input=element->GetInput2(LoadingforceYEnum);  _assert_(loadingforcey_input);
+	Input2*      loadingforcez_input=NULL;
 	if(dim==3){
-		loadingforcez_input=element->GetInput(LoadingforceZEnum);  _assert_(loadingforcez_input);
+		loadingforcez_input=element->GetInput2(LoadingforceZEnum);  _assert_(loadingforcez_input);
 	}
 
@@ -4146,6 +4152,6 @@
 	element->GetIcefrontCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
 	element->NormalSection(&normal[0],xyz_list_front);
-	Input* surface_input  = element->GetInput(SurfaceEnum); _assert_(surface_input);
-	Input* sealevel_input       = element->GetInput(SealevelEnum);       _assert_(sealevel_input);
+	Input2* surface_input  = element->GetInput2(SurfaceEnum); _assert_(surface_input);
+	Input2* sealevel_input       = element->GetInput2(SealevelEnum);       _assert_(sealevel_input);
 	IssmDouble  rho_water = element->FindParam(MaterialsRhoSeawaterEnum);
 	IssmDouble  gravity   = element->FindParam(ConstantsGEnum);
@@ -4215,5 +4221,5 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
-	Input*      base_input=element->GetInput(BaseEnum); _assert_(base_input);
+	Input2*      base_input=element->GetInput2(BaseEnum); _assert_(base_input);
 	IssmDouble  rho_water=element->FindParam(MaterialsRhoSeawaterEnum);
 	IssmDouble  gravity  =element->FindParam(ConstantsGEnum);
@@ -4239,5 +4245,5 @@
 	element->FindParam(&shelf_dampening,StressbalanceShelfDampeningEnum);
 	if(shelf_dampening) {
-		Input*      mb_input=element->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(mb_input);
+		Input2*      mb_input=element->GetInput2(BasalforcingsFloatingiceMeltingRateEnum); _assert_(mb_input);
 		IssmDouble  dt,mb;
 		element->FindParam(&dt,TimesteppingTimeStepEnum);
@@ -4290,6 +4296,6 @@
 
 	/*Get pressure and sigmann*/
-	Input* pressure_input=element->GetInput(PressureEnum); _assert_(pressure_input);
-	Input* sigmann_input =element->GetInput(SigmaNNEnum);  _assert_(sigmann_input);
+	Input2* pressure_input=element->GetInput2(PressureEnum); _assert_(pressure_input);
+	Input2* sigmann_input =element->GetInput2(SigmaNNEnum);  _assert_(sigmann_input);
 
 	gauss=element->NewGauss(5);
@@ -4383,19 +4389,19 @@
 
 	/*Get d and tau*/
-	Input* epsxx_input=element->GetInput(StrainRatexxEnum); _assert_(epsxx_input);
-	Input* epsyy_input=element->GetInput(StrainRateyyEnum); _assert_(epsyy_input);
-	Input* epsxy_input=element->GetInput(StrainRatexyEnum); _assert_(epsxy_input);
-	Input* epszz_input=NULL; Input* epsxz_input=NULL; Input* epsyz_input=NULL;
-	Input* sigmapxx_input=element->GetInput(DeviatoricStressxxEnum); _assert_(sigmapxx_input);
-	Input* sigmapyy_input=element->GetInput(DeviatoricStressyyEnum); _assert_(sigmapyy_input);
-	Input* sigmapxy_input=element->GetInput(DeviatoricStressxyEnum); _assert_(sigmapxy_input);
-	Input* sigmapzz_input=NULL; Input* sigmapxz_input=NULL; Input* sigmapyz_input=NULL;
+	Input2* epsxx_input=element->GetInput2(StrainRatexxEnum); _assert_(epsxx_input);
+	Input2* epsyy_input=element->GetInput2(StrainRateyyEnum); _assert_(epsyy_input);
+	Input2* epsxy_input=element->GetInput2(StrainRatexyEnum); _assert_(epsxy_input);
+	Input2* epszz_input=NULL; Input2* epsxz_input=NULL; Input2* epsyz_input=NULL;
+	Input2* sigmapxx_input=element->GetInput2(DeviatoricStressxxEnum); _assert_(sigmapxx_input);
+	Input2* sigmapyy_input=element->GetInput2(DeviatoricStressyyEnum); _assert_(sigmapyy_input);
+	Input2* sigmapxy_input=element->GetInput2(DeviatoricStressxyEnum); _assert_(sigmapxy_input);
+	Input2* sigmapzz_input=NULL; Input2* sigmapxz_input=NULL; Input2* sigmapyz_input=NULL;
 	if(dim==3){
-		epszz_input=element->GetInput(StrainRatezzEnum); _assert_(epszz_input);
-		epsxz_input=element->GetInput(StrainRatexzEnum); _assert_(epsxz_input);
-		epsyz_input=element->GetInput(StrainRateyzEnum); _assert_(epsyz_input);
-		sigmapzz_input=element->GetInput(DeviatoricStresszzEnum); _assert_(sigmapzz_input);
-		sigmapxz_input=element->GetInput(DeviatoricStressxzEnum); _assert_(sigmapxz_input);
-		sigmapyz_input=element->GetInput(DeviatoricStressyzEnum); _assert_(sigmapyz_input);
+		epszz_input=element->GetInput2(StrainRatezzEnum); _assert_(epszz_input);
+		epsxz_input=element->GetInput2(StrainRatexzEnum); _assert_(epsxz_input);
+		epsyz_input=element->GetInput2(StrainRateyzEnum); _assert_(epsyz_input);
+		sigmapzz_input=element->GetInput2(DeviatoricStresszzEnum); _assert_(sigmapzz_input);
+		sigmapxz_input=element->GetInput2(DeviatoricStressxzEnum); _assert_(sigmapxz_input);
+		sigmapyz_input=element->GetInput2(DeviatoricStressyzEnum); _assert_(sigmapyz_input);
 	}
 
@@ -5059,5 +5065,5 @@
 	int*         vdoflist=NULL;
 	int*         pdoflist=NULL;
-	Input*       vz_input=NULL;
+	Input2*       vz_input=NULL;
 	int          dim;
 	IssmDouble   vx,vy,vz,p;
@@ -5081,8 +5087,8 @@
 	element->GetDofListVelocity(&vdoflist,GsetEnum);
 	element->GetDofListPressure(&pdoflist,GsetEnum);
-	Input*     vx_input=element->GetInput(VxEnum);       _assert_(vx_input);
-	Input*     vy_input=element->GetInput(VyEnum);       _assert_(vy_input);
-	if(dim==3){vz_input=element->GetInput(VzEnum);       _assert_(vz_input);}
-	Input*     p_input =element->GetInput(PressureEnum); _assert_(p_input);
+	Input2*     vx_input=element->GetInput2(VxEnum);       _assert_(vx_input);
+	Input2*     vy_input=element->GetInput2(VyEnum);       _assert_(vy_input);
+	if(dim==3){vz_input=element->GetInput2(VzEnum);       _assert_(vz_input);}
+	Input2*     p_input =element->GetInput2(PressureEnum); _assert_(p_input);
 
 	element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
@@ -5142,8 +5148,8 @@
 		/*Get inputs and parameters*/
 		element->GetVerticesCoordinates(&xyz_list);
-		Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
-		Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
-		Input* vz_input;
-		if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);}
+		Input2* vx_input=element->GetInput2(VxEnum); _assert_(vx_input);
+		Input2* vy_input=element->GetInput2(VyEnum); _assert_(vy_input);
+		Input2* vz_input;
+		if(dim==3){vz_input=element->GetInput2(VzEnum); _assert_(vz_input);}
 
 		/*Allocate new inputs*/
@@ -5184,11 +5190,11 @@
 
 		/*Add inputs*/
-		element->AddInput(StrainRatexxEnum,epsxx,P1DGEnum); element->AddInput(DeviatoricStressxxEnum,sigmapxx,P1DGEnum);
-		element->AddInput(StrainRateyyEnum,epsyy,P1DGEnum); element->AddInput(DeviatoricStressyyEnum,sigmapyy,P1DGEnum);
-		element->AddInput(StrainRatexyEnum,epsxy,P1DGEnum); element->AddInput(DeviatoricStressxyEnum,sigmapxy,P1DGEnum);
+		element->AddInput2(StrainRatexxEnum,epsxx,P1DGEnum); element->AddInput2(DeviatoricStressxxEnum,sigmapxx,P1DGEnum);
+		element->AddInput2(StrainRateyyEnum,epsyy,P1DGEnum); element->AddInput2(DeviatoricStressyyEnum,sigmapyy,P1DGEnum);
+		element->AddInput2(StrainRatexyEnum,epsxy,P1DGEnum); element->AddInput2(DeviatoricStressxyEnum,sigmapxy,P1DGEnum);
 		if(dim==3){
-			element->AddInput(StrainRatezzEnum,epszz,P1DGEnum); element->AddInput(DeviatoricStresszzEnum,sigmapzz,P1DGEnum);
-			element->AddInput(StrainRatexzEnum,epsxz,P1DGEnum); element->AddInput(DeviatoricStressxzEnum,sigmapxz,P1DGEnum);
-			element->AddInput(StrainRateyzEnum,epsyz,P1DGEnum); element->AddInput(DeviatoricStressyzEnum,sigmapyz,P1DGEnum);
+			element->AddInput2(StrainRatezzEnum,epszz,P1DGEnum); element->AddInput2(DeviatoricStresszzEnum,sigmapzz,P1DGEnum);
+			element->AddInput2(StrainRatexzEnum,epsxz,P1DGEnum); element->AddInput2(DeviatoricStressxzEnum,sigmapxz,P1DGEnum);
+			element->AddInput2(StrainRateyzEnum,epsyz,P1DGEnum); element->AddInput2(DeviatoricStressyzEnum,sigmapyz,P1DGEnum);
 		}
 
@@ -5273,12 +5279,12 @@
 
 	/*Add vx and vy as inputs to the tria element: */
-	int fe_v = element->VelocityInterpolation();
-	//if(fe_v == P1bubblecondensedEnum) fe_v = P1Enum;
-	//if(fe_v == P1bubbleEnum) fe_v = P1Enum;
-	element->AddInput(VxEnum, vx, fe_v);
-	element->AddInput(VyEnum, vy, fe_v);
-	element->AddInput(VelEnum,vel,fe_v);
-	if(pnumdof>0) element->AddInput(PressureEnum,pressure,element->PressureInterpolation());
-	if(dim==3) element->AddInput(VzEnum,vz, fe_v);
+	int v_interp =  element->VelocityInterpolation();
+	if(v_interp==P1bubbleEnum) v_interp=P1Enum;
+	if(v_interp == P1bubblecondensedEnum) v_interp = P1Enum;
+	element->AddInput2(VxEnum, vx, v_interp);
+	element->AddInput2(VyEnum, vy, v_interp);
+	element->AddInput2(VelEnum,vel,v_interp);
+	if(pnumdof>0) element->AddInput2(PressureEnum,pressure,element->PressureInterpolation());
+	if(dim==3) element->AddInput2(VzEnum,vz,v_interp);
 
 	/*Free ressources:*/
@@ -5314,10 +5320,10 @@
 		/*Get inputs and parameters*/
 		element->GetVerticesCoordinates(&xyz_list);
-		Input*  B_input=element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
-		Input*  n_input=element->GetInput(MaterialsRheologyNEnum); _assert_(n_input);
-		Input* vx_input=element->GetInput(VxEnum);                 _assert_(vx_input);
-		Input* vy_input=element->GetInput(VyEnum);                 _assert_(vy_input);
-		Input* vz_input;
-		if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);}
+		Input2*  B_input=element->GetInput2(MaterialsRheologyBEnum); _assert_(B_input);
+		Input2*  n_input=element->GetInput2(MaterialsRheologyNEnum); _assert_(n_input);
+		Input2* vx_input=element->GetInput2(VxEnum);                 _assert_(vx_input);
+		Input2* vy_input=element->GetInput2(VyEnum);                 _assert_(vy_input);
+		Input2* vz_input;
+		if(dim==3){vz_input=element->GetInput2(VzEnum); _assert_(vz_input);}
 
 		/*Fetch number of nodes and dof for this finite element*/
@@ -5338,23 +5344,23 @@
 
 		/*Get previous d*/
-		Input* epsxx_input=element->GetInput(StrainRatexxEnum); _assert_(epsxx_input);
-		Input* epsyy_input=element->GetInput(StrainRateyyEnum); _assert_(epsyy_input);
-		Input* epsxy_input=element->GetInput(StrainRatexyEnum); _assert_(epsxy_input);
-		Input* epszz_input=NULL; Input* epsxz_input=NULL; Input* epsyz_input=NULL;
+		Input2* epsxx_input=element->GetInput2(StrainRatexxEnum); _assert_(epsxx_input);
+		Input2* epsyy_input=element->GetInput2(StrainRateyyEnum); _assert_(epsyy_input);
+		Input2* epsxy_input=element->GetInput2(StrainRatexyEnum); _assert_(epsxy_input);
+		Input2* epszz_input=NULL; Input2* epsxz_input=NULL; Input2* epsyz_input=NULL;
 		if(dim==3){
-			epszz_input=element->GetInput(StrainRatezzEnum); _assert_(epszz_input);
-			epsxz_input=element->GetInput(StrainRatexzEnum); _assert_(epsxz_input);
-			epsyz_input=element->GetInput(StrainRateyzEnum); _assert_(epsyz_input);
+			epszz_input=element->GetInput2(StrainRatezzEnum); _assert_(epszz_input);
+			epsxz_input=element->GetInput2(StrainRatexzEnum); _assert_(epsxz_input);
+			epsyz_input=element->GetInput2(StrainRateyzEnum); _assert_(epsyz_input);
 		}
 
 		/*Get tau*/
-		Input* sigmapxx_input=element->GetInput(DeviatoricStressxxEnum); _assert_(sigmapxx_input);
-		Input* sigmapyy_input=element->GetInput(DeviatoricStressyyEnum); _assert_(sigmapyy_input);
-		Input* sigmapxy_input=element->GetInput(DeviatoricStressxyEnum); _assert_(sigmapxy_input);
-		Input* sigmapzz_input=NULL; Input* sigmapxz_input=NULL; Input* sigmapyz_input=NULL;
+		Input2* sigmapxx_input=element->GetInput2(DeviatoricStressxxEnum); _assert_(sigmapxx_input);
+		Input2* sigmapyy_input=element->GetInput2(DeviatoricStressyyEnum); _assert_(sigmapyy_input);
+		Input2* sigmapxy_input=element->GetInput2(DeviatoricStressxyEnum); _assert_(sigmapxy_input);
+		Input2* sigmapzz_input=NULL; Input2* sigmapxz_input=NULL; Input2* sigmapyz_input=NULL;
 		if(dim==3){
-			sigmapzz_input=element->GetInput(DeviatoricStresszzEnum); _assert_(sigmapzz_input);
-			sigmapxz_input=element->GetInput(DeviatoricStressxzEnum); _assert_(sigmapxz_input);
-			sigmapyz_input=element->GetInput(DeviatoricStressyzEnum); _assert_(sigmapyz_input);
+			sigmapzz_input=element->GetInput2(DeviatoricStresszzEnum); _assert_(sigmapzz_input);
+			sigmapxz_input=element->GetInput2(DeviatoricStressxzEnum); _assert_(sigmapxz_input);
+			sigmapyz_input=element->GetInput2(DeviatoricStressyzEnum); _assert_(sigmapyz_input);
 		}
 
@@ -5470,7 +5476,7 @@
 			for(int i=0;i<3;i++) _assert_(!xIsNan<IssmDouble>(d_yy[i]));
 			for(int i=0;i<3;i++) _assert_(!xIsNan<IssmDouble>(d_xx[i]));
-			element->AddInput(StrainRatexxEnum,d_xx,P1DGEnum);
-			element->AddInput(StrainRateyyEnum,d_yy,P1DGEnum);
-			element->AddInput(StrainRatexyEnum,d_xy,P1DGEnum);
+			element->AddInput2(StrainRatexxEnum,d_xx,P1DGEnum);
+			element->AddInput2(StrainRateyyEnum,d_yy,P1DGEnum);
+			element->AddInput2(StrainRatexyEnum,d_xy,P1DGEnum);
 		}
 		else{
@@ -5485,10 +5491,10 @@
 			Matrix4x4Solve(&d_xz[0],Ke,pe_xz);
 			Matrix4x4Solve(&d_yz[0],Ke,pe_yz);
-			element->AddInput(StrainRatexxEnum,d_xx,P1DGEnum);
-			element->AddInput(StrainRateyyEnum,d_yy,P1DGEnum);
-			element->AddInput(StrainRatexyEnum,d_xy,P1DGEnum);
-			element->AddInput(StrainRatezzEnum,d_zz,P1DGEnum);
-			element->AddInput(StrainRatexzEnum,d_xz,P1DGEnum);
-			element->AddInput(StrainRateyzEnum,d_yz,P1DGEnum);
+			element->AddInput2(StrainRatexxEnum,d_xx,P1DGEnum);
+			element->AddInput2(StrainRateyyEnum,d_yy,P1DGEnum);
+			element->AddInput2(StrainRatexyEnum,d_xy,P1DGEnum);
+			element->AddInput2(StrainRatezzEnum,d_zz,P1DGEnum);
+			element->AddInput2(StrainRatexzEnum,d_xz,P1DGEnum);
+			element->AddInput2(StrainRateyzEnum,d_yz,P1DGEnum);
 		}
 
@@ -5527,29 +5533,29 @@
 		/*Get inputs and parameters*/
 		element->GetVerticesCoordinates(&xyz_list);
-		Input* vx_input=element->GetInput(VxEnum);                 _assert_(vx_input);
-		Input* vy_input=element->GetInput(VyEnum);                 _assert_(vy_input);
-		Input* vz_input=NULL;
-		if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);}
+		Input2* vx_input=element->GetInput2(VxEnum);                 _assert_(vx_input);
+		Input2* vy_input=element->GetInput2(VyEnum);                 _assert_(vy_input);
+		Input2* vz_input=NULL;
+		if(dim==3){vz_input=element->GetInput2(VzEnum); _assert_(vz_input);}
 
 		/*Get previous tau*/
-		Input* sigmapxx_input=element->GetInput(DeviatoricStressxxEnum); _assert_(sigmapxx_input);
-		Input* sigmapyy_input=element->GetInput(DeviatoricStressyyEnum); _assert_(sigmapyy_input);
-		Input* sigmapxy_input=element->GetInput(DeviatoricStressxyEnum); _assert_(sigmapxy_input);
-		Input* sigmapzz_input=NULL; Input* sigmapxz_input=NULL; Input* sigmapyz_input=NULL;
+		Input2* sigmapxx_input=element->GetInput2(DeviatoricStressxxEnum); _assert_(sigmapxx_input);
+		Input2* sigmapyy_input=element->GetInput2(DeviatoricStressyyEnum); _assert_(sigmapyy_input);
+		Input2* sigmapxy_input=element->GetInput2(DeviatoricStressxyEnum); _assert_(sigmapxy_input);
+		Input2* sigmapzz_input=NULL; Input2* sigmapxz_input=NULL; Input2* sigmapyz_input=NULL;
 		if(dim==3){
-			sigmapzz_input=element->GetInput(DeviatoricStresszzEnum); _assert_(sigmapzz_input);
-			sigmapxz_input=element->GetInput(DeviatoricStressxzEnum); _assert_(sigmapxz_input);
-			sigmapyz_input=element->GetInput(DeviatoricStressyzEnum); _assert_(sigmapyz_input);
+			sigmapzz_input=element->GetInput2(DeviatoricStresszzEnum); _assert_(sigmapzz_input);
+			sigmapxz_input=element->GetInput2(DeviatoricStressxzEnum); _assert_(sigmapxz_input);
+			sigmapyz_input=element->GetInput2(DeviatoricStressyzEnum); _assert_(sigmapyz_input);
 		}
 
 		/*Get NEW d*/
-		Input* epsxx_input=element->GetInput(StrainRatexxEnum); _assert_(epsxx_input);
-		Input* epsyy_input=element->GetInput(StrainRateyyEnum); _assert_(epsyy_input);
-		Input* epsxy_input=element->GetInput(StrainRatexyEnum); _assert_(epsxy_input);
-		Input* epszz_input=NULL; Input* epsxz_input=NULL; Input* epsyz_input=NULL;
+		Input2* epsxx_input=element->GetInput2(StrainRatexxEnum); _assert_(epsxx_input);
+		Input2* epsyy_input=element->GetInput2(StrainRateyyEnum); _assert_(epsyy_input);
+		Input2* epsxy_input=element->GetInput2(StrainRatexyEnum); _assert_(epsxy_input);
+		Input2* epszz_input=NULL; Input2* epsxz_input=NULL; Input2* epsyz_input=NULL;
 		if(dim==3){
-			epszz_input=element->GetInput(StrainRatezzEnum); _assert_(epszz_input);
-			epsxz_input=element->GetInput(StrainRatexzEnum); _assert_(epsxz_input);
-			epsyz_input=element->GetInput(StrainRateyzEnum); _assert_(epsyz_input);
+			epszz_input=element->GetInput2(StrainRatezzEnum); _assert_(epszz_input);
+			epsxz_input=element->GetInput2(StrainRatexzEnum); _assert_(epsxz_input);
+			epsyz_input=element->GetInput2(StrainRateyzEnum); _assert_(epsyz_input);
 		}
 
@@ -5620,11 +5626,11 @@
 
 		/*Add inputs*/
-		element->AddInput(DeviatoricStressxxEnum,tau_xx,P1DGEnum);
-		element->AddInput(DeviatoricStressyyEnum,tau_yy,P1DGEnum);
-		element->AddInput(DeviatoricStressxyEnum,tau_xy,P1DGEnum);
+		element->AddInput2(DeviatoricStressxxEnum,tau_xx,P1DGEnum);
+		element->AddInput2(DeviatoricStressyyEnum,tau_yy,P1DGEnum);
+		element->AddInput2(DeviatoricStressxyEnum,tau_xy,P1DGEnum);
 		if(dim==3){
-			element->AddInput(DeviatoricStresszzEnum,tau_zz,P1DGEnum);
-			element->AddInput(DeviatoricStressxzEnum,tau_xz,P1DGEnum);
-			element->AddInput(DeviatoricStressyzEnum,tau_yz,P1DGEnum);
+			element->AddInput2(DeviatoricStresszzEnum,tau_zz,P1DGEnum);
+			element->AddInput2(DeviatoricStressxzEnum,tau_xz,P1DGEnum);
+			element->AddInput2(DeviatoricStressyzEnum,tau_yz,P1DGEnum);
 		}
 
@@ -5752,5 +5758,5 @@
 
 	/*If on water or not FS, skip stiffness: */
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	if(element->IsFloating() || !element->IsOnBase()) return NULL;
 
@@ -5784,7 +5790,7 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_tria);
 	element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
-	Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
-	Input* vz_input=element->GetInput(VzEnum); _assert_(vz_input);
+	Input2* vx_input=element->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input=element->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* vz_input=element->GetInput2(VzEnum); _assert_(vz_input);
 
 	/*build friction object, used later on: */
@@ -5905,7 +5911,7 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
-	Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
-	Input* vz_input=element->GetInput(VzEnum); _assert_(vz_input);
+	Input2* vx_input=element->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input=element->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* vz_input=element->GetInput2(VzEnum); _assert_(vz_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -6092,6 +6098,6 @@
 	/* Get node coordinates and dof list: */
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* vx_input   =element->GetInput(VxEnum);       _assert_(vx_input);
-	Input* vy_input   =element->GetInput(VyEnum);       _assert_(vy_input);
+	Input2* vx_input   =element->GetInput2(VxEnum);       _assert_(vx_input);
+	Input2* vy_input   =element->GetInput2(VyEnum);       _assert_(vy_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -6245,11 +6251,11 @@
 	/*Initialize Element matrix*/
 	ElementMatrix* Ke=basaltria->NewElementMatrix(SSAApproximationEnum);
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* vx_input   =element->GetInput(VxEnum);       _assert_(vx_input);
-	Input* vy_input   =element->GetInput(VyEnum);       _assert_(vy_input);
-	Input* vz_input   =element->GetInput(VzEnum);       _assert_(vz_input);
+	Input2* vx_input   =element->GetInput2(VxEnum);       _assert_(vx_input);
+	Input2* vy_input   =element->GetInput2(VyEnum);       _assert_(vy_input);
+	Input2* vz_input   =element->GetInput2(VzEnum);       _assert_(vz_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -6326,5 +6332,5 @@
 	/*Initialize Element vector and return if necessary*/
 	if(!element->IsOnBase() || element->IsFloating()) return NULL;
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	if(approximation!=HOFSApproximationEnum) return NULL;
 
@@ -6351,8 +6357,8 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_tria);
 	element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
-	Input* vx_input=  element->GetInput(VxEnum);   _assert_(vx_input);
-	Input* vy_input=  element->GetInput(VyEnum);   _assert_(vy_input);
-	Input* vz_input=  element->GetInput(VzEnum);   _assert_(vz_input);
-	Input* vzHO_input=element->GetInput(VzHOEnum); _assert_(vzHO_input);
+	Input2* vx_input=  element->GetInput2(VxEnum);   _assert_(vx_input);
+	Input2* vy_input=  element->GetInput2(VyEnum);   _assert_(vy_input);
+	Input2* vz_input=  element->GetInput2(VzEnum);   _assert_(vz_input);
+	Input2* vzHO_input=element->GetInput2(VzHOEnum); _assert_(vzHO_input);
 
 	/*build friction object, used later on: */
@@ -6409,5 +6415,5 @@
 
 	/*Initialize Element vector and return if necessary*/
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	if(approximation!=HOFSApproximationEnum) return NULL;
 	int   vnumnodes = element->NumberofNodesVelocity();
@@ -6430,8 +6436,8 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
-	Input* vx_input   =element->GetInput(VxEnum);   _assert_(vx_input);
-	Input* vy_input   =element->GetInput(VyEnum);   _assert_(vy_input);
-	Input* vz_input   =element->GetInput(VzEnum);   _assert_(vz_input);
-	Input* vzHO_input=element->GetInput(VzHOEnum);  _assert_(vzHO_input);
+	Input2* vx_input   =element->GetInput2(VxEnum);   _assert_(vx_input);
+	Input2* vy_input   =element->GetInput2(VyEnum);   _assert_(vy_input);
+	Input2* vz_input   =element->GetInput2(VzEnum);   _assert_(vz_input);
+	Input2* vzHO_input=element->GetInput2(VzHOEnum);  _assert_(vzHO_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -6496,5 +6502,5 @@
 	/*Initialize Element vector and return if necessary*/
 	if(!element->IsOnBase() || element->IsFloating()) return NULL;
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	if(approximation!=SSAFSApproximationEnum) return NULL;
 	int vnumnodes = element->NumberofNodesVelocity();
@@ -6518,8 +6524,8 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_tria);
 	element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
-	Input* vx_input=   element->GetInput(VxEnum);    _assert_(vx_input);
-	Input* vy_input=   element->GetInput(VyEnum);    _assert_(vy_input);
-	Input* vz_input=   element->GetInput(VzEnum);    _assert_(vz_input);
-	Input* vzSSA_input=element->GetInput(VzSSAEnum); _assert_(vzSSA_input);
+	Input2* vx_input=   element->GetInput2(VxEnum);    _assert_(vx_input);
+	Input2* vy_input=   element->GetInput2(VyEnum);    _assert_(vy_input);
+	Input2* vz_input=   element->GetInput2(VzEnum);    _assert_(vz_input);
+	Input2* vzSSA_input=element->GetInput2(VzSSAEnum); _assert_(vzSSA_input);
 
 	/*build friction object, used later on: */
@@ -6575,5 +6581,5 @@
 
 	/*Initialize Element vector and return if necessary*/
-	element->GetInputValue(&approximation,ApproximationEnum);
+	element->GetInput2Value(&approximation,ApproximationEnum);
 	if(approximation!=SSAFSApproximationEnum) return NULL;
 	int vnumnodes = element->NumberofNodesVelocity();
@@ -6596,8 +6602,8 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
-	Input* vx_input   =element->GetInput(VxEnum);      _assert_(vx_input);
-	Input* vy_input   =element->GetInput(VyEnum);      _assert_(vy_input);
-	Input* vz_input   =element->GetInput(VzEnum);      _assert_(vz_input);
-	Input* vzSSA_input=element->GetInput(VzSSAEnum);   _assert_(vzSSA_input);
+	Input2* vx_input   =element->GetInput2(VxEnum);      _assert_(vx_input);
+	Input2* vy_input   =element->GetInput2(VyEnum);      _assert_(vy_input);
+	Input2* vz_input   =element->GetInput2(VzEnum);      _assert_(vz_input);
+	Input2* vzSSA_input=element->GetInput2(VzSSAEnum);   _assert_(vzSSA_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -7192,10 +7198,10 @@
 
 	/*Add vx and vy as inputs to element: */
-	element->AddInput(VxEnum,vx,P1Enum);
-	element->AddInput(VyEnum,vy,P1Enum);
-	element->AddInput(VzEnum,vz,P1Enum);
-	element->AddInput(VzFSEnum,vzFS,P1Enum);
-	element->AddInput(VelEnum,vel,P1Enum);
-	element->AddInput(PressureEnum,pressure,P1Enum);
+	element->AddInput2(VxEnum,vx,P1Enum);
+	element->AddInput2(VyEnum,vy,P1Enum);
+	element->AddInput2(VzEnum,vz,P1Enum);
+	element->AddInput2(VzFSEnum,vzFS,P1Enum);
+	element->AddInput2(VelEnum,vel,P1Enum);
+	//element->AddInput2(PressureEnum,pressure,P1Enum);
 
 	/*Free ressources:*/
@@ -7295,10 +7301,10 @@
 
 	/*Add vx and vy as inputs to element: */
-	element->AddInput(VxEnum,vx,P1Enum);
-	element->AddInput(VyEnum,vy,P1Enum);
-	element->AddInput(VzEnum,vz,P1Enum);
-	element->AddInput(VzFSEnum,vzFS,P1Enum);
-	element->AddInput(VelEnum,vel,P1Enum);
-	element->AddInput(PressureEnum,pressure,P1Enum);
+	element->AddInput2(VxEnum,vx,P1Enum);
+	element->AddInput2(VyEnum,vy,P1Enum);
+	element->AddInput2(VzEnum,vz,P1Enum);
+	element->AddInput2(VzFSEnum,vzFS,P1Enum);
+	element->AddInput2(VelEnum,vel,P1Enum);
+	//element->AddInput2(PressureEnum,pressure,P1Enum);
 
 	/*Free ressources:*/
@@ -7388,8 +7394,8 @@
 
 	/*Add vx and vy as inputs to element: */
-	element->AddInput(VxEnum,vx,P1Enum);
-	element->AddInput(VyEnum,vy,P1Enum);
-	element->AddInput(VelEnum,vel,P1Enum);
-	element->AddInput(PressureEnum,pressure,P1Enum);
+	element->AddInput2(VxEnum,vx,P1Enum);
+	element->AddInput2(VyEnum,vy,P1Enum);
+	element->AddInput2(VelEnum,vel,P1Enum);
+	element->AddInput2(PressureEnum,pressure,P1Enum);
 
 	/*Free ressources:*/
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp	(revision 24335)
@@ -107,5 +107,5 @@
 	return 2;
 }/*}}}*/
-void StressbalanceSIAAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void StressbalanceSIAAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Fetch data needed: */
@@ -127,25 +127,32 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
+			/*Need to know the type of approximation for this element*/
+			if(iomodel->Data("md.flowequation.element_equation")){
+				inputs2->SetInput(ApproximationEnum,counter,IoCodeToEnumElementEquation(reCast<int>(iomodel->Data("md.flowequation.element_equation")[i])));
+			}
 			counter++;
 		}
 	}
+
+	/*Free data: */
+	iomodel->DeleteData(1,"md.flowequation.element_equation");
 
 	/*Friction law variables*/
 	switch(frictionlaw){
 		case 1:
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
 			break;
 		case 2:
-			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.m",FrictionMEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.m",FrictionMEnum);
 			break;
 		case 6:
-			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.m",FrictionMEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.pressure",PressureEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.temperature",TemperatureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.m",FrictionMEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.pressure",PressureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.temperature",TemperatureEnum);
 			break;
 		default:
@@ -153,13 +160,11 @@
 	}
 
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
 	if(ismovingfront){
 		if(iomodel->domaintype!=Domain2DhorizontalEnum)
-			iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum); // required for updating active nodes
-	}
-
-	/*Free data: */
-	iomodel->DeleteData(1,"md.flowequation.element_equation");
+			iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum); // required for updating active nodes
+	}
+
 }/*}}}*/
 void StressbalanceSIAAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
@@ -321,13 +326,13 @@
 	IssmDouble  gravity    = element->FindParam(ConstantsGEnum);
 	IssmDouble  B,n;
-	Input* B_input         = element->GetInput(MaterialsRheologyBbarEnum);_assert_(B_input);
-	Input* n_input         = element->GetInput(MaterialsRheologyNEnum);   _assert_(n_input);
-	Input* slopex_input    = element->GetInput(SurfaceSlopeXEnum);        _assert_(slopex_input);
-	Input* slopey_input    = element->GetInput(SurfaceSlopeYEnum);        _assert_(slopey_input);
-	Input* thickness_input = element->GetInput(ThicknessEnum);            _assert_(thickness_input);
-	Input* surface_input   = element->GetInput(SurfaceEnum);              _assert_(surface_input);
-	Input* drag_input      = NULL;
+	Input2* B_input         = element->GetInput2(MaterialsRheologyBbarEnum);_assert_(B_input);
+	Input2* n_input         = element->GetInput2(MaterialsRheologyNEnum);   _assert_(n_input);
+	Input2* slopex_input    = element->GetInput2(SurfaceSlopeXEnum);        _assert_(slopex_input);
+	Input2* slopey_input    = element->GetInput2(SurfaceSlopeYEnum);        _assert_(slopey_input);
+	Input2* thickness_input = element->GetInput2(ThicknessEnum);            _assert_(thickness_input);
+	Input2* surface_input   = element->GetInput2(SurfaceEnum);              _assert_(surface_input);
+	Input2* drag_input      = NULL;
 	if(frictionlaw!=5 && frictionlaw!=1){
-		drag_input = element->GetInput(FrictionCoefficientEnum);  _assert_(drag_input);
+		drag_input = element->GetInput2(FrictionCoefficientEnum);  _assert_(drag_input);
 	}
 
@@ -411,14 +416,14 @@
 	IssmDouble  gravity    = element->FindParam(ConstantsGEnum);
 	IssmDouble B,n;
-	Input* B_input         = element->GetInput(MaterialsRheologyBEnum);   _assert_(B_input);
-	Input* n_input         = element->GetInput(MaterialsRheologyNEnum);   _assert_(n_input);
-	Input* surface_input   = element->GetInput(SurfaceEnum);              _assert_(surface_input);
-	Input* slopex_input    = element->GetInput(SurfaceSlopeXEnum);        _assert_(slopex_input);
-	Input* slopey_input    = element->GetInput(SurfaceSlopeYEnum);        _assert_(slopey_input);
-	Input* thickness_input = element->GetInput(ThicknessEnum);            _assert_(thickness_input);
-	Input* drag_input      = NULL;
+	Input2* B_input         = element->GetInput2(MaterialsRheologyBEnum);   _assert_(B_input);
+	Input2* n_input         = element->GetInput2(MaterialsRheologyNEnum);   _assert_(n_input);
+	Input2* surface_input   = element->GetInput2(SurfaceEnum);              _assert_(surface_input);
+	Input2* slopex_input    = element->GetInput2(SurfaceSlopeXEnum);        _assert_(slopex_input);
+	Input2* slopey_input    = element->GetInput2(SurfaceSlopeYEnum);        _assert_(slopey_input);
+	Input2* thickness_input = element->GetInput2(ThicknessEnum);            _assert_(thickness_input);
+	Input2* drag_input      = NULL;
 	Friction* friction     = NULL;
 	if(frictionlaw!=5 && frictionlaw!=1){
-		drag_input = element->GetInput(FrictionCoefficientEnum);  _assert_(drag_input);
+		drag_input = element->GetInput2(FrictionCoefficientEnum);  _assert_(drag_input);
 	}
 	else if(frictionlaw==5){
@@ -530,6 +535,6 @@
 	/*Get dof list and inputs */
 	element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
-	Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
+	Input2* vx_input=element->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input=element->GetInput2(VyEnum); _assert_(vy_input);
 
 	/*Ok, we have the velocities in inputs, fill in solution */
@@ -617,8 +622,8 @@
 
 	/*Add vx and vy as inputs to the tria element: */
-	element->AddInput(VxEnum,vx,P1Enum);
-	element->AddInput(VyEnum,vy,P1Enum);
-	element->AddInput(VelEnum,vel,P1Enum);
-	element->AddInput(PressureEnum,pressure,P1Enum);
+	element->AddInput2(VxEnum,vx,P1Enum);
+	element->AddInput2(VyEnum,vy,P1Enum);
+	element->AddInput2(VelEnum,vel,P1Enum);
+	element->AddInput2(PressureEnum,pressure,P1Enum);
 
 	/*Free ressources:*/
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp	(revision 24335)
@@ -86,5 +86,5 @@
 	return 1;
 }/*}}}*/
-void StressbalanceVerticalAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void StressbalanceVerticalAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*return if not 3d mesh*/
@@ -96,20 +96,20 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,P1Enum);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.surface",SurfaceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
-	}
-	iomodel->FetchDataToInput(elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
-	//iomodel->FetchDataToInput(elements,"md.smb.mass_balance",SmbMassBalanceEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+	}
+	iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.groundedice_melting_rate",BasalforcingsGroundediceMeltingRateEnum);
+	//iomodel->FetchDataToInput(inputs2,elements,"md.smb.mass_balance",SmbMassBalanceEnum);
 
 
@@ -119,5 +119,5 @@
 	switch(basalforcing_model){
 		case FloatingMeltRateEnum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.floatingice_melting_rate",BasalforcingsFloatingiceMeltingRateEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.floatingice_melting_rate",BasalforcingsFloatingiceMeltingRateEnum);
 			break;
 		case LinearFloatingMeltRateEnum:
@@ -128,23 +128,23 @@
 			break;
 		case SpatialLinearFloatingMeltRateEnum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsDeepwaterMeltingRateEnum);
-			iomodel->FetchDataToInput(elements,"md.basalforcings.deepwater_elevation",BasalforcingsDeepwaterElevationEnum);
-			iomodel->FetchDataToInput(elements,"md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.deepwater_melting_rate",BasalforcingsDeepwaterMeltingRateEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.deepwater_elevation",BasalforcingsDeepwaterElevationEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.upperwater_elevation",BasalforcingsUpperwaterElevationEnum);
 			break;
 		case BasalforcingsPicoEnum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.basin_id",BasalforcingsPicoBasinIdEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.basin_id",BasalforcingsPicoBasinIdEnum);
 			break;
 		case BasalforcingsIsmip6Enum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.basin_id",BasalforcingsIsmip6BasinIdEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.basin_id",BasalforcingsIsmip6BasinIdEnum);
 			break;
 		case BeckmannGoosseFloatingMeltRateEnum:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
-			iomodel->FetchDataToInput(elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
 			break;
 		default:
 			_error_("Basal forcing model "<<EnumToStringx(basalforcing_model)<<" not supported yet");
 	}
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum,0.);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum,0.);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum,0.);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum,0.);
 }/*}}}*/
 void StressbalanceVerticalAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
@@ -353,13 +353,13 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
 	element->GetInputValue(&approximation,ApproximationEnum);
-	Input* base_input=element->GetInput(BaseEnum);                                               _assert_(base_input);
-	Input* groundedice_input=element->GetInput(MaskGroundediceLevelsetEnum);                     _assert_(groundedice_input);
-	Input* groundedice_melting_input=element->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(groundedice_melting_input);
-	Input* floatingice_melting_input=element->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(floatingice_melting_input);
-	Input* vx_input=element->GetInput(VxEnum);                                                   _assert_(vx_input);
-	Input* vy_input=element->GetInput(VyEnum);                                                   _assert_(vy_input);
-	Input* vzFS_input=NULL;
+	Input2* base_input=element->GetInput2(BaseEnum);                                               _assert_(base_input);
+	Input2* groundedice_input=element->GetInput2(MaskGroundediceLevelsetEnum);                     _assert_(groundedice_input);
+	Input2* groundedice_melting_input=element->GetInput2(BasalforcingsGroundediceMeltingRateEnum); _assert_(groundedice_melting_input);
+	Input2* floatingice_melting_input=element->GetInput2(BasalforcingsFloatingiceMeltingRateEnum); _assert_(floatingice_melting_input);
+	Input2* vx_input=element->GetInput2(VxEnum);                                                   _assert_(vx_input);
+	Input2* vy_input=element->GetInput2(VyEnum);                                                   _assert_(vy_input);
+	Input2* vzFS_input=NULL;
 	if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
-		vzFS_input=element->GetInput(VzFSEnum);       _assert_(vzFS_input);
+		vzFS_input=element->GetInput2(VzFSEnum);       _assert_(vzFS_input);
 	}
 
@@ -419,11 +419,11 @@
 	element->GetVerticesCoordinatesTop(&xyz_list_surface);
 	element->GetInputValue(&approximation,ApproximationEnum);
-	Input* surface_input    =element->GetInput(SurfaceEnum);               _assert_(surface_input);
-	Input* smb_input=element->GetInput(SmbMassBalanceEnum);    _assert_(smb_input);
-	Input* vx_input=element->GetInput(VxEnum);                             _assert_(vx_input);
-	Input* vy_input=element->GetInput(VyEnum);                             _assert_(vy_input);
-	Input* vzFS_input=NULL;
+	Input2* surface_input    =element->GetInput2(SurfaceEnum);   _assert_(surface_input);
+	Input2* smb_input=element->GetInput2(SmbMassBalanceEnum);    _assert_(smb_input);
+	Input2* vx_input=element->GetInput2(VxEnum);                 _assert_(vx_input);
+	Input2* vy_input=element->GetInput2(VyEnum);                 _assert_(vy_input);
+	Input2* vzFS_input=NULL;
 	if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
-		vzFS_input=element->GetInput(VzFSEnum);       _assert_(vzFS_input);
+		vzFS_input=element->GetInput2(VzFSEnum); _assert_(vzFS_input);
 	}
 
@@ -474,9 +474,9 @@
 	element->GetVerticesCoordinates(&xyz_list);
 	element->GetInputValue(&approximation,ApproximationEnum);
-	Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
-	Input* vzFS_input=NULL;
+	Input2* vx_input=element->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input=element->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* vzFS_input=NULL;
 	if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
-		vzFS_input=element->GetInput(VzFSEnum); _assert_(vzFS_input);
+		vzFS_input=element->GetInput2(VzFSEnum); _assert_(vzFS_input);
 	}
 
@@ -561,7 +561,7 @@
 	/*Do some modifications if we actually have a HOFS or SSAFS element*/
 	if(approximation==HOFSApproximationEnum){
-		Input* vzFS_input=element->GetInput(VzFSEnum);
+		Input2* vzFS_input=element->GetInput2(VzFSEnum);
 		if (vzFS_input){
-			if (vzFS_input->ObjectEnum()!=PentaInputEnum) _error_("Cannot compute Vel as VzFS is of type " << EnumToStringx(vzFS_input->ObjectEnum()));
+			if (vzFS_input->ObjectEnum()!=PentaInput2Enum) _error_("Cannot compute Vel as VzFS is of type " << EnumToStringx(vzFS_input->ObjectEnum()));
 			element->GetInputListOnNodes(&vzFS[0],VzFSEnum,0.);
 		}
@@ -573,7 +573,7 @@
 	}
 	else if(approximation==SSAFSApproximationEnum){
-		Input* vzFS_input=element->GetInput(VzFSEnum);
+		Input2* vzFS_input=element->GetInput2(VzFSEnum);
 		if (vzFS_input){
-			if (vzFS_input->ObjectEnum()!=PentaInputEnum) _error_("Cannot compute Vel as VzFS is of type " << EnumToStringx(vzFS_input->ObjectEnum()));
+			if (vzFS_input->ObjectEnum()!=PentaInput2Enum) _error_("Cannot compute Vel as VzFS is of type " << EnumToStringx(vzFS_input->ObjectEnum()));
 			element->GetInputListOnNodes(&vzFS[0],VzFSEnum,0.);
 		}
@@ -597,14 +597,14 @@
 	}
 	if(approximation!=HOFSApproximationEnum && approximation!=SSAFSApproximationEnum){
-		element->AddInput(PressureEnum,pressure,element->GetElementType());
+		element->AddInput2(PressureEnum,pressure,element->GetElementType());
 	}
 	else if(approximation==HOFSApproximationEnum){
-		element->AddInput(VzHOEnum,vzHO,P1Enum);
+		element->AddInput2(VzHOEnum,vzHO,P1Enum);
 	}
 	else if(approximation==SSAFSApproximationEnum){
-		element->AddInput(VzSSAEnum,vzSSA,P1Enum);
-	}
-	element->AddInput(VzEnum,vz,P1Enum);
-	element->AddInput(VelEnum,vel,P1Enum);
+		element->AddInput2(VzSSAEnum,vzSSA,P1Enum);
+	}
+	element->AddInput2(VzEnum,vz,P1Enum);
+	element->AddInput2(VelEnum,vel,P1Enum);
 
 	/*Free ressources:*/
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 24335)
@@ -104,5 +104,5 @@
 	return 1;
 }/*}}}*/
-void ThermalAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void ThermalAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	int frictionlaw,basalforcing_model,materialstype;
@@ -119,5 +119,5 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
 			counter++;
 		}
@@ -130,41 +130,41 @@
 	iomodel->FindConstant(&materialstype,"md.materials.type");
 
-	iomodel->FetchDataToInput(elements,"md.geometry.thickness",ThicknessEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
-	iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
-	iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
-	iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
-	iomodel->FetchDataToInput(elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.thickness",ThicknessEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.surface",SurfaceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.geometry.base",BaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.slr.sealevel",SealevelEnum,0);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mask.groundedice_levelset",MaskGroundediceLevelsetEnum);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
-	}
-	iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
-	iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.pressure",PressureEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.temperature",TemperatureEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum);
-	iomodel->FetchDataToInput(elements,"md.initialization.vz",VzEnum);
-	InputUpdateFromConstantx(elements,0.,VxMeshEnum);
-	InputUpdateFromConstantx(elements,0.,VyMeshEnum);
-	InputUpdateFromConstantx(elements,0.,VzMeshEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+	}
+	iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.pressure",PressureEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.temperature",TemperatureEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vz",VzEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,VxMeshEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,VyMeshEnum);
+	InputUpdateFromConstantx(inputs2,elements,0.,VzMeshEnum);
 
 	/*Rheology type*/
-	iomodel->FetchDataToInput(elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
 	switch(materialstype){
 		case MatenhancediceEnum:
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_E",MaterialsRheologyEEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_E",MaterialsRheologyEEnum);
 			break;
 		case MatdamageiceEnum:
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
 			break;
 		case MatestarEnum:
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_Ec",MaterialsRheologyEcEnum);
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_Es",MaterialsRheologyEsEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_Ec",MaterialsRheologyEcEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_Es",MaterialsRheologyEsEnum);
 			break;
 		case MaticeEnum:
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
 			break;
 		default:
@@ -172,5 +172,5 @@
 	}
 	if(ismovingfront){
-		iomodel->FetchDataToInput(elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum); // required for updating active nodes
+		iomodel->FetchDataToInput(inputs2,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum); // required for updating active nodes
 	}
 	/*Basal forcings variables*/
@@ -180,5 +180,5 @@
 			break;
 		default:
-			iomodel->FetchDataToInput(elements,"md.basalforcings.geothermalflux",BasalforcingsGeothermalfluxEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.basalforcings.geothermalflux",BasalforcingsGeothermalfluxEnum);
 			break;
 	}
@@ -187,65 +187,65 @@
 		case 1:
 			iomodel->FindConstant(&FrictionCoupling,"md.friction.coupling");
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
 			if (FrictionCoupling==3){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
 			else if(FrictionCoupling==4){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",EffectivePressureEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",EffectivePressureEnum);
 			}
 			break;
 		case 2:
-			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.m",FrictionMEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.m",FrictionMEnum);
 			break;
 		case 3:
 			iomodel->FindConstant(&FrictionCoupling,"md.friction.coupling");
-			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.As",FrictionAsEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.As",FrictionAsEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
 			if (FrictionCoupling==3){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
 			else if(FrictionCoupling==4){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",EffectivePressureEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",EffectivePressureEnum);
 			}
 			break;
 		case 4:
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.pressure",PressureEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.temperature",TemperatureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.pressure",PressureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.temperature",TemperatureEnum);
 			iomodel->FindConstant(&FrictionCoupling,"md.friction.coupling");
 			break;
 		case 5:
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.water_layer",FrictionWaterLayerEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.water_layer",FrictionWaterLayerEnum);
 			break;
 		case 6:
-			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.m",FrictionMEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.pressure",PressureEnum);
-			iomodel->FetchDataToInput(elements,"md.initialization.temperature",TemperatureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.m",FrictionMEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.pressure",PressureEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.initialization.temperature",TemperatureEnum);
 			break;
 		case 7:
 			iomodel->FindConstant(&FrictionCoupling,"md.friction.coupling");
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.coefficientcoulomb",FrictionCoefficientcoulombEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.p",FrictionPEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.q",FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficientcoulomb",FrictionCoefficientcoulombEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.p",FrictionPEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.q",FrictionQEnum);
 			if (FrictionCoupling==3){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);}
 			else if(FrictionCoupling==4){
-				iomodel->FetchDataToInput(elements,"md.friction.effective_pressure",EffectivePressureEnum);
+				iomodel->FetchDataToInput(inputs2,elements,"md.friction.effective_pressure",EffectivePressureEnum);
 			}
 			break;
 		case 9:
-			iomodel->FetchDataToInput(elements,"md.friction.coefficient",FrictionCoefficientEnum);
-			iomodel->FetchDataToInput(elements,"md.friction.pressure_adjusted_temperature",FrictionPressureAdjustedTemperatureEnum);
-			InputUpdateFromConstantx(elements,1.,FrictionPEnum);
-			InputUpdateFromConstantx(elements,1.,FrictionQEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.coefficient",FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.friction.pressure_adjusted_temperature",FrictionPressureAdjustedTemperatureEnum);
+			InputUpdateFromConstantx(inputs2,elements,1.,FrictionPEnum);
+			InputUpdateFromConstantx(inputs2,elements,1.,FrictionQEnum);
 			break;
 		default:
@@ -338,10 +338,10 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
 	element->FindParam(&dt,TimesteppingTimeStepEnum);
-	IssmDouble  gravity             = element->FindParam(ConstantsGEnum);
-	IssmDouble  rho_water           = element->FindParam(MaterialsRhoSeawaterEnum);
-	IssmDouble  rho_ice             = element->FindParam(MaterialsRhoIceEnum);
-	IssmDouble  heatcapacity        = element->FindParam(MaterialsHeatcapacityEnum);
-	IssmDouble  mixed_layer_capacity= element->FindParam(MaterialsMixedLayerCapacityEnum);
-	IssmDouble  thermal_exchange_vel= element->FindParam(MaterialsThermalExchangeVelocityEnum);
+	IssmDouble gravity             = element->FindParam(ConstantsGEnum);
+	IssmDouble rho_water           = element->FindParam(MaterialsRhoSeawaterEnum);
+	IssmDouble rho_ice             = element->FindParam(MaterialsRhoIceEnum);
+	IssmDouble heatcapacity        = element->FindParam(MaterialsHeatcapacityEnum);
+	IssmDouble mixed_layer_capacity= element->FindParam(MaterialsMixedLayerCapacityEnum);
+	IssmDouble thermal_exchange_vel= element->FindParam(MaterialsThermalExchangeVelocityEnum);
 
 	/* Start  looping on the number of gaussian points: */
@@ -401,10 +401,10 @@
 	IssmDouble  thermalconductivity = element->FindParam(MaterialsThermalconductivityEnum);
 	IssmDouble  kappa = thermalconductivity/(rho_ice*heatcapacity);
-	Input* vx_input  = element->GetInput(VxEnum);     _assert_(vx_input);
-	Input* vy_input  = element->GetInput(VyEnum);     _assert_(vy_input);
-	Input* vz_input  = element->GetInput(VzEnum);     _assert_(vz_input);
-	Input* vxm_input = element->GetInput(VxMeshEnum); _assert_(vxm_input);
-	Input* vym_input = element->GetInput(VyMeshEnum); _assert_(vym_input);
-	Input* vzm_input = element->GetInput(VzMeshEnum); _assert_(vzm_input);
+	Input2* vx_input  = element->GetInput2(VxEnum);     _assert_(vx_input);
+	Input2* vy_input  = element->GetInput2(VyEnum);     _assert_(vy_input);
+	Input2* vz_input  = element->GetInput2(VzEnum);     _assert_(vz_input);
+	Input2* vxm_input = element->GetInput2(VxMeshEnum); _assert_(vxm_input);
+	Input2* vym_input = element->GetInput2(VyMeshEnum); _assert_(vym_input);
+	Input2* vzm_input = element->GetInput2(VzMeshEnum); _assert_(vzm_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -551,8 +551,8 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
 	element->FindParam(&dt,TimesteppingTimeStepEnum);
-	Input* vx_input             = element->GetInput(VxEnum);                          _assert_(vx_input);
-	Input* vy_input             = element->GetInput(VyEnum);                          _assert_(vy_input);
-	Input* vz_input             = element->GetInput(VzEnum);                          _assert_(vz_input);
-	Input* geothermalflux_input = element->GetInput(BasalforcingsGeothermalfluxEnum); _assert_(geothermalflux_input);
+	Input2* vx_input             = element->GetInput2(VxEnum);                          _assert_(vx_input);
+	Input2* vy_input             = element->GetInput2(VyEnum);                          _assert_(vy_input);
+	Input2* vz_input             = element->GetInput2(VzEnum);                          _assert_(vz_input);
+	Input2* geothermalflux_input = element->GetInput2(BasalforcingsGeothermalfluxEnum); _assert_(geothermalflux_input);
 	IssmDouble  rho_ice             = element->FindParam(MaterialsRhoIceEnum);
 	IssmDouble  heatcapacity        = element->FindParam(MaterialsHeatcapacityEnum);
@@ -612,5 +612,5 @@
 	element->GetVerticesCoordinatesBase(&xyz_list_base);
 	element->FindParam(&dt,TimesteppingTimeStepEnum);
-	Input*      pressure_input=element->GetInput(PressureEnum); _assert_(pressure_input);
+	Input2*      pressure_input=element->GetInput2(PressureEnum); _assert_(pressure_input);
 	IssmDouble  gravity             = element->FindParam(ConstantsGEnum);
 	IssmDouble  rho_water           = element->FindParam(MaterialsRhoSeawaterEnum);
@@ -674,9 +674,9 @@
 	element->FindParam(&dt,TimesteppingTimeStepEnum);
 	element->FindParam(&stabilization,ThermalStabilizationEnum);
-	Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
-	Input* vz_input=element->GetInput(VzEnum); _assert_(vz_input);
-	Input* temperature_input = NULL;
-	if(reCast<bool,IssmDouble>(dt)){temperature_input = element->GetInput(TemperatureEnum); _assert_(temperature_input);}
+	Input2* vx_input=element->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input=element->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* vz_input=element->GetInput2(VzEnum); _assert_(vz_input);
+	Input2* temperature_input = NULL;
+	if(reCast<bool,IssmDouble>(dt)){temperature_input = element->GetInput2(TemperatureEnum); _assert_(temperature_input);}
 
 	/* Start  looping on the number of gaussian points: */
@@ -873,5 +873,5 @@
 	element->GetInputValue(&converged,ConvergedEnum);
 	if(converged){
-		element->AddInput(TemperatureEnum,values,element->GetElementType());
+		element->AddInput2(TemperatureEnum,values,element->GetElementType());
 
 		IssmDouble* n = xNew<IssmDouble>(numnodes);
@@ -894,26 +894,26 @@
 			case BuddJackaEnum:
 				for(i=0;i<numnodes;i++) B[i]=BuddJacka(values[i]);
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],element->GetElementType());
 				break;
 			case CuffeyEnum:
 				for(i=0;i<numnodes;i++) B[i]=Cuffey(values[i]);
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],element->GetElementType());
 				break;
 			case PatersonEnum:
 				for(i=0;i<numnodes;i++) B[i]=Paterson(values[i]);
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],element->GetElementType());
 				break;
 			case NyeH2OEnum:
 				for(i=0;i<numnodes;i++) B[i]=NyeH2O(values[i]);
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],element->GetElementType());
 				break; 
 			case NyeCO2Enum:
 				for(i=0;i<numnodes;i++) B[i]=NyeCO2(values[i]);
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],element->GetElementType());
 				break;
 			case ArrheniusEnum:{
 				element->GetVerticesCoordinates(&xyz_list);
 				for(i=0;i<numnodes;i++) B[i]=Arrhenius(values[i],surface[i]-xyz_list[i*3+2],n[i]);
-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+				element->AddInput2(MaterialsRheologyBEnum,&B[0],element->GetElementType());
 				break;
 				}
@@ -924,5 +924,5 @@
 	}
 	else{
-		element->AddInput(TemperaturePicardEnum,values,element->GetElementType());
+		element->AddInput2(TemperaturePicardEnum,values,element->GetElementType());
 	}
 
Index: /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp	(revision 24335)
@@ -27,5 +27,5 @@
 	return 1;
 }/*}}}*/
-void UzawaPressureAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+void UzawaPressureAnalysis::UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
 	/*Update elements: */
@@ -42,14 +42,14 @@
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+			element->Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
 			counter++;
 		}
 	}
 
-	iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum,0.);
-	iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum,0.);
-	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchDataToInput(elements,"md.initialization.vz",VzEnum,0.);
-	iomodel->FetchDataToInput(elements,"md.initialization.pressure",PressureEnum,0.);
-	InputUpdateFromConstantx(elements,0.,SigmaNNEnum);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vx",VxEnum,0.);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vy",VyEnum,0.);
+	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchDataToInput(inputs2,elements,"md.initialization.vz",VzEnum,0.);
+	iomodel->FetchDataToInput(inputs2,elements,"md.initialization.pressure",PressureEnum,0.);
+	InputUpdateFromConstantx(inputs2,elements,0.,SigmaNNEnum);
 }/*}}}*/
 void UzawaPressureAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
@@ -130,8 +130,8 @@
 	IssmDouble*    dvz   = xNew<IssmDouble>(dim);
 
-	Input* vx_input=element->GetInput(VxEnum);     _assert_(vx_input);
-	Input* vy_input=element->GetInput(VyEnum);     _assert_(vy_input);
-	Input* vz_input = NULL;
-	if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);}
+	Input2* vx_input=element->GetInput2(VxEnum);     _assert_(vx_input);
+	Input2* vy_input=element->GetInput2(VyEnum);     _assert_(vy_input);
+	Input2* vz_input = NULL;
+	if(dim==3){vz_input=element->GetInput2(VzEnum); _assert_(vz_input);}
 
 	Gauss* gauss = element->NewGauss(5);
@@ -209,8 +209,8 @@
 	IssmDouble* valueslambda  = xNewZeroInit<IssmDouble>(numnodessigma);
 	IssmDouble* pressure      = xNew<IssmDouble>(numnodes);
-	Input* vx_input           = element->GetInput(VxEnum);      _assert_(vx_input);
-	Input* vy_input           = element->GetInput(VyEnum);      _assert_(vy_input);
-	Input* vz_input           = NULL;
-	if(dim==3){vz_input       = element->GetInput(VzEnum);      _assert_(vz_input);}
+	Input2* vx_input           = element->GetInput2(VxEnum);      _assert_(vx_input);
+	Input2* vy_input           = element->GetInput2(VyEnum);      _assert_(vy_input);
+	Input2* vz_input           = NULL;
+	if(dim==3){vz_input       = element->GetInput2(VzEnum);      _assert_(vz_input);}
 	element->GetInputListOnNodes(&pressure[0],PressureEnum);
 
@@ -219,9 +219,9 @@
 		values[i]  = pressure[i] + solution[doflist[i]];
 	}
-	element->AddInput(PressureEnum,values,element->GetElementType());
+	element->AddInput2(PressureEnum,values,element->GetElementType());
 
 	/*Now compute sigmann if on base*/
 	if(element->IsOnBase() && 0){ 
-		Input* sigmann_input      = element->GetInput(SigmaNNEnum); _assert_(sigmann_input);
+		Input2* sigmann_input      = element->GetInput2(SigmaNNEnum); _assert_(sigmann_input);
 		if(dim==3) _error_("not implemented yet");
 
@@ -234,5 +234,5 @@
 		IssmDouble  deltalambda[3] = {0.0};
 		IssmDouble* vertexonbase  = xNew<IssmDouble>(numnodessigma);
-		Input* vertexonbase_input = element->GetInput(MeshVertexonbaseEnum); _assert_(vertexonbase_input);
+		Input2* vertexonbase_input = element->GetInput2(MeshVertexonbaseEnum); _assert_(vertexonbase_input);
 		Gauss* gauss = element->NewGauss();
 
@@ -288,5 +288,5 @@
 		xDelete<IssmDouble>(basis);
 
-		element->AddInput(SigmaNNEnum,valueslambda,P2Enum);
+		element->AddInput2(SigmaNNEnum,valueslambda,P2Enum);
 	}
 
Index: /issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.h	(revision 24335)
@@ -17,5 +17,5 @@
 		void CreateNodes(Nodes* nodes,IoModel* iomodel,bool isamr=false);
 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+		void UpdateElements(Elements* elements,Inputs2* inputs2,IoModel* iomodel,int analysis_counter,int analysis_type);
 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
 
Index: /issm/trunk-jpl/src/c/classes/Cfdragcoeffabsgrad.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Cfdragcoeffabsgrad.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Cfdragcoeffabsgrad.cpp	(revision 24335)
@@ -22,4 +22,5 @@
 #include "../classes/Inputs/Input.h"
 #include "../classes/gauss/Gauss.h"
+#include "./Inputs2/DatasetInput2.h"
 /*}}}*/
 
@@ -151,11 +152,6 @@
 
 	/*Get input if it already exists*/
-	Input*  tempinput = basalelement->GetInput(definitionenum);
-	/*Cast it to a Datasetinput*/
-	if(tempinput->ObjectEnum()!=DatasetInputEnum) _error_("don't know what to do! confused!");
-	DatasetInput* datasetinput = (DatasetInput*)tempinput;
-
-	/*Get the drag from the model*/
-	Input* drag_input=basalelement->GetInput(FrictionCoefficientEnum);	_assert_(drag_input);
+	DatasetInput2 *datasetinput = basalelement->GetDatasetInput2(definitionenum);  _assert_(datasetinput);
+	Input2        *drag_input   = basalelement->GetInput2(FrictionCoefficientEnum); _assert_(drag_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/classes/Cfsurfacelogvel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Cfsurfacelogvel.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Cfsurfacelogvel.cpp	(revision 24335)
@@ -22,4 +22,5 @@
 #include "../classes/Inputs/Input.h"
 #include "../classes/gauss/Gauss.h"
+#include "./Inputs2/DatasetInput2.h"
 /*}}}*/
 
@@ -162,16 +163,12 @@
 
 	/*Get model values*/
-	Input* vx_input     =topelement->GetInput(VxEnum);                                 _assert_(vx_input);
-	Input* vy_input	  =NULL;
+	Input2 *vx_input = topelement->GetInput2(VxEnum); _assert_(vx_input);
+	Input2 *vy_input = NULL;
 	if(numcomponents==2){
-	      vy_input    =topelement->GetInput(VyEnum);							              _assert_(vy_input);
+	      vy_input = topelement->GetInput2(VyEnum); _assert_(vy_input);
 	}
 
 	/*Retrieve all inputs we will be needing: */
-	DatasetInput*    datasetinput = NULL;
-	Input*  tempinput = topelement->GetInput(definitionenum);
-	/*Cast it to a Datasetinput*/
-	if(tempinput->ObjectEnum()!=DatasetInputEnum) _error_("don't know what to do");
-	datasetinput = (DatasetInput*)tempinput;
+	DatasetInput2 *datasetinput = topelement->GetDatasetInput2(definitionenum); _assert_(datasetinput);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/classes/Cfsurfacesquare.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Cfsurfacesquare.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Cfsurfacesquare.cpp	(revision 24335)
@@ -22,4 +22,5 @@
 #include "../classes/Inputs/Input.h"
 #include "../classes/gauss/Gauss.h"
+#include "./Inputs2/DatasetInput2.h"
 /*}}}*/
 
@@ -167,17 +168,6 @@
 
 	/*Retrieve all inputs we will be needing: */
-
-	DatasetInput*    datasetinput = NULL;
-
-	/*Get input if it already exists*/
-	Input*  tempinput = topelement->GetInput(definitionenum);
-
-	/*Cast it to a Datasetinput*/
-	if(tempinput->ObjectEnum()!=DatasetInputEnum) _error_("don't know what to do");
-	datasetinput = (DatasetInput*)tempinput;
-
-	Input* model_input=topelement->GetInput(model_enum);												_assert_(model_input);
-	//Input* observation_input=topelement->GetInput(observation_enum);								_assert_(observation_input);
-	//Input* weights_input     =topelement->GetInput(weights_enum);									_assert_(weights_input);
+	DatasetInput2 *datasetinput = topelement->GetDatasetInput2(definitionenum); _assert_(datasetinput);
+	Input2        *model_input  = topelement->GetInput2(model_enum);            _assert_(model_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 24335)
@@ -15,4 +15,9 @@
 #include "../../shared/shared.h"
 #include "../../modules/SurfaceMassBalancex/SurfaceMassBalancex.h"
+#include "../Inputs2/BoolInput2.h"
+#include "../Inputs2/TransientInput2.h"
+#include "../Inputs2/ElementInput2.h"
+#include "../Inputs2/DatasetInput2.h"
+#include "../Inputs2/ArrayInput2.h"
 /*}}}*/
 
@@ -28,5 +33,7 @@
 	this->id  = -1;
 	this->sid = -1;
+	this->lid = -1;
 	this->inputs     = NULL;
+	this->inputs2    = NULL;
 	this->nodes      = NULL;
 	this->vertices   = NULL;
@@ -60,8 +67,8 @@
 	this->GetVerticesCoordinates(&xyz_list);
 	parameters->FindParam(&dim,DomainDimensionEnum);
-	Input* vx_input=this->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input=this->GetInput(VyEnum); _assert_(vy_input);
-	Input* vz_input=NULL;
-	if(dim==3){vz_input=this->GetInput(VzEnum); _assert_(vz_input);}
+	Input2* vx_input=this->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input=this->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* vz_input=NULL;
+	if(dim==3){vz_input=this->GetInput2(VzEnum); _assert_(vz_input);}
 
 	/*Allocate arrays*/
@@ -122,5 +129,5 @@
 
 	/*Add Stress tensor components into inputs*/
-	this->AddInput(LambdaSEnum,lambdas,P1Enum);
+	this->AddInput2(LambdaSEnum,lambdas,P1Enum);
 
 	/*Clean up and return*/
@@ -148,14 +155,14 @@
 
 	/* Retrieve inputs */
-	Input* eps_xx_input=this->GetInput(StrainRatexxEnum); _assert_(eps_xx_input);
-	Input* eps_yy_input=this->GetInput(StrainRateyyEnum); _assert_(eps_yy_input);
-	Input* eps_xy_input=this->GetInput(StrainRatexyEnum); _assert_(eps_xy_input);
-	Input* eps_xz_input=NULL;
-	Input* eps_yz_input=NULL;
-	Input* eps_zz_input=NULL;
+	Input2* eps_xx_input=this->GetInput2(StrainRatexxEnum); _assert_(eps_xx_input);
+	Input2* eps_yy_input=this->GetInput2(StrainRateyyEnum); _assert_(eps_yy_input);
+	Input2* eps_xy_input=this->GetInput2(StrainRatexyEnum); _assert_(eps_xy_input);
+	Input2* eps_xz_input=NULL;
+	Input2* eps_yz_input=NULL;
+	Input2* eps_zz_input=NULL;
 	if(dim==3){
-		eps_xz_input=this->GetInput(StrainRatexzEnum); _assert_(eps_xz_input);
-		eps_yz_input=this->GetInput(StrainRateyzEnum); _assert_(eps_yz_input);
-		eps_zz_input=this->GetInput(StrainRatezzEnum); _assert_(eps_zz_input);
+		eps_xz_input=this->GetInput2(StrainRatexzEnum); _assert_(eps_xz_input);
+		eps_yz_input=this->GetInput2(StrainRateyzEnum); _assert_(eps_yz_input);
+		eps_zz_input=this->GetInput2(StrainRatezzEnum); _assert_(eps_zz_input);
 	}
 
@@ -165,16 +172,16 @@
 
 	/* Retrieve domain-dependent inputs */
-	Input* n_input=this->GetInput(MaterialsRheologyNEnum); _assert_(n_input);
-	Input* damage_input = NULL;
-	Input* B_input = NULL;
+	Input2* n_input=this->GetInput2(MaterialsRheologyNEnum); _assert_(n_input);
+	Input2* damage_input = NULL;
+	Input2* B_input = NULL;
 	int domaintype;
 	parameters->FindParam(&domaintype,DomainTypeEnum);
 	if(domaintype==Domain2DhorizontalEnum){
-		damage_input = this->GetInput(DamageDbarEnum);  _assert_(damage_input);
-		B_input=this->GetInput(MaterialsRheologyBbarEnum); _assert_(B_input);
+		damage_input = this->GetInput2(DamageDbarOldEnum);  _assert_(damage_input);
+		B_input=this->GetInput2(MaterialsRheologyBbarEnum); _assert_(B_input);
 	}
 	else{
-		damage_input = this->GetInput(DamageDEnum);   _assert_(damage_input);
-		B_input=this->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
+		damage_input = this->GetInput2(DamageDOldEnum);   _assert_(damage_input);
+		B_input=this->GetInput2(MaterialsRheologyBEnum); _assert_(B_input);
 	}
 
@@ -217,10 +224,10 @@
 
 	/* Add new damage input to DamageEnum and NewDamageEnum */
-	this->AddInput(NewDamageEnum,newD,this->GetElementType());
+	this->AddInput2(NewDamageEnum,newD,P1DGEnum);
 	if(domaintype==Domain2DhorizontalEnum){
-		this->AddInput(DamageDbarEnum,newD,this->GetElementType());
+		this->AddInput2(DamageDbarEnum,newD,this->GetElementType());
 	}
 	else{
-		this->AddInput(DamageDEnum,newD,this->GetElementType());
+		this->AddInput2(DamageDEnum,newD,this->GetElementType());
 	}
 
@@ -240,8 +247,8 @@
 	this->GetVerticesCoordinates(&xyz_list);
 	parameters->FindParam(&dim,DomainDimensionEnum);
-	Input* vx_input=this->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input=this->GetInput(VyEnum); _assert_(vy_input);
-	Input* vz_input=NULL;
-	if(dim==3){vz_input=this->GetInput(VzEnum); _assert_(vz_input);}
+	Input2* vx_input=this->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input=this->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* vz_input=NULL;
+	if(dim==3){vz_input=this->GetInput2(VzEnum); _assert_(vz_input);}
 
 	/*Allocate arrays*/
@@ -289,11 +296,11 @@
 
 	/*Add Stress tensor components into inputs*/
-	this->AddInput(StrainRatexxEnum,eps_xx,P1Enum);
-	this->AddInput(StrainRatexyEnum,eps_xy,P1Enum);
-	this->AddInput(StrainRatexzEnum,eps_xz,P1Enum);
-	this->AddInput(StrainRateyyEnum,eps_yy,P1Enum);
-	this->AddInput(StrainRateyzEnum,eps_yz,P1Enum);
-	this->AddInput(StrainRatezzEnum,eps_zz,P1Enum);
-	this->AddInput(StrainRateeffectiveEnum,eps_ef,P1Enum);
+	this->AddInput2(StrainRatexxEnum,eps_xx,P1Enum);
+	this->AddInput2(StrainRatexyEnum,eps_xy,P1Enum);
+	this->AddInput2(StrainRatexzEnum,eps_xz,P1Enum);
+	this->AddInput2(StrainRateyyEnum,eps_yy,P1Enum);
+	this->AddInput2(StrainRateyzEnum,eps_yz,P1Enum);
+	this->AddInput2(StrainRatezzEnum,eps_zz,P1Enum);
+	this->AddInput2(StrainRateeffectiveEnum,eps_ef,P1Enum);
 
 	/*Clean up and return*/
@@ -389,4 +396,5 @@
 	_printf_("   id : "<<this->id <<"\n");
 	_printf_("   sid: "<<this->sid<<"\n");
+	_printf_("   lid: "<<this->lid<<"\n");
 	if(vertices){
 		const int NUM_VERTICES = this->GetNumberOfVertices();
@@ -429,8 +437,9 @@
 	if(!IsOnBase()) return;
 
-	const int NUM_VERTICES 					= this->GetNumberOfVertices();
+	const int NUM_VERTICES = this->GetNumberOfVertices();
 	const int NUM_VERTICES_MONTHS_PER_YEAR	= NUM_VERTICES * 12;
 
 	int        i;
+	int*        vertexlids=xNew<int>(NUM_VERTICES);
 	IssmDouble* monthlytemperatures=xNew<IssmDouble>(NUM_VERTICES_MONTHS_PER_YEAR);
 	IssmDouble* monthlyprec=xNew<IssmDouble>(NUM_VERTICES_MONTHS_PER_YEAR);
@@ -439,26 +448,27 @@
 	IssmDouble* PrecipitationsPresentday=xNew<IssmDouble>(NUM_VERTICES_MONTHS_PER_YEAR);
 	IssmDouble* tmp=xNew<IssmDouble>(NUM_VERTICES);
-	IssmDouble Delta18oPresent,Delta18oLgm,Delta18oTime;
-	IssmDouble Delta18oSurfacePresent,Delta18oSurfaceLgm,Delta18oSurfaceTime;
-	IssmDouble time,yts,finaltime,time_yr;
 
 	/*Recover parameters*/
+	IssmDouble time,yts,finaltime;
 	this->parameters->FindParam(&time,TimeEnum);
 	this->parameters->FindParam(&yts,ConstantsYtsEnum);
 	this->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
-	time_yr=floor(time/yts)*yts;
-
-	/*Recover present day temperature and precipitation*/
-	Input* input=this->inputs->GetInput(SmbTemperaturesPresentdayEnum);    _assert_(input);
-	Input* input2=this->inputs->GetInput(SmbTemperaturesLgmEnum);          _assert_(input2);
-	Input* input3=this->inputs->GetInput(SmbPrecipitationsPresentdayEnum); _assert_(input3);
+	this->GetVerticesLidList(vertexlids);
+	IssmDouble time_yr=floor(time/yts)*yts;
+
 	/*loop over vertices: */
 	Gauss* gauss=this->NewGauss();
 	for(int month=0;month<12;month++){
+
+		/*Recover present day temperature and precipitation*/
+		Input2* input1=this->GetInput2(SmbTemperaturesPresentdayEnum,month/12.*yts);   _assert_(input1);
+		Input2* input2=this->GetInput2(SmbTemperaturesLgmEnum,month/12.*yts);          _assert_(input2);
+		Input2* input3=this->GetInput2(SmbPrecipitationsPresentdayEnum,month/12.*yts); _assert_(input3);
+
 		for(int iv=0;iv<NUM_VERTICES;iv++){
 			gauss->GaussVertex(iv);
-			input->GetInputValue(&TemperaturesPresentday[iv*12+month],gauss,month/12.*yts);
-			input2->GetInputValue(&TemperaturesLgm[iv*12+month],gauss,month/12.*yts);
-			input3->GetInputValue(&PrecipitationsPresentday[iv*12+month],gauss,month/12.*yts);
+			input1->GetInputValue(&TemperaturesPresentday[iv*12+month],gauss);
+			input2->GetInputValue(&TemperaturesLgm[iv*12+month],gauss);
+			input3->GetInputValue(&PrecipitationsPresentday[iv*12+month],gauss);
 
 			PrecipitationsPresentday[iv*12+month]=PrecipitationsPresentday[iv*12+month]*yts;
@@ -467,4 +477,6 @@
 
 	/*Recover delta18o and Delta18oSurface at present day, lgm and at time t*/
+	IssmDouble Delta18oPresent,Delta18oLgm,Delta18oTime;
+	IssmDouble Delta18oSurfacePresent,Delta18oSurfaceLgm,Delta18oSurfaceTime;
 	this->parameters->FindParam(&Delta18oPresent,SmbDelta18oEnum,finaltime);
 	this->parameters->FindParam(&Delta18oLgm,SmbDelta18oEnum,(finaltime-(21000*yts)));
@@ -484,27 +496,18 @@
 
 	/*Update inputs*/
-	TransientInput* NewTemperatureInput = new TransientInput(SmbMonthlytemperaturesEnum);
-	TransientInput* NewPrecipitationInput = new TransientInput(SmbPrecipitationEnum);
 	for (int imonth=0;imonth<12;imonth++) {
 		for(i=0;i<NUM_VERTICES;i++) tmp[i]=monthlytemperatures[i*12+imonth];
 		switch(this->ObjectEnum()){
-			case TriaEnum:  NewTemperatureInput->AddTimeInput(new TriaInput(SmbMonthlytemperaturesEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
-			case PentaEnum: NewTemperatureInput->AddTimeInput(new PentaInput(SmbMonthlytemperaturesEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
-			case TetraEnum: NewTemperatureInput->AddTimeInput(new TetraInput(SmbMonthlytemperaturesEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
+			case TriaEnum: this->inputs2->SetTriaDatasetInput(SmbMonthlytemperaturesEnum,imonth,P1Enum,NUM_VERTICES,vertexlids,tmp); break;
+			case PentaEnum: this->inputs2->SetPentaDatasetInput(SmbMonthlytemperaturesEnum,imonth,P1Enum,NUM_VERTICES,vertexlids,tmp); break;
 			default: _error_("Not implemented yet");
 		}
 		for(i=0;i<NUM_VERTICES;i++) tmp[i]=monthlyprec[i*12+imonth]/yts;
 		switch(this->ObjectEnum()){
-			case TriaEnum:  NewPrecipitationInput->AddTimeInput(new TriaInput(SmbPrecipitationEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
-			case PentaEnum: NewPrecipitationInput->AddTimeInput(new PentaInput(SmbPrecipitationEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
-			case TetraEnum: NewPrecipitationInput->AddTimeInput(new TetraInput(SmbPrecipitationEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
+			case TriaEnum: this->inputs2->SetTriaDatasetInput(SmbPrecipitationEnum,imonth,P1Enum,NUM_VERTICES,vertexlids,tmp); break;
+			case PentaEnum: this->inputs2->SetPentaDatasetInput(SmbPrecipitationEnum,imonth,P1Enum,NUM_VERTICES,vertexlids,tmp); break;
 			default: _error_("Not implemented yet");
 		}
 	}
-	NewTemperatureInput->Configure(this->parameters);
-	NewPrecipitationInput->Configure(this->parameters);
-
-	this->inputs->AddInput(NewTemperatureInput);
-	this->inputs->AddInput(NewPrecipitationInput);
 
 	switch(this->ObjectEnum()){
@@ -512,6 +515,6 @@
 		case PentaEnum:
 		case TetraEnum:
-         this->InputExtrude(SmbMonthlytemperaturesEnum,-1);
-         this->InputExtrude(SmbPrecipitationEnum,-1);
+         this->DatasetInputExtrude(SmbMonthlytemperaturesEnum,-1);
+         this->DatasetInputExtrude(SmbPrecipitationEnum,-1);
          break;
 		default: _error_("Not implemented yet");
@@ -526,7 +529,7 @@
 	xDelete<IssmDouble>(PrecipitationsPresentday);
 	xDelete<IssmDouble>(tmp);
-
-}
-/*}}}*/
+	xDelete<int>(vertexlids);
+
+} /*}}}*/
 void       Element::Delta18opdParameterization(void){/*{{{*/
 	/*Are we on the base? If not, return*/
@@ -537,4 +540,5 @@
 
 	int        	i;
+	int*        vertexlids=xNew<int>(NUM_VERTICES);
 	IssmDouble* monthlytemperatures=xNew<IssmDouble>(NUM_VERTICES_MONTHS_PER_YEAR);
 	IssmDouble* monthlyprec=xNew<IssmDouble>(NUM_VERTICES_MONTHS_PER_YEAR);
@@ -552,6 +556,7 @@
 	this->parameters->FindParam(&yts,ConstantsYtsEnum);
 	this->parameters->FindParam(&f,SmbFEnum);
+	this->GetVerticesLidList(vertexlids);
 	time_yr=floor(time/yts)*yts;
-	time_clim=ceil(time/yts + 1e-10)*yts;
+	time_clim =ceil(time/yts + 1e-10)*yts;
 	time_climt=ceil(time/yts + 1e-10)*yts;
 	time_climp=ceil(time/yts + 1e-10)*yts;
@@ -563,23 +568,23 @@
 	this->parameters->FindParam(&isPrecipScaled,SmbIsprecipscaledEnum);
 
-	/*Recover present day temperature and precipitation*/
-	Input*     input=this->inputs->GetInput(SmbTemperaturesPresentdayEnum);    _assert_(input);
-	Input*     input2=this->inputs->GetInput(SmbPrecipitationsPresentdayEnum); _assert_(input2);
-	Input*     input3=NULL;
-	Input*     input4=NULL;
+		/*Recover present day temperature and precipitation*/
+	TransientInput2 *tinput  = this->inputs2->GetTransientInput(SmbTemperaturesPresentdayEnum);   _assert_(tinput);
+	TransientInput2 *tinput2 = this->inputs2->GetTransientInput(SmbPrecipitationsPresentdayEnum); _assert_(tinput2);
+	TransientInput2 *tinput3 = NULL;
+	TransientInput2 *tinput4 = NULL;
 	int offset;
 
-	offset=dynamic_cast<TransientInput*>(input)->GetTimeInputOffset(time_clim);
-	time_clim=dynamic_cast<TransientInput*>(input)->GetTimeByOffset(offset-11-fmod(offset-11,12.));
+	offset    = tinput->GetTimeInputOffset(time_clim);
+	time_clim = tinput->GetTimeByOffset(offset-11-fmod(offset-11,12.));
 
 	if(!isTemperatureScaled){
-		input3=this->inputs->GetInput(SmbTemperaturesReconstructedEnum);           _assert_(input3);
-		offset=dynamic_cast<TransientInput*>(input3)->GetTimeInputOffset(time_climt);
-		time_climt=dynamic_cast<TransientInput*>(input3)->GetTimeByOffset(offset-11-fmod(offset-11,12.));
+		tinput3=this->inputs2->GetTransientInput(SmbTemperaturesReconstructedEnum); _assert_(tinput3);
+		offset     = tinput3->GetTimeInputOffset(time_climt);
+		time_climt = tinput3->GetTimeByOffset(offset-11-fmod(offset-11,12.));
 	}
 	if(!isPrecipScaled){
-		input4=this->inputs->GetInput(SmbPrecipitationsReconstructedEnum);         _assert_(input4);
-		offset=dynamic_cast<TransientInput*>(input4)->GetTimeInputOffset(time_climp);
-		time_climp=dynamic_cast<TransientInput*>(input4)->GetTimeByOffset(offset-11-fmod(offset-11,12.));
+		tinput4=this->inputs2->GetTransientInput(SmbPrecipitationsReconstructedEnum); _assert_(tinput4);
+		offset     = tinput4->GetTimeInputOffset(time_climp);
+		time_climp = tinput4->GetTimeByOffset(offset-11-fmod(offset-11,12.));
 	}
 
@@ -587,18 +592,27 @@
 	Gauss* gauss=this->NewGauss();
 	for(int month=0;month<12;month++) {
+		Input2 *input  = this->GetInput2(SmbTemperaturesPresentdayEnum,time_clim+month/12.*yts);   _assert_(input);
+		Input2 *input2 = this->GetInput2(SmbPrecipitationsPresentdayEnum,time_clim+month/12.*yts); _assert_(input2);
+		Input2 *input3 = NULL;
+		Input2 *input4 = NULL;
+		if(!isTemperatureScaled){
+			input3=this->GetInput2(SmbTemperaturesReconstructedEnum,time_climt+month/12.*yts); _assert_(input3);
+		}
+		if(!isPrecipScaled){
+			input4=this->GetInput2(SmbPrecipitationsReconstructedEnum,time_climp+month/12.*yts);
+		}
 		for(int iv=0;iv<NUM_VERTICES;iv++) {
 			gauss->GaussVertex(iv);
-			input->GetInputValue(&TemperaturesPresentday[iv*12+month],gauss,time_clim+month/12.*yts);
-			input2->GetInputValue(&PrecipitationsPresentday[iv*12+month],gauss,time_clim+month/12.*yts);
+			input->GetInputValue(&TemperaturesPresentday[iv*12+month],gauss);
+			input2->GetInputValue(&PrecipitationsPresentday[iv*12+month],gauss);
 			PrecipitationsPresentday[iv*12+month]=PrecipitationsPresentday[iv*12+month]*yts;
 
 			if(!isTemperatureScaled){
-				input3->GetInputValue(&TemperaturesReconstructed[iv*12+month],gauss,time_climt+month/12.*yts);
+				input3->GetInputValue(&TemperaturesReconstructed[iv*12+month],gauss);
 			}
 			if(!isPrecipScaled){
-				input4->GetInputValue(&PrecipitationsReconstructed[iv*12+month],gauss,time_climp+month/12.*yts);
+				input4->GetInputValue(&PrecipitationsReconstructed[iv*12+month],gauss);
 				PrecipitationsReconstructed[iv*12+month]=PrecipitationsReconstructed[iv*12+month]*yts;
 			}
-
 		}
 	}
@@ -616,27 +630,18 @@
 
 	/*Update inputs*/
-	TransientInput* NewTemperatureInput = new TransientInput(SmbMonthlytemperaturesEnum);
-	TransientInput* NewPrecipitationInput = new TransientInput(SmbPrecipitationEnum);
 	for (int imonth=0;imonth<12;imonth++) {
 		for(i=0;i<NUM_VERTICES;i++) tmp[i]=monthlytemperatures[i*12+imonth];
 		switch(this->ObjectEnum()){
-			case TriaEnum:  NewTemperatureInput->AddTimeInput(new TriaInput(SmbMonthlytemperaturesEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
-			case PentaEnum: NewTemperatureInput->AddTimeInput(new PentaInput(SmbMonthlytemperaturesEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
-			case TetraEnum: NewTemperatureInput->AddTimeInput(new TetraInput(SmbMonthlytemperaturesEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
+			case TriaEnum:  this->inputs2->SetTriaDatasetInput(SmbMonthlytemperaturesEnum,imonth,P1Enum,NUM_VERTICES,vertexlids,tmp); break;
+			case PentaEnum: this->inputs2->SetPentaDatasetInput(SmbMonthlytemperaturesEnum,imonth,P1Enum,NUM_VERTICES,vertexlids,tmp); break;
 			default: _error_("Not implemented yet");
 		}
 		for(i=0;i<NUM_VERTICES;i++) tmp[i]=monthlyprec[i*12+imonth]/yts;
 		switch(this->ObjectEnum()){
-			case TriaEnum:  NewPrecipitationInput->AddTimeInput(new TriaInput(SmbPrecipitationEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
-			case PentaEnum: NewPrecipitationInput->AddTimeInput(new PentaInput(SmbPrecipitationEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
-			case TetraEnum: NewPrecipitationInput->AddTimeInput(new TetraInput(SmbPrecipitationEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
+			case TriaEnum:  this->inputs2->SetTriaDatasetInput(SmbPrecipitationEnum,imonth,P1Enum,NUM_VERTICES,vertexlids,tmp); break;
+			case PentaEnum: this->inputs2->SetPentaDatasetInput(SmbPrecipitationEnum,imonth,P1Enum,NUM_VERTICES,vertexlids,tmp); break;
 			default: _error_("Not implemented yet");
 		}
 	}
-	NewTemperatureInput->Configure(this->parameters);
-	NewPrecipitationInput->Configure(this->parameters);
-
-	this->inputs->AddInput(NewTemperatureInput);
-	this->inputs->AddInput(NewPrecipitationInput);
 
 	switch(this->ObjectEnum()){
@@ -644,6 +649,6 @@
 		case PentaEnum:
 		case TetraEnum:
-         this->InputExtrude(SmbMonthlytemperaturesEnum,-1);
-         this->InputExtrude(SmbPrecipitationEnum,-1);
+         this->DatasetInputExtrude(SmbMonthlytemperaturesEnum,-1);
+         this->DatasetInputExtrude(SmbPrecipitationEnum,-1);
          break;
 		default: _error_("Not implemented yet");
@@ -659,7 +664,7 @@
 	xDelete<IssmDouble>(PrecipitationsReconstructed);
 	xDelete<IssmDouble>(tmp);
-
-}
-/*}}}*/
+	xDelete<int>(vertexlids);
+
+} /*}}}*/
 void       Element::SmbGradCompParameterization(void){/*{{{*/
 
@@ -744,9 +749,9 @@
 	/*Get inputs and parameters*/
 	this->FindParam(&dim,DomainDimensionEnum);
-	Input* vx_input = this->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input = this->GetInput(VyEnum); _assert_(vy_input);
-	Input* vz_input = NULL;
+	Input2* vx_input = this->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input = this->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* vz_input = NULL;
 	if(dim==3){
-		vz_input = this->GetInput(VzEnum); _assert_(vz_input);
+		vz_input = this->GetInput2(VzEnum); _assert_(vz_input);
 	}
 	this->GetVerticesCoordinates(&xyz_list);
@@ -775,5 +780,5 @@
 	return divergence;
 }/*}}}*/
-void       Element::dViscositydBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/
+void       Element::dViscositydBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input){/*{{{*/
 
 	/*Intermediaries*/
@@ -812,5 +817,5 @@
 }
 /*}}}*/
-void       Element::dViscositydBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
+void       Element::dViscositydBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){/*{{{*/
 
 	/*Intermediaries*/
@@ -849,5 +854,5 @@
 }
 /*}}}*/
-void       Element::dViscositydBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
+void       Element::dViscositydBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){/*{{{*/
 
 	/*Intermediaries*/
@@ -886,5 +891,5 @@
 }
 /*}}}*/
-void       Element::dViscositydDSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
+void       Element::dViscositydDSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){/*{{{*/
 
 	/*Intermediaries*/
@@ -917,4 +922,5 @@
 	_printf_("   id : "<<this->id <<"\n");
 	_printf_("   sid: "<<this->sid<<"\n");
+	_printf_("   lid: "<<this->lid<<"\n");
 	if(vertices){
 		const int NUM_VERTICES = this->GetNumberOfVertices();
@@ -1119,5 +1125,5 @@
 	_assert_(pvalue);
 
-	Input *input    = this->GetInput(enumtype);
+	Input2 *input    = this->GetInput2(enumtype);
 	int    numnodes = this->GetNumberOfNodes();
 
@@ -1140,6 +1146,6 @@
 	_assert_(pvalue);
 
-	int    numnodes = this->GetNumberOfNodes();
-	Input *input    = this->GetInput(enumtype);
+	int     numnodes = this->GetNumberOfNodes();
+	Input2 *input    = this->GetInput2(enumtype);
 	if(!input) _error_("Input " << EnumToStringx(enumtype) << " not found in element");
 
@@ -1157,6 +1163,6 @@
 	_assert_(pvalue);
 
-	int    numnodes = this->NumberofNodesVelocity();
-	Input *input    = this->GetInput(enumtype);
+	int     numnodes = this->NumberofNodesVelocity();
+	Input2 *input    = this->GetInput2(enumtype);
 	if(!input) _error_("Input " << EnumToStringx(enumtype) << " not found in element");
 
@@ -1170,13 +1176,11 @@
 }
 /*}}}*/
-void       Element::GetInputListOnVertices(IssmDouble* pvalue,int enumtype){/*{{{*/
-
-	/*Recover input*/
-	Input* input=this->GetInput(enumtype);
-	if (!input) _error_("Input " << EnumToStringx(enumtype) << " not found in element");
+void       Element::GetInputListOnVertices(IssmDouble* pvalue,ElementInput2* input){/*{{{*/
+
 	/*Fetch number vertices for this element*/
 	const int NUM_VERTICES = this->GetNumberOfVertices();
 
 	/*Checks in debugging mode*/
+	_assert_(input);
 	_assert_(pvalue);
 
@@ -1187,14 +1191,8 @@
 		input->GetInputValue(&pvalue[iv],gauss);
 	}
-
-	/*clean-up*/
 	delete gauss;
 }
 /*}}}*/
-void       Element::GetInputListOnVerticesAtTime(IssmDouble* pvalue, int enumtype, IssmDouble time){/*{{{*/
-
-	/*Recover input*/
-	Input* input=this->GetInput(enumtype);
-	if (!input) _error_("Input " << EnumToStringx(enumtype) << " not found in element");
+void       Element::GetInputListOnVertices(IssmDouble* pvalue,int enumtype){/*{{{*/
 
 	/*Fetch number vertices for this element*/
@@ -1204,9 +1202,33 @@
 	_assert_(pvalue);
 
+	/*Recover input*/
+	Input2* input2=this->GetInput2(enumtype);
+	if(!input2) _error_("input "<<EnumToStringx(enumtype)<<" not found in element");
 	/* Start looping on the number of vertices: */
 	Gauss*gauss=this->NewGauss();
 	for(int iv=0;iv<NUM_VERTICES;iv++){
 		gauss->GaussVertex(iv);
-		input->GetInputValue(&pvalue[iv],gauss,time);
+		input2->GetInputValue(&pvalue[iv],gauss);
+	}
+	delete gauss;
+}
+/*}}}*/
+void       Element::GetInputListOnVerticesAtTime(IssmDouble* pvalue, int enumtype, IssmDouble time){/*{{{*/
+
+	/*Recover input*/
+	Input2* input=this->GetInput2(enumtype,time);
+	if (!input) _error_("Input " << EnumToStringx(enumtype) << " not found in element");
+
+	/*Fetch number vertices for this element*/
+	const int NUM_VERTICES = this->GetNumberOfVertices();
+
+	/*Checks in debugging mode*/
+	_assert_(pvalue);
+
+	/* Start looping on the number of vertices: */
+	Gauss*gauss=this->NewGauss();
+	for(int iv=0;iv<NUM_VERTICES;iv++){
+		gauss->GaussVertex(iv);
+		input->GetInputValue(&pvalue[iv],gauss);
 	}
 
@@ -1218,5 +1240,5 @@
 
 	/*Recover input*/
-	Input* input=this->GetInput(enumtype);
+	Input2* input=this->GetInput2(enumtype);
 
 	/*Checks in debugging mode*/
@@ -1267,26 +1289,31 @@
 void       Element::GetInputValue(bool* pvalue,int inputenum){/*{{{*/
 
-	Input* input=inputs->GetInput(inputenum);
+	this->inputs2->GetInputValue(pvalue,inputenum,this->lid);
+
+}/*}}}*/
+void       Element::GetInputValue(int* pvalue,int inputenum){/*{{{*/
+	this->inputs2->GetInputValue(pvalue,inputenum,this->lid);
+}/*}}}*/
+void       Element::GetInput2Value(bool* pvalue,int inputenum){/*{{{*/
+
+	this->inputs2->GetInputValue(pvalue,inputenum,this->lid);
+
+}/*}}}*/
+void       Element::GetInput2Value(int* pvalue,int inputenum){/*{{{*/
+
+	this->inputs2->GetInputValue(pvalue,inputenum,this->lid);
+
+}/*}}}*/
+void       Element::GetInputValue(IssmDouble* pvalue,int inputenum){/*{{{*/
+
+	Input2* input=this->GetInput2(inputenum);
 	if(!input) _error_("Input " << EnumToStringx(inputenum) << " not found in element");
-	input->GetInputValue(pvalue);
-
-}/*}}}*/
-void       Element::GetInputValue(int* pvalue,int inputenum){/*{{{*/
-
-	Input* input=inputs->GetInput(inputenum);
-	if(!input) _error_("Input " << EnumToStringx(inputenum) << " not found in element");
-	input->GetInputValue(pvalue);
-
-}/*}}}*/
-void       Element::GetInputValue(IssmDouble* pvalue,int inputenum){/*{{{*/
-
-	Input* input=inputs->GetInput(inputenum);
-	if(!input) _error_("Input " << EnumToStringx(inputenum) << " not found in element");
-	input->GetInputValue(pvalue);
+	//input->GetInputValue(pvalue);
+	_error_("not supported yet (Trying to fetch "<<EnumToStringx(inputenum)<<")");
 
 }/*}}}*/
 void       Element::GetInputValue(IssmDouble* pvalue,Gauss* gauss,int inputenum){/*{{{*/
 
-	Input* input=inputs->GetInput(inputenum);
+	Input2* input=this->GetInput2(inputenum);
 	if(!input) _error_("Input " << EnumToStringx(inputenum) << " not found in element");
 	input->GetInputValue(pvalue,gauss);
@@ -1404,5 +1431,5 @@
 
 	/*Get inputs*/
-	Input* enum_input=inputs->GetInput(enum_type); _assert_(enum_input);
+	Input2* enum_input=this->GetInput2(enum_type); _assert_(enum_input);
 
 	/*Ok, we have the values, fill in the array: */
@@ -1450,9 +1477,9 @@
 	IssmDouble  value;
 	IssmDouble* values      = NULL;
-	Input*      input       = NULL;
+	Input2*     input       = NULL;
 
 	switch(type){
 		case ElementSIdEnum:
-			input=inputs->GetInput(input_enum); _assert_(input);
+			input=this->GetInput2(input_enum); _assert_(input);
 			input->GetInputAverage(&value);
 			vector->SetValue(this->sid,value,INS_VAL);
@@ -1672,8 +1699,10 @@
 /*}}}*/
 bool       Element::HasNodeOnBase(){/*{{{*/
-	return (this->inputs->Max(MeshVertexonbaseEnum)>0.);
+	Input2* input=this->GetInput2(MeshVertexonbaseEnum); _assert_(input);
+	return (input->GetInputMax()>0.);
 }/*}}}*/
 bool       Element::HasNodeOnSurface(){/*{{{*/
-	return (this->inputs->Max(MeshVertexonsurfaceEnum)>0.);
+	Input2* input=this->GetInput2(MeshVertexonsurfaceEnum); _assert_(input);
+	return (input->GetInputMax()>0.);
 }/*}}}*/
 IssmDouble Element::IceMass(bool scaled){/*{{{*/
@@ -1738,5 +1767,5 @@
 }
 /*}}}*/
-void       Element::InputCreate(IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){/*{{{*/
+void       Element::InputCreate(IssmDouble* vector,Inputs2* inputs2,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){/*{{{*/
 
 	/*Intermediaries*/
@@ -1748,11 +1777,13 @@
 		const int NUM_VERTICES = this->GetNumberOfVertices();
 
-		int        *vertexids   = xNew<int>(NUM_VERTICES);
-		IssmDouble *values      = xNew<IssmDouble>(NUM_VERTICES);
+		int        *vertexids  = xNew<int>(NUM_VERTICES);
+		int        *vertexlids = xNew<int>(NUM_VERTICES);
+		IssmDouble *values     = xNew<IssmDouble>(NUM_VERTICES);
 
 		/*Recover vertices ids needed to initialize inputs*/
 		_assert_(iomodel->elements);
 		for(i=0;i<NUM_VERTICES;i++){
-			vertexids[i]=reCast<int>(iomodel->elements[NUM_VERTICES*this->Sid()+i]); //ids for vertices are in the elements array from Matlab
+			vertexids[i] =reCast<int>(iomodel->elements[NUM_VERTICES*this->Sid()+i]); //ids for vertices are in the elements array from Matlab
+			vertexlids[i]=iomodel->my_vertices_lids[vertexids[i]-1];
 		}
 
@@ -1760,9 +1791,9 @@
 		if(M==1){
 			values[0]=vector[0];
-			this->AddInput(vector_enum,values,P0Enum);
+			this->SetElementInput(inputs2,vector_enum,vector[0]);
 		}
 		else if(M==iomodel->numberofvertices){
 			for(i=0;i<NUM_VERTICES;i++) values[i]=vector[vertexids[i]-1];
-			this->AddInput(vector_enum,values,P1Enum);
+			this->SetElementInput(inputs2,NUM_VERTICES,vertexlids,values,vector_enum);
 		}
 		else if(M==iomodel->numberofvertices+1){
@@ -1770,15 +1801,14 @@
 			IssmDouble* times = xNew<IssmDouble>(N);
 			for(t=0;t<N;t++) times[t] = vector[(M-1)*N+t];
-			TransientInput* transientinput=new TransientInput(vector_enum,times,N);
+			inputs2->SetTransientInput(vector_enum,times,N);
+			TransientInput2* transientinput = inputs2->GetTransientInput(vector_enum);
 			for(t=0;t<N;t++){
 				for(i=0;i<NUM_VERTICES;i++) values[i]=vector[N*(vertexids[i]-1)+t];
 				switch(this->ObjectEnum()){
-					case TriaEnum:  transientinput->AddTimeInput(new TriaInput( vector_enum,values,P1Enum)); break;
-					case PentaEnum: transientinput->AddTimeInput(new PentaInput(vector_enum,values,P1Enum)); break;
-					case TetraEnum: transientinput->AddTimeInput(new TetraInput(vector_enum,values,P1Enum)); break;
+					case TriaEnum:  transientinput->AddTriaTimeInput( t,NUM_VERTICES,vertexlids,values,P1Enum); break;
+					case PentaEnum: transientinput->AddPentaTimeInput(t,NUM_VERTICES,vertexlids,values,P1Enum); break;
 					default: _error_("Not implemented yet");
 				}
 			}
-			this->inputs->AddInput(transientinput);
 			xDelete<IssmDouble>(times);
 		}
@@ -1790,8 +1820,8 @@
 			for(int j=0;j<N;j++) values[j]=vector[this->Sid()*N+j];
 
-			if     (N==this->GetNumberOfNodes(P1Enum)   ) this->AddInput(vector_enum,values,P1Enum);
-			else if(N==this->GetNumberOfNodes(P0Enum)   ) this->AddInput(vector_enum,values,P0Enum);
-			else if(N==this->GetNumberOfNodes(P1xP2Enum)) this->AddInput(vector_enum,values,P1xP2Enum);
-			else if(N==this->GetNumberOfNodes(P1xP3Enum)) this->AddInput(vector_enum,values,P1xP3Enum);
+			if     (N==this->GetNumberOfNodes(P1Enum)   ) this->AddInput2(vector_enum,values,P1Enum);
+			else if(N==this->GetNumberOfNodes(P0Enum)   ) this->AddInput2(vector_enum,values,P0Enum);
+			else if(N==this->GetNumberOfNodes(P1xP2Enum)) this->AddInput2(vector_enum,values,P1xP2Enum);
+			else if(N==this->GetNumberOfNodes(P1xP3Enum)) this->AddInput2(vector_enum,values,P1xP3Enum);
 			else _error_("Patch interpolation not supported yet");
 
@@ -1803,4 +1833,5 @@
 		xDelete<IssmDouble>(values);
 		xDelete<int>(vertexids);
+		xDelete<int>(vertexlids);
 	}
 	else if(vector_type==2){ //element vector
@@ -1811,11 +1842,11 @@
 		if(M==iomodel->numberofelements){
 			if (code==5){ //boolean
-				this->inputs->AddInput(new BoolInput(vector_enum,reCast<bool>(vector[this->Sid()])));
+				this->SetBoolInput(inputs2,vector_enum,reCast<bool>(vector[this->Sid()]));
 			}
 			else if (code==6){ //integer
-				this->inputs->AddInput(new IntInput(vector_enum,reCast<int>(vector[this->Sid()])));
+				this->SetIntInput(inputs2,vector_enum,reCast<int>(vector[this->Sid()]));
 			}
 			else if (code==7){ //IssmDouble
-				this->inputs->AddInput(new DoubleInput(vector_enum,vector[this->Sid()]));
+				this->SetElementInput(inputs2,vector_enum,vector[this->Sid()]);
 			}
 			else _error_("could not recognize nature of vector from code " << code);
@@ -1825,29 +1856,25 @@
 			IssmDouble* times = xNew<IssmDouble>(N);
 			for(t=0;t<N;t++) times[t] = vector[(M-1)*N+t];
-			TransientInput* transientinput=new TransientInput(vector_enum,times,N);
-			TriaInput* bof=NULL;
+			inputs2->SetTransientInput(vector_enum,times,N);
+			TransientInput2* transientinput = inputs2->GetTransientInput(vector_enum);
 			for(t=0;t<N;t++){
 				value=vector[N*this->Sid()+t];
 				switch(this->ObjectEnum()){
-					case TriaEnum:  transientinput->AddTimeInput(new TriaInput( vector_enum,&value,P0Enum)); break;
-					case PentaEnum: transientinput->AddTimeInput(new PentaInput(vector_enum,&value,P0Enum)); break;
-					case TetraEnum: transientinput->AddTimeInput(new TetraInput(vector_enum,&value,P0Enum)); break;
+					case TriaEnum:  transientinput->AddTriaTimeInput( t,1,&(this->lid),&value,P0Enum); break;
+					case PentaEnum: transientinput->AddPentaTimeInput(t,1,&(this->lid),&value,P0Enum); break;
 					default: _error_("Not implemented yet");
 				}
 			}
-			this->inputs->AddInput(transientinput);
 			xDelete<IssmDouble>(times);
 		}
 		else _error_("element vector is either numberofelements or numberofelements+1 long. Field provided (" << EnumToStringx(vector_enum) << ") is " << M << " long");
 	}
-	else if(vector_type==3){ //element vector
+	else if(vector_type==3){ //Double array matrix
 
 		/*For right now we are static */
 		if(M==iomodel->numberofelements){
-			/*create transient input: */
-			IssmDouble* layers = xNewZeroInit<IssmDouble>(N);;
+			IssmDouble* layers = xNewZeroInit<IssmDouble>(N);
 			for(t=0;t<N;t++) layers[t] = vector[N*this->Sid()+t];
-			DoubleArrayInput* arrayinput=new DoubleArrayInput(vector_enum,layers,N);
-			this->inputs->AddInput(arrayinput);
+			inputs2->SetArrayInput(vector_enum,this->lid,layers,N);
 			xDelete<IssmDouble>(layers);
 		}
@@ -1857,13 +1884,13 @@
 }
 /*}}}*/
-void       Element::ControlInputCreate(IssmDouble* vector,IssmDouble* min_vector,IssmDouble* max_vector,IoModel* iomodel,int M,int N,int input_enum,int id){/*{{{*/
+void       Element::ControlInputCreate(IssmDouble* vector,IssmDouble* min_vector,IssmDouble* max_vector,Inputs2* inputs2,IoModel* iomodel,int M,int N,IssmDouble scale,int input_enum,int id){/*{{{*/
 
 	/*Intermediaries*/
-	const int NUM_VERTICES = this->GetNumberOfVertices();
-
-	int        *vertexids   = xNew<int>(NUM_VERTICES);
-	IssmDouble *values      = xNew<IssmDouble>(NUM_VERTICES);
-	IssmDouble *values_min  = xNew<IssmDouble>(NUM_VERTICES);
-	IssmDouble *values_max  = xNew<IssmDouble>(NUM_VERTICES);
+	const int numvertices = this->GetNumberOfVertices();
+
+	int        *vertexids   = xNew<int>(numvertices);
+	IssmDouble *values      = xNew<IssmDouble>(numvertices);
+	IssmDouble *values_min  = xNew<IssmDouble>(numvertices);
+	IssmDouble *values_max  = xNew<IssmDouble>(numvertices);
 
 	/*Some sanity checks*/
@@ -1872,25 +1899,22 @@
 	_assert_(max_vector);
 
-	/*For now we only support nodal vectors*/
-	//if(M!=iomodel->numberofvertices) _error_("not supported");
-	//if(N!=1) _error_("not supported");
-
 	/*Recover vertices ids needed to initialize inputs*/
 	_assert_(iomodel->elements);
-	for(int i=0;i<NUM_VERTICES;i++){
-		vertexids[i]=reCast<int>(iomodel->elements[NUM_VERTICES*this->Sid()+i]); //ids for vertices are in the elements array from Matlab
+	for(int i=0;i<numvertices;i++){
+		vertexids[i]=reCast<int>(iomodel->elements[numvertices*this->Sid()+i]); //ids for vertices are in the elements array from Matlab
 	}
 
 	/*Are we in transient or static? */
-	if(M==iomodel->numberofvertices){
-		for(int i=0;i<NUM_VERTICES;i++){
-			values[i]=vector[vertexids[i]-1];
-			values_min[i] = min_vector[vertexids[i]-1];
-			values_max[i] = max_vector[vertexids[i]-1];
-		}
-		this->AddControlInput(input_enum,values,values_min,values_max,P1Enum,id);
-	}
-
-	else if(M==iomodel->numberofvertices+1){
+	if(M==iomodel->numberofvertices && N==1){
+		for(int i=0;i<numvertices;i++){
+			values[i]     = vector[vertexids[i]-1];
+			values_min[i] = scale*min_vector[vertexids[i]-1];
+			values_max[i] = scale*max_vector[vertexids[i]-1];
+		}
+		this->AddControlInput(input_enum,inputs2,iomodel,values,values_min,values_max,P1Enum,id);
+	}
+
+	else if(M==iomodel->numberofvertices+1 && N>1){
+		_error_("not supported tet");
 		/*create transient input: */
 		IssmDouble* times = xNew<IssmDouble>(N);
@@ -1902,5 +1926,5 @@
 		TransientInput* grad_input = new TransientInput(ControlInputGradEnum);
 		for(int t=0;t<N;t++){
-			for(int i=0;i<NUM_VERTICES;i++){
+			for(int i=0;i<numvertices;i++){
 				values[i]=vector[N*(vertexids[i]-1)+t];
 				values_min[i] = min_vector[N*(vertexids[i]-1)+t];
@@ -1933,8 +1957,10 @@
 	/*clean up*/
 	xDelete<IssmDouble>(values);
+	xDelete<IssmDouble>(values_min);
+	xDelete<IssmDouble>(values_max);
 	xDelete<int>(vertexids);
 }
 /*}}}*/
-void       Element::DatasetInputAdd(int enum_type,IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int input_enum,int code,int input_id){/*{{{*/
+void       Element::DatasetInputAdd(int enum_type,IssmDouble* vector,Inputs2* inputs2,IoModel* iomodel,int M,int N,int vector_type,int input_enum,int code,int input_id){/*{{{*/
 	/*enum_type: the name of the DatasetInput (eg Outputdefinition1)
 	 * vector: information being stored (eg observations)
@@ -1945,18 +1971,5 @@
 
 	/*Intermediaries*/
-	int					i,t;
-	DatasetInput*		datasetinput = NULL;
-
-	/*Get input if it already exists*/
-	Input*  tempinput = GetInput(enum_type);
-	if(tempinput){
-		/*Cast it to a Datasetinput*/
-		if(tempinput->ObjectEnum()!=DatasetInputEnum) _error_("don't know what to do");
-		datasetinput = (DatasetInput*)tempinput;
-	}
-	else{
-		datasetinput=new DatasetInput(enum_type);
-		this->inputs->AddInput(datasetinput);
-	}
+	int i,t;
 
 	/*Branch on type of vector: nodal or elementary: */
@@ -1965,11 +1978,13 @@
 		const int NUM_VERTICES = this->GetNumberOfVertices();
 
-		int        *vertexids   = xNew<int>(NUM_VERTICES);
-		IssmDouble *values      = xNew<IssmDouble>(NUM_VERTICES);
+		int        *vertexids  = xNew<int>(NUM_VERTICES);
+		int        *vertexlids = xNew<int>(NUM_VERTICES);
+		IssmDouble *values     = xNew<IssmDouble>(NUM_VERTICES);
 
 		/*Recover vertices ids needed to initialize inputs*/
 		_assert_(iomodel->elements);
 		for(i=0;i<NUM_VERTICES;i++){
-			vertexids[i]=reCast<int>(iomodel->elements[NUM_VERTICES*this->Sid()+i]); //ids for vertices are in the elements array from Matlab
+			vertexids[i] =reCast<int>(iomodel->elements[NUM_VERTICES*this->Sid()+i]); //ids for vertices are in the elements array from Matlab
+			vertexlids[i]=iomodel->my_vertices_lids[vertexids[i]-1];
 		}
 
@@ -1977,86 +1992,40 @@
 		if(M==1){
 			values[0]=vector[0];
-			switch(this->ObjectEnum()){
-				case TriaEnum:  datasetinput->AddInput(new TriaInput(input_enum,values,P0Enum),input_id); break;
-				case PentaEnum: datasetinput->AddInput(new PentaInput(input_enum,values,P0Enum),input_id); break;
-				case TetraEnum: datasetinput->AddInput(new TetraInput(input_enum,values,P0Enum),input_id); break;
-				default: _error_("Not implemented yet");
-			}
+			//this->AddInput2(vector_enum,values,P0Enum);
+			_error_("not implemented yet");
 		}
 		else if(M==iomodel->numberofvertices){
 			for(i=0;i<NUM_VERTICES;i++) values[i]=vector[vertexids[i]-1];
 			switch(this->ObjectEnum()){
-				case TriaEnum:  datasetinput->AddInput(new TriaInput(input_enum,values,P1Enum),input_id); break;
-				case PentaEnum: datasetinput->AddInput(new PentaInput(input_enum,values,P1Enum),input_id); break;
-				case TetraEnum: datasetinput->AddInput(new TetraInput(input_enum,values,P1Enum),input_id); break;
-				default: _error_("Not implemented yet");
-			}  }
+				case TriaEnum:  inputs2->SetTriaDatasetInput(enum_type,input_id,P1Enum,NUM_VERTICES,vertexlids,values); break;
+				case PentaEnum: inputs2->SetPentaDatasetInput(enum_type,input_id,P1Enum,NUM_VERTICES,vertexlids,values); break;
+				default: _error_("Not implemented yet for "<<this->ObjectEnum());
+			}
+		}
 		else if(M==iomodel->numberofvertices+1){
 			/*create transient input: */
 			IssmDouble* times = xNew<IssmDouble>(N);
 			for(t=0;t<N;t++) times[t] = vector[(M-1)*N+t];
-			TransientInput* transientinput=new TransientInput(input_enum,times,N);
+			TransientInput2* transientinput = inputs2->SetDatasetTransientInput(enum_type,input_id,times,N);
 			for(t=0;t<N;t++){
 				for(i=0;i<NUM_VERTICES;i++) values[i]=vector[N*(vertexids[i]-1)+t];
 				switch(this->ObjectEnum()){
-					case TriaEnum:  transientinput->AddTimeInput(new TriaInput( input_enum,values,P1Enum)); break;
-					case PentaEnum: transientinput->AddTimeInput(new PentaInput(input_enum,values,P1Enum)); break;
-					case TetraEnum: transientinput->AddTimeInput(new TetraInput(input_enum,values,P1Enum)); break;
+					case TriaEnum:  transientinput->AddTriaTimeInput( t,NUM_VERTICES,vertexlids,values,P1Enum); break;
+					case PentaEnum: transientinput->AddPentaTimeInput(t,NUM_VERTICES,vertexlids,values,P1Enum); break;
 					default: _error_("Not implemented yet");
 				}
 			}
-			datasetinput->AddInput(transientinput,input_id);
 			xDelete<IssmDouble>(times);
 		}
-		else if(M==iomodel->numberofelements){
-
-			/*This is a Patch!*/
-			xDelete<IssmDouble>(values);
-			values = xNew<IssmDouble>(N);
-			for(int j=0;j<N;j++) values[j]=vector[this->Sid()*N+j];
-
-			if     (N==this->GetNumberOfNodes(P1Enum)   ){
-				switch(this->ObjectEnum()){
-					case TriaEnum:  datasetinput->AddInput(new TriaInput(input_enum,values,P1Enum),input_id); break;
-					case PentaEnum: datasetinput->AddInput(new PentaInput(input_enum,values,P1Enum),input_id); break;
-					case TetraEnum: datasetinput->AddInput(new TetraInput(input_enum,values,P1Enum),input_id); break;
-					default: _error_("Not implemented yet");
-				}
-			}
-			else if(N==this->GetNumberOfNodes(P0Enum)   ){
-				switch(this->ObjectEnum()){
-					case TriaEnum:  datasetinput->AddInput(new TriaInput(input_enum,values,P0Enum),input_id); break;
-					case PentaEnum: datasetinput->AddInput(new PentaInput(input_enum,values,P0Enum),input_id); break;
-					case TetraEnum: datasetinput->AddInput(new TetraInput(input_enum,values,P0Enum),input_id); break;
-					default: _error_("Not implemented yet");
-				}
-			}
-			else if(N==this->GetNumberOfNodes(P1xP2Enum)){
-				switch(this->ObjectEnum()){
-					case TriaEnum:  datasetinput->AddInput(new TriaInput(input_enum,values,P1xP2Enum),input_id); break;
-					case PentaEnum: datasetinput->AddInput(new PentaInput(input_enum,values,P1xP2Enum),input_id); break;
-					case TetraEnum: datasetinput->AddInput(new TetraInput(input_enum,values,P1xP2Enum),input_id); break;
-					default: _error_("Not implemented yet");
-				}
-			}
-			else if(N==this->GetNumberOfNodes(P1xP3Enum)) {
-				switch(this->ObjectEnum()){
-					case TriaEnum:  datasetinput->AddInput(new TriaInput(input_enum,values,P1xP3Enum),input_id); break;
-					case PentaEnum: datasetinput->AddInput(new PentaInput(input_enum,values,P1xP3Enum),input_id); break;
-					case TetraEnum: datasetinput->AddInput(new TetraInput(input_enum,values,P1xP3Enum),input_id); break;
-					default: _error_("Not implemented yet");
-				}
-			}
-			else _error_("Patch interpolation not supported yet");
-
-		}
 		else{
-			_error_("nodal vector is either numberofvertices or numberofvertices+1 long. Field provided (" << EnumToStringx(input_enum) << ") is " << M << " long");
+			_error_("not implemented yet (M="<<M<<")");
 		}
 
 		xDelete<IssmDouble>(values);
 		xDelete<int>(vertexids);
+		xDelete<int>(vertexlids);
 	}
 	else if(vector_type==2){ //element vector
+		_error_("not supported");
 
 		IssmDouble value;
@@ -2065,15 +2034,19 @@
 		if(M==iomodel->numberofelements){
 			if (code==5){ //boolean
-				datasetinput->AddInput(new BoolInput(input_enum,reCast<bool>(vector[this->Sid()])),input_id);
+				_error_("not implemented");
+				//datasetinput->AddInput(new BoolInput(input_enum,reCast<bool>(vector[this->Sid()])),input_id);
 			}
 			else if (code==6){ //integer
-				datasetinput->AddInput(new IntInput(input_enum,reCast<int>(vector[this->Sid()])),input_id);
+				_error_("not implemented");
+				//datasetinput->AddInput(new IntInput(input_enum,reCast<int>(vector[this->Sid()])),input_id);
 			}
 			else if (code==7){ //IssmDouble
-				datasetinput->AddInput(new DoubleInput(input_enum,vector[this->Sid()]),input_id);
+				_error_("not implemented");
+				//datasetinput->AddInput(new DoubleInput(input_enum,vector[this->Sid()]),input_id);
 			}
 			else _error_("could not recognize nature of vector from code " << code);
 		}
 		else if(M==iomodel->numberofelements+1){
+			_error_("not supported");
 			/*create transient input: */
 			IssmDouble* times = xNew<IssmDouble>(N);
@@ -2090,5 +2063,5 @@
 				}
 			}
-			datasetinput->AddInput(transientinput,input_id);
+			//datasetinput->AddInput(transientinput,input_id);
 			xDelete<IssmDouble>(times);
 		}
@@ -2096,4 +2069,5 @@
 	}
 	else if(vector_type==3){ //element vector
+		_error_("not supported");
 
 		/*For right now we are static */
@@ -2103,19 +2077,12 @@
 			for(t=0;t<N;t++) layers[t] = vector[N*this->Sid()+t];
 			DoubleArrayInput* arrayinput=new DoubleArrayInput(input_enum,layers,N);
-			datasetinput->AddInput(arrayinput,input_id);
+			//datasetinput->AddInput(arrayinput,input_id);
 			xDelete<IssmDouble>(layers);
 		}
 		else _error_("element vector is either numberofelements or numberofelements+1 long. Field provided (" << EnumToStringx(input_enum) << ") is " << M << " long");
 	}
-	else _error_("Cannot add input for vector type " << vector_type << " (not supported)");
-}
-/*}}}*/
-void       Element::InputDuplicate(int original_enum,int new_enum){/*{{{*/
-
-	if(!IsInputEnum(original_enum)) _error_("Enum "<<EnumToStringx(original_enum)<<" is not in IsInput");
-
-	/*Call inputs method*/
-	this->inputs->DuplicateInput(original_enum,new_enum);
-
+	else{
+		_error_("Cannot add input for vector type " << vector_type << " (not supported)");
+	}
 }
 /*}}}*/
@@ -2126,5 +2093,5 @@
 
 	/*update input*/
-	this->inputs->AddInput(new IntInput(name,constant));
+	this->SetBoolInput(this->inputs2,name,constant);
 }
 /*}}}*/
@@ -2135,5 +2102,5 @@
 
 	/*update input*/
-	this->inputs->AddInput(new DoubleInput(name,constant));
+	this->SetElementInput(name,constant);
 }
 /*}}}*/
@@ -2144,7 +2111,13 @@
 
 	/*update input*/
-	this->inputs->AddInput(new BoolInput(name,constant));
-}
-/*}}}*/
+	this->SetBoolInput(this->inputs2,name,constant);
+}
+/*}}}*/
+bool       Element::IsOnSurface(){/*{{{*/
+	return this->isonsurface;
+}/*}}}*/
+bool       Element::IsOnBase(){/*{{{*/
+	return this->isonbase;
+}/*}}}*/
 bool       Element::IsFloating(){/*{{{*/
 
@@ -2153,14 +2126,16 @@
 	parameters->FindParam(&migration_style,GroundinglineMigrationEnum);
 
+	Input2* input = this->GetInput2(MaskGroundediceLevelsetEnum); _assert_(input);
+
 	if(migration_style==SubelementMigrationEnum){ //Floating if all nodes are floating
-		if(this->inputs->Max(MaskGroundediceLevelsetEnum) <= 0.) shelf=true;
+		if(input->GetInputMax() <= 0.) shelf=true;
 		else shelf=false;
 	}
 	else if(migration_style==ContactEnum){
-		if(this->inputs->Min(MaskGroundediceLevelsetEnum) < 0.) shelf=true;
+		if(input->GetInputMin() < 0.) shelf=true;
 		else shelf=false;
 	}
 	else if(migration_style==NoneEnum || migration_style==AggressiveMigrationEnum || migration_style==SoftMigrationEnum || migration_style==GroundingOnlyEnum){ //Floating if all nodes are floating
-		if(this->inputs->Min(MaskGroundediceLevelsetEnum) > 0.) shelf=false;
+		if(input->GetInputMin() > 0.) shelf=false;
 		else shelf=true;
 	}
@@ -2171,5 +2146,6 @@
 bool       Element::IsGrounded(){/*{{{*/
 
-	if(this->inputs->Max(MaskGroundediceLevelsetEnum) > 0.){
+	Input2* input=this->GetInput2(MaskGroundediceLevelsetEnum); _assert_(input);
+	if(input->GetInputMax() > 0.){
 		return true;
 	}
@@ -2179,9 +2155,11 @@
 }/*}}}*/
 bool       Element::IsIceInElement(){/*{{{*/
-	return (this->inputs->Min(MaskIceLevelsetEnum)<0.);
+	Input2* input=this->GetInput2(MaskIceLevelsetEnum); _assert_(input);
+	return (input->GetInputMin()<0.);
 }
 /*}}}*/
 bool       Element::IsLandInElement(){/*{{{*/
-	return (this->inputs->Max(MaskLandLevelsetEnum)>0.);
+	Input2* input=this->GetInput2(MaskLandLevelsetEnum); _assert_(input);
+	return (input->GetInputMax()>0.);
 }
 /*}}}*/
@@ -2211,5 +2189,5 @@
 
 	/* Get parameters and inputs */
-	this->inputs->GetInputValue(&basinid,BasalforcingsIsmip6BasinIdEnum);
+	this->GetInputValue(&basinid,BasalforcingsIsmip6BasinIdEnum);
 	this->parameters->FindParam(&num_basins,BasalforcingsIsmip6NumBasinsEnum);
 	this->parameters->FindParam(&gamma0,BasalforcingsIsmip6Gamma0Enum);
@@ -2219,6 +2197,6 @@
 		this->parameters->FindParam(&mean_tf,&N,BasalforcingsIsmip6AverageTfEnum); _assert_(N==num_basins);
 	}
-	Input* tf_input = this->GetInput(BasalforcingsIsmip6TfShelfEnum);              _assert_(tf_input);
-	Input* meltanomaly_input = this->GetInput(BasalforcingsIsmip6MeltAnomalyEnum); _assert_(meltanomaly_input);
+	Input2* tf_input = this->GetInput2(BasalforcingsIsmip6TfShelfEnum);              _assert_(tf_input);
+	Input2* meltanomaly_input = this->GetInput2(BasalforcingsIsmip6MeltAnomalyEnum); _assert_(meltanomaly_input);
 	delta_t_basin = delta_t[basinid];
 	if(!islocal) mean_tf_basin = mean_tf[basinid];
@@ -2241,5 +2219,5 @@
 
 	/*Return basal melt rate*/
-	this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrate,P1Enum);
+	this->AddInput2(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrate,P1DGEnum);
 
 	/*Cleanup and return*/
@@ -2252,5 +2230,6 @@
 }/*}}}*/
 bool       Element::IsWaterInElement(){/*{{{*/
-	return (this->inputs->Max(MaskOceanLevelsetEnum)>0.);
+	Input2* input=this->GetInput2(MaskOceanLevelsetEnum); _assert_(input);
+	return (input->GetInputMax()>0.);
 }
 /*}}}*/
@@ -2285,5 +2264,5 @@
 	}
 
-	this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
+	this->AddInput2(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
 	xDelete<IssmDouble>(base);
 	xDelete<IssmDouble>(values);
@@ -2311,5 +2290,5 @@
 	}
 
-	this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
+	this->AddInput2(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
 	xDelete<IssmDouble>(base);
 	xDelete<IssmDouble>(deepwaterel);
@@ -2361,5 +2340,5 @@
 	}
 
-	this->AddInput(BasalforcingsGeothermalfluxEnum,values,P1Enum);
+	this->AddInput2(BasalforcingsGeothermalfluxEnum,values,P1Enum);
 	xDelete<IssmDouble>(xyz_list);
 	xDelete<IssmDouble>(values);
@@ -2378,4 +2357,5 @@
 	MARSHALLING(id);
 	MARSHALLING(sid);
+	MARSHALLING(lid);
 	MARSHALLING(element_type);
 	MARSHALLING_DYNAMIC(element_type_list,int,numanalyses);
@@ -2460,9 +2440,9 @@
 		}
 	}
-	this->AddInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum);
+	this->AddInput2(MaskGroundediceLevelsetEnum,&phi[0],P1Enum);
 
 	/*Update inputs*/
-	this->AddInput(SurfaceEnum,&s[0],P1Enum);
-	this->AddInput(BaseEnum,&b[0],P1Enum);
+	this->AddInput2(SurfaceEnum,&s[0],P1Enum);
+	this->AddInput2(BaseEnum,&b[0],P1Enum);
 
 	/*Delete*/
@@ -2500,5 +2480,5 @@
 	}
 
-	this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
+	this->AddInput2(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
 	xDelete<IssmDouble>(base);
 	xDelete<IssmDouble>(bed);
@@ -2539,5 +2519,5 @@
 	}
 
-	this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
+	this->AddInput2(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
 	xDelete<IssmDouble>(base);
 	xDelete<IssmDouble>(values);
@@ -2554,4 +2534,5 @@
 
 	int i;
+	int*        vertexlids=xNew<int>(NUM_VERTICES);
 	IssmDouble* monthlytemperatures=xNew<IssmDouble>(NUM_VERTICES_MONTHS_PER_YEAR);
 	IssmDouble* monthlyprec=xNew<IssmDouble>(NUM_VERTICES_MONTHS_PER_YEAR);
@@ -2562,23 +2543,26 @@
 	IssmDouble* tmp=xNew<IssmDouble>(NUM_VERTICES);
 	IssmDouble TdiffTime,PfacTime;
+
+	/*Recover parameters*/
 	IssmDouble time,yts,time_yr;
 	this->parameters->FindParam(&time,TimeEnum);
 	this->parameters->FindParam(&yts,ConstantsYtsEnum);
+	this->GetVerticesLidList(vertexlids);
 	time_yr=floor(time/yts)*yts;
 
-	/*Recover present day temperature and precipitation*/
-	Input*     input=this->inputs->GetInput(SmbTemperaturesPresentdayEnum);    _assert_(input);
-	Input*     input2=this->inputs->GetInput(SmbTemperaturesLgmEnum);          _assert_(input2);
-	Input*     input3=this->inputs->GetInput(SmbPrecipitationsPresentdayEnum); _assert_(input3);
-	Input*     input4=this->inputs->GetInput(SmbPrecipitationsLgmEnum);        _assert_(input4);
 	/*loop over vertices: */
 	Gauss* gauss=this->NewGauss();
 	for(int month=0;month<12;month++) {
+		/*Recover present day temperature and precipitation*/
+		Input2* input =this->GetInput2(SmbTemperaturesPresentdayEnum,month/12.*yts);   _assert_(input);
+		Input2* input2=this->GetInput2(SmbTemperaturesLgmEnum,month/12.*yts);          _assert_(input2);
+		Input2* input3=this->GetInput2(SmbPrecipitationsPresentdayEnum,month/12.*yts); _assert_(input3);
+		Input2* input4=this->GetInput2(SmbPrecipitationsLgmEnum,month/12.*yts);        _assert_(input4);
 		for(int iv=0;iv<NUM_VERTICES;iv++) {
 			gauss->GaussVertex(iv);
-			input->GetInputValue(&TemperaturesPresentday[iv*12+month],gauss,month/12.*yts);
-			input2->GetInputValue(&TemperaturesLgm[iv*12+month],gauss,month/12.*yts);
-			input3->GetInputValue(&PrecipitationsPresentday[iv*12+month],gauss,month/12.*yts);
-			input4->GetInputValue(&PrecipitationsLgm[iv*12+month],gauss,month/12.*yts);
+			input->GetInputValue(&TemperaturesPresentday[iv*12+month],gauss);
+			input2->GetInputValue(&TemperaturesLgm[iv*12+month],gauss);
+			input3->GetInputValue(&PrecipitationsPresentday[iv*12+month],gauss);
+			input4->GetInputValue(&PrecipitationsLgm[iv*12+month],gauss);
 
 			PrecipitationsPresentday[iv*12+month]=PrecipitationsPresentday[iv*12+month]*yts;
@@ -2600,27 +2584,18 @@
 
 	/*Update inputs*/
-	TransientInput* NewTemperatureInput = new TransientInput(SmbMonthlytemperaturesEnum);
-	TransientInput* NewPrecipitationInput = new TransientInput(SmbPrecipitationEnum);
 	for (int imonth=0;imonth<12;imonth++) {
 		for(i=0;i<NUM_VERTICES;i++) tmp[i]=monthlytemperatures[i*12+imonth];
 		switch(this->ObjectEnum()){
-			case TriaEnum:  NewTemperatureInput->AddTimeInput(new TriaInput(SmbMonthlytemperaturesEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
-			case PentaEnum: NewTemperatureInput->AddTimeInput(new PentaInput(SmbMonthlytemperaturesEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
-			case TetraEnum: NewTemperatureInput->AddTimeInput(new TetraInput(SmbMonthlytemperaturesEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
+			case TriaEnum:  this->inputs2->SetTriaDatasetInput(SmbMonthlytemperaturesEnum,imonth,P1Enum,NUM_VERTICES,vertexlids,tmp); break;
+			case PentaEnum: this->inputs2->SetPentaDatasetInput(SmbMonthlytemperaturesEnum,imonth,P1Enum,NUM_VERTICES,vertexlids,tmp); break;
 			default: _error_("Not implemented yet");
 		}
 		for(i=0;i<NUM_VERTICES;i++) tmp[i]=monthlyprec[i*12+imonth]/yts;
 		switch(this->ObjectEnum()){
-			case TriaEnum:  NewPrecipitationInput->AddTimeInput(new TriaInput(SmbPrecipitationEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
-			case PentaEnum: NewPrecipitationInput->AddTimeInput(new PentaInput(SmbPrecipitationEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
-			case TetraEnum: NewPrecipitationInput->AddTimeInput(new TetraInput(SmbPrecipitationEnum,&tmp[0],P1Enum),time_yr+imonth/12.*yts); break;
+			case TriaEnum:  this->inputs2->SetTriaDatasetInput(SmbPrecipitationEnum,imonth,P1Enum,NUM_VERTICES,vertexlids,tmp); break;
+			case PentaEnum: this->inputs2->SetPentaDatasetInput(SmbPrecipitationEnum,imonth,P1Enum,NUM_VERTICES,vertexlids,tmp); break;
 			default: _error_("Not implemented yet");
 		}
 	}
-	NewTemperatureInput->Configure(this->parameters);
-	NewPrecipitationInput->Configure(this->parameters);
-
-	this->inputs->AddInput(NewTemperatureInput);
-	this->inputs->AddInput(NewPrecipitationInput);
 
 	switch(this->ObjectEnum()){
@@ -2628,6 +2603,6 @@
 		case PentaEnum:
 		case TetraEnum:
-							this->InputExtrude(SmbMonthlytemperaturesEnum,-1);
-							this->InputExtrude(SmbPrecipitationEnum,-1);
+							this->DatasetInputExtrude(SmbMonthlytemperaturesEnum,-1);
+							this->DatasetInputExtrude(SmbPrecipitationEnum,-1);
 							break;
 		default: _error_("Not implemented yet");
@@ -2643,4 +2618,5 @@
 	xDelete<IssmDouble>(PrecipitationsLgm);
 	xDelete<IssmDouble>(tmp);
+	xDelete<int>(vertexlids);
 
 }
@@ -2665,9 +2641,9 @@
 	IssmDouble dist_gl,dist_cf;
 
-	inputs->GetInputValue(&basin_id,BasalforcingsPicoBasinIdEnum);
+	this->GetInputValue(&basin_id,BasalforcingsPicoBasinIdEnum);
 	IssmDouble boxid_max=reCast<IssmDouble>(max_boxid_basin_list[basin_id])+1.;
 
-	Input* dist_gl_input=inputs->GetInput(DistanceToGroundinglineEnum); _assert_(dist_gl_input);
-	Input* dist_cf_input=inputs->GetInput(DistanceToCalvingfrontEnum);  _assert_(dist_cf_input);
+	Input2* dist_gl_input=this->GetInput2(DistanceToGroundinglineEnum); _assert_(dist_gl_input);
+	Input2* dist_cf_input=this->GetInput2(DistanceToCalvingfrontEnum);  _assert_(dist_cf_input);
 
 	/*Get dist_gl and dist_cf at center of element*/
@@ -2696,5 +2672,5 @@
 	if(boxid==-1) _error_("No boxid found for element " << this->Sid() << "!");
 
-	this->inputs->AddInput(new IntInput(BasalforcingsPicoBoxIdEnum, boxid));
+	this->SetIntInput(this->inputs2,BasalforcingsPicoBoxIdEnum, boxid);
 
 }/*}}}*/
@@ -2704,5 +2680,5 @@
 
 	int boxid;
-	this->inputs->GetInputValue(&boxid,BasalforcingsPicoBoxIdEnum);
+	this->GetInputValue(&boxid,BasalforcingsPicoBoxIdEnum);
 	if(loopboxid!=boxid) return;
 
@@ -2734,7 +2710,7 @@
 	this->parameters->FindParam(&overturning_coeff,BasalforcingsPicoOverturningCoeffEnum);
 	this->parameters->FindParam(&maxbox,BasalforcingsPicoMaxboxcountEnum);
-	this->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
+	this->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
 	this->parameters->FindParam(&isplume, BasalforcingsPicoIsplumeEnum);
-	Input* thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
+	Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
 	_assert_(basinid<=num_basins);
 
@@ -2781,8 +2757,8 @@
 		}
 
-		if(!isplume) this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1Enum);
-		this->AddInput(BasalforcingsPicoSubShelfOceanTempEnum,Tocs,P1Enum);
-		this->AddInput(BasalforcingsPicoSubShelfOceanSalinityEnum,Socs,P1Enum);
-		this->AddInput(BasalforcingsPicoSubShelfOceanOverturningEnum,overturnings,P1Enum);
+		if(!isplume) this->AddInput2(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1DGEnum);
+		this->AddInput2(BasalforcingsPicoSubShelfOceanTempEnum,Tocs,P1DGEnum);
+		this->AddInput2(BasalforcingsPicoSubShelfOceanSalinityEnum,Socs,P1DGEnum);
+		this->AddInput2(BasalforcingsPicoSubShelfOceanOverturningEnum,overturnings,P1DGEnum);
 
 		/*Cleanup and return*/
@@ -2817,7 +2793,7 @@
 		}
 
-		if(!isplume) this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1Enum);
-		this->AddInput(BasalforcingsPicoSubShelfOceanTempEnum,Tocs,P1Enum);
-		this->AddInput(BasalforcingsPicoSubShelfOceanSalinityEnum,Socs,P1Enum);
+		if(!isplume) this->AddInput2(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1DGEnum);
+		this->AddInput2(BasalforcingsPicoSubShelfOceanTempEnum,Tocs,P1DGEnum);
+		this->AddInput2(BasalforcingsPicoSubShelfOceanSalinityEnum,Socs,P1DGEnum);
 
 		/*Cleanup and return*/
@@ -2875,10 +2851,10 @@
 
 	/*Get inputs*/
-	Input* zgl_input            = this->GetInput(GroundinglineHeightEnum);                     _assert_(zgl_input);
-	Input* toc_input            = this->GetInput(BasalforcingsPicoSubShelfOceanTempEnum);      _assert_(toc_input);
-	Input* soc_input            = this->GetInput(BasalforcingsPicoSubShelfOceanSalinityEnum);  _assert_(soc_input);
-	Input* base_input           = this->GetInput(BaseEnum);                                    _assert_(base_input);
-	Input* baseslopex_input     = this->GetInput(BaseSlopeXEnum);                              _assert_(baseslopex_input);
-	Input* baseslopey_input     = this->GetInput(BaseSlopeYEnum);                              _assert_(baseslopey_input);
+	Input2* zgl_input         = this->GetInput2(GroundinglineHeightEnum);                     _assert_(zgl_input);
+	Input2* toc_input         = this->GetInput2(BasalforcingsPicoSubShelfOceanTempEnum);      _assert_(toc_input);
+	Input2* soc_input         = this->GetInput2(BasalforcingsPicoSubShelfOceanSalinityEnum);  _assert_(soc_input);
+	Input2* base_input        = this->GetInput2(BaseEnum);                                    _assert_(base_input);
+	Input2* baseslopex_input  = this->GetInput2(BaseSlopeXEnum);                              _assert_(baseslopex_input);
+	Input2* baseslopey_input  = this->GetInput2(BaseSlopeYEnum);                              _assert_(baseslopey_input);
 	this->FindParam(&yts, ConstantsYtsEnum);
 
@@ -2930,5 +2906,5 @@
 
 	/*Save computed melt-rate*/
-	this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1Enum);
+	this->AddInput2(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1DGEnum);
 
 	/*Cleanup and return*/
@@ -2968,7 +2944,4 @@
 	rlapslgm=this->FindParam(SmbRlapslgmEnum);
 
-	/*Recover monthly temperatures and precipitation and compute the yearly mean temperatures*/
-	Input*     input=this->inputs->GetInput(SmbMonthlytemperaturesEnum); _assert_(input);
-	Input*     input2=this->inputs->GetInput(SmbPrecipitationEnum); _assert_(input2);
 	IssmDouble time,yts,time_yr;
 	this->parameters->FindParam(&time,TimeEnum);
@@ -2976,13 +2949,19 @@
 	time_yr=floor(time/yts)*yts;
 
+	/*Get inputs*/
+	DatasetInput2* dinput =this->GetDatasetInput2(SmbMonthlytemperaturesEnum); _assert_(dinput);
+	DatasetInput2* dinput2=this->GetDatasetInput2(SmbPrecipitationEnum);       _assert_(dinput2);
+
 	/*loop over vertices: */
 	Gauss* gauss=this->NewGauss();
 	for(int month=0;month<12;month++) {
+		/*Recover monthly temperatures and precipitation and compute the yearly mean temperatures*/
+
 		for(int iv=0;iv<NUM_VERTICES;iv++) {
 			gauss->GaussVertex(iv);
-			input->GetInputValue(&monthlytemperatures[iv*12+month],gauss,time_yr+month/12.*yts);
+			dinput->GetInputValue(&monthlytemperatures[iv*12+month],gauss,month);
 			// yearlytemperatures[iv]=yearlytemperatures[iv]+monthlytemperatures[iv*12+month]*mavg; // Has to be in Kelvin
 			monthlytemperatures[iv*12+month]=monthlytemperatures[iv*12+month]-273.15; // conversion from Kelvin to celcius for PDD module
-			input2->GetInputValue(&monthlyprec[iv*12+month],gauss,time_yr+month/12.*yts);
+			dinput2->GetInputValue(&monthlyprec[iv*12+month],gauss,month);
 			monthlyprec[iv*12+month]=monthlyprec[iv*12+month]*yts;
 		}
@@ -3004,7 +2983,9 @@
 	 *     This parameter is set, if the user wants to define the
 	 *     pdd factors regionally, if issetpddfac==1 in the d18opdd method */
-	if (issetpddfac==1){
-		input=this->GetInput(SmbPddfacSnowEnum); _assert_(input);
-		input2=this->GetInput(SmbPddfacIceEnum); _assert_(input2);
+	Input2* input  = NULL;
+	Input2* input2 = NULL;
+	if(issetpddfac==1){
+		input  = this->GetInput2(SmbPddfacSnowEnum); _assert_(input);
+		input2 = this->GetInput2(SmbPddfacIceEnum); _assert_(input2);
 	}
 
@@ -3016,5 +2997,5 @@
 
 	/*measure the surface mass balance*/
-	for (int iv = 0; iv<NUM_VERTICES; iv++){
+	for(int iv = 0; iv<NUM_VERTICES; iv++){
 		gauss->GaussVertex(iv);
 		pddsnowfac=0.;
@@ -3051,9 +3032,8 @@
 	switch(this->ObjectEnum()){
 		case TriaEnum:
-			// this->inputs->AddInput(new TriaInput(TemperatureEnum,&yearlytemperatures[0],P1Enum));
-			this->inputs->AddInput(new TriaInput(TemperaturePDDEnum,&yearlytemperatures[0],P1Enum));
-			this->inputs->AddInput(new TriaInput(SmbMassBalanceEnum,&agd[0],P1Enum));
-			this->inputs->AddInput(new TriaInput(SmbAccumulationEnum,&accu[0],P1Enum));
-			this->inputs->AddInput(new TriaInput(SmbMeltEnum,&melt[0],P1Enum));
+			this->AddInput2(TemperaturePDDEnum,&yearlytemperatures[0],P1Enum);
+			this->AddInput2(SmbMassBalanceEnum,&agd[0],P1Enum);
+			this->AddInput2(SmbAccumulationEnum,&accu[0],P1Enum);
+			this->AddInput2(SmbMeltEnum,&melt[0],P1Enum);
 			break;
 		case PentaEnum:
@@ -3066,5 +3046,5 @@
 				yearlytemperatures[1] = s[1];
 				yearlytemperatures[2] = s[2];
-				this->inputs->AddInput(new PentaInput(TemperatureEnum,&yearlytemperatures[0],P1Enum));
+				this->AddInput2(TemperatureEnum,&yearlytemperatures[0],P1Enum);
 
 				bool isenthalpy;
@@ -3077,22 +3057,9 @@
 					ThermalToEnthalpy(&enthalpy[4],yearlytemperatures[4],0.,0.);
 					ThermalToEnthalpy(&enthalpy[5],yearlytemperatures[5],0.,0.);
-					this->inputs->AddInput(new PentaInput(EnthalpyEnum,&enthalpy[0],P1Enum));
+					this->AddInput2(EnthalpyEnum,&enthalpy[0],P1Enum);
 				}
 			}
-			this->inputs->AddInput(new PentaInput(SmbMassBalanceEnum,&agd[0],P1Enum));
-			this->inputs->AddInput(new PentaInput(TemperaturePDDEnum,&yearlytemperatures[0],P1Enum));
-			this->InputExtrude(TemperaturePDDEnum,-1);
-			this->InputExtrude(SmbMassBalanceEnum,-1);
-			break;
-		case TetraEnum:
-			if(IsOnSurface()){
-				GetInputListOnVertices(&s[0],TemperatureEnum);
-				yearlytemperatures[0] = s[0];
-				yearlytemperatures[1] = s[1];
-				yearlytemperatures[2] = s[2];
-				this->inputs->AddInput(new TetraInput(TemperatureEnum,&yearlytemperatures[0],P1Enum));
-			}
-			this->inputs->AddInput(new TetraInput(SmbMassBalanceEnum,&agd[0],P1Enum));
-			this->inputs->AddInput(new TetraInput(TemperaturePDDEnum,&yearlytemperatures[0],P1Enum));
+			this->AddInput2(SmbMassBalanceEnum,&agd[0],P1Enum);
+			this->AddInput2(TemperaturePDDEnum,&yearlytemperatures[0],P1Enum);
 			this->InputExtrude(TemperaturePDDEnum,-1);
 			this->InputExtrude(SmbMassBalanceEnum,-1);
@@ -3100,11 +3067,4 @@
 		default: _error_("Not implemented yet");
 	}
-	// this->inputs->AddInput(NewTemperatureInput);
-	// this->inputs->AddInput(NewPrecipitationInput);
-	// this->inputs->AddInput(new TriaVertexInput(ThermalSpcTemperatureEnum,&Tsurf[0]));
-
-	//this->InputExtrude(SmbMassBalanceEnum,-1);
-	// this->InputExtrude(SmbMonthlytemperaturesEnum,-1);
-	// this->InputExtrude(SmbPrecipitationEnum,-1);
 
 	/*clean-up*/
@@ -3157,10 +3117,4 @@
 	rlaps=this->FindParam(SmbRlapsEnum);
 
-	/*Recover monthly temperatures and precipitation*/
-	Input*     input=this->inputs->GetInput(SmbMonthlytemperaturesEnum); _assert_(input);
-	Input*     input2=this->inputs->GetInput(SmbPrecipitationEnum); _assert_(input2);
-	/*Recover smb correction term */
-	Input*     input3=this->inputs->GetInput(SmbSmbCorrEnum); _assert_(input3);
-
 	/* Get time */
 	this->parameters->FindParam(&time,TimeEnum);
@@ -3172,12 +3126,18 @@
 	IssmDouble mu           = MU_0*(1000.0*86400.0)*(rho_ice/rho_water);   // (d*deg C)/(mm WE) --> (s*deg C)/(m IE)
 
+
 	/*loop over vertices: */
 	Gauss* gauss=this->NewGauss();
 	for(int month=0;month<12;month++){
+
+		/*Recover monthly temperatures and precipitation*/
+		Input2* dinput =this->GetInput2(SmbMonthlytemperaturesEnum,reCast<IssmDouble>(month+1)/12.*yts); _assert_(dinput);
+		Input2* dinput2=this->GetInput2(SmbPrecipitationEnum,reCast<IssmDouble>(month+1)/12.*yts);       _assert_(dinput2);
+
 		for(int iv=0;iv<NUM_VERTICES;iv++){
 			gauss->GaussVertex(iv);
-			input->GetInputValue(&monthlytemperatures[iv*12+month],gauss,(month+1)/12.*yts);
+			dinput->GetInputValue(&monthlytemperatures[iv*12+month],gauss);
 			monthlytemperatures[iv*12+month]=monthlytemperatures[iv*12+month]-273.15; // conversion from Kelvin to celcius for PDD module
-			input2->GetInputValue(&monthlyprec[iv*12+month],gauss,(month+1)/12.*yts);
+			dinput2->GetInputValue(&monthlyprec[iv*12+month],gauss);
 			monthlyprec[iv*12+month]=monthlyprec[iv*12+month]*yts;
 		}
@@ -3216,9 +3176,9 @@
 	switch(this->ObjectEnum()){
 		case TriaEnum:
-			// this->inputs->AddInput(new TriaInput(TemperatureEnum,&yearlytemperatures[0],P1Enum));
-			this->inputs->AddInput(new TriaInput(TemperaturePDDEnum,&yearlytemperatures[0],P1Enum));
-			this->inputs->AddInput(new TriaInput(SmbMassBalanceEnum,&smb[0],P1Enum));
-			this->inputs->AddInput(new TriaInput(SmbAccumulationEnum,&accu[0],P1Enum));
-			this->inputs->AddInput(new TriaInput(SmbMeltEnum,&melt[0],P1Enum));
+			//this->AddInput2(TemperatureEnum,&yearlytemperatures[0],P1Enum);
+			this->AddInput2(TemperaturePDDEnum,&yearlytemperatures[0],P1Enum);
+			this->AddInput2(SmbMassBalanceEnum,&smb[0],P1Enum);
+			this->AddInput2(SmbAccumulationEnum,&accu[0],P1Enum);
+			this->AddInput2(SmbMeltEnum,&melt[0],P1Enum);
 			break;
 		case PentaEnum:
@@ -3236,5 +3196,5 @@
 					yearlytemperatures[1] = s[1];
 					yearlytemperatures[2] = s[2];
-					this->inputs->AddInput(new PentaInput(TemperatureEnum,&yearlytemperatures[0],P1Enum));
+					this->AddInput2(TemperatureEnum,&yearlytemperatures[0],P1Enum);
 					if(isenthalpy){
 						/*Convert that to enthalpy for the enthalpy model*/
@@ -3244,29 +3204,16 @@
 						ThermalToEnthalpy(&enthalpy[4],yearlytemperatures[4],0.,0.);
 						ThermalToEnthalpy(&enthalpy[5],yearlytemperatures[5],0.,0.);
-						this->inputs->AddInput(new PentaInput(EnthalpyEnum,&enthalpy[0],P1Enum));
+						this->AddInput2(EnthalpyEnum,&enthalpy[0],P1Enum);
 					}
 				}
 			}
-			this->inputs->AddInput(new PentaInput(SmbMassBalanceEnum,&smb[0],P1Enum));
-			this->inputs->AddInput(new PentaInput(TemperaturePDDEnum,&yearlytemperatures[0],P1Enum));
-			this->inputs->AddInput(new PentaInput(SmbAccumulationEnum,&accu[0],P1Enum));
-			this->inputs->AddInput(new PentaInput(SmbMeltEnum,&melt[0],P1Enum));
+			this->AddInput2(SmbMassBalanceEnum,&smb[0],P1Enum);
+			this->AddInput2(TemperaturePDDEnum,&yearlytemperatures[0],P1Enum);
+			this->AddInput2(SmbAccumulationEnum,&accu[0],P1Enum);
+			this->AddInput2(SmbMeltEnum,&melt[0],P1Enum);
 			this->InputExtrude(TemperaturePDDEnum,-1);
 			this->InputExtrude(SmbMassBalanceEnum,-1);
 			this->InputExtrude(SmbAccumulationEnum,-1);
 			this->InputExtrude(SmbMeltEnum,-1);
-			break;
-		case TetraEnum:
-			if(IsOnSurface()){
-				GetInputListOnVertices(&s[0],TemperatureEnum);
-				yearlytemperatures[0] = s[0];
-				yearlytemperatures[1] = s[1];
-				yearlytemperatures[2] = s[2];
-				this->inputs->AddInput(new TetraInput(TemperatureEnum,&yearlytemperatures[0],P1Enum));
-			}
-			this->inputs->AddInput(new TetraInput(SmbMassBalanceEnum,&smb[0],P1Enum));
-			this->inputs->AddInput(new TetraInput(TemperaturePDDEnum,&yearlytemperatures[0],P1Enum));
-			this->InputExtrude(TemperaturePDDEnum,-1);
-			this->InputExtrude(SmbMassBalanceEnum,-1);
 			break;
 		default: _error_("Not implemented yet");
@@ -3324,5 +3271,4 @@
 		case SigmaNNEnum: this->ComputeSigmaNN(); break;
 		case LambdaSEnum: this->ComputeLambdaS(); break;
-		case NewDamageEnum: this->ComputeNewDamage(); break;
 		case StressIntensityFactorEnum: this->StressIntensityFactor(); break;
 		case CalvingratexEnum:
@@ -3359,80 +3305,92 @@
 	}
 
-	/*Find input*/
-	Input* input=this->inputs->GetInput(output_enum);
-
 	/*If this input is not already in Inputs, maybe it needs to be computed?*/
+	Input2* input2 = this->GetInput2(output_enum);
+	if(!input2) _error_("input "<<EnumToStringx(output_enum)<<" not found in element");
+
+	/*Assign output pointer*/
+	*pinterpolation   = input2->GetResultInterpolation();
+	*pnodesperelement = input2->GetResultNumberOfNodes();
+	*parray_size      = input2->GetResultArraySize();
+	return;
+}/*}}}*/
+void       Element::ResultToPatch(IssmDouble* values,int nodesperelement,int output_enum){/*{{{*/
+
+	Input2* input=this->GetInput2(output_enum);
 	if(!input) _error_("input "<<EnumToStringx(output_enum)<<" not found in element");
 
-	/*Assign output pointer*/
-	*pinterpolation   = input->GetResultInterpolation();
-	*pnodesperelement = input->GetResultNumberOfNodes();
-	*parray_size      = input->GetResultArraySize();
-}/*}}}*/
-void       Element::ResultToPatch(IssmDouble* values,int nodesperelement,int output_enum){/*{{{*/
-
-	Input* input=this->inputs->GetInput(output_enum);
-	if(!input) _error_("input "<<EnumToStringx(output_enum)<<" not found in element");
-
-	input->ResultToPatch(values,nodesperelement,this->Sid());
+	_error_("not implemented yet ");
+	//input->ResultToPatch(values,nodesperelement,this->Sid());
 
 } /*}}}*/
 void       Element::ResultToMatrix(IssmDouble* values,int ncols,int output_enum){/*{{{*/
 
-	Input* input=this->inputs->GetInput(output_enum);
+	Input2* input=this->GetInput2(output_enum);
 	if(!input) _error_("input "<<EnumToStringx(output_enum)<<" not found in element");
 
-	input->ResultToMatrix(values,ncols,this->Sid());
+	_error_("not implemented yet");
+	//input->ResultToMatrix(values,ncols,this->Sid());
 
 } /*}}}*/
 void       Element::ResultToVector(Vector<IssmDouble>* vector,int output_enum){/*{{{*/
 
-	Input* input=this->inputs->GetInput(output_enum);
-	if(!input) _error_("input "<<EnumToStringx(output_enum)<<" not found in element");
-
-	switch(input->GetResultInterpolation()){
-		case P0Enum:{
-							IssmDouble  value;
-							bool        bvalue;
-							Input*      input = this->GetInput(output_enum); _assert_(input);
-							switch(input->ObjectEnum()){
-								case DoubleInputEnum:
-									input->GetInputValue(&value);
-									break;
-								case BoolInputEnum:
-									input->GetInputValue(&bvalue);
-									value=reCast<IssmDouble>(bvalue);
-									break;
-								default:
-									Gauss* gauss = this->NewGauss();
-									input->GetInputValue(&value,gauss);
-									delete gauss;
+
+		Input2* input2=this->GetInput2(output_enum);
+		if(!input2) _error_("input "<<EnumToStringx(output_enum)<<" not found in element");
+
+		switch(input2->GetResultInterpolation()){
+			case P0Enum:{
+								IssmDouble  value;
+								bool        bvalue;
+								switch(input2->ObjectEnum()){
+									case BoolInputEnum:
+										(xDynamicCast<BoolInput2*>(input2))->GetInput(&bvalue,this->lid);
+										value=reCast<IssmDouble>(bvalue);
+										break;
+									default:
+										Gauss* gauss = this->NewGauss();
+										input2->GetInputValue(&value,gauss);
+										delete gauss;
+								}
+								vector->SetValue(this->Sid(),value,INS_VAL);
+								break;
 							}
-							vector->SetValue(this->Sid(),value,INS_VAL);
-							break;
-						}
-		case P1Enum:{
-							const int NUM_VERTICES = this->GetNumberOfVertices();
-
-							IssmDouble *values      = xNew<IssmDouble>(NUM_VERTICES);
-							int        *connectivity= xNew<int>(NUM_VERTICES);
-							int        *sidlist     = xNew<int>(NUM_VERTICES);
-
-							this->GetVerticesSidList(sidlist);
-							this->GetVerticesConnectivityList(connectivity);
-							this->GetInputListOnVertices(values,output_enum);
-							for(int i=0;i<NUM_VERTICES;i++) values[i] = values[i]/reCast<IssmDouble>(connectivity[i]);
-
-							vector->SetValues(NUM_VERTICES,sidlist,values,ADD_VAL);
-
-							xDelete<IssmDouble>(values);
-							xDelete<int>(connectivity);
-							xDelete<int>(sidlist);
-							break;
-						}
-		default:
-					 _error_("interpolation "<<EnumToStringx(input->GetResultInterpolation())<<" not supported yet");
-	}
+			case P1Enum:{
+								const int NUM_VERTICES = this->GetNumberOfVertices();
+
+								IssmDouble *values      = xNew<IssmDouble>(NUM_VERTICES);
+								int        *connectivity= xNew<int>(NUM_VERTICES);
+								int        *sidlist     = xNew<int>(NUM_VERTICES);
+
+								this->GetVerticesSidList(sidlist);
+								this->GetVerticesConnectivityList(connectivity);
+								this->GetInputListOnVertices(values,output_enum);
+								for(int i=0;i<NUM_VERTICES;i++) values[i] = values[i]/reCast<IssmDouble>(connectivity[i]);
+
+								vector->SetValues(NUM_VERTICES,sidlist,values,ADD_VAL);
+
+								xDelete<IssmDouble>(values);
+								xDelete<int>(connectivity);
+								xDelete<int>(sidlist);
+								break;
+							}
+			default:
+						 _error_("interpolation "<<EnumToStringx(input2->GetResultInterpolation())<<" not supported yet");
+		}
 } /*}}}*/
+void       Element::SetBoolInput(Inputs2* inputs2,int enum_in,bool value){/*{{{*/
+
+	_assert_(inputs2);
+	inputs2->SetInput(enum_in,this->lid,value);
+
+}
+/*}}}*/
+void       Element::SetIntInput(Inputs2* inputs2,int enum_in,int value){/*{{{*/
+
+	_assert_(inputs2);
+	inputs2->SetInput(enum_in,this->lid,value);
+
+}
+/*}}}*/
 void       Element::SetwiseNodeConnectivity(int* pd_nz,int* po_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum){/*{{{*/
 
@@ -3492,5 +3450,5 @@
 	parameters->FindParam(&analysis_type,AnalysisTypeEnum);
 	if(analysis_type==StressbalanceAnalysisEnum){
-		inputs->GetInputValue(&approximation,ApproximationEnum);
+		this->GetInput2Value(&approximation,ApproximationEnum);
 		if(approximation==SSAHOApproximationEnum || approximation==SSAFSApproximationEnum){
 			parameters->FindParam(&numlayers,MeshNumberoflayersEnum);
@@ -3549,15 +3507,4 @@
 	rdl=this->FindParam(SmbRdlEnum);
 
-	/* Retrieve inputs: */
-	Input* dailysnowfall_input=this->GetInput(SmbDailysnowfallEnum); _assert_(dailysnowfall_input);
-	Input* dailyrainfall_input=this->GetInput(SmbDailyrainfallEnum); _assert_(dailyrainfall_input);
-	Input* dailydlradiation_input=this->GetInput(SmbDailydlradiationEnum); _assert_(dailydlradiation_input);
-	Input* dailydsradiation_input=this->GetInput(SmbDailydsradiationEnum); _assert_(dailydsradiation_input);
-	Input* dailywindspeed_input=this->GetInput(SmbDailywindspeedEnum); _assert_(dailywindspeed_input);
-	Input* dailypressure_input=this->GetInput(SmbDailypressureEnum); _assert_(dailypressure_input);
-	Input* dailyairdensity_input=this->GetInput(SmbDailyairdensityEnum); _assert_(dailyairdensity_input);
-	Input* dailyairhumidity_input=this->GetInput(SmbDailyairhumidityEnum); _assert_(dailyairhumidity_input);
-	Input* dailytemperature_input=this->GetInput(SmbDailytemperatureEnum); _assert_(dailytemperature_input);
-
 	/* Recover info at the vertices: */
 	GetInputListOnVertices(&s[0],SurfaceEnum);
@@ -3567,16 +3514,27 @@
 	Gauss* gauss=this->NewGauss();
 	for (int iday = 0; iday < 365; iday++){
-		for(int iv=0;iv<NUM_VERTICES;iv++) {
+		/* Retrieve inputs: */
+		Input2* dailysnowfall_input    = this->GetInput2(SmbDailysnowfallEnum,time_yr+(iday+1)/365.*yts); _assert_(dailysnowfall_input);
+		Input2* dailyrainfall_input    = this->GetInput2(SmbDailyrainfallEnum,time_yr+(iday+1)/365.*yts); _assert_(dailyrainfall_input);
+		Input2* dailydlradiation_input = this->GetInput2(SmbDailydlradiationEnum,time_yr+(iday+1)/365.*yts); _assert_(dailydlradiation_input);
+		Input2* dailydsradiation_input = this->GetInput2(SmbDailydsradiationEnum,time_yr+(iday+1)/365.*yts); _assert_(dailydsradiation_input);
+		Input2* dailywindspeed_input   = this->GetInput2(SmbDailywindspeedEnum,time_yr+(iday+1)/365.*yts); _assert_(dailywindspeed_input);
+		Input2* dailypressure_input    = this->GetInput2(SmbDailypressureEnum,time_yr+(iday+1)/365.*yts); _assert_(dailypressure_input);
+		Input2* dailyairdensity_input  = this->GetInput2(SmbDailyairdensityEnum,time_yr+(iday+1)/365.*yts); _assert_(dailyairdensity_input);
+		Input2* dailyairhumidity_input = this->GetInput2(SmbDailyairhumidityEnum,time_yr+(iday+1)/365.*yts); _assert_(dailyairhumidity_input);
+		Input2* dailytemperature_input = this->GetInput2(SmbDailytemperatureEnum,time_yr+(iday+1)/365.*yts); _assert_(dailytemperature_input);
+
+		for(int iv=0;iv<NUM_VERTICES;iv++){
 			gauss->GaussVertex(iv);
 			/* get forcing */
-			dailyrainfall_input->GetInputValue(&dailyrainfall[iv*365+iday],gauss,time_yr+(iday+1)/365.*yts);
-			dailysnowfall_input->GetInputValue(&dailysnowfall[iv*365+iday],gauss,time_yr+(iday+1)/365.*yts);
-			dailydlradiation_input->GetInputValue(&dailydlradiation[iv*365+iday],gauss,time_yr+(iday+1)/365.*yts);
-			dailydsradiation_input->GetInputValue(&dailydsradiation[iv*365+iday],gauss,time_yr+(iday+1)/365.*yts);
-			dailywindspeed_input->GetInputValue(&dailywindspeed[iv*365+iday],gauss,time_yr+(iday+1)/365.*yts);
-			dailypressure_input->GetInputValue(&dailypressure[iv*365+iday],gauss,time_yr+(iday+1)/365.*yts);
-			dailyairdensity_input->GetInputValue(&dailyairdensity[iv*365+iday],gauss,time_yr+(iday+1)/365.*yts);
-			dailyairhumidity_input->GetInputValue(&dailyairhumidity[iv*365+iday],gauss,time_yr+(iday+1)/365.*yts);
-			dailytemperature_input->GetInputValue(&dailytemperature[iv*365+iday],gauss,time_yr+(iday+1)/365.*yts);
+			dailyrainfall_input->GetInputValue(&dailyrainfall[iv*365+iday],gauss);
+			dailysnowfall_input->GetInputValue(&dailysnowfall[iv*365+iday],gauss);
+			dailydlradiation_input->GetInputValue(&dailydlradiation[iv*365+iday],gauss);
+			dailydsradiation_input->GetInputValue(&dailydsradiation[iv*365+iday],gauss);
+			dailywindspeed_input->GetInputValue(&dailywindspeed[iv*365+iday],gauss);
+			dailypressure_input->GetInputValue(&dailypressure[iv*365+iday],gauss);
+			dailyairdensity_input->GetInputValue(&dailyairdensity[iv*365+iday],gauss);
+			dailyairhumidity_input->GetInputValue(&dailyairhumidity[iv*365+iday],gauss);
+			dailytemperature_input->GetInputValue(&dailytemperature[iv*365+iday],gauss);
 
 			/* Surface temperature correction */
@@ -3608,8 +3566,8 @@
 	switch(this->ObjectEnum()){
 		case TriaEnum:
-			this->inputs->AddInput(new TriaInput(TemperatureSEMICEnum,&tsurf_out[0],P1Enum)); // TODO add TemperatureSEMICEnum to EnumDefinitions
-			this->inputs->AddInput(new TriaInput(SmbMassBalanceEnum,&smb_out[0],P1Enum));
-			this->inputs->AddInput(new TriaInput(SmbAccumulationEnum,&saccu_out[0],P1Enum));
-			this->inputs->AddInput(new TriaInput(SmbMeltEnum,&smelt_out[0],P1Enum));
+			this->AddInput2(TemperatureSEMICEnum,&tsurf_out[0],P1Enum); // TODO add TemperatureSEMICEnum to EnumDefinitions
+			this->AddInput2(SmbMassBalanceEnum,&smb_out[0],P1Enum);
+			this->AddInput2(SmbAccumulationEnum,&saccu_out[0],P1Enum);
+			this->AddInput2(SmbMeltEnum,&smelt_out[0],P1Enum);
 			break;
 		case PentaEnum:
@@ -3652,4 +3610,7 @@
 void       Element::SmbGemb(){/*{{{*/
 
+	/*only compute SMB at the surface: */
+	if (!IsOnSurface()) return;
+
 	/*Intermediary variables: {{{*/
 	IssmDouble isinitialized=0.0;
@@ -3664,5 +3625,4 @@
 	IssmDouble C=0.0;
 	IssmDouble Tz,Vz=0.0;
-	IssmDouble rho_ice, rho_water,aSnow,aIce;
 	IssmDouble time,dt,starttime,finaltime;
 	IssmDouble timeclim=0.0;
@@ -3704,5 +3664,4 @@
 	int offsetend=-1;
 	IssmDouble time0, timeend, delta;
-
 	/*}}}*/
 	/*Output variables:{{{ */
@@ -3728,5 +3687,4 @@
 	IssmDouble  mAdd = 0.0;
 	IssmDouble  dz_add = 0.0;
-
 	IssmDouble* dzini=NULL;
 	IssmDouble* dini = NULL;
@@ -3737,17 +3695,13 @@
 	IssmDouble* aini = NULL;
 	IssmDouble* Tini = NULL;
-
 	int         m=0;
 	int         count=0;
 	/*}}}*/
 
-	/*only compute SMB at the surface: */
-	if (!IsOnSurface()) return;
-
 	/*Retrieve material properties and parameters:{{{ */
-	rho_ice = FindParam(MaterialsRhoIceEnum);
-	rho_water = FindParam(MaterialsRhoFreshwaterEnum);
-	parameters->FindParam(&aSnow,SmbASnowEnum);
-	parameters->FindParam(&aIce,SmbAIceEnum);
+	IssmDouble rho_ice   = FindParam(MaterialsRhoIceEnum);
+	IssmDouble rho_water = FindParam(MaterialsRhoFreshwaterEnum);
+	IssmDouble aSnow     = parameters->FindParam(SmbASnowEnum);
+	IssmDouble aIce      = parameters->FindParam(SmbAIceEnum);
 	parameters->FindParam(&time,TimeEnum);                        /*transient core time at which we run the smb core*/
 	parameters->FindParam(&dt,TimesteppingTimeStepEnum);          /*transient core time step*/
@@ -3776,31 +3730,32 @@
 	parameters->FindParam(&thermo_scaling,SmbThermoDeltaTScalingEnum);
 	parameters->FindParam(&adThresh,SmbAdThreshEnum);
-
 	/*}}}*/
 	/*Retrieve inputs: {{{*/
-	Input* zTop_input=this->GetInput(SmbZTopEnum); _assert_(zTop_input);
-	Input* dzTop_input=this->GetInput(SmbDzTopEnum); _assert_(dzTop_input);
-	Input* dzMin_input=this->GetInput(SmbDzMinEnum); _assert_(dzMin_input);
-	Input* zMax_input=this->GetInput(SmbZMaxEnum); _assert_(zMax_input);
-	Input* zMin_input=this->GetInput(SmbZMinEnum); _assert_(zMin_input);
-	Input* zY_input=this->GetInput(SmbZYEnum); _assert_(zY_input);
-	Input* Tmean_input=this->GetInput(SmbTmeanEnum); _assert_(Tmean_input);
-	Input* Vmean_input=this->GetInput(SmbVmeanEnum); _assert_(Vmean_input);
-	Input* C_input=this->GetInput(SmbCEnum); _assert_(C_input);
-	Input* Tz_input=this->GetInput(SmbTzEnum); _assert_(Tz_input);
-	Input* Vz_input=this->GetInput(SmbVzEnum); _assert_(Vz_input);
-	Input* Ta_input=this->GetInput(SmbTaEnum); _assert_(Ta_input);
-	Input* V_input=this->GetInput(SmbVEnum); _assert_(V_input);
-	Input* Dlwr_input=this->GetInput(SmbDlwrfEnum); _assert_(Dlwr_input);
-	Input* Dswr_input=this->GetInput(SmbDswrfEnum); _assert_(Dswr_input);
-	Input* P_input=this->GetInput(SmbPEnum); _assert_(P_input);
-	Input* eAir_input=this->GetInput(SmbEAirEnum); _assert_(eAir_input);
-	Input* pAir_input=this->GetInput(SmbPAirEnum); _assert_(pAir_input);
-	Input* teValue_input=this->GetInput(SmbTeValueEnum); _assert_(teValue_input);
-	Input* aValue_input=this->GetInput(SmbAValueEnum); _assert_(aValue_input);
-	Input* isinitialized_input=this->GetInput(SmbIsInitializedEnum); _assert_(isinitialized_input);
+	_error_("fix....");
+	Input2 *zTop_input          = this->GetInput2(SmbZTopEnum);         _assert_(zTop_input);
+	Input2 *dzTop_input         = this->GetInput2(SmbDzTopEnum);        _assert_(dzTop_input);
+	Input2 *dzMin_input         = this->GetInput2(SmbDzMinEnum);        _assert_(dzMin_input);
+	Input2 *zMax_input          = this->GetInput2(SmbZMaxEnum);         _assert_(zMax_input);
+	Input2 *zMin_input          = this->GetInput2(SmbZMinEnum);         _assert_(zMin_input);
+	Input2 *zY_input            = this->GetInput2(SmbZYEnum);           _assert_(zY_input);
+	Input2 *Tmean_input         = this->GetInput2(SmbTmeanEnum);        _assert_(Tmean_input);
+	Input2 *Vmean_input         = this->GetInput2(SmbVmeanEnum);        _assert_(Vmean_input);
+	Input2 *C_input             = this->GetInput2(SmbCEnum);            _assert_(C_input);
+	Input2 *Tz_input            = this->GetInput2(SmbTzEnum);           _assert_(Tz_input);
+	Input2 *Vz_input            = this->GetInput2(SmbVzEnum);           _assert_(Vz_input);
+	Input *Ta_input            = this->GetInput(SmbTaEnum);            _assert_(Ta_input);
+	Input  *V_input             = this->GetInput(SmbVEnum);             _assert_(V_input);
+	Input  *Dlwr_input          = this->GetInput(SmbDlwrfEnum);         _assert_(Dlwr_input);
+	Input  *Dswr_input          = this->GetInput(SmbDswrfEnum);         _assert_(Dswr_input);
+	Input  *P_input             = this->GetInput(SmbPEnum);             _assert_(P_input);
+	Input  *eAir_input          = this->GetInput(SmbEAirEnum);          _assert_(eAir_input);
+	Input  *pAir_input          = this->GetInput(SmbPAirEnum);          _assert_(pAir_input);
+	Input2 *teValue_input       = this->GetInput2(SmbTeValueEnum);      _assert_(teValue_input);
+	Input2 *aValue_input        = this->GetInput2(SmbAValueEnum);       _assert_(aValue_input);
+
 	/*Retrieve input values:*/
 	Gauss* gauss=this->NewGauss(1); gauss->GaussPoint(0);
 
+	this->GetInputValue(&isinitialized,SmbIsInitializedEnum);
 	zTop_input->GetInputValue(&zTop,gauss);
 	dzTop_input->GetInputValue(&dzTop,gauss);
@@ -3816,5 +3771,4 @@
 	teValue_input->GetInputValue(&teValue,gauss);
 	aValue_input->GetInputValue(&aValue,gauss);
-	isinitialized_input->GetInputValue(&isinitialized);
 	/*}}}*/
 
@@ -4059,4 +4013,5 @@
 
 	/*Save generated inputs: */
+	_error_("Fix this mess");
 	this->AddInput(new DoubleArrayInput(SmbDzEnum,dz,m));
 	this->AddInput(new DoubleArrayInput(SmbDEnum,d,m));
@@ -4239,4 +4194,141 @@
 
 }/*}}}*/
+void       Element::StrainRateESA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){/*{{{*/
+
+	/*Intermediaries*/
+	IssmDouble dvx[3];
+	IssmDouble dvy[3];
+
+	/*Check that both inputs have been found*/
+	if(!vx_input || !vy_input){
+		_error_("Input missing. Here are the input pointers we have for vx: " << vx_input << ", vy: " << vy_input << "\n");
+	}
+
+	/*Get strain rate assuming that epsilon has been allocated*/
+	vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+	vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
+	epsilon[0] = dvx[0];	// normal strain rate x-direction
+	epsilon[1] = dvy[1]; // normal strain rate y-direction
+	epsilon[2] = 0.5*(dvx[1] + dvy[0]); // shear strain rate
+	epsilon[3] = 0.5*(dvx[1] - dvy[0]); // rotation rate
+
+}/*}}}*/
+void       Element::StrainRateFS(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input){/*{{{*/
+	/*Compute the 3d Strain Rate (6 components):
+	 *
+	 * epsilon=[exx eyy ezz exy exz eyz]
+	 */
+
+	/*Intermediaries*/
+	IssmDouble dvx[3];
+	IssmDouble dvy[3];
+	IssmDouble dvz[3];
+
+	/*Check that both inputs have been found*/
+	if (!vx_input || !vy_input || !vz_input){
+		_error_("Input missing. Here are the input pointers we have for vx: " << vx_input << ", vy: " << vy_input << ", vz: " << vz_input << "\n");
+	}
+
+	/*Get strain rate assuming that epsilon has been allocated*/
+	vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+	vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
+	vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
+
+	epsilon[0] = dvx[0];
+	epsilon[1] = dvy[1];
+	epsilon[2] = dvz[2];
+	epsilon[3] = 0.5*(dvx[1] + dvy[0]);
+	epsilon[4] = 0.5*(dvx[2] + dvz[0]);
+	epsilon[5] = 0.5*(dvy[2] + dvz[1]);
+
+}/*}}}*/
+void       Element::StrainRateHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){/*{{{*/
+	/*Compute the 3d Blatter/HOStrain Rate (5 components):
+	 *
+	 * epsilon=[exx eyy exy exz eyz]
+	 *
+	 * with exz=1/2 du/dz
+	 *      eyz=1/2 dv/dz
+	 *
+	 * the contribution of vz is neglected
+	 */
+
+	/*Intermediaries*/
+	IssmDouble dvx[3];
+	IssmDouble dvy[3];
+
+	/*Check that both inputs have been found*/
+	if (!vx_input || !vy_input){
+		_error_("Input missing. Here are the input pointers we have for vx: " << vx_input << ", vy: " << vy_input << "\n");
+	}
+
+	/*Get strain rate assuming that epsilon has been allocated*/
+	vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+	vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
+	epsilon[0] = dvx[0];
+	epsilon[1] = dvy[1];
+	epsilon[2] = 0.5*(dvx[1] + dvy[0]);
+	epsilon[3] = 0.5*dvx[2];
+	epsilon[4] = 0.5*dvy[2];
+
+}/*}}}*/
+void       Element::StrainRateHO2dvertical(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){/*{{{*/
+	/*Compute the 2d Blatter/HOStrain Rate (2 components):
+	 *
+	 * epsilon=[exx exz]
+	 *
+	 * with exz=1/2 du/dz
+	 *
+	 * the contribution of vz is neglected
+	 */
+
+	/*Intermediaries*/
+	IssmDouble dvx[3];
+
+	/*Check that both inputs have been found*/
+	if (!vx_input){
+		_error_("Input missing. Here are the input pointers we have for vx: " << vx_input <<"\n");
+	}
+
+	/*Get strain rate assuming that epsilon has been allocated*/
+	vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+	epsilon[0] = dvx[0];
+	epsilon[1] = 0.5*dvx[1];
+
+}/*}}}*/
+void       Element::StrainRateSSA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){/*{{{*/
+
+	/*Intermediaries*/
+	IssmDouble dvx[3];
+	IssmDouble dvy[3];
+
+	/*Check that both inputs have been found*/
+	if(!vx_input || !vy_input){
+		_error_("Input missing. Here are the input pointers we have for vx: " << vx_input << ", vy: " << vy_input << "\n");
+	}
+
+	/*Get strain rate assuming that epsilon has been allocated*/
+	vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+	vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
+	epsilon[0] = dvx[0];
+	epsilon[1] = dvy[1];
+	epsilon[2] = 0.5*(dvx[1] + dvy[0]);
+
+}/*}}}*/
+void       Element::StrainRateSSA1d(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input){/*{{{*/
+
+	/*Intermediaries*/
+	IssmDouble dvx[3];
+
+	/*Check that both inputs have been found*/
+	if (!vx_input){
+		_error_("Input missing. Here are the input pointers we have for vx: " << vx_input << "\n");
+	}
+
+	/*Get strain rate assuming that epsilon has been allocated*/
+	vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+	*epsilon = dvx[0];
+
+}/*}}}*/
 void       Element::StressMaxPrincipalCreateInput(void){/*{{{*/
 
@@ -4260,14 +4352,14 @@
 	/*Retrieve all inputs and parameters*/
 	this->GetVerticesCoordinatesBase(&xyz_list);
-	Input* sigma_xx_input  = this->GetInput(StressTensorxxEnum); _assert_(sigma_xx_input);
-	Input* sigma_yy_input  = this->GetInput(StressTensoryyEnum); _assert_(sigma_yy_input);
-	Input* sigma_xy_input  = this->GetInput(StressTensorxyEnum); _assert_(sigma_xy_input);
-	Input* sigma_xz_input  = NULL;
-	Input* sigma_yz_input  = NULL;
-	Input* sigma_zz_input  = NULL;
+	Input2* sigma_xx_input  = this->GetInput2(StressTensorxxEnum); _assert_(sigma_xx_input);
+	Input2* sigma_yy_input  = this->GetInput2(StressTensoryyEnum); _assert_(sigma_yy_input);
+	Input2* sigma_xy_input  = this->GetInput2(StressTensorxyEnum); _assert_(sigma_xy_input);
+	Input2* sigma_xz_input  = NULL;
+	Input2* sigma_yz_input  = NULL;
+	Input2* sigma_zz_input  = NULL;
 	if(dim==3){
-		sigma_xz_input  = this->GetInput(StressTensorxzEnum); _assert_(sigma_xz_input);
-		sigma_yz_input  = this->GetInput(StressTensoryzEnum); _assert_(sigma_yz_input);
-		sigma_zz_input  = this->GetInput(StressTensorzzEnum); _assert_(sigma_zz_input);
+		sigma_xz_input  = this->GetInput2(StressTensorxzEnum); _assert_(sigma_xz_input);
+		sigma_yz_input  = this->GetInput2(StressTensoryzEnum); _assert_(sigma_yz_input);
+		sigma_zz_input  = this->GetInput2(StressTensorzzEnum); _assert_(sigma_zz_input);
 	}
 
@@ -4319,5 +4411,5 @@
 
 	/*Create input*/
-	this->AddInput(StressMaxPrincipalEnum,maxprincipal,P1Enum);
+	this->AddInput2(StressMaxPrincipalEnum,maxprincipal,P1Enum);
 
 	/*Clean up and return*/
@@ -4603,7 +4695,7 @@
 	/*Retrieve all inputs and parameters*/
 	this->GetVerticesCoordinates(&xyz_list);
-	Input* vx_input        = this->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input        = this->GetInput(VyEnum); _assert_(vy_input);
-	Input* vz_input        = this->GetInput(VzEnum); _assert_(vz_input);
+	Input2* vx_input = this->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input = this->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* vz_input = this->GetInput2(VzEnum); _assert_(vz_input);
 
 	/*loop over vertices: */
@@ -4618,5 +4710,5 @@
 
 	/*Create PentaVertex input, which will hold the basal friction:*/
-	this->AddInput(ViscousHeatingEnum,viscousheating,P1Enum);
+	this->AddInput2(ViscousHeatingEnum,viscousheating,P1Enum);
 
 	/*Clean up and return*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 24335)
@@ -23,6 +23,10 @@
 class Materials;
 class Material;
+class Inputs2;
 class Inputs;
+class Input2;
 class Input;
+class ElementInput2;
+class DatasetInput2;
 class IoModel;
 class Gauss;
@@ -39,9 +43,13 @@
 		int          id;
 		int          sid;
+		int          lid;
 		Inputs      *inputs;
+		Inputs2     *inputs2;
 		Node       **nodes;
 		Vertex     **vertices;
 		Material    *material;
 		Parameters  *parameters;
+		bool         isonsurface;
+		bool         isonbase;
 
 		int* element_type_list;
@@ -68,8 +76,8 @@
 		void               SmbGradCompParameterization(void);
 		IssmDouble         Divergence(void);
-		void               dViscositydBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
-		void               dViscositydBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
-		void               dViscositydBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
-		void               dViscositydDSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
+		void               dViscositydBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input);
+		void               dViscositydBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input);
+		void               dViscositydBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input);
+		void               dViscositydDSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input);
 		void               Echo();
 		void               FindParam(bool* pvalue,int paramenum);
@@ -89,4 +97,5 @@
 		void               GetInputListOnNodes(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue);
 		void               GetInputListOnNodesVelocity(IssmDouble* pvalue,int enumtype);
+		void               GetInputListOnVertices(IssmDouble* pvalue,ElementInput2* input);
 		void               GetInputListOnVertices(IssmDouble* pvalue,int enumtype);
 		void               GetInputListOnVerticesAtTime(IssmDouble* pvalue,int enumtype,IssmDouble time);
@@ -95,4 +104,6 @@
 		void               GetInputValue(bool* pvalue,int enum_type);
 		void               GetInputValue(int* pvalue,int enum_type);
+		void               GetInput2Value(bool* pvalue,int enum_type);
+		void               GetInput2Value(int* pvalue,int enum_type);
 		void               GetInputValue(IssmDouble* pvalue,int enum_type);
 		void               GetInputValue(IssmDouble* pvalue,Gauss* gauss,int enum_type);
@@ -124,8 +135,7 @@
 		int                Id();
 		void               InputChangeName(int enum_type,int enum_type_old);
-		void               InputCreate(IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
-		void               ControlInputCreate(IssmDouble* doublearray,IssmDouble* independents_min,IssmDouble* independents_max,IoModel* iomodel,int M,int N,int input_enum,int id);
-		void					 DatasetInputAdd(int enum_type,IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code,int input_enum);
-		void               InputDuplicate(int original_enum,int new_enum);
+		void               InputCreate(IssmDouble* vector,Inputs2* inputs2,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
+		void               ControlInputCreate(IssmDouble* doublearray,IssmDouble* independents_min,IssmDouble* independents_max,Inputs2*inputs2,IoModel* iomodel,int M,int N,IssmDouble scale,int input_enum,int id);
+		void					 DatasetInputAdd(int enum_type,IssmDouble* vector,Inputs2* inputs2,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code,int input_enum);
 		void               InputUpdateFromConstant(IssmDouble constant, int name);
 		void               InputUpdateFromConstant(int constant, int name);
@@ -134,4 +144,6 @@
 		bool               IsFloating();
 		bool               IsGrounded();
+		bool               IsOnBase();
+		bool               IsOnSurface();
 		bool               IsIceInElement();
 		bool               IsLandInElement();
@@ -159,4 +171,7 @@
 		void               ResultToVector(Vector<IssmDouble>* vector,int output_enum);
 		void               SetwiseNodeConnectivity(int* d_nz,int* o_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum);
+		void               SetBoolInput(Inputs2* inputs2,int enum_in,bool value);
+
+		void               SetIntInput(Inputs2* inputs2,int enum_in,int value);
 		void               SmbSemic();
 		int                Sid();
@@ -168,4 +183,10 @@
 		void               StrainRateSSA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
 		void               StrainRateSSA1d(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input);
+		void               StrainRateESA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input);
+		void               StrainRateFS(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input);
+		void               StrainRateHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input);
+		void               StrainRateHO2dvertical(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input);
+		void               StrainRateSSA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input);
+		void               StrainRateSSA1d(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input);
 		void               StressMaxPrincipalCreateInput(void);
 		IssmDouble         TotalFloatingBmb(IssmDouble* mask, bool scaled);
@@ -204,6 +225,8 @@
 		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       AddControlInput(int input_enum, IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max, int interpolation_enum,int id){_error_("not supported yet");};
-		virtual void       DatasetInputCreate(IssmDouble* array,int M,int N,int* individual_enums,int num_inputs,IoModel* iomodel,int input_enum){_error_("not supported");};
+		virtual void       AddBasalInput2(int input_enum, IssmDouble* values, int interpolation_enum){_error_("not implemented");};
+		virtual void       AddInput2(int input_enum, IssmDouble* values, int interpolation_enum){_error_("not implemented");};
+		virtual void       AddControlInput(int input_enum,Inputs2* inputs2,IoModel* iomodel,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max, int interpolation_enum,int id){_error_("not supported yet");};
+		virtual void       DatasetInputCreate(IssmDouble* array,int M,int N,int* individual_enums,int num_inputs,Inputs2* inputs2,IoModel* iomodel,int input_enum){_error_("not supported");};
 		virtual void       AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part)=0;
 		virtual void		 BasalNodeIndices(int* pnumindices,int** pindices,int finiteelement){_error_("not implemented yet");};
@@ -219,5 +242,5 @@
 		virtual void       ComputeStressTensor(void)=0;
 		virtual void       ComputeEsaStrainAndVorticity(void)=0;
-		virtual void       Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters)=0;
+		virtual void       Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters,Inputs2* inputs2in)=0;
 		virtual void       ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N,int M)=0;
 		virtual void       ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index)=0;
@@ -236,4 +259,7 @@
 		virtual IssmDouble GetIcefrontArea(){_error_("not implemented");};
 		virtual void       GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum)=0;
+		virtual DatasetInput2* GetDatasetInput2(int inputenum){_error_("not implemented");};
+		virtual Input2*    GetInput2(int inputenum)=0;
+		virtual Input2*    GetInput2(int inputenum,IssmDouble time)=0;
 		virtual void       GetInputValue(IssmDouble* pvalue,Vertex* vertex,int enumtype){_error_("not implemented yet");};
 		virtual void       GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){_error_("not implemented yet");};
@@ -255,4 +281,5 @@
 		virtual IssmDouble GroundinglineMassFlux(bool scaled){_error_("not implemented");};
 		virtual void       InputDepthAverageAtBase(int enum_type,int average_enum_type)=0;
+		virtual void       DatasetInputExtrude(int input_enum,int start){_error_("not implemented yet");};
 		virtual void       InputExtrude(int input_enum,int start)=0;
 		virtual void       InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum)=0;
@@ -267,6 +294,5 @@
 		virtual bool       IsIcefront(void)=0;
 		virtual bool       IsNodeOnShelfFromFlags(IssmDouble* flags)=0;
-		virtual bool       IsOnBase()=0;
-		virtual bool       IsOnSurface()=0;
+
 		virtual bool       IsZeroLevelset(int levelset_enum)=0;
 		virtual void       JacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
@@ -284,8 +310,8 @@
 		virtual Gauss*     NewGauss(void)=0;
 		virtual Gauss*     NewGauss(int order)=0;
-      virtual Gauss*     NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order)=0;
-      virtual Gauss*     NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order_horiz,int order_vert)=0;
-      virtual Gauss*     NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,bool mainlyfloating,int order)=0;
-      virtual Gauss*     NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,int order)=0;
+		virtual Gauss*     NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order)=0;
+		virtual Gauss*     NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order_horiz,int order_vert)=0;
+		virtual Gauss*     NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,bool mainlyfloating,int order)=0;
+		virtual Gauss*     NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,int order)=0;
 		virtual Gauss*     NewGaussBase(int order)=0;
 		virtual Gauss*     NewGaussLine(int vertex1,int vertex2,int order)=0;
@@ -313,4 +339,7 @@
 		virtual void       ResetHooks()=0;
 		virtual void       RignotMeltParameterization(void){_error_("not implemented yet");};
+		virtual void       SetElementInput(int enum_in,IssmDouble values){_error_("not implemented yet");};
+		virtual void       SetElementInput(Inputs2* inputs2,int enum_in,IssmDouble values){_error_("not implemented yet");};
+		virtual void       SetElementInput(Inputs2* inputs2,int numindices,int* indices,IssmDouble* values,int enum_in){_error_("not implemented yet");};
 		virtual void       SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset,int N,int M)=0;
 		virtual void       SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index)=0;
@@ -332,5 +361,5 @@
 		virtual IssmDouble TotalGroundedBmb(bool scaled)=0;
 		virtual IssmDouble TotalSmb(bool scaled)=0;
-		virtual void       Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finite_element)=0;
+		virtual void       Update(Inputs2* inputs2,int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finite_element)=0;
 		virtual void       UpdateConstraintsExtrudeFromBase(void)=0;
 		virtual void       UpdateConstraintsExtrudeFromTop(void)=0;
@@ -342,5 +371,5 @@
 		virtual void       VerticalSegmentIndices(int** pindices,int* pnumseg)=0;
 		virtual void       VerticalSegmentIndicesBase(int** pindices,int* pnumseg)=0;
-		virtual void       ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input)=0;
+		virtual void       ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input){_error_("not implemented yet");};
 		virtual void       WriteFieldIsovalueSegment(DataSet* segments,int fieldenum,IssmDouble fieldvalue){_error_("not implemented yet");};
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Elements.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Elements.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Elements/Elements.cpp	(revision 24335)
@@ -34,26 +34,14 @@
 
 /*Object management*/
-void Elements::Configure(Elements* elements,Loads* loads, Nodes* nodes, Vertices* vertices, Materials* materials,Parameters* parameters){/*{{{*/
+void Elements::Configure(Elements* elements,Loads* loads, Nodes* nodes, Vertices* vertices, Materials* materials,Parameters* parameters,Inputs2* inputs2){/*{{{*/
 
 	vector<Object*>::iterator object;
-	Element* element=NULL;
 
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		element=xDynamicCast<Element*>((*object));
-		element->Configure(elements,loads,nodes,vertices,materials,parameters);
-
+	for(object=objects.begin() ; object < objects.end(); object++ ){
+		Element* element=xDynamicCast<Element*>((*object));
+		element->Configure(elements,loads,nodes,vertices,materials,parameters,inputs2);
 	}
 
-}
-/*}}}*/
-void Elements::InputDuplicate(int input_enum,int output_enum){/*{{{*/
-
-	for(int i=0;i<this->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->GetObjectByOffset(i));
-		element->InputDuplicate(input_enum,output_enum);
-	}
-}
-/*}}}*/
+}/*}}}*/
 int  Elements::MaxNumNodes(void){/*{{{*/
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Elements.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Elements.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Elements/Elements.h	(revision 24335)
@@ -24,6 +24,5 @@
 
 		/*numerics*/
-		void   Configure(Elements* elements,Loads* loads, Nodes* nodes, Vertices* vertices, Materials* materials,Parameters* parameters);
-		void   InputDuplicate(int input_enum,int output_enum);
+		void   Configure(Elements* elements,Loads* loads, Nodes* nodes, Vertices* vertices, Materials* materials,Parameters* parameters,Inputs2* inputs2);
 		int    MaxNumNodes(void);
 		int    NumberOfElements(void);
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 24335)
@@ -12,4 +12,8 @@
 
 #include "../classes.h"
+#include "../Inputs2/PentaInput2.h"
+#include "../Inputs2/ControlInput2.h"
+#include "../Inputs2/TransientInput2.h"
+#include "../Inputs2/DatasetInput2.h"
 #include "../../shared/shared.h"
 /*}}}*/
@@ -24,5 +28,5 @@
 }
 /*}}}*/
-Penta::Penta(int penta_id, int penta_sid,IoModel* iomodel,int nummodels)/*{{{*/
+Penta::Penta(int penta_id, int penta_sid,int penta_lid,IoModel* iomodel,int nummodels)/*{{{*/
 	:ElementHook(nummodels,penta_id,NUMVERTICES,iomodel){
 
@@ -36,4 +40,9 @@
 	this->id  = penta_id;
 	this->sid = penta_sid;
+	this->lid = penta_lid;
+
+	/*surface and base*/
+	this->isonsurface = false;
+	this->isonbase    = false;
 
 	/*Build neighbors list*/
@@ -58,4 +67,18 @@
 	/*Only allocate pointer*/
 	this->element_type_list=xNew<int>(nummodels);
+
+	/*surface and base*/
+	_assert_(iomodel->Data("md.mesh.vertexonsurface"));
+	_assert_(iomodel->Data("md.mesh.vertexonbase"));
+	this->isonsurface = false;
+	this->isonbase    = false;
+	IssmDouble sum = 0.;
+	for(int i=0;i<NUMVERTICES;i++) sum += iomodel->Data("md.mesh.vertexonsurface")[reCast<int>(iomodel->elements[(penta_id-1)*NUMVERTICES+i])-1];
+	_assert_(sum>=0 && sum<4);
+	if(sum>2.5) this->isonsurface = true;
+	sum = 0.;
+	for(int i=0;i<NUMVERTICES;i++) sum += iomodel->Data("md.mesh.vertexonbase")[reCast<int>(iomodel->elements[(penta_id-1)*NUMVERTICES+i])-1];
+	_assert_(sum>=0 && sum<4);
+	if(sum>2.5) this->isonbase = true;
 }
 /*}}}*/
@@ -98,6 +121,9 @@
 	penta->id  = this->id;
 	penta->sid = this->sid;
+	penta->lid = this->lid;
 	if(this->inputs) penta->inputs = (Inputs*)(this->inputs->Copy());
 	else penta->inputs=new Inputs();
+	penta->isonbase  = this->isonbase;
+	penta->isonsurface  = this->isonsurface;
 
 	/*point parameters: */
@@ -123,4 +149,6 @@
 
 	MARSHALLING_ENUM(PentaEnum);
+	MARSHALLING(this->isonsurface);
+	MARSHALLING(this->isonbase);
 
 	/*Call parent classes: */
@@ -137,4 +165,48 @@
 
 /*Other*/
+void       Penta::AddBasalInput2(int input_enum,IssmDouble* values, int interpolation_enum){/*{{{*/
+
+	_assert_(this->inputs2);
+	if(!IsOnBase()) return;
+	else{
+		if(interpolation_enum==P1Enum){
+			IssmDouble extrudedvalues[NUMVERTICES];
+			for(int i=0;i<NUMVERTICES2D;i++){
+				extrudedvalues[i]=values[i];
+				extrudedvalues[i+NUMVERTICES2D]=values[i];
+			}
+			Penta* penta=this;
+			for(;;){
+				penta->AddInput2(input_enum,&extrudedvalues[0],P1Enum);
+				if (penta->IsOnSurface()) break;
+				penta=penta->GetUpperPenta(); _assert_(penta->Id()!=this->id);
+			}
+		}
+		else _error_("not implemented yet");
+	}
+
+}
+/*}}}*/
+void       Penta::AddInput2(int input_enum,IssmDouble* values, int interpolation_enum){/*{{{*/
+
+	/**/
+	int vertexlids[NUMVERTICES];
+
+	/*Call inputs method*/
+	_assert_(this->inputs2);
+	switch(interpolation_enum){
+		case P1Enum:
+			for(int i=0;i<NUMVERTICES;i++) vertexlids[i]=this->vertices[i]->lid;
+			inputs2->SetPentaInput(input_enum,interpolation_enum,NUMVERTICES,vertexlids,values);
+			break;
+		case P1DGEnum:
+			inputs2->SetPentaInput(input_enum,interpolation_enum,this->lid,NUMVERTICES,values);
+			break;
+		default:
+			inputs2->SetPentaInput(input_enum,interpolation_enum,this->lid,this->GetNumberOfNodes(interpolation_enum),values);
+	}
+
+}
+/*}}}*/
 void       Penta::AddBasalInput(int input_enum,IssmDouble* values, int interpolation_enum){/*{{{*/
 
@@ -165,5 +237,52 @@
 
 	_assert_(this->inputs);
+	printf("-------------- file: Penta.cpp line: %i\n",__LINE__); 
 	this->inputs->AddInput(new PentaInput(input_enum,values,interpolation_enum));
+}
+/*}}}*/
+void       Penta::AddControlInput(int input_enum,Inputs2* inputs2,IoModel* iomodel,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max, int interpolation_enum,int id){/*{{{*/
+
+	/*Intermediaries*/
+	int vertexlids[NUMVERTICES];
+
+	_assert_(iomodel->elements);
+	for(int i=0;i<NUMVERTICES;i++){
+		int vertexid =reCast<int>(iomodel->elements[NUMVERTICES*this->Sid()+i]); //ids for vertices are in the elements array from Matlab
+		vertexlids[i]=iomodel->my_vertices_lids[vertexid-1];
+	}
+
+	/*Call inputs method*/
+	switch(interpolation_enum){
+		case P1Enum:
+			inputs2->SetPentaControlInput(input_enum,PentaInput2Enum,interpolation_enum,id,NUMVERTICES,vertexlids,values,values_min,values_max);
+			break;
+		default:
+			_error_("Cannot add \""<<EnumToStringx(input_enum)<<"\" interpolation "<<EnumToStringx(interpolation_enum)<<" not supported");
+	}
+
+}
+/*}}}*/
+void       Penta::DatasetInputCreate(IssmDouble* array,int M,int N,int* individual_enums,int num_inputs,Inputs2* inputs2,IoModel* iomodel,int input_enum){/*{{{*/
+
+	_error_("not implemeted");
+	IssmDouble nodeinputs[NUMVERTICES];
+	if(num_inputs<1) _error_("Cannot create a DatasetInput of size <1");
+	if(M!=iomodel->numberofvertices) _error_("not supported yet");
+	if(N!=num_inputs) _error_("sizes are not consistent");
+
+	int penta_vertex_ids[NUMVERTICES];
+
+	for(int k=0;k<6;k++){
+		penta_vertex_ids[k]=reCast<int>(iomodel->elements[6*this->Sid()+k]); //ids for vertices are in the elements array from Matlab
+	}
+	/*Create inputs and add to DataSetInput*/
+	DatasetInput* datasetinput=new DatasetInput(input_enum);
+	for(int i=0;i<num_inputs;i++){
+		for(int j=0;j<NUMVERTICES;j++)nodeinputs[j]=array[(penta_vertex_ids[j]-1)*N+i];
+		datasetinput->AddInput(new PentaInput(input_enum,nodeinputs,P1Enum),individual_enums[i]);
+	}
+
+	/*Add datasetinput to element inputs*/
+	this->inputs->AddInput(datasetinput);
 }
 /*}}}*/
@@ -201,13 +320,13 @@
 
 	/*Retrieve all inputs and parameters we will need*/
-	Input* vx_input = inputs->GetInput(VxAverageEnum); _assert_(vx_input);
-	Input* vy_input = inputs->GetInput(VyAverageEnum); _assert_(vy_input);
-	Input* gr_input = inputs->GetInput(MaskGroundediceLevelsetEnum); _assert_(gr_input);
-	Input* bs_input = inputs->GetInput(BaseEnum);                    _assert_(bs_input);
-	Input* B_input  = inputs->GetInput(MaterialsRheologyBbarEnum);   _assert_(B_input);
-	Input* n_input  = inputs->GetInput(MaterialsRheologyNEnum);   _assert_(n_input);
-	Input* smax_fl_input = inputs->GetInput(CalvingStressThresholdFloatingiceEnum); _assert_(smax_fl_input);
-	Input* smax_gr_input = inputs->GetInput(CalvingStressThresholdGroundediceEnum); _assert_(smax_gr_input);
-	Input* sl_input  = inputs->GetInput(SealevelEnum); _assert_(sl_input);
+	Input2* vx_input = this->GetInput2(VxAverageEnum); _assert_(vx_input);
+	Input2* vy_input = this->GetInput2(VyAverageEnum); _assert_(vy_input);
+	Input2* gr_input = this->GetInput2(MaskGroundediceLevelsetEnum); _assert_(gr_input);
+	Input2* bs_input = this->GetInput2(BaseEnum);                    _assert_(bs_input);
+	Input2* B_input  = this->GetInput2(MaterialsRheologyBbarEnum);   _assert_(B_input);
+	Input2* n_input  = this->GetInput2(MaterialsRheologyNEnum);   _assert_(n_input);
+	Input2* smax_fl_input = this->GetInput2(CalvingStressThresholdFloatingiceEnum); _assert_(smax_fl_input);
+	Input2* smax_gr_input = this->GetInput2(CalvingStressThresholdGroundediceEnum); _assert_(smax_gr_input);
+	Input2* sl_input  = this->GetInput2(SealevelEnum); _assert_(sl_input);
 
 	/* Start looping on the number of vertices: */
@@ -263,8 +382,8 @@
 
 	/*Add input*/
-	this->inputs->AddInput(new PentaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(SigmaVMEnum,&sigma_vm[0],P1Enum));
+	this->AddInput2(CalvingratexEnum,&calvingratex[0],P1DGEnum);
+	this->AddInput2(CalvingrateyEnum,&calvingratey[0],P1DGEnum);
+	this->AddInput2(CalvingCalvingrateEnum,&calvingrate[0],P1DGEnum);
+	this->AddInput2(SigmaVMEnum,&sigma_vm[0],P1DGEnum);
 
 	this->InputExtrude(CalvingratexEnum,-1);
@@ -293,9 +412,9 @@
 
 	/*Retrieve all inputs and parameters we will need*/
-	Input* vx_input=inputs->GetInput(VxEnum);																		_assert_(vx_input);
-	Input* vy_input=inputs->GetInput(VyEnum);																		_assert_(vy_input);
-	Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum);								_assert_(strainparallel_input);
-	Input* strainperpendicular_input=inputs->GetInput(StrainRateperpendicularEnum);              _assert_(strainperpendicular_input);
-	Input* levermanncoeff_input=inputs->GetInput(CalvinglevermannCoeffEnum);                     _assert_(levermanncoeff_input);
+	Input2* vx_input=this->GetInput2(VxEnum);																		_assert_(vx_input);
+	Input2* vy_input=this->GetInput2(VyEnum);																		_assert_(vy_input);
+	Input2* strainparallel_input=this->GetInput2(StrainRateparallelEnum);								_assert_(strainparallel_input);
+	Input2* strainperpendicular_input=this->GetInput2(StrainRateperpendicularEnum);              _assert_(strainperpendicular_input);
+	Input2* levermanncoeff_input=this->GetInput2(CalvinglevermannCoeffEnum);                     _assert_(levermanncoeff_input);
 
 	/* Start looping on the number of vertices: */
@@ -322,7 +441,7 @@
 
 	/*Add input*/
-	this->inputs->AddInput(new PentaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
+	this->AddInput2(CalvingratexEnum,&calvingratex[0],P1DGEnum);
+	this->AddInput2(CalvingrateyEnum,&calvingratey[0],P1DGEnum);
+	this->AddInput2(CalvingCalvingrateEnum,&calvingrate[0],P1DGEnum);
 
 	/*Clean up and return*/
@@ -336,5 +455,5 @@
 	if(!IsIceInElement() || !IsZeroLevelset(MaskIceLevelsetEnum)){
 		IssmDouble flux_per_area=0;
-		this->inputs->AddInput(new PentaInput(CalvingFluxLevelsetEnum,&flux_per_area,P0Enum));
+		this->AddInput2(CalvingFluxLevelsetEnum,&flux_per_area,P0Enum);
 	}
 	else{
@@ -424,9 +543,9 @@
 		IssmDouble calvingratex,calvingratey,thickness,Jdet,flux_per_area;
 		IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-		Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
-		Input* calvingratex_input=NULL;
-		Input* calvingratey_input=NULL;
-		calvingratex_input=inputs->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-		calvingratey_input=inputs->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
+		Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
+		Input2* calvingratex_input=NULL;
+		Input2* calvingratey_input=NULL;
+		calvingratex_input=this->GetInput2(CalvingratexEnum); _assert_(calvingratex_input);
+		calvingratey_input=this->GetInput2(CalvingrateyEnum); _assert_(calvingratey_input);
 
 		/*Start looping on Gaussian points*/
@@ -446,5 +565,5 @@
 		}
 
-		this->inputs->AddInput(new PentaInput(CalvingFluxLevelsetEnum,&flux_per_area,P0Enum));
+		this->AddInput2(CalvingFluxLevelsetEnum,&flux_per_area,P0Enum);
 
 		/*Clean up and return*/
@@ -458,5 +577,5 @@
 	if(!IsIceInElement() || !IsZeroLevelset(MaskIceLevelsetEnum)){
 		IssmDouble flux_per_area=0;
-		this->inputs->AddInput(new PentaInput(CalvingMeltingFluxLevelsetEnum,&flux_per_area,P0Enum));
+		this->AddInput2(CalvingMeltingFluxLevelsetEnum,&flux_per_area,P0Enum);
 	}
 	else{
@@ -546,15 +665,15 @@
 		IssmDouble calvingratex,calvingratey,vx,vy,vel,meltingrate,meltingratex,meltingratey,thickness,Jdet,flux_per_area;
 		IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-		Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
-		Input* calvingratex_input=NULL;
-		Input* calvingratey_input=NULL;
-		Input* vx_input=NULL;
-		Input* vy_input=NULL;
-		Input* meltingrate_input=NULL;
-		calvingratex_input=inputs->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-		calvingratey_input=inputs->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
-		vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);
-		vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);
-		meltingrate_input=inputs->GetInput(CalvingMeltingrateEnum); _assert_(meltingrate_input);
+		Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
+		Input2* calvingratex_input=NULL;
+		Input2* calvingratey_input=NULL;
+		Input2* vx_input=NULL;
+		Input2* vy_input=NULL;
+		Input2* meltingrate_input=NULL;
+		calvingratex_input=this->GetInput2(CalvingratexEnum); _assert_(calvingratex_input);
+		calvingratey_input=this->GetInput2(CalvingrateyEnum); _assert_(calvingratey_input);
+		vx_input=this->GetInput2(VxEnum); _assert_(vx_input);
+		vy_input=this->GetInput2(VyEnum); _assert_(vy_input);
+		meltingrate_input=this->GetInput2(CalvingMeltingrateEnum); _assert_(meltingrate_input);
 
 		/*Start looping on Gaussian points*/
@@ -580,5 +699,5 @@
 		}
 
-		this->inputs->AddInput(new PentaInput(CalvingMeltingFluxLevelsetEnum,&flux_per_area,P0Enum));
+		this->AddInput2(CalvingMeltingFluxLevelsetEnum,&flux_per_area,P0Enum);
 
 		/*Clean up and return*/
@@ -609,5 +728,5 @@
 	/*retrive parameters: */
 	parameters->FindParam(&analysis_type,AnalysisTypeEnum);
-	inputs->GetInputValue(&approximation,ApproximationEnum);
+	this->GetInput2Value(&approximation,ApproximationEnum);
 
 	/*Check analysis_types*/
@@ -633,8 +752,8 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* pressure_input=inputs->GetInput(PressureEnum); _assert_(pressure_input);
-	Input* vx_input=inputs->GetInput(VxEnum);             _assert_(vx_input);
-	Input* vy_input=inputs->GetInput(VyEnum);             _assert_(vy_input);
-	Input* vz_input=inputs->GetInput(VzEnum);             _assert_(vz_input);
+	Input2* pressure_input=this->GetInput2(PressureEnum); _assert_(pressure_input);
+	Input2* vx_input=this->GetInput2(VxEnum);             _assert_(vx_input);
+	Input2* vy_input=this->GetInput2(VyEnum);             _assert_(vy_input);
+	Input2* vz_input=this->GetInput2(VzEnum);             _assert_(vz_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -693,7 +812,7 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* vx_input=inputs->GetInput(VxEnum);             _assert_(vx_input);
-	Input* vy_input=inputs->GetInput(VyEnum);             _assert_(vy_input);
-	Input* vz_input=inputs->GetInput(VzEnum);             _assert_(vz_input);
+	Input2* vx_input=this->GetInput2(VxEnum);             _assert_(vx_input);
+	Input2* vy_input=this->GetInput2(VyEnum);             _assert_(vy_input);
+	Input2* vz_input=this->GetInput2(VzEnum);             _assert_(vz_input);
 
 	/* Start looping on the number of vertices: */
@@ -721,11 +840,11 @@
 
 	/*Add Stress tensor components into inputs*/
-	this->inputs->AddInput(new PentaInput(DeviatoricStressxxEnum,&tau_xx[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(DeviatoricStressxyEnum,&tau_xy[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(DeviatoricStressxzEnum,&tau_xz[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(DeviatoricStressyyEnum,&tau_yy[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(DeviatoricStressyzEnum,&tau_yz[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(DeviatoricStresszzEnum,&tau_zz[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(DeviatoricStresseffectiveEnum,&tau_eff[0],P1Enum));
+	this->AddInput2(DeviatoricStressxxEnum,&tau_xx[0],P1DGEnum);
+	this->AddInput2(DeviatoricStressxyEnum,&tau_xy[0],P1DGEnum);
+	this->AddInput2(DeviatoricStressxzEnum,&tau_xz[0],P1DGEnum);
+	this->AddInput2(DeviatoricStressyyEnum,&tau_yy[0],P1DGEnum);
+	this->AddInput2(DeviatoricStressyzEnum,&tau_yz[0],P1DGEnum);
+	this->AddInput2(DeviatoricStresszzEnum,&tau_zz[0],P1DGEnum);
+	this->AddInput2(DeviatoricStresseffectiveEnum,&tau_eff[0],P1DGEnum);
 
 	/*Clean up and return*/
@@ -750,8 +869,8 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* pressure_input=inputs->GetInput(PressureEnum); _assert_(pressure_input);
-	Input* vx_input=inputs->GetInput(VxEnum);             _assert_(vx_input);
-	Input* vy_input=inputs->GetInput(VyEnum);             _assert_(vy_input);
-	Input* vz_input=inputs->GetInput(VzEnum);             _assert_(vz_input);
+	Input2* pressure_input=this->GetInput2(PressureEnum); _assert_(pressure_input);
+	Input2* vx_input=this->GetInput2(VxEnum);             _assert_(vx_input);
+	Input2* vy_input=this->GetInput2(VyEnum);             _assert_(vy_input);
+	Input2* vz_input=this->GetInput2(VzEnum);             _assert_(vz_input);
 
 	/* Start looping on the number of vertices: */
@@ -775,10 +894,10 @@
 
 	/*Add Stress tensor components into inputs*/
-	this->inputs->AddInput(new PentaInput(StressTensorxxEnum,&sigma_xx[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(StressTensorxyEnum,&sigma_xy[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(StressTensorxzEnum,&sigma_xz[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(StressTensoryyEnum,&sigma_yy[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(StressTensoryzEnum,&sigma_yz[0],P1Enum));
-	this->inputs->AddInput(new PentaInput(StressTensorzzEnum,&sigma_zz[0],P1Enum));
+	this->AddInput2(StressTensorxxEnum,&sigma_xx[0],P1DGEnum);
+	this->AddInput2(StressTensorxyEnum,&sigma_xy[0],P1DGEnum);
+	this->AddInput2(StressTensorxzEnum,&sigma_xz[0],P1DGEnum);
+	this->AddInput2(StressTensoryyEnum,&sigma_yy[0],P1DGEnum);
+	this->AddInput2(StressTensoryzEnum,&sigma_yz[0],P1DGEnum);
+	this->AddInput2(StressTensorzzEnum,&sigma_zz[0],P1DGEnum);
 
 	/*Clean up and return*/
@@ -786,5 +905,5 @@
 }
 /*}}}*/
-void       Penta::Configure(Elements* elementsin, Loads* loadsin, Nodes* nodesin,Vertices* verticesin, Materials* materialsin, Parameters* parametersin){/*{{{*/
+void       Penta::Configure(Elements* elementsin, Loads* loadsin, Nodes* nodesin,Vertices* verticesin, Materials* materialsin, Parameters* parametersin,Inputs2* inputs2in){/*{{{*/
 
 	int analysis_counter;
@@ -812,4 +931,5 @@
 	/*point parameters to real dataset: */
 	this->parameters=parametersin;
+	this->inputs2=inputs2in;
 
 	/*get inputs configured too: */
@@ -819,25 +939,31 @@
 void       Penta::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N,int M){/*{{{*/
 
+	if(enum_type==MaterialsRheologyBbarEnum) enum_type = MaterialsRheologyBEnum;
+	if(enum_type==DamageDbarEnum)            enum_type = DamageDEnum;
+
+	_error_("not implemented");
 	int    vertexpidlist[NUMVERTICES];
 	IssmDouble grad_list[NUMVERTICES];
-	Input* grad_input=NULL;
-	Input* input=NULL;
+	Input2* grad_input=NULL;
+	Input2* input=NULL;
 
 	if(enum_type==MaterialsRheologyBbarEnum){
-		input=(Input*)inputs->GetInput(MaterialsRheologyBEnum);
+		input=this->GetInput2(MaterialsRheologyBEnum);
 	}
 	else if(enum_type==DamageDbarEnum){
-		input=(Input*)inputs->GetInput(DamageDEnum);
+		input=this->GetInput2(DamageDEnum);
 	}
 	else{
-		input=inputs->GetInput(enum_type);
+		input=this->GetInput2(enum_type);
 	}
 	if (!input) _error_("Input " << EnumToStringx(enum_type) << " not found");
-	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(enum_type) << " is not a ControlInput");
+	if(input->ObjectEnum()!=ControlInput2Enum) _error_("Input " << EnumToStringx(enum_type) << " is not a ControlInput");
 
 	GradientIndexing(&vertexpidlist[0],control_index);
-	for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[vertexpidlist[i]];
-	grad_input=new PentaInput(GradientEnum,grad_list,P1Enum);
-	((ControlInput*)input)->SetGradient(grad_input);
+
+	//for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[vertexpidlist[i]];
+	//grad_input=new PentaInput(GradientEnum,grad_list,P1Enum);
+	//((ControlInput*)input)->SetGradient(grad_input);
+	_error_("not implemented");
 
 }
@@ -845,44 +971,21 @@
 void       Penta::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){/*{{{*/
 
-	int    vertexpidlist[NUMVERTICES];
+	int        idlist[NUMVERTICES];
+	int        vertexlids[NUMVERTICES];
 	IssmDouble grad_list[NUMVERTICES];
-	Input* grad_input=NULL;
-	Input* input=NULL;
-
-	if(enum_type==MaterialsRheologyBbarEnum){
-		input=(Input*)inputs->GetInput(MaterialsRheologyBEnum);
-	}
-	else if(enum_type==DamageDbarEnum){
-		input=(Input*)inputs->GetInput(DamageDEnum);
-	}
-	else{
-		input=inputs->GetInput(enum_type);
-	}
-	if (!input) _error_("Input " << EnumToStringx(enum_type) << " not found");
-	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(enum_type) << " is not a ControlInput");
-
-	GradientIndexing(&vertexpidlist[0],control_index);
-	for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[vertexpidlist[i]];
-	grad_input=new PentaInput(GradientEnum,grad_list,P1Enum);
-	((ControlInput*)input)->SetGradient(grad_input);
-
+
+	if(enum_type==MaterialsRheologyBbarEnum) enum_type = MaterialsRheologyBEnum;
+	if(enum_type==DamageDbarEnum)            enum_type = DamageDEnum;
+
+	GradientIndexing(&idlist[0],control_index);
+	for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[idlist[i]];
+	for(int i=0;i<NUMVERTICES;i++) vertexlids[i]=this->vertices[i]->lid;
+
+	this->inputs2->SetTriaControlInputGradient(enum_type,P1Enum,NUMVERTICES,&vertexlids[0],&grad_list[0]);
 }/*}}}*/
 void       Penta::ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){/*{{{*/
 
-	Input* input=NULL;
-
-	if(control_enum==MaterialsRheologyBbarEnum){
-		input=(Input*)inputs->GetInput(MaterialsRheologyBEnum);
-	}
-	else if(control_enum==DamageDbarEnum){
-		input=(Input*)inputs->GetInput(DamageDEnum);
-	}
-	else{
-		input=inputs->GetInput(control_enum);
-	}
-	if (!input) _error_("Input " << EnumToStringx(control_enum) << " not found");
-	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(control_enum) << " is not a ControlInput");
-
 	int         sidlist[NUMVERTICES];
+	int         lidlist[NUMVERTICES];
 	int         connectivity[NUMVERTICES];
 	IssmPDouble values[NUMVERTICES];
@@ -890,6 +993,15 @@
 	IssmDouble  value,gradient;
 
+	if(control_enum==MaterialsRheologyBbarEnum) control_enum = MaterialsRheologyBEnum;
+	if(control_enum==DamageDbarEnum)            control_enum = DamageDEnum;
+
 	this->GetVerticesConnectivityList(&connectivity[0]);
 	this->GetVerticesSidList(&sidlist[0]);
+	this->GetVerticesLidList(&lidlist[0]);
+
+	ElementInput2* control_value    = this->inputs2->GetControlInput2Data(control_enum,"value");    _assert_(control_value);
+	ElementInput2* control_gradient = this->inputs2->GetControlInput2Data(control_enum,"gradient"); _assert_(control_gradient);
+	control_value->Serve(NUMVERTICES,&lidlist[0]);
+	control_gradient->Serve(NUMVERTICES,&lidlist[0]);
 
 	GaussPenta* gauss=new GaussPenta();
@@ -897,6 +1009,6 @@
 		gauss->GaussVertex(iv);
 
-		((ControlInput*)input)->GetInputValue(&value,gauss);
-		((ControlInput*)input)->GetGradientValue(&gradient,gauss);
+		control_value->GetInputValue(&value,gauss);
+		control_gradient->GetInputValue(&gradient,gauss);
 
 		values[iv]    = reCast<IssmPDouble>(value)/reCast<IssmPDouble>(connectivity[iv]);
@@ -907,5 +1019,4 @@
 	vector_control->SetValues(NUMVERTICES,&sidlist[0],&values[0],ADD_VAL);
 	vector_gradient->SetValues(NUMVERTICES,&sidlist[0],&gradients[0],ADD_VAL);
-
 }/*}}}*/
 void       Penta::CreateDistanceInputFromSegmentlist(IssmDouble* distances,int distanceenum){/*{{{*/
@@ -932,5 +1043,5 @@
 
 	/*Update Levelset*/
-	this->inputs->AddInput(new PentaInput(distanceenum,&ls[0],P1Enum));
+	this->AddInput2(distanceenum,&ls[0],P1Enum);
 }
 /*}}}*/
@@ -949,7 +1060,5 @@
 				/*Get input:*/
 				IssmDouble vel;
-				Input* vel_input;
-
-				vel_input=this->inputs->GetInput(VelEnum); _assert_(vel_input);
+				Input2* vel_input=this->GetInput2(VelEnum); _assert_(vel_input);
 				vel_input->GetInputAverage(&vel);
 
@@ -1014,5 +1123,5 @@
 
 	if(scaled==true){
-		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		Input2* scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input);
 		scalefactor_input->GetInputAverage(&scalefactor);
 		floatingarea=floatingarea*scalefactor;
@@ -1028,5 +1137,5 @@
 
 	int approximation;
-	inputs->GetInputValue(&approximation,ApproximationEnum);
+	this->GetInput2Value(&approximation,ApproximationEnum);
 	if(approximation==HOApproximationEnum || approximation==SSAApproximationEnum || approximation==SSAHOApproximationEnum || approximation==HOFSApproximationEnum){
 		_error_("Cannot compute contact condition for non FS elements");
@@ -1053,7 +1162,7 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* vx_input = inputs->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input = inputs->GetInput(VyEnum); _assert_(vy_input);
-	Input* vz_input = inputs->GetInput(VzEnum); _assert_(vz_input);
+	Input2* vx_input = this->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input = this->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* vz_input = this->GetInput2(VzEnum); _assert_(vz_input);
 
 	/*1. Recover stresses at the base*/
@@ -1472,7 +1581,89 @@
 	xDelete<int>(indicesfront);
 }/*}}}*/
+Input2*    Penta::GetInput2(int inputenum){/*{{{*/
+
+	/*Get Input from dataset*/
+	PentaInput2* input = this->inputs2->GetPentaInput(inputenum);
+	if(!input) return input;
+
+	/*Intermediaries*/
+	int numindices;
+	int indices[30]; /*Max numnodes*/
+
+	/*Check interpolation*/
+	int interpolation = input->GetInterpolation();
+	if(interpolation==P1Enum){
+		numindices = 6;
+		for(int i=0;i<6;i++) indices[i] = vertices[i]->lid;
+		input->Serve(numindices,&indices[0]);
+	}
+	else{
+		input->Serve(this->lid,this->GetNumberOfNodes(interpolation));
+	}
+
+	/*Tell input it is NOT collapsed*/
+	//input->SetServeCollapsed(0); FIXME: not needed?
+
+	/*Return*/
+	return input;
+}/*}}}*/
+Input2*    Penta::GetInput2(int inputenum,IssmDouble time){/*{{{*/
+
+	/*Get Input from dataset*/
+	PentaInput2* input = this->inputs2->GetPentaInput(inputenum,time);
+	if(!input) return input;
+
+	/*Intermediaries*/
+	int numindices;
+	int indices[30]; /*Max numnodes*/
+
+	/*Check interpolation*/
+	int interpolation = input->GetInterpolation();
+	if(interpolation==P1Enum){
+		numindices = 6;
+		for(int i=0;i<6;i++) indices[i] = vertices[i]->lid;
+		input->Serve(numindices,&indices[0]);
+	}
+	else{
+		input->Serve(this->lid,this->GetNumberOfNodes(interpolation));
+	}
+
+	/*Tell input it is NOT collapsed*/
+	//input->SetServeCollapsed(0); FIXME: not needed?
+
+	/*Return*/
+	return input;
+}/*}}}*/
+DatasetInput2* Penta::GetDatasetInput2(int inputenum){/*{{{*/
+
+	DatasetInput2* datasetinput = this->inputs2->GetDatasetInput2(inputenum);
+	if(!datasetinput) return NULL;
+
+	for(int i=0;i<datasetinput->GetNumIds();i++){
+
+		PentaInput2* input = datasetinput->GetPentaInputByOffset(i); _assert_(input);
+
+		/*Intermediaries*/
+		int numindices;
+		int indices[30]; /*Max numnodes*/
+
+		/*Check interpolation*/
+		int interpolation = input->GetInterpolation();
+		if(interpolation==P1Enum){
+			numindices = 6;
+			for(int i=0;i<6;i++) indices[i] = vertices[i]->lid;
+			input->Serve(numindices,&indices[0]);
+		}
+		else{
+			input->Serve(this->lid,this->GetNumberOfNodes(interpolation));
+		}
+
+	}
+
+	return datasetinput;
+}/*}}}*/
 void       Penta::GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){/*{{{*/
 
-	Input* input=inputs->GetInput(enumtype);
+	Input2* input=this->GetInput2(enumtype);
 	if(!input) _error_("No input of type " << EnumToStringx(enumtype) << " found in tria");
 
@@ -1488,5 +1679,5 @@
 void       Penta::GetInputValue(IssmDouble* pvalue,Vertex* vertex,int enumtype){/*{{{*/
 
-	Input* input=inputs->GetInput(enumtype);
+	Input2* input=this->GetInput2(enumtype);
 	if(!input) _error_("No input of type " << EnumToStringx(enumtype) << " found in tria");
 
@@ -1617,23 +1808,40 @@
 void       Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data){/*{{{*/
 
-	int vertexidlist[NUMVERTICES];
-
 	/*Get out if this is not an element input*/
 	if(!IsInputEnum(control_enum)) _error_("Enum "<<EnumToStringx(control_enum)<<" is not in IsInput");
 
 	/*Prepare index list*/
-	GradientIndexing(&vertexidlist[0],control_index);
+	int idlist[NUMVERTICES];
+	GradientIndexing(&idlist[0],control_index);
 
 	/*Get input (either in element or material)*/
 	if(control_enum==MaterialsRheologyBbarEnum) control_enum=MaterialsRheologyBEnum;
-	Input* input=inputs->GetInput(control_enum);
-	if(!input) _error_("Input " << EnumToStringx(control_enum) << " not found in element");
-
-	/*Check that it is a ControlInput*/
-	if (input->ObjectEnum()!=ControlInputEnum){
-		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
-	}
-
-	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexidlist[0],data);
+	ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,data);   _assert_(input);
+
+	/*Intermediaries*/
+	int numindices;
+	int indices[NUMVERTICES];
+
+	/*Check interpolation*/
+	int interpolation = input->GetInterpolation();
+	switch(interpolation){
+		case P1Enum:
+			numindices = NUMVERTICES;
+			for(int i=0;i<NUMVERTICES;i++) indices[i] = vertices[i]->lid;
+			input->Serve(numindices,&indices[0]);
+			break;
+		default: _error_("interpolation "<<EnumToStringx(interpolation)<<" not supported");
+	}
+
+	/* Start looping on the number of vertices: */
+	IssmDouble values[NUMVERTICES];
+	Gauss*gauss=this->NewGauss();
+	for(int iv=0;iv<NUMVERTICES;iv++){
+		gauss->GaussVertex(iv);
+		input->GetInputValue(&values[iv],gauss);
+	}
+	delete gauss;
+
+	vector->SetValues(NUMVERTICES,idlist,&values[0],INS_VAL);
 }
 /*}}}*/
@@ -1642,36 +1850,14 @@
 	int* idlist = NULL;
 	IssmDouble* values = NULL;
-	int* M = NULL;
-
-	/*Get out if this is not an element input*/
-	if(!IsInputEnum(control_enum)) _error_("Enum "<<EnumToStringx(control_enum)<<" is not in IsInput");
-	Input* input=(Input*)this->inputs->GetInput(control_enum);   _assert_(input);
-
-	/*Cast to Controlinput*/
-	if(input->ObjectEnum()!=ControlInputEnum) _error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
-	ControlInput* controlinput = xDynamicCast<ControlInput*>(input);
-
-	if(strcmp(data,"value")==0){
-		input  = controlinput->values;
-	}
-	else if (strcmp(data,"lowerbound")==0){
-		input = controlinput->minvalues;
-	}
-	else if (strcmp(data,"upperbound")==0){
-		input = controlinput->maxvalues;
-	}
-	else if (strcmp(data,"gradient")==0){
-		input = controlinput->gradient;
-	}
-	else{
-		_error_("Data " << data << " not supported yet");
-	}
+
+	/*Get input*/
+	ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,data);   _assert_(input);
+
 	/*Check what input we are dealing with*/
-
 	switch(input->ObjectEnum()){
-		case PentaInputEnum:
+		case PentaInput2Enum:
 				  {
-					PentaInput* pentainput = xDynamicCast<PentaInput*>(input);
-					if(pentainput->interpolation_type!=P1Enum) _error_("not supported yet");
+					PentaInput2* pentainput = xDynamicCast<PentaInput2*>(input);
+					if(pentainput->GetInputInterpolationType()!=P1Enum) _error_("not supported yet");
 
 					/*Create list of indices and values for global vector*/
@@ -1680,5 +1866,5 @@
 					GradientIndexing(&idlist[0],control_index);
 					for(int i=0;i<NUMVERTICES;i++){
-						values[i] = pentainput->values[i];
+						values[i] = pentainput->element_values[i];
 					}
 					vector->SetValues(NUMVERTICES,idlist,values,INS_VAL);
@@ -1688,22 +1874,5 @@
 				case TransientInputEnum:
 				  {
-					parameters->FindParam(&M,NULL,ControlInputSizeMEnum);
-					TransientInput* transientinput = xDynamicCast<TransientInput*>(input);
-					int N = transientinput->numtimesteps;
-					idlist = xNew<int>(NUMVERTICES*N);
-					values = xNew<IssmDouble>(NUMVERTICES*N);
-					for(int t=0;t<transientinput->numtimesteps;t++) {
-						IssmDouble time = transientinput->GetTimeByOffset(t);
-						input = transientinput->GetTimeInput(time);
-						TriaInput* timeinput = xDynamicCast<TriaInput*>(input);
-						if(timeinput->interpolation_type!=P1Enum) _error_("not supported yet");
-						/*Create list of indices and values for global vector*/
-						for(int i=0;i<NUMVERTICES;i++){
-							idlist[N*i+t] = offset + this->vertices[i]->Sid()+t*M[control_index];
-							values[N*i+t] = timeinput->values[i];
-						}
-					}
-
-					vector->SetValues(NUMVERTICES*transientinput->numtimesteps,idlist,values,INS_VAL);
+					_error_("not implemented (see Tria)");
 					break;
 				  }
@@ -1753,5 +1922,5 @@
 
 	if(scaled==true){
-		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		Input2* scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input);
 		scalefactor_input->GetInputAverage(&scalefactor);
 		groundedarea=groundedarea*scalefactor;
@@ -1857,9 +2026,9 @@
 	IssmDouble vx,vy,thickness,Jdet;
 	IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* vx_input=NULL;
-	Input* vy_input=NULL;
-	vx_input=inputs->GetInput(VxAverageEnum); _assert_(vx_input);
-	vy_input=inputs->GetInput(VyAverageEnum); _assert_(vy_input);
+	Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* vx_input=NULL;
+	Input2* vy_input=NULL;
+	vx_input=this->GetInput2(VxAverageEnum); _assert_(vx_input);
+	vy_input=this->GetInput2(VyAverageEnum); _assert_(vy_input);
 
 	/*Start looping on Gaussian points*/
@@ -1895,5 +2064,5 @@
 
 	if(scaled==true){ //scale for area projection correction
-		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		Input2* scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input);
 		scalefactor_input->GetInputAverage(&scalefactor);
 		base=base*scalefactor;
@@ -1925,5 +2094,5 @@
 	base = 1./2.*fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));
 	if(scaled==true){
-		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		Input2* scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input);
 		scalefactor_input->GetInputAverage(&scalefactor);
 		base=base*scalefactor;
@@ -1931,7 +2100,7 @@
 
 	/*Now get the average height above floatation*/
-	Input* surface_input    = inputs->GetInput(SurfaceEnum);    _assert_(surface_input);
-	Input* base_input        = inputs->GetInput(BaseEnum);        _assert_(base_input);
-	Input* bed_input = inputs->GetInput(BedEnum); _assert_(bed_input);
+	Input2* surface_input    = this->GetInput2(SurfaceEnum);    _assert_(surface_input);
+	Input2* base_input        = this->GetInput2(BaseEnum);        _assert_(base_input);
+	Input2* bed_input = this->GetInput2(BedEnum); _assert_(bed_input);
 	if(!bed_input) _error_("Could not find bed");
 	surface_input->GetInputAverage(&surface);
@@ -1949,7 +2118,8 @@
 	IssmDouble  xyz_list_line[2][3];
 	IssmDouble  total[NUMVERTICES]       = {0.};
+	int         lidlist[NUMVERTICES];
 	IssmDouble  intz[NUMVERTICES]        = {0.};
-	Input      *original_input           = NULL;
-	Input      *depth_averaged_input     = NULL;
+	Input2     *original_input           = NULL;
+	Input2     *depth_averaged_input     = NULL;
 
 	/*Are we on the base? If not, return*/
@@ -1962,5 +2132,5 @@
 
 		/*Step1: Get original input (to be depth-avegaged): */
-		original_input=(Input*)penta->inputs->GetInput(original_enum);
+		original_input=penta->GetInput2(original_enum);
 		if(!original_input) _error_("could not find input with enum " << EnumToStringx(original_enum));
 
@@ -1998,20 +2168,20 @@
 		total[iv+3] = total[iv];
 	}
+	GetVerticesLidList(&lidlist[0]);
 	switch(original_input->ObjectEnum()){
 		case PentaInputEnum:
+		case PentaInput2Enum:
 		case ControlInputEnum:
-			depth_averaged_input=new PentaInput(average_enum,&total[0],P1Enum);
+			this->inputs2->SetPentaInput(average_enum,P1Enum,NUMVERTICES,lidlist,&total[0]);
 			break;
 		default:
 			_error_("Interpolation " << EnumToStringx(original_input->ObjectEnum()) << " not supported yet");
 	}
-
-	/*Finally, add to inputs*/
-	this->inputs->AddInput((Input*)depth_averaged_input);
-}
-/*}}}*/
-void       Penta::InputExtrude(int enum_type,int start){/*{{{*/
+}
+/*}}}*/
+void       Penta::DatasetInputExtrude(int enum_type,int start){/*{{{*/
 
 	_assert_(start==-1 || start==+1);
+	_assert_(this->inputs2);
 
 	/*Are we on the the boundary we want to be?*/
@@ -2019,28 +2189,180 @@
 	if(start==+1 && !IsOnSurface()) return;
 
-	/*Step1: Get and Extrude original input: */
-	Input* base_input=(Input*)this->inputs->GetInput(enum_type);
-	if(!base_input) _error_("could not find input with enum " << EnumToStringx(enum_type));
-	base_input->Extrude(start);
-
-	/*Stop if there is only one layer of element*/
-	if(start==-1 && this->IsOnSurface()) return;
-	if(start==+1 && this->IsOnBase())    return;
-
-	/*Step 2: this input has been extruded for this element, now follow the upper element*/
-	Penta* penta=this;
-	for(;;){
-		/*get upper/lower Penta*/
-		if(start==-1) penta=penta->GetUpperPenta();
-		else          penta=penta->GetLowerPenta();
-		_assert_(penta->Id()!=this->id);
-
-		/*Add input of the basal element to penta->inputs*/
-		Input* copy=(Input*)base_input->copy();
-		penta->inputs->AddInput((Input*)copy);
-
-		/*Stop if we have reached the surface/base*/
-		if(start==-1 && penta->IsOnSurface()) break;
-		if(start==+1 && penta->IsOnBase())    break;
+	/*Get original input*/
+	DatasetInput2* dinput = this->inputs2->GetDatasetInput2(enum_type);
+
+	int lidlist[NUMVERTICES];
+	this->GetVerticesLidList(&lidlist[0]);
+
+	for(int id=0;id<dinput->GetNumIds();id++){
+
+		PentaInput2* pentainput = dinput->GetPentaInputByOffset(id);
+		pentainput->Serve(NUMVERTICES,&lidlist[0]);
+
+		if(pentainput->GetInterpolation()==P1Enum){
+
+			/*Extrude values first*/
+			IssmDouble extrudedvalues[NUMVERTICES];
+			this->GetInputListOnVertices(&extrudedvalues[0],pentainput);
+
+			if(start==-1){
+				for(int i=0;i<NUMVERTICES2D;i++) extrudedvalues[i+NUMVERTICES2D]=extrudedvalues[i];
+			}
+			else{
+				for(int i=0;i<NUMVERTICES2D;i++) extrudedvalues[i]=extrudedvalues[i+NUMVERTICES2D];
+			}
+
+			/*Propagate to other Pentas*/
+			Penta* penta=this;
+			for(;;){
+
+				/*Add input of the basal element to penta->inputs*/
+				int vertexlids[NUMVERTICES];
+				penta->GetVerticesLidList(&vertexlids[0]);
+				pentainput->SetInput(P1Enum,NUMVERTICES,&vertexlids[0],&extrudedvalues[0]);
+
+				/*Stop if we have reached the surface/base*/
+				if(start==-1 && penta->IsOnSurface()) break;
+				if(start==+1 && penta->IsOnBase())    break;
+
+				/*get upper/lower Penta*/
+				if(start==-1) penta=penta->GetUpperPenta();
+				else          penta=penta->GetLowerPenta();
+				_assert_(penta->Id()!=this->id);
+			}
+		}
+		else{
+			_error_("not implemented yet");
+		}
+	}
+}
+/*}}}*/
+void       Penta::ControlInputExtrude(int enum_type,int start){/*{{{*/
+
+	_assert_(start==-1 || start==+1);
+	_assert_(this->inputs2);
+
+	/*Are we on the the boundary we want to be?*/
+	if(start==-1 && !IsOnBase())    return;
+	if(start==+1 && !IsOnSurface()) return;
+
+	/*Get original input*/
+	ElementInput2* input  = this->inputs2->GetControlInput2Data(enum_type,"value");
+	if(input->ObjectEnum()!=PentaInput2Enum) _error_("not supported yet");
+	PentaInput2* pentainput = xDynamicCast<PentaInput2*>(input);
+	ElementInput2* input2 = this->inputs2->GetControlInput2Data(enum_type,"savedvalues");
+	if(input->ObjectEnum()!=PentaInput2Enum) _error_("not supported yet");
+	PentaInput2* pentainput2= xDynamicCast<PentaInput2*>(input2);
+	/*FIXME: this should not be necessary*/
+	ElementInput2* input3 = this->inputs2->GetControlInput2Data(enum_type,"gradient");
+	if(input->ObjectEnum()!=PentaInput2Enum) _error_("not supported yet");
+	PentaInput2* pentainput3= xDynamicCast<PentaInput2*>(input3);
+
+	int lidlist[NUMVERTICES];
+	this->GetVerticesLidList(&lidlist[0]);
+	pentainput->Serve(NUMVERTICES,&lidlist[0]);
+	pentainput2->Serve(NUMVERTICES,&lidlist[0]);
+	pentainput3->Serve(NUMVERTICES,&lidlist[0]);
+
+	if(pentainput->GetInterpolation()==P1Enum){
+
+		/*Extrude values first*/
+		IssmDouble extrudedvalues[NUMVERTICES];
+		IssmDouble extrudedvalues2[NUMVERTICES];
+		IssmDouble extrudedvalues3[NUMVERTICES];
+
+		this->GetInputListOnVertices(&extrudedvalues[0],pentainput);
+		this->GetInputListOnVertices(&extrudedvalues2[0],pentainput2);
+		this->GetInputListOnVertices(&extrudedvalues3[0],pentainput3);
+
+		if(start==-1){
+			for(int i=0;i<NUMVERTICES2D;i++) extrudedvalues[i+NUMVERTICES2D]=extrudedvalues[i];
+			for(int i=0;i<NUMVERTICES2D;i++) extrudedvalues2[i+NUMVERTICES2D]=extrudedvalues2[i];
+			for(int i=0;i<NUMVERTICES2D;i++) extrudedvalues3[i+NUMVERTICES2D]=extrudedvalues3[i]/2.; /*FIXME: this is just for NR*/
+			for(int i=0;i<NUMVERTICES2D;i++) extrudedvalues3[i]=extrudedvalues3[i]/2.; /*FIXME: this is just for NR*/
+		}
+		else{
+			for(int i=0;i<NUMVERTICES2D;i++) extrudedvalues[i]=extrudedvalues[i+NUMVERTICES2D];
+			for(int i=0;i<NUMVERTICES2D;i++) extrudedvalues2[i]=extrudedvalues2[i+NUMVERTICES2D];
+		}
+
+		/*Propagate to other Pentas*/
+		Penta* penta=this;
+		for(;;){
+
+			if(penta->IsOnSurface() && start==-1){ /*FIXME: this is just for NR*/
+				for(int i=0;i<NUMVERTICES2D;i++) extrudedvalues3[i+NUMVERTICES2D]=0.;
+			}
+
+			/*Add input of the basal element to penta->inputs*/
+			int vertexlids[NUMVERTICES];
+			penta->GetVerticesLidList(&vertexlids[0]);
+			pentainput->SetInput(P1Enum,NUMVERTICES,&vertexlids[0],&extrudedvalues[0]);
+			pentainput2->SetInput(P1Enum,NUMVERTICES,&vertexlids[0],&extrudedvalues2[0]);
+			if(start==-1 && !penta->IsOnBase()){
+				pentainput3->SetInput(P1Enum,NUMVERTICES,&vertexlids[0],&extrudedvalues3[0]);
+			}
+
+			/*Stop if we have reached the surface/base*/
+			if(start==-1 && penta->IsOnSurface()) break;
+			if(start==+1 && penta->IsOnBase())    break;
+
+			/*get upper/lower Penta*/
+			if(start==-1) penta=penta->GetUpperPenta();
+			else          penta=penta->GetLowerPenta();
+			_assert_(penta->Id()!=this->id);
+		}
+	}
+	else{
+		_error_("not implemented yet");
+	}
+}
+/*}}}*/
+void       Penta::InputExtrude(int enum_type,int start){/*{{{*/
+
+	_assert_(start==-1 || start==+1);
+	_assert_(this->inputs2);
+
+	/*Are we on the the boundary we want to be?*/
+	if(start==-1 && !IsOnBase())    return;
+	if(start==+1 && !IsOnSurface()) return;
+
+
+	/*Get original input*/
+	Input2* input = this->GetInput2(enum_type);
+	if(input->ObjectEnum()!=PentaInput2Enum) _error_("not supported yet");
+	PentaInput2* pentainput = xDynamicCast<PentaInput2*>(input);
+
+	if(pentainput->GetInterpolation()==P1Enum || pentainput->GetInterpolation()==P1DGEnum){
+		/*Extrude values first*/
+		IssmDouble extrudedvalues[NUMVERTICES];
+
+		this->GetInputListOnVertices(&extrudedvalues[0],enum_type);
+		if(start==-1){
+			for(int i=0;i<NUMVERTICES2D;i++) extrudedvalues[i+NUMVERTICES2D]=extrudedvalues[i];
+		}
+		else{
+			for(int i=0;i<NUMVERTICES2D;i++) extrudedvalues[i]=extrudedvalues[i+NUMVERTICES2D];
+		}
+
+		/*Propagate to other Pentas*/
+		Penta* penta=this;
+		for(;;){
+
+			/*Add input of the basal element to penta->inputs*/
+			penta->AddInput2(enum_type,&extrudedvalues[0],pentainput->GetInterpolation());
+
+			/*Stop if we have reached the surface/base*/
+			if(start==-1 && penta->IsOnSurface()) break;
+			if(start==+1 && penta->IsOnBase())    break;
+
+			/*get upper/lower Penta*/
+			if(start==-1) penta=penta->GetUpperPenta();
+			else          penta=penta->GetLowerPenta();
+			_assert_(penta->Id()!=this->id);
+		}
+	}
+	else{
+		_error_("interpolation "<<EnumToStringx(pentainput->GetInterpolation())<<" not implemented yet");
 	}
 }
@@ -2071,102 +2393,4 @@
 		penta_vertex_ids[i]=iomodel->elements[NUMVERTICES*index+i]; //ids for vertices are in the elements array from Matlab
 	}
-
-	/*Control Inputs*/
-	if (control_analysis){
-		iomodel->FindConstant(&controls,NULL,"md.inversion.control_parameters");
-		for(i=0;i<num_control_type;i++){
-			_assert_(controls[i]);
-			int control = StringToEnumx(controls[i]);
-			switch(control){
-				case BalancethicknessThickeningRateEnum:
-					if (iomodel->Data("md.balancethickness.thickening_rate")){
-						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.balancethickness.thickening_rate")[penta_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case VxEnum:
-					if (iomodel->Data("md.initialization.vx")){
-						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.initialization.vx")[penta_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(VxEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case VyEnum:
-					if (iomodel->Data("md.initialization.vy")){
-						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.initialization.vy")[penta_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(VyEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case FrictionCoefficientEnum:
-					if (iomodel->Data("md.friction.coefficient")){
-						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.friction.coefficient")[penta_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i];
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case MaterialsRheologyBbarEnum:
-					if(iomodel->Data("md.materials.rheology_B")){
-						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.materials.rheology_B")[penta_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i];
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case DamageDbarEnum:
-					if(iomodel->Data("md.damage.D")){
-						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.damage.D")[penta_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i];
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(DamageDEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				default:
-					_error_("Control " << EnumToStringx(control) << " not implemented yet");
-			}
-		}
-		for(i=0;i<num_control_type;i++) xDelete<char>(controls[i]);
-		xDelete<char*>(controls);
-	}
-
-	/*Need to know the type of approximation for this element*/
-	if(iomodel->Data("md.flowequation.element_equation")){
-		this->inputs->AddInput(new IntInput(ApproximationEnum,IoCodeToEnumElementEquation(reCast<int>(iomodel->Data("md.flowequation.element_equation")[index]))));
-	}
-
-	/*DatasetInputs*/
-	if(control_analysis && iomodel->Data("md.inversion.cost_functions_coefficients")) {
-
-		/*Generate cost functions associated with the iomodel*/
-		char**	cost_functions			= NULL;
-		int*		cost_functions_enums = NULL;
-		int		num_cost_functions;
-
-		iomodel->FindConstant(&num_cost_functions,"md.inversion.num_cost_functions");
-		iomodel->FindConstant(&cost_functions,&num_cost_functions,"md.inversion.cost_functions");
-		if(num_cost_functions<1) _error_("No cost functions found");
-		cost_functions_enums=xNew<int>(num_cost_functions);
-		for(j=0;j<num_cost_functions;j++){ cost_functions_enums[j]=StringToEnumx(cost_functions[j]); }
-
-		/*Create inputs and add to DataSetInput*/
-		DatasetInput* datasetinput=new DatasetInput(InversionCostFunctionsCoefficientsEnum);
-		for(i=0;i<num_responses;i++){
-			for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.inversion.cost_functions_coefficients")[(penta_vertex_ids[j]-1)*num_responses+i];
-			datasetinput->AddInput(new PentaInput(InversionCostFunctionsCoefficientsEnum,nodeinputs,P1Enum),cost_functions_enums[i]);
-		}
-
-		/*Add datasetinput to element inputs*/
-		this->inputs->AddInput(datasetinput);
-
-		/*Free resources*/
-		for(int j=0;j<num_cost_functions;j++) xDelete<char>(cost_functions[j]);
-		xDelete<char*>(cost_functions);
-		xDelete<int>(cost_functions_enums);
-	}
 }
 /*}}}*/
@@ -2191,5 +2415,5 @@
 
 	/*Add input to the element: */
-	this->inputs->AddInput(new PentaInput(enum_type,values,this->element_type));
+	this->AddInput2(enum_type,values,this->element_type);
 
 	/*Free ressources:*/
@@ -2225,5 +2449,5 @@
 	for(;;){
 		/*Add input to the element: */
-		penta->inputs->AddInput(new PentaInput(enum_type,values,P1Enum));
+		penta->AddInput2(enum_type,values,P1Enum);
 
 		/*Stop if we have reached the surface*/
@@ -2243,4 +2467,7 @@
 	int        *doflist        = NULL;
 	IssmDouble  values[numdof];
+	int         lidlist[NUMVERTICES];
+
+	GetVerticesLidList(&lidlist[0]);
 
 	/*Check that name is an element input*/
@@ -2253,5 +2480,5 @@
 			}
 			/*update input*/
-			this->inputs->AddInput(new PentaInput(name,values,P1Enum));
+			inputs2->SetPentaInput(name,P1Enum,NUMVERTICES,lidlist,values);
 			return;
 
@@ -2261,5 +2488,5 @@
 			}
 			/*update input*/
-			this->inputs->AddInput(new PentaInput(name,values,P1Enum));
+			inputs2->SetPentaInput(name,P1Enum,NUMVERTICES,lidlist,values);
 			return;
 
@@ -2269,5 +2496,5 @@
 			}
 			/*update input*/
-			this->inputs->AddInput(new PentaInput(name,values,P1Enum));
+			inputs2->SetPentaInput(name,P1Enum,NUMVERTICES,lidlist,values);
 			return;
 
@@ -2283,5 +2510,5 @@
 			}
 			/*Add input to the element: */
-			this->inputs->AddInput(new PentaInput(name,values,P1Enum));
+			inputs2->SetPentaInput(name,P1Enum,NUMVERTICES,lidlist,values);
 
 			/*Free ressources:*/
@@ -2296,5 +2523,5 @@
 			}
 			/*Add input to the element: */
-			this->inputs->AddInput(new PentaInput(name,values,P1Enum));
+			inputs2->SetPentaInput(name,P1Enum,NUMVERTICES,lidlist,values);
 
 			/*Free ressources:*/
@@ -2340,40 +2567,4 @@
 }
 /*}}}*/
-bool       Penta::IsOnBase(void){/*{{{*/
-
-	IssmDouble values[NUMVERTICES];
-	IssmDouble sum;
-
-	/*Retrieve all inputs and parameters*/
-	GetInputListOnVertices(&values[0],MeshVertexonbaseEnum);
-	sum = values[0]+values[1]+values[2]+values[3]+values[4]+values[5];
-	_assert_(sum==0. || sum==3.);
-
-	if(sum==3){
-		return true;
-	}
-	else{
-		return false;
-	}
-}
-/*}}}*/
-bool       Penta::IsOnSurface(void){/*{{{*/
-
-	IssmDouble values[NUMVERTICES];
-	IssmDouble sum;
-
-	/*Retrieve all inputs and parameters*/
-	GetInputListOnVertices(&values[0],MeshVertexonsurfaceEnum);
-	sum = values[0]+values[1]+values[2]+values[3]+values[4]+values[5];
-	_assert_(sum==0. || sum==3.);
-
-	if(sum==3){
-		return true;
-	}
-	else{
-		return false;
-	}
-}
-/*}}}*/
 bool       Penta::IsZeroLevelset(int levelset_enum){/*{{{*/
 
@@ -2613,9 +2804,8 @@
 	int found=0;
 	IssmDouble value;
-	Input* data=NULL;
 	GaussPenta* gauss=NULL;
 
 	/*First, serarch the input: */
-	data=inputs->GetInput(natureofdataenum);
+	Input2* data=this->GetInput2(natureofdataenum); 
 
 	/*figure out if we have the vertex id: */
@@ -2772,5 +2962,5 @@
 			if(this->element_type==MINIcondensedEnum){
 				int approximation;
-				inputs->GetInputValue(&approximation,ApproximationEnum);
+				this->GetInput2Value(&approximation,ApproximationEnum);
 				if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
 					//Do nothing, condensation already done in PVectorCoupling
@@ -2796,5 +2986,5 @@
 		if(analysis_type==StressbalanceAnalysisEnum){
 			int approximation;
-			inputs->GetInputValue(&approximation,ApproximationEnum);
+			this->GetInput2Value(&approximation,ApproximationEnum);
 			if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
 				//Do nothing condensatino already done for Stokes part
@@ -2829,5 +3019,5 @@
 
 	/*For FS only: we want the CS to be tangential to the bedrock*/
-	inputs->GetInputValue(&approximation,ApproximationEnum);
+	this->GetInput2Value(&approximation,ApproximationEnum);
 	if(!IsOnBase() || (approximation!=FSApproximationEnum && approximation!=SSAFSApproximationEnum &&  approximation!=HOFSApproximationEnum)) return;
 
@@ -2836,7 +3026,7 @@
 
 	/*Get inputs*/
-	Input* slopex_input=inputs->GetInput(BedSlopeXEnum); _assert_(slopex_input);
-	Input* slopey_input=inputs->GetInput(BedSlopeYEnum); _assert_(slopey_input);
-	Input* groundedicelevelset_input=inputs->GetInput(MaskGroundediceLevelsetEnum); _assert_(groundedicelevelset_input);
+	Input2* slopex_input=this->GetInput2(BedSlopeXEnum); _assert_(slopex_input);
+	Input2* slopey_input=this->GetInput2(BedSlopeYEnum); _assert_(slopey_input);
+	Input2* groundedicelevelset_input=this->GetInput2(MaskGroundediceLevelsetEnum); _assert_(groundedicelevelset_input);
 
 	/*Loop over basal nodes and update their CS*/
@@ -2915,7 +3105,7 @@
 
 	/*Get inputs*/
-	Input* bed_input = this->GetInput(BedEnum);                     _assert_(bed_input);
-	Input* qsg_input = this->GetInput(FrontalForcingsSubglacialDischargeEnum);		 _assert_(qsg_input);
-	Input* TF_input  = this->GetInput(FrontalForcingsThermalForcingEnum);          _assert_(TF_input);
+	Input2* bed_input = this->GetInput2(BedEnum);                     _assert_(bed_input);
+	Input2* qsg_input = this->GetInput2(FrontalForcingsSubglacialDischargeEnum);		 _assert_(qsg_input);
+	Input2* TF_input  = this->GetInput2(FrontalForcingsThermalForcingEnum);          _assert_(TF_input);
 	GetInputListOnVertices(&basinid[0],FrontalForcingsBasinIdEnum);
 
@@ -2950,5 +3140,5 @@
 
 	/*Add input*/
-	this->inputs->AddInput(new PentaInput(CalvingMeltingrateEnum,&meltrates[0],P1Enum));
+	this->AddInput2(CalvingMeltingrateEnum,&meltrates[0],P1Enum);
 
 	this->InputExtrude(CalvingMeltingrateEnum,-1);
@@ -2957,4 +3147,24 @@
 	xDelete<IssmDouble>(basin_icefront_area);
 	delete gauss;
+}
+/*}}}*/
+void       Penta::SetElementInput(int enum_in,IssmDouble value){/*{{{*/
+
+	this->SetElementInput(this->inputs2,enum_in,value);
+
+}
+/*}}}*/
+void       Penta::SetElementInput(Inputs2* inputs2,int enum_in,IssmDouble value){/*{{{*/
+
+	_assert_(inputs2);
+	inputs2->SetPentaInput(enum_in,P0Enum,this->lid,value);
+
+}
+/*}}}*/
+void       Penta::SetElementInput(Inputs2* inputs2,int numindices,int* indices,IssmDouble* values,int enum_in){/*{{{*/
+
+	_assert_(inputs2);
+	inputs2->SetPentaInput(enum_in,P1Enum,numindices,indices,values);
+
 }
 /*}}}*/
@@ -2985,11 +3195,12 @@
 		values[i]=vector[vertexpidlist[i]];
 	}
-	Input* new_input = new PentaInput(control_enum,values,P1Enum);
-	Input* input=(Input*)this->inputs->GetInput(control_enum);   _assert_(input);
+	_error_("not implemented");
+	//Input* new_input = new PentaInput(control_enum,values,P1Enum);
+	Input2* input=(Input2*)this->GetInput2(control_enum);   _assert_(input);
 	if(input->ObjectEnum()!=ControlInputEnum){
 		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
 	}
 
-	((ControlInput*)input)->SetInput(new_input);
+	//((ControlInput*)input)->SetInput(new_input);
 
 	if(control_init==MaterialsRheologyBbarEnum){
@@ -3004,5 +3215,6 @@
 
 	IssmDouble  values[NUMVERTICES];
-	int         vertexpidlist[NUMVERTICES],control_init;
+	int         lidlist[NUMVERTICES];
+	int         idlist[NUMVERTICES],control_init;
 
 	/*Specific case for depth averaged quantities*/
@@ -3017,27 +3229,40 @@
 	}
 
+	/*Get Domain type*/
+	int domaintype;
+	parameters->FindParam(&domaintype,DomainTypeEnum);
+
+	/*Specific case for depth averaged quantities*/
+	if(domaintype==Domain2DverticalEnum){
+		if(control_enum==MaterialsRheologyBbarEnum){
+			control_enum=MaterialsRheologyBEnum;
+			if(!IsOnBase()) return;
+		}
+		if(control_enum==DamageDbarEnum){
+			control_enum=DamageDEnum;
+			if(!IsOnBase()) return;
+		}
+	}
+
 	/*Get out if this is not an element input*/
 	if(!IsInputEnum(control_enum)) return;
 
-	/*Prepare index list*/
-	GradientIndexing(&vertexpidlist[0],control_index);
+	/*prepare index list*/
+	this->GetVerticesLidList(&lidlist[0]);
+	GradientIndexing(&idlist[0],control_index);
 
 	/*Get values on vertices*/
 	for(int i=0;i<NUMVERTICES;i++){
-		values[i]=vector[vertexpidlist[i]];
-	}
-	Input* new_input = new PentaInput(control_enum,values,P1Enum);
-	Input* input=(Input*)this->inputs->GetInput(control_enum);   _assert_(input);
-	if(input->ObjectEnum()!=ControlInputEnum){
-		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
-	}
-
-	((ControlInput*)input)->SetInput(new_input);
-
+		values[i]=vector[idlist[i]];
+	}
+
+	/*Set Input*/
+	ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,"value");   _assert_(input);
+	input->SetInput(P1Enum,NUMVERTICES,&lidlist[0],&values[0]);
 	if(control_init==MaterialsRheologyBbarEnum){
-		this->InputExtrude(control_enum,-1);
+		this->ControlInputExtrude(control_enum,-1);
 	}
 	if(control_init==DamageDbarEnum){
-		this->InputExtrude(control_enum,-1);
+		this->ControlInputExtrude(control_enum,-1);
 	}
 }
@@ -3080,8 +3305,8 @@
 			_error_("not supported yet");
 	}
-	if(this->inputs->GetInput(VxEnum)) this->InputDepthAverageAtBase(VxEnum,VxAverageEnum);
-	if(this->inputs->GetInput(VyEnum)) this->InputDepthAverageAtBase(VyEnum,VyAverageEnum);
-	if(this->inputs->GetInput(CalvingratexEnum)) this->InputDepthAverageAtBase(CalvingratexEnum,CalvingratexAverageEnum);
-	if(this->inputs->GetInput(CalvingrateyEnum)) this->InputDepthAverageAtBase(CalvingrateyEnum,CalvingrateyAverageEnum);
+	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);
@@ -3123,8 +3348,18 @@
 	Tria* tria=new Tria();
 	tria->id=this->id;
-	tria->inputs=(Inputs*)this->inputs->SpawnTriaInputs(index1,index2,index3);
+	tria->sid=this->sid;
+	tria->lid=this->lid;
+	tria->inputs=NULL;//(Inputs*)this->inputs->SpawnTriaInputs(index1,index2,index3);
 	tria->parameters=this->parameters;
+	tria->inputs2=this->inputs2;
 	tria->element_type=P1Enum; //Only P1 CG for now (TO BE CHANGED)
 	this->SpawnTriaHook(xDynamicCast<ElementHook*>(tria),index1,index2,index3);
+
+	if(index1==0 && index2==1 && index3==2){
+		tria->iscollapsed = 1;
+	}
+	else if(index1==3 && index2==4 && index3==5){
+		tria->iscollapsed = 2;
+	}
 
 	/*Spawn material*/
@@ -3197,7 +3432,7 @@
 
 	/*Retrieve all inputs we will need*/
-	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
-	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
-	Input* vz_input=inputs->GetInput(VzEnum);												_assert_(vz_input);
+	Input2* vx_input=this->GetInput2(VxEnum);                                  _assert_(vx_input);
+	Input2* vy_input=this->GetInput2(VyEnum);                                  _assert_(vy_input);
+	Input2* vz_input=this->GetInput2(VzEnum);												_assert_(vz_input);
 
 	/* Start looping on the number of vertices: */
@@ -3222,5 +3457,5 @@
 
 	/*Add input*/
-	this->inputs->AddInput(new PentaInput(StrainRateparallelEnum,&strainparallel[0],P1Enum));
+	this->AddInput2(StrainRateparallelEnum,&strainparallel[0],P1DGEnum);
 
 	/*Clean up and return*/
@@ -3244,7 +3479,7 @@
 
 	/*Retrieve all inputs we will need*/
-	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
-	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
-	Input* vz_input=inputs->GetInput(VzEnum);												_assert_(vz_input);
+	Input2* vx_input=this->GetInput2(VxEnum);                                  _assert_(vx_input);
+	Input2* vy_input=this->GetInput2(VyEnum);                                  _assert_(vy_input);
+	Input2* vz_input=this->GetInput2(VzEnum);												_assert_(vz_input);
 
 	/* Start looping on the number of vertices: */
@@ -3269,5 +3504,5 @@
 
 	/*Add input*/
-	this->inputs->AddInput(new PentaInput(StrainRateperpendicularEnum,&strainperpendicular[0],P1Enum));
+	this->AddInput2(StrainRateperpendicularEnum,&strainperpendicular[0],P1DGEnum);
 
 	/*Clean up and return*/
@@ -3301,13 +3536,13 @@
 
 		/*Retrieve all inputs we will need*/
-		Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
-		Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
-		Input* vel_input=inputs->GetInput(VelEnum);                                _assert_(vel_input);
-		Input* pressure_input=inputs->GetInput(PressureEnum);                      _assert_(pressure_input);
-		Input* deviaxx_input=inputs->GetInput(DeviatoricStressxxEnum);             _assert_(deviaxx_input);
-		Input* deviaxy_input=inputs->GetInput(DeviatoricStressxyEnum);             _assert_(deviaxy_input);
-		Input* deviayy_input=inputs->GetInput(DeviatoricStressyyEnum);             _assert_(deviayy_input);
-		Input* surface_input=inputs->GetInput(SurfaceEnum);								_assert_(surface_input);
-		Input* thickness_input=inputs->GetInput(ThicknessEnum);							_assert_(thickness_input);
+		Input2* vx_input=this->GetInput2(VxEnum);                                  _assert_(vx_input);
+		Input2* vy_input=this->GetInput2(VyEnum);                                  _assert_(vy_input);
+		Input2* vel_input=this->GetInput2(VelEnum);                                _assert_(vel_input);
+		Input2* pressure_input=this->GetInput2(PressureEnum);                      _assert_(pressure_input);
+		Input2* deviaxx_input=this->GetInput2(DeviatoricStressxxEnum);             _assert_(deviaxx_input);
+		Input2* deviaxy_input=this->GetInput2(DeviatoricStressxyEnum);             _assert_(deviaxy_input);
+		Input2* deviayy_input=this->GetInput2(DeviatoricStressyyEnum);             _assert_(deviayy_input);
+		Input2* surface_input=this->GetInput2(SurfaceEnum);								_assert_(surface_input);
+		Input2* thickness_input=this->GetInput2(ThicknessEnum);							_assert_(thickness_input);
 
 		/* Start looping on the number of 2D vertices: */
@@ -3349,5 +3584,5 @@
 
 	/*Add input*/
-	this->inputs->AddInput(new PentaInput(StressIntensityFactorEnum,&ki[0],P1Enum));
+	this->AddInput2(StressIntensityFactorEnum,&ki[0],P1Enum);
 	this->InputExtrude(StressIntensityFactorEnum,-1);
 }
@@ -3360,5 +3595,5 @@
 
 	/*retrieve inputs :*/
-	inputs->GetInputValue(&approximation,ApproximationEnum);
+	this->GetInput2Value(&approximation,ApproximationEnum);
 
 	/*If on water, return 0: */
@@ -3391,8 +3626,6 @@
 IssmDouble Penta::TimeAdapt(void){/*{{{*/
 
-	int    i;
-	IssmDouble C,dx,dy,dz,dt;
-	IssmDouble maxabsvx,maxabsvy,maxabsvz;
-	IssmDouble maxx,minx,maxy,miny,maxz,minz;
+	/*intermediary: */
+	IssmDouble C;
 	IssmDouble xyz_list[NUMVERTICES][3];
 
@@ -3401,32 +3634,35 @@
 
 	/*Get for Vx and Vy, the max of abs value: */
-	maxabsvx = this->inputs->MaxAbs(VxEnum);
-	maxabsvy = this->inputs->MaxAbs(VyEnum);
-	maxabsvz = this->inputs->MaxAbs(VzEnum);
+	Input2* vx_input = this->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input = this->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* vz_input = this->GetInput2(VzEnum); _assert_(vz_input);
+	IssmDouble maxabsvx = vx_input->GetInputMaxAbs();
+	IssmDouble maxabsvy = vy_input->GetInputMaxAbs();
+	IssmDouble maxabsvz = vz_input->GetInputMaxAbs();
 
 	/* Get node coordinates and dof list: */
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
 
-	minx=xyz_list[0][0];
-	maxx=xyz_list[0][0];
-	miny=xyz_list[0][1];
-	maxy=xyz_list[0][1];
-	minz=xyz_list[0][2];
-	maxz=xyz_list[0][2];
-
-	for(i=1;i<NUMVERTICES;i++){
-		if (xyz_list[i][0]<minx)minx=xyz_list[i][0];
-		if (xyz_list[i][0]>maxx)maxx=xyz_list[i][0];
-		if (xyz_list[i][1]<miny)miny=xyz_list[i][1];
-		if (xyz_list[i][1]>maxy)maxy=xyz_list[i][1];
-		if (xyz_list[i][2]<minz)minz=xyz_list[i][2];
-		if (xyz_list[i][2]>maxz)maxz=xyz_list[i][2];
-	}
-	dx=maxx-minx;
-	dy=maxy-miny;
-	dz=maxz-minz;
+	IssmDouble minx=xyz_list[0][0];
+	IssmDouble maxx=xyz_list[0][0];
+	IssmDouble miny=xyz_list[0][1];
+	IssmDouble maxy=xyz_list[0][1];
+	IssmDouble minz=xyz_list[0][2];
+	IssmDouble maxz=xyz_list[0][2];
+
+	for(int i=1;i<NUMVERTICES;i++){
+		if(xyz_list[i][0]<minx) minx=xyz_list[i][0];
+		if(xyz_list[i][0]>maxx) maxx=xyz_list[i][0];
+		if(xyz_list[i][1]<miny) miny=xyz_list[i][1];
+		if(xyz_list[i][1]>maxy) maxy=xyz_list[i][1];
+		if(xyz_list[i][2]<minz) minz=xyz_list[i][2];
+		if(xyz_list[i][2]>maxz) maxz=xyz_list[i][2];
+	}
+	IssmDouble dx=maxx-minx;
+	IssmDouble dy=maxy-miny;
+	IssmDouble dz=maxz-minz;
 
 	/*CFL criterion: */
-	dt=C/(maxabsvx/dx+maxabsvy/dy+maxabsvz/dz);
+	IssmDouble dt = C/(maxabsvx/dx+maxabsvy/dy+maxabsvz/dz);
 
 	return dt;
@@ -3525,9 +3761,9 @@
 	IssmDouble calvingratex,calvingratey,thickness,Jdet;
 	IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* calvingratex_input=NULL;
-	Input* calvingratey_input=NULL;
-	calvingratex_input=inputs->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-	calvingratey_input=inputs->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
+	Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* calvingratex_input=NULL;
+	Input2* calvingratey_input=NULL;
+	calvingratex_input=this->GetInput2(CalvingratexEnum); _assert_(calvingratex_input);
+	calvingratey_input=this->GetInput2(CalvingrateyEnum); _assert_(calvingratey_input);
 
 	/*Start looping on Gaussian points*/
@@ -3646,15 +3882,15 @@
 	IssmDouble calvingratex,calvingratey,vx,vy,vel,meltingrate,meltingratex,meltingratey,thickness,Jdet;
 	IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* calvingratex_input=NULL;
-	Input* calvingratey_input=NULL;
-	Input* vx_input=NULL;
-	Input* vy_input=NULL;
-	Input* meltingrate_input=NULL;
-	calvingratex_input=inputs->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-	calvingratey_input=inputs->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
-	vx_input=inputs->GetInput(VxAverageEnum); _assert_(vx_input);
-	vy_input=inputs->GetInput(VyAverageEnum); _assert_(vy_input);
-	meltingrate_input=inputs->GetInput(CalvingMeltingrateEnum); _assert_(meltingrate_input);
+	Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* calvingratex_input=NULL;
+	Input2* calvingratey_input=NULL;
+	Input2* vx_input=NULL;
+	Input2* vy_input=NULL;
+	Input2* meltingrate_input=NULL;
+	calvingratex_input=this->GetInput2(CalvingratexEnum); _assert_(calvingratex_input);
+	calvingratey_input=this->GetInput2(CalvingrateyEnum); _assert_(calvingratey_input);
+	vx_input=this->GetInput2(VxAverageEnum); _assert_(vx_input);
+	vy_input=this->GetInput2(VyAverageEnum); _assert_(vy_input);
+	meltingrate_input=this->GetInput2(CalvingMeltingrateEnum); _assert_(meltingrate_input);
 
 	/*Start looping on Gaussian points*/
@@ -3698,9 +3934,9 @@
 	/*Get material parameters :*/
 	rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* floatingmelt_input = this->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(floatingmelt_input);
-	Input* gllevelset_input = this->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
-	Input* scalefactor_input = NULL;
+	Input2* floatingmelt_input = this->GetInput2(BasalforcingsFloatingiceMeltingRateEnum); _assert_(floatingmelt_input); 
+	Input2* gllevelset_input = this->GetInput2(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
+	Input2* scalefactor_input = NULL;
 	if(scaled==true){
-		scalefactor_input = this->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input); 
 	}
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
@@ -3743,9 +3979,9 @@
 	/*Get material parameters :*/
 	rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* groundedmelt_input = this->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(groundedmelt_input);
-	Input* gllevelset_input = this->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
-	Input* scalefactor_input = NULL;
+	Input2* groundedmelt_input = this->GetInput2(BasalforcingsGroundediceMeltingRateEnum); _assert_(groundedmelt_input);
+	Input2* gllevelset_input   = this->GetInput2(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
+	Input2* scalefactor_input  = NULL;
 	if(scaled==true){
-		scalefactor_input = this->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input); 
 	}
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
@@ -3793,9 +4029,9 @@
 
 	/*Now get the average SMB over the element*/
-	Input* smb_input = inputs->GetInput(SmbMassBalanceEnum); _assert_(smb_input);
+	Input2* smb_input = this->GetInput2(SmbMassBalanceEnum); _assert_(smb_input);
 
 	smb_input->GetInputAverage(&smb);
 	if(scaled==true){
-		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		Input2* scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input);
 		scalefactor_input->GetInputAverage(&scalefactor);// average scalefactor on element
 	}
@@ -3809,5 +4045,5 @@
 }
 /*}}}*/
-void       Penta::Update(int index,IoModel* iomodel,int analysis_counter,int analysis_type,int finiteelement_type){ /*{{{*/
+void       Penta::Update(Inputs2* inputs2,int index,IoModel* iomodel,int analysis_counter,int analysis_type,int finiteelement_type){ /*{{{*/
 
 	/*Intermediaries*/
@@ -4188,7 +4424,4 @@
 	xDelete<int>(penta_node_ids);
 
-	/*Fill with IoModel*/
-	this->InputUpdateFromIoModel(index,iomodel);
-
 	/*Defaults if not provided in iomodel*/
 	switch(analysis_type){
@@ -4198,29 +4431,33 @@
 
 			if((IoCodeToEnumElementEquation(reCast<int>(iomodel->Data("md.flowequation.element_equation")[index])))==HOFSApproximationEnum){
+				int vertexlids[NUMVERTICES];
+				for(i=0;i<NUMVERTICES;i++) vertexlids[i]=iomodel->my_vertices_lids[penta_vertex_ids[i]-1];
 				/*Create VzHO and VzFS Enums*/
 				if(iomodel->Data("md.initialization.vz") && iomodel->Data("md.flowequation.borderFS")){
 					for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data("md.initialization.vz")[penta_vertex_ids[i]-1]*iomodel->Data("md.flowequation.borderFS")[penta_vertex_ids[i]-1];
-					this->inputs->AddInput(new PentaInput(VzFSEnum,nodeinputs,P1Enum));
+					this->SetElementInput(inputs2,NUMVERTICES,vertexlids,nodeinputs,VzFSEnum);
 					for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data("md.initialization.vz")[penta_vertex_ids[i]-1]*(1-iomodel->Data("md.flowequation.borderFS")[penta_vertex_ids[i]-1]);
-					this->inputs->AddInput(new PentaInput(VzHOEnum,nodeinputs,P1Enum));
+					this->SetElementInput(inputs2,NUMVERTICES,vertexlids,nodeinputs,VzHOEnum);
 				}
 				else{
 					for(i=0;i<6;i++)nodeinputs[i]=0;
-					this->inputs->AddInput(new PentaInput(VzFSEnum,nodeinputs,P1Enum));
-					this->inputs->AddInput(new PentaInput(VzHOEnum,nodeinputs,P1Enum));
+					this->SetElementInput(inputs2,NUMVERTICES,vertexlids,nodeinputs,VzFSEnum);
+					this->SetElementInput(inputs2,NUMVERTICES,vertexlids,nodeinputs,VzHOEnum);
 				}
 			}
 			if((IoCodeToEnumElementEquation(reCast<int>(iomodel->Data("md.flowequation.element_equation")[index])))==SSAFSApproximationEnum){
+				int vertexlids[NUMVERTICES];
+				for(i=0;i<NUMVERTICES;i++) vertexlids[i]=iomodel->my_vertices_lids[penta_vertex_ids[i]-1];
 				/*Create VzSSA and VzFS Enums*/
 				if(iomodel->Data("md.initialization.vz") && iomodel->Data("md.flowequation.borderFS")){
 					for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data("md.initialization.vz")[penta_vertex_ids[i]-1]*iomodel->Data("md.flowequation.borderFS")[penta_vertex_ids[i]-1];
-					this->inputs->AddInput(new PentaInput(VzFSEnum,nodeinputs,P1Enum));
+					this->SetElementInput(inputs2,NUMVERTICES,vertexlids,nodeinputs,VzFSEnum);
 					for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data("md.initialization.vz")[penta_vertex_ids[i]-1]*(1-iomodel->Data("md.flowequation.borderFS")[penta_vertex_ids[i]-1]);
-					this->inputs->AddInput(new PentaInput(VzSSAEnum,nodeinputs,P1Enum));
+					this->SetElementInput(inputs2,NUMVERTICES,vertexlids,nodeinputs,VzSSAEnum);
 				}
 				else{
 					for(i=0;i<6;i++)nodeinputs[i]=0;
-					this->inputs->AddInput(new PentaInput(VzFSEnum,nodeinputs,P1Enum));
-					this->inputs->AddInput(new PentaInput(VzSSAEnum,nodeinputs,P1Enum));
+					this->SetElementInput(inputs2,NUMVERTICES,vertexlids,nodeinputs,VzFSEnum);
+					this->SetElementInput(inputs2,NUMVERTICES,vertexlids,nodeinputs,VzSSAEnum);
 				}
 			}
@@ -4240,6 +4477,6 @@
 
 	this->parameters->FindParam(&extrusioninput,InputToExtrudeEnum);
-	Input* input = inputs->GetInput(extrusioninput);      _assert_(extrusioninput);
-	Input* onbase = inputs->GetInput(MeshVertexonbaseEnum); _assert_(onbase);
+	Input2* input = this->GetInput2(extrusioninput);      _assert_(extrusioninput);
+	Input2* onbase = this->GetInput2(MeshVertexonbaseEnum); _assert_(onbase);
 
 	GaussPenta* gauss=new GaussPenta();
@@ -4265,5 +4502,5 @@
 
 	this->parameters->FindParam(&extrusioninput,InputToExtrudeEnum);
-	Input* input = inputs->GetInput(extrusioninput); _assert_(extrusioninput);
+	Input2* input = this->GetInput2(extrusioninput); _assert_(extrusioninput);
 
 	GaussPenta* gauss=new GaussPenta();
@@ -4333,5 +4570,5 @@
 }
 /*}}}*/
-void       Penta::ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/
+void       Penta::ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input){/*{{{*/
 
 	/*Intermediaries*/
@@ -4360,48 +4597,40 @@
 void       Penta::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){/*{{{*/
 
-	int             i,t,row;
-	IssmDouble      time;
-	TransientInput *transientinput = NULL;
-	IssmDouble      values[6];
-	IssmDouble      value;
-
 	/*Check that name is an element input*/
 	if(!IsInputEnum(name)) _error_("Enum "<<EnumToStringx(name)<<" is not in IsInput");
+	TransientInput2* transientinput = inputs2->GetTransientInput(name);
 
 	switch(type){
 
 		case VertexEnum:
+
+			/*Get LID lists once for all*/
+			IssmDouble  values[NUMVERTICES];
+			int         lidlist[NUMVERTICES];
+			this->GetVerticesLidList(&lidlist[0]);
+
 			/*Create transient input: */
-			for(t=0;t<ncols;t++){ //ncols is the number of times
+			for(int t=0;t<ncols;t++){ //ncols is the number of times
 
 				/*create input values: */
-				for(i=0;i<6;i++){
-					row=this->vertices[i]->Sid();
+				for(int i=0;i<6;i++){
+					int row=this->vertices[i]->Sid();
 					values[i]=matrix[ncols*row+t];
 				}
 
 				/*time:*/
-				time=matrix[(nrows-1)*ncols+t];
-
-				if(t==0) transientinput=new TransientInput(name);
-				transientinput->AddTimeInput(new PentaInput(name,values,P1Enum),time);
-				transientinput->Configure(parameters);
+				IssmDouble time=matrix[(nrows-1)*ncols+t];
+
+				transientinput->AddPentaTimeInput(t,NUMVERTICES,&lidlist[0],&values[0],P1Enum);
 			}
-			this->inputs->AddInput(transientinput);
 			break;
 
 		case ElementEnum:
 			/*Get value for the element: */
-			for(t=0;t<ncols;t++){ //ncols is the number of times
-				value=matrix[ncols*(this->Sid())+t];
-
-				/*time:*/
-				time=matrix[(nrows-1)*ncols+t];
-
-				if(t==0) transientinput=new TransientInput(name);
-				transientinput->AddTimeInput(new PentaInput(name,&value,P0Enum),time);
-				transientinput->Configure(parameters);
+			for(int t=0;t<ncols;t++){ //ncols is the number of times
+				IssmDouble value=matrix[ncols*(this->Sid())+t];
+				IssmDouble time=matrix[(nrows-1)*ncols+t];
+				transientinput->AddPentaTimeInput(t,1,&(this->lid),&value,P0Enum);
 			}
-			this->inputs->AddInput(transientinput);
 			break;
 
@@ -4496,11 +4725,11 @@
 
 					/*Add new inputs: */
-					this->inputs->AddInput(new PentaInput(ThicknessEnum,thickness,P1Enum));
-					this->inputs->AddInput(new PentaInput(BaseEnum,bed,P1Enum));
-					this->inputs->AddInput(new PentaInput(SurfaceEnum,surface,P1Enum));
+					this->AddInput2(ThicknessEnum,thickness,P1Enum);
+					this->AddInput2(BaseEnum,bed,P1Enum);
+					this->AddInput2(SurfaceEnum,surface,P1Enum);
 					break;
 
 				default:
-					this->inputs->AddInput(new PentaInput(name,values,P1Enum));
+					this->AddInput2(name,values,P1Enum);
 			}
 			break;
@@ -4510,5 +4739,5 @@
 			/*Get value for the element: */
 			value=vector[this->Sid()]; //careful, vector of values here is not parallel distributed, but serial distributed (from a serial Dakota core!)
-			this->inputs->AddInput(new PentaInput(name,&value,P0Enum));
+			this->AddInput2(name,&value,P0Enum);
 			break;
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 24335)
@@ -35,5 +35,5 @@
 		/*Penta constructors and destructor: {{{*/
 		Penta(){};
-		Penta(int penta_id,int penta_sid,IoModel* iomodel,int nummodels);
+		Penta(int penta_id,int penta_sid,int penta_lid,IoModel* iomodel,int nummodels);
 		~Penta();
 		/*}}}*/
@@ -45,5 +45,11 @@
 		/*Penta routines:{{{*/
 		void           AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum);
+		void           AddBasalInput2(int input_enum, IssmDouble* values, int interpolation_enum);
 		void           AddInput(int input_enum, IssmDouble* values, int interpolation_enum);
+		void           AddInput2(int input_enum, IssmDouble* values, int interpolation_enum);
+		void           AddControlInput(int input_enum,Inputs2* inputs2,IoModel* iomodel,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max, int interpolation_enum,int id);
+		void           ControlInputExtrude(int enum_type,int start);
+		void           DatasetInputExtrude(int enum_type,int start);
+		void           DatasetInputCreate(IssmDouble* array,int M,int N,int* individual_enums,int num_inputs,Inputs2* inputs2,IoModel* iomodel,int input_enum);
 		void           AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part);
 		void           BasalNodeIndices(int* pnumindices,int** pindices,int finiteelement);
@@ -58,5 +64,5 @@
 		void           ComputeSigmaNN(){_error_("not implemented yet");};
 		void           ComputeStressTensor();
-		void           Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
+		void           Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters,Inputs2* inputs2in);
 		void           ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N,int M);
 		void           ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
@@ -79,4 +85,7 @@
 		IssmDouble		GetIcefrontArea();
 		void           GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum);
+		Input2*        GetInput2(int enumtype);
+		Input2*        GetInput2(int enumtype,IssmDouble time);
+		DatasetInput2* GetDatasetInput2(int inputenum);
 		void           GetInputValue(IssmDouble* pvalue,Vertex* vertex,int enumtype);
 		void           GetInputValue(IssmDouble* pvalue,Node* node,int enumtype);
@@ -107,6 +116,4 @@
 		bool           IsIcefront(void);
 		bool           IsNodeOnShelfFromFlags(IssmDouble* flags);
-		bool	         IsOnBase(void);
-		bool	         IsOnSurface(void);
 		bool           IsZeroLevelset(int levelset_enum);
 		void           JacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
@@ -154,4 +161,7 @@
 		void           ResetHooks();
 		void				RignotMeltParameterization();
+		void           SetElementInput(int enum_in,IssmDouble values);
+		void           SetElementInput(Inputs2* inputs2,int enum_in,IssmDouble values);
+		void           SetElementInput(Inputs2* inputs2,int numindices,int* indices,IssmDouble* values,int enum_in);
 		void           SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset, int N,int M);
 		void           SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
@@ -174,5 +184,5 @@
 		IssmDouble     TotalGroundedBmb(bool scaled);
 		IssmDouble     TotalSmb(bool scaled);
-		void           Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
+		void           Update(Inputs2* inputs,int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
 		void           UpdateConstraintsExtrudeFromBase(void);
 		void           UpdateConstraintsExtrudeFromTop(void);
@@ -184,5 +194,5 @@
 		void           VerticalSegmentIndices(int** pindices,int* pnumseg);
 		void           VerticalSegmentIndicesBase(int** pindices,int* pnumseg);
-		void           ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
+		void           ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input);
 
 		#ifdef _HAVE_DAKOTA_
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.cpp	(revision 24335)
@@ -13,4 +13,6 @@
 #include <string.h>
 #include "../classes.h"
+#include "../Inputs2/SegInput2.h"
+#include "../Inputs2/TriaInput2.h"
 #include "../../shared/shared.h"
 /*}}}*/
@@ -19,10 +21,19 @@
 #define NUMVERTICES 2
 /*Constructors/destructor/copy*/
-Seg::Seg(int seg_id, int seg_sid,IoModel* iomodel,int nummodels)/*{{{*/
+Seg::Seg(int seg_id, int seg_sid,int seg_lid,IoModel* iomodel,int nummodels)/*{{{*/
 		:ElementHook(nummodels,seg_id,NUMVERTICES,iomodel){
+
+			this->iscollapsed = 0;
+			this->collapsed_ids[0] = -1;
+			this->collapsed_ids[1] = -1;
 
 			/*id: */
 			this->id  = seg_id;
 			this->sid = seg_sid;
+			this->lid = seg_lid;
+
+			/*surface and base*/
+			this->isonsurface = false;
+			this->isonbase    = false;
 
 			//this->parameters: we still can't point to it, it may not even exist. Configure will handle this.
@@ -39,4 +50,8 @@
 			/*Only allocate pointer*/
 			this->element_type_list=xNew<int>(nummodels);
+
+			/*surface and base*/
+			this->isonsurface = true;
+			this->isonbase    = true;
 		}
 /*}}}*/
@@ -51,4 +66,8 @@
 
 	seg=new Seg();
+
+	seg->iscollapsed=this->iscollapsed;
+	seg->collapsed_ids[0]=this->collapsed_ids[0];
+	seg->collapsed_ids[1]=this->collapsed_ids[1];
 
 	//deal with TriaRef mother class
@@ -82,6 +101,9 @@
 	seg->id  = this->id;
 	seg->sid = this->sid;
+	seg->lid = this->lid;
 	if(this->inputs) seg->inputs = (Inputs*)(this->inputs->Copy());
 	else seg->inputs=new Inputs();
+	seg->isonbase  = this->isonbase;
+	seg->isonsurface  = this->isonsurface;
 
 	/*point parameters: */
@@ -106,4 +128,9 @@
 
 	MARSHALLING_ENUM(SegEnum);
+	MARSHALLING(this->iscollapsed);
+	MARSHALLING(this->isonsurface);
+	MARSHALLING(this->isonbase);
+	MARSHALLING(this->collapsed_ids[0]);
+	MARSHALLING(this->collapsed_ids[1]);
 
 	/*Call parent classes: */
@@ -163,4 +190,74 @@
 	*pxyz_front=xyz_front;
 }/*}}}*/
+Input2*    Seg::GetInput2(int inputenum){/*{{{*/
+
+	if(this->iscollapsed){
+		TriaInput2* input = this->inputs2->GetTriaInput(inputenum);
+		if(!input) return input;
+
+		/*Intermediaries*/
+		int numindices;
+		int indices[7];
+
+		/*Check interpolation*/
+		int interpolation = input->GetInterpolation();
+		switch(interpolation){
+			case P0Enum:
+				numindices = 1;
+				indices[0] = this->lid;
+				input->Serve(numindices,&indices[0]);
+				break;
+			case P1Enum:
+				numindices = 2;
+				for(int i=0;i<numindices;i++) indices[i] = vertices[i]->lid;
+				input->Serve(numindices,&indices[0]);
+				break;
+			case P1DGEnum:
+			case P1bubbleEnum:
+			default:
+				input->ServeCollapsed(this->lid,this->collapsed_ids[0],this->collapsed_ids[1]);
+				break;
+			//default: _error_("interpolation "<<EnumToStringx(interpolation)<<" not supported");
+		}
+		/*Flag as collapsed for later use*/
+		input->SetServeCollapsed(true);
+
+		return input;
+	}
+	else{
+		SegInput2* input = this->inputs2->GetSegInput(inputenum);
+		if(!input) return input;
+
+		/*Intermediaries*/
+		int numindices;
+		int indices[7];
+
+		/*Check interpolation*/
+		int interpolation = input->GetInterpolation();
+		switch(interpolation){
+			case P0Enum:
+				numindices = 1;
+				indices[0] = this->lid;
+				input->Serve(numindices,&indices[0]);
+				break;
+			case P1Enum:
+				numindices = 3;
+				for(int i=0;i<3;i++) indices[i] = vertices[i]->lid;
+				input->Serve(numindices,&indices[0]);
+				break;
+			case P1DGEnum:
+				numindices = 3;
+				input->Serve(this->lid,numindices);
+				break;
+			default:
+				input->Serve(this->lid,this->GetNumberOfNodes(interpolation));
+		}
+
+		return input;
+	}
+}/*}}}*/
+Input2*    Seg::GetInput2(int inputenum,IssmDouble time){/*{{{*/
+	_error_("not implemented yet");
+}/*}}}*/
 IssmDouble Seg::GetGroundedPortion(IssmDouble* xyz_list){/*{{{*/
 	/*Computeportion of the element that is grounded*/ 
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 24335)
@@ -28,8 +28,10 @@
 
 	public:
+		int iscollapsed;
+		int collapsed_ids[2];
 
 		/*Seg constructors, destructors {{{*/
 		Seg(){};
-		Seg(int seg_id,int seg_sid,IoModel* iomodel,int nummodels);
+		Seg(int seg_id,int seg_sid,int seg_lid,IoModel* iomodel,int nummodels);
 		~Seg();
 		/*}}}*/
@@ -49,5 +51,5 @@
 		void        ComputeSigmaNN(){_error_("not implemented yet");};
 		void        ComputeStressTensor(){_error_("not implemented yet");};
-		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters){_error_("not implemented yet");};
+		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters,Inputs2* inputs2in){_error_("not implemented yet");};
 		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N,int M){_error_("not implemented yet");};
 		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
@@ -63,4 +65,6 @@
 		IssmDouble  GetGroundedPortion(IssmDouble* xyz_list);
 		void		   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum);
+		Input2*     GetInput2(int enumtype);
+		Input2*     GetInput2(int enumtype,IssmDouble time);
 		void        GetInputValue(IssmDouble* pvalue,Vertex* vertex,int enumtype){_error_("not implemented yet");};
 		void		   GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){_error_("not implemented");};
@@ -86,6 +90,4 @@
 		bool		   IsIcefront(void);
 		bool        IsNodeOnShelfFromFlags(IssmDouble* flags){_error_("not implemented yet");};
-		bool        IsOnBase(){_error_("not implemented yet");};
-		bool        IsOnSurface(){_error_("not implemented yet");};
 		bool        IsZeroLevelset(int levelset_enum){_error_("not implemented");};
 		void        JacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
@@ -148,5 +150,5 @@
 		IssmDouble  TotalGroundedBmb(bool scaled){_error_("not implemented yet");};
 		IssmDouble  TotalSmb(bool scaled){_error_("not implemented yet");};
-		void        Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement){_error_("not implemented yet");};
+		void        Update(Inputs2* inputs2,int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement){_error_("not implemented yet");};
 		void        UpdateConstraintsExtrudeFromBase(){_error_("not implemented");};
 		void        UpdateConstraintsExtrudeFromTop(){_error_("not implemented");};
@@ -158,5 +160,4 @@
 		void        VerticalSegmentIndices(int** pindices,int* pnumseg){_error_("not implemented yet");};
 		void        VerticalSegmentIndicesBase(int** pindices,int* pnumseg){_error_("not implemented yet");};
-		void        ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){_error_("not implemented yet");};
 		IssmDouble     GetArea3D(void){_error_("not implemented yet!");};
 		IssmDouble     GetAreaSpherical(void){_error_("not implemented yet!");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tetra.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tetra.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tetra.cpp	(revision 24335)
@@ -13,4 +13,5 @@
 #include <string.h>
 #include "../classes.h"
+#include "../Inputs2/ElementInput2.h"
 #include "../../shared/shared.h"
 /*}}}*/
@@ -20,5 +21,5 @@
 
 /*Constructors/destructor/copy*/
-Tetra::Tetra(int tet_id, int tet_sid,IoModel* iomodel,int nummodels)/*{{{*/
+Tetra::Tetra(int tet_id, int tet_sid,int tet_lid,IoModel* iomodel,int nummodels)/*{{{*/
 		:ElementHook(nummodels,tet_id,NUMVERTICES,iomodel){
 
@@ -26,4 +27,9 @@
 			this->id  = tet_id;
 			this->sid = tet_sid;
+			this->lid = tet_lid;
+
+			/*surface and base*/
+			this->isonsurface = false;
+			this->isonbase    = false;
 
 			//this->parameters: we still can't point to it, it may not even exist. Configure will handle this.
@@ -40,4 +46,18 @@
 			/*Only allocate pointer*/
 			this->element_type_list=xNew<int>(nummodels);
+
+			/*surface and base*/
+			_assert_(iomodel->Data("md.mesh.vertexonsurface"));
+			_assert_(iomodel->Data("md.mesh.vertexonbase"));
+			this->isonsurface = false;
+			this->isonbase    = false;
+			IssmDouble sum = 0.;
+			for(int i=0;i<NUMVERTICES;i++) sum += iomodel->Data("md.mesh.vertexonsurface")[reCast<int>(iomodel->elements[(tet_id-1)*NUMVERTICES+i])-1];
+			_assert_(sum>=0 && sum<4);
+			if(sum>2.5) this->isonsurface = true;
+			sum = 0.;
+			for(int i=0;i<NUMVERTICES;i++) sum += iomodel->Data("md.mesh.vertexonbase")[reCast<int>(iomodel->elements[(tet_id-1)*NUMVERTICES+i])-1];
+			_assert_(sum>=0 && sum<4);
+			if(sum>2.5) this->isonbase = true;
 		}
 /*}}}*/
@@ -83,6 +103,9 @@
 	tetra->id  = this->id;
 	tetra->sid = this->sid;
+	tetra->lid = this->lid;
 	if(this->inputs) tetra->inputs = (Inputs*)(this->inputs->Copy());
 	else tetra->inputs=new Inputs();
+	tetra->isonbase  = this->isonbase;
+	tetra->isonsurface  = this->isonsurface;
 
 	/*point parameters: */
@@ -103,4 +126,6 @@
 
 	MARSHALLING_ENUM(TetraEnum);
+	MARSHALLING(this->isonsurface);
+	MARSHALLING(this->isonbase);
 
 	/*Call parent classes: */
@@ -122,5 +147,5 @@
 }
 /*}}}*/
-void     Tetra::Configure(Elements* elementsin, Loads* loadsin, Nodes* nodesin,Vertices* verticesin, Materials* materialsin, Parameters* parametersin){/*{{{*/
+void     Tetra::Configure(Elements* elementsin, Loads* loadsin, Nodes* nodesin,Vertices* verticesin, Materials* materialsin, Parameters* parametersin,Inputs2* inputs2in){/*{{{*/
 
 	int analysis_counter;
@@ -146,4 +171,5 @@
 	/*point parameters to real dataset: */
 	this->parameters=parametersin;
+	this->inputs2=inputs2in;
 
 	/*get inputs configured too: */
@@ -246,7 +272,13 @@
 }
 /*}}}*/
+Input2*    Tetra::GetInput2(int inputenum){/*{{{*/
+	_error_("not implemented yet");
+}/*}}}*/
+Input2*    Tetra::GetInput2(int inputenum,IssmDouble time){/*{{{*/
+	_error_("not implemented yet");
+}/*}}}*/
 void     Tetra::GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){/*{{{*/
 
-	Input* input=inputs->GetInput(enumtype);
+	Input2* input=this->GetInput2(enumtype);
 	if(!input) _error_("No input of type " << EnumToStringx(enumtype) << " found in tria");
 
@@ -363,102 +395,4 @@
 		tetra_vertex_ids[i]=iomodel->elements[NUMVERTICES*index+i]; //ids for vertices are in the elements array from Matlab
 	}
-
-	/*Control Inputs*/
-	if (control_analysis){
-		iomodel->FindConstant(&controls,NULL,"md.inversion.control_parameters");
-		for(i=0;i<num_control_type;i++){
-			_assert_(controls[i]);
-			int control = StringToEnumx(controls[i]);
-			switch(control){
-				case BalancethicknessThickeningRateEnum:
-					if (iomodel->Data("md.balancethickness.thickening_rate")){
-						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.balancethickness.thickening_rate")[tetra_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]/yts;
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case VxEnum:
-					if (iomodel->Data("md.initialization.vx")){
-						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.initialization.vx")[tetra_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]/yts;
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(VxEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case VyEnum:
-					if (iomodel->Data("md.initialization.vy")){
-						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.initialization.vy")[tetra_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]/yts;
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(VyEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case FrictionCoefficientEnum:
-					if (iomodel->Data("md.friction.coefficient")){
-						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.friction.coefficient")[tetra_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i];
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case MaterialsRheologyBbarEnum:
-					if(iomodel->Data("md.materials.rheology_B")){
-						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.materials.rheology_B")[tetra_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i];
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case DamageDbarEnum:
-					if(iomodel->Data("md.damage.D")){
-						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.damage.D")[tetra_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i];
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(DamageDEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				default:
-					_error_("Control " << EnumToStringx(control) << " not implemented yet");
-			}
-		}
-		for(i=0;i<num_control_type;i++) xDelete<char>(controls[i]);
-		xDelete<char*>(controls);
-	}
-
-	/*Need to know the type of approximation for this element*/
-	if(iomodel->Data("md.flowequation.element_equation")){
-		this->inputs->AddInput(new IntInput(ApproximationEnum,IoCodeToEnumElementEquation(reCast<int>(iomodel->Data("md.flowequation.element_equation")[index]))));
-	}
-
-	/*DatasetInputs*/
-	if (control_analysis && iomodel->Data("md.inversion.cost_functions_coefficients")) {
-
-		/*Generate cost functions associated with the iomodel*/
-		char**	cost_functions			= NULL;
-		int*		cost_functions_enums = NULL;
-		int		num_cost_functions;
-
-		iomodel->FindConstant(&num_cost_functions,"md.inversion.num_cost_functions");
-		iomodel->FindConstant(&cost_functions,&num_cost_functions,"md.inversion.cost_functions");
-		if(num_cost_functions<1) _error_("No cost functions found");
-		cost_functions_enums=xNew<int>(num_cost_functions);
-		for(j=0;j<num_cost_functions;j++){ cost_functions_enums[j]=StringToEnumx(cost_functions[j]); }
-
-		/*Create inputs and add to DataSetInput*/
-		DatasetInput* datasetinput=new DatasetInput(InversionCostFunctionsCoefficientsEnum);
-		for(i=0;i<num_responses;i++){
-			for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.inversion.cost_functions_coefficients")[(tetra_vertex_ids[j]-1)*num_responses+i];
-			datasetinput->AddInput(new TetraInput(InversionCostFunctionsCoefficientsEnum,nodeinputs,P1Enum),cost_functions_enums[i]);
-		}
-
-		/*Add datasetinput to element inputs*/
-		this->inputs->AddInput(datasetinput);
-
-		/*Clean up cost functions*/
-		xDelete<int>(cost_functions_enums);
-		for(int j=0;j<num_cost_functions;j++) xDelete<char>(cost_functions[j]); 
-		xDelete<char*>(cost_functions);
-	}
 }
 /*}}}*/
@@ -504,12 +438,4 @@
 	return false;
 }/*}}}*/
-bool     Tetra::IsOnBase(){/*{{{*/
-	return HasFaceOnBase();
-}
-/*}}}*/
-bool     Tetra::IsOnSurface(){/*{{{*/
-	return HasFaceOnSurface();
-}
-/*}}}*/
 void     Tetra::JacobianDeterminant(IssmDouble* pJdet,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
 
@@ -744,7 +670,7 @@
 	//printf("element number %i \n",this->id);
 	/*Get inputs*/
-	Input* slopex_input=inputs->GetInput(BedSlopeXEnum); _assert_(slopex_input);
-	Input* slopey_input=inputs->GetInput(BedSlopeYEnum); _assert_(slopey_input);
-	Input* groundedicelevelset_input=inputs->GetInput(MaskGroundediceLevelsetEnum); _assert_(groundedicelevelset_input);
+	Input2* slopex_input=this->GetInput2(BedSlopeXEnum); _assert_(slopex_input);
+	Input2* slopey_input=this->GetInput2(BedSlopeYEnum); _assert_(slopey_input);
+	Input2* groundedicelevelset_input=this->GetInput2(MaskGroundediceLevelsetEnum); _assert_(groundedicelevelset_input);
 	vertexonbase = xNew<IssmDouble>(numnodes);
 	this->GetInputListOnNodesVelocity(&vertexonbase[0],MeshVertexonbaseEnum);
@@ -864,5 +790,5 @@
 }
 /*}}}*/
-void     Tetra::Update(int index,IoModel* iomodel,int analysis_counter,int analysis_type,int finiteelement_type){ /*{{{*/
+void     Tetra::Update(Inputs2* inputs2,int index,IoModel* iomodel,int analysis_counter,int analysis_type,int finiteelement_type){ /*{{{*/
 
 	/*Intermediaries*/
@@ -992,5 +918,5 @@
 }
 /*}}}*/
-void     Tetra::ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/
+void     Tetra::ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input){/*{{{*/
 
 	/*Intermediaries*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Tetra.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 24335)
@@ -31,5 +31,5 @@
 		/*Tetra constructors, destructors {{{*/
 		Tetra(){};
-		Tetra(int tet_id,int tet_sid,IoModel* iomodel,int nummodels);
+		Tetra(int tet_id,int tet_sid,int tet_lid,IoModel* iomodel,int nummodels);
 		~Tetra();
 		/*}}}*/
@@ -49,5 +49,5 @@
 		void        ComputeDeviatoricStressTensor(){_error_("not implemented yet");};
 		void        ComputeEsaStrainAndVorticity(){_error_("not implemented yet!");};
-		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters);
+		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters,Inputs2* inputs2in);
 		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N,int M){_error_("not implemented yet");};
 		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
@@ -62,6 +62,6 @@
 		IssmDouble  FloatingArea(bool scaled){_error_("not implemented yet");};
 		void        FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating){_error_("not implemented yet");};
-		IssmDouble     GetArea3D(void){_error_("not implemented yet!");};
-		IssmDouble     GetAreaSpherical(void){_error_("not implemented yet!");};
+		IssmDouble  GetArea3D(void){_error_("not implemented yet!");};
+		IssmDouble  GetAreaSpherical(void){_error_("not implemented yet!");};
 		Element*    GetBasalElement(void){_error_("not implemented yet");};
 		int         GetElementType(void);
@@ -69,4 +69,6 @@
 		IssmDouble  GetGroundedPortion(IssmDouble* xyz_list){_error_("not implemented yet");};
 		void		   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented yet");};
+		Input2*     GetInput2(int enumtype);
+		Input2*     GetInput2(int enumtype,IssmDouble time);
 		void        GetInputValue(IssmDouble* pvalue,Node* node,int enumtype);
 		void		   GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){_error_("not implemented yet");};
@@ -88,6 +90,4 @@
 		bool		   IsIcefront(void);
 		bool        IsNodeOnShelfFromFlags(IssmDouble* flags){_error_("not implemented yet");};
-		bool        IsOnBase();
-		bool        IsOnSurface();
 		bool        IsZeroLevelset(int levelset_enum){_error_("not implemented");};
 		void        InputDepthAverageAtBase(int enum_type,int average_enum_type){_error_("not implemented yet");};
@@ -157,5 +157,5 @@
 		IssmDouble  TotalGroundedBmb(bool scaled){_error_("not implemented yet");};
 		IssmDouble  TotalSmb(bool scaled){_error_("not implemented yet");};
-		void        Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
+		void        Update(Inputs2* inputs2,int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
 		void        UpdateConstraintsExtrudeFromBase(){_error_("not implemented");};
 		void        UpdateConstraintsExtrudeFromTop(){_error_("not implemented");};
@@ -167,5 +167,5 @@
 		void        VerticalSegmentIndices(int** pindices,int* pnumseg){_error_("not implemented yet");};
 		void        VerticalSegmentIndicesBase(int** pindices,int* pnumseg){_error_("not implemented yet");};
-		void        ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
+		void        ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input);
 
 #ifdef _HAVE_GIAIVINS_
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 24335)
@@ -14,4 +14,9 @@
 #include <math.h>
 #include "../classes.h"
+#include "../Inputs2/TriaInput2.h"
+#include "../Inputs2/PentaInput2.h"
+#include "../Inputs2/ControlInput2.h"
+#include "../Inputs2/DatasetInput2.h"
+#include "../Inputs2/TransientInput2.h"
 #include "../../shared/shared.h"
 #ifdef _HAVE_GIAIVINS_
@@ -25,12 +30,15 @@
 
 /*Constructors/destructor/copy*/
-Tria::Tria(int tria_id, int tria_sid, IoModel* iomodel,int nummodels)/*{{{*/
+Tria::Tria(int tria_id,int tria_sid,int tria_lid,IoModel* iomodel,int nummodels)/*{{{*/
 	:ElementHook(nummodels,tria_id,NUMVERTICES,iomodel){
+
+		this->iscollapsed = 0;
 
 		/*id: */
 		this->id  = tria_id;
 		this->sid = tria_sid;
-
-		//this->parameters: we still can't point to it, it may not even exist. Configure will handle this.
+		this->lid = tria_lid;
+
+		/*this->parameters: we still can't point to it, it may not even exist. Configure will handle this.*/
 		this->parameters = NULL;
 
@@ -48,6 +56,29 @@
 		else this->element_type_list = NULL;
 
-}
-/*}}}*/
+		/*surface and base*/
+		IssmDouble sum;
+		this->isonsurface = false;
+		this->isonbase    = false;
+		switch(iomodel->domaintype){
+			case Domain2DverticalEnum:
+				_assert_(iomodel->Data("md.mesh.vertexonsurface"));
+				_assert_(iomodel->Data("md.mesh.vertexonbase"));
+				sum = 0.;
+				for(int i=0;i<NUMVERTICES;i++) sum += iomodel->Data("md.mesh.vertexonsurface")[reCast<int>(iomodel->elements[(tria_id-1)*NUMVERTICES+i])-1];
+				_assert_(sum>=0 && sum<3);
+				if(sum>1.) this->isonsurface = true;
+				sum = 0.;
+				for(int i=0;i<NUMVERTICES;i++) sum += iomodel->Data("md.mesh.vertexonbase")[reCast<int>(iomodel->elements[(tria_id-1)*NUMVERTICES+i])-1];
+				_assert_(sum>=0 && sum<3);
+				if(sum>1.) this->isonbase = true;
+				break;
+			case Domain2DhorizontalEnum:
+				this->isonsurface = true;
+				this->isonbase    = true;
+				break;
+			default: _error_("mesh "<<EnumToStringx(iomodel->domaintype)<<" not supported yet");
+		}
+
+}/*}}}*/
 Tria::~Tria(){/*{{{*/
 	this->parameters=NULL;
@@ -60,4 +91,6 @@
 
 	tria=new Tria();
+
+	tria->iscollapsed=this->iscollapsed;
 
 	//deal with TriaRef mother class
@@ -91,6 +124,9 @@
 	tria->id  = this->id;
 	tria->sid = this->sid;
+	tria->lid = this->lid;
 	if(this->inputs) tria->inputs = (Inputs*)(this->inputs->Copy());
 	else tria->inputs=new Inputs();
+	tria->isonbase  = this->isonbase;
+	tria->isonsurface  = this->isonsurface;
 
 	/*point parameters: */
@@ -114,4 +150,7 @@
 
 	MARSHALLING_ENUM(TriaEnum);
+	MARSHALLING(this->iscollapsed);
+	MARSHALLING(this->isonsurface);
+	MARSHALLING(this->isonbase);
 
 	/*Call parent classes: */
@@ -127,4 +166,49 @@
 
 /*Other*/
+void       Tria::AddBasalInput2(int input_enum,IssmDouble* values, int interpolation_enum){/*{{{*/
+
+	/*Call inputs method*/
+	_assert_(this->inputs2);
+
+	int domaintype;
+	parameters->FindParam(&domaintype,DomainTypeEnum);
+	switch(domaintype){
+		case Domain2DhorizontalEnum:
+			this->AddInput2(input_enum,values,interpolation_enum);
+			break;
+		case Domain2DverticalEnum:{
+			_error_("not implemented yet");
+										  }
+			break;
+		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+	}
+
+}
+/*}}}*/
+void       Tria::AddInput2(int input_enum,IssmDouble* values, int interpolation_enum){/*{{{*/
+
+	/*Intermediaries*/
+	int vertexlids[NUMVERTICES];
+
+	/*Call inputs method*/
+	if(!this->inputs2){
+		int* temp = xNew<int>(3);
+	}
+	_assert_(this->inputs2);
+	switch(interpolation_enum){
+		case P1Enum:
+			for(int i=0;i<NUMVERTICES;i++) vertexlids[i]=this->vertices[i]->lid;
+			inputs2->SetTriaInput(input_enum,interpolation_enum,NUMVERTICES,vertexlids,values);
+			break;
+		case P1DGEnum:
+			for(int i=0;i<NUMVERTICES;i++) vertexlids[i]=this->vertices[i]->lid;
+			inputs2->SetTriaInput(input_enum,interpolation_enum,this->lid,NUMVERTICES,values);
+			break;
+		default:
+			inputs2->SetTriaInput(input_enum,interpolation_enum,this->lid,this->GetNumberOfNodes(interpolation_enum),values);
+	}
+
+}
+/*}}}*/
 void       Tria::AddBasalInput(int input_enum,IssmDouble* values, int interpolation_enum){/*{{{*/
 
@@ -166,12 +250,27 @@
 }
 /*}}}*/
-void       Tria::AddControlInput(int input_enum,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max, int interpolation_enum,int id){/*{{{*/
+void       Tria::AddControlInput(int input_enum,Inputs2* inputs2,IoModel* iomodel,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max, int interpolation_enum,int id){/*{{{*/
+
+	/*Intermediaries*/
+	int vertexlids[NUMVERTICES];
+
+	_assert_(iomodel->elements);
+	for(int i=0;i<NUMVERTICES;i++){
+		int vertexid =reCast<int>(iomodel->elements[NUMVERTICES*this->Sid()+i]); //ids for vertices are in the elements array from Matlab
+		vertexlids[i]=iomodel->my_vertices_lids[vertexid-1];
+	}
 
 	/*Call inputs method*/
-	_assert_(this->inputs);
-	this->inputs->AddInput(new ControlInput(input_enum,TriaInputEnum,values,values_min,values_max,interpolation_enum,id));
-}
-/*}}}*/
-void       Tria::DatasetInputCreate(IssmDouble* array,int M,int N,int* individual_enums,int num_inputs,IoModel* iomodel,int input_enum){/*{{{*/
+	switch(interpolation_enum){
+		case P1Enum:
+			inputs2->SetTriaControlInput(input_enum,TriaInput2Enum,interpolation_enum,id,NUMVERTICES,vertexlids,values,values_min,values_max);
+			break;
+		default:
+			_error_("Cannot add \""<<EnumToStringx(input_enum)<<"\" interpolation "<<EnumToStringx(interpolation_enum)<<" not supported");
+	}
+
+}
+/*}}}*/
+void       Tria::DatasetInputCreate(IssmDouble* array,int M,int N,int* individual_enums,int num_inputs,Inputs2* inputs2,IoModel* iomodel,int input_enum){/*{{{*/
 
 	IssmDouble nodeinputs[NUMVERTICES];
@@ -179,4 +278,5 @@
 	if(M!=iomodel->numberofvertices) _error_("not supported yet");
 	if(N!=num_inputs) _error_("sizes are not consistent");
+	
 
 	int        tria_vertex_ids[3];
@@ -251,13 +351,13 @@
 
 	/*Retrieve all inputs and parameters we will need*/
-	Input* vx_input = inputs->GetInput(VxEnum); _assert_(vx_input);
-	Input* vy_input = inputs->GetInput(VyEnum); _assert_(vy_input);
-	Input* B_input  = inputs->GetInput(MaterialsRheologyBbarEnum);   _assert_(B_input);
-	Input* gr_input = inputs->GetInput(MaskGroundediceLevelsetEnum); _assert_(gr_input);
-	Input* bs_input = inputs->GetInput(BaseEnum);                    _assert_(bs_input);
-	Input* smax_fl_input = inputs->GetInput(CalvingStressThresholdFloatingiceEnum); _assert_(smax_fl_input);
-	Input* smax_gr_input = inputs->GetInput(CalvingStressThresholdGroundediceEnum); _assert_(smax_gr_input);
-	Input* n_input  = inputs->GetInput(MaterialsRheologyNEnum); _assert_(n_input);
-	Input* sl_input  = inputs->GetInput(SealevelEnum); _assert_(sl_input);
+	Input2* vx_input = this->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input = this->GetInput2(VyEnum); _assert_(vy_input);
+	Input2* B_input  = this->GetInput2(MaterialsRheologyBbarEnum);   _assert_(B_input);
+	Input2* gr_input = this->GetInput2(MaskGroundediceLevelsetEnum); _assert_(gr_input);
+	Input2* bs_input = this->GetInput2(BaseEnum);                    _assert_(bs_input);
+	Input2* smax_fl_input = this->GetInput2(CalvingStressThresholdFloatingiceEnum); _assert_(smax_fl_input);
+	Input2* smax_gr_input = this->GetInput2(CalvingStressThresholdGroundediceEnum); _assert_(smax_gr_input);
+	Input2* n_input  = this->GetInput2(MaterialsRheologyNEnum); _assert_(n_input);
+	Input2* sl_input  = this->GetInput2(SealevelEnum); _assert_(sl_input);
 
 
@@ -320,8 +420,8 @@
 
 	/*Add input*/
-	this->inputs->AddInput(new TriaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(SigmaVMEnum,&sigma_vm[0],P1Enum));
+	this->AddInput2(CalvingratexEnum,&calvingratex[0],P1DGEnum);
+	this->AddInput2(CalvingrateyEnum,&calvingratey[0],P1DGEnum);
+	this->AddInput2(CalvingCalvingrateEnum,&calvingrate[0],P1DGEnum);
+	this->AddInput2(SigmaVMEnum,&sigma_vm[0],P1DGEnum);
 
 	/*Clean up and return*/
@@ -351,17 +451,17 @@
 	IssmDouble constant_g     = this->FindParam(ConstantsGEnum);
 
-	Input*   H_input                 = inputs->GetInput(ThicknessEnum); _assert_(H_input);
-	Input*   bed_input               = inputs->GetInput(BedEnum); _assert_(bed_input);
-	Input*   surface_input           = inputs->GetInput(SurfaceEnum); _assert_(surface_input);
-	Input*	strainrateparallel_input  = inputs->GetInput(StrainRateparallelEnum);  _assert_(strainrateparallel_input);
-	Input*	strainrateeffective_input = inputs->GetInput(StrainRateeffectiveEnum); _assert_(strainrateeffective_input);
-	Input*	vx_input                  = inputs->GetInput(VxEnum); _assert_(vx_input);
-	Input*	vy_input                  = inputs->GetInput(VxEnum); _assert_(vy_input);
-	Input*   waterheight_input       = inputs->GetInput(WaterheightEnum); _assert_(waterheight_input);
-	Input*   s_xx_input              = inputs->GetInput(DeviatoricStressxxEnum);     _assert_(s_xx_input);
-	Input*   s_xy_input              = inputs->GetInput(DeviatoricStressxyEnum);     _assert_(s_xy_input);
-	Input*   s_yy_input              = inputs->GetInput(DeviatoricStressyyEnum);     _assert_(s_yy_input);
-	Input*	B_input  = inputs->GetInput(MaterialsRheologyBbarEnum);   _assert_(B_input);
-	Input*	n_input  = inputs->GetInput(MaterialsRheologyNEnum);   _assert_(n_input);
+	Input2*   H_input                 = this->GetInput2(ThicknessEnum); _assert_(H_input);
+	Input2*   bed_input               = this->GetInput2(BedEnum); _assert_(bed_input);
+	Input2*   surface_input           = this->GetInput2(SurfaceEnum); _assert_(surface_input);
+	Input2*	strainrateparallel_input  = this->GetInput2(StrainRateparallelEnum);  _assert_(strainrateparallel_input);
+	Input2*	strainrateeffective_input = this->GetInput2(StrainRateeffectiveEnum); _assert_(strainrateeffective_input);
+	Input2*	vx_input                  = this->GetInput2(VxEnum); _assert_(vx_input);
+	Input2*	vy_input                  = this->GetInput2(VxEnum); _assert_(vy_input);
+	Input2*   waterheight_input       = this->GetInput2(WaterheightEnum); _assert_(waterheight_input);
+	Input2*   s_xx_input              = this->GetInput2(DeviatoricStressxxEnum);     _assert_(s_xx_input);
+	Input2*   s_xy_input              = this->GetInput2(DeviatoricStressxyEnum);     _assert_(s_xy_input);
+	Input2*   s_yy_input              = this->GetInput2(DeviatoricStressyyEnum);     _assert_(s_yy_input);
+	Input2*	B_input  = this->GetInput2(MaterialsRheologyBbarEnum);   _assert_(B_input);
+	Input2*	n_input  = this->GetInput2(MaterialsRheologyNEnum);   _assert_(n_input);
 
 	/*Loop over all elements of this partition*/
@@ -420,7 +520,7 @@
 	}
 
-	this->inputs->AddInput(new TriaInput(SurfaceCrevasseEnum,&surface_crevasse[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(BasalCrevasseEnum,&basal_crevasse[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(CrevasseDepthEnum,&crevasse_depth[0],P1Enum));
+	this->AddInput2(SurfaceCrevasseEnum,&surface_crevasse[0],P1DGEnum);
+	this->AddInput2(BasalCrevasseEnum,&basal_crevasse[0],P1DGEnum);
+	this->AddInput2(CrevasseDepthEnum,&crevasse_depth[0],P1DGEnum);
 
 	delete gauss;
@@ -442,10 +542,10 @@
 
 	/*Retrieve all inputs and parameters we will need*/
-	Input* vx_input=inputs->GetInput(VxEnum);													_assert_(vx_input);
-	Input* vy_input=inputs->GetInput(VyEnum);													_assert_(vy_input);
-	Input* bs_input = inputs->GetInput(BaseEnum);                                 _assert_(bs_input);
-	Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum);			_assert_(strainparallel_input);
-	Input* strainperpendicular_input=inputs->GetInput(StrainRateperpendicularEnum);_assert_(strainperpendicular_input);
-	Input* levermanncoeff_input=inputs->GetInput(CalvinglevermannCoeffEnum);      _assert_(levermanncoeff_input);
+	Input2* vx_input=this->GetInput2(VxEnum);													_assert_(vx_input);
+	Input2* vy_input=this->GetInput2(VyEnum);													_assert_(vy_input);
+	Input2* bs_input = this->GetInput2(BaseEnum);                                 _assert_(bs_input);
+	Input2* strainparallel_input=this->GetInput2(StrainRateparallelEnum);			_assert_(strainparallel_input);
+	Input2* strainperpendicular_input=this->GetInput2(StrainRateperpendicularEnum);_assert_(strainperpendicular_input);
+	Input2* levermanncoeff_input=this->GetInput2(CalvinglevermannCoeffEnum);      _assert_(levermanncoeff_input);
 
 	/* Start looping on the number of vertices: */
@@ -475,7 +575,7 @@
 
 	/*Add input*/
-	this->inputs->AddInput(new TriaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
+	this->AddInput2(CalvingratexEnum,&calvingratex[0],P1DGEnum);
+	this->AddInput2(CalvingrateyEnum,&calvingratey[0],P1DGEnum);
+	this->AddInput2(CalvingCalvingrateEnum,&calvingrate[0],P1DGEnum);
 
 	/*Clean up and return*/
@@ -489,5 +589,5 @@
 	if(!IsIceInElement() || !IsZeroLevelset(MaskIceLevelsetEnum)){
 		IssmDouble flux_per_area=0;
-		this->inputs->AddInput(new TriaInput(CalvingFluxLevelsetEnum,&flux_per_area,P0Enum));
+		this->AddInput2(CalvingFluxLevelsetEnum,&flux_per_area,P0Enum);
 	}
 	else{
@@ -585,14 +685,14 @@
 		IssmDouble calvingratex,calvingratey,thickness,Jdet,flux_per_area;
 		IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-		Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
-		Input* calvingratex_input=NULL;
-		Input* calvingratey_input=NULL;
+		Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
+		Input2* calvingratex_input=NULL;
+		Input2* calvingratey_input=NULL;
 		if(domaintype==Domain2DhorizontalEnum){
-			calvingratex_input=inputs->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-			calvingratey_input=inputs->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
+			calvingratex_input=this->GetInput2(CalvingratexEnum); _assert_(calvingratex_input);
+			calvingratey_input=this->GetInput2(CalvingrateyEnum); _assert_(calvingratey_input);
 		}
 		else{
-			calvingratex_input=inputs->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
-			calvingratey_input=inputs->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
+			calvingratex_input=this->GetInput2(CalvingratexAverageEnum); _assert_(calvingratex_input);
+			calvingratey_input=this->GetInput2(CalvingrateyAverageEnum); _assert_(calvingratey_input);
 		}
 
@@ -613,5 +713,5 @@
 		}
 
-		this->inputs->AddInput(new TriaInput(CalvingFluxLevelsetEnum,&flux_per_area,P0Enum));
+		this->AddInput2(CalvingFluxLevelsetEnum,&flux_per_area,P0Enum);
 
 		/*Clean up and return*/
@@ -625,5 +725,5 @@
 	if(!IsIceInElement() || !IsZeroLevelset(MaskIceLevelsetEnum)){
 		IssmDouble flux_per_area=0;
-		this->inputs->AddInput(new TriaInput(CalvingMeltingFluxLevelsetEnum,&flux_per_area,P0Enum));
+		this->AddInput2(CalvingMeltingFluxLevelsetEnum,&flux_per_area,P0Enum);
 	}
 	else{
@@ -722,20 +822,20 @@
 		IssmDouble calvingratex,calvingratey,vx,vy,vel,meltingrate,meltingratex,meltingratey,thickness,Jdet,flux_per_area;
 		IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-		Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
-		Input* calvingratex_input=NULL;
-		Input* calvingratey_input=NULL;
-		Input* vx_input=NULL;
-		Input* vy_input=NULL;
-		Input* meltingrate_input=NULL;
+		Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
+		Input2* calvingratex_input=NULL;
+		Input2* calvingratey_input=NULL;
+		Input2* vx_input=NULL;
+		Input2* vy_input=NULL;
+		Input2* meltingrate_input=NULL;
 		if(domaintype==Domain2DhorizontalEnum){
-			calvingratex_input=inputs->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-			calvingratey_input=inputs->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
-			vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);
-			vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);
-			meltingrate_input=inputs->GetInput(CalvingMeltingrateEnum); _assert_(meltingrate_input);
+			calvingratex_input=this->GetInput2(CalvingratexEnum); _assert_(calvingratex_input);
+			calvingratey_input=this->GetInput2(CalvingrateyEnum); _assert_(calvingratey_input);
+			vx_input=this->GetInput2(VxEnum); _assert_(vx_input);
+			vy_input=this->GetInput2(VyEnum); _assert_(vy_input);
+			meltingrate_input=this->GetInput2(CalvingMeltingrateEnum); _assert_(meltingrate_input);
 		}
 		else{
-			calvingratex_input=inputs->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
-			calvingratey_input=inputs->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
+			calvingratex_input=this->GetInput2(CalvingratexAverageEnum); _assert_(calvingratex_input);
+			calvingratey_input=this->GetInput2(CalvingrateyAverageEnum); _assert_(calvingratey_input);
 		}
 
@@ -762,5 +862,5 @@
 		}
 
-		this->inputs->AddInput(new TriaInput(CalvingMeltingFluxLevelsetEnum,&flux_per_area,P0Enum));
+		this->AddInput2(CalvingMeltingFluxLevelsetEnum,&flux_per_area,P0Enum);
 
 		/*Clean up and return*/
@@ -797,5 +897,5 @@
 	/*Get approximation*/
 	int approximation;
-	inputs->GetInputValue(&approximation,ApproximationEnum);
+	this->GetInput2Value(&approximation,ApproximationEnum);
 
 	/* Get node coordinates and dof list: */
@@ -804,6 +904,6 @@
 	/*Retrieve all inputs we will be needing: */
 	this->FindParam(&domaintype,DomainTypeEnum);
-	Input* vx_input=inputs->GetInput(VxEnum);             _assert_(vx_input);
-	Input* vy_input=inputs->GetInput(VyEnum);             _assert_(vy_input);
+	Input2* vx_input=this->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input=this->GetInput2(VyEnum); _assert_(vy_input);
 
 	/* Start looping on the number of vertices: */
@@ -839,13 +939,13 @@
 
 	/*Add Stress tensor components into inputs*/
-	this->inputs->AddInput(new TriaInput(DeviatoricStressxxEnum,&tau_xx[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(DeviatoricStressxyEnum,&tau_xy[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(DeviatoricStressxzEnum,&tau_xz[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(DeviatoricStressyyEnum,&tau_yy[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(DeviatoricStressyzEnum,&tau_yz[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(DeviatoricStresszzEnum,&tau_zz[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(DeviatoricStresseffectiveEnum,&tau_e[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(DeviatoricStress1Enum,&tau_1[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(DeviatoricStress2Enum,&tau_2[0],P1Enum));
+	this->AddInput2(DeviatoricStressxxEnum,&tau_xx[0],P1DGEnum);
+	this->AddInput2(DeviatoricStressxyEnum,&tau_xy[0],P1DGEnum);
+	this->AddInput2(DeviatoricStressxzEnum,&tau_xz[0],P1DGEnum);
+	this->AddInput2(DeviatoricStressyyEnum,&tau_yy[0],P1DGEnum);
+	this->AddInput2(DeviatoricStressyzEnum,&tau_yz[0],P1DGEnum);
+	this->AddInput2(DeviatoricStresszzEnum,&tau_zz[0],P1DGEnum);
+	this->AddInput2(DeviatoricStresseffectiveEnum,&tau_e[0],P1DGEnum);
+	this->AddInput2(DeviatoricStress1Enum,&tau_1[0],P1DGEnum);
+	this->AddInput2(DeviatoricStress2Enum,&tau_2[0],P1DGEnum);
 
 	/*Clean up and return*/
@@ -867,6 +967,6 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* vx_input=this->GetInput(EsaXmotionEnum); _assert_(vx_input);
-	Input* vy_input=this->GetInput(EsaYmotionEnum); _assert_(vy_input);
+	Input2* vx_input=this->GetInput2(EsaXmotionEnum); _assert_(vx_input);
+	Input2* vy_input=this->GetInput2(EsaYmotionEnum); _assert_(vy_input);
 
 	/* Start looping on the number of vertices: */
@@ -886,8 +986,8 @@
 
 	/*Add Stress tensor components into inputs*/
-	this->inputs->AddInput(new TriaInput(EsaStrainratexxEnum,&strain_xx[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(EsaStrainrateyyEnum,&strain_yy[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(EsaStrainratexyEnum,&strain_xy[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(EsaRotationrateEnum,&vorticity_xy[0],P1Enum));
+	this->AddInput2(EsaStrainratexxEnum,&strain_xx[0],P1DGEnum);
+	this->AddInput2(EsaStrainrateyyEnum,&strain_yy[0],P1DGEnum);
+	this->AddInput2(EsaStrainratexyEnum,&strain_xy[0],P1DGEnum);
+	this->AddInput2(EsaRotationrateEnum,&vorticity_xy[0],P1DGEnum);
 
 	/*Clean up and return*/
@@ -899,5 +999,5 @@
 	if(!IsOnBase()){
 		IssmDouble sigma_nn[3]={0.};
-		this->inputs->AddInput(new TriaInput(SigmaNNEnum,&sigma_nn[0],P1Enum));
+		this->AddInput2(SigmaNNEnum,&sigma_nn[0],P1Enum);
 		return;
 	}
@@ -919,7 +1019,7 @@
 		this->FindParam(&domaintype,DomainTypeEnum);
 		if(domaintype==Domain2DhorizontalEnum) _error_("stress tensor calculation not supported for mesh of type " <<EnumToStringx(domaintype)<<", extrude mesh or call ComputeDeviatoricStressTensor");
-		Input* pressure_input=inputs->GetInput(PressureEnum); _assert_(pressure_input);
-		Input* vx_input=inputs->GetInput(VxEnum);             _assert_(vx_input);
-		Input* vy_input=inputs->GetInput(VyEnum);             _assert_(vy_input);
+		Input2* pressure_input=this->GetInput2(PressureEnum); _assert_(pressure_input);
+		Input2* vx_input=this->GetInput2(VxEnum);             _assert_(vx_input);
+		Input2* vy_input=this->GetInput2(VyEnum);             _assert_(vy_input);
 
 		/* Start looping on the number of vertices: */
@@ -946,5 +1046,5 @@
 
 		/*Add Stress tensor components into inputs*/
-		this->inputs->AddInput(new TriaInput(SigmaNNEnum,&sigma_nn[0],P1Enum));
+		this->AddInput2(SigmaNNEnum,&sigma_nn[0],P1Enum);
 
 		/*Clean up and return*/
@@ -975,7 +1075,7 @@
 	this->FindParam(&domaintype,DomainTypeEnum);
 	if(domaintype==Domain2DhorizontalEnum) _error_("stress tensor calculation not supported for mesh of type " <<EnumToStringx(domaintype)<<", extrude mesh or call ComputeDeviatoricStressTensor");
-	Input* pressure_input=inputs->GetInput(PressureEnum); _assert_(pressure_input);
-	Input* vx_input=inputs->GetInput(VxEnum);             _assert_(vx_input);
-	Input* vy_input=inputs->GetInput(VyEnum);             _assert_(vy_input);
+	Input2* pressure_input=this->GetInput2(PressureEnum); _assert_(pressure_input);
+	Input2* vx_input=this->GetInput2(VxEnum);             _assert_(vx_input);
+	Input2* vy_input=this->GetInput2(VyEnum);             _assert_(vy_input);
 
 	/* Start looping on the number of vertices: */
@@ -996,10 +1096,10 @@
 
 	/*Add Stress tensor components into inputs*/
-	this->inputs->AddInput(new TriaInput(StressTensorxxEnum,&sigma_xx[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(StressTensorxyEnum,&sigma_xy[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(StressTensorxzEnum,&sigma_xz[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(StressTensoryyEnum,&sigma_yy[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(StressTensoryzEnum,&sigma_yz[0],P1Enum));
-	this->inputs->AddInput(new TriaInput(StressTensorzzEnum,&sigma_zz[0],P1Enum));
+	this->AddInput2(StressTensorxxEnum,&sigma_xx[0],P1DGEnum);
+	this->AddInput2(StressTensorxyEnum,&sigma_xy[0],P1DGEnum);
+	this->AddInput2(StressTensorxzEnum,&sigma_xz[0],P1DGEnum);
+	this->AddInput2(StressTensoryyEnum,&sigma_yy[0],P1DGEnum);
+	this->AddInput2(StressTensoryzEnum,&sigma_yz[0],P1DGEnum);
+	this->AddInput2(StressTensorzzEnum,&sigma_zz[0],P1DGEnum);
 
 	/*Clean up and return*/
@@ -1007,5 +1107,5 @@
 }
 /*}}}*/
-void       Tria::Configure(Elements* elementsin, Loads* loadsin,Nodes* nodesin,Vertices *verticesin,Materials* materialsin, Parameters* parametersin){/*{{{*/
+void       Tria::Configure(Elements* elementsin, Loads* loadsin,Nodes* nodesin,Vertices *verticesin,Materials* materialsin, Parameters* parametersin,Inputs2* inputs2in){/*{{{*/
 
 	/*go into parameters and get the analysis_counter: */
@@ -1034,38 +1134,30 @@
 	/*point parameters to real dataset: */
 	this->parameters=parametersin;
+	this->inputs2=inputs2in;
 
 	/*get inputs configured too: */
 	this->inputs->Configure(this->parameters);
 
-}
-/*}}}*/
+}/*}}}*/
 void       Tria::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N, int M){/*{{{*/
 
-	int    idlist[NUMVERTICES];
-	int	gradidlist[NUMVERTICES];
-	IssmDouble grad_list[NUMVERTICES];
-	Input* grad_input=NULL;
-
-	Input* input=inputs->GetInput(enum_type);
-	if (!input) _error_("Input " << EnumToStringx(enum_type) << " not found");
-	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(enum_type) << " is not a ControlInput");
+	int         idlist[NUMVERTICES];
+	int         vertexlids[NUMVERTICES];
+	int         gradidlist[NUMVERTICES];
+	IssmDouble  grad_list[NUMVERTICES];
 
 	GradientIndexing(&gradidlist[0],control_index);
-
-	for(int n=0;n<N;n++){
-		for(int i=0;i<NUMVERTICES;i++){
-			idlist[i] = offset + this->vertices[i]->Sid()+n*M;
-			grad_list[i]=gradient[idlist[i]];
-		}
-
-		ControlInput* controlinput = xDynamicCast<ControlInput*>(input);
-		if(controlinput->layout_enum!=TransientInputEnum){
-			grad_input=new TriaInput(GradientEnum,grad_list,P1Enum);
-			controlinput->SetGradient(grad_input);
-		}
-		else{
-			grad_input = new TriaInput(GradientEnum,grad_list,P1Enum);
-			controlinput->SetGradient(grad_input,n);
-			controlinput->Configure(parameters);
+	for(int i=0;i<NUMVERTICES;i++) vertexlids[i]=this->vertices[i]->lid;
+
+	if(N==1){
+		this->inputs2->SetTriaControlInputGradient(enum_type,P1Enum,NUMVERTICES,&vertexlids[0],&grad_list[0]);
+	}
+	else{
+		for(int n=0;n<N;n++){
+			for(int i=0;i<NUMVERTICES;i++){
+				idlist[i] = offset + this->vertices[i]->Sid()+n*M;
+				grad_list[i]=gradient[idlist[i]];
+			}
+			this->inputs2->SetTriaControlInputGradient(enum_type,P1Enum,NUMVERTICES,&vertexlids[0],&grad_list[0],n);
 		}
 	}
@@ -1074,26 +1166,19 @@
 void       Tria::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){/*{{{*/
 
-	int    vertexpidlist[NUMVERTICES];
+	int        idlist[NUMVERTICES];
+	int        vertexlids[NUMVERTICES];
 	IssmDouble grad_list[NUMVERTICES];
-	Input* grad_input=NULL;
-
-	Input* input=inputs->GetInput(enum_type);
-	if (!input) _error_("Input " << EnumToStringx(enum_type) << " not found");
-	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(enum_type) << " is not a ControlInput");
-
-	GradientIndexing(&vertexpidlist[0],control_index);
-	for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[vertexpidlist[i]];
-	grad_input=new TriaInput(GradientEnum,grad_list,P1Enum);
-
-	((ControlInput*)input)->SetGradient(grad_input);
+
+	GradientIndexing(&idlist[0],control_index);
+	for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[idlist[i]];
+	for(int i=0;i<NUMVERTICES;i++) vertexlids[i]=this->vertices[i]->lid;
+
+	this->inputs2->SetTriaControlInputGradient(enum_type,P1Enum,NUMVERTICES,&vertexlids[0],&grad_list[0]);
 
 }/*}}}*/
 void       Tria::ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){/*{{{*/
 
-	Input* input=inputs->GetInput(control_enum);
-	if (!input) _error_("Input " << EnumToStringx(control_enum) << " not found");
-	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(control_enum) << " is not a ControlInput");
-
 	int         sidlist[NUMVERTICES];
+	int         lidlist[NUMVERTICES];
 	int         connectivity[NUMVERTICES];
 	IssmPDouble values[NUMVERTICES];
@@ -1103,4 +1188,10 @@
 	this->GetVerticesConnectivityList(&connectivity[0]);
 	this->GetVerticesSidList(&sidlist[0]);
+	this->GetVerticesLidList(&lidlist[0]);
+
+	ElementInput2* control_value    = this->inputs2->GetControlInput2Data(control_enum,"value");    _assert_(control_value);
+	ElementInput2* control_gradient = this->inputs2->GetControlInput2Data(control_enum,"gradient"); _assert_(control_gradient);
+	control_value->Serve(NUMVERTICES,&lidlist[0]);
+	control_gradient->Serve(NUMVERTICES,&lidlist[0]);
 
 	GaussTria* gauss=new GaussTria();
@@ -1108,6 +1199,6 @@
 		gauss->GaussVertex(iv);
 
-		((ControlInput*)input)->GetInputValue(&value,gauss);
-		((ControlInput*)input)->GetGradientValue(&gradient,gauss);
+		control_value->GetInputValue(&value,gauss);
+		control_gradient->GetInputValue(&gradient,gauss);
 
 		values[iv]    = reCast<IssmPDouble>(value)/reCast<IssmPDouble>(connectivity[iv]);
@@ -1143,5 +1234,5 @@
 
 	/*Update Levelset*/
-	this->inputs->AddInput(new TriaInput(distanceenum,&ls[0],P1Enum));
+	this->AddInput2(distanceenum,&ls[0],P1Enum);
 }
 /*}}}*/
@@ -1233,7 +1324,5 @@
 			/*Get input:*/
 			IssmDouble vel;
-			Input* vel_input;
-
-			vel_input=this->inputs->GetInput(VelEnum); _assert_(vel_input);
+			Input2* vel_input=this->GetInput2(VelEnum); _assert_(vel_input);
 			vel_input->GetInputAverage(&vel);
 
@@ -1291,5 +1380,5 @@
 	floatingarea=(1-phi)*this->GetArea();
 	if(scaled==true){
-		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		Input2* scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input);
 		scalefactor_input->GetInputAverage(&scalefactor);
 		floatingarea=floatingarea*scalefactor;
@@ -1306,5 +1395,5 @@
 
 	int approximation;
-	inputs->GetInputValue(&approximation,ApproximationEnum);
+	this->GetInput2Value(&approximation,ApproximationEnum);
 
 	if(approximation==HOApproximationEnum || approximation==SSAApproximationEnum || approximation==SSAHOApproximationEnum){
@@ -1329,6 +1418,6 @@
 	GetVerticesCoordinates(&xyz_list);
 	/*Retrieve all inputs we will be needing: */
-	Input* vx_input       = inputs->GetInput(VxEnum);       _assert_(vx_input);
-	Input* vy_input       = inputs->GetInput(VyEnum);       _assert_(vy_input);
+	Input2* vx_input       = this->GetInput2(VxEnum);       _assert_(vx_input);
+	Input2* vy_input       = this->GetInput2(VyEnum);       _assert_(vy_input);
 
 	/*1. Recover stresses at the base*/
@@ -1832,7 +1921,214 @@
 	*pxyz_front=xyz_front;
 }/*}}}*/
+Input2*    Tria::GetInput2(int inputenum){/*{{{*/
+
+	/*Get Input from dataset*/
+	if(this->iscollapsed){
+		PentaInput2* input = this->inputs2->GetPentaInput(inputenum);
+		if(!input) return input;
+
+		/*Intermediaries*/
+		int numindices;
+		int indices[7];
+
+		/*Check interpolation*/
+		int interpolation = input->GetInterpolation();
+		switch(interpolation){
+			case P0Enum:
+				numindices = 1;
+				indices[0] = this->lid;
+				input->Serve(numindices,&indices[0]);
+				break;
+			case P1Enum:
+				numindices = 3;
+				for(int i=0;i<3;i++) indices[i] = vertices[i]->lid;
+				input->Serve(numindices,&indices[0]);
+				break;
+			case P1DGEnum:
+			case P1bubbleEnum:
+				input->ServeCollapsed(this->lid,this->iscollapsed);
+				break;
+			default: _error_("interpolation "<<EnumToStringx(interpolation)<<" not supported");
+		}
+
+		/*Flag as collapsed for later use*/
+		input->SetServeCollapsed(true);
+
+		return input;
+	}
+	else{
+		TriaInput2* input = this->inputs2->GetTriaInput(inputenum);
+		if(!input) return input;
+
+		/*Intermediaries*/
+		int numindices;
+		int indices[7];
+
+		/*Check interpolation*/
+		int interpolation = input->GetInterpolation();
+		switch(interpolation){
+			case P0Enum:
+				numindices = 1;
+				indices[0] = this->lid;
+				input->Serve(numindices,&indices[0]);
+				break;
+			case P1Enum:
+				numindices = 3;
+				for(int i=0;i<3;i++) indices[i] = vertices[i]->lid;
+				input->Serve(numindices,&indices[0]);
+				break;
+			case P1DGEnum:
+				numindices = 3;
+				input->Serve(this->lid,numindices);
+				break;
+			default:
+				input->Serve(this->lid,this->GetNumberOfNodes(interpolation));
+		}
+
+		return input;
+	}
+}/*}}}*/
+Input2*    Tria::GetInput2(int inputenum,IssmDouble time){/*{{{*/
+
+	/*Get Input from dataset*/
+	if(this->iscollapsed){
+		PentaInput2* input = this->inputs2->GetPentaInput(inputenum,time);
+		if(!input) return input;
+
+		/*Intermediaries*/
+		int numindices;
+		int indices[3];
+
+		/*Check interpolation*/
+		int interpolation = input->GetInterpolation();
+		switch(interpolation){
+			case P0Enum:
+				numindices = 1;
+				indices[0] = this->lid;
+				input->Serve(numindices,&indices[0]);
+				break;
+			case P1Enum:
+				numindices = 3;
+				for(int i=0;i<3;i++) indices[i] = vertices[i]->lid;
+				input->Serve(numindices,&indices[0]);
+				break;
+			case P1DGEnum:
+			case P1bubbleEnum:
+				input->ServeCollapsed(this->lid,this->iscollapsed);
+				break;
+			default: _error_("interpolation "<<EnumToStringx(interpolation)<<" not supported");
+		}
+
+		/*Flag as collapsed for later use*/
+		input->SetServeCollapsed(true);
+
+		return input;
+	}
+	else{
+		TriaInput2* input = this->inputs2->GetTriaInput(inputenum,time);
+		if(!input) return input;
+
+		/*Intermediaries*/
+		int numindices;
+		int indices[7];
+
+		/*Check interpolation*/
+		int interpolation = input->GetInterpolation();
+		switch(interpolation){
+			case P0Enum:
+				numindices = 1;
+				indices[0] = this->lid;
+				input->Serve(numindices,&indices[0]);
+				break;
+			case P1Enum:
+				numindices = 3;
+				for(int i=0;i<3;i++) indices[i] = vertices[i]->lid;
+				input->Serve(numindices,&indices[0]);
+				break;
+			case P1DGEnum:
+				numindices = 3;
+				input->Serve(this->lid,numindices);
+				break;
+			default: _error_("interpolation "<<EnumToStringx(interpolation)<<" not supported");
+		}
+
+		return input;
+	}
+}/*}}}*/
+DatasetInput2* Tria::GetDatasetInput2(int inputenum){/*{{{*/
+
+	DatasetInput2* datasetinput = this->inputs2->GetDatasetInput2(inputenum);
+	if(!datasetinput) return NULL;
+
+	for(int i=0;i<datasetinput->GetNumIds();i++){
+
+		/*Get Input from dataset*/
+		if(this->iscollapsed){
+
+			PentaInput2* input = datasetinput->GetPentaInputByOffset(i); _assert_(input);
+
+			/*Intermediaries*/
+			int numindices;
+			int indices[3];
+
+			/*Check interpolation*/
+			int interpolation = input->GetInterpolation();
+			switch(interpolation){
+				case P0Enum:
+					numindices = 1;
+					indices[0] = this->lid;
+					input->Serve(numindices,&indices[0]);
+					break;
+				case P1Enum:
+					numindices = 3;
+					for(int i=0;i<3;i++) indices[i] = vertices[i]->lid;
+					input->Serve(numindices,&indices[0]);
+					break;
+				case P1DGEnum:
+				case P1bubbleEnum:
+					input->ServeCollapsed(this->lid,this->iscollapsed);
+					break;
+				default: _error_("interpolation "<<EnumToStringx(interpolation)<<" not supported");
+			}
+
+			/*Flag as collapsed for later use*/
+			input->SetServeCollapsed(true);
+		}
+		else{
+
+			TriaInput2* input = datasetinput->GetTriaInputByOffset(i); _assert_(input);
+
+			/*Intermediaries*/
+			int numindices;
+			int indices[7];
+
+			/*Check interpolation*/
+			int interpolation = input->GetInterpolation();
+			switch(interpolation){
+				case P0Enum:
+					numindices = 1;
+					indices[0] = this->lid;
+					input->Serve(numindices,&indices[0]);
+					break;
+				case P1Enum:
+					numindices = 3;
+					for(int i=0;i<3;i++) indices[i] = vertices[i]->lid;
+					input->Serve(numindices,&indices[0]);
+					break;
+				case P1DGEnum:
+					numindices = 3;
+					input->Serve(this->lid,numindices);
+					break;
+				default: _error_("interpolation "<<EnumToStringx(interpolation)<<" not supported");
+			}
+
+		}
+	}
+
+	return datasetinput;
+}/*}}}*/
 void       Tria::GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){/*{{{*/
 
-	Input* input=inputs->GetInput(enumtype);
+	Input2* input=this->GetInput2(enumtype);
 	if(!input) _error_("No input of type " << EnumToStringx(enumtype) << " found in tria");
 
@@ -1848,5 +2144,5 @@
 void       Tria::GetInputValue(IssmDouble* pvalue,Vertex* vertex,int enumtype){/*{{{*/
 
-	Input* input=inputs->GetInput(enumtype);
+	Input2* input=this->GetInput2(enumtype);
 	if(!input) _error_("No input of type " << EnumToStringx(enumtype) << " found in tria");
 
@@ -2052,70 +2348,69 @@
 void       Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data){/*{{{*/
 
-	int vertexidlist[NUMVERTICES];
-	Input *input=NULL;
-
 	/*Get out if this is not an element input*/
 	if(!IsInputEnum(control_enum)) _error_("Enum "<<EnumToStringx(control_enum)<<" is not in IsInput");
 
 	/*Prepare index list*/
-	GradientIndexing(&vertexidlist[0],control_index);
+	int idlist[NUMVERTICES];
+	GradientIndexing(&idlist[0],control_index);
 
 	/*Get input (either in element or material)*/
-	input=(Input*)this->inputs->GetInput(control_enum);   _assert_(input);
-
-	/*Check that it is a ControlInput*/
-	if (input->ObjectEnum()!=ControlInputEnum){
-		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
-	}
-
-	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexidlist[0],data);
+	ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,data);   _assert_(input);
+
+	/*Intermediaries*/
+	int numindices;
+	int indices[NUMVERTICES];
+
+	/*Check interpolation*/
+	int interpolation = input->GetInterpolation();
+	switch(interpolation){
+		case P1Enum:
+			numindices = NUMVERTICES;
+			for(int i=0;i<NUMVERTICES;i++) indices[i] = vertices[i]->lid;
+			input->Serve(numindices,&indices[0]);
+			break;
+		default: _error_("interpolation "<<EnumToStringx(interpolation)<<" not supported");
+	}
+
+	/*Flag as collapsed for later use*/
+	if(this->iscollapsed){
+		xDynamicCast<PentaInput2*>(input)->SetServeCollapsed(true);
+	}
+
+	/* Start looping on the number of vertices: */
+	IssmDouble values[NUMVERTICES];
+	Gauss*gauss=this->NewGauss();
+	for(int iv=0;iv<NUMVERTICES;iv++){
+		gauss->GaussVertex(iv);
+		input->GetInputValue(&values[iv],gauss);
+	}
+	delete gauss;
+
+	vector->SetValues(NUMVERTICES,idlist,&values[0],INS_VAL);
 }
 /*}}}*/
 void       Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data,int offset){/*{{{*/
 
-	int* idlist = NULL;
-	IssmDouble* values = NULL;
-	int* M = NULL;
-
-	/*Get out if this is not an element input*/
-	if(!IsInputEnum(control_enum)) _error_("Enum "<<EnumToStringx(control_enum)<<" is not in IsInput");
-	Input* input=(Input*)this->inputs->GetInput(control_enum);   _assert_(input);
-
-	parameters->FindParam(&M,NULL,ControlInputSizeMEnum);
-
-	/*Cast to Controlinput*/
-	if(input->ObjectEnum()!=ControlInputEnum) _error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
-	ControlInput* controlinput = xDynamicCast<ControlInput*>(input);
-
-	if(strcmp(data,"value")==0){
-		input  = controlinput->values;
-	}
-	else if (strcmp(data,"lowerbound")==0){
-		input = controlinput->minvalues;
-	}
-	else if (strcmp(data,"upperbound")==0){
-		input = controlinput->maxvalues;
-	}
-	else if (strcmp(data,"gradient")==0){
-		input = controlinput->gradient;
-	}
-	else{
-		_error_("Data " << data << " not supported yet");
-	}
+	/*Get input*/
+	ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,data);   _assert_(input);
+
+	/*Lid list once for all*/
+	int lidlist[NUMVERTICES];
+	for(int i=0;i<NUMVERTICES;i++) lidlist[i] = vertices[i]->lid;
+
 	/*Check what input we are dealing with*/
-
 	switch(input->ObjectEnum()){
-		case TriaInputEnum:
+		case TriaInput2Enum:
 			  {
-				TriaInput* triainput = xDynamicCast<TriaInput*>(input);
-				if(triainput->interpolation_type!=P1Enum) _error_("not supported yet");
+				IssmDouble values[NUMVERTICES];
+				int        idlist[NUMVERTICES];
+
+				TriaInput2* triainput = xDynamicCast<TriaInput2*>(input);
+				if(triainput->GetInputInterpolationType()!=P1Enum) _error_("not supported yet");
+				input->Serve(NUMVERTICES,&lidlist[0]);
 
 				/*Create list of indices and values for global vector*/
-				idlist = xNew<int>(NUMVERTICES);
-				values = xNew<IssmDouble>(NUMVERTICES);
 				GradientIndexing(&idlist[0],control_index);
-				for(int i=0;i<NUMVERTICES;i++){
-					values[i] = triainput->values[i];
-				}
+				for(int i=0;i<NUMVERTICES;i++) values[i] = triainput->element_values[i];
 				vector->SetValues(NUMVERTICES,idlist,values,INS_VAL);
 				break;
@@ -2124,13 +2419,15 @@
 		case TransientInputEnum:
 				{
-					TransientInput* transientinput = xDynamicCast<TransientInput*>(input);
+					TransientInput2* transientinput = xDynamicCast<TransientInput2*>(input);
 					int N = transientinput->numtimesteps;
-					idlist = xNew<int>(NUMVERTICES*N);
-					values = xNew<IssmDouble>(NUMVERTICES*N);
+					int* M=NULL;
+					parameters->FindParam(&M,NULL,ControlInputSizeMEnum);
+					int* idlist = xNew<int>(NUMVERTICES*N);
+					IssmDouble* values = xNew<IssmDouble>(NUMVERTICES*N);
 					for(int t=0;t<transientinput->numtimesteps;t++) {
 						IssmDouble time = transientinput->GetTimeByOffset(t);
-						input = transientinput->GetTimeInput(time);
-						TriaInput* timeinput = xDynamicCast<TriaInput*>(input);
+						TriaInput* timeinput = xDynamicCast<TriaInput*>(transientinput->GetTimeInput(time));
 						if(timeinput->interpolation_type!=P1Enum) _error_("not supported yet");
+						input->Serve(NUMVERTICES,&lidlist[0]);
 						/*Create list of indices and values for global vector*/
 						for(int i=0;i<NUMVERTICES;i++){
@@ -2140,10 +2437,11 @@
 					}
 					vector->SetValues(NUMVERTICES*transientinput->numtimesteps,idlist,values,INS_VAL);
+					xDelete<int>(M);
+					xDelete<int>(idlist);
+					xDelete<IssmDouble>(values);
 					break;
 				}
-		default: _error_("input "<<input->ObjectEnum()<<" not supported yet");
-	}
-	xDelete<int>(idlist);
-	xDelete<IssmDouble>(values);
+		default: _error_("input "<<EnumToStringx(input->ObjectEnum())<<" not supported yet");
+	}
 }
 /*}}}*/
@@ -2199,5 +2497,5 @@
 	groundedarea=phi*this->GetArea();
 	if(scaled==true){
-		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		Input2* scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input);
 		scalefactor_input->GetInputAverage(&scalefactor);
 		groundedarea=groundedarea*scalefactor;
@@ -2279,14 +2577,14 @@
 	IssmDouble vx,vy,thickness,Jdet;
 	IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* vx_input=NULL;
-	Input* vy_input=NULL;
+	Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* vx_input=NULL;
+	Input2* vy_input=NULL;
 	if(domaintype==Domain2DhorizontalEnum){
-		vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);
-		vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);
+		vx_input=this->GetInput2(VxEnum); _assert_(vx_input);
+		vy_input=this->GetInput2(VyEnum); _assert_(vy_input);
 	}
 	else{
-		vx_input=inputs->GetInput(VxAverageEnum); _assert_(vx_input);
-		vy_input=inputs->GetInput(VyAverageEnum); _assert_(vy_input);
+		vx_input=this->GetInput2(VxAverageEnum); _assert_(vx_input);
+		vy_input=this->GetInput2(VyAverageEnum); _assert_(vy_input);
 	}
 
@@ -2408,14 +2706,14 @@
 	IssmDouble vx,vy,thickness,Jdet;
 	IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* vx_input=NULL;
-	Input* vy_input=NULL;
+	Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* vx_input=NULL;
+	Input2* vy_input=NULL;
 	if(domaintype==Domain2DhorizontalEnum){
-		vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);
-		vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);
+		vx_input=this->GetInput2(VxEnum); _assert_(vx_input);
+		vy_input=this->GetInput2(VyEnum); _assert_(vy_input);
 	}
 	else{
-		vx_input=inputs->GetInput(VxAverageEnum); _assert_(vx_input);
-		vy_input=inputs->GetInput(VyAverageEnum); _assert_(vy_input);
+		vx_input=this->GetInput2(VxAverageEnum); _assert_(vx_input);
+		vy_input=this->GetInput2(VyAverageEnum); _assert_(vy_input);
 	}
 
@@ -2535,14 +2833,14 @@
 	IssmDouble vx,vy,thickness,Jdet;
 	IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* vx_input=NULL;
-	Input* vy_input=NULL;
+	Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* vx_input=NULL;
+	Input2* vy_input=NULL;
 	if(domaintype==Domain2DhorizontalEnum){
-		vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);
-		vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);
+		vx_input=this->GetInput2(VxEnum); _assert_(vx_input);
+		vy_input=this->GetInput2(VyEnum); _assert_(vy_input);
 	}
 	else{
-		vx_input=inputs->GetInput(VxAverageEnum); _assert_(vx_input);
-		vy_input=inputs->GetInput(VyAverageEnum); _assert_(vy_input);
+		vx_input=this->GetInput2(VxAverageEnum); _assert_(vx_input);
+		vy_input=this->GetInput2(VyAverageEnum); _assert_(vy_input);
 	}
 
@@ -2642,5 +2940,5 @@
 		area_base=this->GetArea();
 		if(scaled==true){
-			Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+			Input2* scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input);
 			scalefactor_input->GetInputAverage(&scalefactor);
 			area_base=area_base*scalefactor;
@@ -2648,6 +2946,6 @@
 
 		/*Now get the average height*/
-		Input* surface_input = inputs->GetInput(SurfaceEnum); _assert_(surface_input);
-		Input* base_input     = inputs->GetInput(BaseEnum);     _assert_(base_input);
+		Input2* surface_input = this->GetInput2(SurfaceEnum); _assert_(surface_input);
+		Input2* base_input    = this->GetInput2(BaseEnum);    _assert_(base_input);
 		surface_input->GetInputAverage(&surface);
 		base_input->GetInputAverage(&base);
@@ -2686,5 +2984,5 @@
 	base = 1./2. * fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));
 	if(scaled==true){
-		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		Input2* scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input);
 		scalefactor_input->GetInputAverage(&scalefactor);
 		base=base*scalefactor;
@@ -2692,7 +2990,7 @@
 
 	/*Now get the average height and bathymetry*/
-	Input* surface_input    = inputs->GetInput(SurfaceEnum);    _assert_(surface_input);
-	Input* base_input        = inputs->GetInput(BaseEnum);        _assert_(base_input);
-	Input* bed_input = inputs->GetInput(BedEnum); _assert_(bed_input);
+	Input2* surface_input = this->GetInput2(SurfaceEnum); _assert_(surface_input);
+	Input2* base_input    = this->GetInput2(BaseEnum);    _assert_(base_input);
+	Input2* bed_input     = this->GetInput2(BedEnum);     _assert_(bed_input);
 	if(!bed_input) _error_("Could not find bed");
 	surface_input->GetInputAverage(&surface);
@@ -2707,11 +3005,11 @@
 
 	/*New input*/
-	Input* oldinput=NULL;
-	Input* newinput=NULL;
+	Input2* oldinput=NULL;
+	Input2* newinput=NULL;
 
 	/*copy input of enum_type*/
-	oldinput=(Input*)this->inputs->GetInput(enum_type);
+	oldinput=this->GetInput2(enum_type);
 	if(!oldinput)_error_("could not find old input with enum: " << EnumToStringx(enum_type));
-	newinput=(Input*)oldinput->copy();
+	newinput=oldinput->copy();
 
 	/*Assign new name (average)*/
@@ -2719,4 +3017,5 @@
 
 	/*Add new input to current element*/
+	_error_("not implemented");
 	this->inputs->AddInput((Input*)newinput);
 }
@@ -2749,127 +3048,122 @@
 	}
 
-	/*Need to know the type of approximation for this element*/
-	if(iomodel->Data("md.flowequation.element_equation")){
-		this->inputs->AddInput(new IntInput(ApproximationEnum,IoCodeToEnumElementEquation(reCast<int>(iomodel->Data("md.flowequation.element_equation")[index]))));
-	}
-
-	/*Control Inputs*/
-	if (control_analysis && !ad_analysis){
-		if(!ad_analysis)iomodel->FindConstant(&controls,NULL,"md.inversion.control_parameters");
-		if(ad_analysis)iomodel->FindConstant(&controls,NULL,"md.autodiff.independent_object_names");
-
-		for(i=0;i<num_control_type;i++){
-			_assert_(controls[i]);
-			int control = StringToEnumx(controls[i]);
-			switch(control){
-				case BalancethicknessThickeningRateEnum:
-					if (iomodel->Data("md.balancethickness.thickening_rate")){
-						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.balancethickness.thickening_rate")[tria_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case VxEnum:
-					if (iomodel->Data("md.initialization.vx")){
-						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.initialization.vx")[tria_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(VxEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case VyEnum:
-					if (iomodel->Data("md.initialization.vy")){
-						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.initialization.vy")[tria_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
-						this->inputs->AddInput(new ControlInput(VyEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case ThicknessEnum:
-					if(iomodel->Data("md.geometry.thickness")){
-						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.geometry.thickness")[tria_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(ThicknessEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case BalancethicknessSpcthicknessEnum:
-					if(iomodel->Data("md.balancethickness.spcthickness")){
-						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.balancethickness.spcthickness")[tria_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(BalancethicknessSpcthicknessEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case BalancethicknessOmegaEnum:
-					if(iomodel->Data("md.balancethickness.omega")){
-						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.balancethickness.omega")[tria_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(BalancethicknessOmegaEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case FrictionCoefficientEnum:
-					if (iomodel->Data("md.friction.coefficient")){
-						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.friction.coefficient")[tria_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case MaterialsRheologyBbarEnum:
-					if(iomodel->Data("md.materials.rheology_B")){
-						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.materials.rheology_B")[tria_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(MaterialsRheologyBbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				case DamageDbarEnum:
-					if(iomodel->Data("md.damage.D")){
-						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.damage.D")[tria_vertex_ids[j]-1];
-						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
-						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
-						this->inputs->AddInput(new ControlInput(DamageDbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
-					}
-					break;
-				default:
-					_error_("Control " << EnumToStringx(control) << " not implemented yet");
-			}
-		}
-		for(i=0;i<num_control_type;i++) xDelete<char>(controls[i]);
-		xDelete<char*>(controls);
-	}
-
-	/*DatasetInputs*/
-	if (control_analysis && iomodel->Data("md.inversion.cost_functions_coefficients")){
-
-		/*Generate cost functions associated with the iomodel*/
-		char**   cost_functions       = NULL;
-		int*     cost_functions_enums = NULL;
-		int      num_cost_functions;
-
-		iomodel->FindConstant(&num_cost_functions,"md.inversion.num_cost_functions");
-		iomodel->FindConstant(&cost_functions,&num_cost_functions,"md.inversion.cost_functions");
-		if(num_cost_functions<1) _error_("No cost functions found");
-		cost_functions_enums=xNew<int>(num_cost_functions);
-		for(j=0;j<num_cost_functions;j++){ cost_functions_enums[j]=StringToEnumx(cost_functions[j]); }
-
-		/*Create inputs and add to DataSetInput*/
-		DatasetInput* datasetinput=new DatasetInput(InversionCostFunctionsCoefficientsEnum);
-		for(i=0;i<num_responses;i++){
-			for(j=0;j<3;j++)nodeinputs[j]=iomodel->Data("md.inversion.cost_functions_coefficients")[(tria_vertex_ids[j]-1)*num_responses+i];
-			datasetinput->AddInput(new TriaInput(InversionCostFunctionsCoefficientsEnum,nodeinputs,P1Enum),cost_functions_enums[i]);
-		}
-
-		/*Add datasetinput to element inputs*/
-		this->inputs->AddInput(datasetinput);
-
-		/*Clean up cost functions*/
-		xDelete<int>(cost_functions_enums);
-		for(int j=0;j<num_cost_functions;j++) xDelete<char>(cost_functions[j]);
-		xDelete<char*>(cost_functions);
-	}
+//	/*Control Inputs*/
+//	if (control_analysis && !ad_analysis){
+//		if(!ad_analysis)iomodel->FindConstant(&controls,NULL,"md.inversion.control_parameters");
+//		if(ad_analysis)iomodel->FindConstant(&controls,NULL,"md.autodiff.independent_object_names");
+//
+//		for(i=0;i<num_control_type;i++){
+//			_assert_(controls[i]);
+//			int control = StringToEnumx(controls[i]);
+//			switch(control){
+//				case BalancethicknessThickeningRateEnum:
+//					if (iomodel->Data("md.balancethickness.thickening_rate")){
+//						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.balancethickness.thickening_rate")[tria_vertex_ids[j]-1];
+//						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
+//						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
+//						this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
+//					}
+//					break;
+//				case VxEnum:
+//					if (iomodel->Data("md.initialization.vx")){
+//						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.initialization.vx")[tria_vertex_ids[j]-1];
+//						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
+//						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
+//						this->inputs->AddInput(new ControlInput(VxEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
+//					}
+//					break;
+//				case VyEnum:
+//					if (iomodel->Data("md.initialization.vy")){
+//						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.initialization.vy")[tria_vertex_ids[j]-1];
+//						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
+//						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
+//						this->inputs->AddInput(new ControlInput(VyEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
+//					}
+//					break;
+//				case ThicknessEnum:
+//					if(iomodel->Data("md.geometry.thickness")){
+//						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.geometry.thickness")[tria_vertex_ids[j]-1];
+//						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+//						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+//						this->inputs->AddInput(new ControlInput(ThicknessEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
+//					}
+//					break;
+//				case BalancethicknessSpcthicknessEnum:
+//					if(iomodel->Data("md.balancethickness.spcthickness")){
+//						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.balancethickness.spcthickness")[tria_vertex_ids[j]-1];
+//						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+//						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+//						this->inputs->AddInput(new ControlInput(BalancethicknessSpcthicknessEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
+//					}
+//					break;
+//				case BalancethicknessOmegaEnum:
+//					if(iomodel->Data("md.balancethickness.omega")){
+//						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.balancethickness.omega")[tria_vertex_ids[j]-1];
+//						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+//						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+//						this->inputs->AddInput(new ControlInput(BalancethicknessOmegaEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
+//					}
+//					break;
+//				case FrictionCoefficientEnum:
+//					if (iomodel->Data("md.friction.coefficient")){
+//						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.friction.coefficient")[tria_vertex_ids[j]-1];
+//						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+//						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+//						this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
+//					}
+//					break;
+//				case MaterialsRheologyBbarEnum:
+//					if(iomodel->Data("md.materials.rheology_B")){
+//						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.materials.rheology_B")[tria_vertex_ids[j]-1];
+//						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+//						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+//						this->inputs->AddInput(new ControlInput(MaterialsRheologyBbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
+//					}
+//					break;
+//				case DamageDbarEnum:
+//					if(iomodel->Data("md.damage.D")){
+//						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.damage.D")[tria_vertex_ids[j]-1];
+//						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+//						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+//						this->inputs->AddInput(new ControlInput(DamageDbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1));
+//					}
+//					break;
+//				default:
+//					_error_("Control " << EnumToStringx(control) << " not implemented yet");
+//			}
+//		}
+//		for(i=0;i<num_control_type;i++) xDelete<char>(controls[i]);
+//		xDelete<char*>(controls);
+//	}
+//
+//	/*DatasetInputs*/
+//	if (control_analysis && iomodel->Data("md.inversion.cost_functions_coefficients")){
+//
+//		/*Generate cost functions associated with the iomodel*/
+//		char**   cost_functions       = NULL;
+//		int*     cost_functions_enums = NULL;
+//		int      num_cost_functions;
+//
+//		iomodel->FindConstant(&num_cost_functions,"md.inversion.num_cost_functions");
+//		iomodel->FindConstant(&cost_functions,&num_cost_functions,"md.inversion.cost_functions");
+//		if(num_cost_functions<1) _error_("No cost functions found");
+//		cost_functions_enums=xNew<int>(num_cost_functions);
+//		for(j=0;j<num_cost_functions;j++){ cost_functions_enums[j]=StringToEnumx(cost_functions[j]); }
+//
+//		/*Create inputs and add to DataSetInput*/
+//		DatasetInput* datasetinput=new DatasetInput(InversionCostFunctionsCoefficientsEnum);
+//		for(i=0;i<num_responses;i++){
+//			for(j=0;j<3;j++)nodeinputs[j]=iomodel->Data("md.inversion.cost_functions_coefficients")[(tria_vertex_ids[j]-1)*num_responses+i];
+//			datasetinput->AddInput(new TriaInput(InversionCostFunctionsCoefficientsEnum,nodeinputs,P1Enum),cost_functions_enums[i]);
+//		}
+//
+//		/*Add datasetinput to element inputs*/
+//		this->inputs->AddInput(datasetinput);
+//
+//		/*Clean up cost functions*/
+//		xDelete<int>(cost_functions_enums);
+//		for(int j=0;j<num_cost_functions;j++) xDelete<char>(cost_functions[j]);
+//		xDelete<char*>(cost_functions);
+//	}
 }
 /*}}}*/
@@ -2894,5 +3188,5 @@
 
 	/*Add input to the element: */
-	this->inputs->AddInput(new TriaInput(enum_type,values,this->element_type));
+	this->AddInput2(enum_type,values,this->element_type);
 
 	/*Free ressources:*/
@@ -2908,6 +3202,9 @@
 	int         numnodes;
 	IssmDouble  value;
+	int         lidlist[NUMVERTICES];
 	int        *doflist = NULL;
 	IssmDouble *values  = NULL;
+
+	GetVerticesLidList(&lidlist[0]);
 
 	switch(type){
@@ -2920,5 +3217,5 @@
 			}
 			/*update input*/
-			this->inputs->AddInput(new TriaInput(name,values,P1Enum));
+			inputs2->SetTriaInput(name,P1Enum,NUMVERTICES,lidlist,values);
 			break;
 
@@ -2931,5 +3228,5 @@
 			}
 			/*update input*/
-			this->inputs->AddInput(new TriaInput(name,values,P1Enum));
+			inputs2->SetTriaInput(name,P1Enum,NUMVERTICES,lidlist,values);
 			break;
 
@@ -2942,5 +3239,5 @@
 			}
 			/*update input*/
-			this->inputs->AddInput(new TriaInput(name,values,P1Enum));
+			inputs2->SetTriaInput(name,P1Enum,NUMVERTICES,lidlist,values);
 			break;
 
@@ -2956,5 +3253,6 @@
 				if(xIsInf<IssmDouble>(values[i])) _error_("Inf found in vector");
 			}
-			this->inputs->AddInput(new TriaInput(name,values,this->element_type));
+			//this->inputs->AddInput(new TriaInput(name,values,this->element_type));
+			_error_("not implemented");
 			break;
 
@@ -2969,5 +3267,6 @@
 				if(xIsInf<IssmDouble>(values[i])) _error_("Inf found in vector");
 			}
-			this->inputs->AddInput(new TriaInput(name,values,this->element_type));
+			//this->inputs->AddInput(new TriaInput(name,values,this->element_type));
+			_error_("not implemented");
 			break;
 
@@ -2977,5 +3276,7 @@
 			if(xIsInf<IssmDouble>(value)) _error_("Inf found in vector");
 			/*update input*/
-			this->inputs->AddInput(new DoubleInput(name,value));
+			//this->inputs->AddInput(new DoubleInput(name,value));
+			//inputs2->SetTriaInput(name,P1Enum,NUMVERTICES,lidlist,values);
+			_error_("not implemented");
 			break;
 
@@ -3043,30 +3344,4 @@
 }
 /*}}}*/
-bool       Tria::IsOnBase(){/*{{{*/
-
-	int domaintype;
-	this->parameters->FindParam(&domaintype,DomainTypeEnum);
-	switch(domaintype){
-		case Domain2DverticalEnum:
-			return HasEdgeOnBase();
-		case Domain2DhorizontalEnum:
-			return true;
-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
-	}
-}
-/*}}}*/
-bool       Tria::IsOnSurface(){/*{{{*/
-
-	int domaintype;
-	this->parameters->FindParam(&domaintype,DomainTypeEnum);
-	switch(domaintype){
-		case Domain2DverticalEnum:
-			return HasEdgeOnSurface();
-		case Domain2DhorizontalEnum:
-			return true;
-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
-	}
-}
-/*}}}*/
 bool       Tria::IsZeroLevelset(int levelset_enum){/*{{{*/
 
@@ -3120,5 +3395,5 @@
 	/*intermediary: */
 	IssmDouble* values=NULL;
-	Input*      thickness_input=NULL;
+	Input2*     thickness_input=NULL;
 	IssmDouble  thickness;
 	IssmDouble  weight;
@@ -3138,5 +3413,5 @@
 
 	/*Retrieve inputs required:*/
-	thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
+	thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
 
 	/*Retrieve material parameters: */
@@ -3200,14 +3475,14 @@
 	/*Get velocity and thickness*/
 	this->parameters->FindParam(&domaintype,DomainTypeEnum);
-	Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* vx_input=NULL;
-	Input* vy_input=NULL;
+	Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* vx_input=NULL;
+	Input2* vy_input=NULL;
 	if(domaintype==Domain2DhorizontalEnum){
-		vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);
-		vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);
+		vx_input=this->GetInput2(VxEnum); _assert_(vx_input);
+		vy_input=this->GetInput2(VyEnum); _assert_(vy_input);
 	}
 	else{
-		vx_input=inputs->GetInput(VxAverageEnum); _assert_(vx_input);
-		vy_input=inputs->GetInput(VyAverageEnum); _assert_(vy_input);
+		vx_input=this->GetInput2(VxAverageEnum); _assert_(vx_input);
+		vy_input=this->GetInput2(VyAverageEnum); _assert_(vy_input);
 	}
 
@@ -3248,7 +3523,7 @@
 	/*Retrieve all inputs we will be needing: */
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
-	Input* model_input=inputs->GetInput(modelenum);   _assert_(model_input);
-	Input* observation_input=inputs->GetInput(observationenum);_assert_(observation_input);
-	Input* weights_input     =inputs->GetInput(weightsenum);     _assert_(weights_input);
+	Input2* model_input=this->GetInput2(modelenum);   _assert_(model_input);
+	Input2* observation_input=this->GetInput2(observationenum);_assert_(observation_input);
+	Input2* weights_input     =this->GetInput2(weightsenum);     _assert_(weights_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -3289,5 +3564,5 @@
 	/*Retrieve all inputs we will be needing: */
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
-	Input* weights_input     =inputs->GetInput(weightsenum);     _assert_(weights_input);
+	Input2* weights_input     =this->GetInput2(weightsenum);     _assert_(weights_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -3425,9 +3700,8 @@
 	int         found = 0;
 	IssmDouble  value;
-	Input      *data  = NULL;
 	GaussTria  *gauss = NULL;
 
 	/*First, serarch the input: */
-	data=inputs->GetInput(natureofdataenum);
+	Input2* data=this->GetInput2(natureofdataenum); 
 
 	/*figure out if we have the vertex id: */
@@ -3594,10 +3868,10 @@
 
 	/*For FS only: we want the CS to be tangential to the bedrock*/
-	inputs->GetInputValue(&approximation,ApproximationEnum);
+	this->GetInput2Value(&approximation,ApproximationEnum);
 	if(!HasNodeOnBase() ||  approximation!=FSApproximationEnum) return;
 
 	/*Get inputs*/
-	Input* slope_input=inputs->GetInput(BedSlopeXEnum);                             _assert_(slope_input);
-	Input* groundedicelevelset_input=inputs->GetInput(MaskGroundediceLevelsetEnum); _assert_(groundedicelevelset_input);
+	Input2* slope_input=this->GetInput2(BedSlopeXEnum);                             _assert_(slope_input);
+	Input2* groundedicelevelset_input=this->GetInput2(MaskGroundediceLevelsetEnum); _assert_(groundedicelevelset_input);
 	vertexonbase = xNew<IssmDouble>(numnodes);
 	this->GetInputListOnNodesVelocity(&vertexonbase[0],MeshVertexonbaseEnum);
@@ -3665,7 +3939,7 @@
 
 	/*Get inputs*/
-	Input* bed_input = this->GetInput(BedEnum);                     _assert_(bed_input);
-	Input* qsg_input = this->GetInput(FrontalForcingsSubglacialDischargeEnum);		 _assert_(qsg_input);
-	Input* TF_input  = this->GetInput(FrontalForcingsThermalForcingEnum);          _assert_(TF_input);
+	Input2* bed_input = this->GetInput2(BedEnum);                     _assert_(bed_input);
+	Input2* qsg_input = this->GetInput2(FrontalForcingsSubglacialDischargeEnum);		 _assert_(qsg_input);
+	Input2* TF_input  = this->GetInput2(FrontalForcingsThermalForcingEnum);          _assert_(TF_input);
 	GetInputListOnVertices(&basinid[0],FrontalForcingsBasinIdEnum);
 
@@ -3710,4 +3984,5 @@
 
 	IssmDouble  values[NUMVERTICES];
+	int         lidlist[NUMVERTICES];
 	int         idlist[NUMVERTICES],control_init;
 
@@ -3732,11 +4007,6 @@
 	if(!IsInputEnum(control_enum)) return;
 
-	Input* input     = (Input*)this->inputs->GetInput(control_enum);   _assert_(input);
-	if(input->ObjectEnum()!=ControlInputEnum){
-		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
-	}
-
-	ControlInput* controlinput = xDynamicCast<ControlInput*>(input);
-	input = controlinput->values;
+	this->GetVerticesLidList(&lidlist[0]);
+	ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,"value");   _assert_(input);
 
 	/*Get values on vertices*/
@@ -3746,12 +4016,12 @@
 			values[i]=vector[idlist[i]];
 		}
-		if(input->ObjectEnum()==TriaInputEnum){
-			Input* new_input = new TriaInput(control_enum,values,P1Enum);
-			controlinput->SetInput(new_input);
-		}
-		else if(input->ObjectEnum()==TransientInputEnum){
-			Input* new_input = new TriaInput(control_enum,values,P1Enum);
-			controlinput->SetInput(new_input,n);
-			controlinput->Configure(parameters);
+		if(input->ObjectEnum()==TriaInput2Enum){
+			input->SetInput(P1Enum,NUMVERTICES,&lidlist[0],&values[0]);
+		}
+		else if(input->ObjectEnum()==TransientInput2Enum){
+			_error_("not implemented");
+			//Input* new_input = new TriaInput(control_enum,values,P1Enum);
+			//controlinput->SetInput(new_input,n);
+			//controlinput->Configure(parameters);
 		}
 		else _error_("Type not supported");
@@ -3762,5 +4032,6 @@
 
 	IssmDouble  values[NUMVERTICES];
-	int         vertexpidlist[NUMVERTICES],control_init;
+	int         idlist[NUMVERTICES];
+	int         lidlist[NUMVERTICES];
 
 	/*Get Domain type*/
@@ -3769,5 +4040,4 @@
 
 	/*Specific case for depth averaged quantities*/
-	control_init=control_enum;
 	if(domaintype==Domain2DverticalEnum){
 		if(control_enum==MaterialsRheologyBbarEnum){
@@ -3784,18 +4054,16 @@
 	if(!IsInputEnum(control_enum)) return;
 
-	/*hrepare index list*/
-	GradientIndexing(&vertexpidlist[0],control_index);
+	/*prepare index list*/
+	this->GetVerticesLidList(&lidlist[0]);
+	GradientIndexing(&idlist[0],control_index);
 
 	/*Get values on vertices*/
 	for(int i=0;i<NUMVERTICES;i++){
-		values[i]=vector[vertexpidlist[i]];
-	}
-	Input* new_input = new TriaInput(control_enum,values,P1Enum);
-	Input* input     = (Input*)this->inputs->GetInput(control_enum);   _assert_(input);
-	if(input->ObjectEnum()!=ControlInputEnum){
-		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
-	}
-
-	((ControlInput*)input)->SetInput(new_input);
+		values[i]=vector[idlist[i]];
+	}
+
+	/*Set Input*/
+	ElementInput2* input=this->inputs2->GetControlInput2Data(control_enum,"value");   _assert_(input);
+	input->SetInput(P1Enum,NUMVERTICES,&lidlist[0],&values[0]);
 }
 /*}}}*/
@@ -3813,4 +4081,24 @@
 		this->nodes=(Node**)this->hnodes[analysis_counter]->deliverp();
 	}
+
+}
+/*}}}*/
+void       Tria::SetElementInput(int enum_in,IssmDouble value){/*{{{*/
+
+	this->SetElementInput(this->inputs2,enum_in,value);
+
+}
+/*}}}*/
+void       Tria::SetElementInput(Inputs2* inputs2,int enum_in,IssmDouble value){/*{{{*/
+
+	_assert_(inputs2);
+	inputs2->SetTriaInput(enum_in,P0Enum,this->lid,value);
+
+}
+/*}}}*/
+void       Tria::SetElementInput(Inputs2* inputs2,int numindices,int* indices,IssmDouble* values,int enum_in){/*{{{*/
+
+	_assert_(inputs2);
+	inputs2->SetTriaInput(enum_in,P1Enum,numindices,indices,values);
 
 }
@@ -3844,8 +4132,13 @@
 	Seg* seg=new Seg();
 	seg->id=this->id;
-	seg->inputs=(Inputs*)this->inputs->SpawnSegInputs(index1,index2);
+	seg->inputs=NULL;//(Inputs*)this->inputs->SpawnSegInputs(index1,index2);
+	seg->inputs2=this->inputs2;
 	seg->parameters=this->parameters;
 	seg->element_type=P1Enum; //Only P1 CG for now (TO BE CHANGED)
 	this->SpawnSegHook(xDynamicCast<ElementHook*>(seg),index1,index2);
+
+	seg->iscollapsed = 1;
+	seg->collapsed_ids[0] = index1;
+	seg->collapsed_ids[1] = index2;
 
 	/*Spawn material*/
@@ -3893,6 +4186,6 @@
 
 	/*Retrieve all inputs we will need*/
-	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
-	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
+	Input2* vx_input=this->GetInput2(VxEnum);                                  _assert_(vx_input);
+	Input2* vy_input=this->GetInput2(VyEnum);                                  _assert_(vy_input);
 
 	/* Start looping on the number of vertices: */
@@ -3917,5 +4210,5 @@
 
 	/*Add input*/
-	this->inputs->AddInput(new TriaInput(StrainRateparallelEnum,&strainparallel[0],P1Enum));
+	this->AddInput2(StrainRateparallelEnum,&strainparallel[0],P1DGEnum);
 
 	/*Clean up and return*/
@@ -3939,6 +4232,6 @@
 
 	/*Retrieve all inputs we will need*/
-	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
-	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
+	Input2* vx_input=this->GetInput2(VxEnum);                                  _assert_(vx_input);
+	Input2* vy_input=this->GetInput2(VyEnum);                                  _assert_(vy_input);
 
 	/* Start looping on the number of vertices: */
@@ -3963,5 +4256,5 @@
 
 	/*Add input*/
-	this->inputs->AddInput(new TriaInput(StrainRateperpendicularEnum,&strainperpendicular[0],P1Enum));
+	this->AddInput2(StrainRateperpendicularEnum,&strainperpendicular[0],P1DGEnum);
 
 	/*Clean up and return*/
@@ -4004,10 +4297,5 @@
 
 	/*intermediary: */
-	int    i;
-	IssmDouble C,dt;
-	IssmDouble dx,dy;
-	IssmDouble maxx,minx;
-	IssmDouble maxy,miny;
-	IssmDouble maxabsvx,maxabsvy;
+	IssmDouble C;
 	IssmDouble xyz_list[NUMVERTICES][3];
 
@@ -4016,26 +4304,28 @@
 
 	/*Get for Vx and Vy, the max of abs value: */
-	maxabsvx = this->inputs->MaxAbs(VxEnum);
-	maxabsvy = this->inputs->MaxAbs(VyEnum);
+	Input2* vx_input = this->GetInput2(VxEnum); _assert_(vx_input);
+	Input2* vy_input = this->GetInput2(VyEnum); _assert_(vy_input);
+	IssmDouble maxabsvx = vx_input->GetInputMaxAbs();
+	IssmDouble maxabsvy = vy_input->GetInputMaxAbs();
 
 	/* Get node coordinates and dof list: */
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
 
-	minx=xyz_list[0][0];
-	maxx=xyz_list[0][0];
-	miny=xyz_list[0][1];
-	maxy=xyz_list[0][1];
-
-	for(i=1;i<NUMVERTICES;i++){
-		if (xyz_list[i][0]<minx)minx=xyz_list[i][0];
-		if (xyz_list[i][0]>maxx)maxx=xyz_list[i][0];
-		if (xyz_list[i][1]<miny)miny=xyz_list[i][1];
-		if (xyz_list[i][1]>maxy)maxy=xyz_list[i][1];
-	}
-	dx=maxx-minx;
-	dy=maxy-miny;
+	IssmDouble minx=xyz_list[0][0];
+	IssmDouble maxx=xyz_list[0][0];
+	IssmDouble miny=xyz_list[0][1];
+	IssmDouble maxy=xyz_list[0][1];
+
+	for(int i=1;i<NUMVERTICES;i++){
+		if(xyz_list[i][0]<minx) minx=xyz_list[i][0];
+		if(xyz_list[i][0]>maxx) maxx=xyz_list[i][0];
+		if(xyz_list[i][1]<miny) miny=xyz_list[i][1];
+		if(xyz_list[i][1]>maxy) maxy=xyz_list[i][1];
+	}
+	IssmDouble dx=maxx-minx;
+	IssmDouble dy=maxy-miny;
 
 	/*CFL criterion: */
-	dt=C/(maxabsvx/dx+maxabsvy/dy);
+	IssmDouble dt = C/(maxabsvx/dx+maxabsvy/dy);
 
 	return dt;
@@ -4143,14 +4433,14 @@
 	IssmDouble calvingratex,calvingratey,thickness,Jdet;
 	IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* calvingratex_input=NULL;
-	Input* calvingratey_input=NULL;
+	Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* calvingratex_input=NULL;
+	Input2* calvingratey_input=NULL;
 	if(domaintype==Domain2DhorizontalEnum){
-		calvingratex_input=inputs->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-		calvingratey_input=inputs->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
+		calvingratex_input=this->GetInput2(CalvingratexEnum); _assert_(calvingratex_input);
+		calvingratey_input=this->GetInput2(CalvingrateyEnum); _assert_(calvingratey_input);
 	}
 	else{
-		calvingratex_input=inputs->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
-		calvingratey_input=inputs->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
+		calvingratex_input=this->GetInput2(CalvingratexAverageEnum); _assert_(calvingratex_input);
+		calvingratey_input=this->GetInput2(CalvingrateyAverageEnum); _assert_(calvingratey_input);
 	}
 
@@ -4272,20 +4562,20 @@
 	IssmDouble calvingratex,calvingratey,vx,vy,vel,meltingrate,meltingratex,meltingratey,thickness,Jdet;
 	IssmDouble rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
-	Input* calvingratex_input=NULL;
-	Input* calvingratey_input=NULL;
-	Input* vx_input=NULL;
-	Input* vy_input=NULL;
-	Input* meltingrate_input=NULL;
+	Input2* thickness_input=this->GetInput2(ThicknessEnum); _assert_(thickness_input);
+	Input2* calvingratex_input=NULL;
+	Input2* calvingratey_input=NULL;
+	Input2* vx_input=NULL;
+	Input2* vy_input=NULL;
+	Input2* meltingrate_input=NULL;
 	if(domaintype==Domain2DhorizontalEnum){
-		calvingratex_input=inputs->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
-		calvingratey_input=inputs->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
-		vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);
-		vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);
-		meltingrate_input=inputs->GetInput(CalvingMeltingrateEnum); _assert_(meltingrate_input);
+		calvingratex_input=this->GetInput2(CalvingratexEnum); _assert_(calvingratex_input);
+		calvingratey_input=this->GetInput2(CalvingrateyEnum); _assert_(calvingratey_input);
+		vx_input=this->GetInput2(VxEnum); _assert_(vx_input);
+		vy_input=this->GetInput2(VyEnum); _assert_(vy_input);
+		meltingrate_input=this->GetInput2(CalvingMeltingrateEnum); _assert_(meltingrate_input);
 	}
 	else{
-		calvingratex_input=inputs->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
-		calvingratey_input=inputs->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
+		calvingratex_input=this->GetInput2(CalvingratexAverageEnum); _assert_(calvingratex_input);
+		calvingratey_input=this->GetInput2(CalvingrateyAverageEnum); _assert_(calvingratey_input);
 	}
 
@@ -4327,9 +4617,9 @@
 	/*Get material parameters :*/
 	rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* floatingmelt_input = this->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(floatingmelt_input);
-	Input* gllevelset_input = this->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
-	Input* scalefactor_input = NULL;
+	Input2* floatingmelt_input = this->GetInput2(BasalforcingsFloatingiceMeltingRateEnum); _assert_(floatingmelt_input); 
+	Input2* gllevelset_input   = this->GetInput2(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
+	Input2* scalefactor_input  = NULL;
 	if(scaled==true){
-		scalefactor_input = this->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input); 
 	}
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
@@ -4372,9 +4662,9 @@
 	/*Get material parameters :*/
 	rho_ice=FindParam(MaterialsRhoIceEnum);
-	Input* groundedmelt_input = this->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(groundedmelt_input);
-	Input* gllevelset_input = this->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
-	Input* scalefactor_input = NULL;
+	Input2* groundedmelt_input = this->GetInput2(BasalforcingsGroundediceMeltingRateEnum); _assert_(groundedmelt_input); 
+	Input2* gllevelset_input = this->GetInput2(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
+	Input2* scalefactor_input = NULL;
 	if(scaled==true){
-		scalefactor_input = this->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input); 
 	}
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
@@ -4422,8 +4712,8 @@
 
 	/*Now get the average SMB over the element*/
-	Input* smb_input = inputs->GetInput(SmbMassBalanceEnum); _assert_(smb_input);
+	Input2* smb_input = this->GetInput2(SmbMassBalanceEnum); _assert_(smb_input);
 	smb_input->GetInputAverage(&smb);	// average smb on element in m ice s-1
 	if(scaled==true){
-		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		Input2* scalefactor_input = this->GetInput2(MeshScaleFactorEnum); _assert_(scalefactor_input);
 		scalefactor_input->GetInputAverage(&scalefactor);// average scalefactor on element
 	}
@@ -4437,5 +4727,5 @@
 }
 /*}}}*/
-void       Tria::Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finiteelement_type){/*{{{*/
+void       Tria::Update(Inputs2* inputs2,int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finiteelement_type){/*{{{*/
 
 	/*Intermediaries*/
@@ -4581,7 +4871,4 @@
 	this->SetHookNodes(tria_node_ids,numnodes,analysis_counter); this->nodes=NULL;
 	xDelete<int>(tria_node_ids);
-
-	/*Fill with IoModel*/
-	this->InputUpdateFromIoModel(index,iomodel);
 }
 /*}}}*/
@@ -4594,6 +4881,6 @@
 
 	this->parameters->FindParam(&extrusioninput,InputToExtrudeEnum);
-	Input* input = inputs->GetInput(extrusioninput);      _assert_(input);
-	Input* onbase = inputs->GetInput(MeshVertexonbaseEnum); _assert_(onbase);
+	Input2* input = this->GetInput2(extrusioninput);      _assert_(input);
+	Input2* onbase = this->GetInput2(MeshVertexonbaseEnum); _assert_(onbase);
 
 	GaussTria* gauss=new GaussTria();
@@ -4618,6 +4905,6 @@
 
 	this->parameters->FindParam(&extrusioninput,InputToExtrudeEnum);
-	Input* input = inputs->GetInput(extrusioninput); _assert_(input);
-	Input* onsurf = inputs->GetInput(MeshVertexonsurfaceEnum); _assert_(onsurf);
+	Input2* input = this->GetInput2(extrusioninput); _assert_(input);
+	Input2* onsurf = this->GetInput2(MeshVertexonsurfaceEnum); _assert_(onsurf);
 
 	GaussTria* gauss=new GaussTria();
@@ -4751,5 +5038,5 @@
 	IssmDouble  currenttime;
 	int         numtimes;
-	Input* thickness_input=NULL;
+	Input2* thickness_input=NULL;
 
 	/*gia solution parameters:*/
@@ -4761,7 +5048,7 @@
 	IssmDouble mantle_shear_modulus;
 	IssmDouble mantle_density;
-	Input* mantle_viscosity_input=NULL;
+	Input2* mantle_viscosity_input=NULL;
 	IssmDouble mantle_viscosity;
-	Input* lithosphere_thickness_input=NULL;
+	Input2* lithosphere_thickness_input=NULL;
 	IssmDouble lithosphere_thickness;
 
@@ -4797,15 +5084,15 @@
 
 	/*pull thickness averages: */
-	thickness_input=inputs->GetInput(ThicknessEnum);
+	thickness_input=this->GetInput2(ThicknessEnum); 
 	if (!thickness_input)_error_("thickness input needed to compute gia deflection!");
 	thickness_input->GetInputAveragesUpToCurrentTime(&hes,&times,&numtimes,currenttime);
 
 	/*recover mantle viscosity: */
-	mantle_viscosity_input=inputs->GetInput(GiaMantleViscosityEnum);
+	mantle_viscosity_input=this->GetInput2(GiaMantleViscosityEnum);
 	if (!mantle_viscosity_input)_error_("mantle viscosity input needed to compute gia deflection!");
 	mantle_viscosity_input->GetInputAverage(&mantle_viscosity);
 
 	/*recover lithosphere thickness: */
-	lithosphere_thickness_input=inputs->GetInput(GiaLithosphereThicknessEnum);
+	lithosphere_thickness_input=this->GetInput2(GiaLithosphereThicknessEnum);
 	if (!lithosphere_thickness_input)_error_("lithosphere thickness input needed to compute gia deflection!");
 	lithosphere_thickness_input->GetInputAverage(&lithosphere_thickness);
@@ -4891,5 +5178,5 @@
 
 	/*Compute ice thickness change: */
-	Input*	deltathickness_input=inputs->GetInput(EsaDeltathicknessEnum);
+	Input2* deltathickness_input=this->GetInput2(EsaDeltathicknessEnum); 
 	if (!deltathickness_input)_error_("delta thickness input needed to compute elastic adjustment!");
 	deltathickness_input->GetInputAverage(&I);
@@ -5029,5 +5316,5 @@
 
 	/*Compute ice thickness change: */
-	Input*	deltathickness_input=inputs->GetInput(EsaDeltathicknessEnum);
+	Input2* deltathickness_input=this->GetInput2(EsaDeltathicknessEnum); 
 	if (!deltathickness_input)_error_("delta thickness input needed to compute elastic adjustment!");
 	deltathickness_input->GetInputAverage(&I);
@@ -5263,5 +5550,5 @@
 
 		/*Compute ice thickness change: */
-		Input*	deltathickness_input=inputs->GetInput(SealevelriseDeltathicknessEnum);
+		Input2* deltathickness_input=this->GetInput2(SealevelriseDeltathicknessEnum); 
 		if (!deltathickness_input)_error_("delta thickness input needed to compute sea level rise!");
 		deltathickness_input->GetInputAverage(&I);
@@ -5398,5 +5685,5 @@
 
 	/*Compute ice thickness change: */
-	Input*	deltathickness_input=inputs->GetInput(SealevelriseDeltathicknessEnum);
+	Input2* deltathickness_input=this->GetInput2(SealevelriseDeltathicknessEnum); 
 	if (!deltathickness_input)_error_("delta thickness input needed to compute sea level rise!");
 
@@ -5740,5 +6027,5 @@
 
 	/*Compute ice thickness change: */
-	Input*	deltathickness_input=inputs->GetInput(SealevelriseDeltathicknessEnum);
+	Input2* deltathickness_input=this->GetInput2(SealevelriseDeltathicknessEnum); 
 	if (!deltathickness_input)_error_("delta thickness input needed to compute sea level rise!");
 	deltathickness_input->GetInputAverage(&I);
@@ -5833,48 +6120,38 @@
 void       Tria::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){/*{{{*/
 
-	int             i,t,row;
-	IssmDouble      time;
-	TransientInput *transientinput = NULL;
-	IssmDouble      values[3];
-	IssmDouble      value;
-
 	/*Check that name is an element input*/
 	if(!IsInputEnum(name)) _error_("Enum "<<EnumToStringx(name)<<" is not in IsInput");
+	TransientInput2* transientinput = inputs2->GetTransientInput(name);
 
 	switch(type){
 
 		case VertexEnum:
+
+			/*Get LID lists once for all*/
+			IssmDouble  values[NUMVERTICES];
+			int         lidlist[NUMVERTICES];
+			this->GetVerticesLidList(&lidlist[0]);
+
 			/*Create transient input: */
-			for(t=0;t<ncols;t++){ //ncols is the number of times
-
-				/*create input values: */
-				for(i=0;i<3;i++){
-					row=this->vertices[i]->Sid();
+			for(int t=0;t<ncols;t++){ //ncols is the number of times
+				for(int i=0;i<3;i++){
+					int row=this->vertices[i]->Sid();
 					values[i]=matrix[ncols*row+t];
 				}
 
 				/*time:*/
-				time=matrix[(nrows-1)*ncols+t];
-
-				if(t==0) transientinput=new TransientInput(name);
-				transientinput->AddTimeInput(new TriaInput(name,values,P1Enum),time);
-				transientinput->Configure(parameters);
+				IssmDouble time=matrix[(nrows-1)*ncols+t];
+
+				transientinput->AddTriaTimeInput(t,NUMVERTICES,&lidlist[0],&values[0],P1Enum);
 			}
-			this->inputs->AddInput(transientinput);
 			break;
 
 		case ElementEnum:
 			/*Get value for the element: */
-			for(t=0;t<ncols;t++){ //ncols is the number of times
-				value=matrix[ncols*(this->Sid())+t];
-
-				/*time:*/
-				time=matrix[(nrows-1)*ncols+t];
-
-				if(t==0) transientinput=new TransientInput(name);
-				transientinput->AddTimeInput(new TriaInput(name,&value,P0Enum),time);
-				transientinput->Configure(parameters);
+			for(int t=0;t<ncols;t++){ //ncols is the number of times
+				IssmDouble value=matrix[ncols*(this->Sid())+t];
+				IssmDouble time=matrix[(nrows-1)*ncols+t];
+				transientinput->AddTriaTimeInput(t,1,&(this->lid),&value,P0Enum);
 			}
-			this->inputs->AddInput(transientinput);
 			break;
 
@@ -5882,5 +6159,4 @@
 			_error_("type " << type << " (" << EnumToStringx(type) << ") not implemented yet");
 	}
-
 }
 /*}}}*/
@@ -5957,14 +6233,14 @@
 
 					/*Add new inputs: */
-					this->inputs->AddInput(new TriaInput(ThicknessEnum,thickness,P1Enum));
-					this->inputs->AddInput(new TriaInput(BaseEnum,bed,P1Enum));
-					this->inputs->AddInput(new TriaInput(SurfaceEnum,surface,P1Enum));
+					this->AddInput2(ThicknessEnum,thickness,P1Enum);
+					this->AddInput2(BaseEnum,bed,P1Enum);
+					this->AddInput2(SurfaceEnum,surface,P1Enum);
 
 					break;
 				case MaterialsRheologyBEnum:
-					this->inputs->AddInput(new TriaInput(MaterialsRheologyBbarEnum,values,P1Enum));
+					this->AddInput2(MaterialsRheologyBbarEnum,values,P1Enum);
 					break;
 				default:
-					this->inputs->AddInput(new TriaInput(name,values,P1Enum));
+					this->AddInput2(name,values,P1Enum);
 			}
 			break;
@@ -5974,5 +6250,5 @@
 			/*Get value for the element: */
 			value=vector[this->Sid()]; //careful, vector of values here is not parallel distributed, but serial distributed (from a serial Dakota core!)
-			this->inputs->AddInput(new TriaInput(name,&value,P0Enum));
+			this->AddInput2(name,&value,P0Enum);
 			break;
 		default:
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 24335)
@@ -30,8 +30,9 @@
 
 	public:
+		int iscollapsed;
 
 		/*Tria constructors, destructors {{{*/
 		Tria(){};
-		Tria(int tria_id,int tria_sid,IoModel* iomodel,int nummodels);
+		Tria(int tria_id,int tria_sid,int tria_lid,IoModel* iomodel,int nummodels);
 		~Tria();
 		/*}}}*/
@@ -63,5 +64,5 @@
 		void        ComputeStressTensor();
 		void        ComputeSurfaceNormalVelocity();
-		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters);
+		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters,Inputs2* inputs2in);
 		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index,int offset,int N, int M);
 		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
@@ -102,9 +103,8 @@
 		void        InputDepthAverageAtBase(int enum_type,int average_enum_type);
 		void        InputExtrude(int enum_type,int start){_error_("not implemented"); /*For penta only*/};
+		void        ControlInputExtrude(int enum_type,int start){/*For penta only*/};
 		bool	   	IsFaceOnBoundary(void);
 		bool	   	IsIcefront(void);
 		bool        IsNodeOnShelfFromFlags(IssmDouble* flags);
-		bool        IsOnBase();
-		bool        IsOnSurface();
 		bool        IsZeroLevelset(int levelset_enum);
 		IssmDouble  Masscon(IssmDouble* levelset);
@@ -124,4 +124,7 @@
 		void        ResetLevelsetFromSegmentlist(IssmDouble* segments,int numsegments);
 		void        RignotMeltParameterization();
+		void        SetElementInput(int enum_in,IssmDouble values);
+		void        SetElementInput(Inputs2* inputs2,int enum_in,IssmDouble values);
+		void        SetElementInput(Inputs2* inputs2,int numindices,int* indices,IssmDouble* values,int enum_in);
 		void        SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset,int N,int M);
 		void        SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
@@ -140,5 +143,5 @@
 		IssmDouble  TotalGroundedBmb(bool scaled);
 		IssmDouble  TotalSmb(bool scaled);
-		void        Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
+		void        Update(Inputs2* inputs2,int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
 		int         UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf);
 		void        ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss);
@@ -169,6 +172,8 @@
 		void           AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum);
 		void           AddInput(int input_enum, IssmDouble* values, int interpolation_enum);
-		void           AddControlInput(int input_enum, IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max, int interpolation_enum,int id);
-		void           DatasetInputCreate(IssmDouble* array,int M,int N,int* individual_enums,int num_inputs,IoModel* iomodel,int input_enum);
+		void           AddBasalInput2(int input_enum, IssmDouble* values, int interpolation_enum);
+		void           AddInput2(int input_enum, IssmDouble* values, int interpolation_enum);
+		void           AddControlInput(int input_enum,Inputs2* inputs2,IoModel* iomodel,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max, int interpolation_enum,int id);
+		void           DatasetInputCreate(IssmDouble* array,int M,int N,int* individual_enums,int num_inputs,Inputs2* inputs2,IoModel* iomodel,int input_enum);
 		IssmDouble     GetArea(void);
 		IssmDouble     GetHorizontalSurfaceArea(void);
@@ -178,4 +183,7 @@
 		void           GetAreaCoordinates(IssmDouble *area_coordinates,IssmDouble* xyz_zero,IssmDouble* xyz_list,int numpoints);
 		int            GetElementType(void);
+		Input2*        GetInput2(int enumtype);
+		Input2*        GetInput2(int enumtype,IssmDouble time);
+		DatasetInput2* GetDatasetInput2(int inputenum);
 		void           GetInputValue(IssmDouble* pvalue,Node* node,int enumtype);
 		void           GetInputValue(IssmDouble* pvalue,Vertex* vertex,int enumtype);
@@ -218,5 +226,4 @@
 		void           UpdateConstraintsExtrudeFromBase(void);
 		void           UpdateConstraintsExtrudeFromTop(void);
-		void           ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){_error_("not implemented yet");};
 		/*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 24335)
@@ -17,4 +17,5 @@
 #include "../shared/Enum/Enum.h"
 #include "../analyses/analyses.h"
+#include "./Inputs2/DatasetInput2.h"
 
 #if _HAVE_CODIPACK_
@@ -161,5 +162,4 @@
 	/*Save communicator in the parameters dataset: */
 	this->parameters->AddObject(new GenericParam<ISSM_MPI_Comm>(incomm,FemModelCommEnum));
-
 }
 /*}}}*/
@@ -196,4 +196,5 @@
 	if(materials)delete materials;
 	if(parameters)delete parameters;
+	if(inputs2)delete inputs2;
 	if(results)delete results;
 
@@ -336,4 +337,5 @@
 	output->materials=static_cast<Materials*>(this->materials->Copy());
 	output->parameters=static_cast<Parameters*>(this->parameters->Copy());
+	output->inputs2=static_cast<Inputs2*>(this->inputs2->Copy());
 	output->results=static_cast<Results*>(this->results->Copy());
 	output->vertices=static_cast<Vertices*>(this->vertices->Copy());
@@ -354,5 +356,5 @@
 		SpcNodesx(output->nodes_list[i],output->constraints_list[i],output->parameters);
 		NodesDofx(output->nodes_list[i],output->parameters);
-		ConfigureObjectsx(output->elements,output->loads_list[i],output->nodes_list[i],output->vertices,output->materials,output->parameters);
+		ConfigureObjectsx(output->elements,output->loads_list[i],output->nodes_list[i],output->vertices,output->materials,output->parameters,output->inputs2);
 	}
 
@@ -428,5 +430,5 @@
 
 	/*create datasets for all analyses*/
-	ModelProcessorx(&this->elements,&this->nodes_list,&this->vertices,&this->materials,&this->constraints_list,&this->loads_list,&this->parameters,iomodel,toolkitsoptionsfid,rootpath,this->solution_type,this->nummodels,this->analysis_type_list);
+	ModelProcessorx(&this->elements,&this->nodes_list,&this->vertices,&this->materials,&this->constraints_list,&this->loads_list,&this->parameters,&this->inputs2,iomodel,toolkitsoptionsfid,rootpath,this->solution_type,this->nummodels,this->analysis_type_list);
 
 	/*do the post-processing of the datasets to get an FemModel that can actually run analyses: */
@@ -437,5 +439,5 @@
 
 		if(VerboseMProcessor()) _printf0_("      configuring element and loads\n");
-		ConfigureObjectsx(this->elements,this->loads,this->nodes,this->vertices,this->materials,this->parameters);
+		ConfigureObjectsx(this->elements,this->loads,this->nodes,this->vertices,this->materials,this->parameters,this->inputs2);
 
 		if(i==0){
@@ -462,4 +464,5 @@
 		delete this->materials;
 		delete this->parameters;
+		delete this->inputs2;
 		if(this->constraints_list && this->nummodels){
 			for(i=0;i<this->nummodels;i++) delete this->constraints_list[i];
@@ -481,4 +484,5 @@
 		this->materials   = new Materials();
 		this->parameters  = new Parameters();
+		this->inputs2     = new Inputs2();
 		this->results     = new Results();
 		this->nodes       = new Nodes();
@@ -496,4 +500,5 @@
 	this->materials->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
 	this->parameters->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+	this->inputs2->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
 	this->results->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
 	this->vertices->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
@@ -527,5 +532,5 @@
 			SpcNodesx(this->nodes_list[i],this->constraints_list[i],this->parameters);
 			NodesDofx(this->nodes_list[i],this->parameters);
-			ConfigureObjectsx(this->elements,this->loads_list[i],this->nodes_list[i],this->vertices,this->materials,this->parameters);
+			ConfigureObjectsx(this->elements,this->loads_list[i],this->nodes_list[i],this->vertices,this->materials,this->parameters,this->inputs2);
 		}
 
@@ -942,5 +947,4 @@
 		#endif
 		_printf0_("\n");
-
 	}
 }
@@ -968,11 +972,11 @@
 		/* Get node coordinates*/
 		element->GetVerticesCoordinates(&xyz_list);
-		Input* weights_input                   = element->GetInput(InversionCostFunctionsCoefficientsEnum);   _assert_(weights_input);
-		Input* thickness_input                 = element->GetInput(ThicknessEnum); _assert_(thickness_input);
-		Input* vx_input                        = element->GetInput(VxEnum);                                  _assert_(vx_input);
-		Input* vy_input                        = element->GetInput(VyEnum);                                  _assert_(vy_input);
-		Input* surface_mass_balance_input      = element->GetInput(SmbMassBalanceEnum);          _assert_(surface_mass_balance_input);
-		Input* groundedice_melting_input       = element->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(groundedice_melting_input);
-		Input* dhdt_input                      = element->GetInput(BalancethicknessThickeningRateEnum);      _assert_(dhdt_input);
+		DatasetInput2* weights_input                   = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum);   _assert_(weights_input);
+		Input2* thickness_input                 = element->GetInput2(ThicknessEnum); _assert_(thickness_input);
+		Input2* vx_input                        = element->GetInput2(VxEnum);                                  _assert_(vx_input);
+		Input2* vy_input                        = element->GetInput2(VyEnum);                                  _assert_(vy_input);
+		Input2* surface_mass_balance_input      = element->GetInput2(SmbMassBalanceEnum);          _assert_(surface_mass_balance_input);
+		Input2* groundedice_melting_input       = element->GetInput2(BasalforcingsGroundediceMeltingRateEnum); _assert_(groundedice_melting_input);
+		Input2* dhdt_input                      = element->GetInput2(BalancethicknessThickeningRateEnum);      _assert_(dhdt_input);
 
 		/* Start  looping on the number of gaussian points: */
@@ -1597,4 +1601,20 @@
 
 }/*}}}*/
+void FemModel::InputMakeDiscontinuous(int enum_in){/*{{{*/
+
+	int numvertices  = 6;
+	IssmDouble* P1DGlist = xNew<IssmDouble>(numvertices);
+
+	for(int i=0;i<this->elements->Size();i++){
+		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+		element->GetInputListOnVertices(P1DGlist,enum_in);
+		element->AddInput2(DummyEnum,P1DGlist,P1DGEnum);
+	}
+	xDelete<IssmDouble>(P1DGlist);
+
+	this->inputs2->ChangeEnum(DummyEnum,enum_in);
+	this->inputs2->DeleteInput(DummyEnum);
+
+}/*}}}*/
 void FemModel::GroundinglineMassFluxx(IssmDouble* pM, bool scaled){/*{{{*/
 
@@ -1821,5 +1841,6 @@
 	for(i=0;i<this->elements->Size();i++){
 		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
-		element_maxvel = element->inputs->Max(VelEnum);
+		Input2* vel_input = element->GetInput2(VelEnum); _assert_(vel_input);
+		element_maxvel = vel_input->GetInputMax();
 		if(element_maxvel>maxvel) maxvel=element_maxvel;
 	}
@@ -1845,5 +1866,6 @@
 	for(i=0;i<this->elements->Size();i++){
 		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
-		element_maxvx = element->inputs->Max(VxEnum);
+		Input2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input);
+		element_maxvx = vx_input->GetInputMax();
 		if(element_maxvx>maxvx) maxvx=element_maxvx;
 	}
@@ -1869,5 +1891,6 @@
 	for(i=0;i<this->elements->Size();i++){
 		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
-		element_maxvy = element->inputs->Max(VyEnum);
+		Input2* vy_input = element->GetInput2(VyEnum); _assert_(vy_input);
+		element_maxvy = vy_input->GetInputMax();
 		if(element_maxvy>maxvy) maxvy=element_maxvy;
 	}
@@ -1893,5 +1916,6 @@
 	for(i=0;i<this->elements->Size();i++){
 		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
-		element_maxvz = element->inputs->Max(VzEnum);
+		Input2* vz_input = element->GetInput2(VzEnum); _assert_(vz_input);
+		element_maxvz = vz_input->GetInputMax();
 		if(element_maxvz>maxvz) maxvz=element_maxvz;
 	}
@@ -2024,6 +2048,6 @@
 
 		/*Retrieve all inputs we will be needing: */
-		Input* weights_input   =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-		Input* omega_input =element->GetInput(BalancethicknessOmegaEnum);                   _assert_(omega_input);
+		DatasetInput2* weights_input = element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+		Input2* omega_input   = element->GetInput2(BalancethicknessOmegaEnum);              _assert_(omega_input);
 
 		/* Start  looping on the number of gaussian points: */
@@ -2081,7 +2105,7 @@
 
 		/*Retrieve all inputs we will be needing: */
-		Input* weights_input =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-		Input* omega_input   =element->GetInput(BalancethicknessOmegaEnum);              _assert_(omega_input);
-		Input* omega0_input  =element->GetInput(BalancethicknessOmega0Enum);             _assert_(omega0_input);
+		DatasetInput2* weights_input =element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+		Input2* omega_input   =element->GetInput2(BalancethicknessOmegaEnum);              _assert_(omega_input);
+		Input2* omega0_input  =element->GetInput2(BalancethicknessOmega0Enum);             _assert_(omega0_input);
 
 		/* Start  looping on the number of gaussian points: */
@@ -2356,4 +2380,11 @@
 					default:
 
+					/*Some preliminary calculation may be required (use similar syntax for other inputs)*/
+						if(output_enum==NewDamageEnum){
+							InputDuplicatex(this,DamageDEnum,DamageDOldEnum);
+							InputDuplicatex(this,DamageDbarEnum,DamageDbarOldEnum);
+							this->ElementOperationx(&Element::ComputeNewDamage);
+						}
+
 						/*Vector layout*/
 						if(!IsInputEnum(output_enum)) _error_("Cannot output \""<<EnumToStringx(output_enum)<<"\" because it is not an input");
@@ -2366,7 +2397,6 @@
 							Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(j));
 							element->ResultInterpolation(&rank_interpolation,&rank_nodesperelement,&rank_arraysize,output_enum);
-							if (rank_arraysize>max_rank_arraysize)max_rank_arraysize=rank_arraysize;
+							if(rank_arraysize>max_rank_arraysize)max_rank_arraysize=rank_arraysize;
 						}
-						rank_arraysize=max_rank_arraysize;
 
 						/*Broadcast for cpus that do not have any elements*/
@@ -2620,7 +2650,7 @@
 
 		 /*Retrieve all inputs we will be needing: */
-		 Input* weights_input   =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-		 Input* surface_input   =element->GetInput(SurfaceEnum);                            _assert_(surface_input);
-		 Input* surfaceobs_input=element->GetInput(InversionSurfaceObsEnum);                _assert_(surfaceobs_input);
+		 DatasetInput2* weights_input   =element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+		 Input2* surface_input   =element->GetInput2(SurfaceEnum);                            _assert_(surface_input);
+		 Input2* surfaceobs_input=element->GetInput2(InversionSurfaceObsEnum);                _assert_(surfaceobs_input);
 
 		 /* Start  looping on the number of gaussian points: */
@@ -2676,6 +2706,6 @@
 
 		/*Retrieve all inputs we will be needing: */
-		Input* weights_input   =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-		Input* thickness_input =element->GetInput(ThicknessEnum);                          _assert_(thickness_input);
+		DatasetInput2* weights_input   =element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+		Input2* thickness_input =element->GetInput2(ThicknessEnum);                          _assert_(thickness_input);
 
 		/* Start  looping on the number of gaussian points: */
@@ -2732,6 +2762,6 @@
 
 		/*Retrieve all inputs we will be needing: */
-		Input* weights_input   =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-		Input* thickness_input =element->GetInput(ThicknessEnum);                          _assert_(thickness_input);
+		DatasetInput2* weights_input   =element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+		Input2* thickness_input =element->GetInput2(ThicknessEnum);                          _assert_(thickness_input);
 
 		/* Start  looping on the number of gaussian points: */
@@ -3104,5 +3134,5 @@
 		}
 
-		ConfigureObjectsx(new_elements,this->loads,new_nodes_list[i],new_vertices,new_materials,this->parameters);
+		ConfigureObjectsx(new_elements,this->loads,new_nodes_list[i],new_vertices,new_materials,this->parameters,this->inputs2);
 		SpcNodesx(new_nodes_list[i],new_constraints_list[i],this->parameters);
 		NodesDofx(new_nodes_list[i],this->parameters);
@@ -3174,5 +3204,5 @@
 		}
 		/*insert new bedrock*/
-		element->AddInput(BedEnum,&r[0],P1Enum);
+		element->AddInput2(BedEnum,&r[0],P1Enum);
 		/*Cleanup*/
 		xDelete<IssmDouble>(xyz_list);
@@ -3222,7 +3252,7 @@
 
 		/*Update inputs*/
-		element->AddInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum);
-		element->AddInput(ThicknessEnum,&h[0],P1Enum);
-		element->AddInput(BaseEnum,&b[0],P1Enum);
+		element->AddInput2(MaskGroundediceLevelsetEnum,&phi[0],P1Enum);
+		element->AddInput2(ThicknessEnum,&h[0],P1Enum);
+		element->AddInput2(BaseEnum,&b[0],P1Enum);
 	}
 
@@ -3422,4 +3452,5 @@
 	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++){
@@ -3430,7 +3461,9 @@
 					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])));
 					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])));
 					break;
@@ -5095,4 +5128,5 @@
 		}
 		else{
+			_error_("not implemented with inputs2");
 			for(int j=0;j<elements->Size();j++){
 				/*Intermediaries*/
@@ -5133,5 +5167,4 @@
 				default: _error_("Not implemented yet");
 				}
-				stacking_input->Configure(parameters);
 				xDelete<IssmDouble>(N);
 			}
@@ -5160,5 +5193,7 @@
 					transient_input->GetInputAverageOverTimeSlice(&time_averaged[iv],gauss,init_time,end_time);
 				}
-				element->AddInput(averagedinput_enum[i],&time_averaged[0],element->GetElementType());
+
+				element->AddInput2(averagedinput_enum[i],&time_averaged[0],element->GetElementType());
+				xDelete<IssmDouble>(time_averaged);
 				delete gauss;
 				xDelete<IssmDouble>(time_averaged);
Index: /issm/trunk-jpl/src/c/classes/FemModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 24335)
@@ -11,4 +11,5 @@
 class DataSet;
 class Parameters;
+class Inputs2;
 class Nodes;
 class Vertices;
@@ -43,4 +44,5 @@
 		Materials   *materials;            //one set of materials, for each element
 		Parameters  *parameters;           //one set of parameters, independent of the analysis_type
+		Inputs2     *inputs2;              //one set of inputs, independent of the analysis_type
 		Results     *results;              //results that cannot be fit into the elements
 		Vertices    *vertices;             //one set of vertices
@@ -110,4 +112,5 @@
 		void IceVolumex(IssmDouble* pV, bool scaled);
 		void IceVolumeAboveFloatationx(IssmDouble* pV, bool scaled);
+		void InputMakeDiscontinuous(int enum_in);
 		void MassFluxx(IssmDouble* presponse);
 		void MaxAbsVxx(IssmDouble* presponse);
Index: /issm/trunk-jpl/src/c/classes/Inputs/Inputs.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/Inputs.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Inputs/Inputs.cpp	(revision 24335)
@@ -31,6 +31,8 @@
 int  Inputs::AddInput(Input* in_input){/*{{{*/
 
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 	_assert_(in_input); 
 	int enum_name = in_input->InstanceEnum();
+	printf("Adding %s to inputs\n",EnumToStringx(enum_name));
 	#ifdef _ISSM_DEBUG_
 	if(!IsInputEnum(enum_name)) _error_("Enum \""<<EnumToStringx(enum_name)<<"\" is not placed properly in EnumDefinitions.h");
@@ -57,4 +59,5 @@
 /*}}}*/
 void  Inputs::ChangeEnum(int oldenumtype,int newenumtype){/*{{{*/
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 
 	/*Delete input if it already exists*/
@@ -91,6 +94,16 @@
 int  Inputs::DeleteInput(int enum_type){/*{{{*/
 
-	Input* input=this->GetInput(enum_type);
-	if(input) this->DeleteObject(input);
+	vector<Object*>::iterator object;
+	Input* input=NULL;
+	bool found = false;
+
+	for ( object=objects.begin() ; object < objects.end(); object++ ){
+		input=xDynamicCast<Input*>(*object);
+		if (input->InstanceEnum()==enum_type){
+			found = true;
+			break;
+		}
+	}
+	if(found) this->DeleteObject(input);
 	return 1;
 
@@ -98,4 +111,5 @@
 /*}}}*/
 void  Inputs::DuplicateInput(int original_enum,int new_enum){/*{{{*/
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 
 	/*Make a copy of the original input: */
@@ -112,4 +126,5 @@
 /*}}}*/
 Input* Inputs::GetInput(int enum_name){/*{{{*/
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 
 	vector<Object*>::iterator object;
@@ -125,4 +140,5 @@
 /*}}}*/
 void Inputs::GetInputAverage(IssmDouble* pvalue,int enum_type){/*{{{*/
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 
 	/*Find input in current dataset*/
@@ -136,4 +152,5 @@
 /*}}}*/
 void Inputs::GetInputValue(bool* pvalue,int enum_type){/*{{{*/
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 
 	/*Find input in current dataset*/
@@ -147,4 +164,5 @@
 /*}}}*/
 void Inputs::GetInputValue(int* pvalue,int enum_type){/*{{{*/
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 
 	/*Find input in current dataset*/
@@ -157,4 +175,5 @@
 }/*}}}*/
 void Inputs::GetInputValue(IssmDouble* pvalue,int enum_type){/*{{{*/
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 
 	/*Find input in current dataset*/
@@ -167,4 +186,5 @@
 }/*}}}*/
 IssmDouble Inputs::Max(int enumtype){/*{{{*/
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 
 	/*Find input in current dataset*/
@@ -177,4 +197,5 @@
 }/*}}}*/
 IssmDouble Inputs::MaxAbs(int enumtype){/*{{{*/
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 
 	/*Find input in current dataset*/
@@ -187,4 +208,5 @@
 }/*}}}*/
 IssmDouble Inputs::Min(int enumtype){/*{{{*/
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 
 	/*Find input in current dataset*/
@@ -197,4 +219,5 @@
 }/*}}}*/
 IssmDouble Inputs::MinAbs(int enumtype){/*{{{*/
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 
 	/*Find input in current dataset*/
@@ -207,4 +230,5 @@
 }/*}}}*/
 Inputs* Inputs::SpawnSegInputs(int index1,int index2){/*{{{*/
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 
 	/*Intermediary*/
@@ -232,4 +256,5 @@
 /*}}}*/
 Inputs* Inputs::SpawnTriaInputs(int index1,int index2,int index3){/*{{{*/
+	printf("-------------- file: Inputs.cpp line: %i\n",__LINE__); 
 
 	/*Intermediary*/
Index: /issm/trunk-jpl/src/c/classes/Inputs2/ArrayInput2.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/ArrayInput2.cpp	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/ArrayInput2.cpp	(revision 24335)
@@ -0,0 +1,84 @@
+/*!\file ArrayInput2.c
+ * \brief: implementation of the ArrayInput2 object
+ */
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "../classes.h"
+#include "../../shared/shared.h"
+#include "./ArrayInput2.h"
+
+/*ArrayInput2 constructors and destructor*/
+ArrayInput2::ArrayInput2(void){/*{{{*/
+
+	this->numberofelements_local = -1;
+	this->N                      = -1;
+	this->values                 = NULL;
+
+}/*}}}*/
+ArrayInput2::ArrayInput2(int nbe_in,int N_in){/*{{{*/
+
+	_assert_(nbe_in>0);
+	_assert_(nbe_in<1e11);
+	this->numberofelements_local = nbe_in;
+	this->N                      = N_in;
+	this->values                 = xNewZeroInit<IssmDouble>(this->numberofelements_local*this->N);
+
+}/*}}}*/
+ArrayInput2::~ArrayInput2(){/*{{{*/
+	if(this->values) xDelete<IssmDouble>(this->values);
+}
+/*}}}*/
+
+/*Object virtual functions definitions:*/
+Input2* ArrayInput2::copy() {/*{{{*/
+
+	ArrayInput2* output = new ArrayInput2(this->numberofelements_local,this->N);
+	xMemCpy<IssmDouble>(output->values,this->values,this->numberofelements_local*this->N);
+
+	return output;
+}
+/*}}}*/
+void ArrayInput2::DeepEcho(void){/*{{{*/
+	_printf_("ArrayInput2 Echo:\n");
+	_printf_("   Size:          "<<N<<"\n");
+	//printarray(this->values,this->M,this->N);
+	//_printf_(setw(15)<<"   ArrayInput2 "<<setw(25)<<left<<EnumToStringx(this->enum_type)<<" "<<(value?"true":"false") << "\n");
+}
+/*}}}*/
+void ArrayInput2::Echo(void){/*{{{*/
+	this->DeepEcho();
+}
+/*}}}*/
+int  ArrayInput2::Id(void){/*{{{*/
+	return -1;
+}/*}}}*/
+void ArrayInput2::Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){ /*{{{*/
+
+	MARSHALLING_ENUM(ArrayInput2Enum);
+	MARSHALLING(this->numberofelements_local);
+	MARSHALLING(this->N);
+	if(this->numberofelements_local*this->N){
+		MARSHALLING_DYNAMIC(this->values,IssmDouble,this->numberofelements_local*this->N);
+	}
+	else this->values = NULL;
+
+}
+/*}}}*/
+int  ArrayInput2::ObjectEnum(void){/*{{{*/
+	return ArrayInput2Enum;
+}
+/*}}}*/
+
+/*ArrayInput2 management*/
+void ArrayInput2::SetInput(int row,int numindices,IssmDouble* values_in){/*{{{*/
+
+	_assert_(this);
+	_assert_(this->N==numindices);
+	for(int i=0;i<numindices;i++) this->values[row*this->N+i] = values_in[i];
+}
+/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Inputs2/ArrayInput2.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/ArrayInput2.h	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/ArrayInput2.h	(revision 24335)
@@ -0,0 +1,33 @@
+#ifndef _ARRAYINPUT2_H_
+#define _ARRAYINPUT2_H_
+
+/*Headers:*/
+#include "./Input2.h"
+
+class ArrayInput2: public Input2{
+
+	private:
+		int         numberofelements_local;
+		int         N;
+		IssmDouble* values;
+
+	public:
+		/*ArrayInput2 constructors, destructors: {{{*/
+		ArrayInput2();
+		ArrayInput2(int nbe_in,int N_in);
+		~ArrayInput2();
+		/*}}}*/
+		/*Object virtual functions definitions:{{{ */
+		Input2 *copy();
+		void    DeepEcho();
+		void    Echo();
+		int     Id();
+		void    Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
+		int     ObjectEnum();
+		/*}}}*/
+		/*ArrayInput2 management: {{{*/
+		void SetInput(int row,int numinds,IssmDouble* values_in);
+		/*}}}*/
+
+};
+#endif  /* _ARRAYINPUT_H */
Index: /issm/trunk-jpl/src/c/classes/Inputs2/BoolInput2.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/BoolInput2.cpp	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/BoolInput2.cpp	(revision 24335)
@@ -0,0 +1,92 @@
+/*!\file BoolInput2.c
+ * \brief: implementation of the BoolInput2 object
+ */
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "../classes.h"
+#include "./BoolInput2.h"
+#include "../../shared/shared.h"
+
+/*BoolInput2 constructors and destructor*/
+BoolInput2::BoolInput2(){/*{{{*/
+	this->size   = -1;
+	this->values = NULL;
+}
+/*}}}*/
+BoolInput2::BoolInput2(int size_in){/*{{{*/
+	_assert_(size_in>0);
+	_assert_(size_in<1e11);
+	this->size   = size_in;
+	this->values = xNew<bool>(size_in);
+}
+/*}}}*/
+BoolInput2::~BoolInput2(){/*{{{*/
+	xDelete<bool>(this->values);
+}
+/*}}}*/
+
+/*Object virtual functions definitions:*/
+Input2* BoolInput2::copy() {/*{{{*/
+
+	_assert_(this->size);
+	BoolInput2* output = new BoolInput2(this->size);
+	xMemCpy<bool>(output->values,this->values,this->size);
+
+	return output;
+
+}
+/*}}}*/
+void BoolInput2::DeepEcho(void){/*{{{*/
+
+	//_printf_(setw(15)<<"   BoolInput2 "<<setw(25)<<left<<EnumToStringx(this->enum_type)<<" "<<(value?"true":"false") << "\n");
+	_error_("Not implemented");
+}
+/*}}}*/
+void BoolInput2::Echo(void){/*{{{*/
+	this->DeepEcho();
+}
+/*}}}*/
+int  BoolInput2::Id(void){ return -1; }/*{{{*/
+/*}}}*/
+void BoolInput2::Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){ /*{{{*/
+
+	MARSHALLING_ENUM(BoolInput2Enum);
+	MARSHALLING(this->size);
+	if(this->size > 0){
+		MARSHALLING_DYNAMIC(this->values,bool,this->size)
+	}
+	else this->values = NULL;
+
+}
+/*}}}*/
+int  BoolInput2::ObjectEnum(void){/*{{{*/
+
+	return BoolInput2Enum;
+
+}
+/*}}}*/
+
+/*BoolInput2 management*/
+void BoolInput2::GetInput(bool* pvalue,int index){/*{{{*/
+
+	_assert_(index>=0); 
+	_assert_(index<this->size); 
+
+	*pvalue = this->values[index];
+}
+/*}}}*/
+void BoolInput2::SetInput(int index,bool value){/*{{{*/
+
+	_assert_(index>=0); 
+	_assert_(index<this->size); 
+
+	this->values[index] = value;
+}
+/*}}}*/
+
+/*Object functions*/
Index: /issm/trunk-jpl/src/c/classes/Inputs2/BoolInput2.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/BoolInput2.h	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/BoolInput2.h	(revision 24335)
@@ -0,0 +1,35 @@
+#ifndef _BOOLINPUT2_H_
+#define _BOOLINPUT2_H_
+
+/*Headers:*/
+#include "./Input2.h"
+
+class BoolInput2: public Input2{
+
+	private:
+		int   size;
+		bool* values;
+
+	public:
+		/*BoolInput2 constructors, destructors: {{{*/
+		BoolInput2();
+		BoolInput2(int size_in);
+		~BoolInput2();
+		/*}}}*/
+		/*Object virtual functions definitions:{{{ */
+		Input2 *copy();
+		void    DeepEcho();
+		void    Echo();
+		int     Id();
+		void    Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
+		int     ObjectEnum();
+		/*}}}*/
+		/*BoolInput2 management: {{{*/
+		void GetInput(bool* pvalue,int index);
+		void SetInput(int index,bool value);
+		/*}}}*/
+		/*numerics: {{{*/
+		/*}}}*/
+
+};
+#endif  /* _BOOLINPUT_H */
Index: /issm/trunk-jpl/src/c/classes/Inputs2/ControlInput2.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/ControlInput2.cpp	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/ControlInput2.cpp	(revision 24335)
@@ -0,0 +1,209 @@
+/*!\file ControlInput2.c
+ * \brief: implementation of the ControlInput2 object
+ */
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "./ControlInput2.h"
+#include "./ElementInput2.h"
+#include "./TriaInput2.h"
+#include "./PentaInput2.h"
+//#include "../../toolkits/objects/Vector.h"
+
+/*ControlInput2 constructors and destructor*/
+ControlInput2::ControlInput2(){/*{{{*/
+	control_id  = 0;
+	values      = NULL;
+	savedvalues = NULL;
+	minvalues   = NULL;
+	maxvalues   = NULL;
+	gradient    = NULL;
+}
+/*}}}*/
+ControlInput2::ControlInput2(int nbe, int nbv,int input_layout_enum,int interp,int id){/*{{{*/
+
+	this->control_id  = id;
+	this->layout_enum = input_layout_enum;
+
+	_assert_(interp==P1Enum);
+
+	switch(this->layout_enum){
+		case TriaInput2Enum:
+			this->values     =new TriaInput2(nbe,nbv,interp);
+			this->savedvalues=new TriaInput2(nbe,nbv,interp);
+			this->minvalues  =new TriaInput2(nbe,nbv,interp);
+			this->maxvalues  =new TriaInput2(nbe,nbv,interp);
+			this->gradient   =new TriaInput2(nbe,nbv,interp);
+			break;
+		case PentaInput2Enum:
+			this->values     =new PentaInput2(nbe,nbv,interp);
+			this->savedvalues=new PentaInput2(nbe,nbv,interp);
+			this->minvalues  =new PentaInput2(nbe,nbv,interp);
+			this->maxvalues  =new PentaInput2(nbe,nbv,interp);
+			this->gradient   =new PentaInput2(nbe,nbv,interp);
+			break;
+		default:
+			_error_("Input of Enum \"" << EnumToStringx(input_layout_enum) << "\" not supported yet by ControlInput2");
+	}
+}
+/*}}}*/
+ControlInput2::~ControlInput2(){/*{{{*/
+	if(values)      delete values;
+	if(savedvalues) delete savedvalues;
+	if(minvalues)   delete minvalues;
+	if(maxvalues)   delete maxvalues;
+	if(gradient)    delete gradient;
+}
+/*}}}*/
+
+/*Object virtual functions definitions:*/
+Input2* ControlInput2::copy() {/*{{{*/
+
+	ControlInput2* output=NULL;
+
+	output = new ControlInput2();
+	output->enum_type=this->enum_type;
+	output->control_id=this->control_id;
+	output->layout_enum = this->control_id;
+
+	if(values)      output->values      = xDynamicCast<ElementInput2*>(this->values->copy());
+	if(savedvalues) output->savedvalues = xDynamicCast<ElementInput2*>(this->savedvalues->copy());
+	if(minvalues)   output->minvalues   = xDynamicCast<ElementInput2*>(this->minvalues->copy());
+	if(maxvalues)   output->maxvalues   = xDynamicCast<ElementInput2*>(this->maxvalues->copy());
+	if(gradient)    output->gradient    = xDynamicCast<ElementInput2*>(this->gradient->copy());
+
+	return output;
+}
+/*}}}*/
+void ControlInput2::DeepEcho(void){/*{{{*/
+
+	_printf_("ControlInput2:\n");
+	_printf_(setw(15)<<"   ControlInput2 "<<setw(25)<<left<<EnumToStringx(this->enum_type)<<"\n");
+	_printf_(setw(15)<<"   ControlInput2 "<<setw(25)<<left<<EnumToStringx(this->layout_enum)<<"\n");
+	_printf_("---values: \n");     if (values)      values->Echo();
+	_printf_("---savedvalues: \n");if (savedvalues) savedvalues->Echo();
+	_printf_("---minvalues: \n");  if (minvalues)   minvalues->Echo();
+	_printf_("---maxvalues: \n");  if (maxvalues)   maxvalues->Echo();
+	_printf_("---gradient: \n");   if (gradient){    gradient->Echo();} else{_printf_("     Not set yet\n");}
+}
+/*}}}*/
+void ControlInput2::Echo(void){/*{{{*/
+	this->DeepEcho();
+}
+/*}}}*/
+int  ControlInput2::Id(void){ return -1; }/*{{{*/
+/*}}}*/
+void ControlInput2::Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){ /*{{{*/
+
+	MARSHALLING_ENUM(ControlInput2Enum);
+	_error_("Not implemented");
+}
+/*}}}*/
+int  ControlInput2::ObjectEnum(void){/*{{{*/
+
+	return ControlInput2Enum;
+
+}
+/*}}}*/
+
+void ControlInput2::SetControl(int interp,int numindices,int* indices,IssmDouble* values_in,IssmDouble* values_min,IssmDouble* values_max){/*{{{*/
+
+	_assert_(this);
+
+	/*Set input*/
+	//TriaInput2* input = xDynamicCast<TriaInput2*>(this->inputs[id]);
+	this->values->SetInput(interp,numindices,indices,values_in);
+	this->minvalues->SetInput(interp,numindices,indices,values_min);
+	this->maxvalues->SetInput(interp,numindices,indices,values_max);
+}
+/*}}}*/
+void ControlInput2::SetGradient(int interp,int numindices,int* indices,IssmDouble* values_in){/*{{{*/
+
+	_assert_(this);
+	_assert_(this->gradient);
+	this->gradient->SetInput(interp,numindices,indices,values_in);
+}
+/*}}}*/
+void ControlInput2::SetGradient(int interp,int numindices,int* indices,IssmDouble* values_in,int n){/*{{{*/
+
+	if(this->values->ObjectEnum()!=TransientInput2Enum)_error_("you are in the wrong place, go home");
+	_assert_(this);
+	_assert_(this->gradient);
+	_error_("S");
+
+	//TransientInput2* transient_input = xDynamicCast<TransientInput2*>(this->gradient);
+	//TransientInput2* values_input    = xDynamicCast<TransientInput2*>(this->values);
+	//if(values_input->numtimesteps==transient_input->numtimesteps){
+	//	TransientInput* new_trans_input = new TransientInput2(ControlInputGradEnum);
+	//	IssmDouble time = transient_input->GetTimeByOffset(timestep);
+	//	for(int i=0;i<transient_input->numtimesteps;i++){
+	//		if(transient_input->timesteps[i]==time) new_trans_input->AddTimeInput(xDynamicCast<TriaInput*>(gradient_in),time);
+	//		else {
+	//			Input2* input = transient_input->GetTimeInput(transient_input->timesteps[i]);
+	//			new_trans_input->AddTimeInput(xDynamicCast<TriaInput2*>(input),transient_input->timesteps[i]);
+	//		}
+	//	}
+	//	this->gradient=new_trans_input;
+	//}
+	//else{
+	//	IssmDouble time = values_input->GetTimeByOffset(timestep);
+	//	transient_input->AddTimeInput(gradient_in,time);
+	//}
+
+
+	//NEW??
+	//this->gradient->SetInput(interp,numindices,indices,values_in);
+}
+/*}}}*/
+TriaInput2* ControlInput2::GetTriaInput(){/*{{{*/
+
+	/*Cast and return*/
+	if(this->values->ObjectEnum()!=TriaInput2Enum){
+		_error_("Cannot return a TriaInput2");
+	}
+	return xDynamicCast<TriaInput2*>(this->values);
+
+}
+/*}}}*/
+PentaInput2* ControlInput2::GetPentaInput(){/*{{{*/
+
+	/*Cast and return*/
+	if(this->values->ObjectEnum()!=PentaInput2Enum){
+		_error_("Cannot return a PentaInput2");
+	}
+	return xDynamicCast<PentaInput2*>(this->values);
+
+}
+/*}}}*/
+ElementInput2* ControlInput2::GetInput2(const char* data){/*{{{*/
+
+	if(strcmp(data,"value")==0){
+		_assert_(values);
+		return values;
+	}
+	else if(strcmp(data,"savedvalues")==0){
+		_assert_(savedvalues);
+		return values;
+	}
+	else if (strcmp(data,"lowerbound")==0){
+		_assert_(minvalues);
+		return minvalues;
+	}
+	else if (strcmp(data,"upperbound")==0){
+		_assert_(maxvalues);
+		return maxvalues;
+	}
+	else if (strcmp(data,"gradient")==0){
+		_assert_(gradient);
+		return gradient;
+	}
+	else{
+		_error_("Data " << data << " not supported yet");
+	}
+
+}
+/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Inputs2/ControlInput2.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/ControlInput2.h	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/ControlInput2.h	(revision 24335)
@@ -0,0 +1,47 @@
+/*! \file ControlInput2.h 
+ *  \brief: header file for triavertexinput object
+ */
+
+#ifndef _CONTROLINPUT2_H_
+#define _CONTROLINPUT2_H_
+
+/*Headers:*/
+#include "./Input2.h"
+class Gauss;
+class ElementInput2;
+
+class ControlInput2: public Input2{
+
+	public:
+		int            control_id;
+		int            enum_type;
+		int            layout_enum;
+		ElementInput2 *gradient;
+		ElementInput2 *maxvalues;
+		ElementInput2 *minvalues;
+		ElementInput2 *savedvalues;
+		ElementInput2 *values;
+
+		/*ControlInput2 constructors, destructors: {{{*/
+		ControlInput2();
+		ControlInput2(int nbe, int nbv,int input_layout_enum,int interp,int id);
+		~ControlInput2();
+		/*}}}*/
+		/*Object virtual functions definitions:{{{ */
+		Input2* copy();
+		void    DeepEcho();
+		void    Echo();
+		int     Id(); 
+		void    Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
+		int     ObjectEnum();
+		/*}}}*/
+		void SetInput(Input2* in_input){_error_("not impelemented");};
+		void SetInput(Input2* in_input,int timeoffset){_error_("not impelemented");};
+		ElementInput2* GetInput2(const char* data);
+		void SetControl(int interp,int numindices,int* indices,IssmDouble* values_in,IssmDouble* values_min,IssmDouble* values_max);
+		void SetGradient(int interp,int numindices,int* indices,IssmDouble* values_in);
+		void SetGradient(int interp,int numindices,int* indices,IssmDouble* values_in,int n);
+		TriaInput2* GetTriaInput();
+		PentaInput2* GetPentaInput();
+};
+#endif  /* _CONTROLINPUT_H */
Index: /issm/trunk-jpl/src/c/classes/Inputs2/DatasetInput2.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/DatasetInput2.cpp	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/DatasetInput2.cpp	(revision 24335)
@@ -0,0 +1,251 @@
+/*!\file DatasetInput2.c
+ * \brief: implementation of the datasetinput object
+ */
+/*Headers*/
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "./DatasetInput2.h"
+#include "./TriaInput2.h"
+#include "./PentaInput2.h"
+#include "./TransientInput2.h"
+
+/*DatasetInput2 constructors and destructor*/
+DatasetInput2::DatasetInput2(){/*{{{*/
+	this->inputs    = NULL;
+	this->numids    = 0;
+	this->ids       = NULL;
+	this->numberofelements_local = -1;
+	this->numberofvertices_local = -1;
+}
+/*}}}*/
+DatasetInput2::DatasetInput2(int nbe, int nbv){/*{{{*/
+	this->inputs    = NULL;
+	this->numids    = 0;
+	this->ids       = NULL;
+	this->numberofelements_local = nbe;
+	this->numberofvertices_local = nbv;
+}
+/*}}}*/
+DatasetInput2::~DatasetInput2(){/*{{{*/
+	xDelete<int>(this->ids);
+	for(int i=0;i<this->numids;i++){
+		delete this->inputs[i];
+	}
+	xDelete<Input2*>(this->inputs);
+}
+/*}}}*/
+
+/*Object virtual functions definitions:*/
+Input2* DatasetInput2::copy() {/*{{{*/
+
+	DatasetInput2* output=NULL;
+
+	output = new DatasetInput2();
+	output->numids=this->numids;
+	if(this->numids>0){
+		output->ids=xNew<int>(output->numids);
+		xMemCpy(output->ids,this->ids,output->numids);
+		output->inputs = xNew<Input2*>(this->numids);
+		for(int i=0;i<this->numids;i++){
+			output->inputs[i] = this->inputs[i]->copy();
+		}
+	}
+
+	return output;
+}
+/*}}}*/
+void DatasetInput2::Configure(Parameters* params){/*{{{*/
+	for(int i=0;i<this->numids;i++){
+		this->inputs[i]->Configure(params);
+	}
+}
+/*}}}*/
+void DatasetInput2::DeepEcho(void){/*{{{*/
+
+	_printf_("DatasetInput2:\n");
+	_printf_("   numids:"<< this->numids<< "\n");
+	_printf_("      ids: ");
+	for(int i=0;i<this->numids;i++) _printf_(this->ids[i]<<" ("<<EnumToStringx(this->ids[i])<<") ");
+	_printf_("\n");
+	//_printf_("   inputs: \n"); inputs->Echo();
+}
+/*}}}*/
+void DatasetInput2::Echo(void){/*{{{*/
+	this->DeepEcho();
+}
+/*}}}*/
+int  DatasetInput2::Id(void){ return -1; }/*{{{*/
+/*}}}*/
+void DatasetInput2::Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){ /*{{{*/
+
+	MARSHALLING_ENUM(DatasetInput2Enum);
+
+	MARSHALLING(numids);
+	MARSHALLING(this->numberofelements_local);
+	MARSHALLING(this->numberofvertices_local);
+	MARSHALLING_DYNAMIC(ids,int,numids);
+	//if (marshall_direction == MARSHALLING_BACKWARD) inputs = new Inputs();
+	//inputs->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+	_error_("not implemented");
+
+}
+/*}}}*/
+int  DatasetInput2::ObjectEnum(void){/*{{{*/
+	return DatasetInput2Enum;
+}/*}}}*/
+
+void DatasetInput2::SetTriaInput(int id,int interp_in,int numinds,int* rows,IssmDouble* values_in){ /*{{{*/
+
+	int  index = -1;
+	for(int i=0;i<this->numids;i++){
+		if(this->ids[i] == id) index = i;
+	}
+
+	/*Create new input if not found*/
+	if(index == -1){
+		int* new_ids = xNew<int>(this->numids+1);
+		if(this->numids) xMemCpy(new_ids,this->ids,this->numids);
+		new_ids[this->numids] = id;
+
+		Input2** new_inputs = xNew<Input2*>(this->numids+1);
+		if(this->numids) xMemCpy(new_inputs,this->inputs,this->numids);
+		new_inputs[this->numids] = new TriaInput2(this->numberofelements_local,this->numberofvertices_local,interp_in);
+		index = this->numids;
+
+		xDelete<int>(this->ids);
+		this->ids = new_ids;
+		xDelete<Input2*>(this->inputs);
+		this->inputs = new_inputs;
+
+		this->numids ++;
+	}
+
+	/*Set input*/
+	if(this->inputs[index]->ObjectEnum()!=TriaInput2Enum) _error_("cannot add Element values to a "<<EnumToStringx(this->inputs[index]->ObjectEnum()));
+	TriaInput2* input = xDynamicCast<TriaInput2*>(this->inputs[index]);
+	input->SetInput(interp_in,numinds,rows,values_in);
+
+}
+/*}}}*/
+void DatasetInput2::SetPentaInput(int id,int interp_in,int numinds,int* rows,IssmDouble* values_in){ /*{{{*/
+
+	int  index = -1;
+	for(int i=0;i<this->numids;i++){
+		if(this->ids[i] == id) index = i;
+	}
+
+	/*Create new input if not found*/
+	if(index == -1){
+		int* new_ids = xNew<int>(this->numids+1);
+		if(this->numids) xMemCpy(new_ids,this->ids,this->numids);
+		new_ids[this->numids] = id;
+
+		Input2** new_inputs = xNew<Input2*>(this->numids+1);
+		if(this->numids) xMemCpy(new_inputs,this->inputs,this->numids);
+		new_inputs[this->numids] = new PentaInput2(this->numberofelements_local,this->numberofvertices_local,interp_in);
+		index = this->numids;
+
+		xDelete<int>(this->ids);
+		this->ids = new_ids;
+		xDelete<Input2*>(this->inputs);
+		this->inputs = new_inputs;
+
+		this->numids ++;
+	}
+
+	/*Set input*/
+	if(this->inputs[index]->ObjectEnum()!=PentaInput2Enum) _error_("cannot add Element values to a "<<EnumToStringx(this->inputs[index]->ObjectEnum()));
+	PentaInput2* input = xDynamicCast<PentaInput2*>(this->inputs[index]);
+	input->SetInput(interp_in,numinds,rows,values_in);
+
+}
+/*}}}*/
+TransientInput2* DatasetInput2::SetTransientInput(int id,IssmDouble* times,int numtimes){ /*{{{*/
+
+	int  index = -1;
+	for(int i=0;i<this->numids;i++){
+		if(this->ids[i] == id) index = i;
+	}
+
+	/*Create new input if not found*/
+	if(index == -1){
+		int* new_ids = xNew<int>(this->numids+1);
+		if(this->numids) xMemCpy(new_ids,this->ids,this->numids);
+		new_ids[this->numids] = id;
+
+		Input2** new_inputs = xNew<Input2*>(this->numids+1);
+		if(this->numids) xMemCpy(new_inputs,this->inputs,this->numids);
+		new_inputs[this->numids] = new TransientInput2(NoneEnum,this->numberofelements_local,this->numberofvertices_local,times,numtimes);
+		index = this->numids;
+
+		xDelete<int>(this->ids);
+		this->ids = new_ids;
+		xDelete<Input2*>(this->inputs);
+		this->inputs = new_inputs;
+
+		this->numids ++;
+	}
+
+	/*Set input*/
+	if(this->inputs[index]->ObjectEnum()!=TransientInput2Enum) _error_("cannot add values to a "<<EnumToStringx(this->inputs[index]->ObjectEnum()));
+	TransientInput2* input = xDynamicCast<TransientInput2*>(this->inputs[index]);
+	return input;
+}
+/*}}}*/
+void DatasetInput2::GetInputValue(IssmDouble* pvalue,Gauss* gauss,int id){ /*{{{*/
+
+	int  index = -1;
+	for(int i=0;i<this->numids;i++){
+		if(this->ids[i] == id) index = i;
+	}
+
+	/*Create new input if not found*/
+	if(index == -1){
+		this->Echo();
+		_error_("Could not find input "<<id<<" ("<<EnumToStringx(id)<<") in DatasetInput");
+	}
+
+	Input2* input = this->inputs[index];
+
+	if(this->inputs[index]->ObjectEnum()==TransientInput2Enum){
+		input = xDynamicCast<TransientInput2*>(this->inputs[index])->current_input;
+	}
+
+	input->GetInputValue(pvalue,gauss);
+
+}
+/*}}}*/
+TriaInput2* DatasetInput2::GetTriaInputByOffset(int offset){/*{{{*/
+
+	_assert_(offset>=0 && offset<this->numids);
+	_assert_(this->inputs[offset]);
+
+	/*Cast and return*/
+	if(this->inputs[offset]->ObjectEnum()==TransientInput2Enum){
+		return xDynamicCast<TransientInput2*>(this->inputs[offset])->GetTriaInput();
+	}
+	if(this->inputs[offset]->ObjectEnum()!=TriaInput2Enum){
+		_error_("Cannot return a TriaInput2");
+	}
+	return xDynamicCast<TriaInput2*>(this->inputs[offset]);
+
+}/*}}}*/
+PentaInput2* DatasetInput2::GetPentaInputByOffset(int offset){/*{{{*/
+
+	_assert_(offset>=0 && offset<this->numids);
+	_assert_(this->inputs[offset]);
+
+	/*Cast and return*/
+	if(this->inputs[offset]->ObjectEnum()==TransientInput2Enum){
+		return xDynamicCast<TransientInput2*>(this->inputs[offset])->GetPentaInput();
+	}
+	if(this->inputs[offset]->ObjectEnum()!=PentaInput2Enum){
+		_error_("Cannot return a PentaInput2");
+	}
+	return xDynamicCast<PentaInput2*>(this->inputs[offset]);
+
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Inputs2/DatasetInput2.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/DatasetInput2.h	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/DatasetInput2.h	(revision 24335)
@@ -0,0 +1,47 @@
+/*! \file DatasetInput.h 
+ *  \brief: header file for datasetinput object
+ */
+
+#ifndef _DATASETINPUT2_H_
+#define _DATASETINPUT2_H_
+
+/*Headers:*/
+#include "./Input2.h"
+class TriaInput2;
+class PentaInput2;
+class TransientInput2;
+
+class DatasetInput2: public Input2{
+
+	private:
+		int             numids;
+		Input2        **inputs;
+		int            *ids;
+		int             numberofelements_local;
+		int             numberofvertices_local;
+		
+	public:
+		int GetNumIds() const {return this->numids;};
+		/*DatasetInput constructors, destructors: {{{*/
+		DatasetInput2();
+		DatasetInput2(int nbe, int nbv);
+		~DatasetInput2();
+		/*}}}*/
+		/*Object virtual functions definitions:{{{ */
+		Input2* copy();
+		void    Configure(Parameters* params);
+		void    DeepEcho();
+		void    Echo();
+		int     Id();
+		void    Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
+		int     ObjectEnum();
+		void    SetTriaInput(int interp_in,int numinds,int* rows,IssmDouble* values_in);
+		/*}}}*/
+		void SetTriaInput(int id,int interp_in,int numinds,int* rows,IssmDouble* values_in);
+		void SetPentaInput(int id,int interp_in,int numinds,int* rows,IssmDouble* values_in);
+		TransientInput2* SetTransientInput(int id,IssmDouble* times,int numtimes);
+		PentaInput2* GetPentaInputByOffset(int i);
+		TriaInput2*  GetTriaInputByOffset(int i);
+		void GetInputValue(IssmDouble* pvalue,Gauss* gauss,int index);
+};
+#endif  /* _DATASETINPUT2_H */
Index: /issm/trunk-jpl/src/c/classes/Inputs2/ElementInput2.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/ElementInput2.cpp	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/ElementInput2.cpp	(revision 24335)
@@ -0,0 +1,36 @@
+/*!\file ElementInput2.c
+ * \brief: implementation of the ElementInput2 object
+ */
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "../classes.h"
+#include "../../shared/shared.h"
+#include "./ElementInput2.h"
+
+/*ElementInput2 constructors and destructor*/
+ElementInput2::ElementInput2(){/*{{{*/
+	this->interpolation  = -1;
+	this->M              = -1;
+	this->N              = -1;
+	this->isserved       = false;
+	this->element_values = NULL;
+	this->values         = NULL;
+}
+/*}}}*/
+ElementInput2::~ElementInput2(){/*{{{*/
+	if(this->element_values) xDelete<IssmDouble>(this->element_values);
+	if(this->values)         xDelete<IssmDouble>(this->values);
+}
+/*}}}*/
+
+/*Numerics*/
+int ElementInput2::GetInputInterpolationType(void){/*{{{*/
+
+	return this->interpolation;
+
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Inputs2/ElementInput2.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/ElementInput2.h	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/ElementInput2.h	(revision 24335)
@@ -0,0 +1,46 @@
+#ifndef _ELEMENTINPUT2_H_
+#define _ELEMENTINPUT2_H_
+
+/*Headers:*/
+#include "./Input2.h"
+
+class ElementInput2: public Input2{
+
+	protected:
+		int         numberofelements_local;
+		int         numberofvertices_local;
+		int         interpolation;
+		int         M,N;
+		bool        isserved;
+		IssmDouble* values;
+
+	public:
+		IssmDouble* element_values;
+
+		/*ElementInput2 constructors, destructors*/ 
+		ElementInput2();
+		~ElementInput2();
+
+		int  GetInputInterpolationType();
+
+		/*Object virtual functions definitions:*/
+		virtual Input2 *copy()=0;
+		virtual void    DeepEcho()=0;
+		virtual void    Echo()=0;
+		virtual int     Id()=0;
+		virtual void    Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction)=0;
+		virtual int     ObjectEnum()=0;
+		/*Other*/
+		virtual void SetInput(int interp_in,int row,IssmDouble value_in)=0;
+		virtual void SetInput(int interp_in,int numinds,int* rows,IssmDouble* values_in)=0;
+		virtual void SetInput(int interp_in,int row,int numinds,IssmDouble* values_in)=0;
+		virtual int  GetInterpolation()=0;
+		virtual void GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, Gauss* gauss)=0;
+		virtual void GetInputValue(IssmDouble* pvalue,Gauss* gauss)=0;
+		virtual void Serve(int numindices,int* indices)=0;
+		virtual void Serve(int row,int numindices)=0;
+		virtual int  GetResultArraySize(void)=0;
+		virtual int  GetResultInterpolation(void)=0;
+		virtual int  GetResultNumberOfNodes(void)=0;
+};
+#endif  /* _ELEMENTINPUT_H */
Index: /issm/trunk-jpl/src/c/classes/Inputs2/Input2.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/Input2.h	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/Input2.h	(revision 24335)
@@ -0,0 +1,54 @@
+/*!\file:  Input2.h
+ * \brief abstract class for Input2 object
+ */ 
+
+#ifndef _INPUT2_H_
+#define _INPUT2_H_
+
+/*Headers:*/
+#include "../../shared/shared.h"
+#include "../../datastructures/Object.h"
+class Gauss;
+class Parameters;
+class SegInput2;
+class TriaInput2;
+class PentaInput2;
+template <class doubletype> class Vector;
+
+class Input2: public Object{
+
+	private:
+		int enum_type;
+	public:
+
+		/*Non virtual functions*/
+		int  InstanceEnum(){return this->enum_type;};
+		void ChangeEnum(int newenumtype){this->enum_type=newenumtype;};
+
+		/*Virtual functions*/
+		virtual ~Input2(){};
+		virtual void Configure(Parameters* parameters){return;};
+		virtual Input2* copy()=0;
+		//virtual void GetInput2AllTimeAverages(IssmDouble** pvalues,IssmDouble** ptimes, int* pnumtimes){_error_("Not implemented yet");};
+		virtual void  GetInputAverage(IssmDouble* pvalue){_error_("Not implemented yet");};
+		virtual IssmDouble GetInputMax(void){_error_("Not implemented yet");};
+		virtual IssmDouble GetInputMaxAbs(void){_error_("Not implemented yet");};
+		virtual IssmDouble GetInputMin(void){_error_("Not implemented yet");};
+		virtual void GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, Gauss* gauss){_error_("Not implemented yet");};
+		virtual void GetInputValue(IssmDouble* pvalue,Gauss* gauss){int* temp = xNew<int>(3); _error_("Not implemented yet");};
+		virtual int  GetInputInterpolationType(){_error_("Not implemented yet");};
+		virtual SegInput2*   GetSegInput(){ int* temp = xNew<int>(3); this->Echo(); _error_("Not implemented yet");};
+		virtual TriaInput2*  GetTriaInput(){ int* temp = xNew<int>(3); this->Echo(); _error_("Not implemented yet");};
+		virtual PentaInput2* GetPentaInput(){int* temp = xNew<int>(3); this->Echo(); _error_("Not implemented yet");};
+		//virtual void GetInput2UpToCurrentTimeAverages(IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime){_error_("Not implemented yet");};
+
+		virtual void   AXPY(Input2* xinput,IssmDouble scalar){_error_("Not implemented yet");};
+		virtual void   Scale(IssmDouble scale_factor){_error_("Not implemented yet");};
+
+		virtual int  GetResultArraySize(void){_error_("Not implemented yet");};
+		virtual int  GetResultInterpolation(void){_error_("Not implemented yet");};
+		virtual int  GetResultNumberOfNodes(void){_error_("Not implemented yet");};
+		//virtual void ResultToMatrix(IssmDouble* values,int ncols,int sid){_error_("not supported yet");};
+		//virtual void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");}; 
+};
+#endif
Index: /issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.cpp	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.cpp	(revision 24335)
@@ -0,0 +1,779 @@
+/*\file Inputs.cpp
+ * \brief: Implementation of the Inputs class, derived from DataSet class.
+ */
+
+/*Headers: {{{*/
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "./Input2.h"
+#include "./Inputs2.h"
+
+#include "./BoolInput2.h"
+#include "./IntInput2.h"
+#include "./ElementInput2.h"
+#include "./SegInput2.h"
+#include "./TriaInput2.h"
+#include "./PentaInput2.h"
+#include "./TransientInput2.h"
+#include "./ControlInput2.h"
+#include "./DatasetInput2.h"
+#include "./ArrayInput2.h"
+using namespace std;
+/*}}}*/
+
+/*Object constructors and destructor*/
+Inputs2::Inputs2(void){/*{{{*/
+
+	this->numberofelements_local = 0;
+	this->numberofvertices_local = 0;
+
+	/*Initialize pointers*/
+	for(int i=0;i<NUMINPUTS;i++) this->inputs[i] = NULL;
+}
+/*}}}*/
+Inputs2::Inputs2(int nbe,int nbv){/*{{{*/
+
+	this->numberofelements_local = nbe;
+	this->numberofvertices_local = nbv;
+
+	/*Initialize pointers*/
+	for(int i=0;i<NUMINPUTS;i++) this->inputs[i] = NULL;
+}
+/*}}}*/
+Inputs2::~Inputs2(){/*{{{*/
+	for(int i=0;i<NUMINPUTS;i++){
+		if(this->inputs[i]) delete this->inputs[i];
+	}
+	return;
+}
+/*}}}*/
+
+Inputs2* Inputs2::Copy(void){/*{{{*/
+
+	Inputs2* output = new Inputs2(this->numberofelements_local,this->numberofvertices_local);
+
+	for(int i=0;i<NUMINPUTS;i++){
+		if(this->inputs[i]) output->inputs[i]=this->inputs[i]->copy();
+	}
+
+	return output;
+}/*}}}*/
+void Inputs2::DeepEcho(void){/*{{{*/
+	for(int i=0;i<NUMINPUTS;i++) {
+		if(this->inputs[i]) this->inputs[i]->DeepEcho();
+	}
+	return;
+}
+/*}}}*/
+void Inputs2::Echo(void){/*{{{*/
+	_printf_("Inputs Echo:\n");
+	for(int i=0;i<NUMINPUTS;i++) {
+		if(this->inputs[i]) _printf_(setw(25)<<EnumToStringx(i+InputsSTARTEnum+1)<<": set as "<<EnumToStringx(this->inputs[i]->ObjectEnum())<<"\n");
+	}
+	return;
+}
+/*}}}*/
+void Inputs2::Marshall(char** pmarshalled_data, int* pmarshalled_data_size, int marshall_direction){/*{{{*/
+
+	int obj_enum=-1;
+	int num_inputs2=0;
+	int index;
+
+	MARSHALLING_ENUM(Inputs2Enum);
+
+	if(marshall_direction==MARSHALLING_FORWARD || marshall_direction==MARSHALLING_SIZE){
+
+		/*Marshall num_inputs2 first*/
+		for(int i=0;i<NUMINPUTS;i++){
+			if(this->inputs[i]) num_inputs2++;
+		}
+		MARSHALLING(num_inputs2);
+
+		/*Marshall Parameters one by one now*/
+		for(int i=0;i<NUMINPUTS;i++){
+			if(this->inputs[i]){
+				obj_enum = this->inputs[i]->ObjectEnum();
+				MARSHALLING(i);
+				MARSHALLING(obj_enum);
+				this->inputs[i]->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			}
+		}
+	}
+	else{
+
+		/*Get number of inputs2 marshalled*/
+		MARSHALLING(num_inputs2);
+
+		/*Recover input2eters one by one*/
+		for(int i=0;i<num_inputs2;i++){
+
+			/*Recover enum of object first: */
+			MARSHALLING(index);
+			MARSHALLING(obj_enum);
+
+			if(obj_enum==BoolInput2Enum){
+				BoolInput2* boolinput2=new BoolInput2();
+				boolinput2->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+				this->inputs[index]=boolinput2;
+			}
+			else if(obj_enum==IntInput2Enum){
+				IntInput2* intinput2=new IntInput2();
+				intinput2->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+				this->inputs[index]=intinput2;
+			}
+			else if(obj_enum==TriaInput2Enum){
+				TriaInput2* triainput2=new TriaInput2();
+				triainput2->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+				this->inputs[index]=triainput2;
+			}
+			else if(obj_enum==PentaInput2Enum){
+				PentaInput2* pentainput2=new PentaInput2();
+				pentainput2->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+				this->inputs[index]=pentainput2;
+			}
+			else{
+				_error_("input "<<EnumToStringx(obj_enum)<<" not supported");
+			}
+		}
+	}
+}
+/*}}}*/
+
+void Inputs2::AddInput(Input2* newinput){/*{{{*/
+
+	/*Get Enum from Param*/
+	_assert_(newinput);
+	int input_enum = newinput->InstanceEnum();
+
+	/*Get index in array*/
+	#ifdef _ISSM_DEBUG_
+	if(input_enum<=InputsSTARTEnum) _error_("Cannot add input: Enum "<<EnumToStringx(input_enum)<<" should appear after InputsSTARTEnum");
+	if(input_enum>=InputsENDEnum)   _error_("Cannot add input: Enum "<<EnumToStringx(input_enum)<<" should appear before InputsENDEnum");
+	#endif
+	int index = input_enum - InputsSTARTEnum -1;
+
+	/*Delete input if it already exists*/
+	if(this->inputs[index]){
+		delete this->inputs[index];
+		this->inputs[index] = NULL;
+	}
+
+	/*Add input to array*/
+	this->inputs[index] = newinput;
+}
+/*}}}*/
+void Inputs2::ChangeEnum(int oldenumtype,int newenumtype){/*{{{*/
+
+	/*Get indices from enums*/
+	int index_old = EnumToIndex(oldenumtype);
+	int index_new = EnumToIndex(newenumtype);
+
+	/*Delete input if it already exists*/
+	if(this->inputs[index_new]) delete this->inputs[index_new];
+
+	/*Make sure that old one exists*/
+	if(!this->inputs[index_old]){
+		_error_("Input "<<EnumToStringx(oldenumtype)<<" not found");
+	}
+
+	/*Replace Enums*/
+	this->inputs[index_old]->ChangeEnum(newenumtype);
+	this->inputs[index_new] = this->inputs[index_old];
+	this->inputs[index_old] = NULL;
+}/*}}}*/
+void Inputs2::Configure(Parameters* parameters){/*{{{*/
+	for(int i=0;i<NUMINPUTS;i++){
+		if(this->inputs[i]) this->inputs[i]->Configure(parameters);
+	}
+}
+/*}}}*/
+int  Inputs2::DeleteInput(int input_enum){/*{{{*/
+
+	int index = EnumToIndex(input_enum);
+	if(this->inputs[index]){
+		delete this->inputs[index];
+		this->inputs[index] = NULL;
+	}
+
+	return 1;
+}
+/*}}}*/
+void Inputs2::DuplicateInput(int original_enum,int new_enum){/*{{{*/
+
+	_assert_(this);
+
+	/*Get indices from enums*/
+	int index_ori = EnumToIndex(original_enum);
+	int index_new = EnumToIndex(new_enum);
+
+	/*Delete input if it already exists*/
+	if(this->inputs[index_new]) delete this->inputs[index_new];
+
+	/*Make sure that old one exists*/
+	if(!this->inputs[index_ori]){
+		_error_("Input "<<EnumToStringx(original_enum)<<" not found");
+	}
+
+	/*Make a copy*/
+	Input2* copy=this->inputs[index_ori]->copy();
+
+	/*Add copy*/
+	this->inputs[index_new] = copy;
+}
+/*}}}*/
+int  Inputs2::EnumToIndex(int enum_in){/*{{{*/
+
+	_assert_(this);
+
+	/*Make sure this parameter is at the right place*/
+	#ifdef _ISSM_DEBUG_
+	if(enum_in<=InputsSTARTEnum) _error_("Enum "<<EnumToStringx(enum_in)<<" should appear after InputsSTARTEnum");
+	if(enum_in>=InputsENDEnum)   _error_("Enum "<<EnumToStringx(enum_in)<<" should appear before InputsENDEnum");
+	#endif
+	return enum_in - InputsSTARTEnum -1;
+}/*}}}*/
+bool Inputs2::Exist(int enum_in){/*{{{*/
+
+	_assert_(this);
+
+	int index = EnumToIndex(enum_in);
+	if(this->inputs[index]) return true;
+	return false;
+}
+/*}}}*/
+SegInput2* Inputs2::GetSegInput(int enum_in){/*{{{*/
+
+	_assert_(this);
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Check that it has the right format*/
+	Input2* input = this->inputs[id];
+	if(!input) return NULL;
+
+	return input->GetSegInput();
+}/*}}}*/
+TriaInput2* Inputs2::GetTriaInput(int enum_in){/*{{{*/
+
+	_assert_(this);
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Check that it has the right format*/
+	Input2* input = this->inputs[id];
+	if(!input) return NULL;
+
+	return input->GetTriaInput();
+}/*}}}*/
+TriaInput2* Inputs2::GetTriaInput(int enum_in,IssmDouble time){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Check that it has the right format*/
+	Input2* input = this->inputs[id];
+	if(!input) return NULL;
+
+	if(input->ObjectEnum()==TransientInput2Enum){
+		return xDynamicCast<TransientInput2*>(input)->GetTriaInput(time);
+	}
+	else{
+		return input->GetTriaInput();
+	}
+}/*}}}*/
+PentaInput2* Inputs2::GetPentaInput(int enum_in){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Check that it has the right format*/
+	Input2* input = this->inputs[id];
+	if(!input) return NULL;
+
+	return input->GetPentaInput();
+}/*}}}*/
+PentaInput2* Inputs2::GetPentaInput(int enum_in,IssmDouble time){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Check that it has the right format*/
+	Input2* input = this->inputs[id];
+	if(!input) return NULL;
+
+	if(input->ObjectEnum()==TransientInput2Enum){
+		return xDynamicCast<TransientInput2*>(input)->GetPentaInput(time);
+	}
+	else{
+		return input->GetPentaInput();
+	}
+}/*}}}*/
+TransientInput2* Inputs2::GetTransientInput(int enum_in){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Check that it has the right format*/
+	Input2* input = this->inputs[id];
+	if(!input) return NULL;
+
+	if(input->ObjectEnum() != TransientInput2Enum){
+		_error_("Input "<<EnumToStringx(enum_in)<<" is not an TransientInput2");
+	}
+
+	/*Cast and return*/
+	TransientInput2* output = xDynamicCast<TransientInput2*>(input);
+	return output;
+}/*}}}*/
+ElementInput2* Inputs2::GetControlInput2Data(int enum_in,const char* data){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Check that it has the right format*/
+	Input2* input = this->inputs[id];
+	if(!input) return NULL;
+	if(input->ObjectEnum() != ControlInput2Enum){
+		_error_("Input "<<EnumToStringx(enum_in)<<" is not an ControlInput2");
+	}
+
+	/*Cast and return*/
+	return xDynamicCast<ControlInput2*>(input)->GetInput2(data);
+}/*}}}*/
+DatasetInput2* Inputs2::GetDatasetInput2(int enum_in){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Check that it has the right format*/
+	Input2* input = this->inputs[id];
+	if(!input) return NULL;
+	if(input->ObjectEnum() != DatasetInput2Enum){
+		_error_("Input "<<EnumToStringx(enum_in)<<" is not an DatasetInput2");
+	}
+
+	/*Cast and return*/
+	return xDynamicCast<DatasetInput2*>(input);
+}/*}}}*/
+ControlInput2* Inputs2::GetControlInput2(int enum_in){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Check that it has the right format*/
+	Input2* input = this->inputs[id];
+	if(!input) return NULL;
+	if(input->ObjectEnum() != ControlInput2Enum){
+		_error_("Input "<<EnumToStringx(enum_in)<<" is not an ControlInput2");
+	}
+
+	/*Cast and return*/
+	return xDynamicCast<ControlInput2*>(input);
+}/*}}}*/
+void Inputs2::GetInputValue(bool* pvalue,int enum_in,int index){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=BoolInput2Enum) _error_(EnumToStringx(this->inputs[id]->ObjectEnum())<<" cannot return a bool");
+	}
+	else{
+		_error_("Input "<<EnumToStringx(enum_in)<<" not found");
+	}
+
+	/*Set input*/
+	BoolInput2* input = xDynamicCast<BoolInput2*>(this->inputs[id]);
+	input->GetInput(pvalue,index);
+}/*}}}*/
+void Inputs2::GetInputValue(int* pvalue,int enum_in,int index){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=IntInput2Enum) _error_(EnumToStringx(this->inputs[id]->ObjectEnum())<<" cannot return a int");
+	}
+	else{
+		int* temp = xNew<int>(3);
+		_error_("Input "<<EnumToStringx(enum_in)<<" not found");
+	}
+
+	/*Set input*/
+	IntInput2* input = xDynamicCast<IntInput2*>(this->inputs[id]);
+	input->GetInput(pvalue,index);
+}/*}}}*/
+void Inputs2::ResultInterpolation(int* pinterpolation,int* pnodesperelement,int* parray_size, int output_enum){/*{{{*/
+
+	/*Get input */
+	int     index = EnumToIndex(output_enum);
+	Input2* input = this->inputs[index];
+
+	/*Check that it is found*/
+	if(!input){
+		_error_("Input "<<EnumToStringx(output_enum)<<" not found and cannot be added to model results");
+	}
+
+	/*Assign output pointer*/
+	*pinterpolation   = input->GetResultInterpolation();
+	*pnodesperelement = input->GetResultNumberOfNodes();
+	*parray_size      = input->GetResultArraySize();
+}/*}}}*/
+void Inputs2::SetInput(int enum_in,int index,bool value){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=BoolInput2Enum) _error_("cannot add a bool to a "<<EnumToStringx(this->inputs[id]->ObjectEnum()));
+	}
+	else{
+		this->inputs[id] = new BoolInput2(this->numberofelements_local);
+	}
+
+	/*Set input*/
+	BoolInput2* input = xDynamicCast<BoolInput2*>(this->inputs[id]);
+	input->SetInput(index,value);
+}/*}}}*/
+void Inputs2::SetInput(int enum_in,int index,int value){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=IntInput2Enum) _error_("cannot add an int to a "<<EnumToStringx(this->inputs[id]->ObjectEnum()));
+	}
+	else{
+		this->inputs[id] = new IntInput2(this->numberofelements_local);
+	}
+
+	/*Set input*/
+	IntInput2* input = xDynamicCast<IntInput2*>(this->inputs[id]);
+	input->SetInput(index,value);
+}/*}}}*/
+void Inputs2::SetArrayInput(int enum_in,int row,IssmDouble* values,int numlayers){/*{{{*/
+
+	bool recreate = false;
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=ArrayInput2Enum){
+			delete this->inputs[id];
+			recreate = true;
+		}
+	}
+	else{
+		recreate = true;
+	}
+
+	if(recreate){
+		this->inputs[id] = new ArrayInput2(this->numberofelements_local,numlayers);
+	}
+
+	/*Set input*/
+	ArrayInput2* input = xDynamicCast<ArrayInput2*>(this->inputs[id]);
+	input->SetInput(row,numlayers,values);
+}/*}}}*/
+TransientInput2* Inputs2::SetDatasetTransientInput(int enum_in,int dataset_id,IssmDouble* times,int numtimes){/*{{{*/
+
+	bool recreate = false;
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=DatasetInput2Enum){
+			delete this->inputs[id];
+			recreate = true;
+		}
+	}
+	else{
+		recreate = true;
+	}
+
+	if(recreate){
+		this->inputs[id] = new DatasetInput2(this->numberofelements_local,this->numberofvertices_local);
+	}
+
+	/*Get Dataset Input now*/
+	DatasetInput2* input = xDynamicCast<DatasetInput2*>(this->inputs[id]);
+
+	/*Create and return transient input*/
+	return input->SetTransientInput(dataset_id,times,numtimes);
+}/*}}}*/
+void Inputs2::SetTransientInput(int enum_in,IssmDouble* times,int numtimes){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		/*Input already there, make sure it is the right type*/
+		if(this->inputs[id]->ObjectEnum()!=TransientInput2Enum){
+			_error_("cannot add a TransientInput to a "<<EnumToStringx(this->inputs[id]->ObjectEnum()));
+		}
+	}
+	else{
+		this->inputs[id] = new TransientInput2(enum_in,this->numberofelements_local,this->numberofvertices_local,times,numtimes);
+	}
+}/*}}}*/
+void Inputs2::SetTriaControlInput(int enum_in,int layout,int interpolation,int control_id,int numindices,int* indices,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max){/*{{{*/
+
+	bool recreate = false;
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=ControlInput2Enum){
+			delete this->inputs[id];
+			recreate = true;
+		}
+	}
+	else{
+		recreate = true;
+	}
+
+	if(recreate){
+		this->inputs[id] = new ControlInput2(this->numberofelements_local,this->numberofvertices_local,layout,interpolation,control_id);
+	}
+
+	/*Set input*/
+	ControlInput2* input = xDynamicCast<ControlInput2*>(this->inputs[id]);
+	input->SetControl(interpolation,numindices,indices,values,values_min,values_max);
+}/*}}}*/
+void Inputs2::SetTriaControlInputGradient(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(!this->inputs[id]) _error_("could not find Input "<<EnumToStringx(enum_in));
+	if( this->inputs[id]->ObjectEnum()!=ControlInput2Enum) _error_("Input "<<EnumToStringx(enum_in)<<" is not a ControlInput2");
+
+	/*Set input*/
+	ControlInput2* input = xDynamicCast<ControlInput2*>(this->inputs[id]);
+	input->SetGradient(interpolation,numindices,indices,values);
+}/*}}}*/
+void Inputs2::SetTriaControlInputGradient(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values,int n){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(!this->inputs[id]) _error_("could not find Input "<<EnumToStringx(enum_in));
+	if( this->inputs[id]->ObjectEnum()!=ControlInput2Enum) _error_("Input "<<EnumToStringx(enum_in)<<" is not a ControlInput2");
+
+	/*Set input*/
+	ControlInput2* input = xDynamicCast<ControlInput2*>(this->inputs[id]);
+	input->SetGradient(interpolation,numindices,indices,values,n);
+}/*}}}*/
+void Inputs2::SetTriaDatasetInput(int enum_in,int id_in,int interpolation,int numindices,int* indices,IssmDouble* values){/*{{{*/
+
+	bool recreate = false;
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=DatasetInput2Enum){
+			delete this->inputs[id];
+			recreate = true;
+		}
+	}
+	else{
+		recreate = true;
+	}
+
+	if(recreate){
+		this->inputs[id] = new DatasetInput2(this->numberofelements_local,this->numberofvertices_local);
+	}
+
+	/*Set input*/
+	DatasetInput2* input = xDynamicCast<DatasetInput2*>(this->inputs[id]);
+	input->SetTriaInput(id_in,P1Enum,numindices,indices,values);
+}/*}}}*/
+void Inputs2::SetTriaInput(int enum_in,int interpolation,int row,IssmDouble value){/*{{{*/
+
+	/*This one only supports P0 and P1 because it assumes col=0*/
+	_assert_(interpolation==P0Enum || interpolation==P1Enum); 
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=TriaInput2Enum) _error_("cannot add a bool to a "<<EnumToStringx(this->inputs[id]->ObjectEnum()));
+	}
+	else{
+		this->inputs[id] = new TriaInput2(this->numberofelements_local,this->numberofvertices_local,interpolation);
+	}
+
+	/*Set input*/
+	TriaInput2* input = xDynamicCast<TriaInput2*>(this->inputs[id]);
+	input->SetInput(interpolation,row,value);
+}/*}}}*/
+void Inputs2::SetTriaInput(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=TriaInput2Enum) _error_("cannot add Element values to a "<<EnumToStringx(this->inputs[id]->ObjectEnum()));
+	}
+	else{
+		this->inputs[id] = new TriaInput2(this->numberofelements_local,this->numberofvertices_local,interpolation);
+	}
+
+	/*Set input*/
+	TriaInput2* input = xDynamicCast<TriaInput2*>(this->inputs[id]);
+	input->SetInput(interpolation,numindices,indices,values);
+}/*}}}*/
+void Inputs2::SetTriaInput(int enum_in,int interpolation,int row,int numindices,IssmDouble* values){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=TriaInput2Enum) _error_("cannot add Element values to a "<<EnumToStringx(this->inputs[id]->ObjectEnum()));
+	}
+	else{
+		this->inputs[id] = new TriaInput2(this->numberofelements_local,this->numberofvertices_local,interpolation);
+	}
+
+	/*Set input*/
+	TriaInput2* input = xDynamicCast<TriaInput2*>(this->inputs[id]);
+	input->SetInput(interpolation,row,numindices,values);
+}/*}}}*/
+void Inputs2::SetPentaControlInput(int enum_in,int layout,int interpolation,int control_id,int numindices,int* indices,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max){/*{{{*/
+
+	bool recreate = false;
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=ControlInput2Enum){
+			delete this->inputs[id];
+			recreate = true;
+		}
+	}
+	else{
+		recreate = true;
+	}
+
+	if(recreate){
+		this->inputs[id] = new ControlInput2(this->numberofelements_local,this->numberofvertices_local,layout,interpolation,control_id);
+	}
+
+	/*Set input*/
+	ControlInput2* input = xDynamicCast<ControlInput2*>(this->inputs[id]);
+	input->SetControl(interpolation,numindices,indices,values,values_min,values_max);
+}/*}}}*/
+void Inputs2::SetPentaControlInputGradient(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(!this->inputs[id]) _error_("could not find Input "<<EnumToStringx(enum_in));
+	if( this->inputs[id]->ObjectEnum()!=ControlInput2Enum) _error_("Input "<<EnumToStringx(enum_in)<<" is not a ControlInput2");
+
+	/*Set input*/
+	ControlInput2* input = xDynamicCast<ControlInput2*>(this->inputs[id]);
+	input->SetGradient(interpolation,numindices,indices,values);
+}/*}}}*/
+void Inputs2::SetPentaDatasetInput(int enum_in,int id_in,int interpolation,int numindices,int* indices,IssmDouble* values){/*{{{*/
+
+	bool recreate = false;
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=DatasetInput2Enum){
+			delete this->inputs[id];
+			recreate = true;
+		}
+	}
+	else{
+		recreate = true;
+	}
+
+	if(recreate){
+		this->inputs[id] = new DatasetInput2(this->numberofelements_local,this->numberofvertices_local);
+	}
+
+	/*Set input*/
+	DatasetInput2* input = xDynamicCast<DatasetInput2*>(this->inputs[id]);
+	input->SetPentaInput(id_in,P1Enum,numindices,indices,values);
+}/*}}}*/
+void Inputs2::SetPentaInput(int enum_in,int interpolation,int row,IssmDouble value){/*{{{*/
+
+	/*This one only supports P0 and P1 because it assumes col=0*/
+	_assert_(interpolation==P0Enum || interpolation==P1Enum); 
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=PentaInput2Enum) _error_("cannot add a bool to a "<<EnumToStringx(this->inputs[id]->ObjectEnum()));
+	}
+	else{
+		this->inputs[id] = new PentaInput2(this->numberofelements_local,this->numberofvertices_local,interpolation);
+	}
+
+	/*Set input*/
+	PentaInput2* input = xDynamicCast<PentaInput2*>(this->inputs[id]);
+	input->SetInput(interpolation,row,value);
+}/*}}}*/
+void Inputs2::SetPentaInput(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=PentaInput2Enum) _error_("cannot add Element values to a "<<EnumToStringx(this->inputs[id]->ObjectEnum()));
+	}
+	else{
+		this->inputs[id] = new PentaInput2(this->numberofelements_local,this->numberofvertices_local,interpolation);
+	}
+
+	/*Set input*/
+	PentaInput2* input = xDynamicCast<PentaInput2*>(this->inputs[id]);
+	input->SetInput(interpolation,numindices,indices,values);
+}/*}}}*/
+void Inputs2::SetPentaInput(int enum_in,int interpolation,int row,int numindices,IssmDouble* values){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=PentaInput2Enum) _error_("cannot add Element values to a "<<EnumToStringx(this->inputs[id]->ObjectEnum()));
+	}
+	else{
+		this->inputs[id] = new PentaInput2(this->numberofelements_local,this->numberofvertices_local,interpolation);
+	}
+
+	/*Set input*/
+	PentaInput2* input = xDynamicCast<PentaInput2*>(this->inputs[id]);
+	input->SetInput(interpolation,row,numindices,values);
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.h	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.h	(revision 24335)
@@ -0,0 +1,84 @@
+#ifndef _CONTAINER_INPUTS2_H_
+#define _CONTAINER_INPUTS2_H_
+
+/*forward declarations */
+class Input2;
+class SegInput2;
+class TriaInput2;
+class PentaInput2;
+class TransientInput2;
+class ElementInput2;
+class DatasetInput2;
+class ArrayInput2;
+class ControlInput2;
+class Parameters;
+#include "../../shared/shared.h"
+
+#define NUMINPUTS InputsENDEnum - InputsSTARTEnum -1
+
+/*!\brief Declaration of Inputs class.  
+ *
+ * Declaration of Inputs class.  Inputs are a static array of Input objects.
+ */ 
+class Inputs2{
+
+	private:
+		/*Private fields*/
+		Input2* inputs[NUMINPUTS];
+		int     numberofelements_local;
+		int     numberofvertices_local;
+
+		/*Private functions*/
+		int     EnumToIndex(int enum_in);
+
+	public:
+
+		/*constructors, destructors*/
+		Inputs2();
+		Inputs2(int nbe,int nbv);
+		~Inputs2();
+
+		/*numerics*/
+		void     AddInput(Input2* in_input);
+		void     ChangeEnum(int enumtype,int new_enumtype);
+		void     Configure(Parameters* parameters);
+		Inputs2* Copy(void);
+		int      DeleteInput(int enum_type);
+		void     DuplicateInput(int original_enum,int new_enum);
+		void     DeepEcho(void);
+		void     Echo(void);
+		bool     Exist(int enum_type);
+		SegInput2*       GetSegInput(int enum_type);
+		TriaInput2*      GetTriaInput(int enum_type);
+		TriaInput2*      GetTriaInput(int enum_type,IssmDouble time);
+		PentaInput2*     GetPentaInput(int enum_type);
+		PentaInput2*     GetPentaInput(int enum_type,IssmDouble time);
+		TransientInput2* GetTransientInput(int enum_type);
+		ElementInput2*   GetControlInput2Data(int enum_type,const char* data);
+		DatasetInput2*   GetDatasetInput2(int enum_type);
+		ControlInput2*   GetControlInput2(int enum_type);
+		void  Marshall(char** pmarshalled_data, int* pmarshalled_data_size, int marshall_direction);
+		void  GetInputValue(bool* pvalue,int enum_in,int index);
+		void  GetInputValue(int*  pvalue,int enum_in,int index);
+		void  ResultInterpolation(int* pinterpolation,int*nodesperelement,int* parray_size, int output_enum);
+		void  SetInput(int enum_in,int index,bool value);
+		void  SetInput(int enum_in,int index,int value);
+		void  SetTransientInput(int enum_in,IssmDouble* times,int numtimes);
+		TransientInput2* SetDatasetTransientInput(int enum_in,int id,IssmDouble* times,int numtimes);
+		void  SetArrayInput(int enum_in,int row,IssmDouble* layers,int numlayers);
+		void  SetTriaControlInput(int enum_in,int layout,int interpolation,int id,int numindices,int* indices,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max);
+		void  SetTriaControlInputGradient(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values);
+		void  SetTriaControlInputGradient(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values,int n);
+		void  SetTriaDatasetInput(int enum_in,int id,int interpolation,int numindices,int* indices,IssmDouble* values);
+		void  SetTriaInput(int enum_in,int interpolation,int row,IssmDouble values);
+		void  SetTriaInput(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values);
+		void  SetTriaInput(int enum_in,int interpolation,int row,int numindices,IssmDouble* values);
+		void  SetPentaControlInput(int enum_in,int layout,int interpolation,int id,int numindices,int* indices,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max);
+		void  SetPentaControlInputGradient(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values);
+		void  SetPentaDatasetInput(int enum_in,int id,int interpolation,int numindices,int* indices,IssmDouble* values);
+		void  SetPentaInput(int enum_in,int interpolation,int row,IssmDouble values);
+		void  SetPentaInput(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values);
+		void  SetPentaInput(int enum_in,int interpolation,int row,int numindices,IssmDouble* values);
+};
+
+#endif //ifndef _INPUTS_H_
Index: /issm/trunk-jpl/src/c/classes/Inputs2/IntInput2.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/IntInput2.cpp	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/IntInput2.cpp	(revision 24335)
@@ -0,0 +1,97 @@
+/*!\file IntInput2.c
+ * \brief: implementation of the IntInput2 object
+ */
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "../classes.h"
+#include "../../shared/shared.h"
+#include "./IntInput2.h"
+
+/*IntInput2 constructors and destructor*/
+IntInput2::IntInput2(){/*{{{*/
+	this->size   = -1;
+	this->values = NULL;
+}
+/*}}}*/
+IntInput2::IntInput2(int size_in){/*{{{*/
+	_assert_(size_in>0);
+	_assert_(size_in<1e11);
+	this->size   = size_in;
+	this->values = xNew<int>(size_in);
+}
+/*}}}*/
+IntInput2::~IntInput2(){/*{{{*/
+	xDelete<int>(this->values);
+}
+/*}}}*/
+
+/*Object virtual functions definitions:*/
+Input2* IntInput2::copy() {/*{{{*/
+
+	IntInput2* output = new IntInput2(this->size);
+	xMemCpy<int>(output->values,this->values,this->size);
+
+	return output;
+}
+/*}}}*/
+void IntInput2::DeepEcho(void){/*{{{*/
+
+	_printf_("IntInput2 Echo:\n");
+	_printf_("   Size:          "<<size<<"\n");
+	printarray(this->values,this->size);
+	//_printf_(setw(15)<<"   IntInput2 "<<setw(25)<<left<<EnumToStringx(this->enum_type)<<" "<<(value?"true":"false") << "\n");
+}
+/*}}}*/
+void IntInput2::Echo(void){/*{{{*/
+	this->DeepEcho();
+}
+/*}}}*/
+int  IntInput2::Id(void){ return -1; }/*{{{*/
+/*}}}*/
+void IntInput2::Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){ /*{{{*/
+
+	MARSHALLING_ENUM(IntInput2Enum);
+
+	MARSHALLING(this->size);
+	if(this->size > 0){
+		MARSHALLING_DYNAMIC(this->values,int,this->size)
+	}
+	else this->values = NULL;
+
+}
+/*}}}*/
+int  IntInput2::ObjectEnum(void){/*{{{*/
+
+	return IntInput2Enum;
+
+}
+/*}}}*/
+
+/*IntInput2 management*/
+void IntInput2::GetInput(int* pvalue,int index){/*{{{*/
+
+	if(index<0){
+		printf("-------------- file: IntInput2.cpp line: %i\n",__LINE__); 
+		int* temp = xNew<int>(3);
+	}
+	_assert_(index>=0); 
+	_assert_(index<this->size); 
+
+	*pvalue = this->values[index];
+}
+/*}}}*/
+void IntInput2::SetInput(int index,int value){/*{{{*/
+
+	_assert_(index>=0); 
+	_assert_(index<this->size); 
+
+	this->values[index] = value;
+}
+/*}}}*/
+
+/*Object functions*/
Index: /issm/trunk-jpl/src/c/classes/Inputs2/IntInput2.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/IntInput2.h	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/IntInput2.h	(revision 24335)
@@ -0,0 +1,33 @@
+#ifndef _INTINPUT2_H_
+#define _INTINPUT2_H_
+
+/*Headers:*/
+#include "./Input2.h"
+
+class IntInput2: public Input2{
+
+	private:
+		int   size;
+		int*  values;
+
+	public:
+		/*IntInput2 constructors, destructors: {{{*/
+		IntInput2();
+		IntInput2(int size_in);
+		~IntInput2();
+		/*}}}*/
+		/*Object virtual functions definitions:{{{ */
+		Input2 *copy();
+		void    DeepEcho();
+		void    Echo();
+		int     Id();
+		void    Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
+		int     ObjectEnum();
+		/*}}}*/
+		/*IntInput2 management: {{{*/
+		void GetInput(int* pvalue,int index);
+		void SetInput(int index,int value);
+		/*}}}*/
+
+};
+#endif  /* _BOOLINPUT_H */
Index: /issm/trunk-jpl/src/c/classes/Inputs2/PentaInput2.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/PentaInput2.cpp	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/PentaInput2.cpp	(revision 24335)
@@ -0,0 +1,395 @@
+/*!\file PentaInput2.c
+ * \brief: implementation of the PentaInput2 object
+ */
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "../classes.h"
+#include "../../shared/shared.h"
+#include "./PentaInput2.h"
+
+/*PentaInput2 constructors and destructor*/
+PentaInput2::PentaInput2(void){/*{{{*/
+
+	this->numberofelements_local = -1;
+	this->numberofvertices_local = -1;
+	this->isserved       = false;
+	this->isserved_collapsed= 0;
+	this->M = -1;
+	this->N = -1;
+	this->values         = NULL;
+	this->element_values = NULL;
+
+}/*}}}*/
+PentaInput2::PentaInput2(int nbe_in,int nbv_in,int interp_in){/*{{{*/
+
+	_assert_(nbe_in>0);
+	_assert_(nbe_in<1e11);
+	_assert_(nbv_in>0);
+	_assert_(nbv_in<1e11);
+	this->numberofelements_local = nbe_in;
+	this->numberofvertices_local = nbv_in;
+	this->isserved           = false;
+	this->isserved_collapsed = 0;
+
+	/*Reset takes care of the rest*/
+	this->Reset(interp_in);
+
+}/*}}}*/
+PentaInput2::~PentaInput2(){/*{{{*/
+	if(this->element_values) xDelete<IssmDouble>(this->element_values);
+	if(this->values)         xDelete<IssmDouble>(this->values);
+}
+/*}}}*/
+void PentaInput2::Reset(int interp_in){/*{{{*/
+
+	/*Clean up*/
+	if(this->values)         xDelete<IssmDouble>(this->values);
+	if(this->element_values) xDelete<IssmDouble>(this->element_values);
+
+	/*Set interpolation*/
+	this->interpolation  = interp_in;
+
+	/*Create Sizes*/
+	if(this->interpolation==P1Enum){
+		this->M = this->numberofvertices_local;
+		this->N = 1;
+	}
+	else{
+		this->M = this->numberofelements_local;
+		this->N = PentaRef::NumberofNodes(interp_in);
+	}
+
+	/*Allocate Pointers*/
+	this->values         = xNewZeroInit<IssmDouble>(this->M*this->N);
+	this->element_values = xNewZeroInit<IssmDouble>(PentaRef::NumberofNodes(interp_in));
+}/*}}}*/
+
+/*Object virtual functions definitions:*/
+Input2* PentaInput2::copy() {/*{{{*/
+
+	/*Create output*/
+	PentaInput2* output = new PentaInput2(this->numberofelements_local,this->numberofvertices_local,this->interpolation);
+
+	/*Copy values*/
+	xMemCpy<IssmDouble>(output->values,this->values,this->M*this->N);
+
+	/*Return output*/
+	return output;
+
+}
+/*}}}*/
+void PentaInput2::DeepEcho(void){/*{{{*/
+	_printf_("PentaInput2 Echo:\n");
+	_printf_("   interpolation:      "<<EnumToStringx(this->interpolation)<<"\n");
+	_printf_("   Size:               "<<M<<"x"<<N<<"\n");
+	_printf_("   isserved:           "<<(isserved?"true":"false") << "\n");
+	_printf_("   isserved_collapsed: "<<isserved_collapsed << "\n");
+	if(isserved){
+		_printf_("   current values:      ");
+		_printf_("[ ");
+		for(int i=0;i<6;i++) _printf_(" "<<this->element_values[i]);
+		_printf_("] ("<<EnumToStringx(this->interpolation)<<")\n");
+	}
+	printarray(this->values,this->M,this->N);
+	//_printf_(setw(15)<<"   PentaInput2 "<<setw(25)<<left<<EnumToStringx(this->enum_type)<<" "<<(value?"true":"false") << "\n");
+}
+/*}}}*/
+void PentaInput2::Echo(void){/*{{{*/
+	_printf_("PentaInput2 Echo:\n");
+	_printf_("   interpolation:      "<<EnumToStringx(this->interpolation)<<"\n");
+	_printf_("   nbe_local:          "<<this->numberofvertices_local<<"\n");
+	_printf_("   nbv_local:          "<<this->numberofelements_local<<"\n");
+	_printf_("   Size:               "<<M<<"x"<<N<<"\n");
+	_printf_("   isserved:           "<<(isserved?"true":"false") << "\n");
+	_printf_("   isserved_collapsed: "<<isserved_collapsed << "\n");
+	if(isserved){
+		_printf_("   current values:      ");
+		_printf_("[ ");
+		for(int i=0;i<6;i++) _printf_(" "<<this->element_values[i]);
+		_printf_("] ("<<EnumToStringx(this->interpolation)<<")\n");
+	}
+}
+/*}}}*/
+int  PentaInput2::Id(void){/*{{{*/
+	return -1;
+}/*}}}*/
+void PentaInput2::Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){ /*{{{*/
+
+	MARSHALLING_ENUM(PentaInput2Enum);
+	MARSHALLING(this->numberofelements_local);
+	MARSHALLING(this->numberofvertices_local);
+	MARSHALLING(this->interpolation);
+	MARSHALLING(this->M);
+	MARSHALLING(this->N);
+	this->isserved = false;
+	this->isserved_collapsed = 0;
+	if(this->M*this->N){
+		MARSHALLING_DYNAMIC(this->values,IssmDouble,this->M*this->N);
+	}
+	else this->values = NULL;
+
+	if(marshall_direction == MARSHALLING_BACKWARD){
+		this->element_values = xNewZeroInit<IssmDouble>(PentaRef::NumberofNodes(this->interpolation));
+	}
+}
+/*}}}*/
+int  PentaInput2::ObjectEnum(void){/*{{{*/
+	return PentaInput2Enum;
+}
+/*}}}*/
+
+/*PentaInput2 management*/
+void PentaInput2::SetInput(int interp_in,int row,IssmDouble value_in){/*{{{*/
+
+	_assert_(this);
+	_assert_(row>=0); 
+	_assert_(row<this->M); 
+	_assert_(this->N==1);
+
+	this->values[row] = value_in;
+	this->isserved    = false;
+}
+/*}}}*/
+void PentaInput2::SetInput(int interp_in,int numindices,int* indices,IssmDouble* values_in){/*{{{*/
+
+	_assert_(this);
+	if(interp_in==P1Enum && this->interpolation==P1Enum){
+		_assert_(this->N==1);
+		for(int i=0;i<numindices;i++){
+			int row = indices[i];
+			_assert_(row>=0); 
+			_assert_(row<this->M); 
+			this->values[row] = values_in[i];
+		}
+	}
+	else if(this->interpolation!=P1Enum && interp_in==P1Enum){
+		this->Reset(interp_in);
+		for(int i=0;i<numindices;i++){
+			int row = indices[i];
+			_assert_(row>=0); 
+			_assert_(row<this->M); 
+			this->values[row] = values_in[i];
+		}
+	}
+	else{
+		_error_("not supported");
+	}
+
+	this->isserved    = false;
+}
+/*}}}*/
+void PentaInput2::SetInput(int interp_in,int row,int numindices,IssmDouble* values_in){/*{{{*/
+
+	_assert_(this);
+	if(interp_in==this->interpolation){
+		_assert_(this->N==numindices);
+	}
+	else{
+		this->Reset(interp_in);
+		_assert_(this->N==numindices);
+	}
+	for(int i=0;i<numindices;i++) this->values[row*this->N+i] = values_in[i];
+
+	this->isserved    = false;
+}
+/*}}}*/
+void PentaInput2::Serve(int numindices,int* indices){/*{{{*/
+
+	_assert_(this);
+	_assert_(this->N==1);
+
+	for(int i=0;i<numindices;i++){
+		int row = indices[i];
+		_assert_(row>=0); 
+		_assert_(row<this->M); 
+		this->element_values[i] = this->values[row];
+	}
+
+	/*Set input as served*/
+	this->isserved = true;
+	this->isserved_collapsed = 0;
+}
+/*}}}*/
+void PentaInput2::Serve(int row,int numindices){/*{{{*/
+
+	_assert_(this);
+	_assert_(this->N==numindices);
+	_assert_(row<this->M);
+	_assert_(row>=0);
+
+	for(int i=0;i<numindices;i++){
+		this->element_values[i] = this->values[row*this->N+i];
+	}
+
+	/*Set input as served*/
+	this->isserved = true;
+	this->isserved_collapsed = 0;
+}/*}}}*/
+void PentaInput2::ServeCollapsed(int row,int state){/*{{{*/
+
+	_assert_(this);
+	_assert_(this->N>=3);
+	_assert_(row<this->M);
+	_assert_(row>=0);
+
+	if(state==1){
+		for(int i=0;i<3;i++) this->element_values[i] = this->values[row*this->N+i];
+	}
+	else if(state==2){
+		for(int i=0;i<3;i++) this->element_values[i] = this->values[row*this->N+3+i];
+	}
+	else{
+		_error_("not supported");
+	}
+
+	/*Set input as served*/
+	this->isserved = true;
+	this->isserved_collapsed = state;
+}/*}}}*/
+void PentaInput2::SetServeCollapsed(int state){/*{{{*/
+	this->isserved_collapsed = state;
+}/*}}}*/
+int  PentaInput2::GetInterpolation(){/*{{{*/
+	return this->interpolation;
+}/*}}}*/
+void PentaInput2::GetInputAverage(IssmDouble* pvalue){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+
+	/*Output*/
+	IssmDouble value = 0.;
+
+	if(this->isserved_collapsed){
+		if(this->interpolation==P0Enum){
+			value = this->element_values[0];
+		}
+		else{
+			/*Assume P1...*/
+			value = 1./3.*(this->element_values[0] +  this->element_values[1] +  this->element_values[2]);
+		}
+	}
+	else{
+		int        numnodes  = this->NumberofNodes(this->interpolation);
+		IssmDouble numnodesd = reCast<int,IssmDouble>(numnodes);
+
+		for(int i=0;i<numnodes;i++) value+=this->element_values[i];
+		value = value/numnodesd;
+	}
+
+	*pvalue=value;
+}/*}}}*/
+IssmDouble PentaInput2::GetInputMin(void){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+
+	int  numnodes  = this->NumberofNodes(this->interpolation);
+	if(this->isserved_collapsed) numnodes = 3;
+	IssmDouble min=this->element_values[0];
+
+	for(int i=1;i<numnodes;i++){
+		if(this->element_values[i]<min) min=this->element_values[i];
+	}
+	return min;
+}/*}}}*/
+IssmDouble PentaInput2::GetInputMax(void){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+
+	int numnodes  = this->NumberofNodes(this->interpolation);
+	if(this->isserved_collapsed) numnodes = 3;
+	IssmDouble max=this->element_values[0];
+
+	for(int i=1;i<numnodes;i++){
+		if(this->element_values[i]>max) max=this->element_values[i];
+	}
+	return max;
+}/*}}}*/
+IssmDouble PentaInput2::GetInputMaxAbs(void){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+
+	int numnodes  = this->NumberofNodes(this->interpolation);
+	if(this->isserved_collapsed) numnodes = 3;
+	IssmDouble maxabs=fabs(this->element_values[0]);
+
+	for(int i=1;i<numnodes;i++){
+		if(fabs(this->element_values[i])>maxabs) maxabs=fabs(this->element_values[i]);
+	}
+	return maxabs;
+}/*}}}*/
+void PentaInput2::GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, Gauss* gauss){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+	if(this->isserved_collapsed){
+		_assert_(gauss->Enum()==GaussTriaEnum);
+		if(this->interpolation==P0Enum){
+			derivativevalues[0] = 0.;
+			derivativevalues[1] = 0.;
+		}
+		else{
+			TriaRef temp;
+			temp.GetInputDerivativeValue(derivativevalues,this->element_values,xyz_list,(GaussTria*)gauss,P1Enum);
+		}
+	}
+	else{
+		_assert_(gauss->Enum()==GaussPentaEnum);
+		PentaRef::GetInputDerivativeValue(derivativevalues,this->element_values,xyz_list,(GaussPenta*)gauss,this->interpolation);
+	}
+}/*}}}*/
+void PentaInput2::GetInputValue(IssmDouble* pvalue,Gauss* gauss){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+	if(this->isserved_collapsed){
+		_assert_(gauss->Enum()==GaussTriaEnum);
+		if(this->interpolation==P0Enum){
+			*pvalue = this->element_values[0];
+		}
+		else{
+			TriaRef temp;
+			temp.GetInputValue(pvalue,this->element_values,(GaussTria*)gauss,P1Enum);
+		}
+	}
+	else{
+		_assert_(gauss->Enum()==GaussPentaEnum);
+		PentaRef::GetInputValue(pvalue,this->element_values,(GaussPenta*)gauss,this->interpolation);
+	}
+}/*}}}*/
+int  PentaInput2::GetResultArraySize(void){/*{{{*/
+	return 1;
+}
+/*}}}*/
+int  PentaInput2::GetResultInterpolation(void){/*{{{*/
+	if(this->interpolation==P0Enum || this->interpolation==P0DGEnum){
+		return P0Enum;
+	}
+	return P1Enum;
+}/*}}}*/
+int  PentaInput2::GetResultNumberOfNodes(void){/*{{{*/
+	return this->N;
+}
+/*}}}*/
+void PentaInput2::Scale(IssmDouble alpha){/*{{{*/
+
+	for(int i=0;i<this->M*this->N;i++) this->values[i] = alpha*this->values[i];
+	for(int i=0;i<PentaRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*this->element_values[i];
+}
+/*}}}*/
+void PentaInput2::AXPY(Input2* xinput,IssmDouble alpha){/*{{{*/
+
+	/*xinput is of the same type, so cast it: */
+	if(xinput->ObjectEnum()!=PentaInput2Enum) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum()));
+	PentaInput2* xpentainput=xDynamicCast<PentaInput2*>(xinput);
+	if(xpentainput->GetInterpolation()!=this->interpolation) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum()));
+
+	/*Carry out the AXPY operation depending on type:*/
+	for(int i=0;i<this->M*this->N;i++) this->values[i] = alpha*xpentainput->values[i] + this->values[i];
+	for(int i=0;i<PentaRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*xpentainput->element_values[i] + this->element_values[i];
+}
+/*}}}*/
+
+/*Object functions*/
Index: /issm/trunk-jpl/src/c/classes/Inputs2/PentaInput2.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/PentaInput2.h	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/PentaInput2.h	(revision 24335)
@@ -0,0 +1,51 @@
+#ifndef _PENTAINPUT2_H_
+#define _PENTAINPUT2_H_
+
+/*Headers:*/
+#include "./ElementInput2.h"
+#include "../Elements/PentaRef.h"
+
+class PentaInput2: public ElementInput2, public PentaRef{
+
+	private:
+		int isserved_collapsed;
+	public:
+		/*PentaInput2 constructors, destructors: {{{*/
+		PentaInput2();
+		PentaInput2(int nbe_in,int nbv_in,int interp_in);
+		~PentaInput2();
+		/*}}}*/
+		/*Object virtual functions definitions:{{{ */
+		Input2 *copy();
+		void    DeepEcho();
+		void    Echo();
+		int     Id();
+		void    Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
+		int     ObjectEnum();
+		/*}}}*/
+		/*PentaInput2 management: {{{*/
+		void SetInput(int interp_in,int row,IssmDouble value_in);
+		void SetInput(int interp_in,int numinds,int* rows,IssmDouble* values_in);
+		void SetInput(int interp_in,int row,int numinds,IssmDouble* values_in);
+		int  GetInterpolation();
+		void GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, Gauss* gauss);
+		void GetInputAverage(IssmDouble* pvalue);
+		IssmDouble GetInputMin();
+		IssmDouble GetInputMax();
+		IssmDouble GetInputMaxAbs();
+		PentaInput2* GetPentaInput(){return this;};
+		void GetInputValue(IssmDouble* pvalue,Gauss* gauss);
+		void Scale(IssmDouble scalar);
+		void AXPY(Input2* xinput,IssmDouble scalar);
+		void Serve(int numindices,int* indices);
+		void Serve(int row,int numindices);
+		void ServeCollapsed(int row,int state);
+		void SetServeCollapsed(int);
+		int  GetResultArraySize(void);
+		int  GetResultInterpolation(void);
+		int  GetResultNumberOfNodes(void);
+		/*}}}*/
+		void Reset(int interp_in);
+
+};
+#endif  /* _TRIAINPUT_H */
Index: /issm/trunk-jpl/src/c/classes/Inputs2/SegInput2.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/SegInput2.cpp	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/SegInput2.cpp	(revision 24335)
@@ -0,0 +1,324 @@
+/*!\file SegInput2.c
+ * \brief: implementation of the SegInput2 object
+ */
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "../classes.h"
+#include "../../shared/shared.h"
+#include "./SegInput2.h"
+
+/*SegInput2 constructors and destructor*/
+SegInput2::SegInput2(void){/*{{{*/
+
+	this->numberofelements_local = -1;
+	this->numberofvertices_local = -1;
+	this->isserved       = false;
+	this->M = -1;
+	this->N = -1;
+	this->values         = NULL;
+	this->element_values = NULL;
+
+}/*}}}*/
+SegInput2::SegInput2(int nbe_in,int nbv_in,int interp_in){/*{{{*/
+
+	_assert_(nbe_in>0);
+	_assert_(nbe_in<1e11);
+	_assert_(nbv_in>0);
+	_assert_(nbv_in<1e11);
+	this->numberofelements_local = nbe_in;
+	this->numberofvertices_local = nbv_in;
+	this->isserved       = false;
+
+	/*Reset takes care of the rest*/
+	this->Reset(interp_in);
+}/*}}}*/
+SegInput2::~SegInput2(){/*{{{*/
+	if(this->element_values) xDelete<IssmDouble>(this->element_values);
+	if(this->values)         xDelete<IssmDouble>(this->values);
+}
+/*}}}*/
+void SegInput2::Reset(int interp_in){/*{{{*/
+
+	/*Clean up*/
+	if(this->values)         xDelete<IssmDouble>(this->values);
+	if(this->element_values) xDelete<IssmDouble>(this->element_values);
+
+	/*Set interpolation*/
+	this->interpolation  = interp_in;
+
+	/*Create Sizes*/
+	if(this->interpolation==P1Enum){
+		this->M = this->numberofvertices_local;
+		this->N = 1;
+	}
+	else{
+		this->M = this->numberofelements_local;
+		this->N = SegRef::NumberofNodes(interp_in);
+	}
+
+	/*Allocate Pointers*/
+	this->values         = xNewZeroInit<IssmDouble>(this->M*this->N);
+	this->element_values = xNewZeroInit<IssmDouble>(SegRef::NumberofNodes(interp_in));
+}/*}}}*/
+
+/*Object virtual functions definitions:*/
+Input2* SegInput2::copy() {/*{{{*/
+
+	SegInput2* output = new SegInput2(this->numberofelements_local,this->numberofvertices_local,this->interpolation);
+
+	xMemCpy<IssmDouble>(output->values,this->values,this->M*this->N);
+	xMemCpy<IssmDouble>(output->element_values,this->element_values,SegRef::NumberofNodes(this->interpolation));
+
+	return output;
+}
+/*}}}*/
+void SegInput2::DeepEcho(void){/*{{{*/
+	_printf_("SegInput2 Echo:\n");
+	_printf_("   interpolation: "<<EnumToStringx(this->interpolation)<<"\n");
+	_printf_("   Size:          "<<M<<"x"<<N<<"\n");
+	_printf_("   isserved:      "<<(isserved?"true":"false") << "\n");
+	if(isserved){
+		_printf_("   current values:      ");
+		for(int i=0;i<3;i++) _printf_(" "<<this->element_values[i]);
+		_printf_("] ("<<EnumToStringx(this->interpolation)<<")\n");
+	}
+	printarray(this->values,this->M,this->N);
+	//_printf_(setw(15)<<"   SegInput2 "<<setw(25)<<left<<EnumToStringx(this->enum_type)<<" "<<(value?"true":"false") << "\n");
+}
+/*}}}*/
+void SegInput2::Echo(void){/*{{{*/
+	_printf_("SegInput2 Echo:\n");
+	_printf_("   interpolation: "<<EnumToStringx(this->interpolation)<<"\n");
+	_printf_("   Size:          "<<M<<"x"<<N<<"\n");
+	_printf_("   isserved:      "<<(isserved?"true":"false") << "\n");
+	if(isserved){
+		_printf_("   current values:      ");
+		_printf_("[ ");
+		for(int i=0;i<3;i++) _printf_(" "<<this->element_values[i]);
+		_printf_("] ("<<EnumToStringx(this->interpolation)<<")\n");
+	}
+}
+/*}}}*/
+int  SegInput2::Id(void){/*{{{*/
+	return -1;
+}/*}}}*/
+void SegInput2::Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){ /*{{{*/
+
+	MARSHALLING_ENUM(SegInput2Enum);
+	MARSHALLING(this->numberofelements_local);
+	MARSHALLING(this->numberofvertices_local);
+	MARSHALLING(this->interpolation);
+	MARSHALLING(this->M);
+	MARSHALLING(this->N);
+	this->isserved = false;
+	if(this->M*this->N){
+		MARSHALLING_DYNAMIC(this->values,IssmDouble,this->M*this->N);
+	}
+	else this->values = NULL;
+
+	if(marshall_direction == MARSHALLING_BACKWARD){
+		this->element_values = xNewZeroInit<IssmDouble>(SegRef::NumberofNodes(this->interpolation));
+	}
+
+}
+/*}}}*/
+int  SegInput2::ObjectEnum(void){/*{{{*/
+	return SegInput2Enum;
+}
+/*}}}*/
+
+/*SegInput2 management*/
+void SegInput2::SetInput(int interp_in,int row,IssmDouble value_in){/*{{{*/
+
+	_assert_(this);
+	_assert_(row>=0); 
+	_assert_(row<this->M); 
+	_assert_(this->N==1);
+
+	this->values[row] = value_in;
+	this->isserved = false;
+}
+/*}}}*/
+void SegInput2::SetInput(int interp_in,int numindices,int* indices,IssmDouble* values_in){/*{{{*/
+
+	_assert_(this);
+	if(interp_in==P1Enum && this->interpolation==P1Enum){
+		_assert_(this->N==1);
+		for(int i=0;i<numindices;i++){
+			int row = indices[i];
+			_assert_(row>=0); 
+			_assert_(row<this->M); 
+			this->values[row] = values_in[i];
+		}
+	}
+	else if(interp_in==P0Enum && this->interpolation==P0Enum){
+		_assert_(this->N==1);
+		for(int i=0;i<numindices;i++){
+			int row = indices[i];
+			_assert_(row>=0); 
+			_assert_(row<this->M); 
+			this->values[row] = values_in[i];
+		}
+	}
+	else if(this->interpolation!=P1Enum && interp_in==P1Enum){
+		this->Reset(interp_in);
+		for(int i=0;i<numindices;i++){
+			int row = indices[i];
+			_assert_(row>=0); 
+			_assert_(row<this->M); 
+			this->values[row] = values_in[i];
+		}
+	}
+	else{
+		_error_("Cannot convert "<<EnumToStringx(this->interpolation)<<" to "<<EnumToStringx(interp_in));
+	}
+	this->isserved = false;
+}
+/*}}}*/
+void SegInput2::SetInput(int interp_in,int row,int numindices,IssmDouble* values_in){/*{{{*/
+
+	_assert_(this);
+	if(interp_in==this->interpolation){
+		_assert_(this->N==numindices);
+	}
+	else{
+		this->Reset(interp_in);
+		_assert_(this->N==numindices);
+	}
+	for(int i=0;i<numindices;i++) this->values[row*this->N+i] = values_in[i];
+	this->isserved = false;
+}
+/*}}}*/
+void SegInput2::Serve(int numindices,int* indices){/*{{{*/
+
+	_assert_(this);
+	_assert_(this->N==1);
+
+	for(int i=0;i<numindices;i++){
+		int row = indices[i];
+		_assert_(row>=0); 
+		_assert_(row<this->M); 
+		this->element_values[i] = this->values[row];
+	}
+
+	/*Set input as served*/
+	this->isserved = true;
+}
+/*}}}*/
+void SegInput2::Serve(int row,int numindices){/*{{{*/
+
+	_assert_(this);
+	_assert_(this->N==numindices);
+	_assert_(row<this->M);
+	_assert_(row>=0);
+
+	for(int i=0;i<numindices;i++){
+		this->element_values[i] = this->values[row*this->N+i];
+	}
+
+	/*Set input as served*/
+	this->isserved = true;
+} /*}}}*/
+int  SegInput2::GetInterpolation(){/*{{{*/
+	return this->interpolation;
+}/*}}}*/
+void SegInput2::GetInputAverage(IssmDouble* pvalue){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+
+	int        numnodes  = this->NumberofNodes(this->interpolation);
+	IssmDouble numnodesd = reCast<int,IssmDouble>(numnodes);
+	IssmDouble value     = 0.;
+
+	for(int i=0;i<numnodes;i++) value+=this->element_values[i];
+	value = value/numnodesd;
+
+	*pvalue=value;
+}/*}}}*/
+IssmDouble SegInput2::GetInputMin(void){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+
+	int        numnodes  = this->NumberofNodes(this->interpolation);
+	IssmDouble min=this->element_values[0];
+
+	for(int i=1;i<numnodes;i++){
+		if(this->element_values[i]<min) min=this->element_values[i];
+	}
+	return min;
+}/*}}}*/
+IssmDouble SegInput2::GetInputMax(void){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+
+	int        numnodes  = this->NumberofNodes(this->interpolation);
+	IssmDouble max=this->element_values[0];
+
+	for(int i=1;i<numnodes;i++){
+		if(this->element_values[i]>max) max=this->element_values[i];
+	}
+	return max;
+}/*}}}*/
+IssmDouble SegInput2::GetInputMaxAbs(void){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+
+	int        numnodes  = this->NumberofNodes(this->interpolation);
+	IssmDouble maxabs=fabs(this->element_values[0]);
+
+	for(int i=1;i<numnodes;i++){
+		if(fabs(this->element_values[i])>maxabs) maxabs=fabs(this->element_values[i]);
+	}
+	return maxabs;
+}/*}}}*/
+void SegInput2::GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, Gauss* gauss){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+	_assert_(gauss->Enum()==GaussSegEnum);
+	SegRef::GetInputDerivativeValue(derivativevalues,this->element_values,xyz_list,(GaussSeg*)gauss,this->interpolation);
+}/*}}}*/
+void SegInput2::GetInputValue(IssmDouble* pvalue,Gauss* gauss){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+	_assert_(gauss->Enum()==GaussSegEnum);
+	SegRef::GetInputValue(pvalue,this->element_values,(GaussSeg*)gauss,this->interpolation);
+}/*}}}*/
+int  SegInput2::GetResultArraySize(void){/*{{{*/
+	return 1;
+}
+/*}}}*/
+int  SegInput2::GetResultInterpolation(void){/*{{{*/
+	if(this->interpolation==P0Enum || this->interpolation==P0DGEnum){
+		return P0Enum;
+	}
+	return P1Enum;
+}/*}}}*/
+int  SegInput2::GetResultNumberOfNodes(void){/*{{{*/
+	return this->N;
+}
+/*}}}*/
+void SegInput2::Scale(IssmDouble alpha){/*{{{*/
+
+	for(int i=0;i<this->M*this->N;i++) this->values[i] = alpha*this->values[i];
+	for(int i=0;i<SegRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*this->element_values[i];
+}
+/*}}}*/
+void SegInput2::AXPY(Input2* xinput,IssmDouble alpha){/*{{{*/
+
+	/*xinput is of the same type, so cast it: */
+	if(xinput->ObjectEnum()!=SegInput2Enum) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum()));
+	SegInput2* xtriainput=xDynamicCast<SegInput2*>(xinput);
+	if(xtriainput->GetInterpolation()!=this->interpolation) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum()));
+
+	/*Carry out the AXPY operation depending on type:*/
+	for(int i=0;i<this->M*this->N;i++) this->values[i] = alpha*xtriainput->values[i] + this->values[i];
+	for(int i=0;i<SegRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*xtriainput->element_values[i] + this->element_values[i];
+}
+/*}}}*/
+
+/*Object functions*/
Index: /issm/trunk-jpl/src/c/classes/Inputs2/SegInput2.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/SegInput2.h	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/SegInput2.h	(revision 24335)
@@ -0,0 +1,47 @@
+#ifndef _SEGINPUT2_H_
+#define _SEGINPUT2_H_
+
+/*Headers:*/
+#include "./ElementInput2.h"
+#include "../Elements/SegRef.h"
+
+class SegInput2: public ElementInput2, public SegRef{
+
+	public:
+		/*SegInput2 constructors, destructors: {{{*/
+		SegInput2();
+		SegInput2(int nbe_in,int nbv_in,int interp_in);
+		~SegInput2();
+		/*}}}*/
+		/*Object virtual functions definitions:{{{ */
+		Input2 *copy();
+		void    DeepEcho();
+		void    Echo();
+		int     Id();
+		void    Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
+		int     ObjectEnum();
+		/*}}}*/
+		/*SegInput2 management: {{{*/
+		void SetInput(int interp_in,int row,IssmDouble value_in);
+		void SetInput(int interp_in,int numinds,int* rows,IssmDouble* values_in);
+		void SetInput(int interp_in,int row,int numinds,IssmDouble* values_in);
+		int  GetInterpolation();
+		void GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, Gauss* gauss);
+		void GetInputAverage(IssmDouble* pvalue);
+		IssmDouble GetInputMin();
+		IssmDouble GetInputMax();
+		IssmDouble GetInputMaxAbs();
+		SegInput2* GetSegInput(){return this;};
+		void GetInputValue(IssmDouble* pvalue,Gauss* gauss);
+		void Scale(IssmDouble scalar);
+		void AXPY(Input2* xinput,IssmDouble scalar);
+		void Serve(int numindices,int* indices);
+		void Serve(int row,int numindices);
+		int  GetResultArraySize(void);
+		int  GetResultInterpolation(void);
+		int  GetResultNumberOfNodes(void);
+		/*}}}*/
+		void Reset(int interp_in);
+
+};
+#endif  /* _SEGINPUT_H */
Index: /issm/trunk-jpl/src/c/classes/Inputs2/TransientInput2.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/TransientInput2.cpp	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/TransientInput2.cpp	(revision 24335)
@@ -0,0 +1,324 @@
+/*!\file TransientInput2.c
+ * \brief: implementation of the TransientInput2 object
+ */
+/*Headers*/
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "./TransientInput2.h"
+#include "./TriaInput2.h"
+#include "./PentaInput2.h"
+#include "../../shared/shared.h"
+#include "../Params/Parameters.h"
+
+/*TransientInput2 constructors and destructor*/
+TransientInput2::TransientInput2(){/*{{{*/
+
+	enum_type=UNDEF;
+	inputs=NULL;
+	this->numtimesteps=0;
+	this->parameters=NULL;
+	this->timesteps=NULL;
+
+	this->current_input=NULL;
+	this->current_step=-1;
+
+}
+/*}}}*/
+TransientInput2::TransientInput2(int in_enum_type,int nbe,int nbv,IssmDouble* timesin,int N){/*{{{*/
+
+	/*Set Enum*/
+	this->enum_type=in_enum_type;
+	this->numberofelements_local = nbe;
+	this->numberofvertices_local = nbv;
+
+	/*Allocate values and timesteps, and copy: */
+	_assert_(N>0 && N<1e6);
+	this->numtimesteps=N;
+	this->timesteps=xNew<IssmDouble>(N);
+	xMemCpy(this->timesteps,timesin,N);
+
+	this->inputs     = xNew<Input2*>(N);
+	for(int i=0;i<N;i++) this->inputs[i] = NULL;
+	this->parameters = NULL;
+
+	this->current_input=NULL;
+	this->current_step=-1;
+}
+/*}}}*/
+TransientInput2::~TransientInput2(){/*{{{*/
+
+	for(int i=0;i<this->numtimesteps;i++){
+		delete this->inputs[i];
+	}
+	xDelete<Input2*>(this->inputs);
+	xDelete<IssmDouble>(this->timesteps);
+
+	if(this->current_input) delete this->current_input;
+}
+/*}}}*/
+
+/*Object virtual functions definitions:*/
+Input2* TransientInput2::copy() {/*{{{*/
+
+	TransientInput2* output=NULL;
+
+	output = new TransientInput2();
+	output->enum_type=this->enum_type;
+	output->numtimesteps=this->numtimesteps;
+	if(this->numtimesteps>0){
+		output->timesteps=xNew<IssmDouble>(this->numtimesteps);
+		xMemCpy(output->timesteps,this->timesteps,this->numtimesteps);
+		output->inputs = xNew<Input2*>(this->numtimesteps);
+		for(int i=0;i<this->numtimesteps;i++){
+			output->inputs[i] = this->inputs[i]->copy();
+		}
+	}
+	output->parameters=this->parameters;
+
+	return output;
+}/*}}}*/
+void TransientInput2::DeepEcho(void){/*{{{*/
+
+	int i;
+
+	_printf_("TransientInput2:\n");
+	_printf_("   enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")\n");
+	_printf_("   numtimesteps: " << this->numtimesteps << "\n");
+	_printf_("---inputs: \n");
+	for(i=0;i<this->numtimesteps;i++){
+		_printf_("   time: " << this->timesteps[i]<<"  ");
+		//((Input*)this->inputs->GetObjectByOffset(i))->Echo();
+		_error_("not implemented");
+	}
+}
+/*}}}*/
+void TransientInput2::Configure(Parameters* params){/*{{{*/
+	this->parameters=params;
+}
+/*}}}*/
+void TransientInput2::Echo(void){/*{{{*/
+	this->DeepEcho();
+}
+/*}}}*/
+int  TransientInput2::Id(void){ return -1; }/*{{{*/
+/*}}}*/
+void TransientInput2::Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){ /*{{{*/
+
+	if (marshall_direction == MARSHALLING_BACKWARD){
+		_error_("not implmented");
+		//inputs = new Inputs();
+	}
+
+	MARSHALLING_ENUM(TransientInput2Enum);
+
+	MARSHALLING(enum_type);
+	MARSHALLING(numtimesteps);
+	MARSHALLING_DYNAMIC(this->timesteps,IssmDouble,numtimesteps);
+	//inputs->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+	_error_("not implemented");
+}
+/*}}}*/
+int  TransientInput2::ObjectEnum(void){/*{{{*/
+
+	return TransientInput2Enum;
+
+}
+/*}}}*/
+
+/*Intermediary*/
+void TransientInput2::AddTimeInput(Input2* input,IssmDouble time){/*{{{*/
+
+	/*insert values at time step: */
+	if (this->numtimesteps>0 && time<=this->timesteps[this->numtimesteps-1]) _error_("timestep values must increase sequentially");
+
+	//copy timesteps, add the new time, delete previous timesteps, and add the new input: inputs->AddObject(input);
+	IssmDouble* old_timesteps=NULL;
+
+	if (this->numtimesteps > 0){
+		old_timesteps=xNew<IssmDouble>(this->numtimesteps);
+		xMemCpy(old_timesteps,this->timesteps,this->numtimesteps);
+		xDelete(this->timesteps);
+	}
+
+	this->numtimesteps=this->numtimesteps+1;
+	this->timesteps=xNew<IssmDouble>(this->numtimesteps);
+
+	if (this->numtimesteps > 1){
+		xMemCpy(this->timesteps,old_timesteps,this->numtimesteps-1);
+		xDelete(old_timesteps);
+	}
+
+	/*go ahead and plug: */
+	this->timesteps[this->numtimesteps-1]=time;
+	//inputs->AddObject(input);
+	_error_("not implemented...");
+
+}
+/*}}}*/
+void TransientInput2::AddTriaTimeInput(int step,int numindices,int* indices,IssmDouble* values_in,int interp_in){/*{{{*/
+
+	_assert_(step>=0 && step<this->numtimesteps);
+
+	/*Create it if necessary*/
+	if(this->inputs[step]){
+		if(this->inputs[step]->ObjectEnum()!=TriaInput2Enum) _error_("cannot add Element values to a "<<EnumToStringx(this->inputs[step]->ObjectEnum()));
+	}
+	else{
+		this->inputs[step] = new TriaInput2(this->numberofelements_local,this->numberofvertices_local,interp_in);
+	}
+
+	/*Set input*/
+	TriaInput2* input = xDynamicCast<TriaInput2*>(this->inputs[step]);
+	input->SetInput(interp_in,numindices,indices,values_in);
+
+}
+/*}}}*/
+void TransientInput2::AddPentaTimeInput(int step,int numindices,int* indices,IssmDouble* values_in,int interp_in){/*{{{*/
+
+	_assert_(step>=0 && step<this->numtimesteps);
+
+	/*Create it if necessary*/
+	if(this->inputs[step]){
+		if(this->inputs[step]->ObjectEnum()!=PentaInput2Enum) _error_("cannot add Element values to a "<<EnumToStringx(this->inputs[step]->ObjectEnum()));
+	}
+	else{
+		this->inputs[step] = new PentaInput2(this->numberofelements_local,this->numberofvertices_local,interp_in);
+	}
+
+	/*Set input*/
+	PentaInput2* input = xDynamicCast<PentaInput2*>(this->inputs[step]);
+	input->SetInput(interp_in,numindices,indices,values_in);
+
+}
+/*}}}*/
+TriaInput2* TransientInput2::GetTriaInput(){/*{{{*/
+
+	IssmDouble time;
+	this->parameters->FindParam(&time,TimeEnum);
+	return this->GetTriaInput(time);
+
+}
+/*}}}*/
+TriaInput2* TransientInput2::GetTriaInput(IssmDouble time){/*{{{*/
+
+	/*Set current time input*/
+	this->SetCurrentTimeInput(time);
+	_assert_(this->current_input);
+
+	/*Cast and return*/
+	if(this->current_input->ObjectEnum()!=TriaInput2Enum){
+		_error_("Cannot return a TriaInput2");
+	}
+	return xDynamicCast<TriaInput2*>(this->current_input);
+
+}
+/*}}}*/
+PentaInput2* TransientInput2::GetPentaInput(){/*{{{*/
+
+	IssmDouble time;
+	this->parameters->FindParam(&time,TimeEnum);
+	return this->GetPentaInput(time);
+}
+/*}}}*/
+PentaInput2* TransientInput2::GetPentaInput(IssmDouble time){/*{{{*/
+
+	/*Set current time input*/
+	this->SetCurrentTimeInput(time);
+	_assert_(this->current_input);
+
+	/*Cast and return*/
+	if(this->current_input->ObjectEnum()!=PentaInput2Enum){
+		_error_("Cannot return a PentaInput2");
+	}
+	return xDynamicCast<PentaInput2*>(this->current_input);
+
+}
+/*}}}*/
+void TransientInput2::SetCurrentTimeInput(IssmDouble time){/*{{{*/
+
+	/*First, recover current time from parameters: */
+	bool linear_interp;
+	this->parameters->FindParam(&linear_interp,TimesteppingInterpForcingsEnum);
+
+	/*Figure step out*/
+	int offset;
+	if(!binary_search(&offset,time,this->timesteps,this->numtimesteps)){
+		_error_("Input not found (is TransientInput sorted ?)");
+	}
+
+	if (offset==-1){
+
+		/*get values for the first time: */
+		_assert_(time<this->timesteps[0]);
+
+		/*If already processed return*/
+		if(this->current_step==0.) return;
+
+		/*Prepare input*/
+		if(this->current_input) delete this->current_input;
+		this->current_step = 0.;
+		this->current_input = this->inputs[0]->copy();
+
+	}
+	else if(offset==(this->numtimesteps-1) || !linear_interp){
+
+		/*get values for the last time: */
+		_assert_(time>=this->timesteps[offset]);
+
+		/*If already processed return*/
+		if(this->current_step==reCast<IssmDouble>(offset)) return;
+
+		/*Prepare input*/
+		if(this->current_input) delete this->current_input;
+		this->current_step  = reCast<IssmDouble>(offset);
+		this->current_input = this->inputs[offset]->copy();
+	}
+	else {
+
+		/*Interpolate */
+		_assert_(time>=this->timesteps[offset] && time<this->timesteps[offset+1]);
+
+		/*get values between two times [offset:offset+1[, Interpolate linearly*/
+		IssmDouble deltat=this->timesteps[offset+1]-this->timesteps[offset];
+		IssmDouble this_step = reCast<IssmDouble>(offset) + (time - this->timesteps[offset])/deltat;
+
+		/*If already processed return*/
+		if(this->current_step>this_step-1.e-5 && this->current_step<this_step-1.e-5) return;
+
+		/*Prepare input*/
+		if(this->current_input) delete this->current_input;
+		this->current_step = this_step;
+		IssmDouble alpha2=(time-this->timesteps[offset])/deltat;
+		IssmDouble alpha1=(1.0-alpha2);
+
+		Input2* input1=this->inputs[offset];
+		Input2* input2=this->inputs[offset+1];
+
+		this->current_input = input1->copy();
+		this->current_input->Scale(alpha1);
+		this->current_input->AXPY(input2,alpha2);
+	}
+
+}/*}}}*/
+IssmDouble  TransientInput2::GetTimeByOffset(int offset){/*{{{*/
+	if(offset<0) offset=0;
+	_assert_(offset<this->numtimesteps);
+	return this->timesteps[offset];
+}
+/*}}}*/
+int  TransientInput2::GetTimeInputOffset(IssmDouble time){/*{{{*/
+
+	int offset;
+
+	/*go through the timesteps, and figure out which interval we
+	 *     *fall within. Then interpolate the values on this interval: */
+	int found=binary_search(&offset,time,this->timesteps,this->numtimesteps);
+	if(!found) _error_("Input not found (is TransientInput sorted ?)");
+
+	return offset;
+}
+/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Inputs2/TransientInput2.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/TransientInput2.h	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/TransientInput2.h	(revision 24335)
@@ -0,0 +1,58 @@
+/*! \file TransientInput2.h
+ *  \brief: header file for transientinput object
+ */
+
+#ifndef _TRANSIENTINPUT2_H_
+#define _TRANSIENTINPUT2_H_
+
+/*Headers:*/
+#include "./Input2.h"
+class Gauss;
+class Parameters;
+
+class TransientInput2: public Input2{
+
+	private:
+		int     numberofelements_local;
+		int     numberofvertices_local;
+
+	public:
+		int         enum_type;
+		int         numtimesteps;
+		Input2**    inputs;
+		IssmDouble *timesteps;
+		Parameters *parameters;     //to find current time.
+
+		IssmDouble  current_step;
+		Input2*     current_input;
+
+		/*TransientInput2 constructors, destructors: {{{*/
+		TransientInput2();
+		TransientInput2(int in_enum_type,int nbe,int nbv,IssmDouble* times,int N);
+		~TransientInput2();
+		void AddTimeInput(Input2* input,IssmDouble time);
+		void AddTriaTimeInput(int step,int numindices,int* indices,IssmDouble* values_in,int interp_in);
+		void AddPentaTimeInput(int step,int numindices,int* indices,IssmDouble* values_in,int interp_in);
+		/*}}}*/
+		/*Object virtual functions definitions:{{{*/
+		Input2* copy();
+		void    Configure(Parameters* params);
+		void    DeepEcho();
+		void    Echo();
+		int     Id();
+		void    Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
+		int     ObjectEnum();
+		/*}}}*/
+		/*TransientInput2 management:*/
+		TriaInput2*  GetTriaInput();
+		TriaInput2*  GetTriaInput(IssmDouble time);
+		PentaInput2* GetPentaInput();
+		PentaInput2* GetPentaInput(IssmDouble time);
+		Input2*      GetTimeInput(IssmDouble time){_error_("This should not happen!");};
+		IssmDouble   GetTimeByOffset(int offset);
+		int          GetTimeInputOffset(IssmDouble time);
+		void         SetCurrentTimeInput(IssmDouble time);
+		/*numerics:*/
+
+};
+#endif  /* _TRANSIENTINPUT_H */
Index: /issm/trunk-jpl/src/c/classes/Inputs2/TriaInput2.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/TriaInput2.cpp	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/TriaInput2.cpp	(revision 24335)
@@ -0,0 +1,379 @@
+/*!\file TriaInput2.c
+ * \brief: implementation of the TriaInput2 object
+ */
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "../classes.h"
+#include "../../shared/shared.h"
+#include "./TriaInput2.h"
+
+/*TriaInput2 constructors and destructor*/
+TriaInput2::TriaInput2(void){/*{{{*/
+
+	this->numberofelements_local = -1;
+	this->numberofvertices_local = -1;
+	this->isserved       = false;
+	this->isserved_collapsed= 0;
+	this->M = -1;
+	this->N = -1;
+	this->values         = NULL;
+	this->element_values = NULL;
+
+}/*}}}*/
+TriaInput2::TriaInput2(int nbe_in,int nbv_in,int interp_in){/*{{{*/
+
+	_assert_(nbe_in>0);
+	_assert_(nbe_in<1e11);
+	_assert_(nbv_in>0);
+	_assert_(nbv_in<1e11);
+	this->numberofelements_local = nbe_in;
+	this->numberofvertices_local = nbv_in;
+	this->isserved       = false;
+	this->isserved_collapsed = 0;
+
+	/*Reset takes care of the rest*/
+	this->Reset(interp_in);
+}/*}}}*/
+TriaInput2::~TriaInput2(){/*{{{*/
+	if(this->element_values) xDelete<IssmDouble>(this->element_values);
+	if(this->values)         xDelete<IssmDouble>(this->values);
+}
+/*}}}*/
+void TriaInput2::Reset(int interp_in){/*{{{*/
+
+	/*Clean up*/
+	if(this->values)         xDelete<IssmDouble>(this->values);
+	if(this->element_values) xDelete<IssmDouble>(this->element_values);
+
+	/*Set interpolation*/
+	this->interpolation  = interp_in;
+
+	/*Create Sizes*/
+	if(this->interpolation==P1Enum){
+		this->M = this->numberofvertices_local;
+		this->N = 1;
+	}
+	else{
+		this->M = this->numberofelements_local;
+		this->N = TriaRef::NumberofNodes(interp_in);
+	}
+
+	/*Allocate Pointers*/
+	this->values         = xNewZeroInit<IssmDouble>(this->M*this->N);
+	this->element_values = xNewZeroInit<IssmDouble>(TriaRef::NumberofNodes(interp_in));
+}/*}}}*/
+
+/*Object virtual functions definitions:*/
+Input2* TriaInput2::copy() {/*{{{*/
+
+	TriaInput2* output = new TriaInput2(this->numberofelements_local,this->numberofvertices_local,this->interpolation);
+
+	xMemCpy<IssmDouble>(output->values,this->values,this->M*this->N);
+	xMemCpy<IssmDouble>(output->element_values,this->element_values,TriaRef::NumberofNodes(this->interpolation));
+
+	return output;
+}
+/*}}}*/
+void TriaInput2::DeepEcho(void){/*{{{*/
+	_printf_("TriaInput2 Echo:\n");
+	_printf_("   interpolation: "<<EnumToStringx(this->interpolation)<<"\n");
+	_printf_("   Size:          "<<M<<"x"<<N<<"\n");
+	_printf_("   isserved:      "<<(isserved?"true":"false") << "\n");
+	_printf_("   isserved_collapsed: "<<isserved_collapsed << "\n");
+	if(isserved){
+		_printf_("   current values:      ");
+		for(int i=0;i<3;i++) _printf_(" "<<this->element_values[i]);
+		_printf_("] ("<<EnumToStringx(this->interpolation)<<")\n");
+	}
+	printarray(this->values,this->M,this->N);
+	//_printf_(setw(15)<<"   TriaInput2 "<<setw(25)<<left<<EnumToStringx(this->enum_type)<<" "<<(value?"true":"false") << "\n");
+}
+/*}}}*/
+void TriaInput2::Echo(void){/*{{{*/
+	_printf_("TriaInput2 Echo:\n");
+	_printf_("   interpolation: "<<EnumToStringx(this->interpolation)<<"\n");
+	_printf_("   Size:          "<<M<<"x"<<N<<"\n");
+	_printf_("   isserved:      "<<(isserved?"true":"false") << "\n");
+	_printf_("   isserved_collapsed: "<<isserved_collapsed << "\n");
+	if(isserved){
+		_printf_("   current values:      ");
+		_printf_("[ ");
+		for(int i=0;i<3;i++) _printf_(" "<<this->element_values[i]);
+		_printf_("] ("<<EnumToStringx(this->interpolation)<<")\n");
+	}
+}
+/*}}}*/
+int  TriaInput2::Id(void){/*{{{*/
+	return -1;
+}/*}}}*/
+void TriaInput2::Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){ /*{{{*/
+
+	MARSHALLING_ENUM(TriaInput2Enum);
+	MARSHALLING(this->numberofelements_local);
+	MARSHALLING(this->numberofvertices_local);
+	MARSHALLING(this->interpolation);
+	MARSHALLING(this->M);
+	MARSHALLING(this->N);
+	this->isserved = false;
+	this->isserved_collapsed = 0;
+	if(this->M*this->N){
+		MARSHALLING_DYNAMIC(this->values,IssmDouble,this->M*this->N);
+	}
+	else this->values = NULL;
+
+	if(marshall_direction == MARSHALLING_BACKWARD){
+		this->element_values = xNewZeroInit<IssmDouble>(TriaRef::NumberofNodes(this->interpolation));
+	}
+
+}
+/*}}}*/
+int  TriaInput2::ObjectEnum(void){/*{{{*/
+	return TriaInput2Enum;
+}
+/*}}}*/
+
+/*TriaInput2 management*/
+void TriaInput2::SetInput(int interp_in,int row,IssmDouble value_in){/*{{{*/
+
+	_assert_(this);
+	_assert_(row>=0); 
+	_assert_(row<this->M); 
+	_assert_(this->N==1);
+
+	this->values[row] = value_in;
+	this->isserved = false;
+}
+/*}}}*/
+void TriaInput2::SetInput(int interp_in,int numindices,int* indices,IssmDouble* values_in){/*{{{*/
+
+	_assert_(this);
+	if(interp_in==P1Enum && this->interpolation==P1Enum){
+		_assert_(this->N==1);
+		for(int i=0;i<numindices;i++){
+			int row = indices[i];
+			_assert_(row>=0); 
+			_assert_(row<this->M); 
+			this->values[row] = values_in[i];
+		}
+	}
+	else if(interp_in==P0Enum && this->interpolation==P0Enum){
+		_assert_(this->N==1);
+		for(int i=0;i<numindices;i++){
+			int row = indices[i];
+			_assert_(row>=0); 
+			_assert_(row<this->M); 
+			this->values[row] = values_in[i];
+		}
+	}
+	else if(this->interpolation!=P1Enum && interp_in==P1Enum){
+		this->Reset(interp_in);
+		for(int i=0;i<numindices;i++){
+			int row = indices[i];
+			_assert_(row>=0); 
+			_assert_(row<this->M); 
+			this->values[row] = values_in[i];
+		}
+	}
+	else{
+		_error_("Cannot convert "<<EnumToStringx(this->interpolation)<<" to "<<EnumToStringx(interp_in));
+	}
+	this->isserved = false;
+}
+/*}}}*/
+void TriaInput2::SetInput(int interp_in,int row,int numindices,IssmDouble* values_in){/*{{{*/
+
+	_assert_(this);
+	if(interp_in==this->interpolation){
+		_assert_(this->N==numindices);
+	}
+	else{
+		this->Reset(interp_in);
+		_assert_(this->N==numindices);
+	}
+	for(int i=0;i<numindices;i++) this->values[row*this->N+i] = values_in[i];
+	this->isserved = false;
+}
+/*}}}*/
+void TriaInput2::Serve(int numindices,int* indices){/*{{{*/
+
+	_assert_(this);
+	_assert_(this->N==1);
+
+	for(int i=0;i<numindices;i++){
+		int row = indices[i];
+		_assert_(row>=0); 
+		_assert_(row<this->M); 
+		this->element_values[i] = this->values[row];
+	}
+
+	/*Set input as served*/
+	this->isserved = true;
+	this->isserved_collapsed = 0;
+}
+/*}}}*/
+void TriaInput2::Serve(int row,int numindices){/*{{{*/
+
+	_assert_(this);
+	_assert_(this->N==numindices);
+	_assert_(row<this->M);
+	_assert_(row>=0);
+
+	for(int i=0;i<numindices;i++){
+		this->element_values[i] = this->values[row*this->N+i];
+	}
+
+	/*Set input as served*/
+	this->isserved = true;
+	this->isserved_collapsed = 0;
+} /*}}}*/
+void TriaInput2::ServeCollapsed(int row,int id1,int id2){/*{{{*/
+
+	_assert_(this);
+	_assert_(this->N>=3);
+	_assert_(row<this->M);
+	_assert_(row>=0);
+	_assert_(id1>=0 && id1<3);
+	_assert_(id2>=0 && id2<3);
+
+	this->element_values[0] = this->values[row*this->N+id1];
+	this->element_values[1] = this->values[row*this->N+id2];
+
+	/*Set input as served*/
+	this->isserved = true;
+	this->isserved_collapsed = 1;
+}/*}}}*/
+void TriaInput2::SetServeCollapsed(bool status){/*{{{*/
+	this->isserved_collapsed = 1;
+}/*}}}*/
+int  TriaInput2::GetInterpolation(){/*{{{*/
+	return this->interpolation;
+}/*}}}*/
+void TriaInput2::GetInputAverage(IssmDouble* pvalue){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+
+	int        numnodes  = this->NumberofNodes(this->interpolation);
+	if(this->isserved_collapsed) numnodes = 2;
+	IssmDouble numnodesd = reCast<int,IssmDouble>(numnodes);
+	IssmDouble value     = 0.;
+
+	for(int i=0;i<numnodes;i++) value+=this->element_values[i];
+	value = value/numnodesd;
+
+	*pvalue=value;
+}/*}}}*/
+IssmDouble TriaInput2::GetInputMin(void){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+
+	int        numnodes  = this->NumberofNodes(this->interpolation);
+	if(this->isserved_collapsed) numnodes = 2;
+	IssmDouble min=this->element_values[0];
+
+	for(int i=1;i<numnodes;i++){
+		if(this->element_values[i]<min) min=this->element_values[i];
+	}
+	return min;
+}/*}}}*/
+IssmDouble TriaInput2::GetInputMax(void){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+
+	int        numnodes  = this->NumberofNodes(this->interpolation);
+	if(this->isserved_collapsed) numnodes = 2;
+	IssmDouble max=this->element_values[0];
+
+	for(int i=1;i<numnodes;i++){
+		if(this->element_values[i]>max) max=this->element_values[i];
+	}
+	return max;
+}/*}}}*/
+IssmDouble TriaInput2::GetInputMaxAbs(void){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+
+	int        numnodes  = this->NumberofNodes(this->interpolation);
+	if(this->isserved_collapsed) numnodes = 2;
+	IssmDouble maxabs=fabs(this->element_values[0]);
+
+	for(int i=1;i<numnodes;i++){
+		if(fabs(this->element_values[i])>maxabs) maxabs=fabs(this->element_values[i]);
+	}
+	return maxabs;
+}/*}}}*/
+void TriaInput2::GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, Gauss* gauss){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+
+	if(this->isserved_collapsed){
+		_assert_(gauss->Enum()==GaussSegEnum);
+		if(this->interpolation==P0Enum){
+			derivativevalues[0] = 0.;
+		}
+		else{
+			SegRef temp;
+			temp.GetInputDerivativeValue(derivativevalues,this->element_values,xyz_list,(GaussSeg*)gauss,P1Enum);
+		}
+	}
+	else{
+		_assert_(gauss->Enum()==GaussTriaEnum);
+		TriaRef::GetInputDerivativeValue(derivativevalues,this->element_values,xyz_list,(GaussTria*)gauss,this->interpolation);
+	}
+}/*}}}*/
+void TriaInput2::GetInputValue(IssmDouble* pvalue,Gauss* gauss){/*{{{*/
+	_assert_(this);
+	_assert_(this->isserved);
+	if(this->isserved_collapsed){
+		_assert_(gauss->Enum()==GaussSegEnum);
+		if(this->interpolation==P0Enum){
+			*pvalue = this->element_values[0];
+		}
+		else{
+			SegRef temp;
+			temp.GetInputValue(pvalue,this->element_values,(GaussSeg*)gauss,P1Enum);
+		}
+	}
+	else{
+		_assert_(gauss->Enum()==GaussTriaEnum);
+		TriaRef::GetInputValue(pvalue,this->element_values,(GaussTria*)gauss,this->interpolation);
+	}
+}/*}}}*/
+int  TriaInput2::GetResultArraySize(void){/*{{{*/
+	return 1;
+}
+/*}}}*/
+int  TriaInput2::GetResultInterpolation(void){/*{{{*/
+	if(this->interpolation==P0Enum || this->interpolation==P0DGEnum){
+		return P0Enum;
+	}
+	return P1Enum;
+}/*}}}*/
+int  TriaInput2::GetResultNumberOfNodes(void){/*{{{*/
+	return this->N;
+}
+/*}}}*/
+void TriaInput2::Scale(IssmDouble alpha){/*{{{*/
+
+	for(int i=0;i<this->M*this->N;i++) this->values[i] = alpha*this->values[i];
+	for(int i=0;i<TriaRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*this->element_values[i];
+}
+/*}}}*/
+void TriaInput2::AXPY(Input2* xinput,IssmDouble alpha){/*{{{*/
+
+	/*xinput is of the same type, so cast it: */
+	if(xinput->ObjectEnum()!=TriaInput2Enum) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum()));
+	TriaInput2* xtriainput=xDynamicCast<TriaInput2*>(xinput);
+	if(xtriainput->GetInterpolation()!=this->interpolation) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum()));
+
+	/*Carry out the AXPY operation depending on type:*/
+	for(int i=0;i<this->M*this->N;i++) this->values[i] = alpha*xtriainput->values[i] + this->values[i];
+	for(int i=0;i<TriaRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*xtriainput->element_values[i] + this->element_values[i];
+}
+/*}}}*/
+
+/*Object functions*/
Index: /issm/trunk-jpl/src/c/classes/Inputs2/TriaInput2.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs2/TriaInput2.h	(revision 24335)
+++ /issm/trunk-jpl/src/c/classes/Inputs2/TriaInput2.h	(revision 24335)
@@ -0,0 +1,52 @@
+#ifndef _TRIAINPUT2_H_
+#define _TRIAINPUT2_H_
+
+/*Headers:*/
+#include "./ElementInput2.h"
+#include "../Elements/TriaRef.h"
+
+class TriaInput2: public ElementInput2, public TriaRef{
+
+	private:
+		int isserved_collapsed;
+		int collapsed_ids[2];
+	public:
+		/*TriaInput2 constructors, destructors: {{{*/
+		TriaInput2();
+		TriaInput2(int nbe_in,int nbv_in,int interp_in);
+		~TriaInput2();
+		/*}}}*/
+		/*Object virtual functions definitions:{{{ */
+		Input2 *copy();
+		void    DeepEcho();
+		void    Echo();
+		int     Id();
+		void    Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
+		int     ObjectEnum();
+		/*}}}*/
+		/*TriaInput2 management: {{{*/
+		void SetInput(int interp_in,int row,IssmDouble value_in);
+		void SetInput(int interp_in,int numinds,int* rows,IssmDouble* values_in);
+		void SetInput(int interp_in,int row,int numinds,IssmDouble* values_in);
+		int  GetInterpolation();
+		void GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, Gauss* gauss);
+		void GetInputAverage(IssmDouble* pvalue);
+		IssmDouble GetInputMin();
+		IssmDouble GetInputMax();
+		IssmDouble GetInputMaxAbs();
+		TriaInput2* GetTriaInput(){return this;};
+		void GetInputValue(IssmDouble* pvalue,Gauss* gauss);
+		void Scale(IssmDouble scalar);
+		void AXPY(Input2* xinput,IssmDouble scalar);
+		void Serve(int numindices,int* indices);
+		void Serve(int row,int numindices);
+		void ServeCollapsed(int row,int id0,int in1);
+		void SetServeCollapsed(bool);
+		int  GetResultArraySize(void);
+		int  GetResultInterpolation(void);
+		int  GetResultNumberOfNodes(void);
+		/*}}}*/
+		void Reset(int interp_in);
+
+};
+#endif  /* _TRIAINPUT_H */
Index: /issm/trunk-jpl/src/c/classes/IoModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 24335)
@@ -141,4 +141,5 @@
 	this->my_hedges=NULL;
 	this->my_vertices=NULL;
+	this->my_vertices_lids=NULL;
 	this->epart=NULL;
 
@@ -206,12 +207,13 @@
 
 	/*Initialize permanent data: */
-	this->my_elements = NULL;
-	this->my_faces    = NULL;
-	this->my_vfaces   = NULL;
-	this->my_edges    = NULL;
-	this->my_vedges   = NULL;
-	this->my_hedges   = NULL;
-	this->my_vertices = NULL;
-	this->epart       = NULL;
+	this->my_elements      = NULL;
+	this->my_faces         = NULL;
+	this->my_vfaces        = NULL;
+	this->my_edges         = NULL;
+	this->my_vedges        = NULL;
+	this->my_hedges        = NULL;
+	this->my_vertices      = NULL;
+	this->my_vertices_lids = NULL;
+	this->epart            = NULL;
 
 	FindConstant(&this->domaintype,"md.mesh.domain_type");
@@ -264,4 +266,5 @@
 	xDelete<bool>(this->my_hedges);
 	xDelete<bool>(this->my_vertices);
+	xDelete<int>(this->my_vertices_lids);
 	xDelete<int>(this->epart);
 
@@ -1594,5 +1597,5 @@
 }
 /*}}}*/
-void  IoModel::FetchDataToInput(Elements* elements,const char* vector_name,int input_enum,IssmDouble default_value){/*{{{*/
+void  IoModel::FetchDataToInput(Inputs2* inputs2,Elements* elements,const char* vector_name,int input_enum,IssmDouble default_value){/*{{{*/
 
 	/*First, look whether it is not already loaded in this->data*/
@@ -1604,5 +1607,5 @@
 			for(int i=0;i<elements->Size();i++){
 				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-				element->InputCreate(iodata->data,this,iodata->M,iodata->N,iodata->layout,input_enum,iodata->code);//we need i to index into elements.
+				element->InputCreate(iodata->data,inputs2,this,iodata->M,iodata->N,iodata->layout,input_enum,iodata->code);//we need i to index into elements.
 			}
 			return;
@@ -1625,6 +1628,10 @@
 	for(int i=0;i<elements->Size();i++){
 		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-		if(!doublearray) element->AddInput(input_enum,&default_value,P0Enum);
-		else             element->InputCreate(doublearray,this,M,N,vector_layout,input_enum,code);//we need i to index into elements.
+		if(!doublearray){
+			element->SetElementInput(inputs2,input_enum,default_value);
+		}
+		else{
+			element->InputCreate(doublearray,inputs2,this,M,N,vector_layout,input_enum,code);//we need i to index into elements.
+		}
 	}
 
@@ -1633,5 +1640,5 @@
 }
 /*}}}*/
-void  IoModel::FetchDataToInput(Elements* elements,const char* vector_name,int input_enum){/*{{{*/
+void  IoModel::FetchDataToInput(Inputs2* inputs2,Elements* elements,const char* vector_name,int input_enum){/*{{{*/
 
 	/*First, look whether it is not already loaded in this->data*/
@@ -1642,5 +1649,5 @@
 			for(int i=0;i<elements->Size();i++){
 				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-				element->InputCreate(iodata->data,this,iodata->M,iodata->N,iodata->layout,input_enum,iodata->code);//we need i to index into elements.
+				element->InputCreate(iodata->data,inputs2,this,iodata->M,iodata->N,iodata->layout,input_enum,iodata->code);//we need i to index into elements.
 			}
 			return;
@@ -1668,5 +1675,5 @@
 			for(i=0;i<elements->Size();i++){
 				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-				element->InputUpdateFromConstant(boolean,input_enum);
+				element->SetBoolInput(inputs2,input_enum,boolean);
 			}
 			break;
@@ -1675,5 +1682,5 @@
 			for(i=0;i<elements->Size();i++){
 				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-				element->InputUpdateFromConstant(integer,input_enum);
+				element->SetIntInput(inputs2,input_enum,integer);
 			}
 			break;
@@ -1682,5 +1689,5 @@
 			for(i=0;i<elements->Size();i++){
 				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-				element->InputUpdateFromConstant(scalar,input_enum);
+				element->SetElementInput(inputs2,input_enum,scalar);
 			}
 			break;
@@ -1690,5 +1697,5 @@
 			for(i=0;i<elements->Size();i++){
 				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-				element->InputCreate(doublearray,this,M,N,vector_layout,input_enum,code);//we need i to index into elements.
+				element->InputCreate(doublearray,inputs2,this,M,N,vector_layout,input_enum,code);//we need i to index into elements.
 			}
 			break;
@@ -1698,5 +1705,5 @@
 			for(i=0;i<elements->Size();i++){
 				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-				element->InputCreate(doublearray,this,M,N,vector_layout,input_enum,code);//we need i to index into elements.
+				element->InputCreate(doublearray,inputs2,this,M,N,vector_layout,input_enum,code);//we need i to index into elements.
 			}
 			break;
@@ -1707,5 +1714,5 @@
 			for(i=0;i<elements->Size();i++){
 				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-				element->InputCreate(doublearray,this,M,N,vector_layout,input_enum,code);//we need i to index into elements.
+				element->InputCreate(doublearray,inputs2,this,M,N,vector_layout,input_enum,code);//we need i to index into elements.
 			}
 			break;
@@ -2592,5 +2599,5 @@
 	}
 	ISSM_MPI_Bcast(&found,1,ISSM_MPI_INT,0,IssmComm::GetComm());
-	if(!found)_error_("could not find data with name \"" << data_name << "\" in binary file");
+	if(!found) _error_("could not find data with name \"" << data_name << "\" in binary file");
 
 	/*Broadcast code and vector type: */
Index: /issm/trunk-jpl/src/c/classes/IoModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/IoModel.h	(revision 24335)
@@ -13,4 +13,5 @@
 class Parameters;
 class Elements;
+class Inputs2;
 class Param;
 class Option;
@@ -70,4 +71,5 @@
 		bool *my_hedges;
 		bool *my_vertices;
+		int  *my_vertices_lids;
 		int  *epart;
 
@@ -137,6 +139,6 @@
 		void        FetchData(Options *options,const char* data_name);
 		void        FetchData(int num,...);
-		void        FetchDataToInput(Elements* elements,const char* vector_name,int input_enum);
-		void        FetchDataToInput(Elements* elements,const char* vector_name,int input_enum,IssmDouble default_value);
+		void        FetchDataToInput(Inputs2* inputs2,Elements* elements,const char* vector_name,int input_enum);
+		void        FetchDataToInput(Inputs2* inputs2,Elements* elements,const char* vector_name,int input_enum,IssmDouble default_value);
 		void        FetchIndependent(const char* dependent_name);
 		void        FetchMultipleData(char***   pstringarray,int* pnumstrings,const char* data_name);
Index: /issm/trunk-jpl/src/c/classes/Loads/Channel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Channel.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Loads/Channel.cpp	(revision 24335)
@@ -387,11 +387,11 @@
 	IssmDouble c_t       = element->FindParam(HydrologyPressureMeltCoefficientEnum);
 
-	Input* h_input      = element->GetInput(HydrologySheetThicknessEnum);_assert_(h_input);
-	Input* H_input      = element->GetInput(ThicknessEnum); _assert_(H_input);
-	Input* b_input      = element->GetInput(BedEnum); _assert_(b_input);
-	Input* B_input      = element->GetInput(MaterialsRheologyBEnum);         _assert_(B_input);
-	Input* n_input      = element->GetInput(MaterialsRheologyNEnum);         _assert_(n_input);
-	Input* ks_input     = element->GetInput(HydrologySheetConductivityEnum); _assert_(ks_input);
-	Input* phi_input    = element->GetInput(HydraulicPotentialEnum);         _assert_(phi_input);
+	Input2* h_input      = element->GetInput2(HydrologySheetThicknessEnum);_assert_(h_input);
+	Input2* H_input      = element->GetInput2(ThicknessEnum); _assert_(H_input);
+	Input2* b_input      = element->GetInput2(BedEnum); _assert_(b_input);
+	Input2* B_input      = element->GetInput2(MaterialsRheologyBEnum);         _assert_(B_input);
+	Input2* n_input      = element->GetInput2(MaterialsRheologyNEnum);         _assert_(n_input);
+	Input2* ks_input     = element->GetInput2(HydrologySheetConductivityEnum); _assert_(ks_input);
+	Input2* phi_input    = element->GetInput2(HydraulicPotentialEnum);         _assert_(phi_input);
 
 	/*Get tangent vector*/
@@ -518,11 +518,11 @@
 	IssmDouble c_t       = element->FindParam(HydrologyPressureMeltCoefficientEnum);
 
-	Input* h_input      = element->GetInput(HydrologySheetThicknessEnum);_assert_(h_input);
-	Input* H_input      = element->GetInput(ThicknessEnum); _assert_(H_input);
-	Input* b_input      = element->GetInput(BedEnum); _assert_(b_input);
-	Input* B_input      = element->GetInput(MaterialsRheologyBEnum);         _assert_(B_input);
-	Input* n_input      = element->GetInput(MaterialsRheologyNEnum);         _assert_(n_input);
-	Input* ks_input     = element->GetInput(HydrologySheetConductivityEnum); _assert_(ks_input);
-	Input* phi_input    = element->GetInput(HydraulicPotentialEnum);         _assert_(phi_input);
+	Input2* h_input      = element->GetInput2(HydrologySheetThicknessEnum);_assert_(h_input);
+	Input2* H_input      = element->GetInput2(ThicknessEnum); _assert_(H_input);
+	Input2* b_input      = element->GetInput2(BedEnum); _assert_(b_input);
+	Input2* B_input      = element->GetInput2(MaterialsRheologyBEnum);         _assert_(B_input);
+	Input2* n_input      = element->GetInput2(MaterialsRheologyNEnum);         _assert_(n_input);
+	Input2* ks_input     = element->GetInput2(HydrologySheetConductivityEnum); _assert_(ks_input);
+	Input2* phi_input    = element->GetInput2(HydraulicPotentialEnum);         _assert_(phi_input);
 
 	/*Get tangent vector*/
@@ -630,11 +630,11 @@
 	IssmDouble dt        = element->FindParam(TimesteppingTimeStepEnum);
 
-	Input* h_input      = element->GetInput(HydrologySheetThicknessEnum);_assert_(h_input);
-	Input* H_input      = element->GetInput(ThicknessEnum); _assert_(H_input);
-	Input* b_input      = element->GetInput(BedEnum); _assert_(b_input);
-	Input* B_input      = element->GetInput(MaterialsRheologyBEnum);         _assert_(B_input);
-	Input* n_input      = element->GetInput(MaterialsRheologyNEnum);         _assert_(n_input);
-	Input* ks_input     = element->GetInput(HydrologySheetConductivityEnum); _assert_(ks_input);
-	Input* phi_input    = element->GetInput(HydraulicPotentialEnum);         _assert_(phi_input);
+	Input2* h_input      = element->GetInput2(HydrologySheetThicknessEnum);_assert_(h_input);
+	Input2* H_input      = element->GetInput2(ThicknessEnum); _assert_(H_input);
+	Input2* b_input      = element->GetInput2(BedEnum); _assert_(b_input);
+	Input2* B_input      = element->GetInput2(MaterialsRheologyBEnum);         _assert_(B_input);
+	Input2* n_input      = element->GetInput2(MaterialsRheologyNEnum);         _assert_(n_input);
+	Input2* ks_input     = element->GetInput2(HydrologySheetConductivityEnum); _assert_(ks_input);
+	Input2* phi_input    = element->GetInput2(HydraulicPotentialEnum);         _assert_(phi_input);
 
 	/*Get tangent vector*/
Index: /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 24335)
@@ -74,6 +74,6 @@
 
 	/*Recover parameters: */
-	element->GetInputValue(&q_exp,FrictionQEnum);
-	element->GetInputValue(&C_param,FrictionCEnum);
+	element->GetInputValue(&q_exp,gauss,FrictionQEnum);
+	element->GetInputValue(&C_param,gauss,FrictionCEnum);
 	element->GetInputValue(&As,gauss,FrictionAsEnum);
 	element->GetInputValue(&n,gauss,MaterialsRheologyNEnum);
@@ -142,6 +142,6 @@
 
 	/*Recover parameters: */
-	element->GetInputValue(&drag_p,FrictionPEnum);
-	element->GetInputValue(&drag_q,FrictionQEnum);
+	element->GetInputValue(&drag_p,gauss,FrictionPEnum);
+	element->GetInputValue(&drag_q,gauss,FrictionQEnum);
 	element->GetInputValue(&drag_coefficient, gauss,FrictionCoefficientEnum);
 
@@ -224,6 +224,6 @@
 
 	/*Recover parameters: */
-	element->GetInputValue(&drag_p,FrictionPEnum);
-	element->GetInputValue(&drag_q,FrictionQEnum);
+	element->GetInputValue(&drag_p,gauss,FrictionPEnum);
+	element->GetInputValue(&drag_q,gauss,FrictionQEnum);
 	element->GetInputValue(&thickness, gauss,ThicknessEnum);
 	element->GetInputValue(&base, gauss,BaseEnum);
@@ -284,6 +284,6 @@
 
 	/*Recover parameters: */
-	element->GetInputValue(&q_exp,FrictionQEnum);
-	element->GetInputValue(&C_param,FrictionCEnum);
+	element->GetInputValue(&q_exp,gauss,FrictionQEnum);
+	element->GetInputValue(&C_param,gauss,FrictionCEnum);
 	element->GetInputValue(&As,gauss,FrictionAsEnum);
 	element->GetInputValue(&n,gauss,MaterialsRheologyNEnum);
@@ -424,7 +424,8 @@
 
 	/*Recover parameters: */
-	element->GetInputValue(&drag_p,FrictionPEnum);
-	element->GetInputValue(&drag_q,FrictionQEnum);
+	element->GetInputValue(&drag_p,gauss,FrictionPEnum);
+	element->GetInputValue(&drag_q,gauss,FrictionQEnum);
 	element->GetInputValue(&drag_coefficient, gauss,FrictionCoefficientEnum);
+	if(element->Id()==1) _printf_(drag_coefficient<<"\n");
 
 	/*compute r and q coefficients: */
@@ -458,6 +459,6 @@
 	/*Recover parameters: */
 	element->parameters->FindParam(&F,FrictionFEnum);
-	element->GetInputValue(&drag_p,FrictionPEnum);
-	element->GetInputValue(&drag_q,FrictionQEnum);
+	element->GetInputValue(&drag_p,gauss,FrictionPEnum);
+	element->GetInputValue(&drag_q,gauss,FrictionQEnum);
 	element->GetInputValue(&thickness, gauss,ThicknessEnum);
 	element->GetInputValue(&base, gauss,BaseEnum);
Index: /issm/trunk-jpl/src/c/classes/Loads/Neumannflux.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Neumannflux.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Loads/Neumannflux.cpp	(revision 24335)
@@ -361,5 +361,5 @@
 	/*Retrieve all inputs and parameters*/
 	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
-	Input* flux_input = tria->inputs->GetInput(HydrologyNeumannfluxEnum);  _assert_(flux_input); 
+	Input2* flux_input = tria->GetInput2(HydrologyNeumannfluxEnum);  _assert_(flux_input); 
 
 	/*Check wether it is an inflow or outflow BC (0 is the middle of the segment)*/
@@ -405,5 +405,5 @@
 	/*Retrieve all inputs and parameters*/
 	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
-	Input* flux_input = tria->inputs->GetInput(HydrologyNeumannfluxEnum);  _assert_(flux_input); 
+	Input2* flux_input = tria->GetInput2(HydrologyNeumannfluxEnum);  _assert_(flux_input); 
 
 	/*Check wether it is an inflow or outflow BC (0 is the middle of the segment)*/
Index: /issm/trunk-jpl/src/c/classes/Loads/Numericalflux.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Numericalflux.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Loads/Numericalflux.cpp	(revision 24335)
@@ -516,6 +516,6 @@
 	/*Retrieve all inputs and parameters*/
 	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
-	Input* vxaverage_input=tria->inputs->GetInput(VxEnum);
-	Input* vyaverage_input=tria->inputs->GetInput(VyEnum);
+	Input2* vxaverage_input=tria->GetInput2(VxEnum); _assert_(vxaverage_input); 
+	Input2* vyaverage_input=tria->GetInput2(VyEnum); _assert_(vyaverage_input); 
 	GetNormal(&normal[0],xyz_list);
 
@@ -591,6 +591,6 @@
 	/*Retrieve all inputs and parameters*/
 	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
-	Input* vxaverage_input=tria->inputs->GetInput(VxEnum);
-	Input* vyaverage_input=tria->inputs->GetInput(VyEnum);
+	Input2* vxaverage_input=tria->GetInput2(VxEnum); _assert_(vxaverage_input); 
+	Input2* vyaverage_input=tria->GetInput2(VyEnum); _assert_(vyaverage_input); 
 	GetNormal(&normal[0],xyz_list);
 
@@ -688,6 +688,6 @@
 	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
 	IssmDouble dt = parameters->FindParam(TimesteppingTimeStepEnum);
-	Input* vxaverage_input=tria->inputs->GetInput(VxEnum); _assert_(vxaverage_input);
-	Input* vyaverage_input=tria->inputs->GetInput(VyEnum); _assert_(vyaverage_input);
+	Input2* vxaverage_input=tria->GetInput2(VxEnum); _assert_(vxaverage_input);
+	Input2* vyaverage_input=tria->GetInput2(VyEnum); _assert_(vyaverage_input);
 	GetNormal(&normal[0],xyz_list);
 
@@ -764,6 +764,6 @@
 	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
 	IssmDouble dt = parameters->FindParam(TimesteppingTimeStepEnum);
-	Input* vxaverage_input=tria->inputs->GetInput(VxEnum);
-	Input* vyaverage_input=tria->inputs->GetInput(VyEnum);
+	Input2* vxaverage_input=tria->GetInput2(VxEnum); _assert_(vxaverage_input); 
+	Input2* vyaverage_input=tria->GetInput2(VyEnum); _assert_(vyaverage_input); 
 	GetNormal(&normal[0],xyz_list);
 
@@ -866,7 +866,7 @@
 	/*Retrieve all inputs and parameters*/
 	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
-	Input* vxaverage_input = tria->inputs->GetInput(VxEnum);        _assert_(vxaverage_input);
-	Input* vyaverage_input = tria->inputs->GetInput(VyEnum);        _assert_(vyaverage_input);
-	Input* thickness_input = tria->inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
+	Input2* vxaverage_input = tria->GetInput2(VxEnum);        _assert_(vxaverage_input);
+	Input2* vyaverage_input = tria->GetInput2(VyEnum);        _assert_(vyaverage_input);
+	Input2* thickness_input = tria->GetInput2(ThicknessEnum); _assert_(thickness_input);
 	GetNormal(&normal[0],xyz_list);
 
@@ -947,7 +947,7 @@
 	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
 	IssmDouble dt = parameters->FindParam(TimesteppingTimeStepEnum);
-	Input* vxaverage_input    = tria->inputs->GetInput(VxEnum);                        _assert_(vxaverage_input);
-	Input* vyaverage_input    = tria->inputs->GetInput(VyEnum);                        _assert_(vyaverage_input);
-	Input* spcthickness_input = tria->inputs->GetInput(MasstransportSpcthicknessEnum); _assert_(spcthickness_input);
+	Input2* vxaverage_input    = tria->GetInput2(VxEnum);                        _assert_(vxaverage_input);
+	Input2* vyaverage_input    = tria->GetInput2(VyEnum);                        _assert_(vyaverage_input);
+	Input2* spcthickness_input = tria->GetInput2(MasstransportSpcthicknessEnum); _assert_(spcthickness_input);
 	GetNormal(&normal[0],xyz_list);
 
Index: /issm/trunk-jpl/src/c/classes/Materials/Material.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Materials/Material.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Materials/Material.h	(revision 24335)
@@ -16,4 +16,5 @@
 class Gauss;
 class Input;
+class Input2;
 /*}}}*/
 
@@ -56,4 +57,12 @@
 		virtual void       ViscosityBSSA(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble epseff)=0;
 
+		virtual void       ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input)=0;
+		virtual void       ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input)=0;
+		virtual void       ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* surf)=0;
+		virtual void       ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input)=0;
+		virtual void       ViscosityBFS(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input,IssmDouble epseff)=0;
+		virtual void       ViscosityBHO(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,IssmDouble epseff)=0;
+		virtual void       ViscosityBSSA(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,IssmDouble epseff)=0;
+
 };
 #endif
Index: /issm/trunk-jpl/src/c/classes/Materials/Matestar.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Materials/Matestar.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Materials/Matestar.cpp	(revision 24335)
@@ -160,5 +160,5 @@
 	IssmDouble B;
 
-	Input* B_input = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
+	Input2* B_input = element->GetInput2(MaterialsRheologyBEnum); _assert_(B_input);
 	B_input->GetInputValue(&B,gauss);
 	return B;
@@ -170,5 +170,5 @@
 	IssmDouble Bbar;
 
-	Input* B_input = element->GetInput(MaterialsRheologyBbarEnum); _assert_(B_input);
+	Input2* B_input = element->GetInput2(MaterialsRheologyBbarEnum); _assert_(B_input);
 	B_input->GetInputValue(&Bbar,gauss);
 	return Bbar;
@@ -189,5 +189,5 @@
 	IssmDouble Ec;
 
-	Input* Ec_input = element->GetInput(MaterialsRheologyEcEnum); _assert_(Ec_input);
+	Input2* Ec_input = element->GetInput2(MaterialsRheologyEcEnum); _assert_(Ec_input);
 	Ec_input->GetInputValue(&Ec,gauss);
 	return Ec;
@@ -199,5 +199,5 @@
 	IssmDouble Ecbar;
 
-	Input* Ecbar_input = element->GetInput(MaterialsRheologyEcbarEnum); _assert_(Ecbar_input);
+	Input2* Ecbar_input = element->GetInput2(MaterialsRheologyEcbarEnum); _assert_(Ecbar_input);
 	Ecbar_input->GetInputValue(&Ecbar,gauss);
 	return Ecbar;
@@ -209,5 +209,5 @@
 	IssmDouble Es;
 
-	Input* Es_input = element->GetInput(MaterialsRheologyEsEnum); _assert_(Es_input);
+	Input2* Es_input = element->GetInput2(MaterialsRheologyEsEnum); _assert_(Es_input);
 	Es_input->GetInputValue(&Es,gauss);
 	return Es;
@@ -219,5 +219,5 @@
 	IssmDouble Esbar;
 
-	Input* Esbar_input = element->GetInput(MaterialsRheologyEsbarEnum); _assert_(Esbar_input);
+	Input2* Esbar_input = element->GetInput2(MaterialsRheologyEsbarEnum); _assert_(Esbar_input);
 	Esbar_input->GetInputValue(&Esbar,gauss);
 	return Esbar;
@@ -617,2 +617,223 @@
 	_error_("not implemented yet");
 }/*}}}*/
+
+void  Matestar::ViscosityBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input,IssmDouble eps_eff){/*{{{*/
+
+	/*Intermediaries*/
+	IssmDouble vx,vy,vz;
+	IssmDouble dvx[3],dvy[3],dvz[3];
+	bool isdepthaveraged=0.;
+
+	/*Get velocity derivatives in all directions*/
+	_assert_(dim>1);
+	_assert_(vx_input);
+	vx_input->GetInputValue(&vx,gauss);
+	vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+	_assert_(vy_input);
+	vy_input->GetInputValue(&vy,gauss);
+	vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
+	if(dim==3){
+		_assert_(vz_input);
+		vz_input->GetInputValue(&vz,gauss);
+		vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
+	}
+	else{
+		vz = 0.;
+		dvz[0] = 0.; dvz[1] = 0.; dvz[2] = 0.;
+	}
+
+	/*Compute dmudB*/
+	*pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
+}
+/*}}}*/
+void  Matestar::ViscosityBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,IssmDouble eps_eff){/*{{{*/
+
+	/*Intermediaries*/
+	IssmDouble vx,vy,vz;
+	IssmDouble dvx[3],dvy[3],dvz[3];
+	bool isdepthaveraged=0.;
+
+	/*Get velocity derivatives in all directions*/
+	_assert_(dim==2 || dim==3);
+	_assert_(vx_input);
+	vx_input->GetInputValue(&vx,gauss);
+	vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+	if(dim==3){
+		_assert_(vy_input);
+		vy_input->GetInputValue(&vy,gauss);
+		vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
+	}
+	else{
+		dvx[2] = 0.;
+		vy = 0.;
+		dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
+	}
+	vz = 0.;
+	dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
+
+	/*Compute viscosity*/
+	*pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
+}/*}}}*/
+void  Matestar::ViscosityBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,IssmDouble eps_eff){/*{{{*/
+	/*Intermediaries*/
+	IssmDouble vx,vy,vz;
+	IssmDouble dvx[3],dvy[3],dvz[3];
+	bool isdepthaveraged=1.;
+
+	/*Get velocity derivatives in all directions*/
+	_assert_(dim==1 || dim==2);
+	_assert_(vx_input);
+	vx_input->GetInputValue(&vx,gauss);
+	vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+	if(dim==2){
+		_assert_(vy_input);
+		vy_input->GetInputValue(&vy,gauss);
+		vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
+	}
+	else{
+		dvx[1] = 0.;
+		dvx[2] = 0.;
+		vy = 0.;
+		dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
+	}
+	dvx[2] = 0.;
+	dvy[2] = 0.;
+	vz = 0.;
+	dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
+
+	/*Compute viscosity*/
+	*pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
+}/*}}}*/
+void  Matestar::ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input){/*{{{*/
+
+	/*Intermediaries*/
+	IssmDouble vx,vy,vz;
+	IssmDouble dvx[3],dvy[3],dvz[3];
+	IssmDouble epsilon3d[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
+	IssmDouble epsilon2d[3]; /* epsilon=[exx,eyy,exy];*/
+	IssmDouble eps_eff,eps0=1.e-27;
+	bool isdepthaveraged=0.;
+
+	/*Get velocity derivatives in all directions*/
+	_assert_(dim>1);
+	_assert_(vx_input);
+	vx_input->GetInputValue(&vx,gauss);
+	vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+	_assert_(vy_input);
+	vy_input->GetInputValue(&vy,gauss);
+	vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
+	if(dim==3){
+		_assert_(vz_input);
+		vz_input->GetInputValue(&vz,gauss);
+		vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
+	}
+	else{
+		vz = 0.;
+		dvz[0] = 0.; dvz[1] = 0.; dvz[2] = 0.;
+	}
+
+	if(dim==3){
+      /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
+		element->StrainRateFS(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input,vz_input);
+		eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[3]*epsilon3d[3] +  epsilon3d[4]*epsilon3d[4] + epsilon3d[5]*epsilon3d[5] + epsilon3d[0]*epsilon3d[1]+eps0*eps0);
+	}
+	else{
+		/* eps_eff^2 = 1/2 ( exx^2 + eyy^2 + 2*exy^2 )*/
+		element->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
+		eps_eff = 1./sqrt(2.)*sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + 2.*epsilon2d[2]*epsilon2d[2]);
+	}
+
+	/*Compute viscosity*/
+	*pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
+}
+/*}}}*/
+void  Matestar::ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){/*{{{*/
+
+	/*Intermediaries*/
+	IssmDouble vx,vy,vz;
+	IssmDouble dvx[3],dvy[3],dvz[3];
+	IssmDouble epsilon3d[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
+	IssmDouble epsilon2d[5]; /* epsilon=[exx,exy];*/
+	IssmDouble eps_eff;
+	bool isdepthaveraged=0.;
+
+   if(dim==3){
+		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
+		element->StrainRateHO(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input);
+		eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[2]*epsilon3d[2] +  epsilon3d[3]*epsilon3d[3] + epsilon3d[4]*epsilon3d[4] + epsilon3d[0]*epsilon3d[1]);
+	}
+	else{
+		/* eps_eff^2 = 1/2 (2*exx^2 + 2*exy^2 ) (since eps_zz = - eps_xx)*/
+		element->StrainRateHO2dvertical(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
+		eps_eff = 1./sqrt(2.)*sqrt(2*epsilon2d[0]*epsilon2d[0] + 2*epsilon2d[1]*epsilon2d[1]);
+	}
+
+	/*Get velocity derivatives in all directions*/
+	_assert_(dim==2 || dim==3);
+	_assert_(vx_input);
+	vx_input->GetInputValue(&vx,gauss);
+	vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+	if(dim==3){
+		_assert_(vy_input);
+		vy_input->GetInputValue(&vy,gauss);
+		vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
+	}
+	else{
+		dvx[2] = 0.;
+		vy = 0.;
+		dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
+	}
+	vz = 0.;
+	dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
+
+	/*Compute viscosity*/
+	*pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
+}/*}}}*/
+void  Matestar::ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* surface_input){/*{{{*/
+	_error_("not implemented yet");
+}/*}}}*/
+void  Matestar::ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){/*{{{*/
+
+	/*Intermediaries*/
+	IssmDouble vx,vy,vz;
+	IssmDouble dvx[3],dvy[3],dvz[3];
+	IssmDouble epsilon2d[3];/* epsilon=[exx,eyy,exy]; */
+	IssmDouble epsilon1d;   /* epsilon=[exx];         */
+	IssmDouble eps_eff;
+	bool isdepthaveraged=1.;
+
+	/*Get velocity derivatives in all directions*/
+	_assert_(dim==1 || dim==2);
+	_assert_(vx_input);
+	vx_input->GetInputValue(&vx,gauss);
+	vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+	if(dim==2){
+		_assert_(vy_input);
+		vy_input->GetInputValue(&vy,gauss);
+		vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
+	}
+	else{
+		dvx[1] = 0.;
+		dvx[2] = 0.;
+		vy = 0.;
+		dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
+	}
+	dvx[2] = 0.;
+	dvy[2] = 0.;
+	vz = 0.;
+	dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
+
+   if(dim==2){
+		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exx*eyy*/
+		element->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
+		eps_eff = sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + epsilon2d[2]*epsilon2d[2] + epsilon2d[0]*epsilon2d[1]);
+	}
+	else{
+		/* eps_eff^2 = exx^2*/
+		element->StrainRateSSA1d(&epsilon1d,xyz_list,gauss,vx_input);
+		eps_eff = fabs(epsilon1d);
+	}
+
+	/*Compute viscosity*/
+	*pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Materials/Matestar.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Materials/Matestar.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Materials/Matestar.h	(revision 24335)
@@ -81,4 +81,12 @@
 		void       ViscosityBHO(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble eps_eff);
 		void       ViscosityBSSA(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble eps_eff);
+
+		void       ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input);
+		void       ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input);
+		void       ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* surf);
+		void       ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input);
+		void       ViscosityBFS(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input,IssmDouble eps_eff);
+		void       ViscosityBHO(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,IssmDouble eps_eff);
+		void       ViscosityBSSA(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,IssmDouble eps_eff);
 		/*}}}*/
 		IssmDouble GetViscosityGeneral(IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz,IssmDouble eps_eff,bool isdepthaveraged,Gauss* gauss);
Index: /issm/trunk-jpl/src/c/classes/Materials/Matice.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Materials/Matice.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Materials/Matice.cpp	(revision 24335)
@@ -221,6 +221,5 @@
 	/*Output*/
 	IssmDouble B;
-
-	Input* B_input = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
+	Input2* B_input = element->GetInput2(MaterialsRheologyBEnum); _assert_(B_input);
 	B_input->GetInputValue(&B,gauss);
 	return B;
@@ -234,5 +233,5 @@
 	IssmDouble Bbar;
 
-	Input* B_input = element->GetInput(MaterialsRheologyBbarEnum); _assert_(B_input);
+	Input2* B_input = element->GetInput2(MaterialsRheologyBbarEnum); _assert_(B_input);
 	B_input->GetInputValue(&Bbar,gauss);
 	return Bbar;
@@ -245,5 +244,5 @@
 	IssmDouble D;
 	if(this->isdamaged){
-		Input* D_input = element->GetInput(DamageDEnum); _assert_(D_input);
+		Input2* D_input = element->GetInput2(DamageDEnum); _assert_(D_input);
 		D_input->GetInputValue(&D,gauss);
 	}
@@ -260,5 +259,5 @@
 	IssmDouble Dbar;
 	if(this->isdamaged){
-		Input* D_input = element->GetInput(DamageDbarEnum); _assert_(D_input);
+		Input2* D_input = element->GetInput2(DamageDbarEnum); _assert_(D_input);
 		D_input->GetInputValue(&Dbar,gauss);
 	}
@@ -274,5 +273,5 @@
 	/*Output*/
 	IssmDouble E;
-	Input* E_input = element->GetInput(MaterialsRheologyEEnum); _assert_(E_input);
+	Input2* E_input = element->GetInput2(MaterialsRheologyEEnum); _assert_(E_input);
 	E_input->GetInputValue(&E,gauss);
 	return E;
@@ -284,5 +283,5 @@
 	/*Output*/
 	IssmDouble Ebar;
-	Input* E_input = element->GetInput(MaterialsRheologyEbarEnum); _assert_(E_input);
+	Input2* E_input = element->GetInput2(MaterialsRheologyEbarEnum); _assert_(E_input);
 	E_input->GetInputValue(&Ebar,gauss);
 	return Ebar;
@@ -293,6 +292,6 @@
 	/*Output*/
 	IssmDouble n;
-
-	element->inputs->GetInputAverage(&n,MaterialsRheologyNEnum);
+	Input2* n_input = element->GetInput2(MaterialsRheologyNEnum); _assert_(n_input);
+	n_input->GetInputAverage(&n);
 	return n;
 }
@@ -825,2 +824,152 @@
 	this->GetViscosity2dDerivativeEpsSquare(pmu_prime,epsilon,gauss);
 }/*}}}*/
+
+void  Matice::ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input){/*{{{*/
+	/*The effective strain rate is defined in Paterson 3d Ed p 91 eq 9,
+	 * and Cuffey p 303 eq 8.18:
+	 *
+	 *  2 eps_eff^2 = eps_xx^2 + eps_yy^2 + eps_zz^2 + 2(eps_xy^2 + eps_xz^2 + eps_yz^2)
+	 *
+	 *  or
+	 *
+	 *  eps_eff = 1/sqrt(2) sqrt( \sum_ij eps_ij^2 )
+	 *
+	 *          = 1/sqrt(2) ||eps||_F
+	 *
+	 *  where ||.||_F is the Frobenius norm */
+
+	/*Intermediaries*/
+	IssmDouble viscosity;
+	IssmDouble epsilon3d[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
+	IssmDouble epsilon2d[3]; /* epsilon=[exx,eyy,exy];            */
+	IssmDouble eps_eff;
+	IssmDouble eps0=1.e-27;
+
+	if(dim==3){
+		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
+		element->StrainRateFS(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input,vz_input);
+		eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[3]*epsilon3d[3] +  epsilon3d[4]*epsilon3d[4] + epsilon3d[5]*epsilon3d[5] + epsilon3d[0]*epsilon3d[1]+eps0*eps0);
+	}
+	else{
+		/* eps_eff^2 = 1/2 ( exx^2 + eyy^2 + 2*exy^2 )*/
+		element->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
+		eps_eff = 1./sqrt(2.)*sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + 2.*epsilon2d[2]*epsilon2d[2]);
+	}
+
+	/*Get viscosity*/
+	this->GetViscosity(&viscosity,eps_eff,gauss);
+
+	/*Assign output pointer*/
+	*pviscosity=viscosity;
+}
+/*}}}*/
+void  Matice::ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){/*{{{*/
+
+	/*Intermediaries*/
+	IssmDouble viscosity;
+	IssmDouble epsilon3d[5];/* epsilon=[exx,eyy,exy,exz,eyz];*/
+	IssmDouble epsilon2d[2];/* epsilon=[exx,exy];            */
+	IssmDouble eps_eff;
+
+	if(dim==3){
+		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
+		element->StrainRateHO(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input);
+		eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[2]*epsilon3d[2] +  epsilon3d[3]*epsilon3d[3] + epsilon3d[4]*epsilon3d[4] + epsilon3d[0]*epsilon3d[1]);
+	}
+	else{
+		/* eps_eff^2 = 1/2 (2*exx^2 + 2*exy^2 ) (since eps_zz = - eps_xx)*/
+		element->StrainRateHO2dvertical(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
+		eps_eff = 1./sqrt(2.)*sqrt(2*epsilon2d[0]*epsilon2d[0] + 2*epsilon2d[1]*epsilon2d[1]);
+	}
+
+	/*Get viscosity*/
+	this->GetViscosity(&viscosity,eps_eff,gauss);
+	_assert_(!xIsNan<IssmDouble>(viscosity));
+
+	/*Assign output pointer*/
+	*pviscosity=viscosity;
+}/*}}}*/
+void  Matice::ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* surface_input){/*{{{*/
+	/*Compute the L1L2 viscosity
+	 *
+	 *      1
+	 * mu = - A^-1 (sigma'_e)^(1-n)
+	 *      2
+	 *
+	 * sigma'_e^2 = |sigma'_//|^2 + |sigma'_perp|^2 (see Perego 2012 eq. 17,18)
+	 *
+	 * L1L2 assumptions:
+	 *
+	 * (1) |eps_b|_// = A (|sigma'_//|^2 + |sigma'_perp|^2)^((n-1)/2) |sigma'_//|
+	 * (2) |sigma'_perp|^2 = |rho g (s-z) grad(s)|^2
+	 *
+	 * Assuming that n = 3, we have a polynom of degree 3 to solve (the only unkown is X=|sigma'_//|)
+	 *
+	 * A X^3 + A |rho g (s-z) grad(s)|^2 X - |eps_b|_// = 0     */
+
+	IssmDouble z,s,viscosity,p,q,delta;
+	IssmDouble tau_perp,tau_par,eps_b,A;
+	IssmDouble epsilon[5];   /*exx eyy exy exz eyz*/
+	IssmDouble slope[3];
+
+	/*Check that both inputs have been found*/
+	if (!vx_input || !vy_input || !surface_input) _error_("Input missing");
+
+	/*Get tau_perp*/
+	surface_input->GetInputValue(&s,gauss);
+	surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
+	z=this->element->GetZcoord(xyz_list,gauss);
+	tau_perp = element->FindParam(MaterialsRhoIceEnum) * element->FindParam(ConstantsGEnum) * fabs(s-z)*sqrt(slope[0]*slope[0]+slope[1]*slope[1]);
+
+	/* Get eps_b*/
+	element->StrainRateHO(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
+	eps_b = sqrt(epsilon[0]*epsilon[0] + epsilon[1]*epsilon[1] + epsilon[0]*epsilon[1] + epsilon[2]*epsilon[2]);
+	if(eps_b==0.){
+		*pviscosity = 2.5e+17;
+		return;
+	}
+
+	/*Get A*/
+	_assert_(this->GetN()==3.0);
+	A=this->GetA(gauss);
+
+	/*Solve for tau_perp (http://fr.wikipedia.org/wiki/Méthode_de_Cardan)*/
+	p     = tau_perp *tau_perp;
+	q     = - eps_b/A;
+	delta = q *q + p*p*p*4./27.;
+	_assert_(delta>0);
+	tau_par = pow(0.5*(-q+sqrt(delta)),1./3.) - pow(0.5*(q+sqrt(delta)),1./3.);
+
+	/*Viscosity*/
+	viscosity = 1./(2.*A*(tau_par*tau_par + tau_perp*tau_perp));
+	_assert_(!xIsNan(viscosity));
+	_assert_(viscosity > 0.);
+
+	/*Assign output pointer*/
+	*pviscosity = viscosity;
+}/*}}}*/
+void  Matice::ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){/*{{{*/
+
+	/*Intermediaries*/
+	IssmDouble viscosity;
+	IssmDouble epsilon2d[3];/* epsilon=[exx,eyy,exy];    */
+	IssmDouble epsilon1d;   /* epsilon=[exx];    */
+	IssmDouble eps_eff;
+
+	if(dim==2){
+		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exx*eyy*/
+		element->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
+		eps_eff = sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + epsilon2d[2]*epsilon2d[2] + epsilon2d[0]*epsilon2d[1]);
+	}
+	else{
+		/* eps_eff^2 = exx^2*/
+		element->StrainRateSSA1d(&epsilon1d,xyz_list,gauss,vx_input);
+		eps_eff = fabs(epsilon1d);
+	}
+
+	/*Get viscosity*/
+	this->GetViscosityBar(&viscosity,eps_eff,gauss);
+
+	/*Assign output pointer*/
+	*pviscosity=viscosity;
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Materials/Matice.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Materials/Matice.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Materials/Matice.h	(revision 24335)
@@ -83,4 +83,12 @@
 		void       ViscosityBHO(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble eps_eff){_error_("not supported");};
 		void       ViscosityBSSA(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble eps_eff){_error_("not supported");};
+
+		void       ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input);
+		void       ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input);
+		void       ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* surf);
+		void       ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input);
+		void       ViscosityBFS(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input,IssmDouble eps_eff){_error_("not supported");};
+		void       ViscosityBHO(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,IssmDouble eps_eff){_error_("not supported");};
+		void       ViscosityBSSA(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,IssmDouble eps_eff){_error_("not supported");};
 		/*}}}*/
 };
Index: /issm/trunk-jpl/src/c/classes/Materials/Matlitho.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Materials/Matlitho.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Materials/Matlitho.h	(revision 24335)
@@ -73,4 +73,13 @@
 		void       ViscosityBSSA(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble epseff){_error_("not supported");};
 
+
+		void       ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input){_error_("not supported");};
+		void       ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){_error_("not supported");};
+		void       ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* surf){_error_("not supported");};
+		void       ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){_error_("not supported");};
+		void       ViscosityBFS(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input,IssmDouble epseff){_error_("not supported");};
+		void       ViscosityBHO(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,IssmDouble epseff){_error_("not supported");};
+		void       ViscosityBSSA(IssmDouble* pmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,IssmDouble epseff){_error_("not supported");};
+
 		/*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/Misfit.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Misfit.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Misfit.cpp	(revision 24335)
@@ -235,6 +235,6 @@
 		 model=OutputDefinitionsResponsex(femmodel,this->model_enum);
 		 /*Now, the observation is buried inside the elements, go fish it in the first element (cludgy, needs fixing): */
-		 Element* element=(Element*)femmodel->elements->GetObjectByOffset(0); _assert_(element);
-		 Input* input = element->GetInput(observation_enum); _assert_(input);
+		 Element* element = (Element*)femmodel->elements->GetObjectByOffset(0); _assert_(element);
+		 Input2*  input   = element->GetInput2(observation_enum); _assert_(input);
 		 input->GetInputAverage(&observation);
 
Index: /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 24335)
@@ -233,5 +233,5 @@
 			}
 			else if(obj_enum==GenericParamEnum){
-				/*Skip for now (we don't want to Marhsall Comms*/
+				/*Skip for now (we don't want to Marhsall Comms)*/
 			}
 		}
Index: /issm/trunk-jpl/src/c/classes/Vertices.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Vertices.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Vertices.cpp	(revision 24335)
@@ -171,5 +171,5 @@
 /*}}}*/
 
-void Vertices::Finalize(){/*{{{*/
+void Vertices::Finalize(IoModel* iomodel){/*{{{*/
 
 	/*Here we do 3 things:
@@ -195,12 +195,23 @@
 
 	/*2. Distribute lids (First: masters, then clones)*/
+	iomodel->my_vertices_lids=xNew<int>(this->numberofvertices);
+	for(int i=0;i<this->numberofvertices;i++) iomodel->my_vertices_lids[i] = -1;
+
 	int lid = 0;
 	for(int i=0;i<this->Size();i++){
 		Vertex* vertex=xDynamicCast<Vertex*>(this->GetObjectByOffset(i));
-		if(!vertex->clone) vertex->lid=lid++;
-	}
-	for(int i=0;i<this->Size();i++){
-		Vertex* vertex=xDynamicCast<Vertex*>(this->GetObjectByOffset(i));
-		if(vertex->clone) vertex->lid=lid++;
+		if(!vertex->clone){
+			vertex->lid=lid;
+			iomodel->my_vertices_lids[vertex->sid] = lid;
+			lid++;
+		}
+	}
+	for(int i=0;i<this->Size();i++){
+		Vertex* vertex=xDynamicCast<Vertex*>(this->GetObjectByOffset(i));
+		if(vertex->clone){
+			vertex->lid=lid;
+			iomodel->my_vertices_lids[vertex->sid] = lid;
+			lid++;
+		}
 	}
 
Index: /issm/trunk-jpl/src/c/classes/Vertices.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Vertices.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/Vertices.h	(revision 24335)
@@ -5,4 +5,5 @@
 #include "../datastructures/datastructures.h"
 #include "../shared/shared.h"
+class IoModel;
 
 /*!\brief Declaration of Vertices class.
@@ -33,5 +34,5 @@
 
 		/*numerics:*/
-		void  Finalize(void);
+		void  Finalize(IoModel* iomodel);
 		int   NumberOfVertices(void);
 		int   NumberOfVerticesLocal(void);
Index: /issm/trunk-jpl/src/c/classes/classes.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/classes.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/classes/classes.h	(revision 24335)
@@ -81,4 +81,8 @@
 #include "./Inputs/TransientInput.h"
 
+/*Inputs2*/
+#include "./Inputs2/Inputs2.h"
+#include "./Inputs2/Input2.h"
+
 /*ExternalResults: */
 #include "./ExternalResults/Results.h"
Index: /issm/trunk-jpl/src/c/cores/control_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/control_core.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/cores/control_core.cpp	(revision 24335)
@@ -143,5 +143,4 @@
 	/*Update control input*/
 	SetControlInputsFromVectorx(femmodel,X);
-	
 	
 	/*solve forward: */
Index: /issm/trunk-jpl/src/c/cores/hydrology_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/hydrology_core.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/cores/hydrology_core.cpp	(revision 24335)
@@ -178,4 +178,5 @@
 		if(VerboseSolution()) _printf0_("   updating water column\n");
 		HydrologyPismAnalysis* analysis = new HydrologyPismAnalysis();
+		InputDuplicatex(femmodel,WatercolumnEnum,WaterColumnOldEnum);
 		analysis->UpdateWaterColumn(femmodel);
 		delete analysis;
Index: /issm/trunk-jpl/src/c/cores/masstransport_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/masstransport_core.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/cores/masstransport_core.cpp	(revision 24335)
@@ -62,4 +62,7 @@
 		femmodel->SetCurrentConfiguration(MasstransportAnalysisEnum);
 		InputDuplicatex(femmodel,ThicknessEnum,ThicknessOldEnum);
+		InputDuplicatex(femmodel,BaseEnum,BaseOldEnum);
+		InputDuplicatex(femmodel,SurfaceEnum,SurfaceOldEnum);
+		InputDuplicatex(femmodel,SealevelriseCumDeltathicknessEnum,SealevelriseCumDeltathicknessOldEnum);
 		if(stabilization==4){
 			solutionsequence_fct(femmodel);
Index: /issm/trunk-jpl/src/c/cores/sealevelrise_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/sealevelrise_core.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/cores/sealevelrise_core.cpp	(revision 24335)
@@ -192,5 +192,5 @@
 
 		//reset cumdeltathickness  to 0: 
-		InputUpdateFromConstantx(femmodel->elements,0.,SealevelriseCumDeltathicknessEnum);
+		InputUpdateFromConstantx(femmodel->inputs2,femmodel->elements,0.,SealevelriseCumDeltathicknessEnum);
 	}
 
Index: /issm/trunk-jpl/src/c/cores/thermal_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/thermal_core.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/cores/thermal_core.cpp	(revision 24335)
@@ -14,5 +14,5 @@
 
 	/*Start profiler*/
-        femmodel->profiler->Start(THERMALCORE);
+	femmodel->profiler->Start(THERMALCORE);
 
 	/*intermediary*/
@@ -34,4 +34,5 @@
 
 	if(isenthalpy){
+		femmodel->InputMakeDiscontinuous(BasalforcingsGroundediceMeltingRateEnum);
 		enthalpy_analysis = new EnthalpyAnalysis();
 		enthalpy_analysis->Core(femmodel);
Index: /issm/trunk-jpl/src/c/main/esmfbinders.cpp
===================================================================
--- /issm/trunk-jpl/src/c/main/esmfbinders.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/main/esmfbinders.cpp	(revision 24335)
@@ -114,5 +114,5 @@
 
 						/*Recover surface from the ISSM element: */
-						Input* surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input);
+						Input2* surface_input = element->GetInput2(SurfaceEnum); _assert_(surface_input);
 						surface_input->GetInputAverage(&surface);
 
Index: /issm/trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.cpp	(revision 24335)
@@ -9,32 +9,28 @@
 #include "../../classes/classes.h"
 
-int	ConfigureObjectsx( Elements* elements, Loads* loads, Nodes* nodes, Vertices* vertices, Materials* materials,Parameters* parameters){
-
-	/*Intermediary*/
-	int       i;
-	int       noerr = 1;
-	int       configuration_type;
-	Element  *element            = NULL;
-	Load     *load               = NULL;
-	Material *material           = NULL;
+int	ConfigureObjectsx( Elements* elements, Loads* loads, Nodes* nodes, Vertices* vertices, Materials* materials,Parameters* parameters,Inputs2* inputs2){
 
 	/*Get analysis type: */
+	int configuration_type;
 	parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
 
 	if(VerboseMProcessor()) _printf0_("      Configuring elements...\n");
-	for(i=0;i<elements->Size();i++){
-		element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-		element->Configure(elements,loads,nodes,vertices,materials,parameters);
+	for(int i=0;i<elements->Size();i++){
+		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+		element->Configure(elements,loads,nodes,vertices,materials,parameters,inputs2);
 	}
 	if(VerboseMProcessor()) _printf0_("      Configuring loads...\n");
-	for(i=0;i<loads->Size();i++){
-		load=(Load*)loads->GetObjectByOffset(i);
+	for(int i=0;i<loads->Size();i++){
+		Load* load=(Load*)loads->GetObjectByOffset(i);
 		load->Configure(elements,loads,nodes,vertices,materials,parameters);
 	}
 	if(VerboseMProcessor()) _printf0_("      Configuring materials...\n");
-	for(i=0;i<materials->Size();i++){
-		material=(Material*)materials->GetObjectByOffset(i);
+	for(int i=0;i<materials->Size();i++){
+		Material* material=(Material*)materials->GetObjectByOffset(i);
 		material->Configure(elements);
 	}
-	return noerr;
+	if(VerboseMProcessor()) _printf0_("      Configuring inputs...\n");
+	inputs2->Configure(parameters);
+
+	return 1;
 }
Index: /issm/trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.h	(revision 24335)
@@ -9,5 +9,5 @@
 
 /* local prototypes: */
-int ConfigureObjectsx( Elements* elements, Loads* loads, Nodes* nodes, Vertices* vertices, Materials* materials, Parameters* parameters);
+int ConfigureObjectsx( Elements* elements, Loads* loads, Nodes* nodes, Vertices* vertices, Materials* materials, Parameters* parameters,Inputs2* inputs2);
 
 #endif  /* _CONFIGUREOBJECTSX_H */
Index: /issm/trunk-jpl/src/c/modules/Damagex/Damagex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/Damagex/Damagex.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/Damagex/Damagex.cpp	(revision 24335)
@@ -4,4 +4,5 @@
 
 #include "./Damagex.h"
+#include "../InputDuplicatex/InputDuplicatex.h"
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
@@ -17,4 +18,6 @@
 		case 0:
 			if(VerboseModule()) _printf0_("   computing damage analytically\n");
+			InputDuplicatex(femmodel,DamageDEnum,DamageDOldEnum);
+			InputDuplicatex(femmodel,DamageDbarEnum,DamageDbarOldEnum);
 			femmodel->ElementOperationx(&Element::ComputeNewDamage);
 			break;
Index: /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp	(revision 24335)
@@ -7,4 +7,5 @@
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
+#include "../../classes/Inputs2/DatasetInput2.h"
 
 void DragCoefficientAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
@@ -59,6 +60,6 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* weights_input=basalelement->GetInput(InversionCostFunctionsCoefficientsEnum);   _assert_(weights_input);
-	Input* drag_input   =basalelement->GetInput(FrictionCoefficientEnum); _assert_(drag_input);
+	DatasetInput2* weights_input=basalelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum);   _assert_(weights_input);
+	Input2* drag_input   =basalelement->GetInput2(FrictionCoefficientEnum); _assert_(drag_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.cpp	(revision 24335)
@@ -4,4 +4,5 @@
 
 #include "./FloatingiceMeltingRatePicox.h"
+#include "../InputDuplicatex/InputDuplicatex.h"
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
@@ -17,5 +18,5 @@
 		int numvertices = element->GetNumberOfVertices();
 		IssmDouble* values = xNewZeroInit<IssmDouble>(numvertices);
-		element->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
+		element->AddInput2(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
 		xDelete<IssmDouble>(values);
 	}
@@ -45,8 +46,8 @@
 	IssmDouble* dmax_basin_cpu=xNew<IssmDouble>(num_basins);
 
-	femmodel->elements->InputDuplicate(MaskGroundediceLevelsetEnum,DistanceToGroundinglineEnum);
+	InputDuplicatex(femmodel,MaskGroundediceLevelsetEnum,DistanceToGroundinglineEnum);
 	femmodel->DistanceToFieldValue(MaskGroundediceLevelsetEnum,0.,DistanceToGroundinglineEnum);
 
-	femmodel->elements->InputDuplicate(MaskIceLevelsetEnum,DistanceToCalvingfrontEnum);
+	InputDuplicatex(femmodel,MaskIceLevelsetEnum,DistanceToCalvingfrontEnum);
 	femmodel->DistanceToFieldValue(MaskIceLevelsetEnum,0.,DistanceToCalvingfrontEnum);
 
@@ -60,5 +61,5 @@
 		distances=xNew<IssmDouble>(numvertices);
 		element->GetInputListOnVertices(&distances[0],DistanceToGroundinglineEnum);
-		element->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
+		element->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
 		for(int k=0; k<numvertices; k++){
 			if(fabs(distances[k])>maxdist_cpu){maxdist_cpu=fabs(distances[k]);}
@@ -116,6 +117,6 @@
 		Element* basalelement = element->SpawnBasalElement();
 		if(!basalelement->IsIceInElement() || !basalelement->IsFloating()) continue;
-		basalelement->inputs->GetInputValue(&boxid,BasalforcingsPicoBoxIdEnum);
-		basalelement->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
+		basalelement->GetInputValue(&boxid,BasalforcingsPicoBoxIdEnum);
+		basalelement->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
 		boxareas[basinid*maxbox+boxid]+=basalelement->GetHorizontalSurfaceArea();
 		basalelement->FindParam(&domaintype,DomainTypeEnum);
@@ -165,11 +166,11 @@
 		if(!basalelement->IsIceInElement() || !basalelement->IsFloating()) continue;
 		int el_boxid;
-		basalelement->inputs->GetInputValue(&el_boxid,BasalforcingsPicoBoxIdEnum);
+		basalelement->GetInputValue(&el_boxid,BasalforcingsPicoBoxIdEnum);
 		if(el_boxid!=boxid) continue;
 
-		Input* tocs_input=basalelement->GetInput(BasalforcingsPicoSubShelfOceanTempEnum); _assert_(tocs_input); 
-		Input* socs_input=basalelement->GetInput(BasalforcingsPicoSubShelfOceanSalinityEnum); _assert_(socs_input);
-
-		basalelement->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
+		Input2* tocs_input=basalelement->GetInput2(BasalforcingsPicoSubShelfOceanTempEnum); _assert_(tocs_input); 
+		Input2* socs_input=basalelement->GetInput2(BasalforcingsPicoSubShelfOceanSalinityEnum); _assert_(socs_input);
+
+		basalelement->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
 		Gauss* gauss=basalelement->NewGauss(1); gauss->GaussPoint(0);
 		tocs_input->GetInputValue(&toc,gauss);
@@ -206,10 +207,10 @@
 			if(!basalelement->IsIceInElement() || !basalelement->IsFloating()) continue;
 			int el_boxid;
-			basalelement->inputs->GetInputValue(&el_boxid,BasalforcingsPicoBoxIdEnum);
+			basalelement->GetInputValue(&el_boxid,BasalforcingsPicoBoxIdEnum);
 			if(el_boxid!=boxid) continue;
 
-	     	Input* overturnings_input=basalelement->GetInput(BasalforcingsPicoSubShelfOceanOverturningEnum); _assert_(overturnings_input);
-
-			basalelement->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
+	     	Input2* overturnings_input=basalelement->GetInput2(BasalforcingsPicoSubShelfOceanOverturningEnum); _assert_(overturnings_input);
+
+			basalelement->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
 			Gauss* gauss=basalelement->NewGauss(1); gauss->GaussPoint(0);
 			overturnings_input->GetInputValue(&overturning,gauss);
Index: /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp	(revision 24335)
@@ -6,4 +6,5 @@
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
+#include "./../../classes/Inputs2/DatasetInput2.h"
 
 void FloatingiceMeltingRatex(FemModel* femmodel){/*{{{*/
@@ -102,6 +103,6 @@
 		if(!element->IsIceInElement() || !element->IsFloating() || !element->IsOnBase()){
 			IssmDouble* values = xNewZeroInit<IssmDouble>(numvertices);
-			element->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
-			element->AddInput(BasalforcingsIsmip6TfShelfEnum,values,P1Enum);
+			element->AddInput2(BasalforcingsFloatingiceMeltingRateEnum,values,P1DGEnum);
+			element->AddInput2(BasalforcingsIsmip6TfShelfEnum,values,P1DGEnum);
 			xDelete<IssmDouble>(values);
 			continue;
@@ -109,7 +110,7 @@
 
 		/*Get TF on all vertices*/
-		IssmDouble* tf_test        = xNew<IssmDouble>(numvertices);
-		IssmDouble* depth_vertices = xNew<IssmDouble>(numvertices);
-		Input*      tf_input = element->GetInput(BasalforcingsIsmip6TfEnum); _assert_(tf_input);
+		IssmDouble*    tf_test        = xNew<IssmDouble>(numvertices);
+		IssmDouble*    depth_vertices = xNew<IssmDouble>(numvertices);
+		DatasetInput2* tf_input = element->GetDatasetInput2(BasalforcingsIsmip6TfEnum); _assert_(tf_input);
 
 		element->GetInputListOnVertices(&depth_vertices[0],BaseEnum);
@@ -148,5 +149,5 @@
 		}
 
-		element->AddInput(BasalforcingsIsmip6TfShelfEnum,tf_test,P1Enum);
+		element->AddInput2(BasalforcingsIsmip6TfShelfEnum,tf_test,P1DGEnum);
 		xDelete<IssmDouble>(tf_test);
 		xDelete<IssmDouble>(depth_vertices);
@@ -161,6 +162,6 @@
 			/*Spawn basal element if on base to compute element area*/
 			Element* basalelement = element->SpawnBasalElement();
-			Input* tf_input=basalelement->GetInput(BasalforcingsIsmip6TfShelfEnum); _assert_(tf_input);
-			basalelement->inputs->GetInputValue(&basinid,BasalforcingsIsmip6BasinIdEnum);
+			Input2* tf_input=basalelement->GetInput2(BasalforcingsIsmip6TfShelfEnum); _assert_(tf_input);
+			basalelement->GetInputValue(&basinid,BasalforcingsIsmip6BasinIdEnum);
 			Gauss* gauss=basalelement->NewGauss(1); gauss->GaussPoint(0);
 			tf_input->GetInputValue(&tf,gauss);
Index: /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 24335)
@@ -102,7 +102,7 @@
 
 	/*Get active vector first*/
-	Vector<IssmDouble>*   activevector=NULL;
-	IssmPDouble*          vector=NULL;
-	int                   size;
+	Vector<IssmDouble> *activevector = NULL;
+	IssmPDouble        *vector       = NULL;
+	int                size;
 
 	/*Retrieve some parameters*/
Index: /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp	(revision 24335)
@@ -87,5 +87,5 @@
 	/*We go find the input of the first element, and query its interpolation type: */
 	Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(0));
-	Input* input=element->GetInput(name); 
+	Input2* input=element->GetInput2(name); 
 	if (!input) _error_("could not find input: " << name);
 
Index: /issm/trunk-jpl/src/c/modules/InputDuplicatex/InputDuplicatex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputDuplicatex/InputDuplicatex.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/InputDuplicatex/InputDuplicatex.cpp	(revision 24335)
@@ -9,8 +9,4 @@
 
 void InputDuplicatex(FemModel* femmodel,int original_enum, int new_enum){
-	/*Go through elemnets, and ask to reinitialie the input: */
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
-		element->InputDuplicate(original_enum,new_enum);
-	}
+	femmodel->inputs2->DuplicateInput(original_enum,new_enum);
 }
Index: /issm/trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp	(revision 24335)
@@ -6,4 +6,5 @@
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
+#include "../../classes/Inputs2/Inputs2.h"
 
 void InputUpdateFromConstantx(FemModel* femmodel,bool constant, int name){
@@ -49,5 +50,5 @@
 	}
 }
-void InputUpdateFromConstantx(Elements* elements,IssmDouble constant, int name){
+void InputUpdateFromConstantx(Inputs2* inputs2,Elements* elements,IssmDouble constant, int name){
 
 	if(VerboseModule()) _printf0_("   Input updates from constant\n");
@@ -56,5 +57,6 @@
 	for(int i=0;i<elements->Size();i++){
 		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-		element->InputUpdateFromConstant(constant,name);
+		element->SetElementInput(inputs2,name,constant);
+		//element->InputUpdateFromConstant(constant,name);
 	}
 }
Index: /issm/trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.h	(revision 24335)
@@ -7,4 +7,5 @@
 
 #include "../../classes/classes.h"
+class Inputs2;
 
 /* local prototypes: */
@@ -12,5 +13,5 @@
 void InputUpdateFromConstantx(FemModel* femmodel,int        constant,int name);
 void InputUpdateFromConstantx(FemModel* femmodel,IssmDouble constant,int name);
-void InputUpdateFromConstantx(Elements* elements,IssmDouble constant,int name);
+void InputUpdateFromConstantx(Inputs2* inputs2,Elements* elements,IssmDouble constant,int name);
 
 #endif  /* _UPDATEINPUTSFROMCONSTANTXX_H */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 24335)
@@ -9,14 +9,24 @@
 #include "../ModelProcessorx.h"
 
-void	UpdateElementsAndMaterialsControl(Elements* elements,Parameters* parameters,Materials* materials, IoModel* iomodel){
+void	UpdateElementsAndMaterialsControl(Elements* elements,Parameters* parameters,Inputs2* inputs2,Materials* materials, IoModel* iomodel){
 	/*Intermediary*/
 	bool       control_analysis;
+	int        M,N;
 	int        control,cost_function,domaintype;
 	int        num_controls,num_cost_functions;
-	Element   *element          = NULL;
-	Material  *material         = NULL;
-	int       *control_enums    = NULL;
-	char     **controls         = NULL;
-	char     **cost_functions   = NULL;
+	IssmDouble yts,scale;
+	Element     *element          = NULL;
+	Material    *material         = NULL;
+	int         *control_enums    = NULL;
+	char       **controls         = NULL;
+	char       **cost_functions   = NULL;
+	IssmDouble  *independent      = NULL;
+	IssmDouble  *independents_min = NULL;
+	IssmDouble  *independents_max = NULL;
+	IssmDouble  *weights          = NULL;
+
+	/*Fetch parameters: */
+	iomodel->FindConstant(&control_analysis,"md.inversion.iscontrol");
+	if(!control_analysis) return;
 
 	/*Fetch parameters: */
@@ -24,16 +34,10 @@
 	iomodel->FindConstant(&isautodiff,"md.autodiff.isautodiff");
 	if(isautodiff){
-		UpdateElementsAndMaterialsControlAD(elements,parameters,materials,iomodel);
+		UpdateElementsAndMaterialsControlAD(elements,parameters,inputs2,materials,iomodel);
 		return;
 	}
 
-	/*Fetch parameters: */
-	iomodel->FindConstant(&control_analysis,"md.inversion.iscontrol");
-	if(control_analysis) iomodel->FindConstant(&num_controls,"md.inversion.num_control_parameters");
-
-	/*Now, return if no control*/
-	if(!control_analysis) return;
-
 	/*Process controls and convert from string to enums*/
+	iomodel->FindConstant(&num_controls,"md.inversion.num_control_parameters");
 	iomodel->FindConstant(&controls,&num_controls,"md.inversion.control_parameters");
 	if(num_controls<1) _error_("no controls found");
@@ -52,13 +56,23 @@
 	}
 
-	iomodel->FetchData(3,"md.inversion.cost_functions_coefficients","md.inversion.min_parameters","md.inversion.max_parameters");
-
-	/*Fetch Observations */
+	/*Fetch Observations and add to inputs*/
 	iomodel->FindConstant(&domaintype,"md.mesh.domain_type");
+	iomodel->FindConstant(&yts,"md.constants.yts");
+	iomodel->FetchData(&weights,&M,&N,"md.inversion.cost_functions_coefficients");
+
+	/*Transpose weights for simplicity!*/
+	if(M*N && N>1){
+		IssmDouble* weights_transp = xNew<IssmDouble>(M*N);
+		for(int i=0;i<M;i++) for(int j=0;j<N;j++) weights_transp[j*M+i] = weights[i*N+j];
+		xDelete<IssmDouble>(weights);
+		weights = weights_transp;
+	}
+
+	if(M!=iomodel->numberofvertices && N!=num_cost_functions) _error_("not supported");
 	for(int i=0;i<num_cost_functions;i++){
 		cost_function=cost_function_enums[i];
-		if(     cost_function==ThicknessAbsMisfitEnum) iomodel->FetchDataToInput(elements,"md.inversion.thickness_obs",InversionThicknessObsEnum);
-		else if(cost_function==SurfaceAbsMisfitEnum)   iomodel->FetchDataToInput(elements,"md.inversion.surface_obs",InversionSurfaceObsEnum);
-		else if(cost_function==RheologyBInitialguessMisfitEnum) iomodel->FetchDataToInput(elements,"md.materials.rheology_B",RheologyBInitialguessEnum);
+		if(     cost_function==ThicknessAbsMisfitEnum) iomodel->FetchDataToInput(inputs2,elements,"md.inversion.thickness_obs",InversionThicknessObsEnum);
+		else if(cost_function==SurfaceAbsMisfitEnum)   iomodel->FetchDataToInput(inputs2,elements,"md.inversion.surface_obs",InversionSurfaceObsEnum);
+		else if(cost_function==RheologyBInitialguessMisfitEnum) iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_B",RheologyBInitialguessEnum);
 		else if(cost_function==SurfaceAbsVelMisfitEnum
 			  || cost_function==SurfaceRelVelMisfitEnum
@@ -66,41 +80,73 @@
 			  || cost_function==SurfaceLogVxVyMisfitEnum
 			  || cost_function==SurfaceAverageVelMisfitEnum){
-			iomodel->FetchDataToInput(elements,"md.inversion.vx_obs",InversionVxObsEnum);
-			if(domaintype!=Domain2DverticalEnum) iomodel->FetchDataToInput(elements,"md.inversion.vy_obs",InversionVyObsEnum); 
+			iomodel->FetchDataToInput(inputs2,elements,"md.inversion.vx_obs",InversionVxObsEnum);
+			if(domaintype!=Domain2DverticalEnum) iomodel->FetchDataToInput(inputs2,elements,"md.inversion.vy_obs",InversionVyObsEnum); 
+		}
+		for(int j=0;j<elements->Size();j++){
+			Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
+			element->DatasetInputAdd(InversionCostFunctionsCoefficientsEnum,&weights[i*iomodel->numberofvertices],inputs2,iomodel,M,1,1,cost_function,7,cost_function);
 		}
 	}
 	parameters->AddObject(new IntParam(ControlInputSizeMEnum,iomodel->numberofvertices));
+	xDelete<IssmDouble>(weights);
+
+	/*Get controls*/
+	iomodel->FetchData(&independents_min,&M,&N,"md.inversion.min_parameters");
+	if(M!=iomodel->numberofvertices && N!=num_controls) _error_("not supported");
+	iomodel->FetchData(&independents_max,&M,&N,"md.inversion.max_parameters");
+	if(M!=iomodel->numberofvertices && N!=num_controls) _error_("not supported");
+
+	/*Transpose weights for simplicity!*/
+	if(M*N && N>1){
+		IssmDouble* independents_min_transp = xNew<IssmDouble>(M*N);
+		for(int i=0;i<M;i++) for(int j=0;j<N;j++) independents_min_transp[j*M+i] = independents_min[i*N+j];
+		xDelete<IssmDouble>(independents_min);
+		independents_min = independents_min_transp;
+
+		IssmDouble* independents_max_transp = xNew<IssmDouble>(M*N);
+		for(int i=0;i<M;i++) for(int j=0;j<N;j++) independents_max_transp[j*M+i] = independents_max[i*N+j];
+		xDelete<IssmDouble>(independents_max);
+		independents_max = independents_max_transp;
+	}
 
 	for(int i=0;i<num_controls;i++){
 		control = control_enums[i];
+		scale   = 1.;
+
 		switch(control){
 			/*List of supported controls*/
-			case BalancethicknessThickeningRateEnum:      iomodel->FetchData(1,"md.balancethickness.thickening_rate"); break;
-			case BalancethicknessSpcthicknessEnum:        iomodel->FetchData(1,"md.balancethickness.spcthickness"); break;
-			case VxEnum:                                  iomodel->FetchData(1,"md.initialization.vx"); break;
-			case VyEnum:                                  iomodel->FetchData(1,"md.initialization.vy"); break;
-			case ThicknessEnum:                           iomodel->FetchData(1,"md.geometry.thickness"); break;
-			case FrictionCoefficientEnum:                 iomodel->FetchData(1,"md.friction.coefficient"); break;
-			case FrictionAsEnum:                          iomodel->FetchData(1,"md.friction.As"); break;
-			case BalancethicknessApparentMassbalanceEnum: iomodel->FetchData(1,"md.balancethickness.apparent_massbalance"); break;
-			case BalancethicknessOmegaEnum:               iomodel->FetchData(1,"md.balancethickness.omega"); break;
-			case MaterialsRheologyBEnum:                  iomodel->FetchData(1,"md.materials.rheology_B"); break;
+			case BalancethicknessThickeningRateEnum:      iomodel->FetchData(&independent,&M,&N,"md.balancethickness.thickening_rate");scale = 1./yts; break; 
+			case BalancethicknessSpcthicknessEnum:        iomodel->FetchData(&independent,&M,&N,"md.balancethickness.spcthickness");                   break; 
+			case VxEnum:                                  iomodel->FetchData(&independent,&M,&N,"md.initialization.vx");scale = 1./yts;                break; 
+			case VyEnum:                                  iomodel->FetchData(&independent,&M,&N,"md.initialization.vy");scale = 1./yts;                break; 
+			case ThicknessEnum:                           iomodel->FetchData(&independent,&M,&N,"md.geometry.thickness");                              break; 
+			case FrictionCoefficientEnum:                 iomodel->FetchData(&independent,&M,&N,"md.friction.coefficient");                            break; 
+			case FrictionAsEnum:                          iomodel->FetchData(&independent,&M,&N,"md.friction.As");                                     break; 
+			case BalancethicknessApparentMassbalanceEnum: iomodel->FetchData(&independent,&M,&N,"md.balancethickness.apparent_massbalance");           break; 
+			case BalancethicknessOmegaEnum:               iomodel->FetchData(&independent,&M,&N,"md.balancethickness.omega");                          break; 
+			case MaterialsRheologyBEnum:                  iomodel->FetchData(&independent,&M,&N,"md.materials.rheology_B");                            break; 
 			/*Special cases*/
-			case MaterialsRheologyBbarEnum: iomodel->FetchData(1,"md.materials.rheology_B"); break;
-			case DamageDbarEnum:            iomodel->FetchData(1,"md.damage.D");            break;
+			case MaterialsRheologyBbarEnum:               iomodel->FetchData(&independent,&M,&N,"md.materials.rheology_B");                            break; 
+			case DamageDbarEnum:                          iomodel->FetchData(&independent,&M,&N,"md.damage.D");                                        break; 
 			default:
 				_error_("Control " << EnumToStringx(control) << " not implemented yet");
 		}
-	}
-
-	/*Update elements: */
-	int counter=0;
-	for(int i=0;i<iomodel->numberofelements;i++){
-		if(iomodel->my_elements[i]){
-			element=(Element*)elements->GetObjectByOffset(counter);
-			element->InputUpdateFromIoModel(i,iomodel); //we need i to index into elements.
-			counter++;
-		}
-	}
+		if(M!=iomodel->numberofvertices && N!=1) _error_("not supported yet");
+
+		/*Special case if 3d*/
+		if(iomodel->domaintype==Domain3DEnum){
+			if(control==MaterialsRheologyBbarEnum) control=MaterialsRheologyBEnum;
+			if(control==DamageDbarEnum)            control=DamageDEnum;
+		}
+
+		for(int j=0;j<elements->Size();j++){
+			Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
+			element->ControlInputCreate(independent,&independents_min[i*iomodel->numberofvertices],&independents_max[i*iomodel->numberofvertices],inputs2,iomodel,M,N,scale,control,i+1);
+		}
+		xDelete<IssmDouble>(independent);
+	}
+	xDelete<IssmDouble>(independents_min);
+	xDelete<IssmDouble>(independents_max);
+
 
 	/*Free data: */
@@ -126,5 +172,4 @@
 	}
 
-	iomodel->DeleteData(3,"md.inversion.cost_functions_coefficients","md.inversion.min_parameters","md.inversion.max_parameters");
 	xDelete<int>(control_enums);
 	xDelete<int>(cost_function_enums);
@@ -134,5 +179,5 @@
 	xDelete<char*>(controls);
 }
-void UpdateElementsAndMaterialsControlAD(Elements* elements,Parameters* parameters,Materials* materials, IoModel* iomodel){
+void UpdateElementsAndMaterialsControlAD(Elements* elements,Parameters* parameters,Inputs2* inputs2,Materials* materials, IoModel* iomodel){
 
 	#if defined(_HAVE_AD_)
@@ -206,5 +251,5 @@
 			for(int j=0;j<elements->Size();j++){
 				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
-				element->ControlInputCreate(independent,independents_min,independents_max,iomodel,M,N,input_enum,i+1);
+				element->ControlInputCreate(independent,independents_min,independents_max,inputs2,iomodel,M,N,1.,input_enum,i+1);
 			}
 			xDelete<IssmDouble>(independent);
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 24335)
@@ -48,14 +48,22 @@
 	/*Create elements*/
 	if(control_analysis && !adolc_analysis)iomodel->FetchData(2,"md.inversion.min_parameters","md.inversion.max_parameters");
-
+	if(iomodel->domaintype==Domain2DverticalEnum || iomodel->domaindim==3)  iomodel->FetchData(2,"md.mesh.vertexonbase","md.mesh.vertexonsurface");
+
+	int count = 0;
 	switch(iomodel->meshelementtype){
 		case TriaEnum:
 			for(int i=0;i<iomodel->numberofelements;i++){
-				if(iomodel->my_elements[i]) elements->AddObject(new Tria(i+1,i,iomodel,nummodels));
+				if(iomodel->my_elements[i]){
+					elements->AddObject(new Tria(i+1,i,count,iomodel,nummodels));
+					count++;
+				}
 			}
 			break;
 		case TetraEnum:
 			for(int i=0;i<iomodel->numberofelements;i++){
-				if(iomodel->my_elements[i]) elements->AddObject(new Tetra(i+1,i,iomodel,nummodels));
+				if(iomodel->my_elements[i]){
+					elements->AddObject(new Tetra(i+1,i,count,iomodel,nummodels));
+					count++;
+				}
 			}
 			break;
@@ -63,5 +71,8 @@
 			iomodel->FetchData(2,"md.mesh.upperelements","md.mesh.lowerelements");
 			for(int i=0;i<iomodel->numberofelements;i++){
-				if(iomodel->my_elements[i]) elements->AddObject(new Penta(i+1,i,iomodel,nummodels));
+				if(iomodel->my_elements[i]){
+					elements->AddObject(new Penta(i+1,i,count,iomodel,nummodels));
+					count++;
+				}
 			}
 			break;
@@ -71,7 +82,8 @@
 
 	/*Free data: */
-	iomodel->DeleteData(4,"md.mesh.upperelements","md.mesh.lowerelements","md.inversion.min_parameters","md.inversion.max_parameters");
-}/*}}}*/
-void CreateMaterials(Elements* elements,Materials* materials,IoModel* iomodel,const int nummodels){/*{{{*/
+	iomodel->DeleteData(6,"md.mesh.upperelements","md.mesh.lowerelements","md.inversion.min_parameters","md.inversion.max_parameters","md.mesh.vertexonbase","md.mesh.vertexonsurface");
+
+}/*}}}*/
+void CreateMaterials(Elements* elements,Inputs2* inputs2,Materials* materials,IoModel* iomodel,const int nummodels){/*{{{*/
 
 	/*Intermediary*/
@@ -84,5 +96,5 @@
 	iomodel->FindConstant(&materials_type,"md.materials.type");
 
-	/*Did we already create the materiaas? : */
+	/*Did we already create the materials? : */
 	_assert_(materials->Size()==0);
 
@@ -90,10 +102,10 @@
 	switch(materials_type){
 		case MaticeEnum:
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
 			for (i=0;i<iomodel->numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matice(i+1,i,iomodel));
 			switch(iomodel->domaindim){
 				case 2:
-					elements->InputDuplicate(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
+					inputs2->DuplicateInput(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
 					break;
 				case 3:
@@ -104,12 +116,12 @@
 			break;
 		case MatenhancediceEnum:
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_E",MaterialsRheologyEEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_E",MaterialsRheologyEEnum);
 			for (i=0;i<iomodel->numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matice(i+1,i,iomodel));
 			switch(iomodel->domaindim){
 				case 2:
-					elements->InputDuplicate(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
-					elements->InputDuplicate(MaterialsRheologyEEnum,MaterialsRheologyEbarEnum);
+					inputs2->DuplicateInput(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
+					inputs2->DuplicateInput(MaterialsRheologyEEnum,MaterialsRheologyEbarEnum);
 					break;
 				case 3:
@@ -120,12 +132,12 @@
 			break;
 		case MatdamageiceEnum:
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
-			iomodel->FetchDataToInput(elements,"md.damage.D",DamageDEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.damage.D",DamageDEnum);
 			for (i=0;i<iomodel->numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matice(i+1,i,iomodel));
 			switch(iomodel->domaindim){
 				case 2:
-					elements->InputDuplicate(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
-					elements->InputDuplicate(DamageDEnum,DamageDbarEnum);
+					inputs2->DuplicateInput(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
+					inputs2->DuplicateInput(DamageDEnum,DamageDbarEnum);
 					break;
 				case 3:
@@ -136,13 +148,13 @@
 			break;
 		case MatestarEnum:
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_Ec",MaterialsRheologyEcEnum);
-			iomodel->FetchDataToInput(elements,"md.materials.rheology_Es",MaterialsRheologyEsEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_Ec",MaterialsRheologyEcEnum);
+			iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_Es",MaterialsRheologyEsEnum);
 			for(i=0;i<iomodel->numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matestar(i+1,i,iomodel));
 			switch(iomodel->domaindim){
 				case 2:
-					elements->InputDuplicate(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
-					elements->InputDuplicate(MaterialsRheologyEcEnum,MaterialsRheologyEcbarEnum);
-					elements->InputDuplicate(MaterialsRheologyEsEnum,MaterialsRheologyEsbarEnum);
+					inputs2->DuplicateInput(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
+					inputs2->DuplicateInput(MaterialsRheologyEcEnum,MaterialsRheologyEcbarEnum);
+					inputs2->DuplicateInput(MaterialsRheologyEsEnum,MaterialsRheologyEsbarEnum);
 					break;
 				case 3:
@@ -170,10 +182,10 @@
 				switch(IoCodeToEnumMaterials(nature[i])){ //{{{
 					case MaticeEnum:
-						iomodel->FetchDataToInput(elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
-						iomodel->FetchDataToInput(elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
+						iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
+						iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
 						for (i=0;i<iomodel->numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matice(i+1,i,iomodel));
 						switch(iomodel->domaindim){
 							case 2:
-								elements->InputDuplicate(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
+								inputs2->DuplicateInput(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
 								break;
 							case 3:
@@ -190,12 +202,12 @@
 
 					case MatenhancediceEnum:
-						iomodel->FetchDataToInput(elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
-						iomodel->FetchDataToInput(elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
-						iomodel->FetchDataToInput(elements,"md.materials.rheology_E",MaterialsRheologyEEnum);
+						iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
+						iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
+						iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_E",MaterialsRheologyEEnum);
 						for (i=0;i<iomodel->numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matice(i+1,i,iomodel));
 						switch(iomodel->domaindim){
 							case 2:
-								elements->InputDuplicate(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
-								elements->InputDuplicate(MaterialsRheologyEEnum,MaterialsRheologyEbarEnum);
+								inputs2->DuplicateInput(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
+								inputs2->DuplicateInput(MaterialsRheologyEEnum,MaterialsRheologyEbarEnum);
 								break;
 							case 3:
@@ -206,12 +218,12 @@
 						break;
 					case MatdamageiceEnum:
-						iomodel->FetchDataToInput(elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
-						iomodel->FetchDataToInput(elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
-						iomodel->FetchDataToInput(elements,"md.damage.D",DamageDEnum);
+						iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
+						iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_n",MaterialsRheologyNEnum);
+						iomodel->FetchDataToInput(inputs2,elements,"md.damage.D",DamageDEnum);
 						for (i=0;i<iomodel->numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matice(i+1,i,iomodel));
 						switch(iomodel->domaindim){
 							case 2:
-								elements->InputDuplicate(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
-								elements->InputDuplicate(DamageDEnum,DamageDbarEnum);
+								inputs2->DuplicateInput(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
+								inputs2->DuplicateInput(DamageDEnum,DamageDbarEnum);
 								break;
 							case 3:
@@ -222,13 +234,13 @@
 						break;
 					case MatestarEnum:
-						iomodel->FetchDataToInput(elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
-						iomodel->FetchDataToInput(elements,"md.materials.rheology_Ec",MaterialsRheologyEcEnum);
-						iomodel->FetchDataToInput(elements,"md.materials.rheology_Es",MaterialsRheologyEsEnum);
+						iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_B",MaterialsRheologyBEnum);
+						iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_Ec",MaterialsRheologyEcEnum);
+						iomodel->FetchDataToInput(inputs2,elements,"md.materials.rheology_Es",MaterialsRheologyEsEnum);
 						for(i=0;i<iomodel->numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matestar(i+1,i,iomodel));
 						switch(iomodel->domaindim){
 							case 2:
-								elements->InputDuplicate(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
-								elements->InputDuplicate(MaterialsRheologyEcEnum,MaterialsRheologyEcbarEnum);
-								elements->InputDuplicate(MaterialsRheologyEsEnum,MaterialsRheologyEsbarEnum);
+								inputs2->DuplicateInput(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
+								inputs2->DuplicateInput(MaterialsRheologyEcEnum,MaterialsRheologyEcbarEnum);
+								inputs2->DuplicateInput(MaterialsRheologyEsEnum,MaterialsRheologyEsbarEnum);
 								break;
 							case 3:
@@ -405,5 +417,4 @@
 		iomodel->FetchData(6,"md.mesh.x","md.mesh.y","md.mesh.z","md.geometry.base","md.geometry.thickness","md.mask.ice_levelset");
 		if (iomodel->domaintype == Domain3DsurfaceEnum) iomodel->FetchData(3,"md.mesh.lat","md.mesh.long","md.mesh.r");
-		else iomodel->FetchDataToInput(elements,"md.mesh.scale_factor",MeshScaleFactorEnum,1.);
 		if (isoceancoupling) iomodel->FetchData(2,"md.mesh.lat","md.mesh.long");
 
@@ -453,4 +464,4 @@
 
 	/*Finalize Initialization*/
-	vertices->Finalize();
-}/*}}}*/
+	vertices->Finalize(iomodel);
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 24335)
@@ -8,5 +8,5 @@
 #include "./ModelProcessorx.h"
 
-void CreateOutputDefinitions(Elements* elements, Parameters* parameters,IoModel* iomodel){
+void CreateOutputDefinitions(Elements* elements,Parameters* parameters,Inputs2* inputs2,IoModel* iomodel){
 
 	int i,j;
@@ -120,6 +120,6 @@
 					for(int k=0;k<elements->Size();k++){
 						Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(k));
-						element->InputCreate(misfit_observation_s[j], iomodel,misfit_observation_M_s[j],misfit_observation_N_s[j],obs_vector_type,StringToEnumx(misfit_observation_string_s[j]),7);
-						element->InputCreate(misfit_weights_s[j], iomodel,misfit_weights_M_s[j],misfit_weights_N_s[j],weight_vector_type,StringToEnumx(misfit_weights_string_s[j]),7);
+						element->InputCreate(misfit_observation_s[j],inputs2,iomodel,misfit_observation_M_s[j],misfit_observation_N_s[j],obs_vector_type,StringToEnumx(misfit_observation_string_s[j]),7);
+						element->InputCreate(misfit_weights_s[j],inputs2,iomodel,misfit_weights_M_s[j],misfit_weights_N_s[j],weight_vector_type,StringToEnumx(misfit_weights_string_s[j]),7);
 					}
 
@@ -130,5 +130,4 @@
 					char* string=NULL;
 					IssmDouble* matrix = NULL;
-
 					string = misfit_definitionstring_s[j];		xDelete<char>(string);
 					string = misfit_observation_string_s[j];	xDelete<char>(string);
@@ -210,9 +209,7 @@
 					/*Now, for this particular cfsurfacesquare object, make sure we plug into the elements: the observation, and the weights.*/
 					for(int k=0;k<elements->Size();k++){
-
 						Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(k));
-
-						element->DatasetInputAdd(StringToEnumx(cfsurfacesquare_definitionstring_s[j]),cfsurfacesquare_observation_s[j], iomodel,cfsurfacesquare_observation_M_s[j],cfsurfacesquare_observation_N_s[j],obs_vector_type,StringToEnumx(cfsurfacesquare_observation_string_s[j]),7,SurfaceObservationEnum);
-						element->DatasetInputAdd(StringToEnumx(cfsurfacesquare_definitionstring_s[j]),cfsurfacesquare_weights_s[j], iomodel,cfsurfacesquare_weights_M_s[j],cfsurfacesquare_weights_N_s[j],weight_vector_type,StringToEnumx(cfsurfacesquare_weights_string_s[j]),7,WeightsSurfaceObservationEnum);
+						element->DatasetInputAdd(StringToEnumx(cfsurfacesquare_definitionstring_s[j]),cfsurfacesquare_observation_s[j],inputs2,iomodel,cfsurfacesquare_observation_M_s[j],cfsurfacesquare_observation_N_s[j],obs_vector_type,StringToEnumx(cfsurfacesquare_observation_string_s[j]),7,SurfaceObservationEnum);
+						element->DatasetInputAdd(StringToEnumx(cfsurfacesquare_definitionstring_s[j]),cfsurfacesquare_weights_s[j],inputs2,iomodel,cfsurfacesquare_weights_M_s[j],cfsurfacesquare_weights_N_s[j],weight_vector_type,StringToEnumx(cfsurfacesquare_weights_string_s[j]),7,WeightsSurfaceObservationEnum);
 
 					}
@@ -285,5 +282,5 @@
 						Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(k));
 
-						element->DatasetInputAdd(StringToEnumx(cfdragcoeffabsgrad_definitionstring_s[j]),cfdragcoeffabsgrad_weights_s[j], iomodel,cfdragcoeffabsgrad_weights_M_s[j],cfdragcoeffabsgrad_weights_N_s[j],weight_vector_type,StringToEnumx(cfdragcoeffabsgrad_weights_string_s[j]),7,WeightsSurfaceObservationEnum);
+						element->DatasetInputAdd(StringToEnumx(cfdragcoeffabsgrad_definitionstring_s[j]),cfdragcoeffabsgrad_weights_s[j],inputs2,iomodel,cfdragcoeffabsgrad_weights_M_s[j],cfdragcoeffabsgrad_weights_N_s[j],weight_vector_type,StringToEnumx(cfdragcoeffabsgrad_weights_string_s[j]),7,WeightsSurfaceObservationEnum);
 
 					}
@@ -368,7 +365,7 @@
 						Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(k));
 
-						element->DatasetInputAdd(StringToEnumx(cfsurfacelogvel_definitionstring[j]),cfsurfacelogvel_vxobs[j], iomodel,cfsurfacelogvel_observation_M[j],cfsurfacelogvel_observation_N[j],obs_vector_type,StringToEnumx(cfsurfacelogvel_vxobs_string[j]),7,VxObsEnum);
-							element->DatasetInputAdd(StringToEnumx(cfsurfacelogvel_definitionstring[j]),cfsurfacelogvel_vyobs[j], iomodel,cfsurfacelogvel_observation_M[j],cfsurfacelogvel_observation_N[j],obs_vector_type,StringToEnumx(cfsurfacelogvel_vyobs_string[j]),7,VyObsEnum);
-						element->DatasetInputAdd(StringToEnumx(cfsurfacelogvel_definitionstring[j]),cfsurfacelogvel_weights[j], iomodel,cfsurfacelogvel_weights_M[j],cfsurfacelogvel_weights_N[j],weight_vector_type,StringToEnumx(cfsurfacelogvel_weightstring[j]),7,WeightsSurfaceObservationEnum);
+						element->DatasetInputAdd(StringToEnumx(cfsurfacelogvel_definitionstring[j]),cfsurfacelogvel_vxobs[j],inputs2,iomodel,cfsurfacelogvel_observation_M[j],cfsurfacelogvel_observation_N[j],obs_vector_type,StringToEnumx(cfsurfacelogvel_vxobs_string[j]),7,VxObsEnum);
+							element->DatasetInputAdd(StringToEnumx(cfsurfacelogvel_definitionstring[j]),cfsurfacelogvel_vyobs[j],inputs2,iomodel,cfsurfacelogvel_observation_M[j],cfsurfacelogvel_observation_N[j],obs_vector_type,StringToEnumx(cfsurfacelogvel_vyobs_string[j]),7,VyObsEnum);
+						element->DatasetInputAdd(StringToEnumx(cfsurfacelogvel_definitionstring[j]),cfsurfacelogvel_weights[j],inputs2,iomodel,cfsurfacelogvel_weights_M[j],cfsurfacelogvel_weights_N[j],weight_vector_type,StringToEnumx(cfsurfacelogvel_weightstring[j]),7,WeightsSurfaceObservationEnum);
 
 					}
@@ -594,6 +591,6 @@
 				for(int i=0;i<num_cost_functions;i++){
 					cost_function=cost_function_enums[i];
-					if(     cost_function==ThicknessAbsMisfitEnum) iomodel->FetchDataToInput(elements,"md.numberedcostfunction.thickness_obs",InversionThicknessObsEnum);
-					else if(cost_function==SurfaceAbsMisfitEnum)   iomodel->FetchDataToInput(elements,"md.numberedcostfunction.surface_obs",InversionSurfaceObsEnum);
+					if(     cost_function==ThicknessAbsMisfitEnum) iomodel->FetchDataToInput(inputs2,elements,"md.numberedcostfunction.thickness_obs",InversionThicknessObsEnum);
+					else if(cost_function==SurfaceAbsMisfitEnum)   iomodel->FetchDataToInput(inputs2,elements,"md.numberedcostfunction.surface_obs",InversionSurfaceObsEnum);
 					else if(cost_function==SurfaceAbsVelMisfitEnum
 							|| cost_function==SurfaceRelVelMisfitEnum
@@ -601,6 +598,6 @@
 							|| cost_function==SurfaceLogVxVyMisfitEnum
 							|| cost_function==SurfaceAverageVelMisfitEnum){
-						iomodel->FetchDataToInput(elements,"md.numberedcostfunction.vx_obs",InversionVxObsEnum);
-						if(domaintype!=Domain2DverticalEnum) iomodel->FetchDataToInput(elements,"md.numberedcostfunction.vy_obs",InversionVyObsEnum);
+						iomodel->FetchDataToInput(inputs2,elements,"md.numberedcostfunction.vx_obs",InversionVxObsEnum);
+						if(domaintype!=Domain2DverticalEnum) iomodel->FetchDataToInput(inputs2,elements,"md.numberedcostfunction.vy_obs",InversionVyObsEnum);
 					}
 				}
@@ -611,5 +608,5 @@
 					for(int k=0;k<elements->Size();k++){
 						Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(k));
-						element->DatasetInputCreate(cost_functions_weights[j],cost_functions_weights_M[j],cost_functions_weights_N[j],cost_function_enums,num_cost_functions,iomodel,InversionCostFunctionsCoefficientsEnum);
+						element->DatasetInputCreate(cost_functions_weights[j],cost_functions_weights_M[j],cost_functions_weights_N[j],cost_function_enums,num_cost_functions,inputs2,iomodel,InversionCostFunctionsCoefficientsEnum);
 					}
 					output_definitions->AddObject(new Numberedcostfunction(ncf_name_s[j],StringToEnumx(ncf_definitionstring_s[j]),num_cost_functions,cost_function_enums));
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Dakota/UpdateElementsAndMaterialsDakota.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Dakota/UpdateElementsAndMaterialsDakota.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Dakota/UpdateElementsAndMaterialsDakota.cpp	(revision 24335)
@@ -9,5 +9,5 @@
 #include "../ModelProcessorx.h"
 
-void	UpdateElementsAndMaterialsDakota(Elements* elements,Materials* materials, IoModel* iomodel){
+void	UpdateElementsAndMaterialsDakota(Elements* elements,Inputs2* inputs2,Materials* materials, IoModel* iomodel){
 
 	/*recover parameters: */
@@ -15,4 +15,4 @@
 	iomodel->FindConstant(&dakota_analysis,"md.qmu.isdakota");
 
-	if(dakota_analysis) iomodel->FetchDataToInput(elements,"md.geometry.hydrostatic_ratio",GeometryHydrostaticRatioEnum,0.);
+	if(dakota_analysis) iomodel->FetchDataToInput(inputs2,elements,"md.geometry.hydrostatic_ratio",GeometryHydrostaticRatioEnum,0.);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 24335)
@@ -13,5 +13,5 @@
 #include "./ModelProcessorx.h"
 
-void ModelProcessorx(Elements** pelements, Nodes*** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints*** pconstraints, Loads*** ploads, Parameters** pparameters,IoModel* iomodel,FILE* toolkitfile, char* rootpath,const int solution_enum,const int nummodels,const int* analysis_enum_list){
+void ModelProcessorx(Elements** pelements, Nodes*** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints*** pconstraints, Loads*** ploads, Parameters** pparameters,Inputs2** pinputs2,IoModel* iomodel,FILE* toolkitfile, char* rootpath,const int solution_enum,const int nummodels,const int* analysis_enum_list){
 	_assert_(nummodels>0);
 
@@ -40,7 +40,13 @@
 	/*Create elements, vertices and materials, independent of analysis_enum: */
 	CreateElements(elements,iomodel,nummodels);
-	CreateMaterials(elements,materials,iomodel,nummodels);
 	CreateVertices(elements,vertices,iomodel,solution_enum);
 	CreateParameters(parameters,iomodel,rootpath,toolkitfile,solution_enum);
+
+	/*Should move to CreateInputs2*/
+	Inputs2 *inputs2 = new Inputs2(elements->Size(),vertices->Size());
+	if (iomodel->domaintype != Domain3DsurfaceEnum) iomodel->FetchDataToInput(inputs2,elements,"md.mesh.scale_factor",MeshScaleFactorEnum,1.);
+
+	/*Can now do Materials since we have created Inputs*/
+	CreateMaterials(elements,inputs2,materials,iomodel,nummodels);
 
 	/*Update datasets based on each analysis (and add nodes, constrains and loads)*/
@@ -54,5 +60,5 @@
 		analysis->UpdateParameters(parameters,iomodel,solution_enum,analysis_enum);
 		analysis->CreateNodes(nodes[i],iomodel);
-		analysis->UpdateElements(elements,iomodel,i,analysis_enum);
+		analysis->UpdateElements(elements,inputs2,iomodel,i,analysis_enum);
 		analysis->CreateConstraints(constraints[i],iomodel);
 		analysis->CreateLoads(loads[i],iomodel);
@@ -67,14 +73,14 @@
 	/*Solution specific updates*/
 	if(VerboseMProcessor()) _printf0_("   updating elements and materials for control parameters" << "\n");
-	UpdateElementsAndMaterialsControl(elements,parameters,materials,iomodel);
+	UpdateElementsAndMaterialsControl(elements,parameters,inputs2,materials,iomodel);
 	#ifdef _HAVE_DAKOTA_
 	if(VerboseMProcessor()) _printf0_("   updating elements and materials for uncertainty quantification" << "\n");
-	UpdateElementsAndMaterialsDakota(elements,materials,iomodel);
+	UpdateElementsAndMaterialsDakota(elements,inputs2,materials,iomodel);
 	#endif
-	if(solution_enum==TransientSolutionEnum) UpdateElementsTransient(elements,parameters,iomodel);
+	if(solution_enum==TransientSolutionEnum) UpdateElementsTransient(elements,parameters,inputs2,iomodel);
 
 	/*Output definitions dataset: */
 	if(VerboseMProcessor()) _printf0_("   creating output definitions" << "\n");
-	CreateOutputDefinitions(elements,parameters,iomodel);
+	CreateOutputDefinitions(elements,parameters,inputs2,iomodel);
 
 	/* Sort datasets:
@@ -94,4 +100,5 @@
 	*ploads       = loads;
 	*pparameters  = parameters;
+	*pinputs2     = inputs2;
 
 	if(VerboseMProcessor()) _printf0_("   done with model processor \n");
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 24335)
@@ -9,9 +9,9 @@
 #include "../../analyses/analyses.h"
 
-void ModelProcessorx(Elements** pelements, Nodes*** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints*** pconstraints, Loads*** ploads, Parameters** pparameters,IoModel* iomodel,FILE* toolkitfile, char* rootpath,const int solution_type,const int nummodels,const int* analysis_type_listh);
+void ModelProcessorx(Elements** pelements, Nodes*** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints*** pconstraints, Loads*** ploads, Parameters** pparameters,Inputs2** pinputs2,IoModel* iomodel,FILE* toolkitfile, char* rootpath,const int solution_type,const int nummodels,const int* analysis_type_listh);
 
 /*Creation of fem datasets: general drivers*/
 void CreateElements(Elements* elements,IoModel* iomodel,int nummodels);
-void CreateMaterials(Elements* elements,Materials* materials,IoModel* iomodel,int nummodels);
+void CreateMaterials(Elements* elements,Inputs2* inputs2,Materials* materials,IoModel* iomodel,int nummodels);
 void CreateVertices(Elements* elements,Vertices* vertices,IoModel* iomodel,int solution_type,bool isamr=false);
 void CreateParameters(Parameters*parameters,IoModel* iomodel,char* rootpath,FILE* toolkitfile,const int solution_type);
@@ -19,9 +19,9 @@
 void CreateParametersControl(Parameters* parameters,IoModel* iomodel,int solution_type);
 void CreateParametersDakota(Parameters* parameters,IoModel* iomodel,char* rootpath);
-void CreateOutputDefinitions(Elements* elements, Parameters* parameters,IoModel* iomodel);
-void UpdateElementsAndMaterialsControl(Elements* elements,Parameters* parameters,Materials* materials, IoModel* iomodel);
-void UpdateElementsAndMaterialsControlAD(Elements* elements,Parameters* parameters,Materials* materials, IoModel* iomodel);
-void UpdateElementsAndMaterialsDakota(Elements* elements,Materials* materials, IoModel* iomodel);
-void UpdateElementsTransient(Elements* elements,Parameters* parameters,IoModel* iomodel);
+void CreateOutputDefinitions(Elements* elements, Parameters* parameters,Inputs2* inputs2,IoModel* iomodel);
+void UpdateElementsAndMaterialsControl(Elements* elements,Parameters* parameters,Inputs2* inputs2,Materials* materials, IoModel* iomodel);
+void UpdateElementsAndMaterialsControlAD(Elements* elements,Parameters* parameters,Inputs2* inputs2,Materials* materials, IoModel* iomodel);
+void UpdateElementsAndMaterialsDakota(Elements* elements,Inputs2* inputs2,Materials* materials, IoModel* iomodel);
+void UpdateElementsTransient(Elements* elements,Parameters* parameters,Inputs2* inputs2,IoModel* iomodel);
 void CreateNodes(Nodes*nodes, IoModel* iomodel,int analysis,int finite_element,bool isamr=false,int approximation=NoneApproximationEnum,int* approximations=NULL);
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Transient/UpdateElementsTransient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Transient/UpdateElementsTransient.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Transient/UpdateElementsTransient.cpp	(revision 24335)
@@ -9,5 +9,5 @@
 #include "../ModelProcessorx.h"
 
-void	UpdateElementsTransient(Elements* elements, Parameters* parameters,IoModel* iomodel){
+void	UpdateElementsTransient(Elements* elements, Parameters* parameters,Inputs2* inputs2,IoModel* iomodel){
 
 	/*FIXME: this should go into parameterization update*/
@@ -17,5 +17,5 @@
 
 	if(isgroundingline){
-		iomodel->FetchDataToInput(elements,"md.geometry.bed",BedEnum);
+		iomodel->FetchDataToInput(inputs2,elements,"md.geometry.bed",BedEnum);
 	}
 }
Index: /issm/trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp	(revision 24335)
@@ -7,4 +7,5 @@
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
+#include "../../classes/Inputs2/DatasetInput2.h"
 
 void RheologyBAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
@@ -53,6 +54,6 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* weights_input=element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* rheologyb_input=element->GetInput(MaterialsRheologyBEnum);                  _assert_(rheologyb_input);
+	DatasetInput2* weights_input=element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* rheologyb_input=element->GetInput2(MaterialsRheologyBEnum);                  _assert_(rheologyb_input);
 
 	/* Start  looping on the number of gaussian points: */
@@ -124,7 +125,7 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* weights_input=element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* rheologyb_input=element->GetInput(MaterialsRheologyBbarEnum);            _assert_(rheologyb_input);
-	Input* rheologyb0_input=element->GetInput(RheologyBInitialguessEnum);           _assert_(rheologyb0_input);
+	DatasetInput2* weights_input=element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* rheologyb_input=element->GetInput2(MaterialsRheologyBbarEnum);            _assert_(rheologyb_input);
+	Input2* rheologyb0_input=element->GetInput2(RheologyBInitialguessEnum);           _assert_(rheologyb0_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp	(revision 24335)
@@ -7,4 +7,5 @@
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
+#include "../../classes/Inputs2/DatasetInput2.h"
 
 void RheologyBbarAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
@@ -59,6 +60,6 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* weights_input=basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* rheologyb_input=basalelement->GetInput(MaterialsRheologyBbarEnum);                  _assert_(rheologyb_input);
+	DatasetInput2* weights_input=basalelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* rheologyb_input=basalelement->GetInput2(MaterialsRheologyBbarEnum);                  _assert_(rheologyb_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 24335)
@@ -27,5 +27,5 @@
 			case TaylorHoodEnum:case XTaylorHoodEnum:case LATaylorHoodEnum:
 			case CrouzeixRaviartEnum:case LACrouzeixRaviartEnum:case OneLayerP4zEnum:{
-				Input* input=element->GetInput(IceMaskNodeActivationEnum);
+				Input2* input=element->GetInput2(IceMaskNodeActivationEnum);
 				if(!input) _error_("Input " << EnumToStringx(IceMaskNodeActivationEnum) << " not found in element");
 
Index: /issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp	(revision 24335)
@@ -7,4 +7,5 @@
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
+#include "../../classes/Inputs2/DatasetInput2.h"
 
 void SurfaceAbsVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
@@ -59,12 +60,12 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* weights_input=topelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* vx_input     =topelement->GetInput(VxEnum);                                 _assert_(vx_input);
-	Input* vxobs_input  =topelement->GetInput(InversionVxObsEnum);                     _assert_(vxobs_input);
-	Input* vy_input     = NULL;
-	Input* vyobs_input  = NULL;
+	DatasetInput2* weights_input=topelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* vx_input     =topelement->GetInput2(VxEnum);                                 _assert_(vx_input);
+	Input2* vxobs_input  =topelement->GetInput2(InversionVxObsEnum);                     _assert_(vxobs_input);
+	Input2* vy_input     = NULL;
+	Input2* vyobs_input  = NULL;
 	if(numcomponents==2){
-		vy_input    =topelement->GetInput(VyEnum);              _assert_(vy_input);
-		vyobs_input =topelement->GetInput(InversionVyObsEnum);  _assert_(vyobs_input);
+		vy_input    =topelement->GetInput2(VyEnum);              _assert_(vy_input);
+		vyobs_input =topelement->GetInput2(InversionVyObsEnum);  _assert_(vyobs_input);
 	}
 
Index: /issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp	(revision 24335)
@@ -8,4 +8,5 @@
 #include "../../toolkits/toolkits.h"
 #include "../SurfaceAreax/SurfaceAreax.h"
+#include "../../classes/Inputs2/DatasetInput2.h"
 
 void SurfaceAverageVelMisfitx(IssmDouble* pJ,FemModel* femmodel){
@@ -67,12 +68,12 @@
 	/*Retrieve all inputs we will be needing: */
 	topelement->GetInputValue(&S,SurfaceAreaEnum);
-	Input* weights_input=topelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* vx_input     =topelement->GetInput(VxEnum);                                 _assert_(vx_input);
-	Input* vxobs_input  =topelement->GetInput(InversionVxObsEnum);                     _assert_(vxobs_input);
-	Input* vy_input     = NULL;
-	Input* vyobs_input  = NULL;
+	DatasetInput2* weights_input=topelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* vx_input     =topelement->GetInput2(VxEnum);                                 _assert_(vx_input);
+	Input2* vxobs_input  =topelement->GetInput2(InversionVxObsEnum);                     _assert_(vxobs_input);
+	Input2* vy_input     = NULL;
+	Input2* vyobs_input  = NULL;
 	if(numcomponents==2){
-		vy_input    =topelement->GetInput(VyEnum);              _assert_(vy_input);
-		vyobs_input =topelement->GetInput(InversionVyObsEnum);  _assert_(vyobs_input);
+		vy_input    =topelement->GetInput2(VyEnum);              _assert_(vy_input);
+		vyobs_input =topelement->GetInput2(InversionVyObsEnum);  _assert_(vyobs_input);
 	}
 
Index: /issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp	(revision 24335)
@@ -4,7 +4,7 @@
 
 #include "./SurfaceLogVelMisfitx.h"
-
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
+#include "../../classes/Inputs2/DatasetInput2.h"
 
 void SurfaceLogVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
@@ -62,12 +62,12 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* weights_input=topelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* vx_input     =topelement->GetInput(VxEnum);                                 _assert_(vx_input);
-	Input* vxobs_input  =topelement->GetInput(InversionVxObsEnum);                     _assert_(vxobs_input);
-	Input* vy_input     = NULL;
-	Input* vyobs_input  = NULL;
+	DatasetInput2* weights_input=topelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* vx_input     =topelement->GetInput2(VxEnum);                                 _assert_(vx_input);
+	Input2* vxobs_input  =topelement->GetInput2(InversionVxObsEnum);                     _assert_(vxobs_input);
+	Input2* vy_input     = NULL;
+	Input2* vyobs_input  = NULL;
 	if(numcomponents==2){
-		vy_input    =topelement->GetInput(VyEnum);              _assert_(vy_input);
-		vyobs_input =topelement->GetInput(InversionVyObsEnum);  _assert_(vyobs_input);
+		vy_input    =topelement->GetInput2(VyEnum);              _assert_(vy_input);
+		vyobs_input =topelement->GetInput2(InversionVyObsEnum);  _assert_(vyobs_input);
 	}
 
Index: /issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp	(revision 24335)
@@ -7,4 +7,5 @@
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
+#include "../../classes/Inputs2/DatasetInput2.h"
 
 void SurfaceLogVxVyMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
@@ -61,12 +62,12 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* weights_input=topelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* vx_input     =topelement->GetInput(VxEnum);                                 _assert_(vx_input);
-	Input* vxobs_input  =topelement->GetInput(InversionVxObsEnum);                     _assert_(vxobs_input);
-	Input* vy_input     = NULL;
-	Input* vyobs_input  = NULL;
+	DatasetInput2* weights_input=topelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* vx_input     =topelement->GetInput2(VxEnum);                                 _assert_(vx_input);
+	Input2* vxobs_input  =topelement->GetInput2(InversionVxObsEnum);                     _assert_(vxobs_input);
+	Input2* vy_input     = NULL;
+	Input2* vyobs_input  = NULL;
 	if(numcomponents==2){
-		vy_input    =topelement->GetInput(VyEnum);              _assert_(vy_input);
-		vyobs_input =topelement->GetInput(InversionVyObsEnum);  _assert_(vyobs_input);
+		vy_input    =topelement->GetInput2(VyEnum);              _assert_(vy_input);
+		vyobs_input =topelement->GetInput2(InversionVyObsEnum);  _assert_(vyobs_input);
 	}
 
Index: /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 24335)
@@ -7,4 +7,5 @@
 #include "../../toolkits/toolkits.h"
 #include "../modules.h"
+#include "../../classes/Inputs2/TransientInput2.h"
 
 void SmbForcingx(FemModel* femmodel){/*{{{*/
@@ -13,13 +14,11 @@
 	//    INPUT parameters: ni: working size of arrays
 	//    OUTPUT: mass-balance (m/yr ice): agd(NA)
-	bool isclimatology=false;
+	bool isclimatology;
 	femmodel->parameters->FindParam(&isclimatology,SmbIsclimatologyEnum);
 
 	if (isclimatology){
-		int v;
-		IssmDouble time,dt,delta,starttime,finaltime;
-		int offsetend=-1;
-		IssmDouble time0, timeend, timeclim;
-
+
+		/*Get time parameters*/
+		IssmDouble time,dt,starttime,finaltime;
 		femmodel->parameters->FindParam(&time,TimeEnum); 
 		femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
@@ -27,6 +26,29 @@
 		femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
 		
-		if (time<=starttime+dt){
+		if(time<=starttime+dt){
+			/*FIXME: this is wrong, should be done at the ElementUpdate step of analysis, not here!*/
 			InputDuplicatex(femmodel,SmbMassBalanceEnum,SmbMassBalanceClimateEnum);
+			femmodel->inputs2->DeleteInput(SmbMassBalanceEnum);
+		}
+
+		/*If this is a climatology, we need to repeat the forcing after the final time*/
+		TransientInput2* smb_input=femmodel->inputs2->GetTransientInput(SmbMassBalanceClimateEnum); _assert_(smb_input);
+
+		/*Get accumulation climatology value*/
+		int offsetend = smb_input->GetTimeInputOffset(finaltime);
+		IssmDouble time0     = smb_input->GetTimeByOffset(-1);
+		IssmDouble timeend   = smb_input->GetTimeByOffset(offsetend);
+
+		_assert_(timeend>time0);
+		IssmDouble timeclim  = time;
+
+		if(time>time0 && timeend>time0){
+			IssmDouble delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
+			if(delta==0.){
+				timeclim=timeend;
+			}
+			else{
+				timeclim=time0+delta;
+			}
 		}
 
@@ -37,24 +59,8 @@
 			int         numvertices = element->GetNumberOfVertices();
 			IssmDouble* smb         = xNew<IssmDouble>(numvertices);
-
-			/*Recover Smb*/
-			//If this is a climatology, we need to repeat the forcing after the final time
-			Input* smb_input=element->GetInput(SmbMassBalanceClimateEnum); _assert_(smb_input);
-
-			//Get accumulation climatology value
-			offsetend=dynamic_cast<TransientInput*>(smb_input)->GetTimeInputOffset(finaltime);
-			time0=dynamic_cast<TransientInput*>(smb_input)->GetTimeByOffset(-1);
-			timeend=dynamic_cast<TransientInput*>(smb_input)->GetTimeByOffset(offsetend);
-			timeclim=time;
-			if (time>time0 & timeend>time0){
-				delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
-				if (delta==0){ timeclim=timeend;}
-				else{ timeclim=time0+delta;}
-			}
-
 			element->GetInputListOnVerticesAtTime(smb,SmbMassBalanceClimateEnum,timeclim);
 
 			/*Add input to element and Free memory*/
-			element->AddInput(SmbMassBalanceEnum,smb,P1Enum);
+			element->AddInput2(SmbMassBalanceEnum,smb,P1Enum);
 			xDelete<IssmDouble>(smb);
 		}
@@ -115,5 +121,5 @@
 
 		/*Add input to element and Free memory*/
-		element->AddInput(SmbMassBalanceEnum,smb,P1Enum);
+		element->AddInput2(SmbMassBalanceEnum,smb,P1Enum);
 		xDelete<IssmDouble>(Href);
 		xDelete<IssmDouble>(Smbref);
@@ -179,5 +185,5 @@
 
 		/*Add input to element and Free memory*/
-		element->AddInput(SmbMassBalanceEnum,smb,P1Enum);
+		element->AddInput2(SmbMassBalanceEnum,smb,P1Enum);
 		xDelete<IssmDouble>(ela);
 		xDelete<IssmDouble>(b_pos);
@@ -389,5 +395,5 @@
 
 		/*Add input to element and Free memory*/
-		element->AddInput(SmbMassBalanceEnum,smblist,P1Enum);
+		element->AddInput2(SmbMassBalanceEnum,smblist,P1Enum);
 		xDelete<IssmDouble>(surfacelist);
 		xDelete<IssmDouble>(smblistref);
@@ -404,14 +410,6 @@
 	//    surface runoff (m/yr water equivalent): runoff
 	//    OUTPUT: mass-balance (m/yr ice): agd(NA)
-	int v;
-	bool isclimatology=false;
-	IssmDouble time,delta,starttime,finaltime;
-	int offsetend=-1;
-	IssmDouble time0, timeend, timeclim;
-
+	bool isclimatology;
 	femmodel->parameters->FindParam(&isclimatology,SmbIsclimatologyEnum);
-	femmodel->parameters->FindParam(&time,TimeEnum); 
-	femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
-	femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
 
 	/*Loop over all the elements of this partition*/
@@ -427,48 +425,60 @@
 
 		/*Recover Smb Components*/
-		if (isclimatology){
+		if(isclimatology){
+
+			int offsetend;
+			IssmDouble time0,timeend,timeclim;
+			IssmDouble time,starttime,finaltime;
+
+			/*Get time parameters*/
+			femmodel->parameters->FindParam(&time,TimeEnum); 
+			femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
+			femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
 
 			//If this is a climatology, we need to repeat the forcing after the final time
-			Input* acc_input=element->GetInput(SmbAccumulationEnum); _assert_(acc_input);
-			Input* evap_input=element->GetInput(SmbEvaporationEnum); _assert_(evap_input);
-			Input* runoff_input=element->GetInput(SmbRunoffEnum); _assert_(runoff_input);
+			TransientInput2* acc_input    = element->inputs2->GetTransientInput(SmbAccumulationEnum); _assert_(acc_input);
+			TransientInput2* evap_input   = element->inputs2->GetTransientInput(SmbEvaporationEnum);  _assert_(evap_input);
+			TransientInput2* runoff_input = element->inputs2->GetTransientInput(SmbRunoffEnum);       _assert_(runoff_input);
 
 			//Get accumulation climatology value
-			offsetend=dynamic_cast<TransientInput*>(acc_input)->GetTimeInputOffset(finaltime);
-			time0=dynamic_cast<TransientInput*>(acc_input)->GetTimeByOffset(-1);
-			timeend=dynamic_cast<TransientInput*>(acc_input)->GetTimeByOffset(offsetend);
-			timeclim=time;
-			if (time>time0 & timeend>time0){
-				delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
-				if (delta==0){ timeclim=timeend;}
-				else{ timeclim=time0+delta;}
-			}
-
+			offsetend = acc_input->GetTimeInputOffset(finaltime);
+			time0     = acc_input->GetTimeByOffset(-1);
+			timeend   = acc_input->GetTimeByOffset(offsetend);
+			timeclim  = time;
+			if(time>time0 & timeend>time0){
+				IssmDouble delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
+				if(delta==0.)
+				 timeclim=timeend;
+				else
+				 timeclim=time0+delta;
+			}
 			element->GetInputListOnVerticesAtTime(acc,SmbAccumulationEnum,timeclim);
 
 			//Get evaporation climatology value
-			offsetend=dynamic_cast<TransientInput*>(evap_input)->GetTimeInputOffset(finaltime);
-			time0=dynamic_cast<TransientInput*>(evap_input)->GetTimeByOffset(-1);
-			timeend=dynamic_cast<TransientInput*>(evap_input)->GetTimeByOffset(offsetend);
-			timeclim=time;
-			if (time>time0 & timeend>time0){
-				delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
-				if (delta==0){ timeclim=timeend;}
-				else{ timeclim=time0+delta;}
-			}
-
+			offsetend = evap_input->GetTimeInputOffset(finaltime);
+			time0     = evap_input->GetTimeByOffset(-1);
+			timeend   = evap_input->GetTimeByOffset(offsetend);
+			timeclim  = time;
+			if(time>time0 & timeend>time0){
+				IssmDouble delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
+				if(delta==0.)
+				 timeclim=timeend;
+				else
+				 timeclim=time0+delta;
+			}
 			element->GetInputListOnVerticesAtTime(evap,SmbEvaporationEnum,timeclim);
 
 			//Get runoff climatology value
-			offsetend=dynamic_cast<TransientInput*>(runoff_input)->GetTimeInputOffset(finaltime);
-			time0=dynamic_cast<TransientInput*>(runoff_input)->GetTimeByOffset(-1);
-			timeend=dynamic_cast<TransientInput*>(runoff_input)->GetTimeByOffset(offsetend);
-			timeclim=time;
-			if (time>time0 & timeend>time0){
-				delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
-				if (delta==0){ timeclim=timeend;}
-				else{ timeclim=time0+delta;}
-			}
-
+			offsetend = runoff_input->GetTimeInputOffset(finaltime);
+			time0     = runoff_input->GetTimeByOffset(-1);
+			timeend   = runoff_input->GetTimeByOffset(offsetend);
+			timeclim  = time;
+			if(time>time0 & timeend>time0){
+				IssmDouble delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
+				if(delta==0.)
+				 timeclim=timeend;
+				else
+				 timeclim=time0+delta;
+			}
 			element->GetInputListOnVerticesAtTime(runoff,SmbRunoffEnum,timeclim);
 		}
@@ -480,10 +490,8 @@
 
 		// loop over all vertices
-		for(v=0;v<numvertices;v++){
-			smb[v]=acc[v]-evap[v]-runoff[v];
-		}  //end of the loop over the vertices
+		for(int v=0;v<numvertices;v++) smb[v]=acc[v]-evap[v]-runoff[v];
 
 		/*Add input to element and Free memory*/
-		element->AddInput(SmbMassBalanceEnum,smb,P1Enum);
+		element->AddInput2(SmbMassBalanceEnum,smb,P1Enum);
 		xDelete<IssmDouble>(acc);
 		xDelete<IssmDouble>(evap);
@@ -502,14 +510,6 @@
 	//    refreeze of surface melt (m/yr water equivalent): refreeze
 	//    OUTPUT: mass-balance (m/yr ice): agd(NA)
-	int v;
-	bool isclimatology=false;
-	IssmDouble time,delta,starttime,finaltime;
-	int offsetend=-1;
-	IssmDouble time0, timeend, timeclim;
-
+	bool isclimatology;
 	femmodel->parameters->FindParam(&isclimatology,SmbIsclimatologyEnum);
-	femmodel->parameters->FindParam(&time,TimeEnum);
-	femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
-	femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
 
 	/*Loop over all the elements of this partition*/
@@ -528,60 +528,72 @@
 		if (isclimatology){
 
+			int offsetend;
+			IssmDouble time0,timeend,timeclim;
+			IssmDouble time,starttime,finaltime;
+			femmodel->parameters->FindParam(&time,TimeEnum);
+			femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
+			femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
+
+
 			//If this is a climatology, we need to repeat the forcing after the final time
-			Input* acc_input=element->GetInput(SmbAccumulationEnum); _assert_(acc_input);
-			Input* evap_input=element->GetInput(SmbEvaporationEnum); _assert_(evap_input);
-			Input* melt_input=element->GetInput(SmbMeltEnum); _assert_(melt_input);
-			Input* refreeze_input=element->GetInput(SmbRefreezeEnum); _assert_(refreeze_input);
+			TransientInput2* acc_input      = element->inputs2->GetTransientInput(SmbAccumulationEnum); _assert_(acc_input);
+			TransientInput2* evap_input     = element->inputs2->GetTransientInput(SmbEvaporationEnum);  _assert_(evap_input);
+			TransientInput2* melt_input     = element->inputs2->GetTransientInput(SmbMeltEnum);         _assert_(melt_input);
+			TransientInput2* refreeze_input = element->inputs2->GetTransientInput(SmbRefreezeEnum);     _assert_(refreeze_input);
 
 			//Get accumulation climatology value
-			offsetend=dynamic_cast<TransientInput*>(acc_input)->GetTimeInputOffset(finaltime);
-			time0=dynamic_cast<TransientInput*>(acc_input)->GetTimeByOffset(-1);
-			timeend=dynamic_cast<TransientInput*>(acc_input)->GetTimeByOffset(offsetend);
-			timeclim=time;
-			if (time>time0 & timeend>time0){
-				delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
-				if (delta==0){ timeclim=timeend;}
-				else{ timeclim=time0+delta;}
-			}
-
+			offsetend = acc_input->GetTimeInputOffset(finaltime);
+			time0     = acc_input->GetTimeByOffset(-1);
+			timeend   = acc_input->GetTimeByOffset(offsetend);
+			timeclim  = time;
+			if(time>time0 & timeend>time0){
+				IssmDouble delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
+				if(delta==0.)
+				 timeclim=timeend;
+				else
+				 timeclim=time0+delta;
+			}
 			element->GetInputListOnVerticesAtTime(acc,SmbAccumulationEnum,timeclim);
 
 			//Get evaporation climatology value
-			offsetend=dynamic_cast<TransientInput*>(evap_input)->GetTimeInputOffset(finaltime);
-			time0=dynamic_cast<TransientInput*>(evap_input)->GetTimeByOffset(-1);
-			timeend=dynamic_cast<TransientInput*>(evap_input)->GetTimeByOffset(offsetend);
-			timeclim=time;
-			if (time>time0){
-				delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
-				if (delta==0){ timeclim=timeend;}
-				else{ timeclim=time0+delta;}
-			}
-
+			offsetend = evap_input->GetTimeInputOffset(finaltime);
+			time0     = evap_input->GetTimeByOffset(-1);
+			timeend   = evap_input->GetTimeByOffset(offsetend);
+			timeclim  = time;
+			if(time>time0 & timeend>time0){
+				IssmDouble delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
+				if(delta==0.)
+				 timeclim=timeend;
+				else
+				 timeclim=time0+delta;
+			}
 			element->GetInputListOnVerticesAtTime(evap,SmbEvaporationEnum,timeclim);
 
 			//Get melt climatology value
-			offsetend=dynamic_cast<TransientInput*>(melt_input)->GetTimeInputOffset(finaltime);
-			time0=dynamic_cast<TransientInput*>(melt_input)->GetTimeByOffset(-1);
-			timeend=dynamic_cast<TransientInput*>(melt_input)->GetTimeByOffset(offsetend);
-			timeclim=time;
-			if (time>time0){
-				delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
-				if (delta==0){ timeclim=timeend;}
-				else{ timeclim=time0+delta;}
-			}
-
+			offsetend = melt_input->GetTimeInputOffset(finaltime);
+			time0     = melt_input->GetTimeByOffset(-1);
+			timeend   = melt_input->GetTimeByOffset(offsetend);
+			timeclim  = time;
+			if(time>time0 & timeend>time0){
+				IssmDouble delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
+				if(delta==0.)
+				 timeclim=timeend;
+				else
+				 timeclim=time0+delta;
+			}
 			element->GetInputListOnVerticesAtTime(melt,SmbMeltEnum,timeclim);
 
 			//Get refreeze climatology value
-			offsetend=dynamic_cast<TransientInput*>(refreeze_input)->GetTimeInputOffset(finaltime);
-			time0=dynamic_cast<TransientInput*>(refreeze_input)->GetTimeByOffset(-1);
-			timeend=dynamic_cast<TransientInput*>(refreeze_input)->GetTimeByOffset(offsetend);
-			timeclim=time;
-			if (time>time0){
-				delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
-				if (delta==0){ timeclim=timeend;}
-				else{ timeclim=time0+delta;}
-			}
-
+			offsetend = refreeze_input->GetTimeInputOffset(finaltime);
+			time0     = refreeze_input->GetTimeByOffset(-1);
+			timeend   = refreeze_input->GetTimeByOffset(offsetend);
+			timeclim  = time;
+			if(time>time0 & timeend>time0){
+				IssmDouble delta=(time-time0) - (timeend-time0)*(reCast<int,IssmDouble>((time-time0)/(timeend-time0)));
+				if(delta==0.)
+				 timeclim=timeend;
+				else
+				 timeclim=time0+delta;
+			}
 			element->GetInputListOnVerticesAtTime(refreeze,SmbRefreezeEnum,timeclim);
 		}
@@ -594,10 +606,8 @@
 
 		// loop over all vertices
-		for(v=0;v<numvertices;v++){
-			smb[v]=acc[v]-evap[v]-melt[v]+refreeze[v];
-		}  //end of the loop over the vertices
+		for(int v=0;v<numvertices;v++) smb[v]=acc[v]-evap[v]-melt[v]+refreeze[v];
 
 		/*Add input to element and Free memory*/
-		element->AddInput(SmbMassBalanceEnum,smb,P1Enum);
+		element->AddInput2(SmbMassBalanceEnum,smb,P1Enum);
 		xDelete<IssmDouble>(acc);
 		xDelete<IssmDouble>(evap);
Index: /issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp	(revision 24335)
@@ -7,4 +7,5 @@
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
+#include "../../classes/Inputs2/DatasetInput2.h"
 
 void SurfaceRelVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
@@ -61,12 +62,12 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* weights_input=topelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* vx_input     =topelement->GetInput(VxEnum);                                 _assert_(vx_input);
-	Input* vxobs_input  =topelement->GetInput(InversionVxObsEnum);                     _assert_(vxobs_input);
-	Input* vy_input     = NULL;
-	Input* vyobs_input  = NULL;
+	DatasetInput2* weights_input=topelement->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* vx_input     =topelement->GetInput2(VxEnum);                                 _assert_(vx_input);
+	Input2* vxobs_input  =topelement->GetInput2(InversionVxObsEnum);                     _assert_(vxobs_input);
+	Input2* vy_input     = NULL;
+	Input2* vyobs_input  = NULL;
 	if(numcomponents==2){
-		vy_input    =topelement->GetInput(VyEnum);              _assert_(vy_input);
-		vyobs_input =topelement->GetInput(InversionVyObsEnum);  _assert_(vyobs_input);
+		vy_input    =topelement->GetInput2(VyEnum);              _assert_(vy_input);
+		vyobs_input =topelement->GetInput2(InversionVyObsEnum);  _assert_(vyobs_input);
 	}
 
Index: /issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp	(revision 24335)
@@ -7,4 +7,5 @@
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
+#include "../../classes/Inputs2/DatasetInput2.h"
 
 void ThicknessAbsMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
@@ -43,7 +44,7 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* weights_input     =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* thickness_input   =element->GetInput(ThicknessEnum);                          _assert_(thickness_input);
-	Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum);              _assert_(thicknessobs_input);
+	DatasetInput2* weights_input     =element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* thickness_input   =element->GetInput2(ThicknessEnum);                          _assert_(thickness_input);
+	Input2* thicknessobs_input=element->GetInput2(InversionThicknessObsEnum);              _assert_(thicknessobs_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp	(revision 24335)
@@ -7,4 +7,5 @@
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
+#include "../../classes/Inputs2/DatasetInput2.h"
 
 void ThicknessAcrossGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
@@ -45,8 +46,8 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* weights_input   =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* thickness_input =element->GetInput(ThicknessEnum);                          _assert_(thickness_input);
-	Input* vx_input        =element->GetInput(VxEnum);                                 _assert_(vx_input);
-	Input* vy_input        =element->GetInput(VyEnum);                                 _assert_(vy_input);
+	DatasetInput2* weights_input   =element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* thickness_input =element->GetInput2(ThicknessEnum);                          _assert_(thickness_input);
+	Input2* vx_input        =element->GetInput2(VxEnum);                                 _assert_(vx_input);
+	Input2* vy_input        =element->GetInput2(VyEnum);                                 _assert_(vy_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp	(revision 24335)
@@ -7,4 +7,5 @@
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
+#include "../../classes/Inputs2/DatasetInput2.h"
 
 void ThicknessAlongGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
@@ -45,8 +46,8 @@
 
 	/*Retrieve all inputs we will be needing: */
-	Input* weights_input   =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
-	Input* thickness_input =element->GetInput(ThicknessEnum);                          _assert_(thickness_input);
-	Input* vx_input        =element->GetInput(VxEnum);                                 _assert_(vx_input);
-	Input* vy_input        =element->GetInput(VyEnum);                                 _assert_(vy_input);
+	DatasetInput2* weights_input   =element->GetDatasetInput2(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+	Input2* thickness_input =element->GetInput2(ThicknessEnum);                          _assert_(thickness_input);
+	Input2* vx_input        =element->GetInput2(VxEnum);                                 _assert_(vx_input);
+	Input2* vy_input        =element->GetInput2(VyEnum);                                 _assert_(vy_input);
 
 	/* Start  looping on the number of gaussian points: */
Index: /issm/trunk-jpl/src/c/shared/Enum/Enum.vim
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 24334)
+++ /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 24335)
@@ -282,6 +282,4 @@
 syn keyword cConstant OutputFilePointerEnum
 syn keyword cConstant OutputdefinitionEnum
-syn keyword cConstant ParamEnum
-syn keyword cConstant ParametersEnum
 syn keyword cConstant QmuErrNameEnum
 syn keyword cConstant QmuInNameEnum
@@ -475,4 +473,5 @@
 syn keyword cConstant BasalStressEnum
 syn keyword cConstant BaseEnum
+syn keyword cConstant BaseOldEnum
 syn keyword cConstant BaseSlopeXEnum
 syn keyword cConstant BaseSlopeYEnum
@@ -495,5 +494,7 @@
 syn keyword cConstant CrevasseDepthEnum
 syn keyword cConstant DamageDEnum
+syn keyword cConstant DamageDOldEnum
 syn keyword cConstant DamageDbarEnum
+syn keyword cConstant DamageDbarOldEnum
 syn keyword cConstant DamageFEnum
 syn keyword cConstant DegreeOfChannelizationEnum
@@ -516,4 +517,5 @@
 syn keyword cConstant DrivingStressXEnum
 syn keyword cConstant DrivingStressYEnum
+syn keyword cConstant DummyEnum
 syn keyword cConstant EffectivePressureEnum
 syn keyword cConstant EffectivePressureSubstepEnum
@@ -660,4 +662,5 @@
 syn keyword cConstant SealevelUNorthEsaEnum
 syn keyword cConstant SealevelriseCumDeltathicknessEnum
+syn keyword cConstant SealevelriseCumDeltathicknessOldEnum
 syn keyword cConstant SealevelriseDeltathicknessEnum
 syn keyword cConstant SealevelriseSpcthicknessEnum
@@ -785,4 +788,5 @@
 syn keyword cConstant SurfaceCrevasseEnum
 syn keyword cConstant SurfaceEnum
+syn keyword cConstant SurfaceOldEnum
 syn keyword cConstant SurfaceLogVelMisfitEnum
 syn keyword cConstant SurfaceLogVxVyMisfitEnum
@@ -953,4 +957,6 @@
 syn keyword cConstant BoolExternalResultEnum
 syn keyword cConstant BoolInputEnum
+syn keyword cConstant BoolInput2Enum
+syn keyword cConstant IntInput2Enum
 syn keyword cConstant BoolParamEnum
 syn keyword cConstant BoundaryEnum
@@ -973,4 +979,5 @@
 syn keyword cConstant ContoursEnum
 syn keyword cConstant ControlInputEnum
+syn keyword cConstant ControlInput2Enum
 syn keyword cConstant ControlInputGradEnum
 syn keyword cConstant ControlInputMaxsEnum
@@ -985,4 +992,5 @@
 syn keyword cConstant DataSetParamEnum
 syn keyword cConstant DatasetInputEnum
+syn keyword cConstant DatasetInput2Enum
 syn keyword cConstant DefaultAnalysisEnum
 syn keyword cConstant DefaultCalvingEnum
@@ -994,4 +1002,5 @@
 syn keyword cConstant Domain3DsurfaceEnum
 syn keyword cConstant DoubleArrayInputEnum
+syn keyword cConstant ArrayInput2Enum
 syn keyword cConstant DoubleExternalResultEnum
 syn keyword cConstant DoubleInputEnum
@@ -1074,8 +1083,13 @@
 syn keyword cConstant IntExternalResultEnum
 syn keyword cConstant IntInputEnum
+syn keyword cConstant ElementInput2Enum
+syn keyword cConstant SegInput2Enum
+syn keyword cConstant TriaInput2Enum
+syn keyword cConstant PentaInput2Enum
 syn keyword cConstant IntMatExternalResultEnum
 syn keyword cConstant IntMatParamEnum
 syn keyword cConstant IntParamEnum
 syn keyword cConstant IntVecParamEnum
+syn keyword cConstant Inputs2Enum
 syn keyword cConstant InternalEnum
 syn keyword cConstant IntersectEnum
@@ -1157,4 +1171,6 @@
 syn keyword cConstant OpenEnum
 syn keyword cConstant OptionEnum
+syn keyword cConstant ParamEnum
+syn keyword cConstant ParametersEnum
 syn keyword cConstant P0ArrayEnum
 syn keyword cConstant P0DGEnum
@@ -1259,4 +1275,5 @@
 syn keyword cConstant TransientArrayParamEnum
 syn keyword cConstant TransientInputEnum
+syn keyword cConstant TransientInput2Enum
 syn keyword cConstant TransientParamEnum
 syn keyword cConstant TransientSolutionEnum
@@ -1298,5 +1315,7 @@
 syn keyword cType AdaptiveMeshRefinement
 syn keyword cType AmrBamg
+syn keyword cType ArrayInput2
 syn keyword cType BoolInput
+syn keyword cType BoolInput2
 syn keyword cType BoolParam
 syn keyword cType Cfdragcoeffabsgrad
@@ -1304,4 +1323,5 @@
 syn keyword cType Cfsurfacesquare
 syn keyword cType Channel
+syn keyword cType classes
 syn keyword cType Constraint
 syn keyword cType Constraints
@@ -1309,7 +1329,9 @@
 syn keyword cType Contours
 syn keyword cType ControlInput
+syn keyword cType ControlInput2
 syn keyword cType Covertree
+syn keyword cType DatasetInput
+syn keyword cType DatasetInput2
 syn keyword cType DataSetParam
-syn keyword cType DatasetInput
 syn keyword cType Definition
 syn keyword cType DependentObject
@@ -1323,7 +1345,8 @@
 syn keyword cType Element
 syn keyword cType ElementHook
+syn keyword cType ElementInput2
 syn keyword cType ElementMatrix
+syn keyword cType Elements
 syn keyword cType ElementVector
-syn keyword cType Elements
 syn keyword cType ExponentialVariogram
 syn keyword cType ExternalResult
@@ -1332,9 +1355,10 @@
 syn keyword cType Friction
 syn keyword cType Gauss
+syn keyword cType GaussianVariogram
+syn keyword cType gaussobjects
 syn keyword cType GaussPenta
 syn keyword cType GaussSeg
 syn keyword cType GaussTetra
 syn keyword cType GaussTria
-syn keyword cType GaussianVariogram
 syn keyword cType GenericExternalResult
 syn keyword cType GenericOption
@@ -1343,6 +1367,9 @@
 syn keyword cType Hook
 syn keyword cType Input
+syn keyword cType Input2
 syn keyword cType Inputs
+syn keyword cType Inputs2
 syn keyword cType IntInput
+syn keyword cType IntInput2
 syn keyword cType IntMatParam
 syn keyword cType IntParam
@@ -1351,4 +1378,5 @@
 syn keyword cType IssmDirectApplicInterface
 syn keyword cType IssmParallelDirectApplicInterface
+syn keyword cType krigingobjects
 syn keyword cType Load
 syn keyword cType Loads
@@ -1361,4 +1389,5 @@
 syn keyword cType Matice
 syn keyword cType Matlitho
+syn keyword cType matrixobjects
 syn keyword cType MatrixParam
 syn keyword cType Misfit
@@ -1373,6 +1402,6 @@
 syn keyword cType Observations
 syn keyword cType Option
+syn keyword cType Options
 syn keyword cType OptionUtilities
-syn keyword cType Options
 syn keyword cType Param
 syn keyword cType Parameters
@@ -1381,4 +1410,5 @@
 syn keyword cType Penta
 syn keyword cType PentaInput
+syn keyword cType PentaInput2
 syn keyword cType PentaRef
 syn keyword cType PowerVariogram
@@ -1388,10 +1418,11 @@
 syn keyword cType Regionaloutput
 syn keyword cType Results
+syn keyword cType Riftfront
 syn keyword cType RiftStruct
-syn keyword cType Riftfront
 syn keyword cType Seg
 syn keyword cType SegInput
+syn keyword cType SegInput2
+syn keyword cType Segment
 syn keyword cType SegRef
-syn keyword cType Segment
 syn keyword cType SpcDynamic
 syn keyword cType SpcStatic
@@ -1405,7 +1436,9 @@
 syn keyword cType TransientArrayParam
 syn keyword cType TransientInput
+syn keyword cType TransientInput2
 syn keyword cType TransientParam
 syn keyword cType Tria
 syn keyword cType TriaInput
+syn keyword cType TriaInput2
 syn keyword cType TriaRef
 syn keyword cType Variogram
@@ -1413,8 +1446,4 @@
 syn keyword cType Vertex
 syn keyword cType Vertices
-syn keyword cType classes
-syn keyword cType gaussobjects
-syn keyword cType krigingobjects
-syn keyword cType matrixobjects
 syn keyword cType AdjointBalancethickness2Analysis
 syn keyword cType AdjointBalancethicknessAnalysis
@@ -1435,6 +1464,6 @@
 syn keyword cType FreeSurfaceBaseAnalysis
 syn keyword cType FreeSurfaceTopAnalysis
+syn keyword cType GiaIvinsAnalysis
 syn keyword cType GLheightadvectionAnalysis
-syn keyword cType GiaIvinsAnalysis
 syn keyword cType HydrologyDCEfficientAnalysis
 syn keyword cType HydrologyDCInefficientAnalysis
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 24334)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 24335)
@@ -276,6 +276,4 @@
 	OutputFilePointerEnum,
 	OutputdefinitionEnum,
-	ParamEnum,
-	ParametersEnum,
 	QmuErrNameEnum,
 	QmuInNameEnum,
@@ -471,4 +469,5 @@
 	BasalStressEnum,
 	BaseEnum,
+	BaseOldEnum,
 	BaseSlopeXEnum,
 	BaseSlopeYEnum,
@@ -491,5 +490,7 @@
 	CrevasseDepthEnum,
 	DamageDEnum,
+	DamageDOldEnum,
 	DamageDbarEnum,
+	DamageDbarOldEnum,
 	DamageFEnum,
 	DegreeOfChannelizationEnum,
@@ -512,4 +513,5 @@
 	DrivingStressXEnum,
 	DrivingStressYEnum,
+	DummyEnum,
    EffectivePressureEnum,
 	EffectivePressureSubstepEnum,
@@ -656,4 +658,5 @@
 	SealevelUNorthEsaEnum,
 	SealevelriseCumDeltathicknessEnum,
+	SealevelriseCumDeltathicknessOldEnum,
 	SealevelriseDeltathicknessEnum,
 	SealevelriseSpcthicknessEnum,
@@ -781,4 +784,5 @@
 	SurfaceCrevasseEnum,
 	SurfaceEnum,
+	SurfaceOldEnum,
 	SurfaceLogVelMisfitEnum,
 	SurfaceLogVxVyMisfitEnum,
@@ -951,4 +955,6 @@
 	BoolExternalResultEnum,
 	BoolInputEnum,
+	BoolInput2Enum,
+	IntInput2Enum,
 	BoolParamEnum,
 	BoundaryEnum,
@@ -971,4 +977,5 @@
 	ContoursEnum,
 	ControlInputEnum,
+	ControlInput2Enum,
 	ControlInputGradEnum,
 	ControlInputMaxsEnum,
@@ -983,4 +990,5 @@
 	DataSetParamEnum,
 	DatasetInputEnum,
+	DatasetInput2Enum,
 	DefaultAnalysisEnum,
 	DefaultCalvingEnum,
@@ -992,4 +1000,5 @@
 	Domain3DsurfaceEnum,
 	DoubleArrayInputEnum,
+	ArrayInput2Enum,
 	DoubleExternalResultEnum,
 	DoubleInputEnum,
@@ -1072,8 +1081,13 @@
 	IntExternalResultEnum,
 	IntInputEnum,
+	ElementInput2Enum,
+	SegInput2Enum,
+	TriaInput2Enum,
+	PentaInput2Enum,
 	IntMatExternalResultEnum,
 	IntMatParamEnum,
 	IntParamEnum,
 	IntVecParamEnum,
+	Inputs2Enum,
 	InternalEnum,
 	IntersectEnum,
@@ -1155,4 +1169,6 @@
 	OpenEnum,
 	OptionEnum,
+	ParamEnum,
+	ParametersEnum,
 	P0ArrayEnum,
 	P0DGEnum,
@@ -1257,4 +1273,5 @@
 	TransientArrayParamEnum,
 	TransientInputEnum,
+	TransientInput2Enum,
 	TransientParamEnum,
 	TransientSolutionEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 24335)
@@ -284,6 +284,4 @@
 		case OutputFilePointerEnum : return "OutputFilePointer";
 		case OutputdefinitionEnum : return "Outputdefinition";
-		case ParamEnum : return "Param";
-		case ParametersEnum : return "Parameters";
 		case QmuErrNameEnum : return "QmuErrName";
 		case QmuInNameEnum : return "QmuInName";
@@ -477,4 +475,5 @@
 		case BasalStressEnum : return "BasalStress";
 		case BaseEnum : return "Base";
+		case BaseOldEnum : return "BaseOld";
 		case BaseSlopeXEnum : return "BaseSlopeX";
 		case BaseSlopeYEnum : return "BaseSlopeY";
@@ -497,5 +496,7 @@
 		case CrevasseDepthEnum : return "CrevasseDepth";
 		case DamageDEnum : return "DamageD";
+		case DamageDOldEnum : return "DamageDOld";
 		case DamageDbarEnum : return "DamageDbar";
+		case DamageDbarOldEnum : return "DamageDbarOld";
 		case DamageFEnum : return "DamageF";
 		case DegreeOfChannelizationEnum : return "DegreeOfChannelization";
@@ -518,4 +519,5 @@
 		case DrivingStressXEnum : return "DrivingStressX";
 		case DrivingStressYEnum : return "DrivingStressY";
+		case DummyEnum : return "Dummy";
 		case EffectivePressureEnum : return "EffectivePressure";
 		case EffectivePressureSubstepEnum : return "EffectivePressureSubstep";
@@ -662,4 +664,5 @@
 		case SealevelUNorthEsaEnum : return "SealevelUNorthEsa";
 		case SealevelriseCumDeltathicknessEnum : return "SealevelriseCumDeltathickness";
+		case SealevelriseCumDeltathicknessOldEnum : return "SealevelriseCumDeltathicknessOld";
 		case SealevelriseDeltathicknessEnum : return "SealevelriseDeltathickness";
 		case SealevelriseSpcthicknessEnum : return "SealevelriseSpcthickness";
@@ -787,4 +790,5 @@
 		case SurfaceCrevasseEnum : return "SurfaceCrevasse";
 		case SurfaceEnum : return "Surface";
+		case SurfaceOldEnum : return "SurfaceOld";
 		case SurfaceLogVelMisfitEnum : return "SurfaceLogVelMisfit";
 		case SurfaceLogVxVyMisfitEnum : return "SurfaceLogVxVyMisfit";
@@ -955,4 +959,6 @@
 		case BoolExternalResultEnum : return "BoolExternalResult";
 		case BoolInputEnum : return "BoolInput";
+		case BoolInput2Enum : return "BoolInput2";
+		case IntInput2Enum : return "IntInput2";
 		case BoolParamEnum : return "BoolParam";
 		case BoundaryEnum : return "Boundary";
@@ -975,4 +981,5 @@
 		case ContoursEnum : return "Contours";
 		case ControlInputEnum : return "ControlInput";
+		case ControlInput2Enum : return "ControlInput2";
 		case ControlInputGradEnum : return "ControlInputGrad";
 		case ControlInputMaxsEnum : return "ControlInputMaxs";
@@ -987,4 +994,5 @@
 		case DataSetParamEnum : return "DataSetParam";
 		case DatasetInputEnum : return "DatasetInput";
+		case DatasetInput2Enum : return "DatasetInput2";
 		case DefaultAnalysisEnum : return "DefaultAnalysis";
 		case DefaultCalvingEnum : return "DefaultCalving";
@@ -996,4 +1004,5 @@
 		case Domain3DsurfaceEnum : return "Domain3Dsurface";
 		case DoubleArrayInputEnum : return "DoubleArrayInput";
+		case ArrayInput2Enum : return "ArrayInput2";
 		case DoubleExternalResultEnum : return "DoubleExternalResult";
 		case DoubleInputEnum : return "DoubleInput";
@@ -1076,8 +1085,13 @@
 		case IntExternalResultEnum : return "IntExternalResult";
 		case IntInputEnum : return "IntInput";
+		case ElementInput2Enum : return "ElementInput2";
+		case SegInput2Enum : return "SegInput2";
+		case TriaInput2Enum : return "TriaInput2";
+		case PentaInput2Enum : return "PentaInput2";
 		case IntMatExternalResultEnum : return "IntMatExternalResult";
 		case IntMatParamEnum : return "IntMatParam";
 		case IntParamEnum : return "IntParam";
 		case IntVecParamEnum : return "IntVecParam";
+		case Inputs2Enum : return "Inputs2";
 		case InternalEnum : return "Internal";
 		case IntersectEnum : return "Intersect";
@@ -1159,4 +1173,6 @@
 		case OpenEnum : return "Open";
 		case OptionEnum : return "Option";
+		case ParamEnum : return "Param";
+		case ParametersEnum : return "Parameters";
 		case P0ArrayEnum : return "P0Array";
 		case P0DGEnum : return "P0DG";
@@ -1261,4 +1277,5 @@
 		case TransientArrayParamEnum : return "TransientArrayParam";
 		case TransientInputEnum : return "TransientInput";
+		case TransientInput2Enum : return "TransientInput2";
 		case TransientParamEnum : return "TransientParam";
 		case TransientSolutionEnum : return "TransientSolution";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 24334)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 24335)
@@ -290,6 +290,4 @@
 	      else if (strcmp(name,"OutputFilePointer")==0) return OutputFilePointerEnum;
 	      else if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;
-	      else if (strcmp(name,"Param")==0) return ParamEnum;
-	      else if (strcmp(name,"Parameters")==0) return ParametersEnum;
 	      else if (strcmp(name,"QmuErrName")==0) return QmuErrNameEnum;
 	      else if (strcmp(name,"QmuInName")==0) return QmuInNameEnum;
@@ -383,10 +381,10 @@
 	      else if (strcmp(name,"SmbSealev")==0) return SmbSealevEnum;
 	      else if (strcmp(name,"SmbStepsPerStep")==0) return SmbStepsPerStepEnum;
+	      else if (strcmp(name,"SmbSwIdx")==0) return SmbSwIdxEnum;
+	      else if (strcmp(name,"SmbT0dry")==0) return SmbT0dryEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"SmbSwIdx")==0) return SmbSwIdxEnum;
-	      else if (strcmp(name,"SmbT0dry")==0) return SmbT0dryEnum;
-	      else if (strcmp(name,"SmbT0wet")==0) return SmbT0wetEnum;
+	      if (strcmp(name,"SmbT0wet")==0) return SmbT0wetEnum;
 	      else if (strcmp(name,"SmbTdiff")==0) return SmbTdiffEnum;
 	      else if (strcmp(name,"SmbThermoDeltaTScaling")==0) return SmbThermoDeltaTScalingEnum;
@@ -486,4 +484,5 @@
 	      else if (strcmp(name,"BasalStress")==0) return BasalStressEnum;
 	      else if (strcmp(name,"Base")==0) return BaseEnum;
+	      else if (strcmp(name,"BaseOld")==0) return BaseOldEnum;
 	      else if (strcmp(name,"BaseSlopeX")==0) return BaseSlopeXEnum;
 	      else if (strcmp(name,"BaseSlopeY")==0) return BaseSlopeYEnum;
@@ -506,8 +505,10 @@
 	      else if (strcmp(name,"CrevasseDepth")==0) return CrevasseDepthEnum;
 	      else if (strcmp(name,"DamageD")==0) return DamageDEnum;
+	      else if (strcmp(name,"DamageDOld")==0) return DamageDOldEnum;
          else stage=5;
    }
    if(stage==5){
 	      if (strcmp(name,"DamageDbar")==0) return DamageDbarEnum;
+	      else if (strcmp(name,"DamageDbarOld")==0) return DamageDbarOldEnum;
 	      else if (strcmp(name,"DamageF")==0) return DamageFEnum;
 	      else if (strcmp(name,"DegreeOfChannelization")==0) return DegreeOfChannelizationEnum;
@@ -530,4 +531,5 @@
 	      else if (strcmp(name,"DrivingStressX")==0) return DrivingStressXEnum;
 	      else if (strcmp(name,"DrivingStressY")==0) return DrivingStressYEnum;
+	      else if (strcmp(name,"Dummy")==0) return DummyEnum;
 	      else if (strcmp(name,"EffectivePressure")==0) return EffectivePressureEnum;
 	      else if (strcmp(name,"EffectivePressureSubstep")==0) return EffectivePressureSubstepEnum;
@@ -627,10 +629,10 @@
 	      else if (strcmp(name,"MaterialsRheologyB")==0) return MaterialsRheologyBEnum;
 	      else if (strcmp(name,"MaterialsRheologyBbar")==0) return MaterialsRheologyBbarEnum;
-	      else if (strcmp(name,"MaterialsRheologyE")==0) return MaterialsRheologyEEnum;
-	      else if (strcmp(name,"MaterialsRheologyEbar")==0) return MaterialsRheologyEbarEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"MaterialsRheologyEc")==0) return MaterialsRheologyEcEnum;
+	      if (strcmp(name,"MaterialsRheologyE")==0) return MaterialsRheologyEEnum;
+	      else if (strcmp(name,"MaterialsRheologyEbar")==0) return MaterialsRheologyEbarEnum;
+	      else if (strcmp(name,"MaterialsRheologyEc")==0) return MaterialsRheologyEcEnum;
 	      else if (strcmp(name,"MaterialsRheologyEcbar")==0) return MaterialsRheologyEcbarEnum;
 	      else if (strcmp(name,"MaterialsRheologyEs")==0) return MaterialsRheologyEsEnum;
@@ -677,4 +679,5 @@
 	      else if (strcmp(name,"SealevelUNorthEsa")==0) return SealevelUNorthEsaEnum;
 	      else if (strcmp(name,"SealevelriseCumDeltathickness")==0) return SealevelriseCumDeltathicknessEnum;
+	      else if (strcmp(name,"SealevelriseCumDeltathicknessOld")==0) return SealevelriseCumDeltathicknessOldEnum;
 	      else if (strcmp(name,"SealevelriseDeltathickness")==0) return SealevelriseDeltathicknessEnum;
 	      else if (strcmp(name,"SealevelriseSpcthickness")==0) return SealevelriseSpcthicknessEnum;
@@ -749,11 +752,11 @@
 	      else if (strcmp(name,"SmbPrecipitationsPresentday")==0) return SmbPrecipitationsPresentdayEnum;
 	      else if (strcmp(name,"SmbPrecipitationsReconstructed")==0) return SmbPrecipitationsReconstructedEnum;
-	      else if (strcmp(name,"SmbRe")==0) return SmbReEnum;
-	      else if (strcmp(name,"SmbRefreeze")==0) return SmbRefreezeEnum;
-	      else if (strcmp(name,"SmbReini")==0) return SmbReiniEnum;
          else stage=7;
    }
    if(stage==7){
-	      if (strcmp(name,"SmbRunoff")==0) return SmbRunoffEnum;
+	      if (strcmp(name,"SmbRe")==0) return SmbReEnum;
+	      else if (strcmp(name,"SmbRefreeze")==0) return SmbRefreezeEnum;
+	      else if (strcmp(name,"SmbReini")==0) return SmbReiniEnum;
+	      else if (strcmp(name,"SmbRunoff")==0) return SmbRunoffEnum;
 	      else if (strcmp(name,"SmbRunoffSubstep")==0) return SmbRunoffSubstepEnum;
 	      else if (strcmp(name,"SmbRunoffTransient")==0) return SmbRunoffTransientEnum;
@@ -805,4 +808,5 @@
 	      else if (strcmp(name,"SurfaceCrevasse")==0) return SurfaceCrevasseEnum;
 	      else if (strcmp(name,"Surface")==0) return SurfaceEnum;
+	      else if (strcmp(name,"SurfaceOld")==0) return SurfaceOldEnum;
 	      else if (strcmp(name,"SurfaceLogVelMisfit")==0) return SurfaceLogVelMisfitEnum;
 	      else if (strcmp(name,"SurfaceLogVxVyMisfit")==0) return SurfaceLogVxVyMisfitEnum;
@@ -871,12 +875,12 @@
 	      else if (strcmp(name,"Outputdefinition32")==0) return Outputdefinition32Enum;
 	      else if (strcmp(name,"Outputdefinition33")==0) return Outputdefinition33Enum;
-	      else if (strcmp(name,"Outputdefinition34")==0) return Outputdefinition34Enum;
+         else stage=8;
+   }
+   if(stage==8){
+	      if (strcmp(name,"Outputdefinition34")==0) return Outputdefinition34Enum;
 	      else if (strcmp(name,"Outputdefinition35")==0) return Outputdefinition35Enum;
 	      else if (strcmp(name,"Outputdefinition36")==0) return Outputdefinition36Enum;
 	      else if (strcmp(name,"Outputdefinition37")==0) return Outputdefinition37Enum;
-         else stage=8;
-   }
-   if(stage==8){
-	      if (strcmp(name,"Outputdefinition38")==0) return Outputdefinition38Enum;
+	      else if (strcmp(name,"Outputdefinition38")==0) return Outputdefinition38Enum;
 	      else if (strcmp(name,"Outputdefinition39")==0) return Outputdefinition39Enum;
 	      else if (strcmp(name,"Outputdefinition3")==0) return Outputdefinition3Enum;
@@ -976,4 +980,6 @@
 	      else if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;
 	      else if (strcmp(name,"BoolInput")==0) return BoolInputEnum;
+	      else if (strcmp(name,"BoolInput2")==0) return BoolInput2Enum;
+	      else if (strcmp(name,"IntInput2")==0) return IntInput2Enum;
 	      else if (strcmp(name,"BoolParam")==0) return BoolParamEnum;
 	      else if (strcmp(name,"Boundary")==0) return BoundaryEnum;
@@ -992,14 +998,15 @@
 	      else if (strcmp(name,"Colinear")==0) return ColinearEnum;
 	      else if (strcmp(name,"Constraints")==0) return ConstraintsEnum;
-	      else if (strcmp(name,"Contact")==0) return ContactEnum;
+         else stage=9;
+   }
+   if(stage==9){
+	      if (strcmp(name,"Contact")==0) return ContactEnum;
 	      else if (strcmp(name,"Contour")==0) return ContourEnum;
 	      else if (strcmp(name,"Contours")==0) return ContoursEnum;
 	      else if (strcmp(name,"ControlInput")==0) return ControlInputEnum;
+	      else if (strcmp(name,"ControlInput2")==0) return ControlInput2Enum;
 	      else if (strcmp(name,"ControlInputGrad")==0) return ControlInputGradEnum;
 	      else if (strcmp(name,"ControlInputMaxs")==0) return ControlInputMaxsEnum;
-         else stage=9;
-   }
-   if(stage==9){
-	      if (strcmp(name,"ControlInputMins")==0) return ControlInputMinsEnum;
+	      else if (strcmp(name,"ControlInputMins")==0) return ControlInputMinsEnum;
 	      else if (strcmp(name,"ControlInputValues")==0) return ControlInputValuesEnum;
 	      else if (strcmp(name,"CrouzeixRaviart")==0) return CrouzeixRaviartEnum;
@@ -1011,4 +1018,5 @@
 	      else if (strcmp(name,"DataSetParam")==0) return DataSetParamEnum;
 	      else if (strcmp(name,"DatasetInput")==0) return DatasetInputEnum;
+	      else if (strcmp(name,"DatasetInput2")==0) return DatasetInput2Enum;
 	      else if (strcmp(name,"DefaultAnalysis")==0) return DefaultAnalysisEnum;
 	      else if (strcmp(name,"DefaultCalving")==0) return DefaultCalvingEnum;
@@ -1020,4 +1028,5 @@
 	      else if (strcmp(name,"Domain3Dsurface")==0) return Domain3DsurfaceEnum;
 	      else if (strcmp(name,"DoubleArrayInput")==0) return DoubleArrayInputEnum;
+	      else if (strcmp(name,"ArrayInput2")==0) return ArrayInput2Enum;
 	      else if (strcmp(name,"DoubleExternalResult")==0) return DoubleExternalResultEnum;
 	      else if (strcmp(name,"DoubleInput")==0) return DoubleInputEnum;
@@ -1100,12 +1109,20 @@
 	      else if (strcmp(name,"IntExternalResult")==0) return IntExternalResultEnum;
 	      else if (strcmp(name,"IntInput")==0) return IntInputEnum;
+	      else if (strcmp(name,"ElementInput2")==0) return ElementInput2Enum;
+	      else if (strcmp(name,"SegInput2")==0) return SegInput2Enum;
+	      else if (strcmp(name,"TriaInput2")==0) return TriaInput2Enum;
+	      else if (strcmp(name,"PentaInput2")==0) return PentaInput2Enum;
 	      else if (strcmp(name,"IntMatExternalResult")==0) return IntMatExternalResultEnum;
 	      else if (strcmp(name,"IntMatParam")==0) return IntMatParamEnum;
 	      else if (strcmp(name,"IntParam")==0) return IntParamEnum;
 	      else if (strcmp(name,"IntVecParam")==0) return IntVecParamEnum;
+	      else if (strcmp(name,"Inputs2")==0) return Inputs2Enum;
 	      else if (strcmp(name,"Internal")==0) return InternalEnum;
 	      else if (strcmp(name,"Intersect")==0) return IntersectEnum;
 	      else if (strcmp(name,"InversionVzObs")==0) return InversionVzObsEnum;
-	      else if (strcmp(name,"J")==0) return JEnum;
+         else stage=10;
+   }
+   if(stage==10){
+	      if (strcmp(name,"J")==0) return JEnum;
 	      else if (strcmp(name,"L1L2Approximation")==0) return L1L2ApproximationEnum;
 	      else if (strcmp(name,"L2ProjectionBaseAnalysis")==0) return L2ProjectionBaseAnalysisEnum;
@@ -1121,8 +1138,5 @@
 	      else if (strcmp(name,"LoveAnalysis")==0) return LoveAnalysisEnum;
 	      else if (strcmp(name,"LoveHi")==0) return LoveHiEnum;
-         else stage=10;
-   }
-   if(stage==10){
-	      if (strcmp(name,"LoveHr")==0) return LoveHrEnum;
+	      else if (strcmp(name,"LoveHr")==0) return LoveHrEnum;
 	      else if (strcmp(name,"LoveKernelsImag")==0) return LoveKernelsImagEnum;
 	      else if (strcmp(name,"LoveKernelsReal")==0) return LoveKernelsRealEnum;
@@ -1186,4 +1200,6 @@
 	      else if (strcmp(name,"Open")==0) return OpenEnum;
 	      else if (strcmp(name,"Option")==0) return OptionEnum;
+	      else if (strcmp(name,"Param")==0) return ParamEnum;
+	      else if (strcmp(name,"Parameters")==0) return ParametersEnum;
 	      else if (strcmp(name,"P0Array")==0) return P0ArrayEnum;
 	      else if (strcmp(name,"P0DG")==0) return P0DGEnum;
@@ -1228,5 +1244,8 @@
 	      else if (strcmp(name,"SMBpddSicopolis")==0) return SMBpddSicopolisEnum;
 	      else if (strcmp(name,"SMBsemic")==0) return SMBsemicEnum;
-	      else if (strcmp(name,"SSAApproximation")==0) return SSAApproximationEnum;
+         else stage=11;
+   }
+   if(stage==11){
+	      if (strcmp(name,"SSAApproximation")==0) return SSAApproximationEnum;
 	      else if (strcmp(name,"SSAFSApproximation")==0) return SSAFSApproximationEnum;
 	      else if (strcmp(name,"SSAHOApproximation")==0) return SSAHOApproximationEnum;
@@ -1244,8 +1263,5 @@
 	      else if (strcmp(name,"SegInput")==0) return SegInputEnum;
 	      else if (strcmp(name,"Segment")==0) return SegmentEnum;
-         else stage=11;
-   }
-   if(stage==11){
-	      if (strcmp(name,"SegmentRiftfront")==0) return SegmentRiftfrontEnum;
+	      else if (strcmp(name,"SegmentRiftfront")==0) return SegmentRiftfrontEnum;
 	      else if (strcmp(name,"Separate")==0) return SeparateEnum;
 	      else if (strcmp(name,"Seq")==0) return SeqEnum;
@@ -1291,4 +1307,5 @@
 	      else if (strcmp(name,"TransientArrayParam")==0) return TransientArrayParamEnum;
 	      else if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
+	      else if (strcmp(name,"TransientInput2")==0) return TransientInput2Enum;
 	      else if (strcmp(name,"TransientParam")==0) return TransientParamEnum;
 	      else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
