Index: /issm/trunk-jpl/src/c/EnumDefinitions/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/EnumDefinitions/EnumDefinitions.h	(revision 13437)
+++ /issm/trunk-jpl/src/c/EnumDefinitions/EnumDefinitions.h	(revision 13438)
@@ -152,4 +152,6 @@
 	PrognosticStabilizationEnum,
 	PrognosticVertexPairingEnum,
+	PrognosticNumRequestedOutputsEnum,
+	PrognosticRequestedOutputsEnum,
 	QmuIsdakotaEnum,
 	QmuMassFluxSegmentsEnum,
Index: /issm/trunk-jpl/src/c/classes/IoModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 13437)
+++ /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 13438)
@@ -92,5 +92,5 @@
 	xDelete<IssmDouble*>(this->data);
 	xDelete<bool>(this->independents);
-	delete this->independent_objects;
+	if(this->independent_objects)delete this->independent_objects;
 	xDelete<bool>(this->my_elements);
 	xDelete<bool>(this->my_nodes);
@@ -252,4 +252,6 @@
 		#endif
 	}
+	else this->independent_objects=NULL;
+
 
 }
Index: /issm/trunk-jpl/src/c/modules/EnumToStringx/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/EnumToStringx/EnumToStringx.cpp	(revision 13437)
+++ /issm/trunk-jpl/src/c/modules/EnumToStringx/EnumToStringx.cpp	(revision 13438)
@@ -157,4 +157,6 @@
 		case PrognosticStabilizationEnum : return "PrognosticStabilization";
 		case PrognosticVertexPairingEnum : return "PrognosticVertexPairing";
+		case PrognosticNumRequestedOutputsEnum : return "PrognosticNumRequestedOutputs";
+		case PrognosticRequestedOutputsEnum : return "PrognosticRequestedOutputs";
 		case QmuIsdakotaEnum : return "QmuIsdakota";
 		case QmuMassFluxSegmentsEnum : return "QmuMassFluxSegments";
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 13437)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 13438)
@@ -127,8 +127,10 @@
 	if(numoutputs)parameters->AddObject(new IntVecParam(DiagnosticRequestedOutputsEnum,requestedoutputs,numoutputs));
 	iomodel->DeleteData(requestedoutputs,DiagnosticRequestedOutputsEnum);
+
 	iomodel->FetchData(&requestedoutputs,&numoutputs,NULL,TransientRequestedOutputsEnum);
 	parameters->AddObject(new IntParam(TransientNumRequestedOutputsEnum,numoutputs));
 	if(numoutputs)parameters->AddObject(new IntVecParam(TransientRequestedOutputsEnum,requestedoutputs,numoutputs));
 	iomodel->DeleteData(requestedoutputs,TransientRequestedOutputsEnum);
+
 	iomodel->FetchData(&requestedoutputs,&numoutputs,NULL,SteadystateRequestedOutputsEnum);
 	parameters->AddObject(new IntParam(SteadystateNumRequestedOutputsEnum,numoutputs));
@@ -136,4 +138,9 @@
 	iomodel->DeleteData(requestedoutputs,SteadystateRequestedOutputsEnum);
 	
+	iomodel->FetchData(&requestedoutputs,&numoutputs,NULL,PrognosticRequestedOutputsEnum);
+	parameters->AddObject(new IntParam(PrognosticNumRequestedOutputsEnum,numoutputs));
+	if(numoutputs)parameters->AddObject(new IntVecParam(PrognosticRequestedOutputsEnum,requestedoutputs,numoutputs));
+	iomodel->DeleteData(requestedoutputs,PrognosticRequestedOutputsEnum);
+
 	/*Before returning, create parameters in case we are running Qmu or control types runs: */
 	#ifdef _HAVE_CONTROL_
Index: /issm/trunk-jpl/src/c/modules/StringToEnumx/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/StringToEnumx/StringToEnumx.cpp	(revision 13437)
+++ /issm/trunk-jpl/src/c/modules/StringToEnumx/StringToEnumx.cpp	(revision 13438)
@@ -161,4 +161,6 @@
 	      else if (strcmp(name,"PrognosticStabilization")==0) return PrognosticStabilizationEnum;
 	      else if (strcmp(name,"PrognosticVertexPairing")==0) return PrognosticVertexPairingEnum;
+	      else if (strcmp(name,"PrognosticNumRequestedOutputs")==0) return PrognosticNumRequestedOutputsEnum;
+	      else if (strcmp(name,"PrognosticRequestedOutputs")==0) return PrognosticRequestedOutputsEnum;
 	      else if (strcmp(name,"QmuIsdakota")==0) return QmuIsdakotaEnum;
 	      else if (strcmp(name,"QmuMassFluxSegments")==0) return QmuMassFluxSegmentsEnum;
