Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 15610)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 15611)
@@ -244,4 +244,5 @@
 					./modules/ModelProcessorx/NodesPartitioning.cpp\
 					./modules/ModelProcessorx/EdgesPartitioning.cpp\
+					./modules/ModelProcessorx/FacesPartitioning.cpp\
 					./modules/ModelProcessorx/SortDataSets.cpp\
 					./modules/ModelProcessorx/UpdateCounters.cpp\
@@ -249,6 +250,6 @@
 					./modules/ModelProcessorx/CreateParameters.cpp\
 					./modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp\
+					./modules/ModelProcessorx/CreateFaces.cpp\
 					./modules/ModelProcessorx/CreateEdges.cpp\
-					./modules/ModelProcessorx/CreateElementToEdgeConnectivity.cpp\
 					./modules/ModelProcessorx/CreateSingleNodeToElementConnectivity.cpp\
 					./modules/ModelProcessorx/CreateNumberNodeToElementConnectivity.cpp\
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 15610)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 15611)
@@ -50,6 +50,6 @@
 
 		/*intialize inputs and results: */
-		this->inputs=new Inputs();
-		this->results=new Results();
+		this->inputs  = new Inputs();
+		this->results = new Results();
 
 		/*initialize pointers:*/
Index: /issm/trunk-jpl/src/c/classes/IoModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 15610)
+++ /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 15611)
@@ -33,6 +33,8 @@
 	this->numberofvertices=-1;
 	this->numberofelements=-1;
+	this->numberoffaces=-1;
 	this->numberofedges=-1;
 	this->elements=NULL;
+	this->faces=NULL;
 	this->edges=NULL;
 	this->elementtoedgeconnectivity      =NULL;
@@ -75,4 +77,5 @@
 	FetchData(&this->numberofelements,MeshNumberofelementsEnum);
 	FetchData(&this->elements,NULL,NULL,MeshElementsEnum);
+	this->faces                           = NULL;
 	this->edges                           = NULL;
 	this->elementtoedgeconnectivity       = NULL;
@@ -109,4 +112,5 @@
 
 	xDelete<int>(this->elements);
+	xDelete<int>(this->faces);
 	xDelete<int>(this->edges);
 	xDelete<int>(this->elementtoedgeconnectivity);
Index: /issm/trunk-jpl/src/c/classes/IoModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.h	(revision 15610)
+++ /issm/trunk-jpl/src/c/classes/IoModel.h	(revision 15611)
@@ -34,6 +34,8 @@
 		int   numberofvertices;
 		int   numberofelements;
+		int   numberoffaces;
 		int   numberofedges;
 		int  *elements;
+		int  *faces;
 		int  *edges;
 		int  *elementtoedgeconnectivity;
Index: /issm/trunk-jpl/src/c/classes/Loads/Numericalflux.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Numericalflux.cpp	(revision 15610)
+++ /issm/trunk-jpl/src/c/classes/Loads/Numericalflux.cpp	(revision 15611)
@@ -52,8 +52,8 @@
 
 	/*Get edge*/
-	int i1 = iomodel->edges[4*index+0];
-	int i2 = iomodel->edges[4*index+1];
-	int e1 = iomodel->edges[4*index+2];
-	int e2 = iomodel->edges[4*index+3];
+	int i1 = iomodel->faces[4*index+0];
+	int i2 = iomodel->faces[4*index+1];
+	int e1 = iomodel->faces[4*index+2];
+	int e2 = iomodel->faces[4*index+3];
 
 	/*First, see wether this is an internal or boundary edge (if e2=-1)*/
