diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index 08b5df9c3f779c4e1562f5c878f7317124219355..e7e628048be17c0216b7f44a135eac522d781776 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -6785,24 +6785,18 @@ DynamicModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) c
   ostringstream third_derivatives_output; // Used for storing third order derivatives equations
 
   deriv_node_temp_terms_t tef_terms;
-  temporary_terms_t temp_term_empty;
-  temporary_terms_t temp_term_union = temporary_terms_derivatives[0];
-  temporary_terms_t temp_term_union_m_1;
+  temporary_terms_t temp_term_union;
 
-  string concat = "";
   int hessianColsNbr = dynJacobianColsNbr * dynJacobianColsNbr;
 
   writeJsonModelLocalVariables(model_local_vars_output, tef_terms);
 
-  writeJsonTemporaryTerms(temporary_terms_derivatives[0], temp_term_union_m_1, model_output, tef_terms, concat);
+  writeJsonTemporaryTerms(temporary_terms_derivatives[0], temp_term_union, model_output, tef_terms, "");
   model_output << ", ";
   writeJsonModelEquations(model_output, true);
 
   // Writing Jacobian
-  temp_term_union_m_1 = temp_term_union;
-  temp_term_union.insert(temporary_terms_derivatives[1].begin(), temporary_terms_derivatives[1].end());
-  concat = "jacobian";
-  writeJsonTemporaryTerms(temp_term_union, temp_term_union_m_1, jacobian_output, tef_terms, concat);
+  writeJsonTemporaryTerms(temporary_terms_derivatives[1], temp_term_union, jacobian_output, tef_terms, "jacobian");
   jacobian_output << R"(, "jacobian": {)"
                   << R"(  "nrows": )" << equations.size()
                   << R"(, "ncols": )" << dynJacobianColsNbr
@@ -6836,10 +6830,7 @@ DynamicModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) c
   jacobian_output << "]}";
 
   // Writing Hessian
-  temp_term_union_m_1 = temp_term_union;
-  temp_term_union.insert(temporary_terms_derivatives[2].begin(), temporary_terms_derivatives[2].end());
-  concat = "hessian";
-  writeJsonTemporaryTerms(temp_term_union, temp_term_union_m_1, hessian_output, tef_terms, concat);
+  writeJsonTemporaryTerms(temporary_terms_derivatives[2], temp_term_union, hessian_output, tef_terms, "hessian");
   hessian_output << R"(, "hessian": {)"
                  << R"(  "nrows": )" << equations.size()
                  << R"(, "ncols": )" << hessianColsNbr
@@ -6881,10 +6872,7 @@ DynamicModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) c
   hessian_output << "]}";
 
   // Writing third derivatives
-  temp_term_union_m_1 = temp_term_union;
-  temp_term_union.insert(temporary_terms_derivatives[3].begin(), temporary_terms_derivatives[3].end());
-  concat = "third_derivatives";
-  writeJsonTemporaryTerms(temp_term_union, temp_term_union_m_1, third_derivatives_output, tef_terms, concat);
+  writeJsonTemporaryTerms(temporary_terms_derivatives[3], temp_term_union, third_derivatives_output, tef_terms, "third_derivatives");
   third_derivatives_output << R"(, "third_derivative": {)"
                            << R"(  "nrows": )" << equations.size()
                            << R"(, "ncols": )" << hessianColsNbr * dynJacobianColsNbr
@@ -6968,9 +6956,8 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
   writeJsonModelLocalVariables(model_local_vars_output, tef_terms);
 
   temporary_terms_t temp_term_union;
-  string concat = "all";
   for (const auto &it : params_derivs_temporary_terms)
-    writeJsonTemporaryTerms(it.second, temp_term_union, model_output, tef_terms, concat);
+    writeJsonTemporaryTerms(it.second, temp_term_union, model_output, tef_terms, "all");
 
   jacobian_output << R"("deriv_wrt_params": {)"
                   << R"(  "neqs": )" << equations.size()
diff --git a/src/ModelTree.cc b/src/ModelTree.cc
index 2d764f3956e7d17189ada4d73e268456f42f5145..d236bfd4f70a54a60a937abaa53f02d97f9ae53b 100644
--- a/src/ModelTree.cc
+++ b/src/ModelTree.cc
@@ -1433,55 +1433,52 @@ ModelTree::writeTemporaryTerms(const temporary_terms_t &tt,
 }
 
 void
