Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 23635)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 23636)
@@ -1306,4 +1306,62 @@
 
 }/*}}}*/
+void FemModel::GetLocalVectorWithClonesGset(IssmDouble** plocal_ug,Vector<IssmDouble> *ug){/*{{{*/
+
+	/*recover my_rank:*/
+	ISSM_MPI_Status status;
+	int my_rank   = IssmComm::GetRank();
+	int num_procs = IssmComm::GetSize();
+
+	/*retrieve node info*/
+	int glocalsize         = this->nodes->NumberOfDofsLocalAll(GsetEnum);
+	int glocalsize_masters = this->nodes->NumberOfDofsLocal(GsetEnum);
+	int maxdofspernode     = this->nodes->MaxNumDofs(GsetEnum);
+
+	/*Get local vector of ug*/
+	int        *indices_ug_masters = NULL;
+	IssmDouble *local_ug_masters   = NULL;
+	ug->GetLocalVector(&local_ug_masters,&indices_ug_masters);
+	_assert_(glocalsize_masters==indices_ug_masters[glocalsize_masters-1] - indices_ug_masters[0]+1);
+	xDelete<int>(indices_ug_masters);
+
+	/*Now, extend vectors to account for clones (make vectors longer, for clones at the end)*/
+	IssmDouble *local_ug  = xNew<IssmDouble>(glocalsize);
+	xMemCpy<IssmDouble>(local_ug,local_ug_masters,glocalsize_masters);
+	xDelete<IssmDouble>(local_ug_masters);
+
+	/*Now send and receive ug for nodes on partition edge*/
+	#ifdef _HAVE_AD_
+	IssmDouble* buffer = xNew<IssmDouble>(this->nodes->Size()*maxdofspernode,"t"); //only one alloc, "t" is required by adolc
+	#else
+	IssmDouble* buffer = xNew<IssmDouble>(this->nodes->Size()*maxdofspernode);
+	#endif
+	for(int rank=0;rank<num_procs;rank++){
+		if(this->nodes->common_send[rank]){
+			int  numids = this->nodes->common_send[rank];
+			for(int i=0;i<numids;i++){
+				int   master_lid = this->nodes->common_send_ids[rank][i];
+				Node* node=xDynamicCast<Node*>(this->nodes->GetObjectByOffset(master_lid));
+				_assert_(!node->IsClone());
+				for(int j=0;j<node->gsize;j++) buffer[i*maxdofspernode+j]=local_ug[node->gdoflist_local[j]];
+			}
+			ISSM_MPI_Send(buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm());
+		}
+	}
+	for(int rank=0;rank<num_procs;rank++){
+		if(this->nodes->common_recv[rank]){
+			int  numids = this->nodes->common_recv[rank];
+			ISSM_MPI_Recv(buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm(),&status);
+			for(int i=0;i<numids;i++){
+				int   master_lid = this->nodes->common_recv_ids[rank][i];
+				Node* node=xDynamicCast<Node*>(this->nodes->GetObjectByOffset(master_lid));
+				for(int j=0;j<node->gsize;j++) local_ug[node->gdoflist_local[j]] = buffer[i*maxdofspernode+j];
+			}
+		}
+	}
+	xDelete<IssmDouble>(buffer);
+
+	/*Assign output pointer*/
+	*plocal_ug = local_ug;
+}/*}}}*/
 void FemModel::GroundedAreax(IssmDouble* pV, bool scaled){/*{{{*/
 
Index: /issm/trunk-jpl/src/c/classes/FemModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 23635)
+++ /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 23636)
@@ -96,4 +96,5 @@
 		void FloatingAreax(IssmDouble* pV, bool scaled);
 		void GetInputLocalMinMaxOnNodesx(IssmDouble** pmin,IssmDouble** pmax,IssmDouble* ug);
+		void GetLocalVectorWithClonesGset(IssmDouble** plocal_ug,Vector<IssmDouble> *ug);
 		void GroundedAreax(IssmDouble* pV, bool scaled);
 		void IceMassx(IssmDouble* pV, bool scaled);
Index: /issm/trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp	(revision 23635)
+++ /issm/trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp	(revision 23636)
@@ -17,57 +17,7 @@
 	Analysis* analysis = EnumToAnalysis(analysisenum);
 
