diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index cb62cea2671b79f8ab89cccf743bc193bfa8d728..2785b7812ffe75fc586b2403c3ea0e3723ac22f6 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -3603,7 +3603,8 @@ DynamicModel::getVarMaxLag(StaticModel &static_model, vector<int> &eqnumber) con
   int max_lag = 0;
   for (vector<int>::const_iterator it = eqnumber.begin();
        it != eqnumber.end(); it++)
-    equations[*it]->get_arg2()->VarMaxLag(static_model, lhs_static, max_lag);
+    max_lag = max(max_lag,
+                  equations[*it]->get_arg2()->VarMaxLag(static_model, lhs_static));
 
   return max_lag;
 }
@@ -3784,22 +3785,6 @@ DynamicModel::getUndiffLHSForPac(vector<int> &lhs, vector<expr_t> &lhs_expr_t, v
     }
 }
 
-int
-DynamicModel::getUndiffMaxLag(StaticModel &static_model, vector<expr_t> &lhs, vector<int> &eqnumber) const
-{
-  set<expr_t> lhs_static;
-  for(vector<expr_t>::const_iterator it = lhs.begin();
-      it != lhs.end(); it++)
-    lhs_static.insert((*it)->toStatic(static_model));
-
-  int max_lag = 0;
-  for (vector<int>::const_iterator it = eqnumber.begin();
-       it != eqnumber.end(); it++)
-    equations[*it]->get_arg2()->VarMaxLag(static_model, lhs_static, max_lag);
-
-  return max_lag;
-}
-
 void
 DynamicModel::walkPacParameters()
 {
diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh
index 8eb69ecc79853ba15f4f99a5f3cd0ceb48a10a7c..2d64b422d0ae7dd2173b375834eaa724f8df341d 100644
--- a/src/DynamicModel.hh
+++ b/src/DynamicModel.hh
@@ -330,8 +330,6 @@ public:
                                  int max_lag,
                                  vector<bool> &nonstationary,
                                  int growth_symb_id);
-  //! Get the max lag for the PAC VAR
-  int getUndiffMaxLag(StaticModel &static_model, vector<expr_t> &lhs, vector<int> &eqnumber) const;
 
   //! Substitutes pac_expectation operator
   void substitutePacExpectation();
diff --git a/src/ExprNode.cc b/src/ExprNode.cc
index 422e6c1e4cdb86122b9fc27c4c711d766661f508..4c21a481a139daa6e5d8560bd5627effbace3bda 100644
--- a/src/ExprNode.cc
+++ b/src/ExprNode.cc
@@ -487,9 +487,10 @@ NumConstNode::VarMinLag() const
   return 1;
 }
 
-void
-NumConstNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const
+int
+NumConstNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
 {
+  return 0;
 }
 
 int
@@ -1412,11 +1413,13 @@ VariableNode::undiff() const
   return const_cast<VariableNode *>(this);
 }
 
-void
-VariableNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const
+int
+VariableNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
 {
-  if (-lag > max_lag)
-    max_lag = -lag;
+  auto it = static_lhs.find(this->toStatic(static_datatree));
+  if (it == static_lhs.end())
+    return 0;
+  return maxLag();
 }
 
 int
@@ -2966,28 +2969,13 @@ UnaryOpNode::undiff() const
   return arg->undiff();
 }
 
-void
-UnaryOpNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const
+int
+UnaryOpNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
 {
-  if (op_code != oDiff)
-    arg->VarMaxLag(static_datatree, static_lhs, max_lag);
-  else
-    {
-      auto it = static_lhs.find(this->toStatic(static_datatree));
-      if (it != static_lhs.end())
-        {
-          int max_lag_tmp = arg->maxLag() - arg->countDiffs();
-          if (max_lag_tmp > max_lag)
-            max_lag = max_lag_tmp;
-        }
-      else
-        {
-          int max_lag_tmp = 0;
-          arg->VarMaxLag(static_datatree, static_lhs, max_lag_tmp);
-          if (max_lag_tmp + 1 > max_lag)
-            max_lag = max_lag_tmp + 1;
-        }
-    }
+  auto it = static_lhs.find(this->toStatic(static_datatree));
+  if (it == static_lhs.end())
+    return 0;
+  return arg->maxLag() - arg->countDiffs();
 }
 
 int
@@ -4329,11 +4317,11 @@ BinaryOpNode::VarMinLag() const
   return min(arg1->VarMinLag(), arg2->VarMinLag());
 }
 
-void
-BinaryOpNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const
+int
+BinaryOpNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
 {
-  arg1->VarMaxLag(static_datatree, static_lhs, max_lag);
-  arg2->VarMaxLag(static_datatree, static_lhs, max_lag);
+  return max(arg1->VarMaxLag(static_datatree, static_lhs),
+             arg2->VarMaxLag(static_datatree, static_lhs));
 }
 
 void
@@ -5706,12 +5694,12 @@ TrinaryOpNode::VarMinLag() const
   return min(min(arg1->VarMinLag(), arg2->VarMinLag()), arg3->VarMinLag());
 }
 
