diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index 085d13232f8795816485fd9199562c698de8cda1..cc6ff71316219a06781a6660ad9096fd32b62e3b 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -3974,7 +3974,7 @@ DynamicModel::fillVarModelTable() const
 }
 
 void
-DynamicModel::fillVarModelTableFromOrigModel(StaticModel &static_model) const
+DynamicModel::fillVarModelTableFromOrigModel() const
 {
   map<string, vector<int>> lags, orig_diff_var;
   map<string, vector<bool>> diff;
@@ -4024,13 +4024,16 @@ DynamicModel::fillVarModelTableFromOrigModel(StaticModel &static_model) const
           exit(EXIT_FAILURE);
         }
 
-      set<expr_t> lhs_static;
+      set<expr_t> lhs_lag_equiv;
       for(const auto & lh : lhs)
-        lhs_static.insert(lh->toStatic(static_model));
+        {
+          auto [lag_equiv_repr, index] = lh->getLagEquivalenceClass();
+          lhs_lag_equiv.insert(lag_equiv_repr);
+        }
 
       vector<int> max_lag;
       for (auto eqn : it.second)
-        max_lag.push_back(equations[eqn]->arg2->VarMaxLag(static_model, lhs_static));
+        max_lag.push_back(equations[eqn]->arg2->VarMaxLag(lhs_lag_equiv));
       lags[it.first] = max_lag;
       diff[it.first] = diff_vec;
       orig_diff_var[it.first] = orig_diff_var_vec;
@@ -4197,7 +4200,7 @@ DynamicModel::fillErrorComponentMatrix(const ExprNode::subst_table_t &diff_subst
 }
 
 void
-DynamicModel::fillTrendComponentModelTableFromOrigModel(StaticModel &static_model) const
+DynamicModel::fillTrendComponentModelTableFromOrigModel() const
 {
   map<string, vector<int>> lags, orig_diff_var;
   map<string, vector<bool>> diff;
@@ -4247,13 +4250,16 @@ DynamicModel::fillTrendComponentModelTableFromOrigModel(StaticModel &static_mode
           exit(EXIT_FAILURE);
         }
 
-      set<expr_t> lhs_static;
+      set<expr_t> lhs_lag_equiv;
       for(const auto & lh : lhs)
-        lhs_static.insert(lh->toStatic(static_model));
+        {
+          auto [lag_equiv_repr, index] = lh->getLagEquivalenceClass();
+          lhs_lag_equiv.insert(lag_equiv_repr);
+        }
 
       vector<int> max_lag;
       for (auto eqn : it.second)
-        max_lag.push_back(equations[eqn]->arg2->VarMaxLag(static_model, lhs_static));
+        max_lag.push_back(equations[eqn]->arg2->VarMaxLag(lhs_lag_equiv));
       lags[it.first] = max_lag;
       diff[it.first] = diff_vec;
       orig_diff_var[it.first] = orig_diff_var_vec;
diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh
index f3c6663c3758cdb876e3a4681713aa3750a9584c..4ec2244abffec1dd5bf154dee9edd768d9a949aa 100644
--- a/src/DynamicModel.hh
+++ b/src/DynamicModel.hh
@@ -323,12 +323,12 @@ public:
 
   //! Fill the Trend Component Model Table
   void fillTrendComponentModelTable() const;
-  void fillTrendComponentModelTableFromOrigModel(StaticModel &static_model) const;
+  void fillTrendComponentModelTableFromOrigModel() const;
   void fillTrendComponentmodelTableAREC(const ExprNode::subst_table_t &diff_subst_table) const;
 
   //! Fill the Var Model Table
   void fillVarModelTable() const;
-  void fillVarModelTableFromOrigModel(StaticModel &static_model) const;
+  void fillVarModelTableFromOrigModel() const;
 
   //! Update the rhs references in the var model and trend component tables
   //! after substitution of auxiliary variables and find the trend variables
diff --git a/src/ExprNode.cc b/src/ExprNode.cc
index a2c7b84fec87ef0301306aee1dcdb07662fbc7ff..4a88be9dba2ae0bb29437a3788f01c390f92998d 100644
--- a/src/ExprNode.cc
+++ b/src/ExprNode.cc
@@ -599,7 +599,7 @@ NumConstNode::VarMinLag() const
 }
 
 int
-NumConstNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
+NumConstNode::VarMaxLag(const set<expr_t> &lhs_lag_equiv) const
 {
   return 0;
 }
@@ -1638,10 +1638,11 @@ VariableNode::undiff() const
 }
 
 int
-VariableNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
+VariableNode::VarMaxLag(const set<expr_t> &lhs_lag_equiv) const
 {
-  auto it = static_lhs.find(this->toStatic(static_datatree));
-  if (it == static_lhs.end())
+  auto [lag_equiv_repr, index] = getLagEquivalenceClass();
+  auto it = lhs_lag_equiv.find(lag_equiv_repr);
+  if (it == lhs_lag_equiv.end())
     return 0;
   return maxLag();
 }
