diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index fd8a505c059cb7f615fd7b8f1f3e4f7a0367d250..6866a8128f71816568ea53c6d293d9d8ca779a46 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -242,7 +242,7 @@ DynamicModel::computeTemporaryTermsOrdered()
                 getBlockEquationRenormalizedExpr(block, i)->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, i);
               else
                 {
-                  eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i));
+                  eq_node = getBlockEquationExpr(block, i);
                   eq_node->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, i);
                 }
             }
@@ -267,7 +267,7 @@ DynamicModel::computeTemporaryTermsOrdered()
                 getBlockEquationRenormalizedExpr(block, i)->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, i);
               else
                 {
-                  eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i));
+                  eq_node = getBlockEquationExpr(block, i);
                   eq_node->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, i);
                 }
             }
@@ -288,7 +288,7 @@ DynamicModel::computeTemporaryTermsOrdered()
                 getBlockEquationRenormalizedExpr(block, i)->collectTemporary_terms(temporary_terms, temporary_terms_in_use, block);
               else
                 {
-                  eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i));
+                  eq_node = getBlockEquationExpr(block, i);
                   eq_node->collectTemporary_terms(temporary_terms, temporary_terms_in_use, block);
                 }
             }
@@ -499,7 +499,7 @@ DynamicModel::writeModelEquationsOrdered_M(const string &basename) const
           int equation_ID = getBlockEquationID(block, i);
           EquationType equ_type = getBlockEquationType(block, i);
           string sModel = symbol_table.getName(symbol_table.getID(SymbolType::endogenous, variable_ID));
-          eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i));
+          eq_node = getBlockEquationExpr(block, i);
           lhs = eq_node->arg1;
           rhs = eq_node->arg2;
           tmp_output.str("");
@@ -528,7 +528,7 @@ DynamicModel::writeModelEquationsOrdered_M(const string &basename) const
                       rhs->writeOutput(output, local_output_type, local_temporary_terms, {});
                       output << endl << "    ";
                       tmp_output.str("");
-                      eq_node = static_cast<BinaryOpNode *>(getBlockEquationRenormalizedExpr(block, i));
+                      eq_node = getBlockEquationRenormalizedExpr(block, i);
                       lhs = eq_node->arg1;
                       rhs = eq_node->arg2;
                       lhs->writeOutput(output, local_output_type, local_temporary_terms, {});
@@ -1141,7 +1141,7 @@ DynamicModel::writeModelEquationsCode_Block(const string &basename, const map_id
               }
               if (equ_type == EquationType::evaluate)
                 {
-                  eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i));
+                  eq_node = getBlockEquationExpr(block, i);
                   lhs = eq_node->arg1;
                   rhs = eq_node->arg2;
                   rhs->compile(code_file, instruction_number, false, temporary_terms, map_idx, true, false);
@@ -1149,7 +1149,7 @@ DynamicModel::writeModelEquationsCode_Block(const string &basename, const map_id
                 }
               else if (equ_type == EquationType::evaluate_s)
                 {
-                  eq_node = static_cast<BinaryOpNode *>(getBlockEquationRenormalizedExpr(block, i));
+                  eq_node = getBlockEquationRenormalizedExpr(block, i);
                   lhs = eq_node->arg1;
                   rhs = eq_node->arg2;
                   rhs->compile(code_file, instruction_number, false, temporary_terms, map_idx, true, false);
@@ -1171,7 +1171,7 @@ DynamicModel::writeModelEquationsCode_Block(const string &basename, const map_id
             end:
               FNUMEXPR_ fnumexpr(ModelEquation, getBlockEquationID(block, i));
               fnumexpr.write(code_file, instruction_number);
-              eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i));
+              eq_node = getBlockEquationExpr(block, i);
               lhs = eq_node->arg1;
               rhs = eq_node->arg2;
               lhs->compile(code_file, instruction_number, false, temporary_terms, map_idx, true, false);