-void
-TrinaryOpNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const
+int
+TrinaryOpNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
 {
-  arg1->VarMaxLag(static_datatree, static_lhs, max_lag);
-  arg2->VarMaxLag(static_datatree, static_lhs, max_lag);
-  arg3->VarMaxLag(static_datatree, static_lhs, max_lag);
+  return max(arg1->VarMaxLag(static_datatree, static_lhs),
+             max(arg2->VarMaxLag(static_datatree, static_lhs),
+                 arg3->VarMaxLag(static_datatree, static_lhs)));
 }
 
 int
@@ -6151,11 +6139,13 @@ int val = 0;
   return val;
 }
 
-void
-AbstractExternalFunctionNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const
+int
+AbstractExternalFunctionNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
 {
+  int max_lag = 0;
   for (auto argument : arguments)
-    argument->VarMaxLag(static_datatree, static_lhs, max_lag);
+    max_lag = max(max_lag, argument->VarMaxLag(static_datatree, static_lhs));
+  return max_lag;
 }
 
 int
@@ -7705,9 +7695,10 @@ VarExpectationNode::VarMinLag() const
   return 1;
 }
 
-void
-VarExpectationNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const
+int
+VarExpectationNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
 {
+  return 0;
 }
 
 int
@@ -8160,9 +8151,10 @@ PacExpectationNode::VarMinLag() const
   return 1;
 }
 
-void
-PacExpectationNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const
+int
+PacExpectationNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
 {
+  return 0;
 }
 
 int
diff --git a/src/ExprNode.hh b/src/ExprNode.hh
index 13071eb0ed8b393b82cdacb7598b8d7e0c69534b..0498ad7e86f08bf81e8f3787e40d5258e1e773b3 100644
--- a/src/ExprNode.hh
+++ b/src/ExprNode.hh
@@ -282,7 +282,7 @@ class ExprNode
       virtual int VarMinLag() const = 0;
 
       //! Find the maximum lag in a VAR: handles case where LHS is diff
-      virtual void VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const = 0;
+      virtual int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const = 0;
 
       //! Finds LHS variable in a VAR equation
       virtual void collectVARLHSVariable(set<expr_t> &result) const = 0;
@@ -595,7 +595,7 @@ public:
   int maxLead() const override;
   int maxLag() const override;
   int VarMinLag() const override;
-  void VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const override;
+  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
   int PacMaxLag(vector<int> &lhs) const override;
   expr_t undiff() const override;
   expr_t decreaseLeadsLags(int n) const override;
@@ -686,7 +686,7 @@ public:
   int maxLead() const override;
   int maxLag() const override;
   int VarMinLag() const override;
-  void VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const override;
+  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
   int PacMaxLag(vector<int> &lhs) const override;
   expr_t undiff() const override;
   expr_t decreaseLeadsLags(int n) const override;
@@ -798,7 +798,7 @@ public:
   int maxLead() const override;
   int maxLag() const override;
   int VarMinLag() const override;
-  void VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const override;
+  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
   int PacMaxLag(vector<int> &lhs) const override;
   expr_t undiff() const override;
   expr_t decreaseLeadsLags(int n) const override;
@@ -930,7 +930,7 @@ public:
   int maxLead() const override;
   int maxLag() const override;
   int VarMinLag() const override;
-  void VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const override;
+  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
   int PacMaxLag(vector<int> &lhs) const override;
   expr_t undiff() const override;
   expr_t decreaseLeadsLags(int n) const override;
@@ -1037,7 +1037,7 @@ public:
   int maxLead() const override;
   int maxLag() const override;
   int VarMinLag() const override;
-  void VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const override;
+  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
   int PacMaxLag(vector<int> &lhs) const override;
   expr_t undiff() const override;
   expr_t decreaseLeadsLags(int n) const override;
@@ -1150,7 +1150,7 @@ public:
   int maxLead() const override;
   int maxLag() const override;
   int VarMinLag() const override;
-  void VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const override;
+  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
   int PacMaxLag(vector<int> &lhs) const override;
   expr_t undiff() const override;
   expr_t decreaseLeadsLags(int n) const override;
@@ -1342,7 +1342,7 @@ public:
   int maxLead() const override;
   int maxLag() const override;
   int VarMinLag() const override;
-  void VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const override;
+  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
   int PacMaxLag(vector<int> &lhs) const override;
   expr_t undiff() const override;
   expr_t decreaseLeadsLags(int n) const override;
@@ -1428,7 +1428,7 @@ public:
   int maxLead() const override;
   int maxLag() const override;
   int VarMinLag() const override;
-  void VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs, int &max_lag) const override;
+  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
   int PacMaxLag(vector<int> &lhs) const override;
   expr_t undiff() const override;
   expr_t decreaseLeadsLags(int n) const override;
diff --git a/src/ModFile.cc b/src/ModFile.cc
index 1e237dc303c4ad0abdaf6c14008ddb342d553bf5..5bcaa0a10aef334d4649551c5f94b3eba10c1952 100644
--- a/src/ModFile.cc
+++ b/src/ModFile.cc
@@ -434,7 +434,7 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, const
                if (!undiff.empty())
                  {
                    dynamic_model.getUndiffLHSForPac(lhs, lhs_expr_t, diff, orig_diff_var, eqnumber, undiff, diff_subst_table);
-                   max_lag = original_model.getUndiffMaxLag(diff_static_model, lhs_expr_t, eqnumber);
+                   max_lag++;
                  }
                pms->fillUndiffedLHS(lhs);
                dynamic_model.walkPacParameters();