Index: /issm/trunk-jpl/src/c/classes/Vertices.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Vertices.cpp	(revision 23520)
+++ /issm/trunk-jpl/src/c/classes/Vertices.cpp	(revision 23521)
@@ -37,11 +37,13 @@
 	int num_proc=IssmComm::GetSize();
 
-	if(common_recv) xDelete<int>(common_recv);
-	if(common_send) xDelete<int>(common_send);
-	if(common_recv_ids){
+	if(this->common_recv){
+		xDelete<int>(common_recv);
+	}
+	if(this->common_send) xDelete<int>(common_send);
+	if(this->common_recv_ids){
 		for(int i=0;i<num_proc;i++) if(common_recv_ids[i]) xDelete<int>(common_recv_ids[i]);
 		xDelete<int*>(common_recv_ids);
 	}
-	if(common_send_ids){
+	if(this->common_send_ids){
 		for(int i=0;i<num_proc;i++) if(common_send_ids[i]) xDelete<int>(common_send_ids[i]);
 		xDelete<int*>(common_send_ids);
@@ -52,4 +54,59 @@
 
 /*Numerics management*/
+Vertices* Vertices::Copy() {/*{{{*/
+
+	int num_proc = IssmComm::GetSize();
+
+	/*Copy dataset*/
+	Vertices* output=new Vertices();
+	output->sorted=this->sorted;
+	output->numsorted=this->numsorted;
+	output->presorted=this->presorted;
+	for(vector<Object*>::iterator obj=this->objects.begin() ; obj < this->objects.end(); obj++ ){
+		output->AddObject((*obj)->copy());
+	}
+
+	/*Build id_offsets and sorted_ids*/
+	int objsize = this->numsorted;
+	if(this->sorted && objsize>0 && this->id_offsets){	
+		/*Allocate new ids*/
+		output->id_offsets=xNew<int>(objsize);
+		xMemCpy<int>(output->id_offsets,this->id_offsets,objsize);
+	}
+	else output->id_offsets=NULL;
+	if(this->sorted && objsize>0 && this->sorted_ids){
+		/*Allocate new ids*/
+		output->sorted_ids=xNew<int>(objsize);
+		xMemCpy<int>(output->sorted_ids,this->sorted_ids,objsize);
+	}
+	else output->sorted_ids=NULL;
+
+
+	if(this->common_recv){
+		output->common_recv=xNew<int>(num_proc);
+		for(int i=0;i<num_proc;i++) output->common_recv[i]=this->common_recv[i];
+	}
+	if(this->common_send){
+		output->common_send=xNew<int>(num_proc);
+		for(int i=0;i<num_proc;i++) output->common_send[i]=this->common_send[i];
+	}
+	if(this->common_recv_ids){
+		output->common_recv_ids = xNew<int*>(num_proc);
+		for(int i=0;i<num_proc;i++){
+			output->common_recv_ids[i]=xNew<int>(this->common_recv[i]);
+			for(int j=0;j<this->common_recv[i];j++) output->common_recv_ids[i][j]=this->common_recv_ids[i][j];
+		}
+	}
+	if(this->common_send_ids){
+		output->common_send_ids = xNew<int*>(num_proc);
+		for(int i=0;i<num_proc;i++){
+			output->common_send_ids[i]=xNew<int>(this->common_send[i]);
+			for(int j=0;j<this->common_send[i];j++) output->common_send_ids[i][j]=this->common_send_ids[i][j];
+		}
+	}
+
+	return output;
+}
+/*}}}*/
 void Vertices::Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){ /*{{{*/
 
Index: /issm/trunk-jpl/src/c/classes/Vertices.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Vertices.h	(revision 23520)
+++ /issm/trunk-jpl/src/c/classes/Vertices.h	(revision 23521)
@@ -25,4 +25,5 @@
 
 		/*Objects virtual functions*/
+		Vertices* Copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 