@@ -259,10 +261,10 @@
 	      else if (strcmp(name,"Approximation")==0) return ApproximationEnum;
 	      else if (strcmp(name,"NoneApproximation")==0) return NoneApproximationEnum;
-	      else if (strcmp(name,"HutterApproximation")==0) return HutterApproximationEnum;
-	      else if (strcmp(name,"MacAyealApproximation")==0) return MacAyealApproximationEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"MacAyealPattynApproximation")==0) return MacAyealPattynApproximationEnum;
+	      if (strcmp(name,"HutterApproximation")==0) return HutterApproximationEnum;
+	      else if (strcmp(name,"MacAyealApproximation")==0) return MacAyealApproximationEnum;
+	      else if (strcmp(name,"MacAyealPattynApproximation")==0) return MacAyealPattynApproximationEnum;
 	      else if (strcmp(name,"MacAyealStokesApproximation")==0) return MacAyealStokesApproximationEnum;
 	      else if (strcmp(name,"L1L2Approximation")==0) return L1L2ApproximationEnum;
@@ -382,10 +384,10 @@
 	      else if (strcmp(name,"TemperaturePicard")==0) return TemperaturePicardEnum;
 	      else if (strcmp(name,"TemperatureSurface")==0) return TemperatureSurfaceEnum;
-	      else if (strcmp(name,"TemperatureBasal")==0) return TemperatureBasalEnum;
-	      else if (strcmp(name,"ThicknessAbsMisfit")==0) return ThicknessAbsMisfitEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"Type")==0) return TypeEnum;
+	      if (strcmp(name,"TemperatureBasal")==0) return TemperatureBasalEnum;
+	      else if (strcmp(name,"ThicknessAbsMisfit")==0) return ThicknessAbsMisfitEnum;
+	      else if (strcmp(name,"Type")==0) return TypeEnum;
 	      else if (strcmp(name,"Vel")==0) return VelEnum;
 	      else if (strcmp(name,"Velocity")==0) return VelocityEnum;
@@ -505,10 +507,10 @@
 	      else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
 	      else if (strcmp(name,"OptionCell")==0) return OptionCellEnum;
-	      else if (strcmp(name,"OptionChar")==0) return OptionCharEnum;
-	      else if (strcmp(name,"OptionStruct")==0) return OptionStructEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"OptionDouble")==0) return OptionDoubleEnum;
+	      if (strcmp(name,"OptionChar")==0) return OptionCharEnum;
+	      else if (strcmp(name,"OptionStruct")==0) return OptionStructEnum;
+	      else if (strcmp(name,"OptionDouble")==0) return OptionDoubleEnum;
 	      else if (strcmp(name,"OptionLogical")==0) return OptionLogicalEnum;
 	      else if (strcmp(name,"Paterson")==0) return PatersonEnum;
Index: /issm/trunk-jpl/src/c/solutions/diagnostic_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutions/diagnostic_core.cpp	(revision 13437)
+++ /issm/trunk-jpl/src/c/solutions/diagnostic_core.cpp	(revision 13438)
@@ -105,4 +105,6 @@
 		RequestedOutputsx(femmodel->results,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,requested_outputs,numoutputs);
 	}
+	
+	if(solution_type==DiagnosticSolutionEnum)RequestedDependentsx(femmodel->results,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
 
 	/*Free ressources:*/
Index: /issm/trunk-jpl/src/c/solutions/prognostic_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutions/prognostic_core.cpp	(revision 13437)
+++ /issm/trunk-jpl/src/c/solutions/prognostic_core.cpp	(revision 13438)
@@ -18,4 +18,6 @@
 	bool issmbgradients,ispdd,isdelta18o;
 	int  solution_type;
+	int  *requested_outputs = NULL;
+	int  numoutputs=0;
 
 	/*activate formulation: */
@@ -28,4 +30,6 @@
 	femmodel->parameters->FindParam(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
 	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
+	femmodel->parameters->FindParam(&numoutputs,PrognosticNumRequestedOutputsEnum);
+	if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,PrognosticRequestedOutputsEnum);
 
 	if(issmbgradients){
@@ -47,7 +51,10 @@
 		if(VerboseSolution()) _pprintLine_("   saving results");
 		InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,ThicknessEnum);
+		RequestedOutputsx(femmodel->results,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,requested_outputs,numoutputs);
 	}
 	
