diff --git a/common/statefunctional.cpp b/common/statefunctional.cpp
index 16fdf1568d2fb5aa5688e82bf6ef5fb76e5cd7a6..56bcc581510aabb724711983a3ed61f7b7924bd4 100644
--- a/common/statefunctional.cpp
+++ b/common/statefunctional.cpp
@@ -301,6 +301,8 @@ double StateFunctional<T_Physic>::performance_regularization()
 template<Physic T_Physic>
 const ModelField& StateFunctional<T_Physic>::gradient()
 {
+    // Update the model adjoint state and return it.
+    // TODO: no model sent but FS is updated -> Is it always up to date ?
     std::array<bool,4> ToBeUpdated = {false,false,true,false};
     return _mu.get(ToBeUpdated).field(Type::AS);
 }
diff --git a/directional.cpp b/directional.cpp
index a8a6cd26bc35605d8e4e9ec8e1273ae48848b3e7..1ddc153c0b6468c3aec70a4827b173efcf723333 100644
--- a/directional.cpp
+++ b/directional.cpp
@@ -139,7 +139,7 @@ int directional(const GmshFem& gmshFem)
         }
         const Data<T_Physic> d0g(freq_idx,d0);
 
-        ObjectiveInterface<T_Physic>* const objective = newObjective<T_Physic>(d0g,configuration,gmshFem);
+        auto objective = newObjective<T_Physic>(d0g,configuration,gmshFem);
 
         std::vector<EquationInterface<T_Physic>*> pequation(n_freq);
         std::vector<double> subfrequency(n_freq);
@@ -152,7 +152,7 @@ int directional(const GmshFem& gmshFem)
             pequation[f] = new ParametrizedEquation<T_Physic>(parametrization,f,2.*M_PI*subfrequency[f],configuration,w_discret,gmshFem,suffix_f);
         }
 
-        StateFunctional<T_Physic>* const statefunctional = new StateFunctional<T_Physic>(configuration,nullptr,nullptr,subfrequency,pequation,objective);
+        StateFunctional<T_Physic>* const statefunctional = new StateFunctional<T_Physic>(configuration,nullptr,nullptr,subfrequency,pequation,objective.get());
         FunctionalInterface* const functional = statefunctional;
 
         double eps;
@@ -344,7 +344,6 @@ int directional(const GmshFem& gmshFem)
         {
             delete pequation[f];
         }
-        delete objective;
         msg::unindent();
     }
 
diff --git a/directional_field.cpp b/directional_field.cpp
index 20d08f5dc78d2b58a61a000cfe34102550ae5ea4..2636e2a6846dd2837b4809d8ec92335bd67c9a3f 100644
--- a/directional_field.cpp
+++ b/directional_field.cpp
@@ -113,7 +113,7 @@ int directional(const GmshFem& gmshFem)
         }
         const Data<T_Physic> d0g(freq_idx,d0);
 
-        ObjectiveInterface<T_Physic>* const objective = (d0g.nf()!=0 ? newObjective<T_Physic>(d0g,configuration,gmshFem) : nullptr);
+        std::unique_ptr<ObjectiveInterface<T_Physic>> objective = (d0g.nf()!=0 ? newObjective<T_Physic>(d0g,configuration,gmshFem) : nullptr);
 
         std::vector<EquationInterface<T_Physic>*> pequation(n_freq);
         std::vector<double> subfrequency(n_freq);
@@ -132,7 +132,7 @@ int directional(const GmshFem& gmshFem)
 
         RegularizationInterface* const regularization = newRegularization(configuration,(*sweeper_m)(0,0), gmshFem);
 
-        StateFunctional<T_Physic>* const statefunctional = new StateFunctional<T_Physic>(configuration,nullptr,regularization,subfrequency,pequation,objective);
+        StateFunctional<T_Physic>* const statefunctional = new StateFunctional<T_Physic>(configuration,nullptr,regularization,subfrequency,pequation,objective.get());
         FunctionalInterface* const functional = statefunctional;
 
 
@@ -214,7 +214,6 @@ int directional(const GmshFem& gmshFem)
         {
             delete pequation[f];
         }
-        delete objective;
         delete regularization;
         msg::unindent();
     }
diff --git a/gradient.cpp b/gradient.cpp
index bb6bb2b33dcc895070360d3e4cb0fdbdf4792bc2..8923fa90908142e1865056831fb756abb8e7c4d2 100644
--- a/gradient.cpp
+++ b/gradient.cpp
@@ -134,7 +134,7 @@ int gradient(const GmshFem& gmshFem)
         }
         const Data<T_Physic> d0g(freq_idx,d0);
 
