diff --git a/include/core/ceres_wrapper/solver_ceres.h b/include/core/ceres_wrapper/solver_ceres.h
index 9d473358abdec1c18f2b7239deabaa6399106825..62e2ab1a2da15ecec5ea372150a3c83c8b6b3bea 100644
--- a/include/core/ceres_wrapper/solver_ceres.h
+++ b/include/core/ceres_wrapper/solver_ceres.h
@@ -46,11 +46,15 @@ struct ParamsCeres : public ParamsSolver
 
         // ceres solver options
         solver_options.max_num_iterations       = _server.getParam<int>(prefix + "max_num_iterations");
+        solver_options.num_threads              = _server.getParam<int>(prefix + "n_threads");
+        covariance_options.num_threads          = _server.getParam<int>(prefix + "n_threads");
     }
 
     void loadHardcodedValues()
     {
         solver_options = ceres::Solver::Options();
+        solver_options.minimizer_type = ceres::TRUST_REGION; //ceres::LINE_SEARCH;
+        solver_options.trust_region_strategy_type = ceres::LEVENBERG_MARQUARDT; //ceres::DOGLEG;
         problem_options = ceres::Problem::Options();
         covariance_options = ceres::Covariance::Options();
         problem_options.cost_function_ownership = ceres::DO_NOT_TAKE_OWNERSHIP;
@@ -65,7 +69,6 @@ struct ParamsCeres : public ParamsSolver
         #else
             covariance_options.algorithm_type = ceres::SPARSE_QR;//ceres::DENSE_SVD;
         #endif
-        covariance_options.num_threads = 1;
         covariance_options.apply_loss_function = false;
     }
 
diff --git a/src/ceres_wrapper/solver_ceres.cpp b/src/ceres_wrapper/solver_ceres.cpp
index a01aa40f1a8faee05b5f3ccfcbfe727278c5ab55..b2e04de327a97cb76dd955b7506437693f63f4ae 100644
--- a/src/ceres_wrapper/solver_ceres.cpp
+++ b/src/ceres_wrapper/solver_ceres.cpp
@@ -53,7 +53,7 @@ std::string SolverCeres::solveDerived(const ReportVerbosity report_level)
     // run Ceres Solver
     ceres::Solve(getSolverOptions(), ceres_problem_.get(), &summary_);
 
-    // if termination by user (Iteration callback, update and solve again)
+    /*/ if termination by user (Iteration callback, update and solve again)
     // solve until max iterations reached
     if (params_ceres_->update_immediately)
     {
@@ -70,7 +70,7 @@ std::string SolverCeres::solveDerived(const ReportVerbosity report_level)
             ceres::Solve(getSolverOptions(), ceres_problem_.get(), &summary_);
         }
         getSolverOptions().max_num_iterations = max_num_iterations;
-    }
+    }*/
     std::string report;
 
     //return report
@@ -230,77 +230,37 @@ bool SolverCeres::computeCovariances(const CovarianceBlocksToBeComputed _blocks)
         case CovarianceBlocksToBeComputed::GAUSS:
         {
             // State blocks:
-            // - Last KF: POV
-            // - CaptureGnss T
-
-            std::vector<StateBlockPtr> gauss_state_blocks;
+            // - Last KF: PV
 
             // last KF
             FrameBasePtr last_frame = wolf_problem_->getLastFrame();
             if (not last_frame)
                 return false;
 
-            // get capture gnss
-            StateBlockPtr sb_gnss_T;
-            for (CaptureBasePtr cap : last_frame->getCaptureList())
-                if (cap->getType() == "CaptureGnss" and cap->hasStateBlock('T'))
-                {
-                    sb_gnss_T = cap->getStateBlock('T');
-                    break;
-                }
-
             // Error
             if (not last_frame->hasStateBlock('P') or
                 not isStateBlockRegisteredDerived(last_frame->getStateBlock('P')) or
-                not last_frame->hasStateBlock('O') or
-                not isStateBlockRegisteredDerived(last_frame->getStateBlock('O')) or
                 not last_frame->hasStateBlock('V') or
-                not isStateBlockRegisteredDerived(last_frame->getStateBlock('V')) or
-                not sb_gnss_T or
-                not isStateBlockRegisteredDerived(sb_gnss_T))
+                not isStateBlockRegisteredDerived(last_frame->getStateBlock('V')))
             {
                 WOLF_WARN("SolverCeres::computeCovariances: last KF have null or unregistered state blocks P O or T, returning...");
                 WOLF_WARN_COND(not last_frame->getStateBlock('P'), "SolverCeres::computeCovariances: KF state block 'P' not found");
                 WOLF_WARN_COND(last_frame->getStateBlock('P') and not isStateBlockRegisteredDerived(last_frame->getStateBlock('P')), "SolverCeres::computeCovariances: KF state block 'P' not registered ", last_frame->getStateBlock('P'));
-                WOLF_WARN_COND(not last_frame->getStateBlock('O'), "SolverCeres::computeCovariances: KF state block 'O' not found");
-                WOLF_WARN_COND(last_frame->getStateBlock('O') and not isStateBlockRegisteredDerived(last_frame->getStateBlock('O')), "SolverCeres::computeCovariances: KF state block 'O' not registered ", last_frame->getStateBlock('O'));
                 WOLF_WARN_COND(not last_frame->getStateBlock('V'), "SolverCeres::computeCovariances: KF state block 'V' not found");
                 WOLF_WARN_COND(last_frame->getStateBlock('V') and not isStateBlockRegisteredDerived(last_frame->getStateBlock('V')), "SolverCeres::computeCovariances: KF state block 'V' not registered ", last_frame->getStateBlock('V'));
-                WOLF_WARN_COND(not sb_gnss_T, "SolverCeres::computeCovariances: KF capture state block 'T' not found");
-                WOLF_WARN_COND(sb_gnss_T and not isStateBlockRegisteredDerived(sb_gnss_T), "SolverCeres::computeCovariances: KF capture state block 'T' not registered ", sb_gnss_T);
 
                 return false;
             }
 
