diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index 055da0334d63928fd479ace1c4db3f9cdffa0f49..c046b914202655f8e349cf4e1bbad292d3875fd6 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -2955,7 +2955,29 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de
       outstruct = "oo_.";
     }
 
-  output << modstruct << "orig_maximum_endo_lag = " << max_endo_lag_orig << ";" << endl
+  if (max_endo_lag_by_var.size() != symbol_table.orig_endo_nbr())
+    {
+      cerr << "ERROR: the number of endogenous variables found in the model block"
+           << " is not equal to the number declared" << endl;
+      exit(EXIT_FAILURE);
+    }
+
+  if (max_exo_lag_by_var.size() != symbol_table.exo_nbr())
+    {
+      cerr << "ERROR: the number of exogenous variables found in the model block"
+           << " is not equal to the number declared" << endl;
+      exit(EXIT_FAILURE);
+    }
+
+  output << modstruct << "max_endo_lag_by_var = [";
+  for (const auto & it : max_endo_lag_by_var)
+    output << it.second << " ";
+  output << "];" << endl
+         << modstruct << "max_exo_lag_by_var = [";
+  for (const auto & it : max_exo_lag_by_var)
+    output << it.second << " ";
+  output << "];" << endl
+         << modstruct << "orig_maximum_endo_lag = " << max_endo_lag_orig << ";" << endl
          << modstruct << "orig_maximum_endo_lead = " << max_endo_lead_orig << ";" << endl
          << modstruct << "orig_maximum_exo_lag = " << max_exo_lag_orig << ";" << endl
          << modstruct << "orig_maximum_exo_lead = " << max_exo_lead_orig << ";" << endl
@@ -5546,21 +5568,35 @@ DynamicModel::setLeadsLagsOrig()
     for (const auto & dynvar : dynvars)
     {
       int lag = dynvar.second;
-      SymbolType type = symbol_table.getType(dynvar.first);
 
       max_lead_orig = max(lag, max_lead_orig);
       max_lag_orig = max(-lag, max_lag_orig);
 
-      switch (type)
+
+      switch (symbol_table.getType(dynvar.first))
         {
         case SymbolType::endogenous:
-          max_endo_lead_orig = max(lag, max_endo_lead_orig);
-          max_endo_lag_orig = max(-lag, max_endo_lag_orig);
-          break;
+          {
+            max_endo_lead_orig = max(lag, max_endo_lead_orig);
+            max_endo_lag_orig = max(-lag, max_endo_lag_orig);
+            auto var = max_endo_lag_by_var.find(dynvar.first);
+            if (var != max_endo_lag_by_var.end())
+              max_endo_lag_by_var[dynvar.first] = max(0, lag);
+            else
+              max_endo_lag_by_var[dynvar.first] = max(var->second, lag);
+            break;
+          }
         case SymbolType::exogenous:
-          max_exo_lead_orig = max(lag, max_exo_lead_orig);
-          max_exo_lag_orig = max(-lag, max_exo_lag_orig);
-          break;
+          {
+            max_exo_lead_orig = max(lag, max_exo_lead_orig);
+            max_exo_lag_orig = max(-lag, max_exo_lag_orig);
+            auto var = max_exo_lag_by_var.find(dynvar.first);
+            if (var != max_exo_lag_by_var.end())
+              max_exo_lag_by_var[dynvar.first] = max(0, lag);
+            else
+              max_exo_lag_by_var[dynvar.first] = max(var->second, lag);
+            break;
+          }
         case SymbolType::exogenousDet:
           max_exo_det_lead_orig = max(lag, max_exo_det_lead_orig);
           max_exo_det_lag_orig = max(-lag, max_exo_det_lag_orig);
diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh
index 1991d5d3643a474fd838c64326495c07f5bef427..5264a22b8248e3c8666e1081ccf161574f009bab 100644
--- a/src/DynamicModel.hh
+++ b/src/DynamicModel.hh
@@ -84,6 +84,9 @@ private:
   //! Maximum lag and lead over deterministic exogenous variables (positive values) of original model
   int max_exo_det_lag_orig{0}, max_exo_det_lead_orig{0};
 
+  //! Max lags by symb_id
+  map<int, int> max_endo_lag_by_var, max_exo_lag_by_var;
+
   //! Cross reference information
   map<int, ExprNode::EquationInfo> xrefs;
   map<pair<int, int>, set<int>> xref_param;