-ModelTree::writeJsonTemporaryTerms(const temporary_terms_t &tt, const temporary_terms_t &ttm1, ostream &output,
-                                   deriv_node_temp_terms_t &tef_terms, string &concat) const
+ModelTree::writeJsonTemporaryTerms(const temporary_terms_t &tt,
+                                   temporary_terms_t &temp_term_union,
+                                   ostream &output,
+                                   deriv_node_temp_terms_t &tef_terms, const string &concat) const
 {
   // Local var used to keep track of temp nodes already written
   bool wrote_term = false;
-  temporary_terms_t tt2 = ttm1;
+  temporary_terms_t tt2 = temp_term_union;
 
   output << R"("external_functions_temporary_terms_)" << concat << R"(": [)";
   for (auto it : tt)
-    if (ttm1.find(it) == ttm1.end())
-      {
-        if (dynamic_cast<AbstractExternalFunctionNode *>(it) != nullptr)
-          {
-            if (wrote_term)
-              output << ", ";
-            vector<string> efout;
-            it->writeJsonExternalFunctionOutput(efout, tt2, tef_terms);
-            for (vector<string>::const_iterator it1 = efout.begin(); it1 != efout.end(); it1++)
-              {
-                if (it1 != efout.begin())
-                  output << ", ";
-                output << *it1;
-              }
-            wrote_term = true;
-          }
-        tt2.insert(it);
-      }
+    {
+      if (dynamic_cast<AbstractExternalFunctionNode *>(it) != nullptr)
+        {
+          if (wrote_term)
+            output << ", ";
+          vector<string> efout;
+          it->writeJsonExternalFunctionOutput(efout, tt2, tef_terms);
+          for (auto it1 = efout.begin(); it1 != efout.end(); ++it1)
+            {
+              if (it1 != efout.begin())
+                output << ", ";
+              output << *it1;
+            }
+          wrote_term = true;
+        }
+      tt2.insert(it);
+    }
 
-  tt2 = ttm1;
   wrote_term = false;
   output << "]"
          << R"(, "temporary_terms_)" << concat << R"(": [)";
-  for (auto it = tt.begin();
-       it != tt.end(); it++)
-    if (ttm1.find(*it) == ttm1.end())
-      {
-        if (wrote_term)
-          output << ", ";
-        output << R"({"temporary_term": ")";
-        (*it)->writeJsonOutput(output, tt, tef_terms);
-        output << R"(")"
-               << R"(, "value": ")";
-        (*it)->writeJsonOutput(output, tt2, tef_terms);
-        output << R"("})" << endl;
-        wrote_term = true;
+  for (const auto &it : tt)
+    {
+      if (wrote_term)
+        output << ", ";
+      output << R"({"temporary_term": ")";
+      it->writeJsonOutput(output, tt, tef_terms);
+      output << R"(")"
+             << R"(, "value": ")";
+      it->writeJsonOutput(output, temp_term_union, tef_terms);
+      output << R"("})" << endl;
+      wrote_term = true;
 
-        // Insert current node into tt2
-        tt2.insert(*it);
-      }
+      temp_term_union.insert(it);
+    }
   output << "]";
 }
 
diff --git a/src/ModelTree.hh b/src/ModelTree.hh
index baf72f87614a93b4979575300046106d88ef7e1f..3a6f9a5cc7f02d1dab93a0a3e4e3ad18962881cf 100644
--- a/src/ModelTree.hh
+++ b/src/ModelTree.hh
@@ -162,7 +162,7 @@ protected:
   void computeParamsDerivativesTemporaryTerms();
   //! Writes temporary terms
   void writeTemporaryTerms(const temporary_terms_t &tt, temporary_terms_t &temp_term_union, const temporary_terms_idxs_t &tt_idxs, ostream &output, ExprNodeOutputType output_type, deriv_node_temp_terms_t &tef_terms) const;
-  void writeJsonTemporaryTerms(const temporary_terms_t &tt, const temporary_terms_t &ttm1, ostream &output, deriv_node_temp_terms_t &tef_terms, string &concat) const;
+  void writeJsonTemporaryTerms(const temporary_terms_t &tt, temporary_terms_t &temp_term_union, ostream &output, deriv_node_temp_terms_t &tef_terms, const string &concat) const;
   //! Compiles temporary terms
   void compileTemporaryTerms(ostream &code_file, unsigned int &instruction_number, const temporary_terms_t &tt, map_idx_t map_idx, bool dynamic, bool steady_dynamic) const;
   //! Adds informations for simulation in a binary file