+	if(solution_type==PrognosticSolutionEnum)RequestedDependentsx(femmodel->results,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
 	
-	if(solution_type==PrognosticSolutionEnum)RequestedDependentsx(femmodel->results,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
+	/*Free ressources:*/
+	xDelete<int>(requested_outputs);
 }
Index: /issm/trunk-jpl/src/m/classes/prognostic.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/prognostic.m	(revision 13437)
+++ /issm/trunk-jpl/src/m/classes/prognostic.m	(revision 13438)
@@ -12,4 +12,5 @@
 		 vertex_pairing         = NaN;
 		 penalty_factor         = 0;
+		 requested_outputs       = NaN;
 	end
 	methods
@@ -45,4 +46,8 @@
 			md = checkfield(md,'prognostic.stabilization','values',[0 1 2 3]);
 			md = checkfield(md,'prognostic.min_thickness','>',0);
+			if ~isempty(md.prognostic.requested_outputs),
+				md = checkfield(md,'prognostic.requested_outputs','size',[NaN 1]);
+			end
+
 
 		end % }}}
@@ -57,4 +62,5 @@
 			fielddisplay(obj,'penalty_factor','offset used by penalties: penalty = Kmax*10^offset');
 			fielddisplay(obj,'vertex_pairing','pairs of vertices that are penalized');
+			fielddisplay(obj,'requested_outputs','additional outputs requested');
 
 		end % }}}
@@ -66,4 +72,5 @@
 			WriteData(fid,'object',obj,'fieldname','vertex_pairing','format','DoubleMat','mattype',3);
 			WriteData(fid,'object',obj,'fieldname','penalty_factor','format','Double');
+			WriteData(fid,'object',obj,'fieldname','requested_outputs','format','DoubleMat','mattype',3);
 		end % }}}
 	end
Index: /issm/trunk-jpl/src/m/enum/EnumDefinitions.py
===================================================================
--- /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 13437)
+++ /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 13438)
@@ -1409,4 +1409,24 @@
 	return StringToEnum('PrognosticVertexPairing')[0]
 
+def PrognosticNumRequestedOutputsEnum():
+	"""
+	PROGNOSTICNUMREQUESTEDOUTPUTSENUM - Enum of PrognosticNumRequestedOutputs
+
+	   Usage:
+	      macro=PrognosticNumRequestedOutputsEnum()
+	"""
+
+	return StringToEnum('PrognosticNumRequestedOutputs')[0]
+
+def PrognosticRequestedOutputsEnum():
+	"""
+	PROGNOSTICREQUESTEDOUTPUTSENUM - Enum of PrognosticRequestedOutputs
+
+	   Usage:
+	      macro=PrognosticRequestedOutputsEnum()
+	"""
+
+	return StringToEnum('PrognosticRequestedOutputs')[0]
+
 def QmuIsdakotaEnum():
 	"""
@@ -4857,4 +4877,4 @@
 	"""
 
-	return 484
-
+	return 486
+
Index: /issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m	(revision 13437)
+++ /issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m	(revision 13438)
@@ -9,3 +9,3 @@
 %      macro=MaximumNumberOfEnums()
 
-macro=484;
+macro=486;
Index: /issm/trunk-jpl/src/m/enum/PrognosticNumRequestedOutputsEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/PrognosticNumRequestedOutputsEnum.m	(revision 13438)
+++ /issm/trunk-jpl/src/m/enum/PrognosticNumRequestedOutputsEnum.m	(revision 13438)
@@ -0,0 +1,11 @@
+function macro=PrognosticNumRequestedOutputsEnum()
+%PROGNOSTICNUMREQUESTEDOUTPUTSENUM - Enum of PrognosticNumRequestedOutputs
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/EnumDefinitions/Synchronize.sh
+%            Please read src/c/EnumDefinitions/README for more information
+%
+%   Usage:
+%      macro=PrognosticNumRequestedOutputsEnum()
+
+macro=StringToEnum('PrognosticNumRequestedOutputs');
Index: /issm/trunk-jpl/src/m/enum/PrognosticRequestedOutputsEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/PrognosticRequestedOutputsEnum.m	(revision 13438)
+++ /issm/trunk-jpl/src/m/enum/PrognosticRequestedOutputsEnum.m	(revision 13438)
@@ -0,0 +1,11 @@
+function macro=PrognosticRequestedOutputsEnum()
+%PROGNOSTICREQUESTEDOUTPUTSENUM - Enum of PrognosticRequestedOutputs
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/EnumDefinitions/Synchronize.sh
+%            Please read src/c/EnumDefinitions/README for more information
+%
+%   Usage:
+%      macro=PrognosticRequestedOutputsEnum()
+
+macro=StringToEnum('PrognosticRequestedOutputs');
Index: /issm/trunk-jpl/test/NightlyRun/ad.m
===================================================================
--- /issm/trunk-jpl/test/NightlyRun/ad.m	(revision 13437)
+++ /issm/trunk-jpl/test/NightlyRun/ad.m	(revision 13438)
@@ -4,11 +4,9 @@
 md=setflowequation(md,'macayeal','all');
 md.cluster=generic('name',oshostname(),'np',3);
-md.diagnostic.requested_outputs=StressTensorEnum;
+
 md.autodiff.isautodiff=true;
