diff --git a/ComputingTasks.cc b/ComputingTasks.cc
index 60e54307704dc687807054904737e7f0c405c135..3c070ec73a8613ac1315866bbc8fe49579cc7a53 100644
--- a/ComputingTasks.cc
+++ b/ComputingTasks.cc
@@ -840,7 +840,7 @@ void
 PlannerObjectiveStatement::computingPass()
 {
   model_tree->computeStaticHessian = true;
-  model_tree->computingPass(eval_context_type());
+  model_tree->computingPass(eval_context_type(), false);
 }
 
 void
diff --git a/DynareMain.cc b/DynareMain.cc
index 61dc9bbb808177954a180073c46f63d2b56afcc5..da860a50b4baaa963e12ae28abfa380d7ddf5bce 100644
--- a/DynareMain.cc
+++ b/DynareMain.cc
@@ -32,7 +32,7 @@ using namespace std;
    Splitting main() in two parts was necessary because ParsingDriver.h and MacroDriver.h can't be
    included simultaneously (because of Bison limitations).
 */
-void main2(stringstream &in, string &basename, bool debug, bool clear_all);
+void main2(stringstream &in, string &basename, bool debug, bool clear_all, bool no_tmp_terms);
 
 int
 main(int argc, char** argv)
@@ -47,6 +47,7 @@ main(int argc, char** argv)
   bool clear_all = true;
   bool save_macro = false;
   bool debug = false;
+  bool no_tmp_terms = false;
 
   // Parse options
   for (int arg = 2; arg < argc; arg++)
@@ -57,6 +58,8 @@ main(int argc, char** argv)
         clear_all = false;
       else if (string(argv[arg]) == string("savemacro"))
         save_macro = true;
+      else if (string(argv[arg]) == string("notmpterms"))
+        no_tmp_terms = true;
     }
 
   cout << "Starting Dynare ..." << endl
@@ -86,7 +89,7 @@ main(int argc, char** argv)
     }
 
   // Do the rest
-  main2(macro_output, basename, debug, clear_all);
+  main2(macro_output, basename, debug, clear_all, no_tmp_terms);
 
   return 0;
 }
diff --git a/DynareMain2.cc b/DynareMain2.cc
index 53a5584d2219384b0cda3f24777f41c5291fb027..e6111e910291d07b7672eea28117460e24f50e52 100644
--- a/DynareMain2.cc
+++ b/DynareMain2.cc
@@ -25,7 +25,7 @@ using namespace std;
 #include "ModFile.hh"
 
 void
-main2(stringstream &in, string &basename, bool debug, bool clear_all)
+main2(stringstream &in, string &basename, bool debug, bool clear_all, bool no_tmp_terms)
 {
   ParsingDriver p;
 
@@ -36,7 +36,7 @@ main2(stringstream &in, string &basename, bool debug, bool clear_all)
   mod_file->checkPass();
 
   // Do computations
-  mod_file->computingPass();
+  mod_file->computingPass(no_tmp_terms);
 
   // Write outputs
   mod_file->writeOutputFiles(basename, clear_all);
diff --git a/ModFile.cc b/ModFile.cc
index 6b832720c1c1cc7e0d765ac144865fcbe4acd855..6997ee50f18ed6122a8d10ab69b09cf438b2a397 100644
--- a/ModFile.cc
+++ b/ModFile.cc
@@ -91,7 +91,7 @@ ModFile::checkPass()
 }
 
 void
-ModFile::computingPass()
+ModFile::computingPass(bool no_tmp_terms)
 {
   // Mod file may have no equation (for example in a standalone BVAR estimation)
   if (model_tree.equation_number() > 0)
@@ -113,7 +113,7 @@ ModFile::computingPass()
             model_tree.computeThirdDerivatives = true;
         }
 
