Index: /issm/trunk-jpl/src/c/classes/IoModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 27665)
+++ /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 27666)
@@ -480,7 +480,6 @@
 		this->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects");
 		if(num_independent_objects){
-			this->FetchData(&names,&temp,"md.autodiff.independent_object_names");
-			_assert_(temp==num_independent_objects);
-			this->FetchData(&types,NULL,NULL,"md.autodiff.independent_object_types");
+			this->FetchMultipleData(&names,&temp,"md.autodiff.independent_name"); _assert_(temp==num_independent_objects);
+			this->FetchMultipleData(&types,NULL,"md.autodiff.independent_type");
 
 			/*create independent objects, and at the same time, fetch the corresponding independent variables,
Index: /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp	(revision 27665)
+++ /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp	(revision 27666)
@@ -475,7 +475,7 @@
 
 			/*Retrieve objective functions independently*/
-			_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
+			_printf0_("f(x) = "<<setw(9)<<setprecision(4)<<*pf<<"  |  ");
 			_printf0_("            N/A |\n");
-			for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[(*Jlisti)*JlistN+i]);
+			for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(8)<<setprecision(3)<<Jlist[(*Jlisti)*JlistN+i]);
 			_printf0_("\n");
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 27665)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 27666)
@@ -75,6 +75,7 @@
 
 			/*Step 1: create controls (independents)*/
-			iomodel->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects"); _assert_(num_independent_objects>0);
-			iomodel->FetchData(&names,&M,"md.autodiff.independent_object_names");               _assert_(M==num_independent_objects);
+			iomodel->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects");  _assert_(num_independent_objects>0);
+			iomodel->FetchMultipleData(&names,&M,"md.autodiff.independent_name");                _assert_(M==num_independent_objects);
+			iomodel->FetchMultipleData(&control_scaling_factors,&M,"md.autodiff.independent_scaling_factor"); _assert_(M==num_independent_objects);
 			int* ind_enums=xNew<int>(num_independent_objects);
 			for(int i=0;i<num_independent_objects;i++){
@@ -83,9 +84,7 @@
 			}
 			xDelete<char*>(names);
+			parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_independent_objects));
 			parameters->AddObject(new IntVecParam(InversionControlParametersEnum,ind_enums,num_independent_objects));
 			xDelete<int>(ind_enums);	
-
-			iomodel->FetchData(&control_scaling_factors,NULL,NULL,"md.autodiff.independent_scaling_factors");
-			parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_independent_objects));
 
 			/*Step 2: create cost functions (dependent)*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 27665)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 27666)
@@ -211,12 +211,12 @@
 	#if defined(_HAVE_AD_)
 	/*Intermediaries*/
-	int				num_independent_objects,M,N,M_par,N_par;
-	char**			names                   = NULL;
-	int*				types							= NULL;
-	int*				control_sizes				= NULL;
-	IssmDouble*		independent					= NULL;
-	IssmDouble*		independents_fullmin    = NULL;
-	IssmDouble*		independents_fullmax		= NULL;
-	bool				control_analysis			=false;
+	int          num_independent_objects,M,N;
+	char       **names                = NULL;
+	int         *types                = NULL;
+	int         *control_sizes        = NULL;
+	IssmDouble  *independent          = NULL;
+	IssmDouble **independents_fullmin = NULL;
+	IssmDouble **independents_fullmax = NULL;
+	bool         control_analysis     = false;
 
 	iomodel->FindConstant(&control_analysis,"md.inversion.iscontrol");
@@ -226,9 +226,7 @@
 
 	/*Step1: create controls (independents)*/
-	iomodel->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects");
-	_assert_(num_independent_objects>0); 
-	iomodel->FetchData(&names,&M,"md.autodiff.independent_object_names");
-	_assert_(M==num_independent_objects);
-	iomodel->FetchData(&types,NULL,NULL,"md.autodiff.independent_object_types");
+	iomodel->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects"); _assert_(num_independent_objects>0); 
+	iomodel->FetchMultipleData(&names,&M,"md.autodiff.independent_name"); _assert_(M==num_independent_objects);
+	iomodel->FetchMultipleData(&types,&M,"md.autodiff.independent_type"); _assert_(M==num_independent_objects);
 
 	int* M_all = xNew<int>(num_independent_objects);
@@ -238,15 +236,7 @@
 	/*create independent objects, and at the same time, fetch the corresponding independent variables, 
 	 *and declare them as such in ADOLC: */
