diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f56b5c57d8d5885d9ac4831c73b2dd6a34b9ab7f..5d0bc4c340a3c304aa9e83c4f9f78d007085dbab 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -3,10 +3,6 @@
 # Copyright (c) 2015 Wandercraft, 86 rue de Paris 91400 Orsay, France.
 # 
 
-MACRO(ADD_TARGET_CFLAGS target flag)
-  SET_PROPERTY(TARGET ${target} APPEND_STRING PROPERTY COMPILE_FLAGS " ${flag}")
-ENDMACRO(ADD_TARGET_CFLAGS)
-
 # ----------------------------------------------------
 # --- C++ --------------------------------------------
 # ----------------------------------------------------
diff --git a/src/algorithm/aba-derivatives.hxx b/src/algorithm/aba-derivatives.hxx
index b689ed3690b5afb1319d2303ac0525b3352b88fc..05c0544439ac1b637a551ed45e50270cae4e40d3 100644
--- a/src/algorithm/aba-derivatives.hxx
+++ b/src/algorithm/aba-derivatives.hxx
@@ -356,6 +356,7 @@ namespace pinocchio
     data.u = tau;
     
     MatrixType3 & Minv_ = EIGEN_CONST_CAST(MatrixType3,aba_partial_dtau);
+    Minv_.template triangularView<Eigen::Upper>().setZero();
     
     /// First, compute Minv and a, the joint acceleration vector
     typedef ComputeABADerivativesForwardStep1<Scalar,Options,JointCollectionTpl,ConfigVectorType,TangentVectorType1> Pass1;
@@ -425,6 +426,7 @@ namespace pinocchio
     data.u = tau;
     
     MatrixType3 & Minv_ = EIGEN_CONST_CAST(MatrixType3,aba_partial_dtau);
+    Minv_.template triangularView<Eigen::Upper>().setZero();
     
     /// First, compute Minv and a, the joint acceleration vector
     typedef ComputeABADerivativesForwardStep1<Scalar,Options,JointCollectionTpl,ConfigVectorType,TangentVectorType1> Pass1;
diff --git a/src/algorithm/aba.hxx b/src/algorithm/aba.hxx
index dd91c1cd552e5a0c107a0caf5b217a6767683a45..c2835edef8ecc59130bf345a950d32bf4273345c 100644
--- a/src/algorithm/aba.hxx
+++ b/src/algorithm/aba.hxx
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2016-2018 CNRS
+// Copyright (c) 2016-2018 CNRS, INRIA
 //
 
 #ifndef __pinocchio_aba_hxx__
@@ -457,6 +457,7 @@ namespace pinocchio
     assert(q.size() == model.nq && "The joint configuration vector is not of right size");
     
     typedef typename ModelTpl<Scalar,Options,JointCollectionTpl>::JointIndex JointIndex;
+    data.Minv.template triangularView<Eigen::Upper>().setZero();
     
     typedef ComputeMinverseForwardStep1<Scalar,Options,JointCollectionTpl,ConfigVectorType> Pass1;
     for(JointIndex i=1; i<(JointIndex)model.njoints; ++i)
diff --git a/unittest/aba-derivatives.cpp b/unittest/aba-derivatives.cpp
index 0ea848324715300f8fbaa2c921de872c03058673..fbe03c1504271504296329bbec934f8122841fea 100644
--- a/unittest/aba-derivatives.cpp
+++ b/unittest/aba-derivatives.cpp
@@ -251,4 +251,46 @@ BOOST_AUTO_TEST_CASE(test_aba_derivatives_fext)
   BOOST_CHECK(data_shortcut.Minv.isApprox(aba_partial_dtau));
 }
 
