Index: /issm/trunk/src/c/Makefile.am
===================================================================
--- /issm/trunk/src/c/Makefile.am	(revision 2891)
+++ /issm/trunk/src/c/Makefile.am	(revision 2892)
@@ -308,4 +308,6 @@
 					./ProcessParamsx/ProcessParamsx.cpp\
 					./ProcessParamsx/ProcessParamsx.h\
+					./PropagateFlagsFromConnectivityx/PropagateFlagsFromConnectivityx.cpp\
+					./PropagateFlagsFromConnectivityx/PropagateFlagsFromConnectivityx.h\
 					./Qmux/Qmux.h\
 					./Qmux/Qmux.cpp\
Index: /issm/trunk/src/c/ModelProcessorx/Control/CreateParametersControl.cpp
===================================================================
--- /issm/trunk/src/c/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 2891)
+++ /issm/trunk/src/c/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 2892)
@@ -20,6 +20,4 @@
 	Param*   param = NULL;
 	int      count;
-	int      analysis_type;
-	int      numberofdofspernode;
 
 	double* fit=NULL;
@@ -140,4 +138,10 @@
 		param= new Param(count,"cm_max",DOUBLE);
 		param->SetDouble(iomodel->cm_max);
+		parameters->AddObject(param);
+
+		/*cm_gradient: */
+		count++;
+		param= new Param(count,"cm_gradient",DOUBLE);
+		param->SetDouble(iomodel->cm_gradient);
 		parameters->AddObject(param);
 
Index: /issm/trunk/src/c/ModelProcessorx/IoModel.cpp
===================================================================
--- /issm/trunk/src/c/ModelProcessorx/IoModel.cpp	(revision 2891)
+++ /issm/trunk/src/c/ModelProcessorx/IoModel.cpp	(revision 2892)
@@ -125,4 +125,5 @@
 	iomodel->cm_min=0;
 	iomodel->cm_max=0;
+	iomodel->cm_gradient=0;
 	iomodel->verbose=0;
 	iomodel->plot=0;
@@ -353,4 +354,5 @@
 	IoModelFetchData(&iomodel->cm_min,iomodel_handle,"cm_min");
 	IoModelFetchData(&iomodel->cm_max,iomodel_handle,"cm_max");
+	IoModelFetchData(&iomodel->cm_gradient,iomodel_handle,"cm_gradient");
 	IoModelFetchData(&iomodel->eps_res,iomodel_handle,"eps_res");
 	IoModelFetchData(&iomodel->eps_rel,iomodel_handle,"eps_rel");
Index: /issm/trunk/src/c/ModelProcessorx/IoModel.h
===================================================================
--- /issm/trunk/src/c/ModelProcessorx/IoModel.h	(revision 2891)
+++ /issm/trunk/src/c/ModelProcessorx/IoModel.h	(revision 2892)
@@ -117,4 +117,5 @@
 	double  cm_min;
 	double  cm_max;
+	int     cm_gradient;;
 
 	double  cm_noisedampening;
Index: /issm/trunk/src/c/issm.h
===================================================================
--- /issm/trunk/src/c/issm.h	(revision 2891)
+++ /issm/trunk/src/c/issm.h	(revision 2892)
@@ -49,4 +49,5 @@
 #include "./PenaltyConstraintsx/PenaltyConstraintsx.h"
 #include "./ProcessParamsx/ProcessParamsx.h"
+#include "./PropagateFlagsFromConnectivityx/PropagateFlagsFromConnectivityx.h"
 #include "./Gradjx/Gradjx.h"
 #include "./Orthx/Orthx.h"
Index: /issm/trunk/src/c/parallel/ProcessResults.cpp
===================================================================
--- /issm/trunk/src/c/parallel/ProcessResults.cpp	(revision 2891)
+++ /issm/trunk/src/c/parallel/ProcessResults.cpp	(revision 2892)
@@ -90,4 +90,8 @@
 	double* m_g_serial=NULL;
 	double* melting=NULL;
+
+	Vec     grad_g=NULL;
+	double* grad_g_serial=NULL;
+	double* gradient=NULL;
 
 	Vec     v_g=NULL;
@@ -286,4 +290,28 @@
 			VecFree(&t_g);
 		}