-	/*recover my_rank:*/
-	ISSM_MPI_Status status;
-	int my_rank   = IssmComm::GetRank();
-	int num_procs = IssmComm::GetSize();
-
-	/*retrieve node info*/
-	int gsize              = femmodel->nodes->NumberOfDofs(GsetEnum);
-	int glocalsize_masters = femmodel->nodes->NumberOfDofsLocal(GsetEnum);
-	int glocalsize         = femmodel->nodes->NumberOfDofsLocalAll(GsetEnum);
-	int maxdofspernode     = femmodel->nodes->MaxNumDofs(GsetEnum);
-
-	/*Get local vector of ug*/
-	int        *indices_ug_masters = NULL;
-	IssmDouble *local_ug_masters   = NULL;
-	solution->GetLocalVector(&local_ug_masters,&indices_ug_masters);
-	_assert_(glocalsize_masters==indices_ug_masters[glocalsize_masters-1] - indices_ug_masters[0]+1);
-	xDelete<int>(indices_ug_masters);
-
-	/*Now, extend vectors to account for clones (make vectors longer, for clones at the end)*/
-	IssmDouble *local_ug  = xNew<IssmDouble>(glocalsize);
-	xMemCpy<IssmDouble>(local_ug,local_ug_masters,glocalsize_masters);
-	xDelete<IssmDouble>(local_ug_masters);
-
-	/*Now send and receive ug for nodes on partition edge*/
-	#ifdef _HAVE_AD_
-	IssmDouble* buffer = xNew<IssmDouble>(femmodel->nodes->Size()*maxdofspernode,"t"); //only one alloc, "t" is required by adolc
-	#else
-	IssmDouble* buffer = xNew<IssmDouble>(femmodel->nodes->Size()*maxdofspernode);
-	#endif
-	for(int rank=0;rank<num_procs;rank++){
-		if(femmodel->nodes->common_send[rank]){
-			int  numids = femmodel->nodes->common_send[rank];
-			for(int i=0;i<numids;i++){
-				int   master_lid = femmodel->nodes->common_send_ids[rank][i];
-				Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(master_lid));
-				_assert_(!node->IsClone());
-				for(int j=0;j<node->gsize;j++) buffer[i*maxdofspernode+j]=local_ug[node->gdoflist_local[j]];
-			}
-			ISSM_MPI_Send(buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm());
-		}
-	}
-	for(int rank=0;rank<num_procs;rank++){
-		if(femmodel->nodes->common_recv[rank]){
-			int  numids = femmodel->nodes->common_recv[rank];
-			ISSM_MPI_Recv(buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm(),&status);
-			for(int i=0;i<numids;i++){
-				int   master_lid = femmodel->nodes->common_recv_ids[rank][i];
-				Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(master_lid));
-				for(int j=0;j<node->gsize;j++) local_ug[node->gdoflist_local[j]] = buffer[i*maxdofspernode+j];
-			}
-		}
-	}
-	xDelete<IssmDouble>(buffer);
+	/*Get local vector with both masters and slaves:*/
+	IssmDouble *local_ug = NULL;
+	femmodel->GetLocalVectorWithClonesGset(&local_ug,solution);
 
 	/*Now update inputs (analysis specific)*/
Index: /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 23635)
+++ /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 23636)
@@ -109,55 +109,8 @@
 	vec_mask_ice->Assemble();
 
-
-	/*FIXME: What follows should be copied and pasted into InputUpdateFromSolution Nodes*/
-
-	/*recover my_rank:*/
-	ISSM_MPI_Status status;
-	int my_rank   = IssmComm::GetRank();
-	int num_procs = IssmComm::GetSize();
-
-	/*retrieve node info*/
-	int glocalsize         = femmodel->nodes->NumberOfDofsLocalAll(GsetEnum);
-	int maxdofspernode     = femmodel->nodes->MaxNumDofs(GsetEnum);
-
-	/*Get local vector of ug*/
-	int        *indices_ug_masters = NULL;
-	IssmDouble *local_ug_masters   = NULL;
-	vec_mask_ice->GetLocalVector(&local_ug_masters,&indices_ug_masters);
-	_assert_(glocalsize_masters==indices_ug_masters[glocalsize_masters-1] - indices_ug_masters[0]+1);
-	xDelete<int>(indices_ug_masters);
+	/*Get local vector with masters and slaves*/
+	IssmDouble *local_ug = NULL;
+	femmodel->GetLocalVectorWithClonesGset(&local_ug,vec_mask_ice);
 	delete vec_mask_ice;
-
-	/*Now, extend vectors to account for clones (make vectors longer, for clones at the end)*/
-	IssmDouble *local_ug  = xNew<IssmDouble>(glocalsize);
-	xMemCpy<IssmDouble>(local_ug,local_ug_masters,glocalsize_masters);
-	xDelete<IssmDouble>(local_ug_masters);
-
-	/*Now send and receive ug for nodes on partition edge*/
-	IssmDouble* buffer = xNew<IssmDouble>(femmodel->nodes->Size()*maxdofspernode); //only one alloc
-	for(int rank=0;rank<num_procs;rank++){
-		if(femmodel->nodes->common_send[rank]){
-			int  numids = femmodel->nodes->common_send[rank];
-			for(int i=0;i<numids;i++){
-				int   master_lid = femmodel->nodes->common_send_ids[rank][i];
-				Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(master_lid));
-				_assert_(!node->IsClone());
-				for(int j=0;j<node->gsize;j++) buffer[i*maxdofspernode+j]=local_ug[node->gdoflist_local[j]];
-			}
-			ISSM_MPI_Send(buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm());
-		}
-	}
-	for(int rank=0;rank<num_procs;rank++){
-		if(femmodel->nodes->common_recv[rank]){
-			int  numids = femmodel->nodes->common_recv[rank];
-			ISSM_MPI_Recv(buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm(),&status);
-			for(int i=0;i<numids;i++){
-				int   master_lid = femmodel->nodes->common_recv_ids[rank][i];
-				Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(master_lid));
-				for(int j=0;j<node->gsize;j++) local_ug[node->gdoflist_local[j]] = buffer[i*maxdofspernode+j];
-			}
-		}
-	}
-	xDelete<IssmDouble>(buffer);
 
 	/*Now update inputs (analysis specific)*/
