Index: /issm/trunk-jpl/src/c/classes/ExternalResults/ExternalResult.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/ExternalResults/ExternalResult.h	(revision 16503)
+++ /issm/trunk-jpl/src/c/classes/ExternalResults/ExternalResult.h	(revision 16504)
@@ -23,10 +23,9 @@
 	public: 
 
-		virtual        ~ExternalResult(){};
-		/*Virtual functions:{{{*/
-		virtual void  WriteData(FILE* fid,bool io_gather)=0;
-		virtual char* GetResultName(void)=0;
-		virtual int   GetStep(void)=0;
-		/*}}}*/
+		virtual         ~ExternalResult(){};
+		virtual void   WriteData(FILE* fid,bool io_gather)=0;
+		virtual char*  GetResultName(void)=0;
+		virtual int    GetStep(void)=0;
+		virtual double GetValue(void)=0;
 };
 #endif
Index: /issm/trunk-jpl/src/c/classes/ExternalResults/GenericExternalResult.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/ExternalResults/GenericExternalResult.h	(revision 16503)
+++ /issm/trunk-jpl/src/c/classes/ExternalResults/GenericExternalResult.h	(revision 16504)
@@ -118,5 +118,5 @@
 
 		/*GenericExternalResult management: */
-void WriteData(FILE* fid,bool io_gather){ /*{{{*/
+void  WriteData(FILE* fid,bool io_gather){ /*{{{*/
 
 	int     my_rank;
@@ -150,6 +150,11 @@
 		return name;
 } /*}}}*/
-int GetStep(void){ /*{{{*/
+int   GetStep(void){ /*{{{*/
 	return this->step;
+} /*}}}*/
+IssmPDouble GetValue(void){ /*{{{*/
+	/*Only supported by IssmPDouble result, error out by default*/
+	_error_("not supported for this type of result");
+	return 0.;
 } /*}}}*/
 };
@@ -189,4 +194,7 @@
 template <> inline int GenericExternalResult<double>::ObjectEnum(void){ /*{{{*/
 	return DoubleExternalResultEnum;
+} /*}}}*/
+template <> inline double GenericExternalResult<double>::GetValue(void){ /*{{{*/
+	return value;
 } /*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 16503)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 16504)
@@ -591,4 +591,21 @@
 }
 /*}}}*/
+void FemModel::RequestedOutputsx(Results **presults,int* requested_outputs, int numoutputs){/*{{{*/
+
+	/*Convert list of enums to list of string*/
+	char** enumlist = xNew<char*>(numoutputs);
+	for(int i=0;i<numoutputs;i++){
+		EnumToStringx(&enumlist[i],requested_outputs[i]);
+	}
+
+	/*Call main module*/
+	this->RequestedOutputsx(presults,enumlist,numoutputs);
+
+	/*clean up and return*/
+	for(int i=0;i<numoutputs;i++) xDelete<char>(enumlist[i]);
+	xDelete<char*>(enumlist);
+	return;
+}
+/*}}}*/
 void FemModel::RequestedDependentsx(void){/*{{{*/
 
@@ -1134,9 +1151,7 @@
 
 	/*Intermediary*/
-	int num_responses;
-	int *responses = NULL;
-
-	/*output: */
-	IssmDouble J,Jplus;
+	int      num_responses;
+	int     *responses      = NULL;
+	Results *cost_functions = NULL;
 
 	/*Recover parameters*/
@@ -1144,15 +1159,20 @@
 	parameters->FindParam(&responses,NULL,InversionCostFunctionsEnum);
 
-	/*Get response*/
-	J=0;
-	//_printf_(true,"list of misfits: ");
+	/*Get the value of all cost functions*/
+	this->RequestedOutputsx(&cost_functions,responses,num_responses);
+
+	/*Add all contributions one by one*/
+	IssmDouble J=0;
+	//_printf0_("list of misfits: ");
 	for(int i=0;i<num_responses;i++){
-		this->Responsex(&Jplus,EnumToStringx(responses[i]));
-		//_printf_(true," %12.7g ",Jplus);
-		J+=Jplus;
-	}
-	//_printf_(true," \n");
+		ExternalResult* result=(ExternalResult*)cost_functions->GetObjectByOffset(i);
+		J += reCast<IssmDouble>(result->GetValue());
+		//_printf0_(J<<" ");
+	}
+	//_printf0_(" \n");
+	_assert_(cost_functions->Size()==num_responses);
 
 	/*Assign output pointers: */
+	delete cost_functions;
 	xDelete<int>(responses);
 	*pJ=J;
@@ -1203,4 +1223,7 @@
 		results->AddResult(new GenericExternalResult<Vector<IssmPDouble>*>(results->Size()+1,gradient_enum,vector_gradient,step,time));
 	}
+
+	/*Clean up and return*/
+	xDelete<int>(control_type);
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/FemModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 16503)
+++ /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 16504)
@@ -83,4 +83,5 @@
 		#endif
 		void RequestedOutputsx(Results **presults,char** requested_outputs, int numoutputs);
+		void RequestedOutputsx(Results **presults,int* requested_outputs, int numoutputs);
 		void RequestedDependentsx(void);
 		void Responsex(IssmDouble* presponse,int response_descriptor_enum);
