Index: /issm/trunk-jpl/src/c/classes/Node.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Node.cpp	(revision 23640)
+++ /issm/trunk-jpl/src/c/classes/Node.cpp	(revision 23641)
@@ -623,4 +623,8 @@
 }
 /*}}}*/
+int  Node::Pid(void){/*{{{*/
+	return this->pid; 
+}
+/*}}}*/
 
 /*Node numerics:*/
Index: /issm/trunk-jpl/src/c/classes/Node.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Node.h	(revision 23640)
+++ /issm/trunk-jpl/src/c/classes/Node.h	(revision 23641)
@@ -108,4 +108,5 @@
 		void  ShowMasterDofs(int* truerows,int setenum);
 		int   Sid(void); 
+		int   Pid(void); 
 		void  UpdateCloneDofs(int* alltruerows,int setenum);
 		void  VecMerge(Vector<IssmDouble>* ug,IssmDouble* local_uf,int* indices_uf,IssmDouble* local_ys,int* indices_ys);
Index: /issm/trunk-jpl/src/c/classes/Nodes.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Nodes.cpp	(revision 23640)
+++ /issm/trunk-jpl/src/c/classes/Nodes.cpp	(revision 23641)
@@ -360,4 +360,9 @@
 }
 /*}}}*/
+int   Nodes::NumberOfNodesLocal(void){/*{{{*/
+
+	return this->numberofmasters_local;
+}
+/*}}}*/
 bool  Nodes::RequiresDofReindexing(void){/*{{{*/
 
Index: /issm/trunk-jpl/src/c/classes/Nodes.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Nodes.h	(revision 23640)
+++ /issm/trunk-jpl/src/c/classes/Nodes.h	(revision 23641)
@@ -44,4 +44,5 @@
 		int   NumberOfDofsLocalAll(int setenum);
 		int   NumberOfNodes(void);
+		int   NumberOfNodesLocal(void);
 		bool  RequiresDofReindexing(void);
 };
Index: /issm/trunk-jpl/src/c/modules/AllocateSystemMatricesx/AllocateSystemMatricesx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/AllocateSystemMatricesx/AllocateSystemMatricesx.cpp	(revision 23640)
+++ /issm/trunk-jpl/src/c/modules/AllocateSystemMatricesx/AllocateSystemMatricesx.cpp	(revision 23641)
@@ -108,4 +108,5 @@
 	/*Get vector size and number of nodes*/
 	int numnodes            = femmodel->nodes->NumberOfNodes();
+	int localmasters        = femmodel->nodes->NumberOfNodesLocal();
 	int localnumnodes       = femmodel->nodes->Size();
 	int numberofdofspernode = femmodel->nodes->MaxNumDofs(GsetEnum);
@@ -171,8 +172,9 @@
 	bool *flags                  = xNew<bool>(localnumnodes);
 	int  *flagsindices           = xNew<int>(localnumnodes);
-	int  *d_connectivity         = xNewZeroInit<int>(numnodes);
-	int  *o_connectivity         = xNewZeroInit<int>(numnodes);
-	int  *connectivity_clone     = xNewZeroInit<int>(numnodes);
+	int  *d_connectivity         = xNewZeroInit<int>(localnumnodes);
+	int  *o_connectivity         = xNewZeroInit<int>(localnumnodes);
 	int  *all_connectivity_clone = xNewZeroInit<int>(numnodes);
+
+	Vector<IssmDouble> *connectivity_clone= new Vector<IssmDouble>(localmasters,numnodes);
 
 	/*Resetting flags to false at eahc iteration takes a lot of time, so we keep track of the flags
@@ -209,9 +211,9 @@
 			element->SetwiseNodeConnectivity(&d_nz,&o_nz,node,flags,flagsindices,set1enum,set2enum);
 			if(node->IsClone()){
-				connectivity_clone[node->Sid()]+=d_nz+o_nz;
-			}
-			else{
-				d_connectivity[node->Sid()]+=d_nz;
-				o_connectivity[node->Sid()]+=o_nz;
+				connectivity_clone->SetValue(node->Pid(),d_nz+o_nz,ADD_VAL);
+			}
+			else{
+				d_connectivity[node->Lid()]+=d_nz;
+				o_connectivity[node->Lid()]+=o_nz;
 			}
 		}
@@ -221,9 +223,9 @@
 			load->SetwiseNodeConnectivity(&d_nz,&o_nz,node,flags,flagsindices,set1enum,set2enum);
 			if(node->IsClone()){
-				connectivity_clone[node->Sid()]+=d_nz+o_nz;
-			}
-			else{
-				d_connectivity[node->Sid()]+=d_nz;
-				o_connectivity[node->Sid()]+=o_nz;
+				connectivity_clone->SetValue(node->Pid(),d_nz+o_nz,ADD_VAL);
+			}
+			else{
+				d_connectivity[node->Lid()]+=d_nz;
+				o_connectivity[node->Lid()]+=o_nz;
 			}
 		}
@@ -239,6 +241,8 @@
 
 	/*sum over all cpus*/
-	ISSM_MPI_Allreduce((void*)connectivity_clone,(void*)all_connectivity_clone,numnodes,ISSM_MPI_INT,ISSM_MPI_SUM,IssmComm::GetComm());
-	xDelete<int>(connectivity_clone);
+	connectivity_clone->Assemble();
+	IssmDouble* serial_connectivity_clone=NULL;
+	femmodel->GetLocalVectorWithClonesVertices(&serial_connectivity_clone,connectivity_clone);
+	delete connectivity_clone;
 
 	if(set1enum==FsetEnum){
@@ -251,6 +255,6 @@
 				for(j=0;j<node->fsize;j++){
 					_assert_(count<m);
-					d_nnz[count]=numberofdofspernode*(d_connectivity[node->Sid()] + all_connectivity_clone[node->Sid()]);
-					o_nnz[count]=numberofdofspernode*(o_connectivity[node->Sid()] + all_connectivity_clone[node->Sid()]);
+					d_nnz[count]=numberofdofspernode*(d_connectivity[node->Lid()] + reCast<int>(serial_connectivity_clone[node->Lid()]));
+					o_nnz[count]=numberofdofspernode*(o_connectivity[node->Lid()] + reCast<int>(serial_connectivity_clone[node->Lid()]));
 					if(d_nnz[count]>n)   d_nnz[count]=n;
 					if(o_nnz[count]>N-n) o_nnz[count]=N-n;
@@ -266,5 +270,5 @@
 	xDelete<int>(d_connectivity);
 	xDelete<int>(o_connectivity);
-	xDelete<int>(all_connectivity_clone);
+	xDelete<IssmDouble>(serial_connectivity_clone);
 
 	/*Allocate ouptput pointer*/