diff --git a/src/ModelTree.cc b/src/ModelTree.cc
index 5d102b2bd11d5f35e9684e38fcc09bcae94671fd..dd652c7958201f966e8a43156cfdc38fbe5c2387 100644
--- a/src/ModelTree.cc
+++ b/src/ModelTree.cc
@@ -103,7 +103,7 @@ ModelTree::copyHelper(const ModelTree &m)
     nonstationary_symbols_map[it.first] = {it.second.first, f(it.second.second)};
 
   for (const auto &it : m.equation_type_and_normalized_equation)
-    equation_type_and_normalized_equation.emplace_back(it.first, f(it.second));
+    equation_type_and_normalized_equation.emplace_back(it.first, dynamic_cast<BinaryOpNode *>(f(it.second)));
 
   for (const auto &it : m.blocks_derivatives)
     {
diff --git a/src/ModelTree.hh b/src/ModelTree.hh
index 47d5c7947fbf6ad9640dcd81eb1fae142007aa7b..e1700cd9137169a4a898267fd9411f1df2113e07 100644
--- a/src/ModelTree.hh
+++ b/src/ModelTree.hh
@@ -50,7 +50,7 @@ vectorToTuple(const vector<T> &v)
 }
 
 //! Vector describing equations: BlockSimulationType, if BlockSimulationType == EVALUATE_s then a expr_t on the new normalized equation
-using equation_type_and_normalized_equation_t = vector<pair<EquationType, expr_t>>;
+using equation_type_and_normalized_equation_t = vector<pair<EquationType, BinaryOpNode *>>;
 
 //! Vector describing variables: max_lag in the block, max_lead in the block
 using lag_lead_vector_t = vector<pair<int, int>>;
@@ -342,13 +342,13 @@ protected:
     return equation_type_and_normalized_equation[eq_idx_block2orig[blocks[blk].first_equation + eq]].first == EquationType::evaluate_s;
   };
   //! Return the expr_t of equation belonging to the block
-  expr_t
+  BinaryOpNode *
   getBlockEquationExpr(int blk, int eq) const
   {
     return equations[eq_idx_block2orig[blocks[blk].first_equation + eq]];
   };
   //! Return the expr_t of renormalized equation belonging to the block
-  expr_t
+  BinaryOpNode *
   getBlockEquationRenormalizedExpr(int blk, int eq) const
   {
     return equation_type_and_normalized_equation[eq_idx_block2orig[blocks[blk].first_equation + eq]].second;
diff --git a/src/StaticModel.cc b/src/StaticModel.cc
index e22a137d159c6cb821075c46b39f31d2b006d7a4..370c4bd684141eb5d18d7d4a48bf2b6159747b67 100644
--- a/src/StaticModel.cc
+++ b/src/StaticModel.cc
@@ -210,7 +210,7 @@ StaticModel::computeTemporaryTermsOrdered()
             getBlockEquationRenormalizedExpr(block, i)->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, i);
           else
             {
-              eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i));
+              eq_node = getBlockEquationExpr(block, i);
               eq_node->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, i);
             }
         }
@@ -230,7 +230,7 @@ StaticModel::computeTemporaryTermsOrdered()
             getBlockEquationRenormalizedExpr(block, i)->collectTemporary_terms(temporary_terms, temporary_terms_in_use, block);
           else
             {
-              eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i));
+              eq_node = getBlockEquationExpr(block, i);
               eq_node->collectTemporary_terms(temporary_terms, temporary_terms_in_use, block);
             }
         }
@@ -337,7 +337,7 @@ StaticModel::writeModelEquationsOrdered_M(const string &basename) const
           int equation_ID = getBlockEquationID(block, i);
           EquationType equ_type = getBlockEquationType(block, i);
           string sModel = symbol_table.getName(symbol_table.getID(SymbolType::endogenous, variable_ID));
