Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 15434)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 15435)
@@ -243,5 +243,4 @@
 					./modules/ModelProcessorx/ElementsAndVerticesPartitioning.cpp\
 					./modules/ModelProcessorx/NodesPartitioning.cpp\
-					./modules/ModelProcessorx/ProcessMesh2d.cpp\
 					./modules/ModelProcessorx/SortDataSets.cpp\
 					./modules/ModelProcessorx/UpdateCounters.cpp\
@@ -249,4 +248,6 @@
 					./modules/ModelProcessorx/CreateParameters.cpp\
 					./modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp\
+					./modules/ModelProcessorx/CreateEdges.cpp\
+					./modules/ModelProcessorx/CreateElementToEdgeConnectivity.cpp\
 					./modules/ModelProcessorx/CreateSingleNodeToElementConnectivity.cpp\
 					./modules/ModelProcessorx/CreateNumberNodeToElementConnectivity.cpp\
Index: /issm/trunk-jpl/src/c/classes/IoModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 15434)
+++ /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 15435)
@@ -31,6 +31,11 @@
 	this->my_vertices=NULL;
 
+	this->dim=-1;
+	this->numberofvertices=-1;
+	this->numberofelements=-1;
+	this->numberofedges=-1;
 	this->elements=NULL;
 	this->edges=NULL;
+	this->elementtoedgeconnectivity      =NULL;
 	this->singlenodetoelementconnectivity=NULL;
 	this->numbernodetoelementconnectivity=NULL;
@@ -67,4 +72,5 @@
 	this->my_nodes    = NULL;
 	this->my_vertices = NULL;
+
 	FetchData(&this->dim,MeshDimensionEnum);
 	FetchData(&this->numberofvertices,MeshNumberofverticesEnum);
@@ -72,5 +78,5 @@
 	FetchData(&this->elements,NULL,NULL,MeshElementsEnum);
 	this->edges                           = NULL;
-	this->elementedgeconnectivity         = NULL;
+	this->elementtoedgeconnectivity       = NULL;
 	this->singlenodetoelementconnectivity = NULL;
 	this->numbernodetoelementconnectivity = NULL;
@@ -107,5 +113,5 @@
 	xDelete<int>(this->elements);
 	xDelete<int>(this->edges);
-	xDelete<int>(this->elementedgeconnectivity);
+	xDelete<int>(this->elementtoedgeconnectivity);
 	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 15434)
+++ /issm/trunk-jpl/src/c/classes/IoModel.h	(revision 15435)
@@ -38,5 +38,5 @@
 		int  *elements;
 		int  *edges;
-		int  *elementedgeconnectivity;
+		int  *elementtoedgeconnectivity;
 		int  *singlenodetoelementconnectivity;
 		int  *numbernodetoelementconnectivity;
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateLoadsBalancethickness.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateLoadsBalancethickness.cpp	(revision 15434)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateLoadsBalancethickness.cpp	(revision 15435)
@@ -26,5 +26,5 @@
 
 		/*Get edges and elements*/
