diff --git a/mex/sources/k_order_perturbation/dynamic_abstract_class.hh b/mex/sources/k_order_perturbation/dynamic_abstract_class.hh
index fc18e31d469e599fefdfe985a956e04d2d1a5d24..1bde8301935c3449ad4fe0526aac004cead1a8f5 100644
--- a/mex/sources/k_order_perturbation/dynamic_abstract_class.hh
+++ b/mex/sources/k_order_perturbation/dynamic_abstract_class.hh
@@ -26,7 +26,10 @@
 
 class DynamicModelAC
 {
+protected:
+  int ntt; // Size of vector of temporary terms
 public:
+  DynamicModelAC(int ntt_arg) : ntt{ntt_arg} {};
   virtual ~DynamicModelAC() = default;
   virtual void eval(const Vector &y, const Vector &x, const Vector &params, const Vector &ySteady,
                     Vector &residual, std::vector<TwoDMatrix> &md) = 0;
diff --git a/mex/sources/k_order_perturbation/dynamic_dll.cc b/mex/sources/k_order_perturbation/dynamic_dll.cc
index 593e45a9ec348886c16993281578e7f30e63cdf1..287e87c73e8b5682da955143b585c8256ea9c2d0 100644
--- a/mex/sources/k_order_perturbation/dynamic_dll.cc
+++ b/mex/sources/k_order_perturbation/dynamic_dll.cc
@@ -23,7 +23,8 @@
 
 #include <iostream>
 
-DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false)
+DynamicModelDLL::DynamicModelDLL(const std::string &modName, int ntt_arg)
+  : DynamicModelAC(ntt_arg)
 {
   std::string fName;
 #if !defined(__CYGWIN32__) && !defined(_WIN32)
@@ -35,7 +36,6 @@ DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false)
   dynamicHinstance = LoadLibrary(fName.c_str());
   if (!dynamicHinstance)
     throw DynareException(__FILE__, __LINE__, "Error when loading " + fName + ": can't dynamically load the file");
-  ntt = reinterpret_cast<int *>(GetProcAddress(dynamicHinstance, "ntt"));
   dynamic_resid_tt = reinterpret_cast<dynamic_tt_fct>(GetProcAddress(dynamicHinstance, "dynamic_resid_tt"));
   dynamic_resid = reinterpret_cast<dynamic_resid_fct>(GetProcAddress(dynamicHinstance, "dynamic_resid"));
   dynamic_g1_tt = reinterpret_cast<dynamic_tt_fct>(GetProcAddress(dynamicHinstance, "dynamic_g1_tt"));
@@ -44,7 +44,7 @@ DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false)
   dynamic_g2 = reinterpret_cast<dynamic_g2_fct>(GetProcAddress(dynamicHinstance, "dynamic_g2"));
   dynamic_g3_tt = reinterpret_cast<dynamic_tt_fct>(GetProcAddress(dynamicHinstance, "dynamic_g3_tt"));
   dynamic_g3 = reinterpret_cast<dynamic_g3_fct>(GetProcAddress(dynamicHinstance, "dynamic_g3"));
-  if (!ntt || !dynamic_resid_tt || !dynamic_resid
+  if (!dynamic_resid_tt || !dynamic_resid
       || !dynamic_g1_tt || !dynamic_g1
       || !dynamic_g2_tt || !dynamic_g2
       || !dynamic_g3_tt || !dynamic_g3)
@@ -56,7 +56,6 @@ DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false)
   dynamicHinstance = dlopen(fName.c_str(), RTLD_NOW);
   if (!dynamicHinstance)
     throw DynareException(__FILE__, __LINE__, "Error when loading " + fName + ": " + dlerror());
-  ntt = reinterpret_cast<int *>(dlsym(dynamicHinstance, "ntt"));
   dynamic_resid_tt = reinterpret_cast<dynamic_tt_fct>(dlsym(dynamicHinstance, "dynamic_resid_tt"));
   dynamic_resid = reinterpret_cast<dynamic_resid_fct>(dlsym(dynamicHinstance, "dynamic_resid"));
   dynamic_g1_tt = reinterpret_cast<dynamic_tt_fct>(dlsym(dynamicHinstance, "dynamic_g1_tt"));
@@ -65,7 +64,7 @@ DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false)
   dynamic_g2 = reinterpret_cast<dynamic_g2_fct>(dlsym(dynamicHinstance, "dynamic_g2"));
   dynamic_g3_tt = reinterpret_cast<dynamic_tt_fct>(dlsym(dynamicHinstance, "dynamic_g3_tt"));
   dynamic_g3 = reinterpret_cast<dynamic_g3_fct>(dlsym(dynamicHinstance, "dynamic_g3"));
-  if (!ntt || !dynamic_resid_tt || !dynamic_resid
+  if (!dynamic_resid_tt || !dynamic_resid
       || !dynamic_g1_tt || !dynamic_g1
       || !dynamic_g2_tt || !dynamic_g2
       || !dynamic_g3_tt || !dynamic_g3)
@@ -75,7 +74,7 @@ DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false)
     }
 #endif
 
-  tt = std::make_unique<double[]>(*ntt);
+  tt = std::make_unique<double[]>(ntt);
 }
 
 DynamicModelDLL::~DynamicModelDLL()