@@ -3355,10 +3356,11 @@ UnaryOpNode::undiff() const
 }
 
 int
-UnaryOpNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
+UnaryOpNode::VarMaxLag(const set<expr_t> &lhs_lag_equiv) const
 {
-  auto it = static_lhs.find(this->toStatic(static_datatree));
-  if (it == static_lhs.end())
+  auto [lag_equiv_repr, index] = getLagEquivalenceClass();
+  auto it = lhs_lag_equiv.find(lag_equiv_repr);
+  if (it == lhs_lag_equiv.end())
     return 0;
   return arg->maxLag();
 }
@@ -4832,10 +4834,10 @@ BinaryOpNode::VarMinLag() const
 }
 
 int
-BinaryOpNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
+BinaryOpNode::VarMaxLag(const set<expr_t> &lhs_lag_equiv) const
 {
-  return max(arg1->VarMaxLag(static_datatree, static_lhs),
-             arg2->VarMaxLag(static_datatree, static_lhs));
+  return max(arg1->VarMaxLag(lhs_lag_equiv),
+             arg2->VarMaxLag(lhs_lag_equiv));
 }
 
 void
@@ -6636,11 +6638,11 @@ TrinaryOpNode::VarMinLag() const
 }
 
 int
-TrinaryOpNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
+TrinaryOpNode::VarMaxLag(const set<expr_t> &lhs_lag_equiv) const
 {
-  return max(arg1->VarMaxLag(static_datatree, static_lhs),
-             max(arg2->VarMaxLag(static_datatree, static_lhs),
-                 arg3->VarMaxLag(static_datatree, static_lhs)));
+  return max(arg1->VarMaxLag(lhs_lag_equiv),
+             max(arg2->VarMaxLag(lhs_lag_equiv),
+                 arg3->VarMaxLag(lhs_lag_equiv)));
 }
 
 int
@@ -7119,11 +7121,11 @@ int val = 0;
 }
 
 int
-AbstractExternalFunctionNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
+AbstractExternalFunctionNode::VarMaxLag(const set<expr_t> &lhs_lag_equiv) const
 {
   int max_lag = 0;
   for (auto argument : arguments)
-    max_lag = max(max_lag, argument->VarMaxLag(static_datatree, static_lhs));
+    max_lag = max(max_lag, argument->VarMaxLag(lhs_lag_equiv));
   return max_lag;
 }
 
@@ -8756,7 +8758,7 @@ VarExpectationNode::VarMinLag() const
 }
 
 int
-VarExpectationNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
+VarExpectationNode::VarMaxLag(const set<expr_t> &lhs_lag_equiv) const
 {
   cerr << "VarExpectationNode::VarMaxLag not implemented." << endl;
   exit(EXIT_FAILURE);
@@ -9192,7 +9194,7 @@ PacExpectationNode::VarMinLag() const
 }
 
 int
-PacExpectationNode::VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const
+PacExpectationNode::VarMaxLag(const set<expr_t> &lhs_lag_equiv) const
 {
   return 0;
 }
diff --git a/src/ExprNode.hh b/src/ExprNode.hh
index 44d7dc27e161d1d17b2e7ca0f1679c4598e61c69..f74bd1d1df8542791e6f0663aa16d671c6cf7a97 100644
--- a/src/ExprNode.hh
+++ b/src/ExprNode.hh
@@ -345,7 +345,7 @@ class ExprNode
       virtual int VarMinLag() const = 0;
 
       //! Find the maximum lag in a VAR: handles case where LHS is diff
-      virtual int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const = 0;
+      virtual int VarMaxLag(const set<expr_t> &lhs_lag_equiv) const = 0;
 
       //! Finds LHS variable in a VAR equation
       virtual void collectVARLHSVariable(set<expr_t> &result) const = 0;
@@ -730,7 +730,7 @@ public:
   int maxLag() const override;
   int maxLagWithDiffsExpanded() const override;
   int VarMinLag() const override;
-  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
+  int VarMaxLag(const set<expr_t> &lhs_lag_equiv) const override;
   int PacMaxLag(int lhs_symb_id) const override;
   int getPacTargetSymbId(int lhs_symb_id, int undiff_lhs_symb_id) const override;
   expr_t undiff() const override;
@@ -813,7 +813,7 @@ public:
   int maxLag() const override;
   int maxLagWithDiffsExpanded() const override;
   int VarMinLag() const override;
-  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
+  int VarMaxLag(const set<expr_t> &lhs_lag_equiv) const override;
   int PacMaxLag(int lhs_symb_id) const override;
   int getPacTargetSymbId(int lhs_symb_id, int undiff_lhs_symb_id) const override;
   expr_t undiff() const override;
