diff --git a/src/ExprNode.cc b/src/ExprNode.cc
index bd36441d9e96517292f044daa9dbabcba3347a01..b2bf1a19f162e66e49326abe9dd170f169eb9fd3 100644
--- a/src/ExprNode.cc
+++ b/src/ExprNode.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2007-2021 Dynare Team
+ * Copyright © 2007-2022 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -3471,7 +3471,10 @@ UnaryOpNode::substituteUnaryOpNodes(const lag_equivalence_table_t &nodes, subst_
      must be substituted. We create the auxiliary variable and fill the
      substitution table for all those similar nodes, in an iteration going from
      leads to lags. */
-  int base_index = 0;
+  int base_index = it->second.rbegin()->first; // Within the equivalence class,
+                                               // index of the node that will
+                                               // be used as the definition for
+                                               // the aux var.
   VariableNode *aux_var = nullptr;
   for (auto rit = it->second.rbegin(); rit != it->second.rend(); ++rit)
     if (rit == it->second.rbegin())
@@ -3486,9 +3489,9 @@ UnaryOpNode::substituteUnaryOpNodes(const lag_equivalence_table_t &nodes, subst_
             exit(EXIT_FAILURE);
           }
 
+        auto argsubst_shifted = argsubst->decreaseLeadsLags(index - base_index);
         int symb_id;
-        auto vn = dynamic_cast<VariableNode *>(argsubst);
-        if (!vn)
+        if (auto vn = dynamic_cast<VariableNode *>(argsubst_shifted); !vn)
           symb_id = datatree.symbol_table.addUnaryOpAuxiliaryVar(this->idx, dynamic_cast<UnaryOpNode *>(rit->second), unary_op);
         else
           symb_id = datatree.symbol_table.addUnaryOpAuxiliaryVar(this->idx, dynamic_cast<UnaryOpNode *>(rit->second), unary_op,
@@ -3497,7 +3500,6 @@ UnaryOpNode::substituteUnaryOpNodes(const lag_equivalence_table_t &nodes, subst_
         neweqs.push_back(datatree.AddEqual(aux_var,
                                            dynamic_cast<UnaryOpNode *>(rit->second)));
         subst_table[rit->second] = dynamic_cast<VariableNode *>(aux_var);
-        base_index = rit->first;
       }
     else
       subst_table[rit->second] = dynamic_cast<VariableNode *>(aux_var->decreaseLeadsLags(base_index - rit->first));