-		ProcessMesh2d(&iomodel->edges,&iomodel->numberofedges,NULL,iomodel->elements,iomodel->numberofelements,iomodel->numberofvertices);
+		CreateEdges(iomodel);
 		iomodel->FetchData(1,ThicknessEnum);
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateEdges.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateEdges.cpp	(revision 15435)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateEdges.cpp	(revision 15435)
@@ -0,0 +1,111 @@
+/*!\file:  CreateEdges.cpp
+ * \brief: create edges from 2d mesh
+ */ 
+
+#include "../../classes/classes.h"
+#include "../../shared/shared.h"
+
+void CreateEdges(IoModel* iomodel){
+
+	/*If edges are already present, exit*/
+	if(iomodel->edges) 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  maxnbe,nbe;
+
+	/*Maximum number of edges*/
+	maxnbe = 3*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)      */
+
+	/*Initialize chain*/
+	int* head_minv = xNew<int>(iomodel->numberofvertices);
+	int* next_edge = xNew<int>(maxnbe);
+	for(i=0;i<iomodel->numberofvertices;i++) head_minv[i]=-1;
+
+	/*Initialize number of edges*/
+	nbe = 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 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){
+					exist = true;
+					edgestemp[e*4+3]=i+1;
+					break;
+				}
+			}
+
+			/*If this edge is new, add it to the lists*/
+			if(!exist){
+				_assert_(nbe<maxnbe);
+
+				/*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;
+
+				/*Update chain*/
+				next_edge[nbe] = head_minv[v1];
+				head_minv[v1]  = nbe;
+
+				/*Increase number of edges*/
+				nbe++;
+			}
+		}
+	}
+
+	/*Clean up*/
+	xDelete<int>(head_minv);
+	xDelete<int>(next_edge);
+
+	/*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];
+	}
+	xDelete<int>(edgestemp);
+	xDelete<bool>(exchange);
+
+	/*Assign output pointers*/
+	iomodel->edges         = edges;
+	iomodel->numberofedges = nbe;
+}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementToEdgeConnectivity.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementToEdgeConnectivity.cpp	(revision 15435)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementToEdgeConnectivity.cpp	(revision 15435)
@@ -0,0 +1,58 @@
+/*!\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]; _assert_(v1>=0 && v1<iomodel->numberofvertices);
+		v2 = iomodel->edges[i*4+1]; _assert_(v2>=0 && v2<iomodel->numberofvertices);
+		e1 = iomodel->edges[i*4+2]; _assert_(e1>=0 && e1<iomodel->numberofelements);
+		e2 = iomodel->edges[i*4+3]; _assert_(e2>=0 && e2<iomodel->numberofelements);
+
+		/*Process element by element*/
+		for(int j=0;j<3;j++){
+			v3 = iomodel->elements[e1*3+j];
+			if(v1!=v3 && v2!=v3){
+				element_edge_connectivity[e1*3+j]=i;
+				break;
+			}
+		}
+		for(int j=0;j<3;j++){
+			v3 = iomodel->elements[e2*3+j];
+			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/CreateSingleNodeToElementConnectivity.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateSingleNodeToElementConnectivity.cpp	(revision 15434)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateSingleNodeToElementConnectivity.cpp	(revision 15435)
@@ -2,10 +2,4 @@
  * \brief: create connectivity table
  */ 
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
 
 #include "../../shared/shared.h"
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp	(revision 15434)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp	(revision 15435)
@@ -51,5 +51,5 @@
 
 		/*Quadratic element*/
-		ProcessMesh2d(&iomodel->edges,&iomodel->numberofedges,NULL,iomodel->elements,iomodel->numberofelements,iomodel->numberofvertices);
+		CreateEdges(iomodel);
 		int  element1,element2;
 		bool my_edge;
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 15434)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 15435)
@@ -118,5 +118,6 @@
 
 /*Connectivity*/
-void ProcessMesh2d(int**,int*,int**,int* index,int numberofelements,int numberofvertices);
+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 15434)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp	(revision 15435)
@@ -58,5 +58,5 @@
 
 	/*Get edges and elements*/
-	ProcessMesh2d(&iomodel->edges,&iomodel->numberofedges,NULL,iomodel->elements,iomodel->numberofelements,iomodel->numberofvertices);
+	CreateEdges(iomodel);
 
 	/*Build discontinuous node partitioning
@@ -89,5 +89,5 @@
 
 	/*Get edges and elements*/
-	ProcessMesh2d(&iomodel->edges,&iomodel->numberofedges,NULL,iomodel->elements,iomodel->numberofelements,iomodel->numberofvertices);
+	CreateEdges(iomodel);
 
 	/*!All elements have been partitioned above, only create elements for this CPU: */
