Index: /issm/trunk-jpl/src/c/EnumDefinitions/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/EnumDefinitions/EnumDefinitions.h	(revision 11274)
+++ /issm/trunk-jpl/src/c/EnumDefinitions/EnumDefinitions.h	(revision 11275)
@@ -71,4 +71,5 @@
 	InversionGradientScalingEnum,
 	InversionIscontrolEnum,
+	InversionTaoEnum,
 	InversionMaxParametersEnum,
 	InversionMaxiterPerStepEnum,
Index: /issm/trunk-jpl/src/c/modules/EnumToStringx/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/EnumToStringx/EnumToStringx.cpp	(revision 11274)
+++ /issm/trunk-jpl/src/c/modules/EnumToStringx/EnumToStringx.cpp	(revision 11275)
@@ -75,4 +75,5 @@
 		case InversionGradientScalingEnum : return "InversionGradientScaling";
 		case InversionIscontrolEnum : return "InversionIscontrol";
+		case InversionTaoEnum : return "InversionTao";
 		case InversionMaxParametersEnum : return "InversionMaxParameters";
 		case InversionMaxiterPerStepEnum : return "InversionMaxiterPerStep";
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 11274)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 11275)
@@ -84,4 +84,5 @@
 	parameters->AddObject(iomodel->CopyConstantObject(QmuIsdakotaEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(InversionIscontrolEnum));
+	parameters->AddObject(iomodel->CopyConstantObject(InversionTaoEnum));
 
 	/*some parameters that did not come with the iomodel: */
Index: /issm/trunk-jpl/src/c/modules/StringToEnumx/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/StringToEnumx/StringToEnumx.cpp	(revision 11274)
+++ /issm/trunk-jpl/src/c/modules/StringToEnumx/StringToEnumx.cpp	(revision 11275)
@@ -73,4 +73,5 @@
 	else if (strcmp(name,"InversionGradientScaling")==0) return InversionGradientScalingEnum;
 	else if (strcmp(name,"InversionIscontrol")==0) return InversionIscontrolEnum;
+	else if (strcmp(name,"InversionTao")==0) return InversionTaoEnum;
 	else if (strcmp(name,"InversionMaxParameters")==0) return InversionMaxParametersEnum;
 	else if (strcmp(name,"InversionMaxiterPerStep")==0) return InversionMaxiterPerStepEnum;
Index: /issm/trunk-jpl/src/c/solutions/controltao_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutions/controltao_core.cpp	(revision 11274)
+++ /issm/trunk-jpl/src/c/solutions/controltao_core.cpp	(revision 11275)
@@ -17,4 +17,5 @@
 
 /*Local prototype*/
+int FormFunction(TaoSolver tao,Vec,double *,void*);
 int FormFunctionGradient(TaoSolver tao,Vec,double *,Vec,void*);
 typedef struct {
@@ -39,13 +40,11 @@
 
 	/*Line search options*/
-	info = PetscOptionsSetValue("-tao_ls_stepmax","10e11"); if(info) _error_("STOP"); //does not work
-	info = PetscOptionsSetValue("-tao_ls_stepmin","10e5"); if(info) _error_("STOP");    //does not work
-	info = PetscOptionsSetValue("-tao_ls_maxfev","8"); if(info) _error_("STOP");
+	//info = PetscOptionsSetValue("-tao_ls_stepmax","10e11"); if(info) _error_("STOP"); //does not work
+	//info = PetscOptionsSetValue("-tao_ls_stepmin","10e5"); if(info) _error_("STOP");    //does not work
+	info = PetscOptionsSetValue("-tao_ls_maxfev","3"); if(info) _error_("STOP");
 	/*TAO options: http://www.mcs.anl.gov/research/projects/tao/docs/manualpages/solver/TaoSetFromOptions.html*/
 	info = PetscOptionsSetValue("-tao_monitor",""); if(info) _error_("STOP");
 	info = PetscOptionsSetValue("-tao_max_its","10"); if(info) _error_("STOP");
-	info = PetscOptionsSetValue("-tao_max_funcs","40"); if(info) _error_("STOP");
-
-
+	info = PetscOptionsSetValue("-tao_max_funcs","30"); if(info) _error_("STOP");
 
 	/*Additional options*/
@@ -58,12 +57,14 @@
 	GetVectorFromInputsx(&initial_solution,femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,MaterialsRheologyBbarEnum,VertexEnum);
 	info = TaoCreate(PETSC_COMM_WORLD,&tao); if(info) _error_("STOP");
-	info = TaoSetType(tao,"tao_blmvm"); if(info) _error_("STOP");
+	//info = TaoSetType(tao,"tao_blmvm"); if(info) _error_("STOP");
+	info = TaoSetType(tao,"tao_cg"); if(info) _error_("STOP");
 	info = TaoSetInitialVector(tao,initial_solution);  if(info) _error_("STOP");
+	info = TaoSetObjectiveRoutine(tao,FormFunction,(void*)&user);  if(info) _error_("STOP");
 	info = TaoSetObjectiveAndGradientRoutine(tao,FormFunctionGradient,(void*)&user);  if(info) _error_("STOP");
 	info = TaoSetFromOptions(tao);  if(info) _error_("STOP");
 	/* http://www.mcs.anl.gov/research/projects/tao/docs/manpages/taosolver/TaoSetTolerances.html*/
 	/*                          fatol, frtol, gatol, grtol, gttol*/
-	info = TaoSetTolerances(tao,10e-18,10e-18,10e-18,10e-18,10e-18);
-	info = TaoSolve(tao); //if(info) _error_("STOP");
+	info = TaoSetTolerances(tao,10e-18,10e-18,10e-18,10e-18,10e-18); if(info) _error_("STOP");
+	info = TaoSolve(tao); if(info) _error_("STOP");
 
 	/*Get solution status*/
@@ -96,4 +97,16 @@
 }
 
+int FormFunction(TaoSolver tao, Vec X, double *fcn,void *userCtx){
+	AppCtx   *user     = (AppCtx*)userCtx;
+	FemModel *femmodel = user->femmodel;
+
+	int costfunction=SurfaceAbsVelMisfitEnum;
+	femmodel->parameters->SetParam(&costfunction,1,1,StepResponsesEnum);
+	InputUpdateFromVectorx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,X,MaterialsRheologyBbarEnum,VertexEnum);
+	diagnostic_core(user->femmodel);
+	CostFunctionx(fcn, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters);
+	printf("f(x) = %g\n",*fcn);
+	return 0;
+}
 int FormFunctionGradient(TaoSolver tao, Vec X, double *fcn,Vec G,void *userCtx){
 
@@ -102,11 +115,4 @@
 	FemModel *femmodel = user->femmodel;
 	Vec       gradient = NULL;
-
-	/*Temp*/
-//	double*   Xserial=NULL;
-//	VecToMPISerial(&Xserial,X);
-//	printf("X= [%20.20g %20.20g %20.20g]\n",Xserial[0],Xserial[1],Xserial[2]);
-	/*End Temp*/
-
 
 	int costfunction=SurfaceAbsVelMisfitEnum;
@@ -120,11 +126,5 @@
 	CostFunctionx(fcn, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters);
 
-	//printf("X\n");
-	//VecView(X,PETSC_VIEWER_STDOUT_SELF);
-
-	//printf("Gradient\n");
-	//VecView(G,PETSC_VIEWER_STDOUT_SELF);
-
-	printf("f(x) = %g\n",*fcn);
+	printf("f2(x) = %g\n",*fcn);
 	return 0;
 }
