Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 23521)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 23522)
@@ -353,5 +353,5 @@
 		analysis_type=output->analysis_type_list[i];
 		output->SetCurrentConfiguration(analysis_type);
-		if(i==0) VerticesDofx(output->vertices,output->parameters); //only call once, we only have one set of vertices
+		//if(i==0) VerticesDofx(output->vertices,output->parameters); //only call once, we only have one set of vertices
 		SpcNodesx(output->nodes_list[i],output->constraints_list[i],output->parameters,analysis_type);
 		NodesDofx(output->nodes_list[i],output->parameters,analysis_type);
@@ -442,6 +442,6 @@
 
 		if(i==0){
-			if(VerboseMProcessor()) _printf0_("      creating vertex PIDs\n");
-			VerticesDofx(vertices,parameters);
+		//	if(VerboseMProcessor()) _printf0_("      creating vertex PIDs\n");
+		//	VerticesDofx(vertices,parameters);
 
 			if(VerboseMProcessor()) _printf0_("      detecting active vertices\n");
@@ -530,5 +530,5 @@
 			analysis_type=this->analysis_type_list[i];
 			SetCurrentConfiguration(analysis_type);
-			if(i==0) VerticesDofx(this->vertices,this->parameters); //only call once, we only have one set of vertices
+			//if(i==0) VerticesDofx(this->vertices,this->parameters); //only call once, we only have one set of vertices
 			SpcNodesx(this->nodes_list[i],this->constraints_list[i],this->parameters,analysis_type);
 			NodesDofx(this->nodes_list[i],this->parameters,analysis_type);
Index: /issm/trunk-jpl/src/c/classes/Vertex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Vertex.cpp	(revision 23521)
+++ /issm/trunk-jpl/src/c/classes/Vertex.cpp	(revision 23522)
@@ -20,14 +20,16 @@
 }
 /*}}}*/
-Vertex::Vertex(int vertex_id, int vertex_sid,int vertex_lid,bool vertex_clone, IoModel* iomodel){/*{{{*/
+Vertex::Vertex(int vertex_id, int vertex_sid,int vertex_lid,int vertex_pid,bool vertex_clone, IoModel* iomodel){/*{{{*/
 
 	/*Checks in debugging mode*/
 	_assert_(vertex_sid>=0 && vertex_sid<iomodel->numberofvertices);
 
-	this->id           = vertex_id;
-	this->sid          = vertex_sid;
-	this->pid          = UNDEF;
-	this->lid          = vertex_lid;
-
+	/*IDs*/
+	this->id  = vertex_id;
+	this->sid = vertex_sid;
+	this->pid = vertex_pid;
+	this->lid = vertex_lid;
+
+	/*Coordinates*/
 	_assert_(iomodel->Data("md.mesh.x") && iomodel->Data("md.mesh.y") && iomodel->Data("md.mesh.z"));
 	this->x            = iomodel->Data("md.mesh.x")[vertex_sid];
@@ -35,5 +37,4 @@
 	this->z            = iomodel->Data("md.mesh.z")[vertex_sid];
 	this->domaintype   = iomodel->domaintype;
-
 	if(iomodel->Data("md.mesh.lat") && iomodel->Data("md.mesh.long")){
 		this->latitute     = iomodel->Data("md.mesh.lat")[vertex_sid];
Index: /issm/trunk-jpl/src/c/classes/Vertex.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Vertex.h	(revision 23521)
+++ /issm/trunk-jpl/src/c/classes/Vertex.h	(revision 23522)
@@ -37,5 +37,5 @@
 		/*Vertex constructors, destructors {{{*/
 		Vertex();
-		Vertex(int id, int sid,int lid,bool clone, IoModel* iomodel);
+		Vertex(int id, int sid,int lid,int pid,bool clone, IoModel* iomodel);
 		~Vertex();
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 23521)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 23522)
@@ -382,12 +382,36 @@
 	xDelete<int>(vertices_proc_count);
 
+	/*Final step: prepare pids (parallel ids), first count number of masters for each proc*/
+	int*  num_masters = xNewZeroInit<int>(num_procs);
+	for(int i=0;i<iomodel->numberofvertices;i++){
+		num_masters[vertices_ranks[MAXCONNECTIVITY*i+0]]++;
+	}
+	/*Now count offsets for each procs (by taking the sum of masters of procs<my_rank)*/
+	int* rank_offsets  = xNewZeroInit<int>(num_procs);
+	for(int i=0;i<num_procs;i++){
+		for(int j=i+1;j<num_procs;j++) rank_offsets[i]+=num_masters[j];
+	}
+	xDelete<int>(num_masters);
+	/*Now create pids*/
+	int* vertices_pids = xNew<int>(iomodel->numberofvertices);
+	int* rank_counters = xNewZeroInit<int>(iomodel->numberofvertices);
+	for(int i=0;i<iomodel->numberofvertices;i++){
+		int rank_master = vertices_ranks[MAXCONNECTIVITY*i+0];
+		vertices_pids[i] = rank_offsets[rank_master]+rank_counters[rank_master];
+		rank_counters[rank_master]++;
+	}
+	xDelete<int>(rank_counters);
+	xDelete<int>(rank_offsets);
+
+	/*Go ahead and create vertices now that we have all we need*/
 	for(int i=0;i<iomodel->numberofvertices;i++){
 		if(vertices_lids[i]!=-1){
 			bool isclone = (vertices_ranks[MAXCONNECTIVITY*i+0]!=my_rank);
-			vertices->AddObject(new Vertex(i+1,i,vertices_lids[i],isclone,iomodel));
+			vertices->AddObject(new Vertex(i+1,i,vertices_lids[i],vertices_pids[i],isclone,iomodel));
 		}
 	}
 	xDelete<int>(vertices_ranks);
 	xDelete<int>(vertices_lids);
+	xDelete<int>(vertices_pids);
 
 	/*Free data: */