-          BinaryOpNode *eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i));
+          BinaryOpNode *eq_node = getBlockEquationExpr(block, i);
           expr_t lhs = eq_node->arg1, rhs = eq_node->arg2;
           ostringstream tmp_output;
           lhs->writeOutput(tmp_output, local_output_type, local_temporary_terms, {});
@@ -354,7 +354,7 @@ StaticModel::writeModelEquationsOrdered_M(const string &basename) const
                 }
               else if (equ_type == EquationType::evaluate_s)
                 {
-                  eq_node = static_cast<BinaryOpNode *>(getBlockEquationRenormalizedExpr(block, i));
+                  eq_node = getBlockEquationRenormalizedExpr(block, i);
                   lhs = eq_node->arg1;
                   rhs = eq_node->arg2;
                   lhs->writeOutput(output, local_output_type, local_temporary_terms, {});
@@ -685,7 +685,7 @@ StaticModel::writeModelEquationsCode_Block(const string &basename, map_idx_t map
               }
               if (equ_type == EquationType::evaluate)
                 {
-                  eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i));
+                  eq_node = getBlockEquationExpr(block, i);
                   lhs = eq_node->arg1;
                   rhs = eq_node->arg2;
                   rhs->compile(code_file, instruction_number, false, temporary_terms, map_idx, false, false);
@@ -693,7 +693,7 @@ StaticModel::writeModelEquationsCode_Block(const string &basename, map_idx_t map
                 }
               else if (equ_type == EquationType::evaluate_s)
                 {
-                  eq_node = static_cast<BinaryOpNode *>(getBlockEquationRenormalizedExpr(block, i));
+                  eq_node = getBlockEquationRenormalizedExpr(block, i);
                   lhs = eq_node->arg1;
                   rhs = eq_node->arg2;
                   rhs->compile(code_file, instruction_number, false, temporary_terms, map_idx, false, false);
@@ -713,7 +713,7 @@ StaticModel::writeModelEquationsCode_Block(const string &basename, map_idx_t map
             end:
               FNUMEXPR_ fnumexpr(ModelEquation, getBlockEquationID(block, i));
               fnumexpr.write(code_file, instruction_number);
-              eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i));
+              eq_node = getBlockEquationExpr(block, i);
               lhs = eq_node->arg1;
               rhs = eq_node->arg2;
               lhs->compile(code_file, instruction_number, false, temporary_terms, map_idx, false, false);
@@ -876,7 +876,7 @@ StaticModel::writeModelEquationsCode_Block(const string &basename, map_idx_t map
               }
               if (equ_type == EquationType::evaluate)
                 {
-                  eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i));
+                  eq_node = getBlockEquationExpr(block, i);
                   lhs = eq_node->arg1;
                   rhs = eq_node->arg2;
                   rhs->compile(code_file, instruction_number, false, tt2, map_idx2[block], false, false);
@@ -884,7 +884,7 @@ StaticModel::writeModelEquationsCode_Block(const string &basename, map_idx_t map
                 }
               else if (equ_type == EquationType::evaluate_s)
                 {
-                  eq_node = static_cast<BinaryOpNode *>(getBlockEquationRenormalizedExpr(block, i));
+                  eq_node = getBlockEquationRenormalizedExpr(block, i);
                   lhs = eq_node->arg1;
                   rhs = eq_node->arg2;
                   rhs->compile(code_file, instruction_number, false, tt2, map_idx2[block], false, false);
@@ -904,7 +904,7 @@ StaticModel::writeModelEquationsCode_Block(const string &basename, map_idx_t map
             end_l:
               FNUMEXPR_ fnumexpr(ModelEquation, getBlockEquationID(block, i));
               fnumexpr.write(code_file, instruction_number);
-              eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i));
+              eq_node = getBlockEquationExpr(block, i);
               lhs = eq_node->arg1;
               rhs = eq_node->arg2;
               lhs->compile(code_file, instruction_number, false, tt2, map_idx2[block], false, false);