Index: /issm/trunk-jpl/src/c/classes/Elements/ElementHook.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/ElementHook.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/classes/Elements/ElementHook.cpp	(revision 15428)
@@ -57,5 +57,5 @@
 	int* vertex_ids = xNew<int>(numvertices);
 	for(int i=0;i<numvertices;i++){ 
-		vertex_ids[i]=reCast<int>(iomodel->Data(MeshElementsEnum)[(element_id-1)*numvertices+i]);
+		vertex_ids[i]=reCast<int>(iomodel->elements[(element_id-1)*numvertices+i]);
 	}
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 15428)
@@ -1395,11 +1395,7 @@
 	TransientInput* transientinput=NULL;
 
-	int    numberofvertices;
-	int    numberofelements;
 	IssmDouble yts;
 
 	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
 	iomodel->Constant(&yts,ConstantsYtsEnum);
 
@@ -1409,10 +1405,10 @@
 		/*Recover vertices ids needed to initialize inputs*/
 		for(i=0;i<6;i++){ 
-			_assert_(iomodel->Data(MeshElementsEnum));
-			penta_vertex_ids[i]=reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[6*index+i]); //ids for vertices are in the elements array from Matlab
+			_assert_(iomodel->elements);
+			penta_vertex_ids[i]=iomodel->elements[6*index+i]; //ids for vertices are in the elements array from Matlab
 		}
 
 		/*Are we in transient or static? */
-		if(M==numberofvertices){
+		if(M==iomodel->numberofvertices){
 
 			/*create input values: */
@@ -1422,5 +1418,5 @@
 			this->inputs->AddInput(new PentaInput(vector_enum,nodeinputs,P1Enum));
 		}
-		else if(M==numberofvertices+1){
+		else if(M==iomodel->numberofvertices+1){
 			/*create transient input: */
 			for(t=0;t<N;t++){ //N is the number of times
@@ -1440,9 +1436,9 @@
 			this->inputs->AddInput(transientinput);
 		}
-		else _error_("nodal vector is either numberofnodes (" << numberofvertices << "), or numberofnodes+1 long. Field provided is " << M << " long. Enum " << EnumToStringx(vector_enum));
+		else _error_("nodal vector is either numberofvertices (" << iomodel->numberofvertices << "), or numberofvertices+1 long. Field provided is " << M << " long. Enum " << EnumToStringx(vector_enum));
 	}
 	else if(vector_type==2){ //element vector
 		/*Are we in transient or static? */
-		if(M==numberofelements){
+		if(M==iomodel->numberofelements){
 
 			/*static mode: create an input out of the element value: */
@@ -1734,10 +1730,10 @@
 	/*Checks if debuging*/
 	/*{{{*/
-	_assert_(iomodel->Data(MeshElementsEnum));
+	_assert_(iomodel->elements);
 	/*}}}*/
 
 	/*Recover vertices ids needed to initialize inputs*/
 	for(i=0;i<6;i++){ 
-		penta_vertex_ids[i]=reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[6*index+i]); //ids for vertices are in the elements array from Matlab
+		penta_vertex_ids[i]=iomodel->elements[6*index+i]; //ids for vertices are in the elements array from Matlab
 	}
 
@@ -2936,5 +2932,5 @@
 	/*Checks if debuging*/
 	/*{{{*/
-	_assert_(iomodel->Data(MeshElementsEnum));
+	_assert_(iomodel->elements);
 	/*}}}*/
 
@@ -2951,5 +2947,5 @@
 
 	/*Recover vertices ids needed to initialize inputs*/
-	for(i=0;i<6;i++) penta_vertex_ids[i]=reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[6*index+i]); //ids for vertices are in the elements array from Matlab
+	for(i=0;i<6;i++) penta_vertex_ids[i]=iomodel->elements[6*index+i]; //ids for vertices are in the elements array from Matlab
 
 	/*Recover nodes ids needed to initialize the node hook.*/
@@ -2957,5 +2953,5 @@
 		//go recover node ids, needed to initialize the node hook.
 		//WARNING: We assume P1 elements here!!!!!
-		penta_node_ids[i]=iomodel->nodecounter+reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[6*index+i]); //ids for vertices are in the elements array from Matlab
+		penta_node_ids[i]=iomodel->nodecounter+iomodel->elements[6*index+i]; //ids for vertices are in the elements array from Matlab
 	}
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 15428)
@@ -1317,5 +1317,5 @@
 	/*Recover vertices ids needed to initialize inputs*/
 	for(i=0;i<3;i++){ 
-		tria_vertex_ids[i]=reCast<int>(iomodel->Data(MeshElementsEnum)[3*index+i]); //ids for vertices are in the elements array from Matlab
+		tria_vertex_ids[i]=reCast<int>(iomodel->elements[3*index+i]); //ids for vertices are in the elements array from Matlab
 	}
 
@@ -1651,11 +1651,7 @@
 	IssmDouble time;
 	TransientInput* transientinput=NULL;
-	int    numberofvertices;
-	int    numberofelements;
 	IssmDouble yts;
 
 	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
 	iomodel->Constant(&yts,ConstantsYtsEnum);
 
@@ -1665,10 +1661,10 @@
 		/*Recover vertices ids needed to initialize inputs*/
 		for(i=0;i<3;i++){ 
-			_assert_(iomodel->Data(MeshElementsEnum));
-			tria_vertex_ids[i]=reCast<int>(iomodel->Data(MeshElementsEnum)[3*index+i]); //ids for vertices are in the elements array from Matlab
+			_assert_(iomodel->elements);
+			tria_vertex_ids[i]=reCast<int>(iomodel->elements[3*index+i]); //ids for vertices are in the elements array from Matlab
 		}
 
 		/*Are we in transient or static? */
-		if(M==numberofvertices){
+		if(M==iomodel->numberofvertices){
 
 			/*create input values: */
@@ -1678,5 +1674,5 @@
 			this->inputs->AddInput(new TriaInput(vector_enum,nodeinputs,P1Enum));
 		}
-		else if(M==numberofvertices+1){
+		else if(M==iomodel->numberofvertices+1){
 			/*create transient input: */
 			for(t=0;t<N;t++){ //N is the number of times
@@ -1696,9 +1692,9 @@
 			this->inputs->AddInput(transientinput);
 		}
-		else _error_("nodal vector is either numberofnodes or numberofnodes+1 long. Field provided (" << EnumToStringx(vector_enum) << ") is " << M << " long");
+		else _error_("nodal vector is either numberofvertices or numberofvertices+1 long. Field provided (" << EnumToStringx(vector_enum) << ") is " << M << " long");
 	}
 	else if(vector_type==2){ //element vector
 		/*Are we in transient or static? */
-		if(M==numberofelements){
+		if(M==iomodel->numberofelements){
 
 			/*static mode: create an input out of the element value: */
@@ -2219,5 +2215,5 @@
 	/*Checks if debuging*/
 	/*{{{*/
-	_assert_(iomodel->Data(MeshElementsEnum));
+	_assert_(iomodel->elements);
 	/*}}}*/
 
@@ -2241,5 +2237,5 @@
 	/*Recover vertices ids needed to initialize inputs*/
 	for(i=0;i<3;i++){ 
-		tria_vertex_ids[i]=reCast<int>(iomodel->Data(MeshElementsEnum)[3*index+i]); //ids for vertices are in the elements array from Matlab
+		tria_vertex_ids[i]=reCast<int>(iomodel->elements[3*index+i]); //ids for vertices are in the elements array from Matlab
 	}
 
@@ -2254,5 +2250,5 @@
 		/*Continuous Galerkin*/
 		for(i=0;i<3;i++){ 
-			tria_node_ids[i]=iomodel->nodecounter+reCast<int,IssmDouble>(*(iomodel->Data(MeshElementsEnum)+3*index+i)); //ids for vertices are in the elements array from Matlab
+			tria_node_ids[i]=iomodel->nodecounter+reCast<int,IssmDouble>(*(iomodel->elements+3*index+i)); //ids for vertices are in the elements array from Matlab
 		}
 	}
Index: /issm/trunk-jpl/src/c/classes/IoModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 15428)
@@ -69,5 +69,7 @@
 
 	FetchData(&this->dim,MeshDimensionEnum);
-	this->elements=NULL;
+	FetchData(&this->numberofvertices,MeshNumberofverticesEnum);
+	FetchData(&this->numberofelements,MeshNumberofelementsEnum);
+	FetchData(&this->elements,NULL,NULL,MeshElementsEnum);
 	this->edges=NULL;
 	this->singlenodetoelementconnectivity=NULL;
@@ -101,4 +103,6 @@
 	xDelete<bool>(this->my_nodes);
 	xDelete<int>(this->my_vertices);
+	xDelete<int>(this->elements);
+	xDelete<int>(this->edges);
 	xDelete<int>(this->singlenodetoelementconnectivity);
 	xDelete<int>(this->numbernodetoelementconnectivity);
Index: /issm/trunk-jpl/src/c/classes/IoModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.h	(revision 15427)
+++ /issm/trunk-jpl/src/c/classes/IoModel.h	(revision 15428)
@@ -33,4 +33,6 @@
 		/*Mesh properties and connectivity tables*/
 		int   dim;
+		int   numberofvertices;
+		int   numberofelements;
 		int  *elements;
 		int  *edges;
Index: /issm/trunk-jpl/src/c/classes/Loads/Numericalflux.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Numericalflux.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/classes/Loads/Numericalflux.cpp	(revision 15428)
@@ -93,8 +93,8 @@
 		pos1=pos2=pos3=pos4=UNDEF;
 		for(j=0;j<3;j++){
-			if (iomodel->Data(MeshElementsEnum)[3*(e1-1)+j]==i1) pos1=j+1;
-			if (iomodel->Data(MeshElementsEnum)[3*(e1-1)+j]==i2) pos2=j+1;
-			if (iomodel->Data(MeshElementsEnum)[3*(e2-1)+j]==i1) pos3=j+1;
-			if (iomodel->Data(MeshElementsEnum)[3*(e2-1)+j]==i2) pos4=j+1;
+			if (iomodel->elements[3*(e1-1)+j]==i1) pos1=j+1;
+			if (iomodel->elements[3*(e1-1)+j]==i2) pos2=j+1;
+			if (iomodel->elements[3*(e2-1)+j]==i1) pos3=j+1;
+			if (iomodel->elements[3*(e2-1)+j]==i2) pos4=j+1;
 		}
 		_assert_(pos1!=UNDEF && pos2!=UNDEF && pos3!=UNDEF && pos4!=UNDEF);
@@ -112,6 +112,6 @@
 		pos1=pos2=UNDEF;
 		for(j=0;j<3;j++){
-			if (iomodel->Data(MeshElementsEnum)[3*(e1-1)+j]==i1) pos1=j+1;
-			if (iomodel->Data(MeshElementsEnum)[3*(e1-1)+j]==i2) pos2=j+1;
+			if (iomodel->elements[3*(e1-1)+j]==i1) pos1=j+1;
+			if (iomodel->elements[3*(e1-1)+j]==i2) pos2=j+1;
 		}
 		_assert_(pos1!=UNDEF && pos2!=UNDEF);
Index: /issm/trunk-jpl/src/c/classes/Loads/Pengrid.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Pengrid.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/classes/Loads/Pengrid.cpp	(revision 15428)
@@ -43,14 +43,7 @@
 	int pengrid_element_id;
 
-	int numberofvertices;
-	int numberofelements;
-
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-
 	/*Some checks if debugging activated*/
 	_assert_(iomodel->singlenodetoelementconnectivity);
-	_assert_(index>=0 && index<numberofvertices);
+	_assert_(index>=0 && index<iomodel->numberofvertices);
 	_assert_(id);
 
@@ -63,5 +56,5 @@
 	pengrid_element_id=iomodel->singlenodetoelementconnectivity[index];
 	_assert_(pengrid_element_id);
-	pengrid_matpar_id=numberofelements+1; //refers to the constant material parameters object
+	pengrid_matpar_id=iomodel->numberofelements+1; //refers to the constant material parameters object
 
 	this->hnode=new Hook(&pengrid_node_id,1);
Index: /issm/trunk-jpl/src/c/classes/Materials/Matdamageice.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Materials/Matdamageice.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/classes/Materials/Matdamageice.cpp	(revision 15428)
@@ -754,5 +754,5 @@
 		/*Get B*/
 		if (iomodel->Data(MaterialsRheologyBEnum)) {
-			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)];
+			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[iomodel->elements[num_vertices*index+i]-1];
 			this->inputs->AddInput(new TriaInput(MaterialsRheologyBbarEnum,nodeinputs,P1Enum));
 		}
@@ -766,5 +766,5 @@
 		/*Get Z*/
 		if (iomodel->Data(MaterialsRheologyZEnum)) {
-			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyZEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)];
+			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyZEnum)[iomodel->elements[num_vertices*index+i]-1];
 			this->inputs->AddInput(new TriaInput(MaterialsRheologyZbarEnum,nodeinputs,P1Enum));
 		}