Index: /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp	(revision 15610)
+++ /issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp	(revision 15611)
@@ -57,6 +57,6 @@
 			for(i=0;i<iomodel->numberofedges;i++){
 				if(my_edges[i]){
-					v1 = iomodel->edges[4*i+0]-1;
-					v2 = iomodel->edges[4*i+1]-1;
+					v1 = iomodel->edges[2*i+0]-1;
+					v2 = iomodel->edges[2*i+1]-1;
 					if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){
 						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+iomodel->numberofvertices+i+1,
@@ -99,6 +99,6 @@
 			for(i=0;i<iomodel->numberofedges;i++){
 				if(my_edges[i]){
-					v1 = iomodel->edges[4*i+0]-1;
-					v2 = iomodel->edges[4*i+1]-1;
+					v1 = iomodel->edges[2*i+0]-1;
+					v2 = iomodel->edges[2*i+1]-1;
 					values=xNew<IssmDouble>(N);
 					spcpresent=false;
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateLoadsBalancethickness.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateLoadsBalancethickness.cpp	(revision 15610)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateLoadsBalancethickness.cpp	(revision 15611)
@@ -22,13 +22,13 @@
 	if (stabilization==3){
 
-		/*Get edges and elements*/
-		CreateEdges(iomodel);
+		/*Get faces and elements*/
+		CreateFaces(iomodel);
 		iomodel->FetchData(1,ThicknessEnum);
 
 		/*First load data:*/
-		for(int i=0;i<iomodel->numberofedges;i++){
+		for(int i=0;i<iomodel->numberoffaces;i++){
 
 			/*Get left and right elements*/
-			element=iomodel->edges[4*i+2]-1; //edges are [node1 node2 elem1 elem2]
+			element=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2]
 
 			/*Now, if this element is not in the partition, pass: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateEdges.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateEdges.cpp	(revision 15610)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateEdges.cpp	(revision 15611)
@@ -12,5 +12,4 @@
 
 	/*Check Iomodel properties*/
-	if(iomodel->dim!=2)             _error_("only 2d model are supported");
 	if(iomodel->numberofvertices<3) _error_("not enough elements in mesh");
 	_assert_(iomodel->elements);
@@ -19,13 +18,40 @@
 	bool exist;
 	int  i,j,v1,v2,v3;
-	int  maxnbe,nbe;
+	int  maxnbe,nbe,elementnbe,elementnbv;
+	int *elementedges = NULL;
+
+	/*Mesh dependent variables*/
+	if(iomodel->dim==2){
+		elementnbv = 3;
+		elementnbe = 3;
+		elementedges=xNew<int>(elementnbe*2);
+		elementedges[2*0+0] = 1; elementedges[2*0+1] = 2;
+		elementedges[2*1+0] = 2; elementedges[2*1+1] = 0;
+		elementedges[2*2+0] = 0; elementedges[2*2+1] = 1;
+	}
+	else if(iomodel->dim==3){
+		elementnbv = 6;
+		elementnbe = 9;
+		elementedges=xNew<int>(elementnbe*2);
+		elementedges[2*0+0] = 0; elementedges[2*0+1] = 3;
+		elementedges[2*1+0] = 1; elementedges[2*1+1] = 4;
+		elementedges[2*2+0] = 2; elementedges[2*2+1] = 5;
+		elementedges[2*3+0] = 1; elementedges[2*3+1] = 2;
+		elementedges[2*4+0] = 2; elementedges[2*4+1] = 0;
+		elementedges[2*5+0] = 0; elementedges[2*5+1] = 1;
+		elementedges[2*6+0] = 4; elementedges[2*6+1] = 5;
+		elementedges[2*7+0] = 5; elementedges[2*7+1] = 3;
+		elementedges[2*8+0] = 3; elementedges[2*8+1] = 4;
+	}
+	else{
+		_error_("mesh dimension not supported yet");
+	}
 
 	/*Maximum number of edges*/
-	maxnbe = 3*iomodel->numberofelements;
+	maxnbe = elementnbe*iomodel->numberofelements;
 
 	/*Initialize intermediaries*/
-	int*  edgestemp = xNew<int>(maxnbe*4);         /*format: [vertex1 vertex2 element1 element2]                */
-	bool* exchange  = xNewZeroInit<bool>(maxnbe);  /*Edges are ordered, we need to keep track of vertex swapping*/
-	for(i=0;i<maxnbe;i++) edgestemp[i*4+3]=-1;     /*Initialize last column of edges as -1 (boundary edge)      */
+	int *edgestemp                 = xNew<int>(maxnbe*2);                             /*format: [vertex1 vertex2]       */
+	int *element_edge_connectivity = xNew<int>(iomodel->numberofelements*elementnbe); /*format: [edge1 edge2 ... edgen] */
 
 	/*Initialize chain*/
@@ -38,12 +64,9 @@
 
 	for(i=0;i<iomodel->numberofelements;i++){
-		for(j=0;j<3;j++){
+		for(j=0;j<elementnbe;j++){
 
-			/*Get the two indices of the edge number j of the ith triangle*/
-			v1 = iomodel->elements[i*3+j];
-			if(j==2)
-			 v2 = iomodel->elements[i*3+0];
-			else
-			 v2 = iomodel->elements[i*3+j+1];
+			/*Get the two indices of the edge number j of the ith element*/
+			v1 = iomodel->elements[i*elementnbv+elementedges[2*j+0]]-1; _assert_(v1>=0 & v1<iomodel->numberofvertices);
+			v2 = iomodel->elements[i*elementnbv+elementedges[2*j+1]]-1; _assert_(v2>=0 & v2<iomodel->numberofvertices);
 
 			/*v1 and v2 must be sorted*/
@@ -56,9 +79,8 @@
 
 			/*Go through all processed edges connected to v1 and check whether we have seen this edge yet*/
-			_assert_(v1>=0 & v1<iomodel->numberofvertices);
 			for(int e=head_minv[v1]; e!=-1; e=next_edge[e]){
-				if(edgestemp[e*4+1]==v2){
+				if(edgestemp[e*2+1]==v2+1){
 					exist = true;
-					edgestemp[e*4+3]=i+1;
+					element_edge_connectivity[i*elementnbv+j]=e;
 					break;
 				}
@@ -70,8 +92,9 @@
 
 				/*Update edges*/
-				edgestemp[nbe*4+0] = v1;
-				edgestemp[nbe*4+1] = v2;
-				edgestemp[nbe*4+2] = i+1;
-				if(v1!=iomodel->elements[i*3+j]) exchange[nbe]=true;
+				edgestemp[nbe*2+0] = v1+1;
+				edgestemp[nbe*2+1] = v2+1;
+
+				/*Update Connectivity*/
+				element_edge_connectivity[i*elementnbv+j]=nbe;
 
 				/*Update chain*/
@@ -90,22 +113,14 @@
 
 	/*Create final edges*/
-	int* edges = xNew<int>(nbe*4); /*vertex1 vertex2 element1 element2*/
-	for(int i=0;i<nbe;i++){
-		if(exchange[i]){
-			edges[i*4+0]=edgestemp[i*4+1];
-			edges[i*4+1]=edgestemp[i*4+0];
-		}
-		else{
-			edges[i*4+0]=edgestemp[i*4+0];
-			edges[i*4+1]=edgestemp[i*4+1];
-		}
-		edges[i*4+2]=edgestemp[i*4+2];
-		edges[i*4+3]=edgestemp[i*4+3];
-	}
+	int* edges = xNew<int>(nbe*2); /*vertex1 vertex2*/
+	for(int i=0;i<2*nbe;i++) edges[i] = edgestemp[i];
+
+	/*Clean up*/
 	xDelete<int>(edgestemp);
-	xDelete<bool>(exchange);
+	xDelete<int>(elementedges);
 
 	/*Assign output pointers*/
-	iomodel->edges         = edges;
-	iomodel->numberofedges = nbe;
+	iomodel->edges                     = edges;
+	iomodel->elementtoedgeconnectivity = element_edge_connectivity;
+	iomodel->numberofedges             = nbe;
 }
Index: sm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementToEdgeConnectivity.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementToEdgeConnectivity.cpp	(revision 15610)
+++ 	(revision )
@@ -1,59 +1,0 @@
-/*!\file:  CreateElementToEdgeConnectivity.cpp
- * \brief: create connectivity tables from index
- */ 
-
-#include "../../classes/classes.h"
-#include "../../shared/shared.h"
-#include "./ModelProcessorx.h"
-
-void CreateElementToEdgeConnectivity(IoModel* iomodel){
-
-	/*Intermediaries*/
-	int v1,v2,v3,e1,e2;
-
-	/*If connectivity is already present, exit*/
-	if(iomodel->elementtoedgeconnectivity) return;
-
-	/*Check Iomodel properties*/
-	if(iomodel->dim!=2)             _error_("only 2d model are supported");
-	if(iomodel->numberofvertices<3) _error_("not enough elements in mesh");
-	_assert_(iomodel->elements);
-
-	/*First, we need to have edges*/
-	CreateEdges(iomodel);
-	_assert_(iomodel->numberofedges>2);
-
-	/*Initialize intermediaries*/
-	int*  element_edge_connectivity = xNew<int>(iomodel->numberofelements*3);   /*edge1   edge2   edge3*/
-
-	/*Go through all edges and create connectivity table*/
-	for(int i=0;i<iomodel->numberofedges;i++){
-
-		/*Get the two vertices of current edge*/
-		v1 = iomodel->edges[i*4+0]-1; _assert_(v1>=0 && v1<iomodel->numberofvertices);
-		v2 = iomodel->edges[i*4+1]-1; _assert_(v2>=0 && v2<iomodel->numberofvertices);
-		e1 = iomodel->edges[i*4+2]-1; _assert_(e1>=0 && e1<iomodel->numberofelements);
-		e2 = iomodel->edges[i*4+3]-1; _assert_(e2>=-2 && e2<iomodel->numberofelements);
-
-		/*Process element by element*/
-		for(int j=0;j<3;j++){
-			v3 = iomodel->elements[e1*3+j]-1;
-			if(v1!=v3 && v2!=v3){
-				element_edge_connectivity[e1*3+j]=i;
-				break;
-			}
-		}
-		if(e2>-1){
-			for(int j=0;j<3;j++){
-				v3 = iomodel->elements[e2*3+j]-1;
-				if(v1!=v3 && v2!=v3){
-					element_edge_connectivity[e2*3+j]=i;
-					break;
-				}
-			}
-		}
-	}
-
-	/*Assign output pointers*/
-	iomodel->elementtoedgeconnectivity = element_edge_connectivity;
-}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateFaces.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateFaces.cpp	(revision 15611)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateFaces.cpp	(revision 15611)
@@ -0,0 +1,111 @@
+/*!\file:  CreateFaces.cpp
+ * \brief: create faces from 2d mesh
+ */ 
+
+#include "../../classes/classes.h"
+#include "../../shared/shared.h"
+
+void CreateFaces(IoModel* iomodel){
+
+	/*If faces are already present, exit*/
+	if(iomodel->faces) return;
+
+	/*Check Iomodel properties*/
+	if(iomodel->dim!=2)             _error_("only 2d model are supported");
+	if(iomodel->numberofvertices<3) _error_("not enough elements in mesh");
+	_assert_(iomodel->elements);
+
+	/*Intermediaries*/
+	bool exist;
+	int  i,j,v1,v2,v3;
+	int  maxnbf,nbf;
+
+	/*Maximum number of faces*/
+	maxnbf = 3*iomodel->numberofelements;
+
+	/*Initialize intermediaries*/
+	int*  facestemp = xNew<int>(maxnbf*4);         /*format: [vertex1 vertex2 element1 element2]                */
+	bool* exchange  = xNewZeroInit<bool>(maxnbf);  /*Faces are ordered, we need to keep track of vertex swapping*/
+	for(i=0;i<maxnbf;i++) facestemp[i*4+3]=-1;     /*Initialize last column of faces as -1 (boundary edge)      */
+
+	/*Initialize chain*/
+	int* head_minv = xNew<int>(iomodel->numberofvertices);
+	int* next_edge = xNew<int>(maxnbf);
+	for(i=0;i<iomodel->numberofvertices;i++) head_minv[i]=-1;
+
+	/*Initialize number of faces*/
+	nbf = 0;
+
+	for(i=0;i<iomodel->numberofelements;i++){
+		for(j=0;j<3;j++){
+
+			/*Get the two indices of the edge number j of the ith triangle*/
+			v1 = iomodel->elements[i*3+j];
+			if(j==2)
+			 v2 = iomodel->elements[i*3+0];
+			else
+			 v2 = iomodel->elements[i*3+j+1];
+
+			/*v1 and v2 must be sorted*/
+			if(v2<v1){
+				v3=v2; v2=v1; v1=v3;
+			}
+
+			/*This edge a priori has not been processed yet*/
+			exist = false;
+
+			/*Go through all processed faces connected to v1 and check whether we have seen this edge yet*/
+			_assert_(v1>=0 & v1<iomodel->numberofvertices);
+			for(int e=head_minv[v1]; e!=-1; e=next_edge[e]){
+				if(facestemp[e*4+1]==v2){
+					exist = true;
+					facestemp[e*4+3]=i+1;
+					break;
+				}
+			}
+
+			/*If this edge is new, add it to the lists*/
+			if(!exist){
+				_assert_(nbf<maxnbf);
+
+				/*Update faces*/
+				facestemp[nbf*4+0] = v1;
+				facestemp[nbf*4+1] = v2;
+				facestemp[nbf*4+2] = i+1;
+				if(v1!=iomodel->elements[i*3+j]) exchange[nbf]=true;
+
+				/*Update chain*/
+				next_edge[nbf] = head_minv[v1];
+				head_minv[v1]  = nbf;
+
+				/*Increase number of faces*/
+				nbf++;
+			}
+		}
+	}
+
+	/*Clean up*/
+	xDelete<int>(head_minv);
+	xDelete<int>(next_edge);
+
+	/*Create final faces*/
+	int* faces = xNew<int>(nbf*4); /*vertex1 vertex2 element1 element2*/
+	for(int i=0;i<nbf;i++){
+		if(exchange[i]){
+			faces[i*4+0]=facestemp[i*4+1];
+			faces[i*4+1]=facestemp[i*4+0];
+		}
+		else{
+			faces[i*4+0]=facestemp[i*4+0];
+			faces[i*4+1]=facestemp[i*4+1];
+		}
+		faces[i*4+2]=facestemp[i*4+2];
+		faces[i*4+3]=facestemp[i*4+3];
+	}
+	xDelete<int>(facestemp);
+	xDelete<bool>(exchange);
+
+	/*Assign output pointers*/
+	iomodel->faces         = faces;
+	iomodel->numberoffaces = nbf;
+}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp	(revision 15610)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp	(revision 15611)
@@ -45,5 +45,4 @@
 		case P2Enum:
 			EdgesPartitioning(&my_edges,iomodel);
-			CreateElementToEdgeConnectivity(iomodel);
 			for(i=0;i<iomodel->numberofvertices;i++){
 				if(iomodel->my_vertices[i]){
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 15610)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 15611)
@@ -325,6 +325,6 @@
 			if(my_edges[i]){
 
-				v1 = iomodel->edges[4*i+0]-1;
-				v2 = iomodel->edges[4*i+1]-1;
+				v1 = iomodel->edges[2*i+0]-1;
+				v2 = iomodel->edges[2*i+1]-1;
 
 				if(!xIsNan<IssmDouble>(spcvx[v1]) && !xIsNan<IssmDouble>(spcvx[v2])){
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/EdgesPartitioning.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/EdgesPartitioning.cpp	(revision 15610)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/EdgesPartitioning.cpp	(revision 15611)
@@ -11,26 +11,29 @@
 
 	/*Intermediaries*/
-	int  el1,el2;
-	bool my_edge;
+	int elementnbe;
 
 	/*Get edges and elements*/
 	CreateEdges(iomodel);
+	_assert_(iomodel->elementtoedgeconnectivity);
 
+	/*Mesh dependent variables*/
+	if(iomodel->dim==2){
+		elementnbe = 3;
+	}
+	else if(iomodel->dim==3){
+		elementnbe = 9;
+	}
+	else{
+		_error_("mesh dimension not supported yet");
+	}
 	/*output: */
-	bool* my_edges=xNew<bool>(iomodel->numberofedges);
+	bool* my_edges=xNewZeroInit<bool>(iomodel->numberofedges);
 
-	for(int i=0;i<iomodel->numberofedges;i++){
-
-		/*Get left and right elements*/
-		el1=iomodel->edges[4*i+2]-1; //edges are [node1 node2 elem1 elem2]
-		el2=iomodel->edges[4*i+3]-1; //edges are [node1 node2 elem1 elem2]
-
-		/*Check whether we should include this edge (el2 is -2 for boundary edges)*/
-		my_edge = iomodel->my_elements[el1];
-		if(!my_edge && el2>=0){
-			my_edge = iomodel->my_elements[el2];
+	for(int i=0;i<iomodel->numberofelements;i++){
+		if(iomodel->my_elements[i]){
+			for(int j=0;j<elementnbe;j++){
+				my_edges[iomodel->elementtoedgeconnectivity[i*elementnbe+j]] = true;
+			}
 		}
-
-		my_edges[i] = my_edge;
 	}
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/FacesPartitioning.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/FacesPartitioning.cpp	(revision 15611)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/FacesPartitioning.cpp	(revision 15611)
@@ -0,0 +1,42 @@
+/*!\file:  FacesPartitioning.cpp
+ * \brief: partition elements and nodes and vertices
+ */ 
+
+#include <string.h>
+#include "../../classes/classes.h"
+#include "../../shared/shared.h"
+#include "./ModelProcessorx.h"
+
+void FacesPartitioning(bool** pmy_faces,IoModel* iomodel){
+
+	/*Intermediaries*/
+	int  el1,el2;
+	bool my_face;
+
+	/*Check Iomodel properties*/
+	if(iomodel->dim!=2) _error_("only 2d model are supported");
+
+	/*Get faces and elements*/
+	CreateFaces(iomodel);
+
+	/*output: */
+	bool* my_faces=xNew<bool>(iomodel->numberoffaces);
+
+	for(int i=0;i<iomodel->numberoffaces;i++){
+
+		/*Get left and right elements*/
+		el1=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2]
+		el2=iomodel->faces[4*i+3]-1; //faces are [node1 node2 elem1 elem2]
+
+		/*Check whether we should include this face (el2 is -2 for boundary faces)*/
+		my_face = iomodel->my_elements[el1];
+		if(!my_face && el2>=0){
+			my_face = iomodel->my_elements[el2];
+		}
+
+		my_faces[i] = my_face;
+	}
+
+	/*Free data and assign output pointers */
+	*pmy_faces=my_faces;
+}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 15610)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 15611)
@@ -117,9 +117,12 @@
 void ElementsAndVerticesPartitioning(bool** pmy_elements, int** pmy_vertices, IoModel* iomodel);
 void NodesPartitioning(bool** pmy_nodes,bool* my_elements, int* my_vertices,  IoModel* iomodel, bool continuous);
-void EdgesPartitioning(bool** pmy_nodes,IoModel* iomodel);
+void FacesPartitioning(bool** pmy_faces,IoModel* iomodel);
+void EdgesPartitioning(bool** pmy_edges,IoModel* iomodel);
+
+/*Mesh properties*/
+void CreateFaces(IoModel* iomodel);
+void CreateEdges(IoModel* iomodel);
 
 /*Connectivity*/
-void CreateEdges(IoModel* iomodel);
-void CreateElementToEdgeConnectivity(IoModel* iomodel);
 void CreateSingleNodeToElementConnectivity(IoModel* iomodel);
 void CreateNumberNodeToElementConnectivity(IoModel* iomodel);
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp	(revision 15610)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp	(revision 15611)
@@ -39,8 +39,8 @@
 
 	/* Each element has it own nodes (as many as vertices) + additional nodes
-	 * from neighboring elements for each edge. This yields to a very different
+	 * from neighboring elements for each face. This yields to a very different
 	 * partition for the nodes and the vertices. The vertices are similar to
-	 * continuous galerkin, but the nodes partitioning involves edges, which
-	 * mess up sorting of ids. */
+	 * continuous galerkin, but the nodes partitioning involves faces, which
+	 * messes up sorting of ids. */
 
 
@@ -51,5 +51,5 @@
 	int  pos;
 
-	/*Get edges and elements*/
+	/*Get faces and elements*/
 	CreateEdges(iomodel);
 
@@ -57,7 +57,7 @@
 	 *  - there are three nodes per element (discontinous)
 	 *  - for each element present of each partition, its three nodes will be in this partition
-	 *  - the edges require the dofs of the 2 nodes of each elements sharing the edge.
-	 *    if the 2 elements sharing the edge are on 2 different cpus, we must duplicate
-	 *    the two nodes that are not on the cpus so that the edge can access the dofs of
+	 *  - the faces require the dofs of the 2 nodes of each elements sharing the face.
+	 *    if the 2 elements sharing the face are on 2 different cpus, we must duplicate
+	 *    the two nodes that are not on the cpus so that the face can access the dofs of
 	 *    all its 4 nodes
 	 */
@@ -67,5 +67,5 @@
 
 	/*First: add all the nodes of all the elements belonging to this cpu*/
-	if (iomodel->dim==2){
+	if(iomodel->dim==2){
 		for (i=0;i<iomodel->numberofelements;i++){
 			if (my_elements[i]){
@@ -82,16 +82,16 @@
 	/*Second: add all missing nodes*/
 
-	/*Get edges and elements*/
-	CreateEdges(iomodel);
+	/*Get faces and elements*/
+	CreateFaces(iomodel);
 
 	/*!All elements have been partitioned above, only create elements for this CPU: */
-	for(int i=0;i<iomodel->numberofedges;i++){
+	for(int i=0;i<iomodel->numberoffaces;i++){
 
 		/*Get left and right elements*/
-		e1=iomodel->edges[4*i+2]-1; //edges are [node1 node2 elem1 elem2]
-		e2=iomodel->edges[4*i+3]-1; //edges are [node1 node2 elem1 elem2]
+		e1=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2]
+		e2=iomodel->faces[4*i+3]-1; //faces are [node1 node2 elem1 elem2]
 
 		/* 1) If the element e1 is in the current partition
-		 * 2) and if the edge of the element is shared by another element (internal edge)
+		 * 2) and if the face of the element is shared by another element (internal face)
 		 * 3) and if this element is not in the same partition:
 		 * we must clone the nodes on this partition so that the loads (Numericalflux)
@@ -100,6 +100,6 @@
 
 			/*1: Get vertices ids*/
-			i1=iomodel->edges[4*i+0];
-			i2=iomodel->edges[4*i+1];
+			i1=iomodel->faces[4*i+0];
+			i2=iomodel->faces[4*i+1];
 
 			/*2: Get the column where these ids are located in the index*/
@@ -124,5 +124,5 @@
 			}
 			else{
-				_error_("Problem in edges creation");
+				_error_("Problem in faces creation");
 			}
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateLoadsPrognostic.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateLoadsPrognostic.cpp	(revision 15610)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateLoadsPrognostic.cpp	(revision 15611)
@@ -25,13 +25,13 @@
 	if (stabilization==3){
 
-		/*Get edges and elements*/
-		CreateEdges(iomodel);
+		/*Get faces and elements*/
+		CreateFaces(iomodel);
 		iomodel->FetchData(1,ThicknessEnum);
 
 		/*First load data:*/
-		for(int i=0;i<iomodel->numberofedges;i++){
+		for(int i=0;i<iomodel->numberoffaces;i++){
 
 			/*Get left and right elements*/
-			element=iomodel->edges[4*i+2]-1; //edges are [node1 node2 elem1 elem2]
+			element=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2]
 
 			/*Now, if this element is not in the partition, pass: */
