diff --git a/include/laser/processor/processor_closeloop_icp.h b/include/laser/processor/processor_closeloop_icp.h
index c8edb9e1b506788836f3c8e4e594432b00e1dc8a..edc50d4bcd5ebcdaa14e283ec39354775c01e3ec 100644
--- a/include/laser/processor/processor_closeloop_icp.h
+++ b/include/laser/processor/processor_closeloop_icp.h
@@ -37,6 +37,9 @@ struct ProcessorParamsCloseLoopICP : public ProcessorParamsBase
 {
     int recent_key_frames_ignored;
     int key_frames_to_wait;
+    double max_error_threshold;
+    double min_points_percent;
+
     // ICP Params
     int use_point_to_line_distance;
     double max_correspondence_dist;
@@ -86,37 +89,39 @@ struct ProcessorParamsCloseLoopICP : public ProcessorParamsBase
     ProcessorParamsCloseLoopICP(std::string _unique_name, const ParamsServer& _server):
         ProcessorParamsBase(_unique_name, _server)
     {
-        recent_key_frames_ignored = _server.getParam<int>(prefix + _unique_name + "/recent_key_frames_ignored");
-        key_frames_to_wait        = _server.getParam<int>(prefix + _unique_name + "/key_frames_to_wait");
-
-        use_point_to_line_distance = _server.getParam<int>(prefix + _unique_name + "/use_point_to_line_distance");
-        max_correspondence_dist    = _server.getParam<double>(prefix + _unique_name + "/max_correspondence_dist");
-        max_iterations             = _server.getParam<int>(prefix + _unique_name + "/max_iterations");
-        use_corr_tricks            = _server.getParam<int>(prefix + _unique_name + "/use_corr_tricks");
-        outliers_maxPerc           = _server.getParam<double>(prefix + _unique_name + "/outliers_maxPerc");
-        outliers_adaptive_order    = _server.getParam<double>(prefix + _unique_name + "/outliers_adaptive_order");
-        outliers_adaptive_mult     = _server.getParam<double>(prefix + _unique_name + "/outliers_adaptive_mult");
-
-        do_compute_covariance              = _server.getParam<int>    (prefix + _unique_name + "/do_compute_covariance");
-        max_angular_correction_deg         = _server.getParam<double> (prefix + _unique_name + "/max_angular_correction_deg");
-        max_linear_correction              = _server.getParam<double> (prefix + _unique_name + "/max_linear_correction");
-        epsilon_xy                         = _server.getParam<double> (prefix + _unique_name + "/epsilon_xy");
-        epsilon_theta                      = _server.getParam<double> (prefix + _unique_name + "/epsilon_theta");
-        sigma                              = _server.getParam<double> (prefix + _unique_name + "/sigma");
-        restart                            = _server.getParam<int>    (prefix + _unique_name + "/restart");
-        restart_threshold_mean_error       = _server.getParam<double> (prefix + _unique_name + "/restart_threshold_mean_error");
-        restart_dt                         = _server.getParam<double> (prefix + _unique_name + "/restart_dt");
-        restart_dtheta                     = _server.getParam<double> (prefix + _unique_name + "/restart_dtheta");
-        clustering_threshold               = _server.getParam<double> (prefix + _unique_name + "/clustering_threshold");
-        orientation_neighbourhood          = _server.getParam<int>    (prefix + _unique_name + "/orientation_neighbourhood");
-        do_alpha_test                      = _server.getParam<int>    (prefix + _unique_name + "/do_alpha_test");
-        do_alpha_test_thresholdDeg         = _server.getParam<double> (prefix + _unique_name + "/do_alpha_test_thresholdDeg");
-        do_visibility_test                 = _server.getParam<int>    (prefix + _unique_name + "/do_visibility_test");
-        outliers_remove_doubles            = _server.getParam<int>    (prefix + _unique_name + "/outliers_remove_doubles");
-        debug_verify_tricks                = _server.getParam<int>    (prefix + _unique_name + "/debug_verify_tricks");
-        gpm_theta_bin_size_deg             = _server.getParam<double> (prefix + _unique_name + "/gpm_theta_bin_size_deg");
-        gpm_extend_range_deg               = _server.getParam<double> (prefix + _unique_name + "/gpm_extend_range_deg");
-        gpm_interval                       = _server.getParam<double> (prefix + _unique_name + "/gpm_interval");
+        recent_key_frames_ignored = _server.getParam<int>    (prefix + _unique_name + "/recent_key_frames_ignored");
+        key_frames_to_wait        = _server.getParam<int>    (prefix + _unique_name + "/key_frames_to_wait");
+        max_error_threshold       = _server.getParam<double> (prefix + _unique_name + "/max_error_threshold");
+        min_points_percent        = _server.getParam<double> (prefix + _unique_name + "/min_points_percent");
+
+        use_point_to_line_distance = _server.getParam<int>    (prefix + _unique_name + "/use_point_to_line_distance");
+        max_correspondence_dist    = _server.getParam<double> (prefix + _unique_name + "/max_correspondence_dist");
+        max_iterations             = _server.getParam<int>    (prefix + _unique_name + "/max_iterations");
+        use_corr_tricks            = _server.getParam<int>    (prefix + _unique_name + "/use_corr_tricks");
+        outliers_maxPerc           = _server.getParam<double> (prefix + _unique_name + "/outliers_maxPerc");
+        outliers_adaptive_order    = _server.getParam<double> (prefix + _unique_name + "/outliers_adaptive_order");
+        outliers_adaptive_mult     = _server.getParam<double> (prefix + _unique_name + "/outliers_adaptive_mult");
+
+        do_compute_covariance        = _server.getParam<int>    (prefix + _unique_name + "/do_compute_covariance");
+        max_angular_correction_deg   = _server.getParam<double> (prefix + _unique_name + "/max_angular_correction_deg");
+        max_linear_correction        = _server.getParam<double> (prefix + _unique_name + "/max_linear_correction");
+        epsilon_xy                   = _server.getParam<double> (prefix + _unique_name + "/epsilon_xy");
+        epsilon_theta                = _server.getParam<double> (prefix + _unique_name + "/epsilon_theta");
+        sigma                        = _server.getParam<double> (prefix + _unique_name + "/sigma");
+        restart                      = _server.getParam<int>    (prefix + _unique_name + "/restart");
+        restart_threshold_mean_error = _server.getParam<double> (prefix + _unique_name + "/restart_threshold_mean_error");
+        restart_dt                   = _server.getParam<double> (prefix + _unique_name + "/restart_dt");
+        restart_dtheta               = _server.getParam<double> (prefix + _unique_name + "/restart_dtheta");
+        clustering_threshold         = _server.getParam<double> (prefix + _unique_name + "/clustering_threshold");
+        orientation_neighbourhood    = _server.getParam<int>    (prefix + _unique_name + "/orientation_neighbourhood");
+        do_alpha_test                = _server.getParam<int>    (prefix + _unique_name + "/do_alpha_test");
+        do_alpha_test_thresholdDeg   = _server.getParam<double> (prefix + _unique_name + "/do_alpha_test_thresholdDeg");
+        do_visibility_test           = _server.getParam<int>    (prefix + _unique_name + "/do_visibility_test");
+        outliers_remove_doubles      = _server.getParam<int>    (prefix + _unique_name + "/outliers_remove_doubles");
+        debug_verify_tricks          = _server.getParam<int>    (prefix + _unique_name + "/debug_verify_tricks");
+        gpm_theta_bin_size_deg       = _server.getParam<double> (prefix + _unique_name + "/gpm_theta_bin_size_deg");
+        gpm_extend_range_deg         = _server.getParam<double> (prefix + _unique_name + "/gpm_extend_range_deg");
+        gpm_interval                 = _server.getParam<double> (prefix + _unique_name + "/gpm_interval");
 
         // Not implemented yet in CSM
         // laser_x                            = _server.getParam<double> (prefix + _unique_name + "/laser_x");
@@ -142,7 +147,9 @@ struct ProcessorParamsCloseLoopICP : public ProcessorParamsBase
     {
         return "\n" + ProcessorParamsBase::print()
             + "recent_key_frames_ignored: " + std::to_string(recent_key_frames_ignored) + "\n"
-            + "key_frames_to_wait: " + std::to_string(key_frames_to_wait) + "\n";
+            + "key_frames_to_wait: " + std::to_string(key_frames_to_wait) + "\n"
+            + "max_error_threshold: " + std::to_string(max_error_threshold) + "\n"
+            + "min_points_percent: " + std::to_string(min_points_percent) + "\n";
     }
 };
     struct CapturesAligned{
@@ -163,6 +170,9 @@ class ProcessorCloseLoopICP : public ProcessorBase
         //Closeloop parameters
         int recent_key_frames_ignored_;
         int key_frames_to_wait_;
+        double max_error_threshold;
+        double min_points_percent;
+
 
         int key_frames_skipped_;
     
diff --git a/src/processor/processor_closeloop_icp.cpp b/src/processor/processor_closeloop_icp.cpp
index 816fe62ffa0b7c2007d8cf10da8438228ed655fe..6b56ed474bce3a127470877a5ce983b228c37c2f 100644
--- a/src/processor/processor_closeloop_icp.cpp
+++ b/src/processor/processor_closeloop_icp.cpp
@@ -16,6 +16,8 @@ ProcessorCloseLoopICP::ProcessorCloseLoopICP(ProcessorParamsCloseLoopICPPtr _par
     recent_key_frames_ignored_ = _params->recent_key_frames_ignored;
     key_frames_to_wait_   = _params->key_frames_to_wait;
     key_frames_skipped_ = 0;
+    max_error_threshold = _params->max_error_threshold;
+    min_points_percent = _params->min_points_percent;
 
     icp_params_.use_point_to_line_distance  = _params->use_point_to_line_distance;
     icp_params_.max_correspondence_dist     = _params->max_correspondence_dist;
@@ -204,14 +206,14 @@ std::map<Scalar, CapturesAligned> ProcessorCloseLoopICP::evaluateCandidates(Fram
                             laserscanutils::icpOutput trf =
                                 icp_tools_ptr_->align(capture_laser_own->getScan(), capture_laser_other->getScan(), sensor_own->getScanParams(),
                                                       sensor_other->getScanParams(), this->icp_params_, transform_guess);
-                            Scalar score_normalized =
+                            Scalar points_coeff_used =
                                 ((Scalar)trf.nvalid / (Scalar)min(capture_laser_own->getScan().ranges_raw_.size(), capture_laser_other->getScan().ranges_raw_.size()));
                             Scalar mean_error = trf.error / trf.nvalid;
                             WOLF_INFO("DBG ------------------------------");
-                            WOLF_INFO("DBG valid? ", trf.valid, " m_er ", mean_error, " ", score_normalized*100, "% own_id: ", _keyframe_own->id(), " other_id: ", _keyframe_other->id());
+                            WOLF_INFO("DBG valid? ", trf.valid, " m_er ", mean_error, " ", points_coeff_used*100, "% own_id: ", _keyframe_own->id(), " other_id: ", _keyframe_other->id());
                             WOLF_INFO("DBG own_POSE: ", _keyframe_own->getState().transpose(), " other_POSE: ", _keyframe_other->getState().transpose(), " ICP_guess: ", transform_guess.transpose(), " ICP_trf: ", trf.res_transf.transpose());
                             // WOLF_INFO("Covariance \n", trf.res_covar);
-                            if (trf.valid == 1 and mean_error < 0.01 and score_normalized > 0.5) {
+                            if (trf.valid == 1 and mean_error < max_error_threshold and points_coeff_used*100 > min_points_percent) {
                                 WOLF_INFO("DBG ADDED ", _keyframe_own->id(), " and ", _keyframe_other->id());
                                 captures_candidates.emplace(mean_error, CapturesAligned({capture_laser_own, capture_laser_other, trf}));
                             }else WOLF_INFO("DBG DISCARDED ", _keyframe_own->id(), " and ", _keyframe_other->id());