diff --git a/src/StaticModel.cc b/src/StaticModel.cc
index 022465bf6c8ed99feb098ed6e23f936231e9530d..63a4580dffdd5246e9988521862ff29ef37b79f6 100644
--- a/src/StaticModel.cc
+++ b/src/StaticModel.cc
@@ -2815,14 +2815,11 @@ StaticModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) co
   ostringstream third_derivatives_output;  // Used for storing third order derivatives equations
 
   deriv_node_temp_terms_t tef_terms;
-  temporary_terms_t temp_term_union = temporary_terms_derivatives[0];
-  temporary_terms_t temp_term_union_m_1;
-
-  string concat = "";
+  temporary_terms_t temp_term_union;
 
   writeJsonModelLocalVariables(model_local_vars_output, tef_terms);
 
-  writeJsonTemporaryTerms(temporary_terms_derivatives[0], temp_term_union_m_1, model_output, tef_terms, concat);
+  writeJsonTemporaryTerms(temporary_terms_derivatives[0], temp_term_union, model_output, tef_terms, "");
   model_output << ", ";
   writeJsonModelEquations(model_output, true);
 
@@ -2831,10 +2828,7 @@ StaticModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) co
   int hessianColsNbr = JacobianColsNbr*JacobianColsNbr;
 
   // Write Jacobian w.r. to endogenous only
-  temp_term_union_m_1 = temp_term_union;
-  temp_term_union.insert(temporary_terms_derivatives[1].begin(), temporary_terms_derivatives[1].end());
-  concat = "jacobian";
-  writeJsonTemporaryTerms(temp_term_union, temp_term_union_m_1, jacobian_output, tef_terms, concat);
+  writeJsonTemporaryTerms(temporary_terms_derivatives[1], temp_term_union, jacobian_output, tef_terms, "jacobian");
   jacobian_output << R"(, "jacobian": {)"
                   << R"(  "nrows": )" << nrows
                   << R"(, "ncols": )" << JacobianColsNbr
@@ -2868,10 +2862,7 @@ StaticModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) co
   jacobian_output << "]}";
 
   // Write Hessian w.r. to endogenous only (only if 2nd order derivatives have been computed)
-  temp_term_union_m_1 = temp_term_union;
-  temp_term_union.insert(temporary_terms_derivatives[2].begin(), temporary_terms_derivatives[2].end());
-  concat = "hessian";
-  writeJsonTemporaryTerms(temp_term_union, temp_term_union_m_1, hessian_output, tef_terms, concat);
+  writeJsonTemporaryTerms(temporary_terms_derivatives[2], temp_term_union, hessian_output, tef_terms, "hessian");
   hessian_output << R"(, "hessian": {)"
                  << R"(  "nrows": )" << equations.size()
                  << R"(, "ncols": )" << hessianColsNbr
@@ -2915,10 +2906,7 @@ StaticModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) co
   hessian_output << "]}";
 
   // Writing third derivatives
-  temp_term_union_m_1 = temp_term_union;
-  temp_term_union.insert(temporary_terms_derivatives[3].begin(), temporary_terms_derivatives[3].end());
-  concat = "third_derivatives";
-  writeJsonTemporaryTerms(temp_term_union, temp_term_union_m_1, third_derivatives_output, tef_terms, concat);
+  writeJsonTemporaryTerms(temporary_terms_derivatives[3], temp_term_union, third_derivatives_output, tef_terms, "third_derivatives");
   third_derivatives_output << R"(, "third_derivative": {)"
                            << R"(  "nrows": )" << equations.size()
                            << R"(, "ncols": )" << hessianColsNbr * JacobianColsNbr
@@ -2999,9 +2987,8 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
   writeJsonModelLocalVariables(model_local_vars_output, tef_terms);
 
   temporary_terms_t temp_term_union;
-  string concat = "all";
   for (const auto &it : params_derivs_temporary_terms)
-    writeJsonTemporaryTerms(it.second, temp_term_union, model_output, tef_terms, concat);
+    writeJsonTemporaryTerms(it.second, temp_term_union, model_output, tef_terms, "all");
 
   jacobian_output << R"("deriv_wrt_params": {)"
                   << R"(  "neqs": )" << equations.size()