Index: /issm/trunk-jpl/src/c/cores/stressbalance_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/stressbalance_core.cpp	(revision 22585)
+++ /issm/trunk-jpl/src/c/cores/stressbalance_core.cpp	(revision 22586)
@@ -14,5 +14,5 @@
 
 	/*parameters: */
-	bool       dakota_analysis;
+	bool       dakota_analysis,control_analysis;
 	int        domaintype;
 	bool       isSIA,isSSA,isL1L2,isHO,isFS;
@@ -34,4 +34,5 @@
 	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
 	femmodel->parameters->FindParam(&numoutputs,StressbalanceNumRequestedOutputsEnum);
+	femmodel->parameters->FindParam(&control_analysis,InversionIscontrolEnum);
 	if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,StressbalanceRequestedOutputsEnum);
 	
@@ -79,6 +80,6 @@
 		femmodel->RequestedOutputsx(&femmodel->results,requested_outputs,numoutputs);
 	}
-
-	if(solution_type==StressbalanceSolutionEnum)femmodel->RequestedDependentsx();
+	
+	if(solution_type==StressbalanceSolutionEnum && !control_analysis)femmodel->RequestedDependentsx();
 
 	/*Free ressources:*/	
Index: /issm/trunk-jpl/src/c/cores/transient_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 22585)
+++ /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 22586)
@@ -20,6 +20,6 @@
 
 	/*parameters: */
-	IssmDouble finaltime,dt,yts;
-	bool       isstressbalance,ismasstransport,issmb,isFS,isthermal,isgroundingline,isgia,isslr,iscoupler,ismovingfront,isdamageevolution,ishydrology,isoceancoupling;
+	IssmDouble finaltime,dt,yts,starttime;
+	bool       isstressbalance,ismasstransport,issmb,isFS,isthermal,isgroundingline,isgia,isslr,iscoupler,ismovingfront,isdamageevolution,ishydrology,isoceancoupling,iscontrol,isautodiff;
 	bool       save_results,dakota_analysis;
 	int        timestepping;
@@ -44,4 +44,5 @@
 	femmodel->parameters->FindParam(&time,TimeEnum);
 	femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
+	femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
 	femmodel->parameters->FindParam(&yts,ConstantsYtsEnum);
 	femmodel->parameters->FindParam(&dakota_analysis,QmuIsdakotaEnum);
@@ -62,4 +63,6 @@
 	femmodel->parameters->FindParam(&amr_frequency,TransientAmrFrequencyEnum);
 	femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum);
+	femmodel->parameters->FindParam(&iscontrol,InversionIscontrolEnum);
+	femmodel->parameters->FindParam(&isautodiff,AutodiffIsautodiffEnum);
 	if(isgroundingline) femmodel->parameters->FindParam(&groundingline_migration,GroundinglineMigrationEnum);
 	femmodel->parameters->FindParam(&numoutputs,TransientNumRequestedOutputsEnum);
@@ -118,4 +121,20 @@
 	}
 
+		IssmDouble  output_value;
+		int         num_dependents;
+		IssmPDouble *dependents;
+		DataSet*    dependent_objects=NULL;
+		IssmDouble  J=0.;
+
+	if(iscontrol && isautodiff){
+
+		femmodel->parameters->SetParam(starttime,TimeEnum);
+		femmodel->parameters->FindParam(&num_dependents,AutodiffNumDependentsEnum);
+		femmodel->parameters->FindParam(&dependent_objects,AutodiffDependentObjectsEnum);
+
+		/*Go through our dependent variables, and compute the response:*/
+		dependents=xNew<IssmPDouble>(num_dependents);
+	}
+
 	while(time < finaltime - (yts*DBL_EPSILON)){ //make sure we run up to finaltime.
 
@@ -241,7 +260,17 @@
 			#endif
 		}
+
+		if (iscontrol && isautodiff) {
+			/*Go through our dependent variables, and compute the response:*/
+			for(int i=0;i<dependent_objects->Size();i++){
+				DependentObject* dep=(DependentObject*)dependent_objects->GetObjectByOffset(i);
+				 dep->Responsex(&output_value,femmodel);
+				 dep->AddValue(output_value);
+				}
+			}
 	}
 	
-	femmodel->RequestedDependentsx();
+	if(!iscontrol || !isautodiff) femmodel->RequestedDependentsx();
+	femmodel->parameters->SetParam(dependent_objects,AutodiffDependentObjectsEnum);
 
 	/*Free ressources:*/	