@@ -921,7 +921,7 @@ public:
   int maxLag() const override;
   int maxLagWithDiffsExpanded() const override;
   int VarMinLag() const override;
-  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
+  int VarMaxLag(const set<expr_t> &lhs_lag_equiv) const override;
   int PacMaxLag(int lhs_symb_id) const override;
   int getPacTargetSymbId(int lhs_symb_id, int undiff_lhs_symb_id) const override;
   expr_t undiff() const override;
@@ -1033,7 +1033,7 @@ public:
   int maxLag() const override;
   int maxLagWithDiffsExpanded() const override;
   int VarMinLag() const override;
-  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
+  int VarMaxLag(const set<expr_t> &lhs_lag_equiv) const override;
   int PacMaxLag(int lhs_symb_id) const override;
   int getPacTargetSymbIdHelper(int lhs_symb_id, int undiff_lhs_symb_id, const set<pair<int, int>> & endogs) const;
   int getPacTargetSymbId(int lhs_symb_id, int undiff_lhs_symb_id) const override;
@@ -1164,7 +1164,7 @@ public:
   int maxLag() const override;
   int maxLagWithDiffsExpanded() const override;
   int VarMinLag() const override;
-  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
+  int VarMaxLag(const set<expr_t> &lhs_lag_equiv) const override;
   int PacMaxLag(int lhs_symb_id) const override;
   int getPacTargetSymbId(int lhs_symb_id, int undiff_lhs_symb_id) const override;
   expr_t undiff() const override;
@@ -1284,7 +1284,7 @@ public:
   int maxLag() const override;
   int maxLagWithDiffsExpanded() const override;
   int VarMinLag() const override;
-  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
+  int VarMaxLag(const set<expr_t> &lhs_lag_equiv) const override;
   int PacMaxLag(int lhs_symb_id) const override;
   int getPacTargetSymbId(int lhs_symb_id, int undiff_lhs_symb_id) const override;
   expr_t undiff() const override;
@@ -1481,7 +1481,7 @@ public:
   int maxLag() const override;
   int maxLagWithDiffsExpanded() const override;
   int VarMinLag() const override;
-  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
+  int VarMaxLag(const set<expr_t> &lhs_lag_equiv) const override;
   int PacMaxLag(int lhs_symb_id) const override;
   int getPacTargetSymbId(int lhs_symb_id, int undiff_lhs_symb_id) const override;
   expr_t undiff() const override;
@@ -1562,7 +1562,7 @@ public:
   int maxLag() const override;
   int maxLagWithDiffsExpanded() const override;
   int VarMinLag() const override;
-  int VarMaxLag(DataTree &static_datatree, set<expr_t> &static_lhs) const override;
+  int VarMaxLag(const set<expr_t> &lhs_lag_equiv) const override;
   int PacMaxLag(int lhs_symb_id) const override;
   int getPacTargetSymbId(int lhs_symb_id, int undiff_lhs_symb_id) const override;
   expr_t undiff() const override;
diff --git a/src/ModFile.cc b/src/ModFile.cc
index 8567a6138599ade20ff94412cf74070e34268a6f..85527a00903c9a4e52ed4486782f7423e4efbfb9 100644
--- a/src/ModFile.cc
+++ b/src/ModFile.cc
@@ -51,7 +51,6 @@ ModFile::ModFile(WarningConsolidation &warnings_arg)
              trend_component_model_table, var_model_table},
     static_model{symbol_table, num_constants, external_functions_table},
     steady_state_model{symbol_table, num_constants, external_functions_table, static_model},
-    diff_static_model{symbol_table, num_constants, external_functions_table},
     warnings{warnings_arg}
 {
 }
@@ -454,10 +453,10 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, const
 
   // Fill Trend Component Model Table
   dynamic_model.fillTrendComponentModelTable();
-  original_model.fillTrendComponentModelTableFromOrigModel(diff_static_model);
+  original_model.fillTrendComponentModelTableFromOrigModel();
   dynamic_model.fillTrendComponentmodelTableAREC(diff_subst_table);
   dynamic_model.fillVarModelTable();
-  original_model.fillVarModelTableFromOrigModel(diff_static_model);
+  original_model.fillVarModelTableFromOrigModel();
 
   // Pac Model
   int i = 0;
diff --git a/src/ModFile.hh b/src/ModFile.hh
index 06b6ff725db5a8e76ad1e338bc905b417e1af597..fd79a2ebd328662a37d30afc23ce2de6b49a7200 100644
--- a/src/ModFile.hh
+++ b/src/ModFile.hh
@@ -75,8 +75,6 @@ public:
   StaticModel static_model;
   //! Static model, as declared in the "steady_state_model" block if present
   SteadyStateModel steady_state_model;
-  //! Static model used for mapping arguments of diff operator
-  StaticModel diff_static_model;
 
   //! Option linear
   bool linear{false};