diff --git a/src/ceres_wrapper/ceres_manager.cpp b/src/ceres_wrapper/ceres_manager.cpp
index b1b8fbbd3aa3d3e047a6e68445cf6281142b6e35..f2642f433a1166083151779fa20e9ca3a0cefc09 100644
--- a/src/ceres_wrapper/ceres_manager.cpp
+++ b/src/ceres_wrapper/ceres_manager.cpp
@@ -22,13 +22,13 @@ CeresManager::CeresManager(ProblemPtr _wolf_problem, const ceres::Solver::Option
   covariance_options.num_threads = 8;
   covariance_options.apply_loss_function = false;
   //covariance_options.null_space_rank = -1;
-  covariance_ = new ceres::Covariance(covariance_options);
+  covariance_ = wolf::make_unique<ceres::Covariance>(covariance_options);
 
   ceres::Problem::Options problem_options;
   problem_options.cost_function_ownership = ceres::DO_NOT_TAKE_OWNERSHIP;
   problem_options.loss_function_ownership = ceres::TAKE_OWNERSHIP;
   problem_options.local_parameterization_ownership = ceres::DO_NOT_TAKE_OWNERSHIP;
-  ceres_problem_ = new ceres::Problem(problem_options);
+  ceres_problem_ = wolf::make_unique<ceres::Problem>(problem_options);
 }
 
 CeresManager::~CeresManager()
@@ -38,11 +38,6 @@ CeresManager::~CeresManager()
   while (!ctr_2_residual_idx_.empty())
     removeConstraint(ctr_2_residual_idx_.begin()->first);
   //	std::cout << "all residuals removed! \n";
-
-  delete covariance_;
-  //std::cout << "covariance deleted! \n";
-  delete ceres_problem_;
-  //std::cout << "ceres problem deleted! \n";
 }
 
 std::string CeresManager::solve(const unsigned int& _report_level)
@@ -55,7 +50,7 @@ std::string CeresManager::solve(const unsigned int& _report_level)
   //std::cout << "After Update: Residual blocks: " << ceres_problem_->NumResidualBlocks() <<  " Parameter blocks: " << ceres_problem_->NumParameterBlocks() << std::endl;
 
   // run Ceres Solver
-  ceres::Solve(ceres_options_, ceres_problem_, &summary_);
+  ceres::Solve(ceres_options_, ceres_problem_.get(), &summary_);
   //std::cout << "solved" << std::endl;
 
   //return report
@@ -190,7 +185,7 @@ void CeresManager::computeCovariances(CovarianceBlocksToBeComputed _blocks)
   //std::cout << "pairs... " << double_pairs.size() << std::endl;
 
   // COMPUTE DESIRED COVARIANCES
-  if (covariance_->Compute(double_pairs, ceres_problem_))
+  if (covariance_->Compute(double_pairs, ceres_problem_.get()))
   {
     // STORE DESIRED COVARIANCES
     for (unsigned int i = 0; i < double_pairs.size(); i++)
@@ -230,7 +225,7 @@ void CeresManager::computeCovariances(const StateBlockList& st_list)
   //std::cout << "pairs... " << double_pairs.size() << std::endl;
 
   // COMPUTE DESIRED COVARIANCES
-  if (covariance_->Compute(double_pairs, ceres_problem_))
+  if (covariance_->Compute(double_pairs, ceres_problem_.get()))
     // STORE DESIRED COVARIANCES
     for (unsigned int i = 0; i < double_pairs.size(); i++)
     {
diff --git a/src/ceres_wrapper/ceres_manager.h b/src/ceres_wrapper/ceres_manager.h
index 0a41a4da218136457d5e99ecb092923df6b49bf7..d6e86bc136c8d9f3f93cc91504be73b4e00f0946 100644
--- a/src/ceres_wrapper/ceres_manager.h
+++ b/src/ceres_wrapper/ceres_manager.h
@@ -1,6 +1,8 @@
 #ifndef CERES_MANAGER_H_
 #define CERES_MANAGER_H_
 
+#include "../make_unique.h"
+
 //Ceres includes
 #include "ceres/jet.h"
 #include "ceres/ceres.h"
@@ -27,12 +29,14 @@ WOLF_PTR_TYPEDEFS(CeresManager);
 class CeresManager : public SolverManager
 {
 protected:
+
   std::map<ConstraintBasePtr, ceres::ResidualBlockId> ctr_2_residual_idx_;
   std::map<ConstraintBasePtr, ceres::CostFunctionPtr> ctr_2_costfunction_;
-  ceres::Problem* ceres_problem_;
+
   ceres::Solver::Options ceres_options_;
-  ceres::Covariance* covariance_;
   ceres::Solver::Summary summary_;
+  std::unique_ptr<ceres::Problem> ceres_problem_;
+  std::unique_ptr<ceres::Covariance> covariance_;
 
 public:
   CeresManager(ProblemPtr _wolf_problem, const ceres::Solver::Options& _ceres_options = ceres::Solver::Options());