diff --git a/src/FollowUp/Nomad/FStatNomad.cpp b/src/FollowUp/Nomad/FStatNomad.cpp
index 8e6d7cf0434a76798832e58f088756c092600bcd..372950129921b660c975ef708b86a34bab6ee4db 100644
--- a/src/FollowUp/Nomad/FStatNomad.cpp
+++ b/src/FollowUp/Nomad/FStatNomad.cpp
@@ -1077,8 +1077,8 @@ int main(int argc, char *argv[]) {
             MFCSearch->write_dts_file();
         }
 
-        if (MFCSearch->HybridSearch()) {
-			MFCSearch->HybridSearchCreateLattice(MFCSearch->Cohmetric(),MFCSearch->HybridSearchMismatch(),MFCSearch->HybridSearchLattice());
+        if (MFCSearch->FinalHybridSearch()) {
+			MFCSearch->HybridSearchCreateLattice(MFCSearch->Cohmetric(),MFCSearch->FinalHybridSearchMismatch(),MFCSearch->FinalHybridSearchLattice());
 		}
 		
         if (MFCSearch->FinalMinMeshCoarseningExponent() != 0 && MFCSearch->FinalMaxMeshCoarseningExponent() != 0) {
@@ -1360,6 +1360,13 @@ INT4 FCSearch::XLALInitUserVars ( int argc, char *argv[] )
     strcpy(uvar->HybridSearchLattice, "an-star");
 	uvar->HybridSearchPoints = 16;
 
+	uvar->FinalHybridSearch = FALSE;
+	uvar->FinalHybridSearchMismatch = 0.8;
+	uvar->FinalHybridSearchLattice = (char*)LALCalloc( 16, sizeof(CHAR) );
+    strcpy(uvar->FinalHybridSearchLattice, "an-star");
+	uvar->FinalHybridSearchPoints = 16;
+	
+	
 	uvar->metricType = MTAVFSTAT;
 
     SignalIsKnown = FALSE;
@@ -1521,6 +1528,10 @@ INT4 FCSearch::XLALInitUserVars ( int argc, char *argv[] )
 	XLALRegisterUvarMember( HybridSearchMismatch,REAL8, 0, OPTIONAL, "Hybrid search maximal mismatch");
 	XLALRegisterUvarMember( HybridSearchLattice,STRING, 0, OPTIONAL, "Hybrid search lattice type: 'an-star' or 'cubic'");
 	XLALRegisterUvarMember( HybridSearchPoints,INT4, 0, OPTIONAL, "Hybrid search number of points");
+	XLALRegisterUvarMember( FinalHybridSearch,BOOLEAN, 0, OPTIONAL, "Final do hybrid search (grid search in the Nomad search step)");
+	XLALRegisterUvarMember( FinalHybridSearchMismatch,REAL8, 0, OPTIONAL, "Final hybrid search maximal mismatch");
+	XLALRegisterUvarMember( FinalHybridSearchLattice,STRING, 0, OPTIONAL, "Final hybrid search lattice type: 'an-star' or 'cubic'");
+	XLALRegisterUvarMember( FinalHybridSearchPoints,INT4, 0, OPTIONAL, "Final hybrid search number of points");
 	XLALRegisterUvarMember( metricType, INT4, 0, OPTIONAL, "Type of metric to compute: 0=phase-metric, 1=average F-metric");
 
   /* read cmdline & cfgfile  */
@@ -1961,6 +1972,11 @@ INT4 FCSearch::XLALInitUserVars ( int argc, char *argv[] )
 	HybridSearchLattice(uvar->HybridSearchLattice);
 	HybridSearchPoints(uvar->HybridSearchPoints);
 
+	FinalHybridSearch(uvar->FinalHybridSearch);
+	FinalHybridSearchMismatch(uvar->FinalHybridSearchMismatch);
+	FinalHybridSearchLattice(uvar->FinalHybridSearchLattice);
+	FinalHybridSearchPoints(uvar->FinalHybridSearchPoints);
+
 	dopplermax(uvar->dopplermax);
 
     if ( uvar->ComputeDTS && uvar->FStatSearchType == CHSEARCH ) {
diff --git a/src/FollowUp/Nomad/FStatNomad.h b/src/FollowUp/Nomad/FStatNomad.h
index 9c85fcfc568234988b2a424d45b597824cce1aab..0519cc20c428fb1e406f452e8fe2d375b2545be3 100644
--- a/src/FollowUp/Nomad/FStatNomad.h
+++ b/src/FollowUp/Nomad/FStatNomad.h
@@ -174,6 +174,10 @@ extern "C" {
 		REAL8 HybridSearchMismatch;
 		CHAR *HybridSearchLattice;
 		INT4 HybridSearchPoints;
+		BOOLEAN FinalHybridSearch;
+		REAL8 FinalHybridSearchMismatch;
+		CHAR *FinalHybridSearchLattice;
+		INT4 FinalHybridSearchPoints;
 		
 		INT4 metricType;
 		
diff --git a/src/FollowUp/Nomad/libFStatNomad.cpp b/src/FollowUp/Nomad/libFStatNomad.cpp
index 778d383b616ada9750cf4751a1fb80fd36399fdf..1bf2f76119933434c1c63d9aa3f08129839bd327 100644
--- a/src/FollowUp/Nomad/libFStatNomad.cpp
+++ b/src/FollowUp/Nomad/libFStatNomad.cpp
@@ -3020,10 +3020,10 @@ INT4 FStatNomad::DoSearch(Display out,vector<ExPoint> &epv,INT4 fstatsearchtype,
 					mads.set_user_search ( &hybrid_search );
 				}				
 
-				if (HybridSearch()){
+				if (FinalHybridSearch()){
 					FCHybridSearch *hybrid_search = new FCHybridSearch ( p );
 					hybrid_search->Tiling(tiling);
- 					hybrid_search->NumberPoints(var_HybridSearchPoints);
+ 					hybrid_search->NumberPoints(var_FinalHybridSearchPoints);
 					hybrid_search->Directions(directions);
 					printf("SET HYBRID SEARCH\n");
 					mads.set_user_search ( hybrid_search );
@@ -3342,7 +3342,7 @@ XLALGetDetectorIDs(
 } /* XLALGetDetectorIDs() */
 
 void SCHybridSearch::search( Mads & mads, int &nb_search_pts, bool &stop, stop_type &stop_reason, success_type &success, bool &count_search, const Eval_Point *& new_feas_inc, const Eval_Point *& new_infeas_inc){
-// 	printf("ENTER HYBRID SEARCH!\n");
+
     new_feas_inc  = new_infeas_inc = NULL;
     nb_search_pts = 0;
     success       = UNSUCCESSFUL;
@@ -3407,13 +3407,11 @@ void SCHybridSearch::search( Mads & mads, int &nb_search_pts, bool &stop, stop_t
    LatticeTilingLocator *tloc = XLALCreateLatticeTilingLocator(tiling);
    const UINT8 total = XLALTotalLatticeTilingPoints( itr );
    
-// printf("TLOC CREATED, n=%d.\n",n);	
 	gsl_matrix *points = gsl_matrix_calloc(n,1);
 	for (INT4 i = 0; i < n; i++){
-// 		printf("%d:%.16f\n",i,(*x)[i].value()/directions.at(i).scale);
 		gsl_matrix_set(points,i,0,(*x)[i].value()/directions.at(i).scale);
 	}
-// 	printf("MATRIX SET DONE.\n");
+
 	gsl_matrix *nearest_points = NULL;
 	
 	gsl_matrix *GAMAT( nearest_points, n, np );
@@ -3433,8 +3431,6 @@ void SCHybridSearch::search( Mads & mads, int &nb_search_pts, bool &stop, stop_t
 	
 	XLALNearestLatticeTilingPoints (tloc, points, &nearest_points, NULL);
 
-// 	printf("NEAREST POINTS\n");
-
   Evaluator_Control & ev_control = mads.get_evaluator_control();
 	
 	for (INT4 i = 0; i < nearest_points->size2; i++) {
@@ -3448,32 +3444,14 @@ void SCHybridSearch::search( Mads & mads, int &nb_search_pts, bool &stop, stop_t
 		
 	for (INT4 j = 0; j < n; j++) {
 		(*tk)[j] = (directions.at(j).scale * gsl_vector_get(cv,j));
-// 		printf("%.16f\t",gsl_vector_get(cv,j));
 	}
-// 	printf("\n");
 
+  ev_control.add_eval_point ( tk, _p.out().get_search_dd(), false, Double(), Double(), Double(), Double());
 
-  ev_control.add_eval_point ( tk                       ,
-			      _p.out().get_search_dd() ,
-			      false                    ,
-			      Double()                 ,
-			      Double()                  ,
-				  Double()                 ,
-				  Double()                 );
-
-	
+	gsl_matrix_free(points);
+	gsl_matrix_free(nearest_points);
 	gsl_vector_free(cv);
-	}
-
-	
-	
-// 	printf("EXIT HYBRID SEARCH\n");
-	
-
-	// Evaluator_Control:
-
-
-  // add the new point to the ordered list of search trial points:
+}
 
   nb_search_pts = 1;
 
@@ -3494,7 +3472,7 @@ void SCHybridSearch::search( Mads & mads, int &nb_search_pts, bool &stop, stop_t
 }
 
 void FCHybridSearch::search ( Mads &mads, int &nb_search_pts, bool &stop, stop_type &stop_reason, success_type &success, bool &count_search   , const Eval_Point *& new_feas_inc, const Eval_Point *& new_infeas_inc   ) {
-// 	printf("ENTER HYBRID SEARCH!\n");
+
     new_feas_inc  = new_infeas_inc = NULL;
     nb_search_pts = 0;
     success       = UNSUCCESSFUL;
@@ -3559,13 +3537,12 @@ void FCHybridSearch::search ( Mads &mads, int &nb_search_pts, bool &stop, stop_t
    LatticeTilingLocator *tloc = XLALCreateLatticeTilingLocator(tiling);
    const UINT8 total = XLALTotalLatticeTilingPoints( itr );
    
-// printf("TLOC CREATED, n=%d.\n",n);	
+
 	gsl_matrix *points = gsl_matrix_calloc(n,1);
 	for (INT4 i = 0; i < n; i++){
-// 		printf("%d:%.16f\n",i,(*x)[i].value()/directions.at(i).scale);
 		gsl_matrix_set(points,i,0,(*x)[i].value()/directions.at(i).scale);
 	}
-// 	printf("MATRIX SET DONE.\n");
+
 	gsl_matrix *nearest_points = NULL;
 	
 	gsl_matrix *GAMAT( nearest_points, n, np );
@@ -3585,8 +3562,6 @@ void FCHybridSearch::search ( Mads &mads, int &nb_search_pts, bool &stop, stop_t
 	
 	XLALNearestLatticeTilingPoints (tloc, points, &nearest_points, NULL);
 
-// 	printf("NEAREST POINTS\n");
-
   Evaluator_Control & ev_control = mads.get_evaluator_control();
 	
 	for (INT4 i = 0; i < nearest_points->size2; i++) {
@@ -3600,46 +3575,19 @@ void FCHybridSearch::search ( Mads &mads, int &nb_search_pts, bool &stop, stop_t
 		
 	for (INT4 j = 0; j < n; j++) {
 		(*tk)[j] = (directions.at(j).scale * gsl_vector_get(cv,j));
-// 		printf("%.16f\t",gsl_vector_get(cv,j));
 	}
-// 	printf("\n");
 
+  ev_control.add_eval_point ( tk, _p.out().get_search_dd(), false, Double(), Double(), Double(), Double());
 
-  ev_control.add_eval_point ( tk                       ,
-			      _p.out().get_search_dd() ,
-			      false                    ,
-			      Double()                 ,
-			      Double()                  ,
-				  Double()                 ,
-				  Double()                 );
-
-	
+	gsl_matrix_free(points);
+	gsl_matrix_free(nearest_points);
 	gsl_vector_free(cv);
 	}
 
-	
-	
-// 	printf("EXIT HYBRID SEARCH\n");
-	
-
-	// Evaluator_Control:
-
-
-  // add the new point to the ordered list of search trial points:
-
   nb_search_pts = 1;
 
-  // evaluation:
   new_feas_inc = new_infeas_inc = NULL;
-  ev_control.eval_list_of_points ( _type                   ,
-				   mads.get_true_barrier() ,
-				   mads.get_sgte_barrier() ,
-				   mads.get_pareto_front() ,
-				   stop                    ,
-				   stop_reason             ,
-				   new_feas_inc            ,
-				   new_infeas_inc          ,
-				   success                   );
+  ev_control.eval_list_of_points ( _type, mads.get_true_barrier(), mads.get_sgte_barrier(), mads.get_pareto_front(), stop, stop_reason, new_feas_inc, new_infeas_inc, success);
 
 }
 
diff --git a/src/FollowUp/Nomad/libFStatNomad.h b/src/FollowUp/Nomad/libFStatNomad.h
index 0941e610e00654a388cdbb2e4b2aabe825bac649..1693a1f2a66cccf1047fa640479627d63787bea1 100644
--- a/src/FollowUp/Nomad/libFStatNomad.h
+++ b/src/FollowUp/Nomad/libFStatNomad.h
@@ -2051,6 +2051,39 @@ public:
 		return var_HybridSearchPoints;
 	}
 
+	void FinalHybridSearch(BOOLEAN v){
+		var_FinalHybridSearch = v;
+	}
+
+	BOOLEAN FinalHybridSearch(){
+		return var_FinalHybridSearch;
+	}
+	
+	void FinalHybridSearchMismatch(REAL8 v){
+		var_FinalHybridSearchMismatch = v;
+	}
+	
+	REAL8 FinalHybridSearchMismatch(){
+		return var_FinalHybridSearchMismatch;
+	}
+
+	void FinalHybridSearchLattice(CHAR* v){
+		var_FinalHybridSearchLattice = v;
+	}
+	
+	CHAR* FinalHybridSearchLattice(){
+		return var_FinalHybridSearchLattice;
+	}
+
+	void FinalHybridSearchPoints(INT4 v){
+		var_FinalHybridSearchPoints = v;
+	}
+
+	INT4 FinalHybridSearchPoints(){
+		return var_FinalHybridSearchPoints;
+	}
+	
+	
 
     REAL8 DoPredictFStat(INT4 fstatsearchtype,LALSegList *segList);
     UsefulStageVariables usefulParams;
@@ -2157,9 +2190,13 @@ private:
     REAL8 var_SignalPeriod;
 
 	BOOLEAN var_HybridSearch;
+	BOOLEAN var_FinalHybridSearch;
 	REAL4 var_HybridSearchMismatch;
 	CHAR *var_HybridSearchLattice;
 	INT4 var_HybridSearchPoints;
+	REAL4 var_FinalHybridSearchMismatch;
+	CHAR *var_FinalHybridSearchLattice;
+	INT4 var_FinalHybridSearchPoints;
 
     UINT8 trials_cnt;
     std::vector<UINT8> trials_vec;