-        ObjectiveInterface<T_Physic>* const objective = newObjective<T_Physic>(d0g,configuration,gmshFem);
+        auto objective = newObjective<T_Physic>(d0g,configuration,gmshFem);
 
         std::vector<EquationInterface<T_Physic>*> pequation(n_freq);
         std::vector<double> subfrequency(n_freq);
@@ -147,7 +147,7 @@ int gradient(const GmshFem& gmshFem)
             pequation[f] = new ParametrizedEquation<T_Physic>(parametrization,f,2.*M_PI*subfrequency[f],configuration,w_discret,gmshFem,suffix_f);
         }
 
-        StateFunctional<T_Physic>* const statefunctional = new StateFunctional<T_Physic>(configuration,&innerproduct,nullptr,subfrequency,pequation,objective);
+        StateFunctional<T_Physic>* const statefunctional = new StateFunctional<T_Physic>(configuration,&innerproduct,nullptr,subfrequency,pequation,objective.get());
         FunctionalInterface* const functional = statefunctional;
         functional->setModel(configuration->m0());
 
@@ -203,7 +203,6 @@ int gradient(const GmshFem& gmshFem)
         msg::unindent();
 
         delete statefunctional;
-        delete objective;
         for (unsigned int f = 0; f < n_freq; f++)
         {
             delete pequation[f];
diff --git a/ip_comparison.cpp b/ip_comparison.cpp
index 969785a6b7cf649b1ec37b5ace3f3e880d673c24..7b848e36afcd3e25aaea06bf96b91b4987067524 100644
--- a/ip_comparison.cpp
+++ b/ip_comparison.cpp
@@ -126,7 +126,7 @@ int ip_comparison(const GmshFem& gmshFem)
         ModelField m = laplace_filter(configuration->m0(),filter_scale,configuration,m_discret,integrationType);
         m.write(name+"_m_smooth"+suffix_g);
 
-        ObjectiveInterface<T_Physic>* const objective = newObjective<T_Physic>(d0g,configuration,gmshFem);
+        auto objective = newObjective<T_Physic>(d0g,configuration,gmshFem);
 
         std::vector<EquationInterface<T_Physic>*> pequation(n_freq);
         std::vector<double> subfrequency(n_freq);
@@ -139,9 +139,9 @@ int ip_comparison(const GmshFem& gmshFem)
             pequation[f] = new ParametrizedEquation<T_Physic>(parametrization,f,2.*M_PI*subfrequency[f],configuration,w_discret,gmshFem,suffix_f);
         }
 
-        InnerProductInterface* const innerproduct = newInnerProduct(configuration,m_discret,gmshFem,suffix_g);
+        auto innerproduct = newInnerProduct(configuration,m_discret,gmshFem,suffix_g);
         RegularizationInterface* const regularization = newRegularization(configuration,m,gmshFem,suffix_g);
-        StateFunctional<T_Physic>* const statefunctional = new StateFunctional<T_Physic>(configuration,innerproduct,regularization,subfrequency,pequation,objective);
+        StateFunctional<T_Physic>* const statefunctional = new StateFunctional<T_Physic>(configuration,innerproduct.get(),regularization,subfrequency,pequation,objective.get());
         statefunctional->setModel(m);
         double j = statefunctional->performance();
         msg::print << "performance = " << j << msg::endl;
@@ -206,12 +206,10 @@ int ip_comparison(const GmshFem& gmshFem)
         msg::unindent();
 
         delete statefunctional;
-        delete objective;
         for (unsigned int f = 0; f < n_freq; f++)
         {
             delete pequation[f];
         }
-        delete innerproduct;
         delete regularization;
         msg::unindent();
     }
diff --git a/multiscale.cpp b/multiscale.cpp
index 8982bac61a5c3acc734c05ca92067514e1d27a37..97763bcad7a422bcf74b377902850908f017de02 100644
--- a/multiscale.cpp
+++ b/multiscale.cpp
@@ -70,7 +70,7 @@ int multiscale(const GmshFem& gmshFem)
     }
     const Data<T_Physic> d0(filename,frequency,configuration);
 
-    ObjectiveInterface<T_Physic>* const objective = newObjective<T_Physic>(d0,configuration,gmshFem);
+    auto objective = newObjective<T_Physic>(d0,configuration,gmshFem);
 
     std::vector<EquationInterface<T_Physic>*> pequation(n_freq);
     for (unsigned int f = 0; f < n_freq; f++)