-	iomodel->FetchData(&independents_fullmin,&M_par,&N_par,"md.autodiff.independent_min_parameters");
-	iomodel->FetchData(&independents_fullmax,&M_par,&N_par,"md.autodiff.independent_max_parameters");
-	iomodel->FetchData(&control_sizes,NULL,NULL,"md.autodiff.independent_control_sizes");
-
-	int* start_point = NULL;
-	start_point = xNew<int>(num_independent_objects);
-	int counter = 0;
-	for(int i=0;i<num_independent_objects;i++){
-		start_point[i]=counter; 
-		counter+=control_sizes[i];
-	}
+	iomodel->FetchMultipleData(&independents_fullmin,&M_all,&N_all,&M,"md.autodiff.independent_min_parameters"); _assert_(M==num_independent_objects);
+	iomodel->FetchMultipleData(&independents_fullmax,NULL  ,NULL  ,&M,"md.autodiff.independent_max_parameters"); _assert_(M==num_independent_objects);
+	iomodel->FetchMultipleData(&control_sizes,&M,"md.autodiff.independent_control_size");                        _assert_(M==num_independent_objects);
 
 	for(int i=0;i<num_independent_objects;i++){
@@ -257,6 +247,6 @@
 			char* iofieldname  = NULL;
 			int   input_enum;
-			IssmDouble*  	independents_min			= NULL;
-			IssmDouble*	   independents_max			= NULL;
+			IssmDouble* independents_min = NULL;
+			IssmDouble*	independents_max = NULL;
 
 			FieldAndEnumFromCode(&input_enum,&iofieldname,names[i]);
@@ -264,6 +254,5 @@
 			/*Fetch required data*/
 			iomodel->FetchData(&independent,&M,&N,iofieldname);
-			_assert_(independent);
-			_assert_(N==control_sizes[i]);
+			_assert_(independent && N==control_sizes[i]);
 
 			independents_min = NULL; independents_min = xNew<IssmDouble>(M*N);
@@ -271,10 +260,9 @@
 			for(int m=0;m<M;m++){
 				for(int n=0;n<N;n++){
-					independents_min[N*m+n]=independents_fullmin[N_par*m+start_point[i]+n];
-					independents_max[N*m+n]=independents_fullmax[N_par*m+start_point[i]+n];
+					independents_min[N*m+n]=independents_fullmin[i][N*m+n];
+					independents_max[N*m+n]=independents_fullmax[i][N*m+n];
 				}
 			}
 			if(N!=1) M_all[i]=M-1;
-			else M_all[i]=M;
 
 			if(M_all[i]==iomodel->numberofvertices){
@@ -287,5 +275,4 @@
 				_error_("Control size not supported");
 			}
-			N_all[i] = N;
 
 			for(Object* & object : elements->objects){
@@ -318,7 +305,5 @@
 	xDelete<IssmDouble>(independents_fullmin);
 	xDelete<IssmDouble>(independents_fullmax);
-	xDelete<int>(start_point);
 	xDelete<int>(control_sizes);
-	/*Step2: create cost functions (dependents)*/
 
 	return;
Index: /issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp	(revision 27665)
+++ /issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp	(revision 27666)
@@ -26,4 +26,9 @@
 		const char* field = "md.materials.rheology_B";
 		input_enum        = MaterialsRheologyBEnum;
+		fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1));
+	}
+	else if(strcmp(string_in,"MaterialsRheologyN")==0){
+		const char* field = "md.materials.rheology_n";
+		input_enum        = MaterialsRheologyNEnum;
 		fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1));
 	}
Index: /issm/trunk-jpl/src/m/classes/autodiff.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/autodiff.m	(revision 27665)
+++ /issm/trunk-jpl/src/m/classes/autodiff.m	(revision 27666)
@@ -130,46 +130,12 @@
 			num_independent_objects=numel(self.independents);
 			WriteData(fid,prefix,'data',num_independent_objects,'name','md.autodiff.num_independent_objects','format','Integer');
-
-			if(num_independent_objects),
-				names=cell(num_independent_objects,1);
-				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};
-
-					names{i}=indep.name;
-					types(i)=indep.typetoscalar();
-					
-					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
-
-				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));
-
-				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);
-				WriteData(fid,prefix,'data',min_parameters,'name','md.autodiff.independent_min_parameters','format','DoubleMat','mattype',3);
-	         WriteData(fid,prefix,'data',max_parameters,'name','md.autodiff.independent_max_parameters','format','DoubleMat','mattype',3);
-	         WriteData(fid,prefix,'data',scaling_factors,'name','md.autodiff.independent_scaling_factors','format','IntMat','mattype',3);
-				WriteData(fid,prefix,'data',control_sizes,'name','md.autodiff.independent_control_sizes','format','IntMat','mattype',3);
-
+			for i=1:num_independent_objects
+				indep=self.independents{i};
+				WriteData(fid,prefix,'data',indep.name,'name','md.autodiff.independent_name','format','String');
+				WriteData(fid,prefix,'data',indep.typetoscalar(),'name','md.autodiff.independent_type','format','Integer');
+				WriteData(fid,prefix,'data',indep.min_parameters,'name','md.autodiff.independent_min_parameters','format','DoubleMat','mattype',3);
+				WriteData(fid,prefix,'data',indep.max_parameters,'name','md.autodiff.independent_max_parameters','format','DoubleMat','mattype',3);
+				WriteData(fid,prefix,'data',indep.control_scaling_factor,'name','md.autodiff.independent_scaling_factor','format','Double');
+				WriteData(fid,prefix,'data',indep.control_size,'name','md.autodiff.independent_control_size','format','Integer');
 			end
 			%}}}