diff --git a/mex/sources/k_order_perturbation/dynamic_dll.hh b/mex/sources/k_order_perturbation/dynamic_dll.hh
index b29e5d66ea9aa037b8a12f8b170b0082ab92ad5e..ec04c797c00c09ca5a4acdf7aba2e9acf391e780 100644
--- a/mex/sources/k_order_perturbation/dynamic_dll.hh
+++ b/mex/sources/k_order_perturbation/dynamic_dll.hh
@@ -47,7 +47,6 @@ using dynamic_g3_fct = void (*)(const double *y, const double *x, int nb_row_x,
 class DynamicModelDLL : public DynamicModelAC
 {
 private:
-  int *ntt;
   dynamic_tt_fct dynamic_resid_tt, dynamic_g1_tt, dynamic_g2_tt, dynamic_g3_tt;
   dynamic_resid_fct dynamic_resid;
   dynamic_g1_fct dynamic_g1;
@@ -62,7 +61,7 @@ private:
 
 public:
   // construct and load Dynamic model DLL
-  explicit DynamicModelDLL(const std::string &fname);
+  explicit DynamicModelDLL(const std::string &fname, int ntt_arg);
   virtual ~DynamicModelDLL();
 
   void eval(const Vector &y, const Vector &x, const Vector &params, const Vector &ySteady,
diff --git a/mex/sources/k_order_perturbation/dynamic_m.cc b/mex/sources/k_order_perturbation/dynamic_m.cc
index e129d169ebf5d98d76e9825bdaf1025f9c3cc09f..0818879966db97d829b8702117bf64d751fe1ecf 100644
--- a/mex/sources/k_order_perturbation/dynamic_m.cc
+++ b/mex/sources/k_order_perturbation/dynamic_m.cc
@@ -24,7 +24,8 @@
 
 #include "dynamic_m.hh"
 
-DynamicModelMFile::DynamicModelMFile(const std::string &modName) noexcept(false) :
+DynamicModelMFile::DynamicModelMFile(const std::string &modName, int ntt_arg) :
+  DynamicModelAC(ntt_arg),
   DynamicMFilename{modName + ".dynamic"}
 {
 }
diff --git a/mex/sources/k_order_perturbation/dynamic_m.hh b/mex/sources/k_order_perturbation/dynamic_m.hh
index 0ae1e9aae3c6f9cc2feed523217e818141c7f932..0e170f3558f440b3781647af289ef39d5468d130 100644
--- a/mex/sources/k_order_perturbation/dynamic_m.hh
+++ b/mex/sources/k_order_perturbation/dynamic_m.hh
@@ -35,7 +35,7 @@ private:
   const std::string DynamicMFilename;
   static void unpackSparseMatrixAndCopyIntoTwoDMatData(mxArray *sparseMat, TwoDMatrix &tdm);
 public:
-  explicit DynamicModelMFile(const std::string &modName);
+  explicit DynamicModelMFile(const std::string &modName, int ntt_arg);
   virtual ~DynamicModelMFile() = default;
   void eval(const Vector &y, const Vector &x, const Vector &params, const Vector &ySteady,
             Vector &residual, std::vector<TwoDMatrix> &md) override;
diff --git a/mex/sources/k_order_perturbation/k_order_perturbation.cc b/mex/sources/k_order_perturbation/k_order_perturbation.cc
index b050b9b9298ab12f37bace41c04b89a5c40c7dd1..66c50cefc909ce570797ec7d283ac1afbec9d861 100644
--- a/mex/sources/k_order_perturbation/k_order_perturbation.cc
+++ b/mex/sources/k_order_perturbation/k_order_perturbation.cc
@@ -163,6 +163,11 @@ extern "C" {
     if (nEndo != static_cast<int>(endoNames.size()) || nExog != static_cast<int>(exoNames.size()))
       DYN_MEX_FUNC_ERR_MSG_TXT("Incorrect size of M_.endo_names or M_.exo_names");
 
+    mxFldp = mxGetField(M_, 0, "dynamic_tmp_nbr");
+    if (static_cast<int>(mxGetM(mxFldp)) < kOrder+1 || mxGetN(mxFldp) != 1)
+      DYN_MEX_FUNC_ERR_MSG_TXT("Incorrect size of M_.dynamic_tmp_nbr");
+    int ntt = std::accumulate(mxGetPr(mxFldp), mxGetPr(mxFldp)+kOrder+1, 0);
+
     const int nSteps = 0; // Dynare++ solving steps, for time being default to 0 = deterministic steady state
 
     try
@@ -171,9 +176,9 @@ extern "C" {
 
         std::unique_ptr<DynamicModelAC> dynamicModelFile;
         if (use_dll)
-          dynamicModelFile = std::make_unique<DynamicModelDLL>(fName);
+          dynamicModelFile = std::make_unique<DynamicModelDLL>(fName, ntt);
         else
-          dynamicModelFile = std::make_unique<DynamicModelMFile>(fName);
+          dynamicModelFile = std::make_unique<DynamicModelMFile>(fName, ntt);
 
         // intiate tensor library
         TLStatic::init(kOrder, nStat+2*nPred+3*nBoth+2*nForw+nExog);