diff --git a/ComputingTasks.cc b/ComputingTasks.cc
index 0aa27b6dca28f4cf16690f0cbc153fecd2430adc..2954c023810dc6d62cd36675371054ef81ebe97f 100644
--- a/ComputingTasks.cc
+++ b/ComputingTasks.cc
@@ -73,8 +73,8 @@ void ModelInfoStatement::writeOutput(ostream &output, const string &basename) co
 }
 
 
-SimulStatement::SimulStatement(const OptionsList &options_list_arg) :
-  options_list(options_list_arg)
+SimulStatement::SimulStatement(const OptionsList &options_list_arg, ModelTreeMode mode_arg) :
+  options_list(options_list_arg), mode(mode_arg)
 {
 }
 
@@ -88,48 +88,32 @@ void
 SimulStatement::writeOutput(ostream &output, const string &basename) const
 {
   options_list.writeOutput(output);
-  output << "simul(oo_.dr);\n";
-}
-
-SimulSparseStatement::SimulSparseStatement(const OptionsList &options_list_arg,
-                                           int mode_arg) :
-  options_list(options_list_arg),
-  mode(mode_arg)
-{
-}
-
-void
-SimulSparseStatement::checkPass(ModFileStructure &mod_file_struct)
-{
-  mod_file_struct.simul_present = true;
-}
-
-void
-SimulSparseStatement::writeOutput(ostream &output, const string &basename) const
-{
-  options_list.writeOutput(output);
-  output << "if (~ options_.initval_file) & (size(oo_.endo_simul,2)<options_.periods)\n";
-  output << "  if ~isfield(options_,'datafile')\n";
-  output << "    make_y_;\n";
-  output << "    make_ex_;\n";
-  output << "  else\n";
-  output << "    read_data_;\n";
-  output << "  end\n";
-  output << "end\n";
-  if(mode==eSparseDLLMode)
-    output << "oo_.endo_simul=simulate;\n";
+  if (mode == eStandardMode || mode == eDLLMode)
+    output << "simul(oo_.dr);\n";
   else
     {
-      //output << "oo_.endo_simul=" << basename << "_dynamic();\n";
-      output << basename << "_dynamic;\n";
+      output << "if (~ options_.initval_file) & (size(oo_.endo_simul,2)<options_.periods)" << endl
+             << "  if ~isfield(options_,'datafile')" << endl
+             << "    make_y_;" << endl
+             << "    make_ex_;" << endl
+             << "  else" << endl
+             << "    read_data_;" << endl
+             << "  end" << endl
+             << "end" << endl;
+        if (mode == eSparseDLLMode)
+          output << "oo_.endo_simul=simulate;" << endl;
+        else
+          output << basename << "_dynamic;" << endl;
+      output << "dyn2vec;" << endl;
     }
-  output << "dyn2vec;\n";
 }
 
 StochSimulStatement::StochSimulStatement(const SymbolList &symbol_list_arg,
-                                         const OptionsList &options_list_arg) :
+                                         const OptionsList &options_list_arg,
+                                         ModelTreeMode mode_arg) :
   symbol_list(symbol_list_arg),
-  options_list(options_list_arg)
+  options_list(options_list_arg),
+  mode(mode_arg)
 {
 }
 