Index: /issm/trunk-jpl/src/c/solutions/issm.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutions/issm.cpp	(revision 11274)
+++ /issm/trunk-jpl/src/c/solutions/issm.cpp	(revision 11275)
@@ -16,6 +16,5 @@
 	FILE *petscoptionsfid  = NULL;
 	bool  waitonlock       = false;
-	bool  dakota_analysis;
-	bool  control_analysis; 
+	bool  dakota_analysis,control_analysis,tao_analysis;
 
 	/*FemModel: */
@@ -81,7 +80,6 @@
 	femmodel->parameters->FindParam(&dakota_analysis,QmuIsdakotaEnum);
 	femmodel->parameters->FindParam(&control_analysis,InversionIscontrolEnum);
+	femmodel->parameters->FindParam(&tao_analysis,InversionTaoEnum);
 	MPI_Barrier(MPI_COMM_WORLD); finish_init=MPI_Wtime();
-
-	/*are we running the solution sequence, or a qmu wrapper around it? : */
 
 	_printf_(true,"call computational core:\n");
@@ -96,9 +94,8 @@
 	else if(control_analysis){
 		#ifdef _HAVE_CONTROL_
-		#ifdef _HAVE_TAO_
-		controltao_core(femmodel);
-		#else
-		control_core(femmodel);
-		#endif
+		if(tao_analysis)
+		 controltao_core(femmodel);
+		else
+		 control_core(femmodel);
 		#else
 		_error_("ISSM was not compiled with control support, cannot carry out dakota analysis!");