-md.verbose=verbose('autodiff',true);
-
+index=1;
 md.autodiff.independents={...
-	independent('name','Thickness','type','vertex','nods',md.mesh.numberofvertices,'fos_forward_index',1), ...
-	independent('name','Surface','type','vertex','nods',md.mesh.numberofvertices)...
+	independent('name','Thickness','type','vertex','nods',md.mesh.numberofvertices,'fos_forward_index',index)
 	};
 
@@ -18,4 +16,3 @@
 md.autodiff.driver='fos_forward';
 
-md=solve(md,PrognosticSolutionEnum);
-%md=solve(md,TransientSolutionEnum);
+md=solve(md,TransientSolutionEnum);
Index: /issm/trunk-jpl/test/NightlyRun/runme.m
===================================================================
--- /issm/trunk-jpl/test/NightlyRun/runme.m	(revision 13437)
+++ /issm/trunk-jpl/test/NightlyRun/runme.m	(revision 13438)
@@ -106,5 +106,5 @@
 	test_ids=intersect(test_ids,[1401:1499]);
 elseif strcmpi(benchmark,'adolc'),
-	test_ids=intersect(test_ids,[3001:3010]);
+	test_ids=intersect(test_ids,[3001:3020]);
 elseif strcmpi(benchmark,'validation'),
 	test_ids=intersect(test_ids,[1001:1999]);
Index: /issm/trunk-jpl/test/NightlyRun/test3015.m
===================================================================
--- /issm/trunk-jpl/test/NightlyRun/test3015.m	(revision 13438)
+++ /issm/trunk-jpl/test/NightlyRun/test3015.m	(revision 13438)
@@ -0,0 +1,77 @@
+%This test runs test3005 with autodiff on, and checks that 
+%the value of the scalar forward difference match a step-wise differential
+
+%First configure
+md=triangle(model,'../Exp/Square.exp',50000);
+md=setmask(md,'all','');
+md=parameterize(md,'../Par/SquareShelfConstrained.par');
+md=setflowequation(md,'macayeal','all');
+md.cluster=generic('name',oshostname(),'np',3);
+md.prognostic.requested_outputs=IceVolumeEnum;
+md.verbose=verbose('autodiff',true);
+
+%setup autodiff parameters
+index=1; %this is the scalar component we are checking against
+md.autodiff.independents={...
+	independent('name','Thickness','type','vertex','nods',md.mesh.numberofvertices,'fos_forward_index',index)
+	};
+
+md.autodiff.dependents={...
+	dependent('name','IceVolume','type','scalar')...
+	};
+md.autodiff.driver='fos_forward';
+
+%parameters for the step-wise devivative
+delta=.001;
+h1=md.geometry.thickness(index);
+h0=h1*(1-delta);
+h2=h1*(1+delta);
+deltaH=(h2-h0);
+
+%save model:
+md2=md;
+
+%evaluate derivative by forward and backward stepping 
+%forward
+md=md2;
+md.autodiff.isautodiff=false;
+md.geometry.thickness(index)=h0;
+md.geometry.bed=-md.materials.rho_ice/md.materials.rho_water*md.geometry.thickness;
+md.geometry.surface=md.geometry.bed+md.geometry.thickness;
+md=SetIceShelfBC(md);
+
+md=solve(md,PrognosticSolutionEnum);
+V0=md.results.PrognosticSolution.IceVolume;
+
+%backward
+md=md2;
+md.autodiff.isautodiff=false;
+md.geometry.thickness(index)=h2;
+md.geometry.bed=-md.materials.rho_ice/md.materials.rho_water*md.geometry.thickness;
+md.geometry.surface=md.geometry.bed+md.geometry.thickness;
+md=SetIceShelfBC(md);
+
+md=solve(md,PrognosticSolutionEnum);
+V2=md.results.PrognosticSolution.IceVolume;
+
+%compute resulting derivative
+dVdh_an=(V2-V0)/deltaH;
+
+%evaluate derivative using ADOLC 
+md=md2;
+md.autodiff.isautodiff=true;
+md.geometry.thickness(index)=h1;
+md.geometry.bed=-md.materials.rho_ice/md.materials.rho_water*md.geometry.thickness;
+md.geometry.surface=md.geometry.bed+md.geometry.thickness;
+md=SetIceShelfBC(md);
+
+md=solve(md,PrognosticSolutionEnum);
+%retrieve directly
+dVdh_ad=md.results.PrognosticSolution.AutodiffJacobian;
+
+disp(sprintf('dV/dh: analytical:  %16.16g\n       using adolc:  %16.16g\n',dVdh_an,dVdh_ad));
+
+%Fields and tolerances to track changes
+field_names     ={'dV/dh-dV/dh0'};
+field_tolerances={1e-1};
+field_values={dVdh_ad-dVdh_an};
