Index: /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp	(revision 22835)
+++ /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp	(revision 22836)
@@ -84,7 +84,7 @@
 	int           JlistN       = input_struct->N;
 	int*          Jlisti       = input_struct->i;
+	IssmPDouble* X_best			= input_struct->X_best;
+	IssmPDouble* G_best			= input_struct->G_best;
 	IssmPDouble*  J_best       = input_struct->J_best;
-	IssmPDouble*  X_best			= input_struct->X_best;
-	IssmPDouble*  G_best			= input_struct->G_best;
 	int           intn         = (int)*n;
 
@@ -166,4 +166,13 @@
 		}
 	}
+	if(my_rank==0){
+		if(*J_best<0 || J<*J_best){
+			*J_best = reCast<IssmPDouble>(J);
+			for(int i=0;i<intn;i++){
+				X_best[i] = reCast<IssmPDouble>(X[i]);
+				G_best[i] = reCast<IssmPDouble>(G[i]);
+			}
+		}
+}
 
 	/*Turning off trace tape*/
@@ -298,13 +307,4 @@
 	Jlist[(*Jlisti)*JlistN+num_responses] = reCast<IssmPDouble>(J);
 
-	
-	if(*J_best<0 || J<*J_best){
-		*J_best = reCast<IssmPDouble>(J);
-		for(int i=0;i<intn;i++){
-			X_best[i] = reCast<IssmPDouble>(X[i]);
-			G_best[i] = reCast<IssmPDouble>(G[i]);
-		}
-	}
-
 /*
 	IssmDouble* test = xNew<IssmDouble>(intn);
@@ -351,4 +351,8 @@
 	_printf0_("\n");
 
+	input_struct->X_best = X_best;
+	input_struct->G_best = G_best;
+	input_struct->J_best = J_best;
+	
 	/*Clean-up and return*/
 	*Jlisti = (*Jlisti) +1;
@@ -450,4 +454,5 @@
 	mystruct.X_best	= xNewZeroInit<IssmPDouble>(intn);
 	mystruct.G_best   = xNewZeroInit<IssmPDouble>(intn);
+	*mystruct.J_best = -10.;
 	/*Initialize Gradient and cost function of M1QN3*/
 	indic = 4; /*gradient required*/
@@ -490,10 +495,4 @@
 	}
 	
-	IssmDouble* aX_best = NULL;
-	IssmDouble* aG_best = NULL;
-
-	femmodel->parameters->FindParam(&aX_best,NULL,InversionXBestEnum);
-	femmodel->parameters->FindParam(&aG_best,NULL,InversionGBestEnum);
-	
 	/*Set X as our new control*/
 	IssmDouble* aX=xNew<IssmDouble>(intn);
@@ -505,6 +504,6 @@
 		aX[i] = reCast<IssmDouble>(X[i]); 
 		aG[i] = reCast<IssmDouble>(G[i]);
-		X_best[i] = reCast<double>(aX_best[i]);	
-		G_best[i] = reCast<double>(aG_best[i]);	
+		X_best[i] = reCast<double>(mystruct.X_best[i]);	
+		G_best[i] = reCast<double>(mystruct.G_best[i]);	
 		}
 
Index: /issm/trunk-jpl/src/m/classes/autodiff.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/autodiff.m	(revision 22835)
+++ /issm/trunk-jpl/src/m/classes/autodiff.m	(revision 22836)
@@ -125,4 +125,14 @@
 				types=zeros(num_independent_objects,1);
 
+				max_parameters_pre = [];
+				min_parameters_pre = [];
+				M_size = false;
+				for i=1:num_independent_objects,
+					indep=self.independents{i};
+					if M_size == false && indep.control_size>1
+						M_size = true;
+					end
+				end
+
 				for i=1:num_independent_objects,
 					indep=self.independents{i};
@@ -130,10 +140,21 @@
 					names{i}=indep.name;
 					types(i)=indep.typetoscalar();
-					min_parameters(:,:,i)=indep.min_parameters;
-					max_parameters(:,:,i)=indep.max_parameters;
+					size(indep.min_parameters)
+					if indep.control_size == 1 && M_size == true
+						indep.min_parameters = [indep.min_parameters;NaN];
+						indep.max_parameters = [indep.max_parameters;NaN];
+					end
+					min_parameters_pre=[min_parameters_pre,indep.min_parameters];
+					max_parameters_pre=[max_parameters_pre,indep.max_parameters];
 					scaling_factors(i)=indep.control_scaling_factor;
 					control_sizes(i) = indep.control_size;
 
 				end
+
+				size(max_parameters_pre)
+				max_parameters=reshape(max_parameters_pre,size(max_parameters_pre,1),sum(control_sizes));
+				min_parameters=reshape(min_parameters_pre,size(min_parameters_pre,1),sum(control_sizes));
+
+				size(max_parameters)
 				WriteData(fid,prefix,'data',names,'name','md.autodiff.independent_object_names','format','StringArray');
 				WriteData(fid,prefix,'data',types,'name','md.autodiff.independent_object_types','format','IntMat','mattype',3);
