diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index 9077c5e5aaf238d846dd27e396eb41cabc866483..3bedee10c32babec6dc77eb76390ceb403244e24 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -6832,6 +6832,9 @@ DynamicModel::isChecksumMatching(const string &basename, bool block) const
 void
 DynamicModel::writeJsonOutput(ostream &output) const
 {
+  deriv_node_temp_terms_t tef_terms;
+  writeJsonModelLocalVariables(output, false, tef_terms);
+  output << ", ";
   writeJsonModelEquations(output, false);
   output << ", ";
   writeJsonXrefs(output);
@@ -7025,7 +7028,7 @@ DynamicModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) c
   deriv_node_temp_terms_t tef_terms;
   temporary_terms_t temp_term_union;
 
-  writeJsonModelLocalVariables(model_local_vars_output, tef_terms);
+  writeJsonModelLocalVariables(model_local_vars_output, true, tef_terms);
 
   writeJsonTemporaryTerms(temporary_terms_derivatives[0], temp_term_union, d_output[0], tef_terms, "");
   d_output[0] << ", ";
@@ -7113,7 +7116,7 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
   ostringstream g3p_output; // 1st deriv. of 3rd deriv. matrix w.r.t. parameters
 
   deriv_node_temp_terms_t tef_terms;
-  writeJsonModelLocalVariables(model_local_vars_output, tef_terms);
+  writeJsonModelLocalVariables(model_local_vars_output, true, tef_terms);
 
   temporary_terms_t temp_term_union;
   for (const auto &it : params_derivs_temporary_terms)
diff --git a/src/ModelTree.cc b/src/ModelTree.cc
index a8348e7ac699a5004bae996560adfc227a13d711..a4cef4dcaebf8b8db25ad9e6ee8e29f6a35562d8 100644
--- a/src/ModelTree.cc
+++ b/src/ModelTree.cc
@@ -1616,7 +1616,7 @@ ModelTree::compileTemporaryTerms(ostream &code_file, unsigned int &instruction_n
 }
 
 void
-ModelTree::writeJsonModelLocalVariables(ostream &output, deriv_node_temp_terms_t &tef_terms) const
+ModelTree::writeJsonModelLocalVariables(ostream &output, bool write_tef_terms, deriv_node_temp_terms_t &tef_terms) const
 {
   /* Collect all model local variables appearing in equations, and print only
      them. Printing unused model local variables can lead to a crash (see
@@ -1640,19 +1640,22 @@ ModelTree::writeJsonModelLocalVariables(ostream &output, deriv_node_temp_terms_t
           printed = true;
 
         int id = it;
-        vector<string> efout;
         expr_t value = local_variables_table.find(id)->second;
-        value->writeJsonExternalFunctionOutput(efout, tt, tef_terms);
-        for (auto it1 = efout.begin(); it1 != efout.end(); ++it1)
+        if (write_tef_terms)
           {
-            if (it1 != efout.begin())
+            vector<string> efout;
+            value->writeJsonExternalFunctionOutput(efout, tt, tef_terms);
+            for (auto it1 = efout.begin(); it1 != efout.end(); ++it1)
+              {
+                if (it1 != efout.begin())
+                  output << ", ";
+                output << *it1;
+              }
+
+            if (!efout.empty())
               output << ", ";
-            output << *it1;
           }
 
-        if (!efout.empty())
-          output << ", ";
-
         output << R"({"variable": ")" << symbol_table.getName(id)
                << R"(", "value": ")";
         value->writeJsonOutput(output, tt, tef_terms);
diff --git a/src/ModelTree.hh b/src/ModelTree.hh
index 7f5c5686a614b3416428ba9516e3c46c11046796..b3502c365636c123c4ad37ea6f5384a73ca0ecb1 100644
--- a/src/ModelTree.hh
+++ b/src/ModelTree.hh
@@ -205,7 +205,9 @@ protected:
   //! if residuals = true, we are writing the dynamic/static model.
   //! Otherwise, just the model equations (with line numbers, no tmp terms)
   void writeJsonModelEquations(ostream &output, bool residuals) const;
-  void writeJsonModelLocalVariables(ostream &output, deriv_node_temp_terms_t &tef_terms) const;
+  /* Writes JSON model local variables.
+     Optionally put the external function variable calls into TEF terms */
+  void writeJsonModelLocalVariables(ostream &output, bool write_tef_terms, deriv_node_temp_terms_t &tef_terms) const;
   //! Compiles model equations
   void compileModelEquations(ostream &code_file, unsigned int &instruction_number, const temporary_terms_t &tt, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic) const;
 
diff --git a/src/StaticModel.cc b/src/StaticModel.cc
index 99ceef31c283668e4f8dfc25a60ad64cc3450477..7609e1560435a9b4ea7cd268882dfc20b0a939e9 100644
--- a/src/StaticModel.cc
+++ b/src/StaticModel.cc
@@ -2753,6 +2753,9 @@ StaticModel::writeParamsDerivativesFile(const string &basename, bool julia) cons
 void
 StaticModel::writeJsonOutput(ostream &output) const
 {
+  deriv_node_temp_terms_t tef_terms;
+  writeJsonModelLocalVariables(output, false, tef_terms);
+  output << ", ";
   writeJsonModelEquations(output, false);
 }
 
@@ -2765,7 +2768,7 @@ StaticModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) co
   deriv_node_temp_terms_t tef_terms;
   temporary_terms_t temp_term_union;
 
-  writeJsonModelLocalVariables(model_local_vars_output, tef_terms);
+  writeJsonModelLocalVariables(model_local_vars_output, true, tef_terms);
 
   writeJsonTemporaryTerms(temporary_terms_derivatives[0], temp_term_union, d_output[0], tef_terms, "");
   d_output[0] << ", ";
@@ -2852,7 +2855,7 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
   ostringstream third_derivs1_output; // Used for storing third order derivatives equations
 
   deriv_node_temp_terms_t tef_terms;
-  writeJsonModelLocalVariables(model_local_vars_output, tef_terms);
+  writeJsonModelLocalVariables(model_local_vars_output, true, tef_terms);
 
   temporary_terms_t temp_term_union;
   for (const auto &it : params_derivs_temporary_terms)