@@ -80,7 +80,7 @@ int multiscale(const GmshFem& gmshFem)
         wave::Discretization<T_Physic> w_discret(gmshFem,suffix_f);
         pequation[f] = new ParametrizedEquation<T_Physic>(parametrization,f,2.*M_PI*frequency[f],configuration,w_discret,gmshFem,suffix_f);
     }
-    StateFunctional<T_Physic>* const statefunctional = new StateFunctional<T_Physic>(configuration,nullptr,nullptr,frequency,pequation,objective);
+    StateFunctional<T_Physic>* const statefunctional = new StateFunctional<T_Physic>(configuration,nullptr,nullptr,frequency,pequation,objective.get());
     FunctionalInterface* const functional = statefunctional;
 
     msg::print << "Perform multiscale analysis" << msg::endl;
@@ -124,7 +124,6 @@ int multiscale(const GmshFem& gmshFem)
 
 
     delete statefunctional;
-    delete objective;
     for (unsigned int f = 0; f < n_freq; f++)
     {
         delete pequation[f];
diff --git a/specific/data/objective/newObjective.h b/specific/data/objective/newObjective.h
index caf78125900f20b9824d46e0849863d15eb67475..04fd773884cc9104da234378c52f8c977d158fa3 100644
--- a/specific/data/objective/newObjective.h
+++ b/specific/data/objective/newObjective.h
@@ -3,6 +3,7 @@
 
 //Standard Library
 #include <string>
+#include <memory>
 
 //GmshFEM Library
 #include "Exception.h"
@@ -12,16 +13,16 @@
 #include "phase.h"
 
 template<Physic T_Physic>
-ObjectiveInterface<T_Physic>* newObjective(const Data<T_Physic>& d0, const ConfigurationInterface* const config, const gmshfem::common::GmshFem& gmshFem,std::string suffix = "")
+std::unique_ptr<ObjectiveInterface<T_Physic>> newObjective(const Data<T_Physic>& d0, const ConfigurationInterface* const config, const gmshfem::common::GmshFem& gmshFem,std::string suffix = "")
 {
     std::string objective;
     if(!gmshFem.userDefinedParameter(objective, "objective"))
     {
       throw gmshfem::common::Exception("Objective type could not be found.");
     }
-    if(objective=="l2distance"){return new l2distance::Objective<T_Physic>(d0,gmshFem);}
-    else if(objective=="conventional_phase"){return new conventional_phase::Objective<T_Physic>(d0,gmshFem);}
-    else if(objective=="logarithmic_phase"){return new logarithmic_phase::Objective<T_Physic>(d0,gmshFem);}
+    if(objective=="l2distance"){return std::make_unique< l2distance::Objective<T_Physic> >(d0,gmshFem);}
+    else if(objective=="conventional_phase"){return std::make_unique< conventional_phase::Objective<T_Physic> >(d0,gmshFem);}
+    else if(objective=="logarithmic_phase"){return std::make_unique< logarithmic_phase::Objective<T_Physic> >(d0,gmshFem);}
     else
     {
         throw gmshfem::common::Exception("Objective " + objective + " is not valid.");
diff --git a/specific/model/innerproduct/newInnerProduct.cpp b/specific/model/innerproduct/newInnerProduct.cpp
index 0e9195e347ec7f2281a1cbcca6e0e9453beb4f1e..ad44c72a6e46ecb6d3ae92ab2c8304d0c6aa09b3 100644
--- a/specific/model/innerproduct/newInnerProduct.cpp
+++ b/specific/model/innerproduct/newInnerProduct.cpp
@@ -8,15 +8,15 @@
 #include "sobolev.h"
 
 template<class M>
-InnerProductInterface* newInnerProduct(const ConfigurationInterface* const config,  const M& m_discret, const gmshfem::common::GmshFem& gmshFem, std::string suffix)
+std::unique_ptr<InnerProductInterface> newInnerProduct(const ConfigurationInterface* const config,  const M& m_discret, const gmshfem::common::GmshFem& gmshFem, std::string suffix)
 {
     std::string innerproduct;
     if(!gmshFem.userDefinedParameter(innerproduct, "innerproduct"))
     {
       throw gmshfem::common::Exception("Inner product type could not be found.");
     }
-    if(innerproduct=="sobolev_l2"){return new sobolev_l2::InnerProduct(config,m_discret,gmshFem, suffix);}
-    else if(innerproduct=="sobolev_df"){return new sobolev_df::InnerProduct(config,m_discret,gmshFem, suffix);}
+    if(innerproduct=="sobolev_l2"){return std::make_unique< sobolev_l2::InnerProduct>(config,m_discret,gmshFem, suffix);}
+    else if(innerproduct=="sobolev_df"){return std::make_unique< sobolev_df::InnerProduct>(config,m_discret,gmshFem, suffix);}
     else
     {
         throw gmshfem::common::Exception("Inner product " + innerproduct + " is not valid.");
@@ -24,5 +24,5 @@ InnerProductInterface* newInnerProduct(const ConfigurationInterface* const confi
     }
 }
 
-template InnerProductInterface* newInnerProduct<model::Discretization>(const ConfigurationInterface* const,  const model::Discretization&, const gmshfem::common::GmshFem&, std::string);
-template InnerProductInterface* newInnerProduct<ModelField>(const ConfigurationInterface* const,  const ModelField&, const gmshfem::common::GmshFem&, std::string);
+template std::unique_ptr<InnerProductInterface> newInnerProduct<model::Discretization>(const ConfigurationInterface* const,  const model::Discretization&, const gmshfem::common::GmshFem&, std::string);
+template std::unique_ptr<InnerProductInterface> newInnerProduct<ModelField>(const ConfigurationInterface* const,  const ModelField&, const gmshfem::common::GmshFem&, std::string);
diff --git a/specific/model/innerproduct/newInnerProduct.h b/specific/model/innerproduct/newInnerProduct.h
index b56447a268fea30985f496688b6ba589d4833af4..4bfe837a09e1f5ab75370c0b365df0b7b24c2cbd 100644
--- a/specific/model/innerproduct/newInnerProduct.h
+++ b/specific/model/innerproduct/newInnerProduct.h
@@ -2,12 +2,13 @@
 #define H_SPECIFIC_MODEL_NEWINNERPRODUCT
 
 //Standard Library
+#include <memory>
 //GmshFEM Library
 #include "GmshFem.h"
 //GmshFWI Library
 #include "../../../common/model/innerproduct/innerproduct.h"
 
 template<class M>
-InnerProductInterface* newInnerProduct(const ConfigurationInterface* const config,  const M& m_discret, const gmshfem::common::GmshFem& gmshFem, std::string suffix);
+std::unique_ptr<InnerProductInterface> newInnerProduct(const ConfigurationInterface* const config,  const M& m_discret, const gmshfem::common::GmshFem& gmshFem, std::string suffix);
 
 #endif //H_SPECIFIC_MODEL_NEWINNERPRODUCT
diff --git a/specific/optimization/globalminimumsearch/sequential.cpp b/specific/optimization/globalminimumsearch/sequential.cpp
index c7c153246afe27973a2e0496f960ecc2f5494543..e20837331b249dfa77266e9419d56e2e87c4f1bd 100644
--- a/specific/optimization/globalminimumsearch/sequential.cpp
+++ b/specific/optimization/globalminimumsearch/sequential.cpp
@@ -145,10 +145,10 @@ namespace sequential
             throw Exception("Data and equations do not have the same size.");
         }
 
-        ObjectiveInterface<T_Physic>* const objective = newObjective<T_Physic>(d0,_config,_gmshFem,_suffix);
-        InnerProductInterface* const innerproduct = newInnerProduct(_config,*m,_gmshFem,_suffix);
+        auto objective = newObjective<T_Physic>(d0,_config,_gmshFem,_suffix);
+        auto const innerproduct = newInnerProduct(_config,*m,_gmshFem,_suffix);
         RegularizationInterface* const regularization = newRegularization(_config,*m,_gmshFem,_suffix);
-        auto statefunctional = make_unique<StateFunctional<T_Physic>>(_config,innerproduct,regularization,d0.frequency(),equation,objective);
+        auto statefunctional = make_unique<StateFunctional<T_Physic>>(_config,innerproduct.get(),regularization,d0.frequency(),equation,objective.get());
         statefunctional->setModel(*m);
 
         LocalMinimumSearchInterface* const minimumsearch = newLocalMinimumSearch(_gmshFem);
@@ -208,9 +208,7 @@ namespace sequential
         delete descentsearch;
         delete linesearch;
 
-        delete innerproduct;
         delete regularization;
-        delete objective;
 
         msg::unindent();
     }