-            // Fill vector of state blocks
-            gauss_state_blocks = std::vector<StateBlockPtr>{last_frame->getStateBlock('P'),
-                                                            last_frame->getStateBlock('O'),
-                                                            last_frame->getStateBlock('V'),
-                                                            sb_gnss_T};
-
-            // only marginals
-            for (unsigned int i = 0; i < gauss_state_blocks.size(); i++)
-            {
-                assert(isStateBlockRegisteredDerived(gauss_state_blocks[i]));
-
-                state_block_pairs.emplace_back(gauss_state_blocks[i],gauss_state_blocks[i]);
-                double_pairs.emplace_back(getAssociatedMemBlockPtr(gauss_state_blocks[i]),
-                                          getAssociatedMemBlockPtr(gauss_state_blocks[i]));
-            }
-            /*// double loop all against all (without repetitions)
-            for (unsigned int i = 0; i < gauss_state_blocks.size(); i++)
-            {
-                assert(isStateBlockRegisteredDerived(gauss_state_blocks[i]));
-
-                for  (unsigned int j = i; j < gauss_state_blocks.size(); j++)
-                {
-                    assert(isStateBlockRegisteredDerived(gauss_state_blocks[j]));
-
-                    state_block_pairs.emplace_back(gauss_state_blocks[i],gauss_state_blocks[j]);
-                    double_pairs.emplace_back(getAssociatedMemBlockPtr(gauss_state_blocks[i]),
-                                              getAssociatedMemBlockPtr(gauss_state_blocks[j]));
-                }
-            }*/
+            // only marginals of P and V
+            state_block_pairs.emplace_back(last_frame->getStateBlock('P'),
+                                           last_frame->getStateBlock('P'));
+            double_pairs.emplace_back(getAssociatedMemBlockPtr(last_frame->getStateBlock('P')),
+                                      getAssociatedMemBlockPtr(last_frame->getStateBlock('P')));
+            state_block_pairs.emplace_back(last_frame->getStateBlock('V'),
+                                           last_frame->getStateBlock('V'));
+            double_pairs.emplace_back(getAssociatedMemBlockPtr(last_frame->getStateBlock('V')),
+                                      getAssociatedMemBlockPtr(last_frame->getStateBlock('V')));
 
             break;
         }
diff --git a/test/yaml/params_tree_manager_sliding_window_dual_rate3.yaml b/test/yaml/params_tree_manager_sliding_window_dual_rate3.yaml
index b327504aa414e4b36e6163175b20b0ba4a4f79b9..b59022518aaf931890368185fb9b489611cda257 100644
--- a/test/yaml/params_tree_manager_sliding_window_dual_rate3.yaml
+++ b/test/yaml/params_tree_manager_sliding_window_dual_rate3.yaml
@@ -4,6 +4,7 @@ config:
     verbose: 2
     update_immediately: false
     max_num_iterations: 10
+    n_threads: 2
   problem:
     frame_structure: "PO"
     dimension: 3