Index: sm/trunk-jpl/src/c/modules/ModelProcessorx/ProcessMesh2d.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ProcessMesh2d.cpp	(revision 15434)
+++ 	(revision )
@@ -1,116 +1,0 @@
-/*!\file:  ProcessMesh2d.cpp
- * \brief: create connectivity tables from index
- */ 
-
-#include "../../shared/shared.h"
-
-void ProcessMesh2d(int** pedges,int* pnumberofedges,int** pelement_edge_connectivity,int* index,int numberofelements,int numberofvertices){
-
-	/*If mesh already processed, return*/
-	if(*pedges) return;
-
-	/*Intermediaries*/
-	bool exist;
-	int  i,j,v1,v2,v3;
-	int  maxnbe,nbe;
-
-	/*Checks in debugging mode*/
-	_assert_(index);
-
-	/*Maximum number of edges*/
-	maxnbe = 3*numberofelements;
-
-	/*Initialize intermediaries*/
-	int*  edgestemp = xNew<int>(maxnbe*4); /*vertex1 vertex2 element1 element2*/
-	bool* exchange  = xNewZeroInit<bool>(maxnbe);  
-	int*  element_edge_connectivity = xNew<int>(numberofelements*3);   /*edge1   edge2   edge3*/
-	for(i=0;i<maxnbe;i++) edgestemp[i*4+3]=-1;
-
-	/*Initialize chain*/
-	int* head_minv = xNew<int>(numberofvertices);
-	int* next_edge = xNew<int>(maxnbe);
-	for(i=0;i<numberofvertices;i++) head_minv[i]=-1;
-
-	/*Initialize number of edges*/
-	nbe = 0;
-
-	for(i=0;i<numberofelements;i++){
-		for(j=0;j<3;j++){
-
-			/*Get the two indices of the edge number j of the ith triangle*/
-			v1 = index[i*3+j];
-			if(j==2)
-			 v2 = index[i*3+0];
-			else
-			 v2 = index[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 edges connected to v1 and check whether we have seen this edge yet*/
-			_assert_(v1>=0 & v1<numberofvertices);
-			for(int e=head_minv[v1]; e!=-1; e=next_edge[e]){
-				if(edgestemp[e*4+1]==v2){
-					exist = true;
-					edgestemp[e*4+3]=i+1;
-					element_edge_connectivity[i*3+j]=e;
-					break;
-				}
-			}
-
-			/*If this edge is new, add it to the lists*/
-			if(!exist){
-				_assert_(nbe<maxnbe);
-
-				/*Update edges and element_edge_connectivity*/
-				edgestemp[nbe*4+0] = v1;
-				edgestemp[nbe*4+1] = v2;
-				edgestemp[nbe*4+2] = i+1;
-				element_edge_connectivity[i*3+j]=nbe;
-				if(v1!=index[i*3+j]) exchange[nbe]=true;
-
-				/*Update chain*/
-				next_edge[nbe] = head_minv[v1];
-				head_minv[v1]  = nbe;
-
-				/*Increase number of edges*/
-				nbe++;
-			}
-		}
-	}
-
-	/*Clean up*/
-	xDelete<int>(head_minv);
-	xDelete<int>(next_edge);
-
-	/*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];
-	}
-	xDelete<int>(edgestemp);
-	xDelete<bool>(exchange);
-
-	/*Assign output pointers*/
-	if(pedges) *pedges = edges;
-	else xDelete<int>(edges);
-
-	if(pnumberofedges) *pnumberofedges = nbe;
-
-	if(pelement_edge_connectivity) *pelement_edge_connectivity = element_edge_connectivity;
-	else xDelete<int>(element_edge_connectivity);
-}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateLoadsPrognostic.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateLoadsPrognostic.cpp	(revision 15434)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/CreateLoadsPrognostic.cpp	(revision 15435)
@@ -29,5 +29,5 @@
 
 		/*Get edges and elements*/
-		ProcessMesh2d(&iomodel->edges,&iomodel->numberofedges,NULL,iomodel->elements,iomodel->numberofelements,iomodel->numberofvertices);
+		CreateEdges(iomodel);
 		iomodel->FetchData(1,ThicknessEnum);
 