-      model_tree.computingPass(global_eval_context);
+      model_tree.computingPass(global_eval_context, no_tmp_terms);
     }
 
   for(vector<Statement *>::iterator it = statements.begin();
diff --git a/ModelTree.cc b/ModelTree.cc
index c6bef42d5faa37f0f5e1d691bb5684355186a88f..513a2e4fce75896e125d828759f4bef2bd28e7f4 100644
--- a/ModelTree.cc
+++ b/ModelTree.cc
@@ -3140,7 +3140,7 @@ ModelTree::BlockLinear(Model_Block *ModelBlock)
 }
 
 void
-ModelTree::computingPass(const eval_context_type &eval_context)
+ModelTree::computingPass(const eval_context_type &eval_context, bool no_tmp_terms)
 {
   cout << equations.size() << " equation(s) found" << endl;
 
@@ -3171,10 +3171,12 @@ ModelTree::computingPass(const eval_context_type &eval_context)
       block_triangular.Normalize_and_BlockDecompose_Static_0_Model(j_m);
       BlockLinear(block_triangular.ModelBlock);
 
-      computeTemporaryTermsOrdered(order, block_triangular.ModelBlock);
+      if (!no_tmp_terms)
+        computeTemporaryTermsOrdered(order, block_triangular.ModelBlock);
     }
   else
-    computeTemporaryTerms(order);
+    if (!no_tmp_terms)
+      computeTemporaryTerms(order);
 }
 
 void
diff --git a/include/ComputingTasks.hh b/include/ComputingTasks.hh
index 96e547e2d2a48bc49bee929ce631d1c2dfd4a43c..c9ba68e4b836735f9d53326b2cc66bad393f5d49 100644
--- a/include/ComputingTasks.hh
+++ b/include/ComputingTasks.hh
@@ -434,6 +434,7 @@ public:
   /*! \todo check there are only endogenous variables at the current period in the objective
     (no exogenous, no lead/lag) */
   virtual void checkPass(ModFileStructure &mod_file_struct);
+  /*! \todo allow for the possibility of disabling temporary terms */
   virtual void computingPass();
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
diff --git a/include/ModFile.hh b/include/ModFile.hh
index 6dde1452291a0d6ec6d2c14e9083e24639c5ca42..1a3f3a3b2d6eecaad3c68e15f60ef2bd464e5672 100644
--- a/include/ModFile.hh
+++ b/include/ModFile.hh
@@ -63,7 +63,8 @@ public:
   /*! \todo add check for number of equations and endogenous if ramsey_policy is present */
   void checkPass();
   //! Execute computations
-  void computingPass();
+  /*! \param no_tmp_terms if true, no temporary terms will be computed in the static and dynamic files */
+  void computingPass(bool no_tmp_terms);
   //! Writes Matlab/Scilab output files
   /*!
     \param basename The base name used for writing output files. Should be the name of the mod file without its extension
diff --git a/include/ModelTree.hh b/include/ModelTree.hh
index 7cb392e6588249d47cb7e0836c80295f8987dea6..3464559999fbcb99961a06813002d99c7634552d 100644
--- a/include/ModelTree.hh
+++ b/include/ModelTree.hh
@@ -157,8 +157,9 @@ public:
   //! Whether dynamic third order derivatives (w.r. to endogenous and exogenous) should be written
   bool computeThirdDerivatives;
   //! Execute computations (variable sorting + derivation)
-  /*! You must set computeJacobian, computeJacobianExo, computeHessian, computeStaticHessian and computeThirdDerivatives to correct values before calling this function */
-  void computingPass(const eval_context_type &eval_context);
+  /*! You must set computeJacobian, computeJacobianExo, computeHessian, computeStaticHessian and computeThirdDerivatives to correct values before calling this function
+      \param no_tmp_terms if true, no temporary terms will be computed in the static and dynamic files */
+  void computingPass(const eval_context_type &eval_context, bool no_tmp_terms);
   //! Writes model initialization and lead/lag incidence matrix to output
   void writeOutput(ostream &output) const;
   //! Writes static model file