diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index 053481302cf37feb75526c34cd9bf136d543e5ef..34c7b21f5b946d4d55ee66486cb8a5723526eded 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -970,8 +970,8 @@ DynamicModel::writeModelEquationsCode(const string &basename, const map_idx_t &m
                            simulation_type,
                            0,
                            symbol_table.endo_nbr(),
-                           variable_reordered,
-                           equation_reordered,
+                           endo_idx_block2orig,
+                           eq_idx_block2orig,
                            false,
                            symbol_table.endo_nbr(),
                            max_endo_lag,
@@ -1247,8 +1247,8 @@ DynamicModel::writeModelEquationsCode_Block(const string &basename, const map_id
                                simulation_type,
                                getBlockFirstEquation(block),
                                block_size,
-                               variable_reordered,
-                               equation_reordered,
+                               endo_idx_block2orig,
+                               eq_idx_block2orig,
                                blocks_linear[block],
                                symbol_table.endo_nbr(),
                                block_max_lag,
@@ -3121,9 +3121,9 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de
     for (int lag = -max_endo_lag; lag < 0; lag++)
       try
         {
-          getDerivID(symbol_table.getID(SymbolType::endogenous, variable_reordered[endoID]), lag);
-          if (lag < 0 && find(state_var.begin(), state_var.end(), variable_reordered[endoID]+1) == state_var.end())
-            state_var.push_back(variable_reordered[endoID]+1);
+          getDerivID(symbol_table.getID(SymbolType::endogenous, endo_idx_block2orig[endoID]), lag);
+          if (lag < 0 && find(state_var.begin(), state_var.end(), endo_idx_block2orig[endoID]+1) == state_var.end())
+            state_var.push_back(endo_idx_block2orig[endoID]+1);
         }
       catch (UnknownDerivIDException &e)
         {
@@ -3344,19 +3344,19 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de
       int nb_endo = symbol_table.endo_nbr();
       output << modstruct << "block_structure.variable_reordered = [";
       for (int i = 0; i < nb_endo; i++)
-        output << " " << variable_reordered[i]+1;
+        output << " " << endo_idx_block2orig[i]+1;
       output << "];" << endl;
       output << modstruct << "block_structure.equation_reordered = [";
       for (int i = 0; i < nb_endo; i++)
-        output << " " << equation_reordered[i]+1;
+        output << " " << eq_idx_block2orig[i]+1;
       output << "];" << endl;
       vector<int> variable_inv_reordered(nb_endo);
 
       for (int i = 0; i < nb_endo; i++)
-        variable_inv_reordered[variable_reordered[i]] = i;
+        variable_inv_reordered[endo_idx_block2orig[i]] = i;
 
       for (int it : state_var)
-        state_equ.push_back(equation_reordered[variable_inv_reordered[it - 1]]+1);
+        state_equ.push_back(eq_idx_block2orig[variable_inv_reordered[it - 1]]+1);
 
       map<tuple<int, int, int>, int> lag_row_incidence;
       for (const auto & [indices, d1] : derivatives[1])
@@ -4874,8 +4874,8 @@ DynamicModel::computingPass(bool jacobianExo, int derivsOrder, int paramsDerivsO
         {
           for (int j = 0; j < getBlockSize(i); j++)
             {
-              equation_block[equation_reordered[k]] = i;
-              int l = variable_reordered[k];
+              equation_block[eq_idx_block2orig[k]] = i;
+              int l = endo_idx_block2orig[k];
               variable_block_lead_lag[l] = { i, variable_lag_lead[l].first, variable_lag_lead[l].second };
               k++;
             }
@@ -5101,7 +5101,7 @@ void
 DynamicModel::collect_block_first_order_derivatives()
 {
   //! vector for an equation or a variable indicates the block number
-  vector<int> equation_2_block(equation_reordered.size()), variable_2_block(variable_reordered.size());
+  vector<int> equation_2_block(eq_idx_block2orig.size()), variable_2_block(endo_idx_block2orig.size());
   int nb_blocks = getNbBlocks();
   for (int block = 0; block < nb_blocks; block++)
     {
diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh
index 6e8efb6bbcfa67acd549485ea60be83a78d76215..b16422d569faeed26514e6bd15cec0e9a0faaacf 100644
--- a/src/DynamicModel.hh
+++ b/src/DynamicModel.hh
@@ -611,37 +611,37 @@ public:
   EquationType
   getBlockEquationType(int block_number, int equation_number) const override
   {
-    return equation_type_and_normalized_equation[equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first;
+    return equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first;
   };
   //! Return true if the equation has been normalized
   bool
   isBlockEquationRenormalized(int block_number, int equation_number) const override
   {
-    return equation_type_and_normalized_equation[equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first == EquationType::evaluate_s;
+    return equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first == EquationType::evaluate_s;
   };
   //! Return the expr_t of the equation equation_number belonging to the block block_number
   expr_t
   getBlockEquationExpr(int block_number, int equation_number) const override
   {
-    return equations[equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]];
+    return equations[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]];
   };
   //! Return the expr_t of the renormalized equation equation_number belonging to the block block_number
   expr_t
   getBlockEquationRenormalizedExpr(int block_number, int equation_number) const override
   {
-    return equation_type_and_normalized_equation[equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].second;
+    return equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].second;
   };
   //! Return the original number of equation equation_number belonging to the block block_number
   int
   getBlockEquationID(int block_number, int equation_number) const override
   {
-    return equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number];
+    return eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number];
   };
   //! Return the original number of variable variable_number belonging to the block block_number
   int
   getBlockVariableID(int block_number, int variable_number) const override
   {
-    return variable_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+variable_number];
+    return endo_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+variable_number];
   };
   //! Return the original number of the exogenous variable varexo_number belonging to the block block_number
   int
@@ -653,13 +653,13 @@ public:
   int
   getBlockInitialEquationID(int block_number, int equation_number) const override
   {
-    return inv_equation_reordered[equation_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
+    return eq_idx_orig2block[equation_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
   };
   //! Return the position of variable_number in the block number belonging to the block block_number
   int
   getBlockInitialVariableID(int block_number, int variable_number) const override
   {
-    return inv_variable_reordered[variable_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
+    return endo_idx_orig2block[variable_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
   };
   //! Return the block number containing the endogenous variable variable_number
   int
diff --git a/src/ModelTree.cc b/src/ModelTree.cc
index 09c7877be0b25f7988ad3d4908d35a83ce8af863..cb43b4631dea8451b621f45567caf48e1fe05dec 100644
--- a/src/ModelTree.cc
+++ b/src/ModelTree.cc
@@ -157,10 +157,10 @@ ModelTree::ModelTree(const ModelTree &m) :
   computed_derivs_order{m.computed_derivs_order},
   NNZDerivatives{m.NNZDerivatives},
   v_temporary_terms_inuse{m.v_temporary_terms_inuse},
-  equation_reordered{m.equation_reordered},
-  variable_reordered{m.variable_reordered},
-  inv_equation_reordered{m.inv_equation_reordered},
-  inv_variable_reordered{m.inv_variable_reordered},
+  eq_idx_block2orig{m.eq_idx_block2orig},
+  endo_idx_block2orig{m.endo_idx_block2orig},
+  eq_idx_orig2block{m.eq_idx_orig2block},
+  endo_idx_orig2block{m.endo_idx_orig2block},
   map_idx{m.map_idx},
   block_type_firstequation_size_mfs{m.block_type_firstequation_size_mfs},
   blocks_linear{m.blocks_linear},
@@ -208,10 +208,10 @@ ModelTree::operator=(const ModelTree &m)
   nonstationary_symbols_map.clear();
 
   dynamic_jacobian.clear();
-  equation_reordered = m.equation_reordered;
-  variable_reordered = m.variable_reordered;
-  inv_equation_reordered = m.inv_equation_reordered;
-  inv_variable_reordered = m.inv_variable_reordered;
+  eq_idx_block2orig = m.eq_idx_block2orig;
+  endo_idx_block2orig = m.endo_idx_block2orig;
+  eq_idx_orig2block = m.eq_idx_orig2block;
+  endo_idx_orig2block = m.endo_idx_orig2block;
   first_chain_rule_derivatives.clear();
   map_idx = m.map_idx;
   equation_type_and_normalized_equation.clear();
@@ -470,8 +470,8 @@ ModelTree::select_non_linear_equations_and_variables(const vector<bool> &is_equa
   for (auto it : endo2eq)
     if (!is_equation_linear[it])
       {
-        equation_reordered[i] = it;
-        variable_reordered[i] = j;
+        eq_idx_block2orig[i] = it;
+        endo_idx_block2orig[i] = j;
         endo2block[j] = 0;
         i++;
         j++;
@@ -481,13 +481,13 @@ ModelTree::select_non_linear_equations_and_variables(const vector<bool> &is_equa
     n_backward(endo2eq.size(), 0), n_mixed(endo2eq.size(), 0);
   for (int i = 0; i < static_cast<int>(endo2eq.size()); i++)
     {
-      if (variable_lag_lead[variable_reordered[i]].first != 0 && variable_lag_lead[variable_reordered[i]].second != 0)
+      if (variable_lag_lead[endo_idx_block2orig[i]].first != 0 && variable_lag_lead[endo_idx_block2orig[i]].second != 0)
         n_mixed[i]++;
-      else if (variable_lag_lead[variable_reordered[i]].first == 0 && variable_lag_lead[variable_reordered[i]].second != 0)
+      else if (variable_lag_lead[endo_idx_block2orig[i]].first == 0 && variable_lag_lead[endo_idx_block2orig[i]].second != 0)
         n_forward[i]++;
-      else if (variable_lag_lead[variable_reordered[i]].first != 0 && variable_lag_lead[variable_reordered[i]].second == 0)
+      else if (variable_lag_lead[endo_idx_block2orig[i]].first != 0 && variable_lag_lead[endo_idx_block2orig[i]].second == 0)
         n_backward[i]++;
-      else if (variable_lag_lead[variable_reordered[i]].first == 0 && variable_lag_lead[variable_reordered[i]].second == 0)
+      else if (variable_lag_lead[endo_idx_block2orig[i]].first == 0 && variable_lag_lead[endo_idx_block2orig[i]].second == 0)
         n_static[i]++;
     }
   cout.flush();
@@ -531,22 +531,22 @@ ModelTree::computePrologueAndEpilogue(const jacob_map_t &static_jacobian)
   const int n = equations.size();
 
   /* Compute reverse map (eq→endo) of normalization. Also initialize
-     “equation_reordered” and “variable_reordered” to the identity
+     “eq_idx_block2orig” and “endo_idx_block2orig” to the identity
      permutation. */
   vector<int> eq2endo(n);
-  equation_reordered.resize(n);
-  variable_reordered.resize(n);
+  eq_idx_block2orig.resize(n);
+  endo_idx_block2orig.resize(n);
   for (int i = 0; i < n; i++)
     {
       int it = endo2eq[i];
       eq2endo[it] = i;
-      equation_reordered[i] = i;
-      variable_reordered[it] = i;
+      eq_idx_block2orig[i] = i;
+      endo_idx_block2orig[it] = i;
     }
 
   /* Compute incidence matrix, equations in rows, variables in columns. Row
      (resp. column) indices are to be interpreted according to
-     “equation_reordered” (resp. “variable_reordered”). Stored in row-major
+     “eq_idx_block2orig” (resp. “endo_idx_block2orig”). Stored in row-major
      order. */
   vector<bool> IM(n*n, false);
   if (cutoff == 0)
@@ -583,12 +583,12 @@ ModelTree::computePrologueAndEpilogue(const jacob_map_t &static_jacobian)
               // Swap equations indexed by “new_prologue” and i
               for (int j = 0; j < n; j++)
                 swap(IM[new_prologue * n + j], IM[i * n + j]);
-              swap(equation_reordered[new_prologue], equation_reordered[i]);
+              swap(eq_idx_block2orig[new_prologue], eq_idx_block2orig[i]);
 
               // Swap variables indexed by “new_prologue” and k (in the matching)
               for (int j = 0; j < n; j++)
                 swap(IM[j * n + new_prologue], IM[j * n + k]);
-              swap(variable_reordered[new_prologue], variable_reordered[k]);
+              swap(endo_idx_block2orig[new_prologue], endo_idx_block2orig[k]);
 
               new_prologue++;
               something_has_been_done = true;
@@ -618,11 +618,11 @@ ModelTree::computePrologueAndEpilogue(const jacob_map_t &static_jacobian)
             {
               for (int j = 0; j < n; j++)
                 swap(IM[(n - 1 - new_epilogue) * n + j], IM[k * n + j]);
-              swap(equation_reordered[n - 1 - new_epilogue], equation_reordered[k]);
+              swap(eq_idx_block2orig[n - 1 - new_epilogue], eq_idx_block2orig[k]);
 
               for (int j = 0; j < n; j++)
                 swap(IM[j * n + n - 1 - new_epilogue], IM[j * n + i]);
-              swap(variable_reordered[n - 1 - new_epilogue], variable_reordered[i]);
+              swap(endo_idx_block2orig[n - 1 - new_epilogue], endo_idx_block2orig[i]);
 
               new_epilogue++;
               something_has_been_done = true;
@@ -642,8 +642,8 @@ ModelTree::equationTypeDetermination(const map<tuple<int, int, int>, expr_t> &fi
   equation_type_and_normalized_equation.resize(equations.size());
   for (int i = 0; i < static_cast<int>(equations.size()); i++)
     {
-      int eq = equation_reordered[i];
-      int var = variable_reordered[i];
+      int eq = eq_idx_block2orig[i];
+      int var = endo_idx_block2orig[i];
       expr_t lhs = equations[eq]->arg1;
       EquationType Equation_Simulation_Type = EquationType::solve;
       BinaryOpNode *normalized_eq = nullptr;
@@ -652,7 +652,7 @@ ModelTree::equationTypeDetermination(const map<tuple<int, int, int>, expr_t> &fi
         {
           expr_t derivative = it->second;
           // Determine whether the equation can be evaluated rather than solved
-          if (lhs->isVariableNodeEqualTo(SymbolType::endogenous, variable_reordered[i], 0)
+          if (lhs->isVariableNodeEqualTo(SymbolType::endogenous, endo_idx_block2orig[i], 0)
               && derivative->isNumConstNodeEqualTo(1))
             Equation_Simulation_Type = EquationType::evaluate;
           else
@@ -686,18 +686,18 @@ ModelTree::getVariableLeadLagByBlock(const vector<int> &endo2simblock, int num_s
     {
       if (i < prologue)
         {
-          variable_blck[variable_reordered[i]] = i;
-          equation_blck[equation_reordered[i]] = i;
+          variable_blck[endo_idx_block2orig[i]] = i;
+          equation_blck[eq_idx_block2orig[i]] = i;
         }
       else if (i < static_cast<int>(endo2simblock.size()) + prologue)
         {
-          variable_blck[variable_reordered[i]] = endo2simblock[i-prologue] + prologue;
-          equation_blck[equation_reordered[i]] = endo2simblock[i-prologue] + prologue;
+          variable_blck[endo_idx_block2orig[i]] = endo2simblock[i-prologue] + prologue;
+          equation_blck[eq_idx_block2orig[i]] = endo2simblock[i-prologue] + prologue;
         }
       else
         {
-          variable_blck[variable_reordered[i]] = i - (nb_endo - num_simblocks - prologue - epilogue);
-          equation_blck[equation_reordered[i]] = i - (nb_endo - num_simblocks - prologue - epilogue);
+          variable_blck[endo_idx_block2orig[i]] = i - (nb_endo - num_simblocks - prologue - epilogue);
+          equation_blck[eq_idx_block2orig[i]] = i - (nb_endo - num_simblocks - prologue - epilogue);
         }
     }
   for (const auto &[key, value] : dynamic_jacobian)
@@ -722,7 +722,7 @@ tuple<vector<pair<int, int>>, lag_lead_vector_t, lag_lead_vector_t,
       vector<int>, vector<int>, vector<int>, vector<int>>
 ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob_map_t &static_jacobian, const equation_type_and_normalized_equation_t &Equation_Type, bool verbose_, bool select_feedback_variable)
 {
-  int nb_var = variable_reordered.size();
+  int nb_var = endo_idx_block2orig.size();
   int n = nb_var - prologue - epilogue;
 
   /* Construct the graph representing the dependencies between all
@@ -735,13 +735,13 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
   for (const auto &[key, value] : cutoff == 0 ? computeSymbolicJacobian() : static_jacobian)
     {
       auto [eq, endo] = key;
-      if (inv_equation_reordered[eq] >= prologue
-          && inv_equation_reordered[eq] < nb_var - epilogue
-          && inv_variable_reordered[endo] >= prologue
-          && inv_variable_reordered[endo] < nb_var - epilogue
+      if (eq_idx_orig2block[eq] >= prologue
+          && eq_idx_orig2block[eq] < nb_var - epilogue
+          && endo_idx_orig2block[endo] >= prologue
+          && endo_idx_orig2block[endo] < nb_var - epilogue
           && eq != endo2eq[endo])
-        add_edge(vertex(inv_equation_reordered[endo2eq[endo]]-prologue, G),
-                 vertex(inv_equation_reordered[eq]-prologue, G), G);
+        add_edge(vertex(eq_idx_orig2block[endo2eq[endo]]-prologue, G),
+                 vertex(eq_idx_orig2block[eq]-prologue, G), G);
     }
 
   /* Identify the simultaneous blocks. Each simultaneous block is given an
@@ -765,17 +765,17 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
   if (select_feedback_variable)
     {
       for (int i = 0; i < n; i++)
-        if (Equation_Type[equation_reordered[i+prologue]].first == EquationType::solve
-            || variable_lag_lead[variable_reordered[i+prologue]].second > 0
-            || variable_lag_lead[variable_reordered[i+prologue]].first > 0
-            || equation_lag_lead[equation_reordered[i+prologue]].second > 0
-            || equation_lag_lead[equation_reordered[i+prologue]].first > 0
+        if (Equation_Type[eq_idx_block2orig[i+prologue]].first == EquationType::solve
+            || variable_lag_lead[endo_idx_block2orig[i+prologue]].second > 0
+            || variable_lag_lead[endo_idx_block2orig[i+prologue]].first > 0
+            || equation_lag_lead[eq_idx_block2orig[i+prologue]].second > 0
+            || equation_lag_lead[eq_idx_block2orig[i+prologue]].first > 0
             || mfs == 0)
           add_edge(vertex(i, G), vertex(i, G), G);
     }
   else
     for (int i = 0; i < n; i++)
-      if (Equation_Type[equation_reordered[i+prologue]].first == EquationType::solve || mfs == 0)
+      if (Equation_Type[eq_idx_block2orig[i+prologue]].first == EquationType::solve || mfs == 0)
         add_edge(vertex(i, G), vertex(i, G), G);
 
   int num_blocks = prologue+num_simblocks+epilogue;
@@ -783,11 +783,11 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
   vector<int> n_static(num_blocks, 0), n_forward(num_blocks, 0),
     n_backward(num_blocks, 0), n_mixed(num_blocks, 0);
 
-  const vector<int> old_equation_reordered(equation_reordered), old_variable_reordered(variable_reordered);
+  const vector<int> old_eq_idx_block2orig(eq_idx_block2orig), old_endo_idx_block2orig(endo_idx_block2orig);
   for (int i = 0; i < prologue; i++)
     {
-      int max_lag = variable_lag_lead[old_variable_reordered[i]].first;
-      int max_lead = variable_lag_lead[old_variable_reordered[i]].second;
+      int max_lag = variable_lag_lead[old_endo_idx_block2orig[i]].first;
+      int max_lead = variable_lag_lead[old_endo_idx_block2orig[i]].second;
       if (max_lag != 0 && max_lead != 0)
         n_mixed[i]++;
       else if (max_lag == 0 && max_lead != 0)
@@ -815,12 +815,12 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
       for (int j = 0; j < 4; j++)
         for (int its : reordered_vertices)
           {
-            int max_lag = variable_lag_lead[old_variable_reordered[its+prologue]].first;
-            int max_lead = variable_lag_lead[old_variable_reordered[its+prologue]].second;
+            int max_lag = variable_lag_lead[old_endo_idx_block2orig[its+prologue]].first;
+            int max_lead = variable_lag_lead[old_endo_idx_block2orig[its+prologue]].second;
             auto reorder = [&]()
                            {
-                             equation_reordered[ordidx] = old_equation_reordered[its+prologue];
-                             variable_reordered[ordidx] = old_variable_reordered[its+prologue];
+                             eq_idx_block2orig[ordidx] = old_eq_idx_block2orig[its+prologue];
+                             endo_idx_block2orig[ordidx] = old_endo_idx_block2orig[its+prologue];
                              ordidx++;
                            };
             if (j == 2 && max_lag != 0 && max_lead != 0)
@@ -850,12 +850,12 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
         for (int fbvertex : feed_back_vertices)
           {
             int idx = v_index1[vertex(fbvertex, subG)];
-            int max_lag = variable_lag_lead[old_variable_reordered[idx+prologue]].first;
-            int max_lead = variable_lag_lead[old_variable_reordered[idx+prologue]].second;
+            int max_lag = variable_lag_lead[old_endo_idx_block2orig[idx+prologue]].first;
+            int max_lead = variable_lag_lead[old_endo_idx_block2orig[idx+prologue]].second;
             auto reorder = [&]()
                            {
-                             equation_reordered[ordidx] = old_equation_reordered[idx+prologue];
-                             variable_reordered[ordidx] = old_variable_reordered[idx+prologue];
+                             eq_idx_block2orig[ordidx] = old_eq_idx_block2orig[idx+prologue];
+                             endo_idx_block2orig[ordidx] = old_endo_idx_block2orig[idx+prologue];
                              ordidx++;
                            };
             if (j == 2 && max_lag != 0 && max_lead != 0)
@@ -883,8 +883,8 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
 
   for (int i = 0; i < epilogue; i++)
     {
-      int max_lag = variable_lag_lead[old_variable_reordered[prologue+n+i]].first;
-      int max_lead = variable_lag_lead[old_variable_reordered[prologue+n+i]].second;
+      int max_lag = variable_lag_lead[old_endo_idx_block2orig[prologue+n+i]].first;
+      int max_lead = variable_lag_lead[old_endo_idx_block2orig[prologue+n+i]].second;
       if (max_lag != 0 && max_lead != 0)
         n_mixed[prologue+num_simblocks+i]++;
       else if (max_lag == 0 && max_lead != 0)
@@ -965,12 +965,12 @@ ModelTree::reduceBlocksAndTypeDetermination(const vector<pair<int, int>> &simblo
       for (count_equ = first_count_equ; count_equ < Blck_Size+first_count_equ; count_equ++)
         {
           set<pair<int, int>> endos_and_lags;
-          equations[equation_reordered[count_equ]]->collectEndogenous(endos_and_lags);
+          equations[eq_idx_block2orig[count_equ]]->collectEndogenous(endos_and_lags);
           for (const auto &[curr_variable, curr_lag] : endos_and_lags)
             {
               if (linear_decomposition)
                 {
-                  if (dynamic_jacobian.find({ curr_lag, equation_reordered[count_equ], curr_variable }) != dynamic_jacobian.end())
+                  if (dynamic_jacobian.find({ curr_lag, eq_idx_block2orig[count_equ], curr_variable }) != dynamic_jacobian.end())
                     {
                       if (curr_lag > Lead)
                         Lead = curr_lag;
@@ -980,9 +980,9 @@ ModelTree::reduceBlocksAndTypeDetermination(const vector<pair<int, int>> &simblo
                 }
               else
                 {
-                  if (find(variable_reordered.begin()+first_count_equ, variable_reordered.begin()+(first_count_equ+Blck_Size), curr_variable)
-                      != variable_reordered.begin()+(first_count_equ+Blck_Size)
-                      && dynamic_jacobian.find({ curr_lag, equation_reordered[count_equ], curr_variable }) != dynamic_jacobian.end())
+                  if (find(endo_idx_block2orig.begin()+first_count_equ, endo_idx_block2orig.begin()+(first_count_equ+Blck_Size), curr_variable)
+                      != endo_idx_block2orig.begin()+(first_count_equ+Blck_Size)
+                      && dynamic_jacobian.find({ curr_lag, eq_idx_block2orig[count_equ], curr_variable }) != dynamic_jacobian.end())
                     {
                       if (curr_lag > Lead)
                         Lead = curr_lag;
@@ -1020,8 +1020,8 @@ ModelTree::reduceBlocksAndTypeDetermination(const vector<pair<int, int>> &simblo
       int l_n_mixed = n_mixed[i];
       if (Blck_Size == 1)
         {
-          if (Equation_Type[equation_reordered[eq]].first == EquationType::evaluate
-              || Equation_Type[equation_reordered[eq]].first == EquationType::evaluate_s)
+          if (Equation_Type[eq_idx_block2orig[eq]].first == EquationType::evaluate
+              || Equation_Type[eq_idx_block2orig[eq]].first == EquationType::evaluate_s)
             {
               if (Simulation_Type == BlockSimulationType::solveBackwardSimple)
                 Simulation_Type = BlockSimulationType::evaluateBackward;
@@ -1039,10 +1039,10 @@ ModelTree::reduceBlocksAndTypeDetermination(const vector<pair<int, int>> &simblo
                 {
                   for (int j = first_equation; j < first_equation+c_Size; j++)
                     {
-                      if (dynamic_jacobian.find({ -1, equation_reordered[eq], variable_reordered[j] })
+                      if (dynamic_jacobian.find({ -1, eq_idx_block2orig[eq], endo_idx_block2orig[j] })
                           != dynamic_jacobian.end())
                         is_lag = true;
-                      if (dynamic_jacobian.find({ +1, equation_reordered[eq], variable_reordered[j] })
+                      if (dynamic_jacobian.find({ +1, eq_idx_block2orig[eq], endo_idx_block2orig[j] })
                           != dynamic_jacobian.end())
                         is_lead = true;
                     }
@@ -1127,7 +1127,7 @@ ModelTree::determineLinearBlocks()
                 d1->collectEndogenous(endogenous);
                 if (endogenous.size() > 0)
                   for (int l = 0; l < block_size; l++)
-                    if (endogenous.find({ variable_reordered[first_variable_position+l], 0 }) != endogenous.end())
+                    if (endogenous.find({ endo_idx_block2orig[first_variable_position+l], 0 }) != endogenous.end())
                       {
                         blocks_linear[block] = false;
                         goto the_end;
@@ -1142,7 +1142,7 @@ ModelTree::determineLinearBlocks()
             d1->collectEndogenous(endogenous);
             if (endogenous.size() > 0)
               for (int l = 0; l < block_size; l++)
-                if (endogenous.find({ variable_reordered[first_variable_position+l], lag }) != endogenous.end())
+                if (endogenous.find({ endo_idx_block2orig[first_variable_position+l], lag }) != endogenous.end())
                   {
                     blocks_linear[block] = false;
                     goto the_end;
@@ -1957,10 +1957,10 @@ void
 ModelTree::initializeVariablesAndEquations()
 {
   for (size_t j = 0; j < equations.size(); j++)
-    equation_reordered.push_back(j);
+    eq_idx_block2orig.push_back(j);
 
   for (int j = 0; j < symbol_table.endo_nbr(); j++)
-    variable_reordered.push_back(j);
+    endo_idx_block2orig.push_back(j);
 }
 
 void
@@ -2379,11 +2379,11 @@ void
 ModelTree::updateReverseVariableEquationOrderings()
 {
   int n = equations.size();
-  inv_equation_reordered.resize(n);
-  inv_variable_reordered.resize(n);
+  eq_idx_orig2block.resize(n);
+  endo_idx_orig2block.resize(n);
   for (int i = 0; i < n; i++)
     {
-      inv_variable_reordered[variable_reordered[i]] = i;
-      inv_equation_reordered[equation_reordered[i]] = i;
+      endo_idx_orig2block[endo_idx_block2orig[i]] = i;
+      eq_idx_orig2block[eq_idx_block2orig[i]] = i;
     }
 }
diff --git a/src/ModelTree.hh b/src/ModelTree.hh
index 7cdca5f5daf4c5bd3dc36a3fb8a0b97fc3ec0151..37cdeaa84eac9a30fc549ca9da63146d55241ec3 100644
--- a/src/ModelTree.hh
+++ b/src/ModelTree.hh
@@ -171,9 +171,15 @@ protected:
   //! The jacobian without the elements below the cutoff
   dynamic_jacob_map_t dynamic_jacobian;
 
-  //! vector of block reordered variables and equations
-  // See also updateReverseVariableEquationOrderings()
-  vector<int> equation_reordered, variable_reordered, inv_equation_reordered, inv_variable_reordered;
+  /* Maps indices of equations in the block-decomposition order into original
+     equation IDs */
+  vector<int> eq_idx_block2orig;
+  /* Maps indices of (endogenous) variables in the block-decomposition order into original
+     type-specific endogenous IDs */
+  vector<int> endo_idx_block2orig;
+  /* Maps original variable and equation indices into the block-decomposition order.
+     Set by updateReverseVariableEquationOrderings() */
+  vector<int> eq_idx_orig2block, endo_idx_orig2block;
 
   //! Store the derivatives or the chainrule derivatives:map<tuple<equation, variable, lead_lag>, expr_t>
   using first_chain_rule_derivatives_t = map<tuple<int, int, int>, expr_t>;
@@ -271,7 +277,7 @@ protected:
      depending on whether the variable symbolically appears in the equation */
   jacob_map_t computeSymbolicJacobian() const;
 
-  // Update inv_{equation,variable}_reordered from {equation,variable}_reordered
+  // Compute {var,eq}_idx_orig2block from {var,eq}_idx_block2orig
   void updateReverseVariableEquationOrderings();
 
   //! Compute the matching between endogenous and variable using the jacobian contemporaneous_jacobian
diff --git a/src/StaticModel.cc b/src/StaticModel.cc
index 956ad7547991aa3346607652f81d3a4b4ca24fe4..616ec23f67c60100df635ec3441b7dcf8f9c13f4 100644
--- a/src/StaticModel.cc
+++ b/src/StaticModel.cc
@@ -507,8 +507,8 @@ StaticModel::writeModelEquationsCode(const string &basename, map_idx_t map_idx)
                            BlockSimulationType::solveForwardComplete,
                            0,
                            symbol_table.endo_nbr(),
-                           variable_reordered,
-                           equation_reordered,
+                           endo_idx_block2orig,
+                           eq_idx_block2orig,
                            false,
                            symbol_table.endo_nbr(),
                            0,
@@ -701,8 +701,8 @@ StaticModel::writeModelEquationsCode_Block(const string &basename, map_idx_t map
                                simulation_type,
                                getBlockFirstEquation(block),
                                block_size,
-                               variable_reordered,
-                               equation_reordered,
+                               endo_idx_block2orig,
+                               eq_idx_block2orig,
                                blocks_linear[block],
                                symbol_table.endo_nbr(),
                                0,
@@ -2035,11 +2035,11 @@ StaticModel::writeOutput(ostream &output, bool block) const
   int nb_endo = symbol_table.endo_nbr();
   output << "M_.block_structure_stat.variable_reordered = [";
   for (int i = 0; i < nb_endo; i++)
-    output << " " << variable_reordered[i]+1;
+    output << " " << endo_idx_block2orig[i]+1;
   output << "];" << endl
          << "M_.block_structure_stat.equation_reordered = [";
   for (int i = 0; i < nb_endo; i++)
-    output << " " << equation_reordered[i]+1;
+    output << " " << eq_idx_block2orig[i]+1;
   output << "];" << endl;
 
   map<pair<int, int>, int> row_incidence;
@@ -2230,7 +2230,7 @@ void
 StaticModel::collect_block_first_order_derivatives()
 {
   //! vector for an equation or a variable indicates the block number
-  vector<int> equation_2_block(equation_reordered.size()), variable_2_block(variable_reordered.size());
+  vector<int> equation_2_block(eq_idx_block2orig.size()), variable_2_block(endo_idx_block2orig.size());
   int nb_blocks = getNbBlocks();
   for (int block = 0; block < nb_blocks; block++)
     {
diff --git a/src/StaticModel.hh b/src/StaticModel.hh
index 6fd760e97ee4744c0420c0e5d406511cdb22d610..9c2f0c5a40991c5487da196445e7fa926aa86aed 100644
--- a/src/StaticModel.hh
+++ b/src/StaticModel.hh
@@ -248,37 +248,37 @@ public:
   EquationType
   getBlockEquationType(int block_number, int equation_number) const override
   {
-    return (equation_type_and_normalized_equation[equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first);
+    return (equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first);
   };
   //! Return true if the equation has been normalized
   bool
   isBlockEquationRenormalized(int block_number, int equation_number) const override
   {
-    return (equation_type_and_normalized_equation[equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first == EquationType::evaluate_s);
+    return (equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first == EquationType::evaluate_s);
   };
   //! Return the expr_t of the equation equation_number belonging to the block block_number
   expr_t
   getBlockEquationExpr(int block_number, int equation_number) const override
   {
-    return (equations[equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]]);
+    return (equations[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]]);
   };
   //! Return the expr_t of the renormalized equation equation_number belonging to the block block_number
   expr_t
   getBlockEquationRenormalizedExpr(int block_number, int equation_number) const override
   {
-    return (equation_type_and_normalized_equation[equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].second);
+    return (equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].second);
   };
   //! Return the original number of equation equation_number belonging to the block block_number
   int
   getBlockEquationID(int block_number, int equation_number) const override
   {
-    return (equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]);
+    return (eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]);
   };
   //! Return the original number of variable variable_number belonging to the block block_number
   int
   getBlockVariableID(int block_number, int variable_number) const override
   {
-    return (variable_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+variable_number]);
+    return (endo_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+variable_number]);
   };
   //! Return the original number of the exogenous variable varexo_number belonging to the block block_number
   int
@@ -290,13 +290,13 @@ public:
   int
   getBlockInitialEquationID(int block_number, int equation_number) const override
   {
-    return inv_equation_reordered[equation_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
+    return eq_idx_orig2block[equation_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
   };
   //! Return the position of variable_number in the block number belonging to the block block_number
   int
   getBlockInitialVariableID(int block_number, int variable_number) const override
   {
-    return inv_variable_reordered[variable_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
+    return endo_idx_orig2block[variable_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
   };
   //! Return the position of variable_number in the block number belonging to the block block_number
   int