@@ -157,11 +141,10 @@ StochSimulStatement::writeOutput(ostream &output, const string &basename) const
 {
   options_list.writeOutput(output);
   symbol_list.writeOutput("var_list_", output);
-  output << "if (options_.model_mode == 1 || options_.model_mode == 3)\n";
-  output << "  info = stoch_simul_sparse(var_list_);\n";
-  output << "else\n";
-  output << "  info = stoch_simul(var_list_);\n";
-  output << "end\n";
+  if (mode == eStandardMode || mode == eDLLMode)
+    output << "info = stoch_simul(var_list_);" << endl;
+  else
+    output << "info = stoch_simul_sparse(var_list_);" << endl;
 }
 
 ForecastStatement::ForecastStatement(const SymbolList &symbol_list_arg,
diff --git a/ComputingTasks.hh b/ComputingTasks.hh
index 6cd9581f5fb17df9a9e9c0d61c823bfd3ff4b019..bbc09f69c82711516588dee5b1374d9af71f93ae 100644
--- a/ComputingTasks.hh
+++ b/ComputingTasks.hh
@@ -50,19 +50,9 @@ class SimulStatement : public Statement
 {
 private:
   const OptionsList options_list;
+  const ModelTreeMode mode;
 public:
-  SimulStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
-  virtual void writeOutput(ostream &output, const string &basename) const;
-};
-
-class SimulSparseStatement : public Statement
-{
-private:
-  const OptionsList options_list;
-  const int mode;
-public:
-  SimulSparseStatement(const OptionsList &options_list_arg, int mode_arg);
+  SimulStatement(const OptionsList &options_list_arg, ModelTreeMode mode_arg);
   virtual void checkPass(ModFileStructure &mod_file_struct);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
@@ -82,9 +72,11 @@ class StochSimulStatement : public Statement
 private:
   const SymbolList symbol_list;
   const OptionsList options_list;
+  const ModelTreeMode mode;
 public:
   StochSimulStatement(const SymbolList &symbol_list_arg,
-                      const OptionsList &options_list_arg);
+                      const OptionsList &options_list_arg,
+                      ModelTreeMode mode_arg);
   virtual void checkPass(ModFileStructure &mod_file_struct);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
diff --git a/DynareBison.yy b/DynareBison.yy
index 59660e7c72a7e605b615ef49cb22ae661f4ad839..ef8ed73900740b77c92bb9bba671e40834906ff5 100644
--- a/DynareBison.yy
+++ b/DynareBison.yy
@@ -648,9 +648,9 @@ model_info : MODEL_INFO ';'
            ;
 
 simul : SIMUL ';'
-        { driver.simulate(); }
+        { driver.simul(); }
       | SIMUL '(' simul_options_list ')' ';'
-        { driver.simulate(); }
+        { driver.simul(); }
       ;
 
 simul_options_list : simul_options_list COMMA simul_options
diff --git a/ParsingDriver.cc b/ParsingDriver.cc
index 26fe3942e9ee1d4b04f45ef65fa05321f29e3a4d..20f2f254f7ba0ddd4884c7ccfbb2c78dddff33e0 100644
--- a/ParsingDriver.cc
+++ b/ParsingDriver.cc
@@ -676,34 +676,18 @@ void ParsingDriver::rplot()
 
 void ParsingDriver::stoch_simul()
 {
-  mod_file->addStatement(new StochSimulStatement(symbol_list, options_list));
+  mod_file->addStatement(new StochSimulStatement(symbol_list, options_list, mod_file->dynamic_model.mode));
   symbol_list.clear();
   options_list.clear();
 }
 
-void ParsingDriver::simulate()
-{
-  if (mod_file->dynamic_model.mode == eSparseDLLMode || mod_file->dynamic_model.mode == eSparseMode)
-    simul_sparse();
-  else
-    simul();
-}
-
-void
-ParsingDriver::simul_sparse()
-{
-  mod_file->addStatement(new SimulSparseStatement(options_list, mod_file->dynamic_model.mode));
-  options_list.clear();
-}
-
 void
 ParsingDriver::simul()
 {
-  mod_file->addStatement(new SimulStatement(options_list));
+  mod_file->addStatement(new SimulStatement(options_list, mod_file->dynamic_model.mode));
   options_list.clear();
 }
 
-
 void
 ParsingDriver::model_info()
 {
@@ -711,7 +695,6 @@ ParsingDriver::model_info()
   options_list.clear();
 }
 
-
 void
 ParsingDriver::check()
 {
diff --git a/ParsingDriver.hh b/ParsingDriver.hh
index 9976a463191a59d18a0acf85ffffa3750d70af7b..1f3864d13c5c0a06bcfcfd2a3beada2cfd97a892 100644
--- a/ParsingDriver.hh
+++ b/ParsingDriver.hh
@@ -282,10 +282,6 @@ public:
   void rplot();
   //! Writes a stock_simul command
   void stoch_simul();
-  //! Determine whether to write simul command or simul_sparse command
-  void simulate();
-  //! Writes a simul_sparse command
-  void simul_sparse();
   //! Writes a simul command
   void simul();
   //! Writes check command