@@ -778,7 +778,7 @@
 						if (iomodel->Data(MaterialsRheologyBEnum)){
 							_assert_(iomodel->Data(MaterialsRheologyBEnum));_assert_(iomodel->Data(InversionMinParametersEnum)); _assert_(iomodel->Data(InversionMaxParametersEnum)); 
-							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)];
-							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
-							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyBEnum)[iomodel->elements[num_vertices*index+j]-1];
+							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(iomodel->elements[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(iomodel->elements[num_vertices*index+j]-1)*num_control_type+i];
 							this->inputs->AddInput(new ControlInput(MaterialsRheologyBbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
 						}
@@ -787,7 +787,7 @@
 						if (iomodel->Data(MaterialsRheologyZEnum)){
 							_assert_(iomodel->Data(MaterialsRheologyZEnum));_assert_(iomodel->Data(InversionMinParametersEnum)); _assert_(iomodel->Data(InversionMaxParametersEnum)); 
-							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyZEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)];
-							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
-							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyZEnum)[iomodel->elements[num_vertices*index+j]-1];
+							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(iomodel->elements[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(iomodel->elements[num_vertices*index+j]-1)*num_control_type+i];
 							this->inputs->AddInput(new ControlInput(MaterialsRheologyZbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
 						}
@@ -812,5 +812,5 @@
 		/*Get B*/
 		if (iomodel->Data(MaterialsRheologyBEnum)) {
-			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)];
+			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[iomodel->elements[num_vertices*index+i]-1];
 			this->inputs->AddInput(new PentaInput(MaterialsRheologyBEnum,nodeinputs,P1Enum));
 		}
@@ -824,5 +824,5 @@
 		/*Get Z*/
 		if (iomodel->Data(MaterialsRheologyZEnum)) {
-			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyZEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)];
+			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyZEnum)[iomodel->elements[num_vertices*index+i]-1];
 			this->inputs->AddInput(new PentaInput(MaterialsRheologyZEnum,nodeinputs,P1Enum));
 		}
@@ -836,7 +836,7 @@
 						if (iomodel->Data(MaterialsRheologyBEnum)){
 							_assert_(iomodel->Data(MaterialsRheologyBEnum));_assert_(iomodel->Data(InversionMinParametersEnum)); _assert_(iomodel->Data(InversionMaxParametersEnum)); 
-							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)];
-							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
-							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyBEnum)[iomodel->elements[num_vertices*index+j]-1];
+							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(iomodel->elements[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(iomodel->elements[num_vertices*index+j]-1)*num_control_type+i];
 							this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
 						}
@@ -845,7 +845,7 @@
 						if (iomodel->Data(MaterialsRheologyZEnum)){
 							_assert_(iomodel->Data(MaterialsRheologyZEnum));_assert_(iomodel->Data(InversionMinParametersEnum)); _assert_(iomodel->Data(InversionMaxParametersEnum)); 
-							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyZEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)];
-							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
-							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyZEnum)[iomodel->elements[num_vertices*index+j]-1];
+							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(iomodel->elements[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(iomodel->elements[num_vertices*index+j]-1)*num_control_type+i];
 							this->inputs->AddInput(new ControlInput(MaterialsRheologyZEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
 						}
Index: /issm/trunk-jpl/src/c/classes/Materials/Matice.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Materials/Matice.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/classes/Materials/Matice.cpp	(revision 15428)
@@ -704,5 +704,5 @@
 		/*Get B*/
 		if (iomodel->Data(MaterialsRheologyBEnum)) {
-			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)];
+			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[iomodel->elements[num_vertices*index+i]-1];
 			this->inputs->AddInput(new TriaInput(MaterialsRheologyBbarEnum,nodeinputs,P1Enum));
 		}
@@ -722,7 +722,7 @@
 						if (iomodel->Data(MaterialsRheologyBEnum)){
 							_assert_(iomodel->Data(MaterialsRheologyBEnum));_assert_(iomodel->Data(InversionMinParametersEnum)); _assert_(iomodel->Data(InversionMaxParametersEnum)); 
-							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)];
-							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
-							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyBEnum)[iomodel->elements[num_vertices*index+j]-1];
+							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(iomodel->elements[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(iomodel->elements[num_vertices*index+j]-1)*num_control_type+i];
 							this->inputs->AddInput(new ControlInput(MaterialsRheologyBbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
 						}
@@ -739,12 +739,12 @@
 
 		/*Intermediaries*/
-		const int num_vertices = 6; //Penta has 6 vertices
-		IssmDouble    nodeinputs[num_vertices];
-		IssmDouble    cmmininputs[num_vertices];
-		IssmDouble    cmmaxinputs[num_vertices];
+		const int  num_vertices = 6; //Penta has 6 vertices
+		IssmDouble nodeinputs[num_vertices];
+		IssmDouble cmmininputs[num_vertices];
+		IssmDouble cmmaxinputs[num_vertices];
 
 		/*Get B*/
 		if (iomodel->Data(MaterialsRheologyBEnum)) {
-			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)];
+			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[iomodel->elements[num_vertices*index+i]-1];
 			this->inputs->AddInput(new PentaInput(MaterialsRheologyBEnum,nodeinputs,P1Enum));
 		}
@@ -764,7 +764,7 @@
 						if (iomodel->Data(MaterialsRheologyBEnum)){
 							_assert_(iomodel->Data(MaterialsRheologyBEnum));_assert_(iomodel->Data(InversionMinParametersEnum)); _assert_(iomodel->Data(InversionMaxParametersEnum)); 
-							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)];
-							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
-							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyBEnum)[iomodel->elements[num_vertices*index+j]-1];
+							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(iomodel->elements[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(iomodel->elements[num_vertices*index+j]-1)*num_control_type+i];
 							this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
 						}
Index: /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp	(revision 15428)
@@ -20,5 +20,4 @@
 	bool        spcpresent       = false;
 	int         count            = 0;
-	int         numberofvertices;
 
 	/*variables being fetched: */
@@ -27,5 +26,4 @@
 
 	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 	iomodel->Constant(&yts,ConstantsYtsEnum);
 
@@ -40,10 +38,10 @@
 
 	/*Transient or static?:*/