+		else if(strcmp(result->GetFieldName(),"grad_g")==0){
+			
+			/*easy, grad_g is of size numberofnodes, on 1 dof, just repartition: */
+			result->GetField(&grad_g);
+			VecToMPISerial(&grad_g_serial,grad_g);
+			fem_c->parameters->FindParam(&numberofnodes,"numberofnodes");
+			VecToMPISerial(&partition,fem_c->partition->vector);
+
+			gradient=(double*)xmalloc(numberofnodes*sizeof(double));
+
+			for(i=0;i<numberofnodes;i++){
+				gradient[i]=grad_g_serial[(int)partition[i]];
+			}
+
+			/*Ok, add gradient to newresults: */
+			newresult=new Result(newresults->Size()+1,result->GetTime(),result->GetStep(),"gradient",gradient,numberofnodes);
+			newresults->AddObject(newresult);
+
+			/*do some cleanup: */
+			xfree((void**)&grad_g_serial);
+			xfree((void**)&partition);
+			xfree((void**)&gradient);
+			VecFree(&grad_g);
+		}
 		else if(strcmp(result->GetFieldName(),"m_g")==0){
 			/*easy, m_g is of size numberofnodes, on 1 dof, just repartition: */
Index: /issm/trunk/src/c/parallel/control_core.cpp
===================================================================
--- /issm/trunk/src/c/parallel/control_core.cpp	(revision 2891)
+++ /issm/trunk/src/c/parallel/control_core.cpp	(revision 2892)
@@ -42,4 +42,5 @@
 	double  cm_min;
 	double  cm_max;
+	int     cm_gradient;
 	int     nsteps,n,i;
 	double* J=NULL;
@@ -71,4 +72,5 @@
 	model->FindParam(&cm_min,"cm_min");
 	model->FindParam(&cm_max,"cm_max");
+	model->FindParam(&cm_gradient,"cm_gradient");
 	model->FindParam(&param_g,NULL,NULL,"param_g");
 	model->FindParam(&analysis_type,"analysis_type");
@@ -113,4 +115,26 @@
 		gradjcompute_results->FindResult(&grad_g,"grad_g");
 		delete gradjcompute_results;
+
+		/*Return gradient if asked: */
+		if (cm_gradient){
+			
+			/*Plug results into output dataset: */
+			result=new Result(results->Size()+1,0,1,"grad_g",grad_g);
+			results->AddObject(result);
+		
+			/*Free ressources: */
+			xfree((void**)&control_type);
+			xfree((void**)&fit);
+			xfree((void**)&optscal);
+			xfree((void**)&maxiter);
+			xfree((void**)&cm_jump);
+			xfree((void**)&grad_g_double);
+			xfree((void**)&param_g);
+			VecFree(&u_g);
+			VecFree(&t_g);
+			VecFree(&m_g);
+			xfree((void**)&J);
+			return;
+		}
 
 		/*Normalize if last gradient not satisfying (search_scalar==0)*/
Index: /issm/trunk/src/m/classes/@model/model.m
===================================================================
--- /issm/trunk/src/m/classes/@model/model.m	(revision 2891)
+++ /issm/trunk/src/m/classes/@model/model.m	(revision 2892)
@@ -198,4 +198,5 @@
 	md.fit=[];
 	md.cm_jump=[];
+	md.cm_gradient=0;
 	md.epsvel=0;
 	md.meanvel=0;
Index: /issm/trunk/src/m/classes/@model/setdefaultparameters.m
===================================================================
--- /issm/trunk/src/m/classes/@model/setdefaultparameters.m	(revision 2891)
+++ /issm/trunk/src/m/classes/@model/setdefaultparameters.m	(revision 2892)
@@ -204,4 +204,7 @@
 md.cm_max=200;
 
+%stop control solution at the gradient computation and return it? 
+md.cm_gradient=0;
+
 %eps_cm is a criteria to stop the control methods.
 %if J[n]-J[n-1]/J[n] < criteria, the control run stops
Index: /issm/trunk/src/mex/Makefile.am
===================================================================
--- /issm/trunk/src/mex/Makefile.am	(revision 2891)
+++ /issm/trunk/src/mex/Makefile.am	(revision 2892)
@@ -37,4 +37,5 @@
 				PenaltySystemMatrices\
 				ProcessParams\
+				PropagateFlagsFromConnectivity\
 				Qmu\
 				Reduceloadfromgtof\
@@ -178,4 +179,7 @@
 			  ProcessParams/ProcessParams.h
 
+PropagateFlagsFromConnectivity_SOURCES = PropagateFlagsFromConnectivity/PropagateFlagsFromConnectivity.cpp\
+			  PropagateFlagsFromConnectivity/PropagateFlagsFromConnectivity.h
+
 Qmu_SOURCES = Qmu/Qmu.cpp\
 			  Qmu/Qmu.h