+BOOST_AUTO_TEST_CASE(test_multiple_calls)
+{
+  using namespace Eigen;
+  using namespace pinocchio;
+  
+  Model model;
+  buildModels::humanoidRandom(model);
+  
+  Data data1(model), data2(model);
+  
+  model.lowerPositionLimit.head<3>().fill(-1.);
+  model.upperPositionLimit.head<3>().fill(1.);
+  VectorXd q = randomConfiguration(model);
+  VectorXd v(VectorXd::Random(model.nv));
+  VectorXd tau(VectorXd::Random(model.nv));
+  
+  computeABADerivatives(model,data1,q,v,tau);
+  data2 = data1;
+  
+  for(int k = 0; k < 20; ++k)
+  {
+    computeABADerivatives(model,data1,q,v,tau);
+  }
+  
+  BOOST_CHECK(data1.J.isApprox(data2.J));
+  BOOST_CHECK(data1.dJ.isApprox(data2.dJ));
+  BOOST_CHECK(data1.dVdq.isApprox(data2.dVdq));
+  BOOST_CHECK(data1.dAdq.isApprox(data2.dAdq));
+  BOOST_CHECK(data1.dAdv.isApprox(data2.dAdv));
+  
+  BOOST_CHECK(data1.dFdq.isApprox(data2.dFdq));
+  BOOST_CHECK(data1.dFdv.isApprox(data2.dFdv));
+  BOOST_CHECK(data1.dFda.isApprox(data2.dFda));
+  
+  BOOST_CHECK(data1.dtau_dq.isApprox(data2.dtau_dq));
+  BOOST_CHECK(data1.dtau_dv.isApprox(data2.dtau_dv));
+  
+  BOOST_CHECK(data1.ddq_dq.isApprox(data2.ddq_dq));
+  BOOST_CHECK(data1.ddq_dv.isApprox(data2.ddq_dv));
+  BOOST_CHECK(data1.Minv.isApprox(data2.Minv));
+}
+
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/unittest/aba.cpp b/unittest/aba.cpp
index 72746a13ebcc1ba597a36bd1728cd74a27b8fb84..a4fbf42f41c9f6038026b8824dc245badda14b21 100644
--- a/unittest/aba.cpp
+++ b/unittest/aba.cpp
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2016-2018 CNRS
+// Copyright (c) 2016-2018 CNRS, INRIA
 //
 
 #include "pinocchio/spatial/fwd.hpp"
@@ -257,4 +257,30 @@ BOOST_AUTO_TEST_CASE ( test_computeMinverse )
 //  std::cout << "Minv_ref:\n" << Minv_ref.bottomRows<10>() << std::endl;
   
 }
+
+BOOST_AUTO_TEST_CASE(test_multiple_calls)
+{
+  using namespace Eigen;
+  using namespace pinocchio;
+  
+  Model model;
+  buildModels::humanoidRandom(model);
+  
+  Data data1(model), data2(model);
+  
+  model.lowerPositionLimit.head<3>().fill(-1.);
+  model.upperPositionLimit.head<3>().fill(1.);
+  VectorXd q = randomConfiguration(model);
+  
+  computeMinverse(model,data1,q);
+  data2 = data1;
+  
+  for(int k = 0; k < 20; ++k)
+  {
+    computeMinverse(model,data1,q);
+  }
+  
+  BOOST_CHECK(data1.Minv.isApprox(data2.Minv));
+}
+
 BOOST_AUTO_TEST_SUITE_END ()
diff --git a/unittest/rnea-derivatives.cpp b/unittest/rnea-derivatives.cpp
index c4e80583bc5a46a23ba3ecb7c8c1852974934350..f7f20d8a116a016013a62f51f72a16913ca074c0 100644
--- a/unittest/rnea-derivatives.cpp
+++ b/unittest/rnea-derivatives.cpp
@@ -377,4 +377,43 @@ BOOST_AUTO_TEST_CASE(test_rnea_derivatives_vs_kinematics_derivatives)
   BOOST_CHECK(data.dJ.isApprox(data_ref.dJ));
 }
 
+BOOST_AUTO_TEST_CASE(test_multiple_calls)
+{
+  using namespace Eigen;
+  using namespace pinocchio;
+  
+  Model model;
+  buildModels::humanoidRandom(model);
+  
+  Data data1(model), data2(model);
+  
+  model.lowerPositionLimit.head<3>().fill(-1.);
+  model.upperPositionLimit.head<3>().fill(1.);
+  VectorXd q = randomConfiguration(model);
+  VectorXd v(VectorXd::Random(model.nv));
+  VectorXd a(VectorXd::Random(model.nv));
+  
+  computeRNEADerivatives(model,data1,q,v,a);
+  data2 = data1;
+  
+  for(int k = 0; k < 20; ++k)
+  {
+    computeRNEADerivatives(model,data1,q,v,a);
+  }
+  
+  BOOST_CHECK(data1.J.isApprox(data2.J));
+  BOOST_CHECK(data1.dJ.isApprox(data2.dJ));
+  BOOST_CHECK(data1.dVdq.isApprox(data2.dVdq));
+  BOOST_CHECK(data1.dAdq.isApprox(data2.dAdq));
+  BOOST_CHECK(data1.dAdv.isApprox(data2.dAdv));
+  
+  BOOST_CHECK(data1.dFdq.isApprox(data2.dFdq));
+  BOOST_CHECK(data1.dFdv.isApprox(data2.dFdv));
+  BOOST_CHECK(data1.dFda.isApprox(data2.dFda));
+  
+  BOOST_CHECK(data1.dtau_dq.isApprox(data2.dtau_dq));
+  BOOST_CHECK(data1.dtau_dv.isApprox(data2.dtau_dv));
+  BOOST_CHECK(data1.M.isApprox(data2.M));
+}
+
 BOOST_AUTO_TEST_SUITE_END()