-	if(M==numberofvertices){
+	if(M==iomodel->numberofvertices){
 		/*static: just create Constraints objects*/
 		count=0;
 
 		/*Create Constraints from x,y,z: */
-		for (i=0;i<numberofvertices;i++){
+		for (i=0;i<iomodel->numberofvertices;i++){
 
 			/*keep only this partition's nodes:*/
@@ -58,5 +56,5 @@
 		}
 	}
-	else if (M==(numberofvertices+1)){
+	else if (M==(iomodel->numberofvertices+1)){
 		/*transient: create transient SpcTransient objects. Same logic, except we need to retrieve 
 		 * various times and values to initialize an SpcTransient object: */
@@ -70,5 +68,5 @@
 
 		/*Create constraints from x,y,z: */
-		for (i=0;i<numberofvertices;i++){
+		for (i=0;i<iomodel->numberofvertices;i++){
 
 			/*keep only this partition's nodes:*/
Index: /issm/trunk-jpl/src/c/modules/MeshPartitionx/MeshPartitionx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/MeshPartitionx/MeshPartitionx.h	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/MeshPartitionx/MeshPartitionx.h	(revision 15428)
@@ -10,5 +10,5 @@
 /* local prototypes: */
 template <class doubletype> 
-int MeshPartitionx(int** pepart, int** pnpart, int numberofelements,int numberofnodes,doubletype* elements,
+int MeshPartitionx(int** pepart, int** pnpart, int numberofelements,int numberofnodes,int* elements,
 		int numberofelements2d,int numberofnodes2d,doubletype* elements2d,int numlayers,int elements_width, int dim,int num_procs){
 
@@ -37,5 +37,5 @@
 		for (i=0;i<numberofelements;i++){
 			for (j=0;j<elements_width;j++){
-				*(index+elements_width*i+j)=reCast<int>(*(elements+elements_width*i+j))-1; //-1 for C indexing in Metis
+				*(index+elements_width*i+j)=(*(elements+elements_width*i+j))-1; //-1 for C indexing in Metis
 			}
 		}
@@ -118,4 +118,4 @@
 	xDelete<int>(index2d);
 	return noerr;
-}	
+}
 #endif /* _MESHPARTITIONX_H */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateLoadsBalancethickness.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateLoadsBalancethickness.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateLoadsBalancethickness.cpp	(revision 15428)
@@ -28,5 +28,5 @@
 
 		/*Get edges and elements*/
-		iomodel->FetchData(3,MeshEdgesEnum,MeshElementsEnum,ThicknessEnum);
+		iomodel->FetchData(2,MeshEdgesEnum,ThicknessEnum);
 
 		/*First load data:*/
@@ -44,5 +44,5 @@
 
 		/*Free data: */
-		iomodel->DeleteData(3,MeshEdgesEnum,MeshElementsEnum,ThicknessEnum);
+		iomodel->DeleteData(2,MeshEdgesEnum,ThicknessEnum);
 	}
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateNodesBalancethickness.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateNodesBalancethickness.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateNodesBalancethickness.cpp	(revision 15428)
@@ -17,11 +17,7 @@
 	int  io_index;
 	bool continuous_galerkin=true;
-	int    numberofelements;
-	int    numberofvertices;
-	int    stabilization;
+	int  stabilization;
 
 	/*Fetch parameters: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 	iomodel->Constant(&stabilization,BalancethicknessStabilizationEnum);
 
@@ -40,10 +36,10 @@
 
 	/*First fetch data: */
-	iomodel->FetchData(7,MeshElementsEnum,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
+	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
 
 	if(continuous_galerkin){
 
 		/*Build Nodes dataset (Continuous Galerkin)*/
-		for (i=0;i<numberofvertices;i++){
+		for (i=0;i<iomodel->numberofvertices;i++){
 			if(iomodel->my_vertices[i]){
 
@@ -57,5 +53,5 @@
 
 		/*Build Nodes dataset -> 3 for each element (Discontinuous Galerkin)*/
-		for (i=0;i<numberofelements;i++){
+		for (i=0;i<iomodel->numberofelements;i++){
 			for (j=0;j<3;j++){
 
@@ -63,7 +59,7 @@
 
 					//Get index of the vertex on which the current node is located
-					vertex_id=reCast<int,IssmDouble>(*(iomodel->Data(MeshElementsEnum)+3*i+j)); //(Matlab indexing)
-					io_index=vertex_id-1;                      //(C indexing)
-					_assert_(vertex_id>0 && vertex_id<=numberofvertices);
+					vertex_id=iomodel->elements[3*i+j]; //(Matlab indexing)
+					io_index=vertex_id-1;               //(C indexing)
+					_assert_(vertex_id>0 && vertex_id<=iomodel->numberofvertices);
 
 					//Compute Node id
@@ -79,5 +75,5 @@
 
 	/*Clean fetched data: */
-	iomodel->DeleteData(7,MeshElementsEnum,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
+	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
 
 	/*Assign output pointer: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/UpdateElementsBalancethickness.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/UpdateElementsBalancethickness.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/UpdateElementsBalancethickness.cpp	(revision 15428)
@@ -11,13 +11,7 @@
 void	UpdateElementsBalancethickness(Elements* elements, IoModel* iomodel,int analysis_counter,int analysis_type){
 
-	int    numberofelements;
-
-	/*Fetch data needed: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-	iomodel->FetchData(1,MeshElementsEnum);
-
 	/*Update elements: */
 	int counter=0;
-	for(int i=0;i<numberofelements;i++){
+	for(int i=0;i<iomodel->numberofelements;i++){
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
@@ -42,5 +36,3 @@
 		iomodel->FetchDataToInput(elements,MeshElementonsurfaceEnum);
 	}
-	/*Free data: */
-	iomodel->DeleteData(1,MeshElementsEnum);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/BedSlope/CreateNodesBedSlope.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/BedSlope/CreateNodesBedSlope.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/BedSlope/CreateNodesBedSlope.cpp	(revision 15428)
@@ -12,10 +12,5 @@
 
 	/*Intermediary*/
-	int i;
 	bool continuous_galerkin=true;
-
-	/*Fetch parameters: */
-	int    numberofvertices;
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 
 	/*Recover pointer: */
@@ -31,5 +26,5 @@
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
 
-	for (i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 		if(iomodel->my_vertices[i]){
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/BedSlope/UpdateElementsBedSlope.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/BedSlope/UpdateElementsBedSlope.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/BedSlope/UpdateElementsBedSlope.cpp	(revision 15428)
@@ -11,13 +11,7 @@
 void	UpdateElementsBedSlope(Elements* elements, IoModel* iomodel,int analysis_counter,int analysis_type){
 
-	int    numberofelements;
-
-	/*Fetch data needed: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-	iomodel->FetchData(1,MeshElementsEnum);
-
 	/*Update elements: */
 	int counter=0;
-	for(int i=0;i<numberofelements;i++){
+	for(int i=0;i<iomodel->numberofelements;i++){
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
@@ -30,11 +24,7 @@
 	iomodel->FetchDataToInput(elements,BedEnum);
 	iomodel->FetchDataToInput(elements,MaskElementonwaterEnum);
-
 	if(iomodel->dim==3){
 		iomodel->FetchDataToInput(elements,MeshElementonbedEnum);
 		iomodel->FetchDataToInput(elements,MeshElementonsurfaceEnum);
 	}
-
-	/*Free data: */
-	iomodel->DeleteData(1,MeshElementsEnum);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 15428)
@@ -29,5 +29,4 @@
 
 	/*Fetch data needed: */
-	iomodel->FetchData(1,MeshElementsEnum);
 	iomodel->FetchDataToInput(elements,InversionVxObsEnum);
 	iomodel->FetchDataToInput(elements,InversionVyObsEnum); 
@@ -62,4 +61,4 @@
 
 	/*Free data: */
-	iomodel->DeleteData(1+4+6,MeshElementsEnum,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum,BalancethicknessThickeningRateEnum,VxEnum,VyEnum,FrictionCoefficientEnum,MaterialsRheologyBEnum,MaterialsRheologyZEnum);
+	iomodel->DeleteData(4+6,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum,BalancethicknessThickeningRateEnum,VxEnum,VyEnum,FrictionCoefficientEnum,MaterialsRheologyBEnum,MaterialsRheologyZEnum);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 15428)
@@ -13,6 +13,4 @@
 	int i;
 	int materials_type;
-	int numberofelements;
-	int numberofvertices;
 	bool control_analysis;
 	bool dakota_analysis;
@@ -24,6 +22,4 @@
 
 	/*Fetch parameters: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 	iomodel->Constant(&control_analysis,InversionIscontrolEnum);
 	iomodel->Constant(&dakota_analysis,QmuIsdakotaEnum);
@@ -38,5 +34,5 @@
 	materials = new Materials();
 
-	iomodel->FetchData(2,MeshElementsEnum,MeshElementconnectivityEnum);
+	iomodel->FetchData(1,MeshElementconnectivityEnum);
 	#ifdef _HAVE_3D_
 	if(iomodel->dim==3)iomodel->FetchData(2,MeshUpperelementsEnum,MeshLowerelementsEnum);
@@ -45,5 +41,5 @@
 
 	/*Create elements*/
-	for (i=0;i<numberofelements;i++){
+	for(i=0;i<iomodel->numberofelements;i++){
 		if(iomodel->my_elements[i]){
 
@@ -60,5 +56,5 @@
 		case MaticeEnum:
 			iomodel->FetchData(2,MaterialsRheologyBEnum,MaterialsRheologyNEnum);
-			for (i=0;i<numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matice(i+1,i,iomodel));
+			for (i=0;i<iomodel->numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matice(i+1,i,iomodel));
 			if(dakota_analysis){
 				if(iomodel->dim==2) materials->InputDuplicate(MaterialsRheologyBbarEnum,QmuMaterialsRheologyBEnum); 
@@ -70,5 +66,5 @@
 		case MatdamageiceEnum:
 			iomodel->FetchData(3,MaterialsRheologyBEnum,MaterialsRheologyNEnum,MaterialsRheologyZEnum);
-			for (i=0;i<numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matdamageice(i+1,i,iomodel));
+			for (i=0;i<iomodel->numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matdamageice(i+1,i,iomodel));
 			break;
 		default:
@@ -77,18 +73,18 @@
 
 	/*Free data: */
-	iomodel->DeleteData(10,MeshElementsEnum,MeshElementconnectivityEnum,MeshUpperelementsEnum,MeshLowerelementsEnum,
+	iomodel->DeleteData(9,MeshElementconnectivityEnum,MeshUpperelementsEnum,MeshLowerelementsEnum,
 				MaterialsRheologyBEnum,MaterialsRheologyNEnum,MaterialsRheologyZEnum,InversionControlParametersEnum,InversionMinParametersEnum,
 				InversionMaxParametersEnum);
 
 	/*Add new constant material property to materials, at the end: */
-	materials->AddObject(new Matpar(numberofelements+1,iomodel));//put it at the end of the materials
+	materials->AddObject(new Matpar(iomodel->numberofelements+1,iomodel));//put it at the end of the materials
 
 	/*Create vertices: */
 
 	/*Fetch data:*/
-	iomodel->FetchData(7,MeshElementsEnum,MeshXEnum,MeshYEnum,MeshZEnum,BedEnum,ThicknessEnum,IcelevelsetEnum);
+	iomodel->FetchData(6,MeshXEnum,MeshYEnum,MeshZEnum,BedEnum,ThicknessEnum,IcelevelsetEnum);
 	CreateNumberNodeToElementConnectivity(iomodel);
 
-	for (i=0;i<numberofvertices;i++){
+	for(i=0;i<iomodel->numberofvertices;i++){
 
 		/*vertices and nodes (same number, as we are running continuous galerkin formulation): */
@@ -101,5 +97,5 @@
 
 	/*Free data: */
-	iomodel->DeleteData(7,MeshElementsEnum,MeshXEnum,MeshYEnum,MeshZEnum,BedEnum,ThicknessEnum,IcelevelsetEnum);
+	iomodel->DeleteData(6,MeshXEnum,MeshYEnum,MeshZEnum,BedEnum,ThicknessEnum,IcelevelsetEnum);
 
 	/*Assign output pointer: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNumberNodeToElementConnectivity.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNumberNodeToElementConnectivity.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNumberNodeToElementConnectivity.cpp	(revision 15428)
@@ -20,7 +20,4 @@
 	int vertexid;
 	int elementswidth;
-	int numberofelements;
-	int numberofvertices;
-	IssmDouble* elements=NULL;
 
 	/*output*/
@@ -30,19 +27,14 @@
 	if(iomodel->numbernodetoelementconnectivity) return;
 
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
-	elements=iomodel->Data(MeshElementsEnum);
-
 	/*Some checks if debugging*/
-	_assert_(numberofvertices);
-	_assert_(numberofelements);
-	_assert_(elements);
+	_assert_(iomodel->numberofvertices);
+	_assert_(iomodel->numberofelements);
+	_assert_(iomodel->elements);
 
 	/*Allocate ouput*/
-	connectivity=xNewZeroInit<int>(numberofvertices);
+	connectivity=xNewZeroInit<int>(iomodel->numberofvertices);
 
 	/*Get element width (3 or 6)*/
-	if (iomodel->dim==2){
+	if(iomodel->dim==2){
 		elementswidth=3;
 	}
@@ -52,8 +44,8 @@
 
 	/*Create connectivity table*/
-	for (i=0;i<numberofelements;i++){
+	for (i=0;i<iomodel->numberofelements;i++){
 		for (j=0;j<elementswidth;j++){
-			vertexid=reCast<int>(elements[elementswidth*i+j]);
-			_assert_(vertexid>0 && vertexid-1<numberofvertices);
+			vertexid=iomodel->elements[elementswidth*i+j];
+			_assert_(vertexid>0 && vertexid-1<iomodel->numberofvertices);
 			connectivity[vertexid-1]+=1;
 		}
@@ -62,5 +54,3 @@
 	/*Assign to iomodel*/
 	iomodel->numbernodetoelementconnectivity=connectivity;
-
-	/*Do not free connectivity!!!*/
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateSingleNodeToElementConnectivity.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateSingleNodeToElementConnectivity.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateSingleNodeToElementConnectivity.cpp	(revision 15428)
@@ -17,10 +17,6 @@
 
 	/*Intermediary*/
-	int i,j;
 	int vertexid;
 	int elementswidth;
-	int    numberofelements;
-	int    numberofvertices;
-	IssmDouble* elements=NULL;
 
 	/*output*/
@@ -30,17 +26,12 @@
 	if(iomodel->singlenodetoelementconnectivity) return;
 
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
-	elements=iomodel->Data(MeshElementsEnum);
-
 	/*Some checks if debugging*/
-	_assert_(numberofvertices);
-	_assert_(numberofelements);
+	_assert_(iomodel->numberofvertices);
+	_assert_(iomodel->numberofelements);
 	_assert_(iomodel->my_elements);
-	_assert_(elements);
+	_assert_(iomodel->elements);
 
 	/*Allocate ouput*/
-	connectivity=xNewZeroInit<int>(numberofvertices);
+	connectivity=xNewZeroInit<int>(iomodel->numberofvertices);
 
 	/*Get element width (3 or 6)*/
@@ -53,10 +44,10 @@
 
 	/*Create connectivity table*/
-	for (i=0;i<numberofelements;i++){
+	for(int i=0;i<iomodel->numberofelements;i++){
 		/*!! in parallel we do not want the vertex to be connected to an element that is not in its partition!!*/
 		if(iomodel->my_elements[i]){
-			for (j=0;j<elementswidth;j++){
-				vertexid=reCast<int>(elements[elementswidth*i+j]);
-				_assert_(vertexid>0 && vertexid-1<numberofvertices);
+			for(int j=0;j<elementswidth;j++){
+				vertexid=iomodel->elements[elementswidth*i+j];
+				_assert_(vertexid>0 && vertexid-1<iomodel->numberofvertices);
 				connectivity[vertexid-1]=i+1;
 			}
@@ -66,5 +57,3 @@
 	/*Assign to iomodel*/
 	iomodel->singlenodetoelementconnectivity=connectivity;
-
-	/*Do not free connectivity!!!*/
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Dakota/CreateParametersDakota.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Dakota/CreateParametersDakota.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Dakota/CreateParametersDakota.cpp	(revision 15428)
@@ -36,5 +36,4 @@
 	char*    name=NULL;
 	int      numberofresponses;
-	int      numberofvertices;
 	int      nrows;
 	int      ncols;
@@ -52,5 +51,4 @@
 		iomodel->Constant(&name,MiscellaneousNameEnum);
 		iomodel->Constant(&numberofresponses,QmuNumberofresponsesEnum);
-		iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 
 		/*name of qmu input, error and output files:{{{*/
@@ -92,8 +90,8 @@
 			ElementsAndVerticesPartitioning(&iomodel->my_elements,&iomodel->my_vertices,iomodel);
 
-			dpart=xNew<double>(numberofvertices);
-			for(i=0;i<numberofvertices;i++)dpart[i]=iomodel->my_vertices[i];
+			dpart=xNew<double>(iomodel->numberofvertices);
+			for(i=0;i<iomodel->numberofvertices;i++)dpart[i]=iomodel->my_vertices[i];
 		}
-		parameters->AddObject(new DoubleVecParam(QmuPartitionEnum,dpart,numberofvertices));
+		parameters->AddObject(new DoubleVecParam(QmuPartitionEnum,dpart,iomodel->numberofvertices));
 		/*}}}*/
 		/*Deal with data needed because of qmu variables: {{{*/
@@ -109,5 +107,5 @@
 
 				/*Add to parameters: */
-				if(nrows==numberofvertices){
+				if(nrows==iomodel->numberofvertices){
 					parameters->AddObject(new DoubleMatParam(StringToEnumx(tag),dakota_parameter,nrows,ncols));
 				}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 15428)
@@ -41,9 +41,7 @@
 	Constraints *constraints      = NULL;
 	SpcStatic   *spcstatic        = NULL;
-	int          numberofvertices;
 
 	/*Fetch parameters: */
 	iomodel->Constant(&yts,ConstantsYtsEnum);
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 	iomodel->Constant(&g,ConstantsGEnum);
 	iomodel->Constant(&rho_ice,MaterialsRhoIceEnum);
@@ -98,5 +96,5 @@
 
 	/*Create spcs from x,y,z, as well as the spc values on those spcs: */
-	for (i=0;i<numberofvertices;i++){
+	for(i=0;i<iomodel->numberofvertices;i++){
 		if(iomodel->my_vertices[i]){
 
@@ -218,9 +216,9 @@
 			/*Now add the regular spcs*/
 			else{
-				if (Mx==numberofvertices && !xIsNan<IssmDouble>(spcvx[i])){
+				if (Mx==iomodel->numberofvertices && !xIsNan<IssmDouble>(spcvx[i])){
 					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,spcvx[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 					count++;
 				}
-				else if (Mx==numberofvertices+1) {
+				else if (Mx==iomodel->numberofvertices+1) {
 					/*figure out times and values: */
 					values=xNew<IssmDouble>(Nx);
@@ -242,9 +240,9 @@
 				}
 
-				if (My==numberofvertices && !xIsNan<IssmDouble>(spcvy[i])){
+				if (My==iomodel->numberofvertices && !xIsNan<IssmDouble>(spcvy[i])){
 					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,2,spcvy[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vy.
 					count++;
 				}
-				else if (My==numberofvertices+1){
+				else if (My==iomodel->numberofvertices+1){
 					/*figure out times and values: */
 					values=xNew<IssmDouble>(Ny);
@@ -266,9 +264,9 @@
 
 				if (reCast<int,IssmDouble>(vertices_type[i])==StokesApproximationEnum ||  (reCast<int,IssmDouble>(vertices_type[i])==NoneApproximationEnum)){
-					if (Mz==numberofvertices && !xIsNan<IssmDouble>(spcvz[i])){
+					if (Mz==iomodel->numberofvertices && !xIsNan<IssmDouble>(spcvz[i])){
 						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,spcvz[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 2 to vy
 						count++;
 					}
-					else if (Mz==numberofvertices+1){
+					else if (Mz==iomodel->numberofvertices+1){
 						/*figure out times and values: */
 						values=xNew<IssmDouble>(Nz);
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateLoadsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateLoadsDiagnosticHoriz.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateLoadsDiagnosticHoriz.cpp	(revision 15428)
@@ -19,5 +19,4 @@
 	int count=0;
 	int penpair_ids[2];
-	int numberofvertices;
 	bool ismacayealpattyn,isstokes,isl1l2;
 	int  numpenalties,numberofpressureloads,numrifts,numriftsegments;
@@ -33,5 +32,4 @@
 
 	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 	iomodel->Constant(&isl1l2,FlowequationIsl1l2Enum);
 	iomodel->Constant(&isstokes,FlowequationIsstokesEnum);
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp	(revision 15428)
@@ -12,11 +12,8 @@
 
 	/*Intermediary*/
-	int i;
 	bool   continuous_galerkin=true;
-	int    numberofvertices;
 	bool   isstokes,isl1l2,ismacayealpattyn;
 
 	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 	iomodel->Constant(&isstokes,FlowequationIsstokesEnum);
 	iomodel->Constant(&isl1l2,FlowequationIsl1l2Enum);
@@ -42,5 +39,5 @@
 				MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,MaskVertexonwaterEnum,FlowequationVertexEquationEnum,DiagnosticReferentialEnum);
 
-	for (i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 
 		if(iomodel->my_vertices[i]){
@@ -59,5 +56,5 @@
 		iomodel->Constant(&numberofedges,MeshNumberofedgesEnum);
 
-		for (i=0;i<numberofedges;i++){
+		for(int i=0;i<numberofedges;i++){
 
 			/*Get left and right elements*/
@@ -73,5 +70,5 @@
 			/*Add node on edge*/
 			if(my_edge){
-				nodes->AddObject(new Node(iomodel->nodecounter+numberofvertices+i+1,numberofvertices+i,numberofvertices+i+1,i,iomodel,DiagnosticHorizAnalysisEnum));
+				nodes->AddObject(new Node(iomodel->nodecounter+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,iomodel->numberofvertices+i+1,i,iomodel,DiagnosticHorizAnalysisEnum));
 			}
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/UpdateElementsDiagnosticHoriz.cpp	(revision 15428)
@@ -17,5 +17,4 @@
 
 	int    materials_type;
-	int    numberofelements;
 	bool   ismacayealpattyn;
 	bool   isl1l2;
@@ -28,5 +27,4 @@
 	iomodel->Constant(&isl1l2,FlowequationIsl1l2Enum);
 	iomodel->Constant(&ismacayealpattyn,FlowequationIsmacayealpattynEnum);
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
 	iomodel->Constant(&control_analysis,InversionIscontrolEnum);
 	iomodel->Constant(&dakota_analysis,QmuIsdakotaEnum);
@@ -37,9 +35,9 @@
 
 	/*Fetch data needed: */
-	iomodel->FetchData(2,MeshElementsEnum,FlowequationElementEquationEnum);
+	iomodel->FetchData(1,FlowequationElementEquationEnum);
 
 	/*Update elements: */
 	int counter=0;
-	for(int i=0;i<numberofelements;i++){
+	for(int i=0;i<iomodel->numberofelements;i++){
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
@@ -103,4 +101,4 @@
 
 	/*Free data: */
-	iomodel->DeleteData(2,MeshElementsEnum,FlowequationElementEquationEnum);
+	iomodel->DeleteData(1,FlowequationElementEquationEnum);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateConstraintsDiagnosticHutter.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateConstraintsDiagnosticHutter.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateConstraintsDiagnosticHutter.cpp	(revision 15428)
@@ -11,9 +11,7 @@
 
 	/*Intermediary*/
-	int i;
-	int count;
+	int        count;
 	IssmDouble yts;
-	int    numberofvertices;
-	bool   ishutter;
+	bool       ishutter;
 
 	/*Output*/
@@ -26,5 +24,4 @@
 	/*Fetch parameters: */
 	iomodel->Constant(&yts,ConstantsYtsEnum);
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 	iomodel->Constant(&ishutter,FlowequationIshutterEnum);
 
@@ -45,5 +42,5 @@
 
 	/*vx and vy are spc'd if we are not on nodeonhutter: */
-	for (i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 		/*keep only this partition's nodes:*/
 		if((iomodel->my_vertices[i])){
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateNodesDiagnosticHutter.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateNodesDiagnosticHutter.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateNodesDiagnosticHutter.cpp	(revision 15428)
@@ -12,11 +12,8 @@
 
 	/*Intermediary*/
-	int i;
-	bool continuous_galerkin=true;
-	int    numberofvertices;
-	bool   ishutter;
+	bool continuous_galerkin = true;
+	bool ishutter;
 
 	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 	iomodel->Constant(&ishutter,FlowequationIshutterEnum);
 
@@ -37,7 +34,7 @@
 
 	/*First fetch data: */
-	iomodel->FetchData(7,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,MeshElementsEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
+	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
 
-	for (i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 		if(iomodel->my_vertices[i]){
 
@@ -49,5 +46,5 @@
 
 	/*Clean fetched data: */
-	iomodel->DeleteData(7,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,MeshElementsEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
+	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
 
 	/*Assign output pointer: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/UpdateElementsDiagnosticHutter.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/UpdateElementsDiagnosticHutter.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/UpdateElementsDiagnosticHutter.cpp	(revision 15428)
@@ -21,5 +21,5 @@
 	if (!ishutter)return;
 
-	iomodel->FetchData(2,MeshElementsEnum,FlowequationElementEquationEnum);
+	iomodel->FetchData(1,FlowequationElementEquationEnum);
 
 	/*Update elements: */
@@ -37,4 +37,4 @@
 
 	/*Free data: */
-	iomodel->DeleteData(2,MeshElementsEnum,FlowequationElementEquationEnum);
+	iomodel->DeleteData(1,FlowequationElementEquationEnum);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/CreateConstraintsDiagnosticVert.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/CreateConstraintsDiagnosticVert.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/CreateConstraintsDiagnosticVert.cpp	(revision 15428)
@@ -11,12 +11,9 @@
 
 	/*Intermediary*/
-	int i;
 	int count;
 	IssmDouble yts;
-	int    numberofvertices;
 
 	/*Fetch parameters: */
 	iomodel->Constant(&yts,ConstantsYtsEnum);
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 
 	/*Recover pointer: */
@@ -39,5 +36,5 @@
 
 	/*Create spcs from x,y,z, as well as the spc values on those spcs: */
-	for (i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 
 		/*keep only this partition's nodes:*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/CreateNodesDiagnosticVert.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/CreateNodesDiagnosticVert.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/CreateNodesDiagnosticVert.cpp	(revision 15428)
@@ -12,10 +12,5 @@
 
 	/*Intermediary*/
-	int i;
 	bool continuous_galerkin=true;
-	int    numberofvertices;
-
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 
 	/*Recover pointer: */
@@ -37,5 +32,5 @@
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
 
-	for (i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 		if(iomodel->my_vertices[i]){
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/UpdateElementsDiagnosticVert.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/UpdateElementsDiagnosticVert.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/UpdateElementsDiagnosticVert.cpp	(revision 15428)
@@ -14,15 +14,7 @@
 	if (iomodel->dim==2)return;
 
-	int    numberofelements;
-
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-
-	/*Fetch data needed: */
-	iomodel->FetchData(1,MeshElementsEnum);
-
 	/*Update elements: */
 	int counter=0;
-	for(int i=0;i<numberofelements;i++){
+	for(int i=0;i<iomodel->numberofelements;i++){
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
@@ -44,7 +36,3 @@
 	iomodel->FetchDataToInput(elements,VxEnum);
 	iomodel->FetchDataToInput(elements,VyEnum);
-
-	/*Free data: */
-	iomodel->DeleteData(1,MeshElementsEnum);
-
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ElementsAndVerticesPartitioning.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ElementsAndVerticesPartitioning.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ElementsAndVerticesPartitioning.cpp	(revision 15428)
@@ -21,6 +21,4 @@
 	int my_rank;
 	int num_procs;
-	int    numberofelements;
-	int    numberofvertices;
 	int    numberofelements2d;
 	int    numberofvertices2d;
@@ -38,16 +36,13 @@
 	int  elements_width; //number of columns in elements (2d->3, 3d->6)
 	int  el1,el2;
-	IssmDouble* elements=NULL;
-	IssmDouble* elements2d=NULL;
+	int* elements2d=NULL;
+	int* vertex_pairing=NULL;
 	IssmDouble* riftinfo=NULL;
-	IssmDouble* vertex_pairing=NULL;
 
 	/*Get my_rank:*/
-	my_rank=IssmComm::GetRank();
-	num_procs=IssmComm::GetSize();
+	my_rank   = IssmComm::GetRank();
+	num_procs = IssmComm::GetSize();
 
 	/*Fetch parameters: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 	iomodel->Constant(&numberofelements2d,MeshNumberofelements2dEnum);
 	iomodel->Constant(&numberofvertices2d,MeshNumberofvertices2dEnum);
@@ -62,5 +57,4 @@
 	if(iomodel->dim==2){
 		elements_width=3; //tria elements
-		iomodel->FetchData(&elements,NULL,NULL,MeshElementsEnum);
 	}
 	else{
@@ -69,9 +63,8 @@
 	}
 
-	MeshPartitionx(&epart, &npart,numberofelements,numberofvertices,elements, numberofelements2d,numberofvertices2d,elements2d,numlayers,elements_width,iomodel->dim,num_procs);
+	MeshPartitionx(&epart,&npart,iomodel->numberofelements,iomodel->numberofvertices,iomodel->elements,numberofelements2d,numberofvertices2d,elements2d,numlayers,elements_width,iomodel->dim,num_procs);
 
-	/*Free elements and elements2d: */
-	iomodel->DeleteData(elements,MeshElementsEnum);
-	iomodel->DeleteData(elements2d,MeshElements2dEnum);
+	/*Free elements2d: */
+	xDelete<int>(elements2d);
 
 	/*Deal with rifts, they have to be included into one partition only, not several: */
@@ -87,10 +80,9 @@
 
 	/*Used later on: */
-	my_vertices=xNewZeroInit<int>(numberofvertices);
-	my_elements=xNewZeroInit<bool>(numberofelements);
+	my_vertices=xNewZeroInit<int>(iomodel->numberofvertices);
+	my_elements=xNewZeroInit<bool>(iomodel->numberofelements);
 
 	/*Start figuring out, out of the partition, which elements belong to this cpu: */
-	iomodel->FetchData(&elements,NULL,NULL,MeshElementsEnum);
-	for (i=0;i<numberofelements;i++){
+	for (i=0;i<iomodel->numberofelements;i++){
 
 		/*!All elements have been partitioned above, only deal with elements for this cpu: */
@@ -103,17 +95,15 @@
 			 into the vertices coordinates. If we start plugging 1 into my_vertices for each index[n][i] (i=0:2), then my_vertices 
 			 will hold which vertices belong to this partition*/
-			my_vertices[reCast<int>(*(elements+elements_width*i+0))-1]=1;
-			my_vertices[reCast<int>(*(elements+elements_width*i+1))-1]=1;
-			my_vertices[reCast<int>(*(elements+elements_width*i+2))-1]=1;
+			my_vertices[iomodel->elements[elements_width*i+0]-1]=1;
+			my_vertices[iomodel->elements[elements_width*i+1]-1]=1;
+			my_vertices[iomodel->elements[elements_width*i+2]-1]=1;
 
 			if(elements_width==6){
-				my_vertices[reCast<int>(*(elements+elements_width*i+3))-1]=1;
-				my_vertices[reCast<int>(*(elements+elements_width*i+4))-1]=1;
-				my_vertices[reCast<int>(*(elements+elements_width*i+5))-1]=1;
+				my_vertices[iomodel->elements[elements_width*i+3]-1]=1;
+				my_vertices[iomodel->elements[elements_width*i+4]-1]=1;
+				my_vertices[iomodel->elements[elements_width*i+5]-1]=1;
 			}
 		}
-	}//for (i=0;i<numberofelements;i++)
-	/*Free data : */
-	iomodel->DeleteData(elements,MeshElementsEnum);
+	}
 
 	/*We might have vertex_pairing in which case, some vertices have to be cloned:
@@ -122,16 +112,16 @@
 	iomodel->FetchData(&vertex_pairing,&numvertex_pairing,NULL,DiagnosticVertexPairingEnum);
 	for(i=0;i<numvertex_pairing;i++){
-		if(my_vertices[reCast<int>(vertex_pairing[2*i+0])-1] && !my_vertices[reCast<int>(vertex_pairing[2*i+1])-1]){
-			my_vertices[reCast<int>(vertex_pairing[2*i+1])-1]=2; //to know that these elements are not on the partition
+		if(my_vertices[vertex_pairing[2*i+0]-1] && !my_vertices[vertex_pairing[2*i+1]-1]){
+			my_vertices[vertex_pairing[2*i+1]-1]=2; //to know that these elements are not on the partition
 		}
 	}
-	iomodel->DeleteData(vertex_pairing,DiagnosticVertexPairingEnum);
+	xDelete<int>(vertex_pairing);
 	iomodel->FetchData(&vertex_pairing,&numvertex_pairing,NULL,PrognosticVertexPairingEnum);
 	for(i=0;i<numvertex_pairing;i++){
-		if(my_vertices[reCast<int>(vertex_pairing[2*i+0])-1] && !my_vertices[reCast<int>(vertex_pairing[2*i+1])-1]){
-			my_vertices[reCast<int>(vertex_pairing[2*i+1])-1]=2; //to know that these elements are not on the partition
+		if(my_vertices[vertex_pairing[2*i+0]-1] && !my_vertices[vertex_pairing[2*i+1]-1]){
+			my_vertices[vertex_pairing[2*i+1]-1]=2; //to know that these elements are not on the partition
 		}
 	}
-	iomodel->DeleteData(vertex_pairing,PrognosticVertexPairingEnum);
+	xDelete<int>(vertex_pairing);
 
 	/*Free ressources:*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/CreateConstraintsEnthalpy.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/CreateConstraintsEnthalpy.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/CreateConstraintsEnthalpy.cpp	(revision 15428)
@@ -11,9 +11,8 @@
 
 	/*Intermediary*/
-	int    i,j;
-	int    count;
-	int    M,N;
-	int    numberofvertices;
-	bool   spcpresent=false;
+	int        i,j;
+	int        count;
+	int        M,N;
+	bool       spcpresent = false;
 	IssmDouble heatcapacity;
 	IssmDouble referencetemperature;
@@ -25,5 +24,4 @@
 
 	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 	iomodel->Constant(&heatcapacity,MaterialsHeatcapacityEnum);
 	iomodel->Constant(&referencetemperature,ConstantsReferencetemperatureEnum);
@@ -36,5 +34,5 @@
 
 	/*return if 2d mesh*/
-	if (iomodel->dim==2){
+	if(iomodel->dim==2){
 		*pconstraints=constraints;
 		return;
@@ -46,9 +44,9 @@
 	//FIX ME: SHOULD USE IOMODELCREATECONSTRAINTS 
 	/*Transient or static?:*/
-	if(M==numberofvertices){
+	if(M==iomodel->numberofvertices){
 		/*static: just create Constraints objects*/
 		count=0;
 
-		for (i=0;i<numberofvertices;i++){
+		for(int i=0;i<iomodel->numberofvertices;i++){
 			/*keep only this partition's nodes:*/
 			if((iomodel->my_vertices[i])){
@@ -63,5 +61,5 @@
 		}
 	}
-	else if (M==(numberofvertices+1)){
+	else if (M==(iomodel->numberofvertices+1)){
 		/*transient: create transient SpcTransient objects. Same logic, except we need to retrieve 
 		 * various times and values to initialize an SpcTransient object: */
@@ -70,10 +68,10 @@
 		/*figure out times: */
 		times=xNew<IssmDouble>(N);
-		for(j=0;j<N;j++){
+		for(int j=0;j<N;j++){
 			times[j]=spcvector[(M-1)*N+j];
 		}
 
 		/*Create constraints from x,y,z: */
-		for (i=0;i<numberofvertices;i++){
+		for(int i=0;i<iomodel->numberofvertices;i++){
 
 			/*keep only this partition's nodes:*/
@@ -83,5 +81,5 @@
 				values=xNew<IssmDouble>(N);
 				spcpresent=false;
-				for(j=0;j<N;j++){
+				for(int j=0;j<N;j++){
 					values[j]=heatcapacity*(spcvector[i*N+j]-referencetemperature);
 					if(!xIsNan<IssmDouble>(values[j]))spcpresent=true; //NaN means no spc by default
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/CreateNodesEnthalpy.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/CreateNodesEnthalpy.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/CreateNodesEnthalpy.cpp	(revision 15428)
@@ -12,10 +12,5 @@
 
 	/*Intermediary*/
-	int i;
 	bool continuous_galerkin=true;
-	int    numberofvertices;
-
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 
 	/*Recover pointer: */
@@ -31,5 +26,5 @@
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
 
-	for (i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 		if(iomodel->my_vertices[i]){
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/UpdateElementsEnthalpy.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/UpdateElementsEnthalpy.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/UpdateElementsEnthalpy.cpp	(revision 15428)
@@ -20,5 +20,5 @@
 
 	/*Fetch data needed: */
-	iomodel->FetchData(4,MeshElementsEnum,TemperatureEnum,WaterfractionEnum,PressureEnum);
+	iomodel->FetchData(3,TemperatureEnum,WaterfractionEnum,PressureEnum);
 
 	/*Update elements: */
@@ -54,4 +54,4 @@
 
 	/*Free data: */
-	iomodel->DeleteData(4,MeshElementsEnum,TemperatureEnum,WaterfractionEnum,PressureEnum);
+	iomodel->DeleteData(3,TemperatureEnum,WaterfractionEnum,PressureEnum);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Gia/CreateNodesGia.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Gia/CreateNodesGia.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Gia/CreateNodesGia.cpp	(revision 15428)
@@ -12,10 +12,5 @@
 
 	/*Intermediary*/
-	int i;
 	bool continuous_galerkin=true;
-
-	/*Fetch parameters: */
-	int    numberofvertices;
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 
 	/*Recover pointer: */
@@ -32,5 +27,5 @@
 
 	/*First fetch data: */
-	for (i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 		if(iomodel->my_vertices[i]){
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Gia/UpdateElementsGia.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Gia/UpdateElementsGia.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Gia/UpdateElementsGia.cpp	(revision 15428)
@@ -11,15 +11,7 @@
 void	UpdateElementsGia(Elements* elements, IoModel* iomodel,int analysis_counter,int analysis_type){
 
-	int    numberofelements;
-
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-
-	/*Fetch data needed: */
-	iomodel->FetchData(1,MeshElementsEnum);
-
 	/*Update elements: */
 	int counter=0;
-	for(int i=0;i<numberofelements;i++){
+	for(int i=0;i<iomodel->numberofelements;i++){
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
@@ -33,6 +25,3 @@
 	iomodel->FetchDataToInput(elements,GiaLithosphereThicknessEnum);
 
-	/*Free data: */
-	iomodel->DeleteData(1,MeshElementsEnum);
-
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/CreateLoadsHydrologyDCEfficient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/CreateLoadsHydrologyDCEfficient.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/CreateLoadsHydrologyDCEfficient.cpp	(revision 15428)
@@ -10,14 +10,9 @@
 
 	/*Intermediary*/
-	bool     isefficientlayer;
-	int      hydrology_model;
-	int      numberofvertices;
-	Pengrid *pengrid = NULL;
+	bool isefficientlayer;
+	int  hydrology_model;
 
 	/*Recover pointer: */
 	Loads* loads=*ploads;
-
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 
 	/*Create loads if they do not exist yet*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/CreateNodesHydrologyDCEfficient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/CreateNodesHydrologyDCEfficient.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/CreateNodesHydrologyDCEfficient.cpp	(revision 15428)
@@ -12,12 +12,7 @@
 
 	/*Intermediary*/
-	int  i;
 	bool isefficientlayer;
 	bool continuous_galerkin=true;
 	int  hydrology_model;
-	int  numberofvertices;
-
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 
 	/*Recover pointer: */
@@ -46,5 +41,5 @@
 	/*Create nodes and vertices: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-	for (i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 
 		if(iomodel->my_vertices[i]){
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/UpdateElementsHydrologyDCEfficient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/UpdateElementsHydrologyDCEfficient.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCEfficient/UpdateElementsHydrologyDCEfficient.cpp	(revision 15428)
@@ -13,8 +13,4 @@
 	bool   isefficientlayer;
 	int    hydrology_model;
-	int    numberofelements;
-
-	/*Fetch data needed: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
 
 	/*Now, do we really want DC?*/
@@ -26,10 +22,7 @@
 	if(!isefficientlayer) return;
 
-	/*Fetch data needed: */
-	iomodel->FetchData(1,MeshElementsEnum);
-
 	/*Update elements: */
 	int counter=0;
-	for(int i=0;i<numberofelements;i++){
+	for(int i=0;i<iomodel->numberofelements;i++){
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
@@ -48,6 +41,3 @@
 	iomodel->FetchDataToInput(elements,BasalforcingsMeltingRateEnum);
 	iomodel->FetchDataToInput(elements,EplHeadEnum);
-
-	/*Free data: */
-	iomodel->DeleteData(1,MeshElementsEnum);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/CreateLoadsHydrologyDCInefficient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/CreateLoadsHydrologyDCInefficient.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/CreateLoadsHydrologyDCInefficient.cpp	(revision 15428)
@@ -11,6 +11,4 @@
 	/*Intermediary*/
 	int      hydrology_model;
-	int      numberofvertices;
-	Pengrid *pengrid = NULL;
 
 	/*Recover pointer: */
@@ -19,5 +17,4 @@
 	/*Fetch parameters: */
 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 
 	/*Create loads if they do not exist yet*/
@@ -30,8 +27,6 @@
 
 	//create penalties for nodes: no node can have a temperature over the melting point
-	iomodel->FetchData(1,MeshElementsEnum);
 	CreateSingleNodeToElementConnectivity(iomodel);
-
-	for(int i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 		/*keep only this partition's nodes:*/
 		if((iomodel->my_vertices[i]==1)){
@@ -39,5 +34,4 @@
 		}
 	}
-	iomodel->DeleteData(1,MeshElementsEnum);
 
 	/*Assign output pointer: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/CreateNodesHydrologyDCInefficient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/CreateNodesHydrologyDCInefficient.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/CreateNodesHydrologyDCInefficient.cpp	(revision 15428)
@@ -12,11 +12,8 @@
 
 	/*Intermediary*/
-	int  i;
 	bool continuous_galerkin=true;
 	int  hydrology_model;
-	int  numberofvertices;
 
 	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
 
@@ -38,5 +35,5 @@
 	/*Create nodes and vertices: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-	for (i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 
 		if(iomodel->my_vertices[i]){
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/UpdateElementsHydrologyDCInefficient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/UpdateElementsHydrologyDCInefficient.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/UpdateElementsHydrologyDCInefficient.cpp	(revision 15428)
@@ -13,9 +13,7 @@
 	bool   isefficientlayer;
 	int    hydrology_model;
-	int    numberofelements;
 
 	/*Fetch data needed: */
 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
 
 	/*Now, do we really want DC?*/
@@ -24,9 +22,8 @@
 	/*Fetch data needed: */
 	iomodel->Constant(&isefficientlayer,HydrologydcIsefficientlayerEnum);
-	iomodel->FetchData(1,MeshElementsEnum);
 
 	/*Update elements: */
 	int counter=0;
-	for(int i=0;i<numberofelements;i++){
+	for(int i=0;i<iomodel->numberofelements;i++){
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
@@ -46,6 +43,3 @@
 	iomodel->FetchDataToInput(elements,SedimentHeadEnum);
 	if(isefficientlayer)iomodel->FetchDataToInput(elements,HydrologydcMaskEplactiveEnum);
-
-	/*Free data: */
-	iomodel->DeleteData(1,MeshElementsEnum);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyShreve/CreateNodesHydrologyShreve.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyShreve/CreateNodesHydrologyShreve.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyShreve/CreateNodesHydrologyShreve.cpp	(revision 15428)
@@ -12,11 +12,8 @@
 
 	/*Intermediary*/
-	int  i;
 	int  hydrology_model;
 	bool continuous_galerkin=true;
-	int  numberofvertices;
 
 	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
 
@@ -38,5 +35,5 @@
 	/*Create nodes and vertices: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-	for (i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 
 		if(iomodel->my_vertices[i]){
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyShreve/UpdateElementsHydrologyShreve.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyShreve/UpdateElementsHydrologyShreve.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyShreve/UpdateElementsHydrologyShreve.cpp	(revision 15428)
@@ -12,19 +12,14 @@
 
 	int    hydrology_model;
-	int    numberofelements;
 
 	/*Fetch data needed: */
 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
 
 	/*Now, do we really want Shreve?*/
 	if(hydrology_model!=HydrologyshreveEnum) return;
 
-	/*Fetch data needed: */
-	iomodel->FetchData(1,MeshElementsEnum);
-
 	/*Update elements: */
 	int counter=0;
-	for(int i=0;i<numberofelements;i++){
+	for(int i=0;i<iomodel->numberofelements;i++){
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
@@ -46,5 +41,3 @@
 	elements->InputDuplicate(WatercolumnEnum,WaterColumnOldEnum);
 
-	/*Free data: */
-	iomodel->DeleteData(1,MeshElementsEnum);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/CreateLoadsMelting.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/CreateLoadsMelting.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/CreateLoadsMelting.cpp	(revision 15428)
@@ -8,8 +8,4 @@
 
 void	CreateLoadsMelting(Loads** ploads, IoModel* iomodel){
-
-	/*Intermediary*/
-	int numberofvertices;
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 
 	/*if 2d: Error*/
@@ -23,8 +19,8 @@
 
 	//create penalties for nodes: no node can have a temperature over the melting point
-	iomodel->FetchData(2,MeshVertexonbedEnum,MeshElementsEnum);
+	iomodel->FetchData(1,MeshVertexonbedEnum);
 	CreateSingleNodeToElementConnectivity(iomodel);
 
-	for(int i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 		if((iomodel->my_vertices[i]==1)){
 			if (reCast<int>(iomodel->Data(MeshVertexonbedEnum)[i])){
@@ -33,5 +29,5 @@
 		}
 	}
-	iomodel->DeleteData(2,MeshVertexonbedEnum,MeshElementsEnum);
+	iomodel->DeleteData(1,MeshVertexonbedEnum);
 
 	/*Assign output pointer: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/CreateNodesMelting.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/CreateNodesMelting.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/CreateNodesMelting.cpp	(revision 15428)
@@ -12,10 +12,5 @@
 
 	/*Intermediary*/
-	int i;
 	bool continuous_galerkin=true;
-	int    numberofvertices;
-
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 
 	/*Recover pointer: */
@@ -30,5 +25,5 @@
 	/*First fetch data: */
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
-	for (i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 
 		if(iomodel->my_vertices[i]){
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/UpdateElementsMelting.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/UpdateElementsMelting.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/UpdateElementsMelting.cpp	(revision 15428)
@@ -11,18 +11,10 @@
 void	UpdateElementsMelting(Elements* elements, IoModel* iomodel,int analysis_counter,int analysis_type){
 
-	int    numberofelements;
-
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-
 	/*Now, is the model 3d? otherwise, do nothing: */
 	if(iomodel->dim==2)return;
 
-	/*Fetch data needed: */
-	iomodel->FetchData(1,MeshElementsEnum);
-
 	/*Update elements: */
 	int counter=0;
-	for(int i=0;i<numberofelements;i++){
+	for(int i=0;i<iomodel->numberofelements;i++){
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
@@ -48,6 +40,3 @@
 	iomodel->FetchDataToInput(elements,BasalforcingsMeltingRateEnum);
 	iomodel->FetchDataToInput(elements,PressureEnum);
-
-	/*Free data: */
-	iomodel->DeleteData(1,MeshElementsEnum);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp	(revision 15428)
@@ -32,15 +32,7 @@
 void  ContinuousGalerkinNodesPartitioning(bool** pmy_nodes,bool* my_elements, int* my_vertices, IoModel* iomodel){
 
-	/*as many nodes as there are vertices */
-	int    numberofvertices;
-
 	/*output: */
-	bool* my_nodes=NULL;
-
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
-
-	my_nodes=xNew<bool>(numberofvertices);
-	for(int i=0;i<numberofvertices;i++) my_nodes[i]=(bool)my_vertices[i];
+	bool* my_nodes=xNew<bool>(iomodel->numberofvertices);
+	for(int i=0;i<iomodel->numberofvertices;i++) my_nodes[i]=(bool)my_vertices[i];
 
 	/*Assign output pointers:*/
@@ -49,9 +41,4 @@
 
 void  DiscontinuousGalerkinNodesPartitioning(bool** pmy_nodes,bool* my_elements, int* my_vertices, IoModel* iomodel){
-
-	int    numberofelements;
-
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
 
 	/*each element has it own nodes (as many as vertices) + additional nodes from neighbouring elements for each edge. This yields to a very different partition for 
@@ -80,9 +67,9 @@
 
 	/*Allocate*/
-	my_nodes=xNewZeroInit<bool>(3*numberofelements);
+	my_nodes=xNewZeroInit<bool>(3*iomodel->numberofelements);
 
 	/*First: add all the nodes of all the elements belonging to this cpu*/
 	if (iomodel->dim==2){
-		for (i=0;i<numberofelements;i++){
+		for (i=0;i<iomodel->numberofelements;i++){
 			if (my_elements[i]){
 				my_nodes[3*i+0]=true;
@@ -100,5 +87,4 @@
 	/*Get edges and elements*/
 	iomodel->FetchData(&edges,&numberofedges,&cols,MeshEdgesEnum);
-	iomodel->FetchData(&elements,NULL,NULL,MeshElementsEnum);
 	if (cols!=4) _error_("field edges should have 4 columns");
 
@@ -124,5 +110,5 @@
 			pos=UNDEF;
 			for(int j=0;j<3;j++){
-				if (elements[3*e2+j]==i1) pos=j;
+				if(iomodel->elements[3*e2+j]==i1) pos=j;
 			}
 
@@ -148,5 +134,4 @@
 
 	/*Free data: */
-	xDelete<int>(elements);
 	xDelete<int>(edges);
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateLoadsPrognostic.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateLoadsPrognostic.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateLoadsPrognostic.cpp	(revision 15428)
@@ -17,9 +17,7 @@
 	int numberofedges;
 	int numvertex_pairing;
-	int numberofelements;
 
 	/*Fetch parameters: */
 	iomodel->Constant(&stabilization,PrognosticStabilizationEnum);
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
 	iomodel->Constant(&numberofedges,MeshNumberofedgesEnum);
 
@@ -34,5 +32,5 @@
 
 		/*Get edges and elements*/
-		iomodel->FetchData(3,MeshEdgesEnum,MeshElementsEnum,ThicknessEnum);
+		iomodel->FetchData(2,MeshEdgesEnum,ThicknessEnum);
 
 		/*First load data:*/
@@ -50,5 +48,5 @@
 
 		/*Free data: */
-		iomodel->DeleteData(3,MeshEdgesEnum,MeshElementsEnum,ThicknessEnum);
+		iomodel->DeleteData(2,MeshEdgesEnum,ThicknessEnum);
 	}
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateNodesPrognostic.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateNodesPrognostic.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateNodesPrognostic.cpp	(revision 15428)
@@ -17,11 +17,7 @@
 	int  io_index;
 	bool continuous_galerkin=true;
-	int    numberofelements;
-	int    numberofvertices;
-	int    stabilization;
+	int  stabilization;
 
 	/*Fetch parameters: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 	iomodel->Constant(&stabilization,PrognosticStabilizationEnum);
 
@@ -40,9 +36,9 @@
 
 	/*First fetch data: */
-	iomodel->FetchData(7,MeshElementsEnum,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
+	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
 	if(continuous_galerkin){
 
 		/*Build Nodes dataset (Continuous Galerkin)*/
-		for (i=0;i<numberofvertices;i++){
+		for (i=0;i<iomodel->numberofvertices;i++){
 
 			if(iomodel->my_vertices[i]){
@@ -57,5 +53,5 @@
 
 		/*Build Nodes dataset -> 3 for each element (Discontinuous Galerkin)*/
-		for (i=0;i<numberofelements;i++){
+		for (i=0;i<iomodel->numberofelements;i++){
 			for (j=0;j<3;j++){
 
@@ -63,7 +59,7 @@
 
 					//Get index of the vertex on which the current node is located
-					vertex_id=reCast<int>(*(iomodel->Data(MeshElementsEnum)+3*i+j)); //(Matlab indexing)
-					io_index=vertex_id-1;                      //(C indexing)
-					_assert_(vertex_id>0 && vertex_id<=numberofvertices);
+					vertex_id=iomodel->elements[+3*i+j]; //(Matlab indexing)
+					io_index=vertex_id-1;                //(C indexing)
+					_assert_(vertex_id>0 && vertex_id<=iomodel->numberofvertices);
 
 					//Compute Node id
@@ -79,5 +75,5 @@
 
 	/*Clean fetched data: */
-	iomodel->DeleteData(7,MeshElementsEnum,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
+	iomodel->DeleteData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
 
 	/*Assign output pointer: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/UpdateElementsPrognostic.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/UpdateElementsPrognostic.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/UpdateElementsPrognostic.cpp	(revision 15428)
@@ -25,5 +25,4 @@
 	iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
 	iomodel->Constant(&issmbgradients,SurfaceforcingsIssmbgradientsEnum);
-	iomodel->FetchData(1,MeshElementsEnum);
 
 	/*Update elements: */
@@ -94,6 +93,3 @@
 		iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum);
 	}
-
-	/*Free data: */
-	iomodel->DeleteData(1,MeshElementsEnum);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/SurfaceSlope/CreateNodesSurfaceSlope.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/SurfaceSlope/CreateNodesSurfaceSlope.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/SurfaceSlope/CreateNodesSurfaceSlope.cpp	(revision 15428)
@@ -13,8 +13,4 @@
 	/*Intermediary*/
 	bool continuous_galerkin=true;
-	int    numberofvertices;
-
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
 
 	/*Recover pointer: */
@@ -30,5 +26,5 @@
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
 
-	for(int i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 		if(iomodel->my_vertices[i]){
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/SurfaceSlope/UpdateElementsSurfaceSlope.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/SurfaceSlope/UpdateElementsSurfaceSlope.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/SurfaceSlope/UpdateElementsSurfaceSlope.cpp	(revision 15428)
@@ -11,13 +11,7 @@
 void	UpdateElementsSurfaceSlope(Elements* elements, IoModel* iomodel,int analysis_counter,int analysis_type){
 
-	int    numberofelements;
-
-	/*Fetch data needed: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-	iomodel->FetchData(1,MeshElementsEnum);
-
 	/*Update elements: */
 	int counter=0;
-	for(int i=0;i<numberofelements;i++){
+	for(int i=0;i<iomodel->numberofelements;i++){
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
@@ -35,6 +29,3 @@
 		iomodel->FetchDataToInput(elements,MeshElementonsurfaceEnum);
 	}
-
-	/*Free data: */
-	iomodel->DeleteData(1,MeshElementsEnum);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/CreateLoadsThermal.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/CreateLoadsThermal.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/CreateLoadsThermal.cpp	(revision 15428)
@@ -9,8 +9,4 @@
 void	CreateLoadsThermal(Loads** ploads, IoModel* iomodel){
 
-	/*Intermediary*/
-	int      numberofvertices;
-	Pengrid *pengrid          = NULL;
-
 	/*Recover pointer: */
 	Loads* loads=*ploads;
@@ -18,15 +14,12 @@
 	if(iomodel->dim==2) _error_("2d meshes not supported yet");
 
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
-
 	/*Create loads if they do not exist yet*/
 	if(!loads) loads = new Loads();
 
 	//create penalties for nodes: no node can have a temperature over the melting point
-	iomodel->FetchData(2,ThermalSpctemperatureEnum,MeshElementsEnum);
+	iomodel->FetchData(1,ThermalSpctemperatureEnum);
 	CreateSingleNodeToElementConnectivity(iomodel);
 
-	for(int i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 
 		/*keep only this partition's nodes:*/
@@ -37,5 +30,5 @@
 		}
 	}
-	iomodel->DeleteData(2,ThermalSpctemperatureEnum,MeshElementsEnum);
+	iomodel->DeleteData(1,ThermalSpctemperatureEnum);
 
 	/*Assign output pointer: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/CreateNodesThermal.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/CreateNodesThermal.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/CreateNodesThermal.cpp	(revision 15428)
@@ -14,8 +14,4 @@
 	bool continuous_galerkin=true;
 
-	/*Fetch parameters: */
-	int    numberofvertices;
-	iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
-
 	/*Recover pointer: */
 	Nodes* nodes=*pnodes;
@@ -30,5 +26,5 @@
 	iomodel->FetchData(6,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,FlowequationVertexEquationEnum,MaskVertexonwaterEnum);
 
-	for(int i=0;i<numberofvertices;i++){
+	for(int i=0;i<iomodel->numberofvertices;i++){
 		if(iomodel->my_vertices[i]){
 			/*Add node to nodes dataset: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/UpdateElementsThermal.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/UpdateElementsThermal.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Thermal/UpdateElementsThermal.cpp	(revision 15428)
@@ -11,20 +11,10 @@
 void	UpdateElementsThermal(Elements* elements, IoModel* iomodel,int analysis_counter,int analysis_type){
 
-	int    numberofelements;
-	bool   dakota_analysis;
-
 	/*Now, is the model 3d? otherwise, do nothing: */
 	if(iomodel->dim==2)return;
 
-	/*Fetch parameters: */
-	iomodel->Constant(&numberofelements,MeshNumberofelementsEnum);
-	iomodel->Constant(&dakota_analysis,QmuIsdakotaEnum);
-
-	/*Fetch data needed: */
-	iomodel->FetchData(1,MeshElementsEnum);
-
 	/*Update elements: */
 	int counter=0;
-	for(int i=0;i<numberofelements;i++){
+	for(int i=0;i<iomodel->numberofelements;i++){
 		if(iomodel->my_elements[i]){
 			Element* element=(Element*)elements->GetObjectByOffset(counter);
@@ -54,4 +44,6 @@
 	iomodel->FetchDataToInput(elements,VzEnum);
 
+	bool dakota_analysis;
+	iomodel->Constant(&dakota_analysis,QmuIsdakotaEnum);
 	if(dakota_analysis){
 		elements->InputDuplicate(TemperatureEnum,QmuTemperatureEnum);
@@ -59,6 +51,3 @@
 		elements->InputDuplicate(BasalforcingsMeltingRateEnum,QmuMeltingEnum);
 	}
-
-	/*Free data: */
-	iomodel->DeleteData(1,MeshElementsEnum);
 }
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Transient/UpdateElementsTransient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Transient/UpdateElementsTransient.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Transient/UpdateElementsTransient.cpp	(revision 15428)
@@ -13,5 +13,4 @@
 	bool        isgl;
 	int         migration_style;
-	int         i,numberofvertices;
 	IssmDouble  rho_ice,rho_water;
 	IssmDouble *phi   = NULL;
@@ -26,10 +25,9 @@
 		iomodel->Constant(&rho_ice,MaterialsRhoIceEnum);
 		iomodel->Constant(&rho_water,MaterialsRhoWaterEnum);
-		iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
-		iomodel->FetchData(3,MeshElementsEnum,ThicknessEnum,BathymetryEnum);
+		iomodel->FetchData(2,ThicknessEnum,BathymetryEnum);
 
 		/*Create phi vector */
-		phi=xNew<IssmDouble>(numberofvertices);
-		for (i=0;i<numberofvertices;i++){
+		phi=xNew<IssmDouble>(iomodel->numberofvertices);
+		for(int i=0;i<iomodel->numberofvertices;i++){
 			if(iomodel->my_vertices[i]){
 				phi[i] = iomodel->Data(ThicknessEnum)[i] + rho_water/rho_ice * iomodel->Data(BathymetryEnum)[i];
@@ -38,11 +36,11 @@
 
 		/*Update elements: */
-		for(i=0;i<elements->Size();i++){
+		for(int i=0;i<elements->Size();i++){
 			Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
-			element->InputCreate(phi,element->Sid(),iomodel,numberofvertices,1,1,GLlevelsetEnum,1);
+			element->InputCreate(phi,element->Sid(),iomodel,iomodel->numberofvertices,1,1,GLlevelsetEnum,1);
 		}
 
 		/*Free ressources:*/
-		iomodel->DeleteData(3,MeshElementsEnum,ThicknessEnum,BathymetryEnum);
+		iomodel->DeleteData(2,ThicknessEnum,BathymetryEnum);
 		xDelete<IssmDouble>(phi);
 	}
Index: /issm/trunk-jpl/src/wrappers/MeshPartition/MeshPartition.cpp
===================================================================
--- /issm/trunk-jpl/src/wrappers/MeshPartition/MeshPartition.cpp	(revision 15427)
+++ /issm/trunk-jpl/src/wrappers/MeshPartition/MeshPartition.cpp	(revision 15428)
@@ -22,10 +22,10 @@
 	int     numberofelements;
 	int     numberofvertices;
-	double *elements         = NULL;
+	int    *elements         = NULL;
 	int     elements_width;
 
 	int numberofelements2d;
 	int numberofvertices2d;
-	double* elements2d=NULL;
+	int* elements2d=NULL;
 
 	int numberoflayers;
