diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc
index d06309a24e0bb93d4386dd634fd0fd20d998d8fd..a6d2c561645240d9322c15fba5c0cf3f065be94a 100644
--- a/src/ComputingTasks.cc
+++ b/src/ComputingTasks.cc
@@ -333,10 +333,11 @@ PriorPosteriorFunctionStatement::writeJsonOutput(ostream &output) const
   output << "}";
 }
 
-StochSimulStatement::StochSimulStatement(SymbolList symbol_list_arg,
-                                         OptionsList options_list_arg) :
+StochSimulStatement::StochSimulStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                                         const SymbolTable &symbol_table_arg) :
   symbol_list{move(symbol_list_arg)},
-  options_list{move(options_list_arg)}
+  options_list{move(options_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -373,11 +374,9 @@ StochSimulStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsoli
       exit(EXIT_FAILURE);
     }
 
-  symbol_list.removeDuplicates("stoch_simul", warnings);
-
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -418,10 +417,11 @@ StochSimulStatement::writeJsonOutput(ostream &output) const
   output << "}";
 }
 
-ForecastStatement::ForecastStatement(SymbolList symbol_list_arg,
-                                     OptionsList options_list_arg) :
+ForecastStatement::ForecastStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                                     const SymbolTable &symbol_table_arg) :
   symbol_list{move(symbol_list_arg)},
-  options_list{move(options_list_arg)}
+  options_list{move(options_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -430,7 +430,7 @@ ForecastStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolida
 {
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -620,9 +620,11 @@ RamseyConstraintsStatement::writeJsonOutput(ostream &output) const
 }
 
 RamseyPolicyStatement::RamseyPolicyStatement(SymbolList symbol_list_arg,
-                                             OptionsList options_list_arg) :
+                                             OptionsList options_list_arg,
+                                             const SymbolTable &symbol_table_arg) :
   symbol_list{move(symbol_list_arg)},
-  options_list{move(options_list_arg)}
+  options_list{move(options_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -668,7 +670,7 @@ RamseyPolicyStatement::checkPass(ModFileStructure &mod_file_struct, WarningConso
 
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -733,9 +735,11 @@ EvaluatePlannerObjectiveStatement::writeJsonOutput(ostream &output) const
 }
 
 DiscretionaryPolicyStatement::DiscretionaryPolicyStatement(SymbolList symbol_list_arg,
-                                                           OptionsList options_list_arg) :
+                                                           OptionsList options_list_arg,
+                                                           const SymbolTable &symbol_table_arg) :
   symbol_list{move(symbol_list_arg)},
-  options_list{move(options_list_arg)}
+  options_list{move(options_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -783,7 +787,7 @@ DiscretionaryPolicyStatement::checkPass(ModFileStructure &mod_file_struct, Warni
 
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -1042,7 +1046,7 @@ EstimationStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsoli
 
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -1145,8 +1149,10 @@ DynareSensitivityStatement::writeJsonOutput(ostream &output) const
   output << "}";
 }
 
-RplotStatement::RplotStatement(SymbolList symbol_list_arg) :
-  symbol_list{move(symbol_list_arg)}
+RplotStatement::RplotStatement(SymbolList symbol_list_arg,
+                               const SymbolTable &symbol_table_arg) :
+  symbol_list{move(symbol_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -1155,7 +1161,7 @@ RplotStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidatio
 {
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous, SymbolType::exogenous});
+      symbol_list.checkPass(warnings, { SymbolType::endogenous, SymbolType::exogenous}, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -2024,7 +2030,7 @@ OsrParamsStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolid
 
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::parameter });
+      symbol_list.checkPass(warnings, { SymbolType::parameter }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -2040,7 +2046,7 @@ OsrParamsStatement::writeOutput(ostream &output, const string &basename, bool mi
   output << "M_.osr.param_names = cellstr(M_.osr.param_names);" << endl
          << "M_.osr.param_indices = zeros(length(M_.osr.param_names), 1);" << endl;
   int i = 0;
-  vector<string> symbols = symbol_list.get_symbols();
+  vector<string> symbols = symbol_list.getSymbols();
   for (auto &symbol : symbols)
     output << "M_.osr.param_indices(" << ++i <<") = " << symbol_table.getTypeSpecificID(symbol) + 1 << ";" << endl;
 }
@@ -2109,10 +2115,11 @@ OsrParamsBoundsStatement::writeJsonOutput(ostream &output) const
          << "}";
 }
 
-OsrStatement::OsrStatement(SymbolList symbol_list_arg,
-                           OptionsList options_list_arg) :
+OsrStatement::OsrStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                           const SymbolTable &symbol_table_arg) :
   symbol_list{move(symbol_list_arg)},
-  options_list{move(options_list_arg)}
+  options_list{move(options_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -2139,7 +2146,7 @@ OsrStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation
 
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -2253,10 +2260,11 @@ OptimWeightsStatement::writeJsonOutput(ostream &output) const
          << "}";
 }
 
-DynaSaveStatement::DynaSaveStatement(SymbolList symbol_list_arg,
-                                     string filename_arg) :
+DynaSaveStatement::DynaSaveStatement(SymbolList symbol_list_arg, string filename_arg,
+                        const SymbolTable &symbol_table_arg) :
   symbol_list{move(symbol_list_arg)},
-  filename{move(filename_arg)}
+  filename{move(filename_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -2265,7 +2273,7 @@ DynaSaveStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolida
 {
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous, SymbolType::exogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous, SymbolType::exogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -2295,10 +2303,11 @@ DynaSaveStatement::writeJsonOutput(ostream &output) const
   output << "}";
 }
 
-DynaTypeStatement::DynaTypeStatement(SymbolList symbol_list_arg,
-                                     string filename_arg) :
+DynaTypeStatement::DynaTypeStatement(SymbolList symbol_list_arg, string filename_arg,
+                                     const SymbolTable &symbol_table_arg) :
   symbol_list(move(symbol_list_arg)),
-  filename(move(filename_arg))
+  filename(move(filename_arg)),
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -2307,7 +2316,7 @@ DynaTypeStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolida
 {
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous, SymbolType::exogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous, SymbolType::exogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -2687,10 +2696,11 @@ MSSBVARComputeProbabilitiesStatement::writeJsonOutput(ostream &output) const
   output << "}";
 }
 
-MSSBVARIrfStatement::MSSBVARIrfStatement(SymbolList symbol_list_arg,
-                                         OptionsList options_list_arg) :
+MSSBVARIrfStatement::MSSBVARIrfStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                                         const SymbolTable &symbol_table_arg) :
   symbol_list{move(symbol_list_arg)},
-  options_list{move(options_list_arg)}
+  options_list{move(options_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -2714,7 +2724,7 @@ MSSBVARIrfStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsoli
 
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -2976,9 +2986,11 @@ WriteLatexSteadyStateModelStatement::writeJsonOutput(ostream &output) const
 }
 
 ShockDecompositionStatement::ShockDecompositionStatement(SymbolList symbol_list_arg,
-                                                         OptionsList options_list_arg) :
+                                                         OptionsList options_list_arg,
+                                                         const SymbolTable &symbol_table_arg) :
   symbol_list{move(symbol_list_arg)},
-  options_list{move(options_list_arg)}
+  options_list{move(options_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -2991,7 +3003,7 @@ ShockDecompositionStatement::checkPass(ModFileStructure &mod_file_struct, Warnin
 
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -3026,9 +3038,11 @@ ShockDecompositionStatement::writeJsonOutput(ostream &output) const
 }
 
 RealtimeShockDecompositionStatement::RealtimeShockDecompositionStatement(SymbolList symbol_list_arg,
-                                                                         OptionsList options_list_arg) :
+                                                                         OptionsList options_list_arg,
+                                                                         const SymbolTable &symbol_table_arg) :
   symbol_list{move(symbol_list_arg)},
-  options_list{move(options_list_arg)}
+  options_list{move(options_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -3041,7 +3055,7 @@ RealtimeShockDecompositionStatement::checkPass(ModFileStructure &mod_file_struct
 
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -3076,9 +3090,11 @@ RealtimeShockDecompositionStatement::writeJsonOutput(ostream &output) const
 }
 
 PlotShockDecompositionStatement::PlotShockDecompositionStatement(SymbolList symbol_list_arg,
-                                                                 OptionsList options_list_arg) :
+                                                                 OptionsList options_list_arg,
+                                                                 const SymbolTable &symbol_table_arg) :
   symbol_list{move(symbol_list_arg)},
-  options_list{move(options_list_arg)}
+  options_list{move(options_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -3087,7 +3103,7 @@ PlotShockDecompositionStatement::checkPass(ModFileStructure &mod_file_struct, Wa
 {
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous, SymbolType::epilogue });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous, SymbolType::epilogue }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -3123,9 +3139,11 @@ PlotShockDecompositionStatement::writeJsonOutput(ostream &output) const
 }
 
 InitialConditionDecompositionStatement::InitialConditionDecompositionStatement(SymbolList symbol_list_arg,
-                                                                               OptionsList options_list_arg) :
+                                                                               OptionsList options_list_arg,
+                                                                               const SymbolTable &symbol_table_arg) :
   symbol_list{move(symbol_list_arg)},
-  options_list{move(options_list_arg)}
+  options_list{move(options_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -3138,7 +3156,7 @@ InitialConditionDecompositionStatement::checkPass(ModFileStructure &mod_file_str
 
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -3173,8 +3191,10 @@ InitialConditionDecompositionStatement::writeJsonOutput(ostream &output) const
   output << "}";
 }
 
-SqueezeShockDecompositionStatement::SqueezeShockDecompositionStatement(SymbolList symbol_list_arg)
-  : symbol_list{move(symbol_list_arg)}
+SqueezeShockDecompositionStatement::SqueezeShockDecompositionStatement(SymbolList symbol_list_arg,
+                                                                       const SymbolTable &symbol_table_arg) :
+  symbol_list{move(symbol_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -3184,7 +3204,7 @@ SqueezeShockDecompositionStatement::checkPass(ModFileStructure &mod_file_struct,
 {
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -3251,9 +3271,12 @@ ConditionalForecastStatement::writeJsonOutput(ostream &output) const
   output << "}";
 }
 
-PlotConditionalForecastStatement::PlotConditionalForecastStatement(int periods_arg, SymbolList symbol_list_arg) :
+PlotConditionalForecastStatement::PlotConditionalForecastStatement(int periods_arg,
+                                                                   SymbolList symbol_list_arg,
+                                                                   const SymbolTable &symbol_table_arg) :
   periods{periods_arg},
-  symbol_list{move(symbol_list_arg)}
+  symbol_list{move(symbol_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -3263,7 +3286,7 @@ PlotConditionalForecastStatement::checkPass(ModFileStructure &mod_file_struct,
 {
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
@@ -4826,8 +4849,11 @@ OptionsEqualStatement::writeOutput(ostream &output, const string &basename, bool
 }
 
 CalibSmootherStatement::CalibSmootherStatement(SymbolList symbol_list_arg,
-                                               OptionsList options_list_arg)
-  : symbol_list{move(symbol_list_arg)}, options_list{move(options_list_arg)}
+                                               OptionsList options_list_arg,
+                                               const SymbolTable &symbol_table_arg) :
+  symbol_list{move(symbol_list_arg)},
+  options_list{move(options_list_arg)},
+  symbol_table{symbol_table_arg}
 {
 }
 
@@ -4837,7 +4863,7 @@ CalibSmootherStatement::checkPass(ModFileStructure &mod_file_struct, WarningCons
   mod_file_struct.calib_smoother_present = true;
   try
     {
-      symbol_list.checkPass(warnings, { SymbolType::endogenous });
+      symbol_list.checkPass(warnings, { SymbolType::endogenous }, symbol_table);
     }
   catch (SymbolList::SymbolListException &e)
     {
diff --git a/src/ComputingTasks.hh b/src/ComputingTasks.hh
index 542e9777b15fa468d3ccb8c7cf949cbaf7b1c3b9..e7502f650baddc01de5e89e5c4ac12f6b205ee1c 100644
--- a/src/ComputingTasks.hh
+++ b/src/ComputingTasks.hh
@@ -130,11 +130,12 @@ public:
 class StochSimulStatement : public Statement
 {
 private:
-  SymbolList symbol_list;
+  const SymbolList symbol_list;
   const OptionsList options_list;
+  const SymbolTable &symbol_table;
 public:
-  StochSimulStatement(SymbolList symbol_list_arg,
-                      OptionsList options_list_arg);
+  StochSimulStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                      const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -145,9 +146,10 @@ class ForecastStatement : public Statement
 private:
   const SymbolList symbol_list;
   const OptionsList options_list;
+  const SymbolTable &symbol_table;
 public:
-  ForecastStatement(SymbolList symbol_list_arg,
-                    OptionsList options_list_arg);
+  ForecastStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                    const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -189,9 +191,10 @@ class RamseyPolicyStatement : public Statement
 private:
   const SymbolList symbol_list;
   const OptionsList options_list;
+  const SymbolTable &symbol_table;
 public:
-  RamseyPolicyStatement(SymbolList symbol_list_arg,
-                        OptionsList options_list_arg);
+  RamseyPolicyStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                        const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -254,9 +257,10 @@ class DiscretionaryPolicyStatement : public Statement
 private:
   const SymbolList symbol_list;
   const OptionsList options_list;
+  const SymbolTable &symbol_table;
 public:
-  DiscretionaryPolicyStatement(SymbolList symbol_list_arg,
-                               OptionsList options_list_arg);
+  DiscretionaryPolicyStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                               const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -266,8 +270,9 @@ class RplotStatement : public Statement
 {
 private:
   const SymbolList symbol_list;
+  const SymbolTable &symbol_table;
 public:
-  explicit RplotStatement(SymbolList symbol_list_arg);
+  RplotStatement(SymbolList symbol_list_arg, const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -386,9 +391,10 @@ class OsrStatement : public Statement
 private:
   const SymbolList symbol_list;
   const OptionsList options_list;
+  const SymbolTable &symbol_table;
 public:
-  OsrStatement(SymbolList symbol_list_arg,
-               OptionsList options_list_arg);
+  OsrStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+               const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -426,9 +432,10 @@ class DynaTypeStatement : public Statement
 private:
   const SymbolList symbol_list;
   const string filename;
+  const SymbolTable &symbol_table;
 public:
-  DynaTypeStatement(SymbolList symbol_list_arg,
-                    string filename_arg);
+  DynaTypeStatement(SymbolList symbol_list_arg, string filename_arg,
+                    const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -439,9 +446,10 @@ class DynaSaveStatement : public Statement
 private:
   const SymbolList symbol_list;
   const string filename;
+  const SymbolTable &symbol_table;
 public:
-  DynaSaveStatement(SymbolList symbol_list_arg,
-                    string filename_arg);
+  DynaSaveStatement(SymbolList symbol_list_arg, string filename_arg,
+                    const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -671,9 +679,10 @@ class MSSBVARIrfStatement : public Statement
 private:
   const SymbolList symbol_list;
   const OptionsList options_list;
+  const SymbolTable &symbol_table;
 public:
-  MSSBVARIrfStatement(SymbolList symbol_list_arg,
-                      OptionsList options_list_arg);
+  MSSBVARIrfStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                      const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -761,9 +770,10 @@ class ShockDecompositionStatement : public Statement
 private:
   const SymbolList symbol_list;
   const OptionsList options_list;
+  const SymbolTable &symbol_table;
 public:
-  ShockDecompositionStatement(SymbolList symbol_list_arg,
-                              OptionsList options_list_arg);
+  ShockDecompositionStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                              const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -774,9 +784,10 @@ class RealtimeShockDecompositionStatement : public Statement
 private:
   const SymbolList symbol_list;
   const OptionsList options_list;
+  const SymbolTable &symbol_table;
 public:
-  RealtimeShockDecompositionStatement(SymbolList symbol_list_arg,
-                                      OptionsList options_list_arg);
+  RealtimeShockDecompositionStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                                      const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -787,9 +798,10 @@ class PlotShockDecompositionStatement : public Statement
 private:
   const SymbolList symbol_list;
   const OptionsList options_list;
+  const SymbolTable &symbol_table;
 public:
-  PlotShockDecompositionStatement(SymbolList symbol_list_arg,
-                                  OptionsList options_list_arg);
+  PlotShockDecompositionStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                                  const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -800,9 +812,10 @@ class InitialConditionDecompositionStatement : public Statement
 private:
   const SymbolList symbol_list;
   const OptionsList options_list;
+  const SymbolTable &symbol_table;
 public:
-  InitialConditionDecompositionStatement(SymbolList symbol_list_arg,
-                                         OptionsList options_list_arg);
+  InitialConditionDecompositionStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                                         const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -812,8 +825,10 @@ class SqueezeShockDecompositionStatement : public Statement
 {
 private:
   const SymbolList symbol_list;
+  const SymbolTable &symbol_table;
 public:
-  explicit SqueezeShockDecompositionStatement(SymbolList symbol_list_arg);
+  SqueezeShockDecompositionStatement(SymbolList symbol_list_arg,
+                                     const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -836,8 +851,10 @@ private:
   //! A value of -1 indicates that the user didn't specify a value
   const int periods;
   const SymbolList symbol_list;
+  const SymbolTable &symbol_table;
 public:
-  PlotConditionalForecastStatement(int periods_arg, SymbolList symbol_list_arg);
+  PlotConditionalForecastStatement(int periods_arg, SymbolList symbol_list_arg,
+                                   const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
@@ -848,9 +865,10 @@ class CalibSmootherStatement : public Statement
 private:
   const SymbolList symbol_list;
   const OptionsList options_list;
+  const SymbolTable &symbol_table;
 public:
-  CalibSmootherStatement(SymbolList symbol_list_arg,
-                         OptionsList options_list_arg);
+  CalibSmootherStatement(SymbolList symbol_list_arg, OptionsList options_list_arg,
+                         const SymbolTable &symbol_table_arg);
   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
diff --git a/src/DynareBison.yy b/src/DynareBison.yy
index 1d746a1b18ff1ef22d755ba9314cd0755942c35d..8b5f97b9a091d0261e823babb1be75aa90b3d96e 100644
--- a/src/DynareBison.yy
+++ b/src/DynareBison.yy
@@ -203,12 +203,12 @@ class ParsingDriver;
 %type <string> name_value_pair_with_suboptions name_value_pair_with_suboptions_list
 %type <SymbolType> change_type_arg
 %type <vector<string>> vec_str vec_str_1
-%type <vector<string>> change_type_var_list
+%type <vector<string>> symbol_list symbol_list_or_wildcard
 %type <vector<int>> vec_int_elem vec_int_1 vec_int vec_int_number
 %type <PriorDistributions> prior_pdf prior_distribution
 %type <pair<expr_t,expr_t>> calibration_range
-%type <pair<string,string>> named_var_elem subsamples_eq_opt integer_range_w_inf
-%type <vector<pair<string,string>>> named_var named_var_1 tag_pair_list_for_selection
+%type <pair<string,string>> partition_elem subsamples_eq_opt integer_range_w_inf
+%type <vector<pair<string,string>>> partition partition_1 tag_pair_list_for_selection symbol_list_with_tex
 %type <tuple<string,string,string,string>> prior_eq_opt options_eq_opt
 %type <vector<pair<int, int>>> period_list
 %type <vector<expr_t>> matched_moments_list value_list
@@ -217,6 +217,7 @@ class ParsingDriver;
 %type <map<string, expr_t>> occbin_constraints_regime_options_list
 %type <pair<string, expr_t>> occbin_constraints_regime_option
 %type <PacTargetKind> pac_target_kind
+%type <vector<tuple<string, string, vector<pair<string, string>>>>> symbol_list_with_tex_and_partition
 %%
 
 %start statement_list;
@@ -361,52 +362,143 @@ dsample : DSAMPLE INT_NUMBER ';'
           { driver.dsample($2, $3); }
         ;
 
-rplot : RPLOT symbol_list ';' { driver.rplot(); };
+symbol_list : symbol_list symbol
+              {
+                $$ = $1;
+                $$.push_back($2);
+              }
+            | symbol_list COMMA symbol
+              {
+                $$ = $1;
+                $$.push_back($3);
+              }
+            | symbol
+              { $$ = { $1 }; }
+            ;
+
+symbol_list_or_wildcard : symbol_list
+                        | ':'
+                          { $$ = { ":" }; }
+                        ;
+
+symbol_list_with_tex : symbol_list_with_tex symbol
+                       {
+                         $$ = $1;
+                         $$.emplace_back($2, "");
+                       }
+                     | symbol_list_with_tex COMMA symbol
+                       {
+                         $$ = $1;
+                         $$.emplace_back($3, "");
+                       }
+                     | symbol
+                       { $$ = { { $1, "" }}; }
+                     | symbol_list_with_tex symbol TEX_NAME
+                       {
+                         $$ = $1;
+                         $$.emplace_back($2, $3);
+                       }
+                     | symbol_list_with_tex COMMA symbol TEX_NAME
+                       {
+                         $$ = $1;
+                         $$.emplace_back($3, $4);
+                       }
+                     | symbol TEX_NAME
+                       { $$ = { { $1, $2 } }; }
+                     ;
 
-trend_var : TREND_VAR '(' GROWTH_FACTOR EQUAL { driver.begin_trend(); } hand_side ')' trend_var_list ';'
-            { driver.end_trend_var($6); }
+partition_elem : symbol EQUAL QUOTED_STRING
+                 { $$ = { $1, $3 }; }
+
+partition_1 : '(' partition_elem
+              { $$ = { $2 }; }
+            | '(' COMMA partition_elem
+              { $$ = { $3 }; }
+            | partition_1 partition_elem
+              {
+                $$ = $1;
+                $$.push_back($2);
+              }
+            | partition_1 COMMA partition_elem
+              {
+                $$ = $1;
+                $$.push_back($3);
+              }
+            ;
+
+partition : partition_1 ')'
+          | partition_1 COMMA ')'
           ;
 
-trend_var_list : trend_var_list symbol
-                 { driver.declare_trend_var(false, $2); }
-               | trend_var_list COMMA symbol
-                 { driver.declare_trend_var(false, $3); }
-               | symbol
-                 { driver.declare_trend_var(false, $1); }
-               | trend_var_list symbol TEX_NAME
-                 { driver.declare_trend_var(false, $2, $3); }
-               | trend_var_list COMMA symbol TEX_NAME
-                 { driver.declare_trend_var(false, $3, $4); }
-               | symbol TEX_NAME
-                 { driver.declare_trend_var(false, $1, $2); }
-               ;
+symbol_list_with_tex_and_partition : symbol_list_with_tex_and_partition symbol
+                                     {
+                                       $$ = $1;
+                                       $$.emplace_back($2, "", vector<pair<string,string>>{});
+                                     }
+                                   | symbol_list_with_tex_and_partition COMMA symbol
+                                     {
+                                       $$ = $1;
+                                       $$.emplace_back($3, "", vector<pair<string,string>>{});
+                                     }
+                                   | symbol
+                                     { $$ = { { $1, "", {} }}; }
+                                   | symbol_list_with_tex_and_partition symbol partition
+                                     {
+                                       $$ = $1;
+                                       $$.emplace_back($2, "", $3);
+                                     }
+                                   | symbol_list_with_tex_and_partition COMMA symbol partition
+                                     {
+                                       $$ = $1;
+                                       $$.emplace_back($3, "", $4);
+                                     }
+                                   | symbol partition
+                                     { $$ = { { $1, "", $2 }}; }
+                                   | symbol_list_with_tex_and_partition symbol TEX_NAME
+                                     {
+                                       $$ = $1;
+                                       $$.emplace_back($2, $3, vector<pair<string,string>>{});
+                                     }
+                                   | symbol_list_with_tex_and_partition COMMA symbol TEX_NAME
+                                     {
+                                       $$ = $1;
+                                       $$.emplace_back($3, $4, vector<pair<string,string>>{});
+                                     }
+                                   | symbol TEX_NAME
+                                     { $$ = { { $1, $2, {} }}; }
+                                   | symbol_list_with_tex_and_partition symbol TEX_NAME partition
+                                     {
+                                       $$ = $1;
+                                       $$.emplace_back($2, $3, $4);
+                                     }
+                                   | symbol_list_with_tex_and_partition COMMA symbol TEX_NAME partition
+                                     {
+                                       $$ = $1;
+                                       $$.emplace_back($3, $4, $5);
+                                     }
+                                   | symbol TEX_NAME partition
+                                     { $$ = { { $1, $2, $3 }}; }
+                                   ;
 
-log_trend_var : LOG_TREND_VAR '(' LOG_GROWTH_FACTOR EQUAL { driver.begin_trend(); } hand_side ')' log_trend_var_list ';'
-                { driver.end_trend_var($6); }
-              ;
+rplot : RPLOT symbol_list ';' { driver.rplot($2); };
 
-log_trend_var_list : log_trend_var_list symbol
-                     { driver.declare_trend_var(true, $2); }
-                   | log_trend_var_list COMMA symbol
-                     { driver.declare_trend_var(true, $3); }
-                   | symbol
-                     { driver.declare_trend_var(true, $1); }
-                   | log_trend_var_list symbol TEX_NAME
-                     { driver.declare_trend_var(true, $2, $3); }
-                   | log_trend_var_list COMMA symbol TEX_NAME
-                     { driver.declare_trend_var(true, $3, $4); }
-                   | symbol TEX_NAME
-                     { driver.declare_trend_var(true, $1, $2); }
-                   ;
+trend_var : TREND_VAR '(' GROWTH_FACTOR EQUAL { driver.begin_trend(); } hand_side ')' symbol_list_with_tex ';'
+            { driver.end_trend_var(false, $6, $8); }
+          ;
 
-var : VAR var_list ';'
-    | VAR '(' DEFLATOR EQUAL { driver.begin_trend(); } hand_side ')' nonstationary_var_list ';'
-      { driver.end_nonstationary_var(false, $6); }
-    | VAR '(' LOG_DEFLATOR EQUAL { driver.begin_trend(); } hand_side ')' nonstationary_var_list ';'
-      { driver.end_nonstationary_var(true, $6); }
+log_trend_var : LOG_TREND_VAR '(' LOG_GROWTH_FACTOR EQUAL { driver.begin_trend(); } hand_side ')' symbol_list_with_tex ';'
+                { driver.end_trend_var(true, $6, $8); }
+              ;
+
+var : VAR symbol_list_with_tex_and_partition ';'
+      { driver.var($2); }
+    | VAR '(' DEFLATOR EQUAL { driver.begin_trend(); } hand_side ')' symbol_list_with_tex_and_partition ';'
+      { driver.end_nonstationary_var(false, $6, $8); }
+    | VAR '(' LOG_DEFLATOR EQUAL { driver.begin_trend(); } hand_side ')' symbol_list_with_tex_and_partition ';'
+      { driver.end_nonstationary_var(true, $6, $8); }
     ;
 
-var_remove : VAR_REMOVE symbol_list ';' { driver.var_remove(); };
+var_remove : VAR_REMOVE symbol_list ';' { driver.var_remove($2); };
 
 var_model : VAR_MODEL '(' var_model_options_list ')' ';' { driver.var_model(); }
           ;
@@ -476,194 +568,27 @@ var_expectation_model_option : VARIABLE EQUAL symbol
                                { driver.option_num("time_shift", $3); }
                              ;
 
-nonstationary_var_list : nonstationary_var_list symbol
-                         { driver.declare_nonstationary_var($2); }
-                       | nonstationary_var_list COMMA symbol
-                         { driver.declare_nonstationary_var($3); }
-                       | symbol
-                         { driver.declare_nonstationary_var($1); }
-                       |  nonstationary_var_list symbol named_var
-                         { driver.declare_nonstationary_var($2, "", $3); }
-                       | nonstationary_var_list COMMA symbol named_var
-                         { driver.declare_nonstationary_var($3, "", $4); }
-                       | symbol named_var
-                         { driver.declare_nonstationary_var($1, "", $2); }
-                       | nonstationary_var_list symbol TEX_NAME
-                         { driver.declare_nonstationary_var($2, $3); }
-                       | nonstationary_var_list COMMA symbol TEX_NAME
-                         { driver.declare_nonstationary_var($3, $4); }
-                       | symbol TEX_NAME
-                         { driver.declare_nonstationary_var($1, $2); }
-                       | nonstationary_var_list symbol TEX_NAME named_var
-                         { driver.declare_nonstationary_var($2, $3, $4); }
-                       | nonstationary_var_list COMMA symbol TEX_NAME named_var
-                         { driver.declare_nonstationary_var($3, $4, $5); }
-                       | symbol TEX_NAME named_var
-                         { driver.declare_nonstationary_var($1, $2, $3); }
-                       ;
-
-varexo : VAREXO varexo_list ';'
+varexo : VAREXO symbol_list_with_tex_and_partition ';'
+         { driver.varexo($2); }
        ;
 
-varexo_det : VAREXO_DET varexo_det_list ';';
-
-predetermined_variables : PREDETERMINED_VARIABLES predetermined_variables_list ';';
-
-parameters : PARAMETERS parameter_list ';';
+varexo_det : VAREXO_DET symbol_list_with_tex_and_partition ';'
+             { driver.varexo_det($2); }
            ;
 
-model_local_variable : MODEL_LOCAL_VARIABLE model_local_variable_list ';';
-
-named_var_elem : symbol EQUAL QUOTED_STRING
-                 { $$ = { $1, $3 }; }
-
-named_var_1 : '(' named_var_elem
-              { $$ = { $2 }; }
-            | '(' COMMA named_var_elem
-              { $$ = { $3 }; }
-            | named_var_1 named_var_elem
-              {
-                $$ = $1;
-                $$.push_back($2);
-              }
-            | named_var_1 COMMA named_var_elem
-              {
-                $$ = $1;
-                $$.push_back($3);
-              }
-            ;
-
-named_var : named_var_1 ')'
-          | named_var_1 COMMA ')'
-          ;
-
-var_list : var_list symbol
-           { driver.declare_endogenous($2); }
-         | var_list COMMA symbol
-           { driver.declare_endogenous($3); }
-         | symbol
-           { driver.declare_endogenous($1); }
-         | var_list symbol named_var
-           { driver.declare_endogenous($2, "", $3); }
-         | var_list COMMA symbol named_var
-           { driver.declare_endogenous($3, "", $4); }
-         | symbol named_var
-           { driver.declare_endogenous($1, "", $2); }
-         | var_list symbol TEX_NAME
-           { driver.declare_endogenous($2, $3); }
-         | var_list COMMA symbol TEX_NAME
-           { driver.declare_endogenous($3, $4); }
-         | symbol TEX_NAME
-           { driver.declare_endogenous($1, $2); }
-         | var_list symbol TEX_NAME named_var
-           { driver.declare_endogenous($2, $3, $4); }
-         | var_list COMMA symbol TEX_NAME named_var
-           { driver.declare_endogenous($3, $4, $5); }
-         | symbol TEX_NAME named_var
-           { driver.declare_endogenous($1, $2, $3); }
-         ;
-
-varexo_list : varexo_list symbol
-              { driver.declare_exogenous($2); }
-            | varexo_list COMMA symbol
-              { driver.declare_exogenous($3); }
-            | symbol
-              { driver.declare_exogenous($1); }
-            | varexo_list symbol named_var
-              { driver.declare_exogenous($2, "", $3); }
-            | varexo_list COMMA symbol named_var
-              { driver.declare_exogenous($3, "", $4); }
-            | symbol named_var
-              { driver.declare_exogenous($1, "", $2); }
-            | varexo_list symbol TEX_NAME
-              { driver.declare_exogenous($2, $3); }
-            | varexo_list COMMA symbol TEX_NAME
-              { driver.declare_exogenous($3, $4); }
-            | symbol TEX_NAME
-              { driver.declare_exogenous($1, $2); }
-            | varexo_list symbol TEX_NAME named_var
-              { driver.declare_exogenous($2, $3, $4); }
-            | varexo_list COMMA symbol TEX_NAME named_var
-              { driver.declare_exogenous($3, $4, $5); }
-            | symbol TEX_NAME named_var
-              { driver.declare_exogenous($1, $2, $3); }
-            ;
-
-varexo_det_list : varexo_det_list symbol
-                  { driver.declare_exogenous_det($2); }
-                | varexo_det_list COMMA symbol
-                  { driver.declare_exogenous_det($3); }
-                | symbol
-                  { driver.declare_exogenous_det($1); }
-                | varexo_det_list symbol named_var
-                  { driver.declare_exogenous_det($2, "", $3); }
-                | varexo_det_list COMMA symbol named_var
-                  { driver.declare_exogenous_det($3, "", $4); }
-                | symbol named_var
-                  { driver.declare_exogenous_det($1, "", $2); }
-                | varexo_det_list symbol TEX_NAME
-                  { driver.declare_exogenous_det($2, $3); }
-                | varexo_det_list COMMA symbol TEX_NAME
-                  { driver.declare_exogenous_det($3, $4); }
-                | symbol TEX_NAME
-                   { driver.declare_exogenous_det($1, $2); }
-                | varexo_det_list symbol TEX_NAME named_var
-                  { driver.declare_exogenous_det($2, $3, $4); }
-                | varexo_det_list COMMA symbol TEX_NAME named_var
-                  { driver.declare_exogenous_det($3, $4, $5); }
-                | symbol TEX_NAME named_var
-                   { driver.declare_exogenous_det($1, $2, $3); }
-                ;
-
-parameter_list : parameter_list symbol
-                 { driver.declare_parameter($2); }
-               | parameter_list COMMA symbol
-                 { driver.declare_parameter($3); }
-               | symbol
-                 { driver.declare_parameter($1); }
-               | parameter_list symbol named_var
-                 { driver.declare_parameter($2, "", $3); }
-               | parameter_list COMMA symbol named_var
-                 { driver.declare_parameter($3, "", $4); }
-               | symbol named_var
-                 { driver.declare_parameter($1, "", $2); }
-               | parameter_list symbol TEX_NAME
-                 { driver.declare_parameter($2, $3); }
-               | parameter_list COMMA symbol TEX_NAME
-                 { driver.declare_parameter($3, $4); }
-               | symbol TEX_NAME
-                 { driver.declare_parameter($1, $2); }
-               | parameter_list symbol TEX_NAME named_var
-                 { driver.declare_parameter($2, $3, $4); }
-               | parameter_list COMMA symbol TEX_NAME named_var
-                 { driver.declare_parameter($3, $4, $5); }
-               | symbol TEX_NAME named_var
-                 { driver.declare_parameter($1, $2, $3); }
-               ;
+predetermined_variables : PREDETERMINED_VARIABLES symbol_list ';'
+                          { driver.predetermined_variables($2); }
+                        ;
 
-predetermined_variables_list : predetermined_variables_list symbol
-                               { driver.add_predetermined_variable($2); }
-                             | predetermined_variables_list COMMA symbol
-                               { driver.add_predetermined_variable($3); }
-                             | symbol
-                               { driver.add_predetermined_variable($1); }
-                             ;
+parameters : PARAMETERS symbol_list_with_tex_and_partition ';'
+             { driver.parameters($2); }
+           ;
 
-model_local_variable_list : model_local_variable_list symbol
-                            { driver.declare_model_local_variable($2); }
-                          | model_local_variable_list COMMA symbol
-                            { driver.declare_model_local_variable($3); }
-                          | symbol
-                            { driver.declare_model_local_variable($1); }
-                          | model_local_variable_list symbol TEX_NAME
-                            { driver.declare_model_local_variable($2, $3); }
-                          | model_local_variable_list COMMA symbol TEX_NAME
-                            { driver.declare_model_local_variable($3, $4); }
-                          | symbol TEX_NAME
-                            { driver.declare_model_local_variable($1, $2); }
-                          ;
+model_local_variable : MODEL_LOCAL_VARIABLE symbol_list_with_tex ';'
+                       { driver.model_local_variable($2); }
+                     ;
 
-change_type : CHANGE_TYPE '(' change_type_arg ')' change_type_var_list ';'
+change_type : CHANGE_TYPE '(' change_type_arg ')' symbol_list ';'
               { driver.change_type($3, $5); }
             ;
 
@@ -677,20 +602,6 @@ change_type_arg : PARAMETERS
                   { $$ = SymbolType::exogenousDet; }
                 ;
 
-change_type_var_list : symbol
-                       { $$ = { $1 }; }
-                     | change_type_var_list symbol
-                       {
-                         $$ = $1;
-                         $$.push_back($2);
-                       }
-                     | change_type_var_list COMMA symbol
-                       {
-                         $$ = $1;
-                         $$.push_back($3);
-                       }
-                     ;
-
 periods : PERIODS INT_NUMBER ';'
           { driver.periods($2); }
         | PERIODS EQUAL INT_NUMBER ';'
@@ -1013,7 +924,7 @@ model_option : BLOCK { driver.block(); }
              | USE_DLL { driver.use_dll(); }
              | NO_STATIC { driver.no_static();}
              | DIFFERENTIATE_FORWARD_VARS { driver.differentiate_forward_vars_all(); }
-             | DIFFERENTIATE_FORWARD_VARS EQUAL '(' symbol_list ')' { driver.differentiate_forward_vars_some(); }
+             | DIFFERENTIATE_FORWARD_VARS EQUAL '(' symbol_list ')' { driver.differentiate_forward_vars_some($4); }
              | o_linear
              | PARALLEL_LOCAL_FILES EQUAL '(' parallel_local_filename_list ')'
              | BALANCED_GROWTH_TEST_TOL EQUAL non_negative_number { driver.balanced_growth_test_tol($3); }
@@ -1278,18 +1189,12 @@ svar_identification_elem : EXCLUSION LAG INT_NUMBER ';' svar_equation_list
                            { driver.add_lower_cholesky(); }
                          ;
 
-svar_equation_list : svar_equation_list EQUATION INT_NUMBER COMMA svar_var_list ';'
-                     { driver.add_restriction_in_equation($3); }
-                   | EQUATION INT_NUMBER COMMA svar_var_list ';'
-                     { driver.add_restriction_in_equation($2); }
+svar_equation_list : svar_equation_list EQUATION INT_NUMBER COMMA symbol_list ';'
+                     { driver.add_restriction_in_equation($3, $5); }
+                   | EQUATION INT_NUMBER COMMA symbol_list ';'
+                     { driver.add_restriction_in_equation($2, $4); }
                    ;
 
-svar_var_list : svar_var_list COMMA symbol
-                { driver.add_in_svar_restriction_symbols($3); }
-              | symbol
-                { driver.add_in_svar_restriction_symbols($1); }
-              ;
-
 restriction_expression : expression {driver.check_restriction_expression_constant($1);}
                        | restriction_expression_1
                        ;
@@ -1676,13 +1581,13 @@ external_function_options : o_ext_func_name
                           ;
 
 stoch_simul : STOCH_SIMUL ';'
-              { driver.stoch_simul(); }
+              { driver.stoch_simul({}); }
             | STOCH_SIMUL '(' stoch_simul_options_list ')' ';'
-              { driver.stoch_simul(); }
+              { driver.stoch_simul({}); }
             | STOCH_SIMUL symbol_list ';'
-              { driver.stoch_simul(); }
+              { driver.stoch_simul($2); }
             | STOCH_SIMUL '(' stoch_simul_options_list ')' symbol_list ';'
-              { driver.stoch_simul(); }
+              { driver.stoch_simul($5); }
             ;
 
 stoch_simul_options_list : stoch_simul_options_list COMMA stoch_simul_options
@@ -1749,19 +1654,6 @@ stoch_simul_options : stoch_simul_primary_options
                     | o_one_sided_hp_filter
                     ;
 
-symbol_list : symbol_list symbol
-               { driver.add_in_symbol_list($2); }
-             | symbol_list COMMA symbol
-               { driver.add_in_symbol_list($3); }
-             | symbol
-               { driver.add_in_symbol_list($1); }
-             ;
-
-symbol_list_ext : symbol_list
-                | ':'
-                  { driver.add_in_symbol_list(":"); }
-                ;
-
 signed_integer : PLUS INT_NUMBER
                  { $$ = $2; }
                | MINUS INT_NUMBER
@@ -2187,13 +2079,13 @@ options_eq_opt : symbol '.' OPTIONS
                ;
 
 estimation : ESTIMATION ';'
-             { driver.run_estimation(); }
+             { driver.run_estimation({}); }
            | ESTIMATION '(' estimation_options_list ')' ';'
-             { driver.run_estimation(); }
+             { driver.run_estimation({}); }
            | ESTIMATION symbol_list ';'
-             { driver.run_estimation(); }
+             { driver.run_estimation($2); }
            | ESTIMATION '(' estimation_options_list ')' symbol_list ';'
-             { driver.run_estimation(); }
+             { driver.run_estimation($5); }
            ;
 
 estimation_options_list : estimation_options_list COMMA estimation_options
@@ -2426,7 +2318,7 @@ optim_weights_list : optim_weights_list symbol expression ';'
                      { driver.set_optim_weights($1, $3, $4); }
                    ;
 
-osr_params : OSR_PARAMS symbol_list ';' { driver.set_osr_params(); };
+osr_params : OSR_PARAMS symbol_list ';' { driver.set_osr_params($2); };
 
 
 osr_options_list : osr_options_list COMMA osr_options
@@ -2443,25 +2335,25 @@ osr_options : stoch_simul_primary_options
             ;
 
 osr : OSR ';'
-      { driver.run_osr(); }
+      { driver.run_osr({}); }
     | OSR '(' osr_options_list ')' ';'
-      { driver.run_osr(); }
+      { driver.run_osr({}); }
     | OSR symbol_list ';'
-      { driver.run_osr(); }
+      { driver.run_osr($2); }
     | OSR '(' osr_options_list ')' symbol_list ';'
-      {driver.run_osr(); }
+      {driver.run_osr($5); }
     ;
 
 dynatype : DYNATYPE '(' filename ')' ';'
-           { driver.run_dynatype($3); }
+           { driver.run_dynatype($3, {}); }
          | DYNATYPE '(' filename ')' symbol_list ';'
-           { driver.run_dynatype($3); }
+           { driver.run_dynatype($3, $5); }
          ;
 
 dynasave : DYNASAVE '(' filename ')' ';'
-           { driver.run_dynasave($3); }
+           { driver.run_dynasave($3, {}); }
          | DYNASAVE '(' filename ')' symbol_list ';'
-           { driver.run_dynasave($3); }
+           { driver.run_dynasave($3, $5); }
          ;
 
 load_params_and_steady_state : LOAD_PARAMS_AND_STEADY_STATE '(' filename ')' ';'
@@ -2569,13 +2461,13 @@ ramsey_model : RAMSEY_MODEL ';'
               ;
 
 ramsey_policy : RAMSEY_POLICY ';'
-                { driver.ramsey_policy(); }
+                { driver.ramsey_policy({}); }
               | RAMSEY_POLICY '(' ramsey_policy_options_list ')' ';'
-                { driver.ramsey_policy(); }
+                { driver.ramsey_policy({}); }
               | RAMSEY_POLICY symbol_list ';'
-                { driver.ramsey_policy(); }
+                { driver.ramsey_policy($2); }
               | RAMSEY_POLICY '(' ramsey_policy_options_list ')' symbol_list ';'
-                { driver.ramsey_policy(); }
+                { driver.ramsey_policy($5); }
               ;
 
 ramsey_constraints : RAMSEY_CONSTRAINTS ';' ramsey_constraints_list END ';'
@@ -2648,8 +2540,7 @@ occbin_solver : OCCBIN_SOLVER ';'
                 { driver.occbin_solver(); }
               | OCCBIN_SOLVER '(' occbin_solver_options_list ')' ';'
                 { driver.occbin_solver(); }
-              | OCCBIN_SOLVER '(' occbin_solver_options_list ')' symbol_list ';'
-                { driver.occbin_solver(); }
+              ;
 
 occbin_solver_options_list : occbin_solver_option COMMA occbin_solver_options_list
                            | occbin_solver_option
@@ -2679,13 +2570,13 @@ occbin_write_regimes_option : o_occbin_write_regimes_periods
                             ;
 
 occbin_graph : OCCBIN_GRAPH ';'
-               { driver.occbin_graph(); }
+               { driver.occbin_graph({}); }
              | OCCBIN_GRAPH '(' occbin_graph_options_list ')' ';'
-               { driver.occbin_graph(); }
+               { driver.occbin_graph({}); }
              | OCCBIN_GRAPH symbol_list ';'
-               { driver.occbin_graph(); }
+               { driver.occbin_graph($2); }
              | OCCBIN_GRAPH '(' occbin_graph_options_list ')' symbol_list ';'
-               { driver.occbin_graph(); }
+               { driver.occbin_graph($5); }
              ;
 
 occbin_graph_options_list : occbin_graph_option COMMA occbin_graph_options_list
@@ -2695,13 +2586,13 @@ occbin_graph_options_list : occbin_graph_option COMMA occbin_graph_options_list
 occbin_graph_option : o_occbin_graph_noconstant ;
 
 discretionary_policy : DISCRETIONARY_POLICY ';'
-                       { driver.discretionary_policy(); }
+                       { driver.discretionary_policy({}); }
                      | DISCRETIONARY_POLICY '(' discretionary_policy_options_list ')' ';'
-                       { driver.discretionary_policy(); }
+                       { driver.discretionary_policy({}); }
                      | DISCRETIONARY_POLICY symbol_list ';'
-                       { driver.discretionary_policy(); }
+                       { driver.discretionary_policy($2); }
                      | DISCRETIONARY_POLICY '(' discretionary_policy_options_list ')' symbol_list ';'
-                       { driver.discretionary_policy(); }
+                       { driver.discretionary_policy($5); }
                      ;
 
 discretionary_policy_options_list : discretionary_policy_options_list COMMA discretionary_policy_options
@@ -2754,49 +2645,49 @@ write_latex_steady_state_model : WRITE_LATEX_STEADY_STATE_MODEL ';'
                                ;
 
 shock_decomposition : SHOCK_DECOMPOSITION ';'
-                      {driver.shock_decomposition(); }
+                      { driver.shock_decomposition({}); }
                     | SHOCK_DECOMPOSITION '(' shock_decomposition_options_list ')' ';'
-                      { driver.shock_decomposition(); }
+                      { driver.shock_decomposition({}); }
                     | SHOCK_DECOMPOSITION symbol_list ';'
-                      { driver.shock_decomposition(); }
+                      { driver.shock_decomposition($2); }
                     | SHOCK_DECOMPOSITION '(' shock_decomposition_options_list ')' symbol_list ';'
-                      { driver.shock_decomposition(); }
+                      { driver.shock_decomposition($5); }
                     ;
 
 realtime_shock_decomposition : REALTIME_SHOCK_DECOMPOSITION ';'
-                               {driver.realtime_shock_decomposition(); }
+                               { driver.realtime_shock_decomposition({}); }
                              | REALTIME_SHOCK_DECOMPOSITION '(' realtime_shock_decomposition_options_list ')' ';'
-                               { driver.realtime_shock_decomposition(); }
+                               { driver.realtime_shock_decomposition({}); }
                              | REALTIME_SHOCK_DECOMPOSITION symbol_list ';'
-                               { driver.realtime_shock_decomposition(); }
+                               { driver.realtime_shock_decomposition($2); }
                              | REALTIME_SHOCK_DECOMPOSITION '(' realtime_shock_decomposition_options_list ')' symbol_list ';'
-                               { driver.realtime_shock_decomposition(); }
+                               { driver.realtime_shock_decomposition($5); }
                              ;
 
 plot_shock_decomposition : PLOT_SHOCK_DECOMPOSITION ';'
-                           {driver.plot_shock_decomposition(); }
+                           { driver.plot_shock_decomposition({}); }
                          | PLOT_SHOCK_DECOMPOSITION '(' plot_shock_decomposition_options_list ')' ';'
-                           { driver.plot_shock_decomposition(); }
+                           { driver.plot_shock_decomposition({}); }
                          | PLOT_SHOCK_DECOMPOSITION symbol_list ';'
-                           { driver.plot_shock_decomposition(); }
+                           { driver.plot_shock_decomposition($2); }
                          | PLOT_SHOCK_DECOMPOSITION '(' plot_shock_decomposition_options_list ')' symbol_list ';'
-                           { driver.plot_shock_decomposition(); }
+                           { driver.plot_shock_decomposition($5); }
                          ;
 
 initial_condition_decomposition : INITIAL_CONDITION_DECOMPOSITION ';'
-                                  {driver.initial_condition_decomposition(); }
+                                  { driver.initial_condition_decomposition({}); }
                                 | INITIAL_CONDITION_DECOMPOSITION '(' initial_condition_decomposition_options_list ')' ';'
-                                  { driver.initial_condition_decomposition(); }
+                                  { driver.initial_condition_decomposition({}); }
                                 | INITIAL_CONDITION_DECOMPOSITION symbol_list ';'
-                                  { driver.initial_condition_decomposition(); }
+                                  { driver.initial_condition_decomposition($2); }
                                 | INITIAL_CONDITION_DECOMPOSITION '(' initial_condition_decomposition_options_list ')' symbol_list ';'
-                                  { driver.initial_condition_decomposition(); }
+                                  { driver.initial_condition_decomposition($5); }
                                 ;
 
 squeeze_shock_decomposition : SQUEEZE_SHOCK_DECOMPOSITION ';'
-                              { driver.squeeze_shock_decomposition(); }
+                              { driver.squeeze_shock_decomposition({}); }
                             | SQUEEZE_SHOCK_DECOMPOSITION symbol_list ';'
-                              { driver.squeeze_shock_decomposition(); }
+                              { driver.squeeze_shock_decomposition($2); }
                             ;
 
 bvar_prior_option : o_bvar_prior_tau
@@ -2979,13 +2870,13 @@ ms_irf_options_list : ms_irf_option COMMA ms_irf_options_list
                     ;
 
 ms_irf : MS_IRF ';'
-         { driver.ms_irf(); }
+         { driver.ms_irf({}); }
        | MS_IRF '(' ms_irf_options_list ')' ';'
-         { driver.ms_irf(); }
+         { driver.ms_irf({}); }
        | MS_IRF symbol_list ';'
-         { driver.ms_irf(); }
+         { driver.ms_irf($2); }
        | MS_IRF '(' ms_irf_options_list ')' symbol_list ';'
-         { driver.ms_irf(); }
+         { driver.ms_irf($5); }
        ;
 
 ms_compute_probabilities_option : o_output_file_tag
@@ -3253,11 +3144,15 @@ homotopy_item : symbol COMMA expression COMMA expression ';'
                 { driver.homotopy_val($1, nullptr, $3);}
               ;
 
-forecast: FORECAST ';' {driver.forecast();}
-          | FORECAST '(' forecast_options ')' ';' {driver.forecast();}
-          | FORECAST symbol_list ';' {driver.forecast();}
-          | FORECAST '(' forecast_options ')' symbol_list ';' {driver.forecast();}
-          ;
+forecast: FORECAST ';'
+          { driver.forecast({}); }
+        | FORECAST '(' forecast_options ')' ';'
+          { driver.forecast({}); }
+        | FORECAST symbol_list ';'
+          { driver.forecast($2); }
+        | FORECAST '(' forecast_options ')' symbol_list ';'
+          { driver.forecast($5); }
+        ;
 
 forecast_options: forecast_option
           | forecast_options COMMA forecast_option
@@ -3286,9 +3181,9 @@ conditional_forecast_option : o_periods
                             ;
 
 plot_conditional_forecast : PLOT_CONDITIONAL_FORECAST symbol_list ';'
-                            { driver.plot_conditional_forecast(); }
+                            { driver.plot_conditional_forecast("", $2); }
                           | PLOT_CONDITIONAL_FORECAST '(' PERIODS EQUAL INT_NUMBER ')' symbol_list ';'
-                            { driver.plot_conditional_forecast($5); }
+                            { driver.plot_conditional_forecast($5, $7); }
                           ;
 
 conditional_forecast_paths : CONDITIONAL_FORECAST_PATHS ';' conditional_forecast_paths_shock_list END ';'
@@ -3314,17 +3209,17 @@ steady_state_equation_list : steady_state_equation_list steady_state_equation
 steady_state_equation : symbol EQUAL expression ';'
                         { driver.add_steady_state_model_equal($1, $3); }
                       | '[' symbol_list ']' EQUAL expression ';'
-                        { driver.add_steady_state_model_equal_multiple($5); }
+                        { driver.add_steady_state_model_equal_multiple($2, $5); }
                       ;
 
 calib_smoother : CALIB_SMOOTHER ';'
-                 { driver.calib_smoother(); }
+                 { driver.calib_smoother({}); }
                | CALIB_SMOOTHER '(' calib_smoother_options_list ')' ';'
-                 { driver.calib_smoother(); }
+                 { driver.calib_smoother({}); }
                | CALIB_SMOOTHER symbol_list ';'
-                 { driver.calib_smoother(); }
+                 { driver.calib_smoother($2); }
                | CALIB_SMOOTHER '(' calib_smoother_options_list ')' symbol_list ';'
-                 { driver.calib_smoother(); }
+                 { driver.calib_smoother($5); }
                ;
 
 calib_smoother_options_list : calib_smoother_option COMMA calib_smoother_options_list
@@ -3520,7 +3415,7 @@ o_nocorr : NOCORR { driver.option_num("nocorr", "true"); };
 o_nofunctions : NOFUNCTIONS { driver.option_num("nofunctions", "true"); };
 o_nomoments : NOMOMENTS { driver.option_num("nomoments", "true"); };
 o_irf : IRF EQUAL INT_NUMBER { driver.option_num("irf", $3); };
-o_irf_shocks : IRF_SHOCKS EQUAL '(' symbol_list ')' { driver.option_symbol_list("irf_shocks"); };
+o_irf_shocks : IRF_SHOCKS EQUAL '(' symbol_list ')' { driver.option_symbol_list("irf_shocks", $4); };
 o_hp_filter : HP_FILTER EQUAL non_negative_number { driver.option_num("hp_filter", $3); };
 o_hp_ngrid : HP_NGRID EQUAL INT_NUMBER {
                                          driver.warning("The 'hp_ngrid' option is deprecated. It has been superseded by the 'filtered_theoretical_moments_grid' option.");
@@ -3872,12 +3767,12 @@ o_gsa_logtrans_redform : LOGTRANS_REDFORM EQUAL INT_NUMBER { driver.option_num("
 o_gsa_threshold_redform : THRESHOLD_REDFORM EQUAL vec_value_w_inf { driver.option_num("threshold_redform",$3); };
 o_gsa_ksstat_redform : KSSTAT_REDFORM EQUAL non_negative_number { driver.option_num("ksstat_redform", $3); };
 o_gsa_alpha2_redform : ALPHA2_REDFORM EQUAL non_negative_number { driver.option_num("alpha2_redform", $3); };
-o_gsa_namendo : NAMENDO EQUAL '(' symbol_list_ext ')' { driver.option_symbol_list("namendo"); };
-o_gsa_namlagendo : NAMLAGENDO EQUAL '(' symbol_list_ext ')' { driver.option_symbol_list("namlagendo"); };
-o_gsa_namexo : NAMEXO EQUAL '(' symbol_list_ext ')' { driver.option_symbol_list("namexo"); };
+o_gsa_namendo : NAMENDO EQUAL '(' symbol_list_or_wildcard ')' { driver.option_symbol_list("namendo", $4); };
+o_gsa_namlagendo : NAMLAGENDO EQUAL '(' symbol_list_or_wildcard ')' { driver.option_symbol_list("namlagendo", $4); };
+o_gsa_namexo : NAMEXO EQUAL '(' symbol_list_or_wildcard ')' { driver.option_symbol_list("namexo", $4); };
 o_gsa_rmse : RMSE EQUAL INT_NUMBER { driver.option_num("rmse", $3); };
 o_gsa_lik_only : LIK_ONLY EQUAL INT_NUMBER { driver.option_num("lik_only", $3); };
-o_gsa_var_rmse : VAR_RMSE EQUAL '(' symbol_list_ext ')' { driver.option_symbol_list("var_rmse"); };
+o_gsa_var_rmse : VAR_RMSE EQUAL '(' symbol_list_or_wildcard ')' { driver.option_symbol_list("var_rmse", $4); };
 o_gsa_pfilt_rmse : PFILT_RMSE EQUAL non_negative_number { driver.option_num("pfilt_rmse", $3); };
 o_gsa_istart_rmse : ISTART_RMSE EQUAL INT_NUMBER { driver.option_num("istart_rmse", $3); };
 o_gsa_alpha_rmse : ALPHA_RMSE EQUAL non_negative_number { driver.option_num("alpha_rmse", $3); };
@@ -3901,7 +3796,7 @@ o_homotopy_steps : HOMOTOPY_STEPS EQUAL INT_NUMBER {driver.option_num("homotopy_
 o_homotopy_force_continue: HOMOTOPY_FORCE_CONTINUE EQUAL INT_NUMBER { driver.option_num("homotopy_force_continue",$3); };
 o_nocheck : NOCHECK {driver.option_num("steadystate.nocheck","true"); };
 
-o_controlled_varexo : CONTROLLED_VAREXO EQUAL '(' symbol_list ')' { driver.option_symbol_list("controlled_varexo"); };
+o_controlled_varexo : CONTROLLED_VAREXO EQUAL '(' symbol_list ')' { driver.option_symbol_list("controlled_varexo", $4); };
 o_parameter_set : PARAMETER_SET EQUAL PRIOR_MODE
                   { driver.option_str("parameter_set", "prior_mode"); }
                 | PARAMETER_SET EQUAL PRIOR_MEAN
@@ -3934,7 +3829,7 @@ o_final_year : FINAL_YEAR EQUAL INT_NUMBER {driver.option_num("ms.final_year",$3
 o_final_subperiod : FINAL_SUBPERIOD EQUAL INT_NUMBER {driver.option_num("ms.final_subperiod",$3); };
 o_data : DATA EQUAL filename { driver.option_str("ms.data", $3); };
 o_vlist : VLIST EQUAL INT_NUMBER {driver.option_num("ms.vlist",$3); };
-o_vlistlog : VLISTLOG EQUAL '(' symbol_list ')' {driver.option_symbol_list("ms.vlistlog"); };
+o_vlistlog : VLISTLOG EQUAL '(' symbol_list ')' {driver.option_symbol_list("ms.vlistlog", $4); };
 o_vlistper : VLISTPER EQUAL INT_NUMBER {driver.option_num("ms.vlistper",$3); };
 o_restriction_fname : RESTRICTION_FNAME EQUAL NAME
                       {
@@ -4005,7 +3900,7 @@ o_duration : DURATION EQUAL non_negative_number
            ;
 o_number_of_regimes : NUMBER_OF_REGIMES EQUAL INT_NUMBER { driver.option_num("ms.number_of_regimes",$3); };
 o_number_of_lags : NUMBER_OF_LAGS EQUAL INT_NUMBER { driver.option_num("ms.number_of_lags",$3); };
-o_parameters : PARAMETERS EQUAL '[' symbol_list ']' { driver.option_symbol_list("ms.parameters"); };
+o_parameters : PARAMETERS EQUAL '[' symbol_list ']' { driver.option_symbol_list("ms.parameters", $4); };
 o_coefficients : COEFFICIENTS { driver.option_str("ms.coefficients","svar_coefficients"); };
 o_variances : VARIANCES { driver.option_str("ms.variances","svar_variances"); };
 o_equations : EQUATIONS EQUAL vec_int
@@ -4014,7 +3909,7 @@ o_equations : EQUATIONS EQUAL vec_int
               { driver.option_vec_int("ms.equations",$3); }
             ;
 o_silent_optimizer : SILENT_OPTIMIZER { driver.option_num("silent_optimizer", "true"); };
-o_instruments : INSTRUMENTS EQUAL '(' symbol_list ')' {driver.option_symbol_list("instruments"); };
+o_instruments : INSTRUMENTS EQUAL '(' symbol_list ')' {driver.option_symbol_list("instruments", $4); };
 
 o_ext_func_name : EXT_FUNC_NAME EQUAL namespace_qualified_filename { driver.external_function_option("name", $3); };
 o_ext_func_nargs : EXT_FUNC_NARGS EQUAL INT_NUMBER { driver.external_function_option("nargs",$3); };
@@ -4130,10 +4025,10 @@ o_consider_only_observed : CONSIDER_ONLY_OBSERVED { driver.option_str("endo_vars
 o_no_homotopy : NO_HOMOTOPY { driver.option_num("no_homotopy", "true"); };
 
 o_infile : INFILE EQUAL filename { driver.option_str("infile", $3); };
-o_invars : INVARS EQUAL '(' symbol_list ')' { driver.option_symbol_list("invars"); };
+o_invars : INVARS EQUAL '(' symbol_list ')' { driver.option_symbol_list("invars", $4); };
 o_period : PERIOD EQUAL INT_NUMBER { driver.option_num("period", $3); };
 o_outfile : OUTFILE EQUAL filename { driver.option_str("outfile", $3); };
-o_outvars : OUTVARS EQUAL '(' symbol_list ')' { driver.option_symbol_list("outvars"); };
+o_outvars : OUTVARS EQUAL '(' symbol_list ')' { driver.option_symbol_list("outvars", $4); };
 o_lmmcp : LMMCP {driver.option_num("lmmcp.status", "true"); };
 o_function : FUNCTION EQUAL filename { driver.option_str("function", $3); };
 o_sampling_draws : SAMPLING_DRAWS EQUAL INT_NUMBER { driver.option_num("sampling_draws",$3); };
diff --git a/src/ModelEquationBlock.cc b/src/ModelEquationBlock.cc
index ecd0042dda699445f61eed4aefa77671e7eb37de..ad5a52b22830f626fd829411808f31b270f14293 100644
--- a/src/ModelEquationBlock.cc
+++ b/src/ModelEquationBlock.cc
@@ -492,8 +492,8 @@ Epilogue::writeOutput(ostream &output) const
   for (const auto & [symb_id, expr] : dynamic_def_table)
     expr->collectVariables(SymbolType::endogenous, endogs);
 
-  SymbolList symbol_list;
+  vector<string> symbol_list;
   for (auto symb_id : endogs)
-    symbol_list.addSymbol(symbol_table.getName(symb_id));
-  symbol_list.writeOutput("M_.epilogue_var_list_", output);
+    symbol_list.push_back(symbol_table.getName(symb_id));
+  SymbolList{move(symbol_list)}.writeOutput("M_.epilogue_var_list_", output);
 }
diff --git a/src/ParsingDriver.cc b/src/ParsingDriver.cc
index 48b200ec85f57dadf0c9ff0bf05b1c7389ad55c6..80c776e016e836b02d28108a623199736aaa402a 100644
--- a/src/ParsingDriver.cc
+++ b/src/ParsingDriver.cc
@@ -91,8 +91,6 @@ ParsingDriver::parse(istream &in, bool debug)
 {
   mod_file = make_unique<ModFile>(warnings);
 
-  symbol_list.setSymbolTable(mod_file->symbol_table);
-
   reset_data_tree();
   estim_params.init(*data_tree);
   osr_params.init(*data_tree);
@@ -201,6 +199,13 @@ ParsingDriver::declare_endogenous(const string &name, const string &tex_name, co
   declare_symbol(name, SymbolType::endogenous, tex_name, partition_value);
 }
 
+void
+ParsingDriver::var(const vector<tuple<string, string, vector<pair<string, string>>>> &symbol_list)
+{
+  for (auto &[name, tex_name, partition] : symbol_list)
+    declare_endogenous(name, tex_name, partition);
+}
+
 void
 ParsingDriver::declare_exogenous(const string &name, const string &tex_name, const vector<pair<string, string>> &partition_value)
 {
@@ -208,9 +213,17 @@ ParsingDriver::declare_exogenous(const string &name, const string &tex_name, con
 }
 
 void
-ParsingDriver::declare_exogenous_det(const string &name, const string &tex_name, const vector<pair<string, string>> &partition_value)
+ParsingDriver::varexo(const vector<tuple<string, string, vector<pair<string, string>>>> &symbol_list)
+{
+  for (auto &[name, tex_name, partition] : symbol_list)
+    declare_exogenous(name, tex_name, partition);
+}
+
+void
+ParsingDriver::varexo_det(const vector<tuple<string, string, vector<pair<string, string>>>> &symbol_list)
 {
-  declare_symbol(name, SymbolType::exogenousDet, tex_name, partition_value);
+  for (auto &[name, tex_name, partition] : symbol_list)
+    declare_symbol(name, SymbolType::exogenousDet, tex_name, partition);
 }
 
 void
@@ -219,6 +232,13 @@ ParsingDriver::declare_parameter(const string &name, const string &tex_name, con
   declare_symbol(name, SymbolType::parameter, tex_name, partition_value);
 }
 
+void
+ParsingDriver::parameters(const vector<tuple<string, string, vector<pair<string, string>>>> &symbol_list)
+{
+  for (auto &[name, tex_name, partition] : symbol_list)
+    declare_parameter(name, tex_name, partition);
+}
+
 void
 ParsingDriver::declare_statement_local_variable(const string &name)
 {
@@ -247,15 +267,15 @@ ParsingDriver::begin_trend()
 }
 
 void
-ParsingDriver::declare_trend_var(bool log_trend, const string &name, const string &tex_name)
+ParsingDriver::end_trend_var(bool log_trend, expr_t growth_factor, const vector<pair<string, string>> &symbol_list)
 {
-  declare_symbol(name, log_trend ? SymbolType::logTrend : SymbolType::trend, tex_name, {});
-  declared_trend_vars.push_back(mod_file->symbol_table.getID(name));
-}
+  vector<int> declared_trend_vars;
+  for (auto &[name, tex_name] : symbol_list)
+    {
+      declare_symbol(name, log_trend ? SymbolType::logTrend : SymbolType::trend, tex_name, {});
+      declared_trend_vars.push_back(mod_file->symbol_table.getID(name));
+    }
 
-void
-ParsingDriver::end_trend_var(expr_t growth_factor)
-{
   try
     {
       dynamic_model->addTrendVariables(declared_trend_vars, growth_factor);
@@ -269,11 +289,14 @@ ParsingDriver::end_trend_var(expr_t growth_factor)
 }
 
 void
-ParsingDriver::add_predetermined_variable(const string &name)
+ParsingDriver::predetermined_variables(const vector<string> &symbol_list)
 {
-  check_symbol_is_endogenous(name);
-  int symb_id = mod_file->symbol_table.getID(name);
-  mod_file->symbol_table.markPredetermined(symb_id);
+  for (auto &name : symbol_list)
+    {
+      check_symbol_is_endogenous(name);
+      int symb_id = mod_file->symbol_table.getID(name);
+      mod_file->symbol_table.markPredetermined(symb_id);
+    }
 }
 
 void
@@ -449,17 +472,17 @@ ParsingDriver::add_expression_variable(const string &name)
 }
 
 void
-ParsingDriver::declare_nonstationary_var(const string &name, const string &tex_name, const vector<pair<string, string>> &partition_value)
+ParsingDriver::end_nonstationary_var(bool log_deflator, expr_t deflator, const vector<tuple<string, string, vector<pair<string, string>>>> &symbol_list)
 {
-  declare_endogenous(name, tex_name, partition_value);
-
-  declared_nonstationary_vars.push_back(mod_file->symbol_table.getID(name));
   mod_file->nonstationary_variables = true;
-}
 
-void
-ParsingDriver::end_nonstationary_var(bool log_deflator, expr_t deflator)
-{
+  vector<int> declared_nonstationary_vars;
+  for (auto &[name, tex_name, partition] : symbol_list)
+    {
+      declare_endogenous(name, tex_name, partition);
+      declared_nonstationary_vars.push_back(mod_file->symbol_table.getID(name));
+    }
+
   try
     {
       dynamic_model->addNonstationaryVariables(declared_nonstationary_vars, log_deflator, deflator);
@@ -608,10 +631,10 @@ ParsingDriver::add_generate_irfs_exog_element(string exo, const string &value)
 }
 
 void
-ParsingDriver::forecast()
+ParsingDriver::forecast(vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<ForecastStatement>(symbol_list, options_list));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<ForecastStatement>(move(symbol_list), options_list,
+                                                        mod_file->symbol_table));
   options_list.clear();
 }
 
@@ -646,13 +669,12 @@ ParsingDriver::differentiate_forward_vars_all()
 }
 
 void
-ParsingDriver::differentiate_forward_vars_some()
+ParsingDriver::differentiate_forward_vars_some(vector<string> symbol_list)
 {
   mod_file->differentiate_forward_vars = true;
-  mod_file->differentiate_forward_vars_subset = symbol_list.get_symbols();
+  mod_file->differentiate_forward_vars_subset = move(symbol_list);
   for (auto &it : mod_file->differentiate_forward_vars_subset)
     check_symbol_is_endogenous(it);
-  symbol_list.clear();
 }
 
 void
@@ -989,7 +1011,6 @@ ParsingDriver::end_svar_identification()
                                                                   svar_lower_cholesky,
                                                                   svar_constants_exclusion,
                                                                   mod_file->symbol_table));
-  svar_restriction_symbols.clear();
   svar_equation_restrictions.clear();
   svar_ident_restrictions.clear();
   svar_Qi_restriction_nbr.clear();
@@ -1026,7 +1047,7 @@ ParsingDriver::combine_lag_and_restriction(const string &lag)
 }
 
 void
-ParsingDriver::add_restriction_in_equation(const string &equation)
+ParsingDriver::add_restriction_in_equation(const string &equation, const vector<string> &symbol_list)
 {
   int eqn = stoi(equation);
   if (eqn < 1)
@@ -1035,22 +1056,19 @@ ParsingDriver::add_restriction_in_equation(const string &equation)
   if (svar_equation_restrictions.count(eqn) > 0)
     error("equation number " + equation + " referenced more than once under a single lag.");
 
-  svar_equation_restrictions[eqn] = svar_restriction_symbols;
-
-  svar_restriction_symbols.clear();
-}
-
-void
-ParsingDriver::add_in_svar_restriction_symbols(const string &tmp_var)
-{
-  check_symbol_existence(tmp_var);
-  int symb_id = mod_file->symbol_table.getID(tmp_var);
+  vector<int> svar_restriction_symbols;
+  for (auto &name : symbol_list)
+    {
+      check_symbol_existence(name);
+      int symb_id = mod_file->symbol_table.getID(name);
 
-  for (const auto &viit : svar_restriction_symbols)
-    if (symb_id == viit)
-      error(tmp_var + " restriction added twice.");
+      for (const auto &viit : svar_restriction_symbols)
+        if (symb_id == viit)
+          error(name + " restriction added twice.");
 
-  svar_restriction_symbols.push_back(symb_id);
+      svar_restriction_symbols.push_back(symb_id);
+    }
+  svar_equation_restrictions[eqn] = svar_restriction_symbols;
 }
 
 void
@@ -1274,7 +1292,7 @@ ParsingDriver::option_date(string name_option, string opt)
 }
 
 void
-ParsingDriver::option_symbol_list(string name_option)
+ParsingDriver::option_symbol_list(string name_option, vector<string> symbol_list)
 {
   if (options_list.symbol_list_options.find(name_option)
       != options_list.symbol_list_options.end())
@@ -1282,8 +1300,7 @@ ParsingDriver::option_symbol_list(string name_option)
 
   if (name_option.compare("irf_shocks") == 0)
     {
-      vector<string> shocks = symbol_list.get_symbols();
-      for (auto &shock : shocks)
+      for (auto &shock : symbol_list)
         {
           if (!mod_file->symbol_table.exists(shock))
             error("Unknown symbol: " + shock);
@@ -1294,14 +1311,12 @@ ParsingDriver::option_symbol_list(string name_option)
 
   if (name_option.compare("ms.parameters") == 0)
     {
-      vector<string> parameters = symbol_list.get_symbols();
-      for (auto &it : parameters)
+      for (auto &it : symbol_list)
         if (mod_file->symbol_table.getType(it) != SymbolType::parameter)
           error("Variables passed to the parameters option of the markov_switching statement must be parameters. Caused by: " + it);
     }
 
-  options_list.symbol_list_options[move(name_option)] = symbol_list;
-  symbol_list.clear();
+  options_list.symbol_list_options[move(name_option)] = move(symbol_list);
 }
 
 void
@@ -1350,27 +1365,22 @@ ParsingDriver::linear()
 }
 
 void
-ParsingDriver::add_in_symbol_list(const string &tmp_var)
+ParsingDriver::rplot(vector<string> symbol_list)
 {
-  symbol_list.addSymbol(tmp_var);
+  mod_file->addStatement(make_unique<RplotStatement>(move(symbol_list), mod_file->symbol_table));
 }
 
 void
-ParsingDriver::rplot()
-{
-  mod_file->addStatement(make_unique<RplotStatement>(symbol_list));
-  symbol_list.clear();
-}
-
-void
-ParsingDriver::stoch_simul()
+ParsingDriver::stoch_simul(SymbolList symbol_list)
 {
   //make sure default order is known to preprocessor, see #49
   if (options_list.num_options.find("order") == options_list.num_options.end())
     options_list.num_options["order"] = "2";
 
-  mod_file->addStatement(make_unique<StochSimulStatement>(symbol_list, options_list));
-  symbol_list.clear();
+  symbol_list.removeDuplicates("stoch_simul", warnings);
+
+  mod_file->addStatement(make_unique<StochSimulStatement>(move(symbol_list), options_list,
+                                                          mod_file->symbol_table));
   options_list.clear();
 }
 
@@ -1519,7 +1529,6 @@ ParsingDriver::set_unit_root_vars()
 {
   mod_file->addStatement(make_unique<UnitRootVarsStatement>());
   warning("''unit_root_vars'' is now obsolete; use the ''diffuse_filter'' option of ''estimation'' instead");
-  symbol_list.clear();
 }
 
 void
@@ -1817,10 +1826,9 @@ ParsingDriver::set_corr_options(const string &name1, const string &name2, const
 }
 
 void
-ParsingDriver::run_estimation()
+ParsingDriver::run_estimation(vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<EstimationStatement>(mod_file->symbol_table, symbol_list, options_list));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<EstimationStatement>(mod_file->symbol_table, move(symbol_list), options_list));
   options_list.clear();
 }
 
@@ -1951,32 +1959,31 @@ ParsingDriver::optim_weights()
 }
 
 void
-ParsingDriver::set_osr_params()
+ParsingDriver::set_osr_params(vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<OsrParamsStatement>(symbol_list, mod_file->symbol_table));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<OsrParamsStatement>(move(symbol_list), mod_file->symbol_table));
 }
 
 void
-ParsingDriver::run_osr()
+ParsingDriver::run_osr(vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<OsrStatement>(symbol_list, options_list));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<OsrStatement>(move(symbol_list), options_list,
+                                                   mod_file->symbol_table));
   options_list.clear();
 }
 
 void
-ParsingDriver::run_dynatype(const string &filename)
+ParsingDriver::run_dynatype(const string &filename, vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<DynaTypeStatement>(symbol_list, filename));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<DynaTypeStatement>(move(symbol_list), filename,
+                                                        mod_file->symbol_table));
 }
 
 void
-ParsingDriver::run_dynasave(const string &filename)
+ParsingDriver::run_dynasave(const string &filename, vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<DynaSaveStatement>(symbol_list, filename));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<DynaSaveStatement>(move(symbol_list), filename,
+                                                        mod_file->symbol_table));
 }
 
 void
@@ -2084,7 +2091,7 @@ ParsingDriver::ramsey_model()
 }
 
 void
-ParsingDriver::ramsey_policy()
+ParsingDriver::ramsey_policy(vector<string> symbol_list)
 {
   warning("The 'ramsey_policy' statement is deprecated. Please use 'ramsey_model', 'stoch_simul', and 'evaluate_planner_objective' instead.");
 
@@ -2111,9 +2118,9 @@ ParsingDriver::ramsey_policy()
     for (const auto &s : it->second.getSymbols())
       check_symbol_is_endogenous(s);
 
-  mod_file->addStatement(make_unique<RamseyPolicyStatement>(symbol_list, options_list));
+  mod_file->addStatement(make_unique<RamseyPolicyStatement>(move(symbol_list), options_list,
+                                                            mod_file->symbol_table));
   options_list.clear();
-  symbol_list.clear();
   planner_discount = nullptr;
 }
 
@@ -2146,15 +2153,14 @@ ParsingDriver::occbin_write_regimes()
 }
 
 void
-ParsingDriver::occbin_graph()
+ParsingDriver::occbin_graph(vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<OccbinGraphStatement>(symbol_list, options_list));
+  mod_file->addStatement(make_unique<OccbinGraphStatement>(move(symbol_list), options_list));
   options_list.clear();
-  symbol_list.clear();
 }
 
 void
-ParsingDriver::discretionary_policy()
+ParsingDriver::discretionary_policy(vector<string> symbol_list)
 {
   /* The logic here is different from “ramsey_policy” and “ramsey_model”,
      because we want to allow several instances of “discretionary_policy” in
@@ -2172,8 +2178,8 @@ ParsingDriver::discretionary_policy()
     for (const auto &s : it->second.getSymbols())
       check_symbol_is_endogenous(s);
 
-  mod_file->addStatement(make_unique<DiscretionaryPolicyStatement>(symbol_list, options_list));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<DiscretionaryPolicyStatement>(move(symbol_list), options_list,
+                                                                   mod_file->symbol_table));
   options_list.clear();
   planner_discount = nullptr;
 }
@@ -2252,10 +2258,10 @@ ParsingDriver::ms_compute_probabilities()
 }
 
 void
-ParsingDriver::ms_irf()
+ParsingDriver::ms_irf(vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<MSSBVARIrfStatement>(symbol_list, options_list));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<MSSBVARIrfStatement>(move(symbol_list), options_list,
+                                                          mod_file->symbol_table));
   options_list.clear();
 }
 
@@ -2332,42 +2338,44 @@ ParsingDriver::markov_switching()
 }
 
 void
-ParsingDriver::shock_decomposition()
+ParsingDriver::shock_decomposition(vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<ShockDecompositionStatement>(symbol_list, options_list));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<ShockDecompositionStatement>(move(symbol_list), options_list,
+                                                                  mod_file->symbol_table));
   options_list.clear();
 }
 
 void
-ParsingDriver::realtime_shock_decomposition()
+ParsingDriver::realtime_shock_decomposition(vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<RealtimeShockDecompositionStatement>(symbol_list, options_list));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<RealtimeShockDecompositionStatement>(move(symbol_list),
+                                                                          options_list,
+                                                                          mod_file->symbol_table));
   options_list.clear();
 }
 
 void
-ParsingDriver::plot_shock_decomposition()
+ParsingDriver::plot_shock_decomposition(vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<PlotShockDecompositionStatement>(symbol_list, options_list));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<PlotShockDecompositionStatement>(move(symbol_list), options_list,
+                                                                      mod_file->symbol_table));
   options_list.clear();
 }
 
 void
-ParsingDriver::initial_condition_decomposition()
+ParsingDriver::initial_condition_decomposition(vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<InitialConditionDecompositionStatement>(symbol_list, options_list));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<InitialConditionDecompositionStatement>(move(symbol_list),
+                                                                             options_list,
+                                                                             mod_file->symbol_table));
   options_list.clear();
 }
 
 void
-ParsingDriver::squeeze_shock_decomposition()
+ParsingDriver::squeeze_shock_decomposition(vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<SqueezeShockDecompositionStatement>(symbol_list));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<SqueezeShockDecompositionStatement>(move(symbol_list),
+                                                                         mod_file->symbol_table));
 }
 
 void
@@ -2378,11 +2386,11 @@ ParsingDriver::conditional_forecast()
 }
 
 void
-ParsingDriver::plot_conditional_forecast(const string &periods)
+ParsingDriver::plot_conditional_forecast(const string &periods, vector<string> symbol_list)
 {
   int nperiods = periods.empty() ? -1 : stoi(periods);
-  mod_file->addStatement(make_unique<PlotConditionalForecastStatement>(nperiods, symbol_list));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<PlotConditionalForecastStatement>(nperiods, move(symbol_list),
+                                                                       mod_file->symbol_table));
 }
 
 void
@@ -2393,10 +2401,10 @@ ParsingDriver::conditional_forecast_paths()
 }
 
 void
-ParsingDriver::calib_smoother()
+ParsingDriver::calib_smoother(vector<string> symbol_list)
 {
-  mod_file->addStatement(make_unique<CalibSmootherStatement>(symbol_list, options_list));
-  symbol_list.clear();
+  mod_file->addStatement(make_unique<CalibSmootherStatement>(move(symbol_list), options_list,
+                                                             mod_file->symbol_table));
   options_list.clear();
 }
 
@@ -2465,9 +2473,10 @@ ParsingDriver::add_model_equal_with_zero_rhs(expr_t arg)
 }
 
 void
-ParsingDriver::declare_model_local_variable(const string &name, const string &tex_name)
+ParsingDriver::model_local_variable(const vector<pair<string, string>> &symbol_list)
 {
-  declare_symbol(name, SymbolType::modelLocalVariable, tex_name, {});
+  for (auto &[name, tex_name] : symbol_list)
+    declare_symbol(name, SymbolType::modelLocalVariable, tex_name, {});
 }
 
 void
@@ -2499,9 +2508,9 @@ ParsingDriver::declare_and_init_model_local_variable(const string &name, expr_t
 }
 
 void
-ParsingDriver::change_type(SymbolType new_type, const vector<string> &var_list)
+ParsingDriver::change_type(SymbolType new_type, const vector<string> &symbol_list)
 {
-  for (auto &it : var_list)
+  for (auto &it : symbol_list)
     {
       int id;
       try
@@ -3147,12 +3156,11 @@ ParsingDriver::add_steady_state_model_equal(const string &varname, expr_t expr)
 }
 
 void
-ParsingDriver::add_steady_state_model_equal_multiple(expr_t expr)
+ParsingDriver::add_steady_state_model_equal_multiple(const vector<string> &symbol_list, expr_t expr)
 {
-  const vector<string> &symbs = symbol_list.get_symbols();
   vector<int> ids;
 
-  for (const auto &symb : symbs)
+  for (const auto &symb : symbol_list)
     {
       int id;
       try
@@ -3171,14 +3179,12 @@ ParsingDriver::add_steady_state_model_equal_multiple(expr_t expr)
     }
 
   mod_file->steady_state_model.addMultipleDefinitions(ids, expr);
-
-  symbol_list.clear();
 }
 
 void
-ParsingDriver::add_graph_format(const string &name)
+ParsingDriver::add_graph_format(string name)
 {
-  graph_formats.addSymbol(name);
+  graph_formats.emplace_back(move(name));
 }
 
 void
@@ -3640,15 +3646,14 @@ ParsingDriver::begin_model_replace(const vector<pair<string, string>> &listed_eq
 }
 
 void
-ParsingDriver::var_remove()
+ParsingDriver::var_remove(const vector<string> &symbol_list)
 {
-  for (const auto &name : symbol_list.getSymbols())
+  for (const auto &name : symbol_list)
     {
       check_symbol_existence(name);
       int symb_id = mod_file->symbol_table.getID(name);
       mod_file->symbol_table.changeType(symb_id, SymbolType::excludedVariable);
     }
-  symbol_list.clear();
 }
 
 void
diff --git a/src/ParsingDriver.hh b/src/ParsingDriver.hh
index f43d8fcc91e7bb61b25e274b575c8304aee2205f..b3fc892d05d96ffa3cbb144c0b5c4da870c96524 100644
--- a/src/ParsingDriver.hh
+++ b/src/ParsingDriver.hh
@@ -111,9 +111,6 @@ private:
   //! Helper to add a symbol declaration
   void declare_symbol(const string &name, SymbolType type, const string &tex_name, const vector<pair<string, string>> &partition_value);
 
-  //! Stores temporary symbol table
-  SymbolList symbol_list;
-
   //! Temporary store for the planner objective
   unique_ptr<StaticModel> planner_objective;
 
@@ -185,8 +182,6 @@ private:
   SvarIdentificationStatement::svar_identification_restrictions_t svar_ident_restrictions;
   //! Temporary storage for mapping the equation number to the restrictions within an svar_identification block
   map<int, vector<int>> svar_equation_restrictions;
-  //! Temporary storage for restrictions in an equation within an svar_identification block
-  vector<int> svar_restriction_symbols;
   //! Temporary storage for constants exculsion within an svar_identification
   bool svar_constants_exclusion;
   //! Temporary storage for upper cholesky within an svar_identification block
@@ -222,10 +217,6 @@ private:
   int current_external_function_id;
   //! Temporary storage for option list provided to external_function()
   ExternalFunctionsTable::external_function_options current_external_function_options;
-  //! Temporary storage for declaring trend variables
-  vector<int> declared_trend_vars;
-  //! Temporary storage for declaring nonstationary variables
-  vector<int> declared_nonstationary_vars;
   //! Temporary storage for a variance declared in the prior statement
   expr_t prior_variance;
   SubsamplesStatement::subsample_declaration_map_t subsample_declaration_map;
@@ -246,7 +237,7 @@ private:
   //! Adds a model lagged variable to ModelTree and VariableTable
   expr_t add_model_variable(int symb_id, int lag);
   //! For parsing the graph_format option
-  SymbolList graph_formats;
+  vector<string> graph_formats;
   //! Temporary storage for equation tags
   map<string, string> eq_tags;
   // Temporary storages for pac_target_info
@@ -342,7 +333,7 @@ public:
   //! the differentiate_forward_vars option is enabled (for all vars)
   void differentiate_forward_vars_all();
   //! the differentiate_forward_vars option is enabled (for a subset of vars)
-  void differentiate_forward_vars_some();
+  void differentiate_forward_vars_some(vector<string> symbol_list);
   //! cutoff option of model block
   void cutoff(const string &value);
   //! mfs option of model block
@@ -363,14 +354,20 @@ public:
   void initval_file();
   //! Declares an endogenous variable
   void declare_endogenous(const string &name, const string &tex_name = "", const vector<pair<string, string>> &partition_value = {});
+  // Handles a “var” statement (without “deflator” or “log_deflator” options)
+  void var(const vector<tuple<string, string, vector<pair<string, string>>>> &symbol_list);
   //! Declares an exogenous variable
   void declare_exogenous(const string &name, const string &tex_name = "", const vector<pair<string, string>> &partition_value = {});
-  //! Declares an exogenous deterministic variable
-  void declare_exogenous_det(const string &name, const string &tex_name = "", const vector<pair<string, string>> &partition_value = {});
+  // Handles a “varexo” statement
+  void varexo(const vector<tuple<string, string, vector<pair<string, string>>>> &symbol_list);
+  // Handles a “varexo_det” statement
+  void varexo_det(const vector<tuple<string, string, vector<pair<string, string>>>> &symbol_list);
   //! Declares a parameter
   void declare_parameter(const string &name, const string &tex_name = "", const vector<pair<string, string>> &partition_value = {});
-  //! Declares a model local variable
-  void declare_model_local_variable(const string &name, const string &tex_name = "");
+  // Handles a “parameters” statement
+  void parameters(const vector<tuple<string, string, vector<pair<string, string>>>> &symbol_list);
+  // Handles a “model_local_variable” statement
+  void model_local_variable(const vector<pair<string, string>> &symbol_list);
   //! Declares a statement local variable
   void declare_statement_local_variable(const string &name);
   //! Completes a subsample statement
@@ -386,12 +383,12 @@ public:
   void set_planner_discount(expr_t value);
   //! Sets the value of the planner_discount_latex_name option of ramsey_model
   void set_planner_discount_latex_name(string tex_name);
-  //! Adds a predetermined_variable
-  void add_predetermined_variable(const string &name);
+  //! Handles a “predetermined_variables” statement
+  void predetermined_variables(const vector<string> &symbol_list);
   //! Declares and initializes a local parameter
   void declare_and_init_model_local_variable(const string &name, expr_t rhs);
   //! Changes type of a symbol
-  void change_type(SymbolType new_type, const vector<string> &var_list);
+  void change_type(SymbolType new_type, const vector<string> &symbol_list);
   //! Adds a list of tags for the current equation
   void add_equation_tags(string key, string value);
   //! Adds a non-negative constant to DataTree
@@ -490,8 +487,8 @@ public:
   void option_str(string name_option, string opt);
   //! Sets an option to a date value
   void option_date(string name_option, string opt);
-  //! Sets an option to a list of symbols (used in conjunction with add_in_symbol_list())
-  void option_symbol_list(string name_option);
+  //! Sets an option to a list of symbols
+  void option_symbol_list(string name_option, vector<string> symbol_list);
   //! Sets an option to a vector of integers
   void option_vec_int(string name_option, vector<int> opt);
   //! Sets an option to a vector of strings
@@ -500,12 +497,10 @@ public:
   void option_vec_cellstr(string name_option, vector<string> opt);
   //! Indicates that the model is linear
   void linear();
-  //! Adds a variable to temporary symbol list
-  void add_in_symbol_list(const string &tmp_var);
   //! Writes a rplot() command
-  void rplot();
+  void rplot(vector<string> symbol_list);
   //! Writes a stock_simul command
-  void stoch_simul();
+  void stoch_simul(SymbolList symbol_list);
   //! Writes a trend component command
   void trend_component_model();
   //! Writes a var (vector autoregression) command
@@ -563,7 +558,7 @@ public:
   //! Sets the options for estimated correlation
   void set_corr_options(const string &name1, const string &name2, const string &subsample_name);
   //! Runs estimation process
-  void run_estimation();
+  void run_estimation(vector<string> symbol_list);
   //! Runs dynare_sensitivy()
   void dynare_sensitivity();
   //! Check that no observed variable has yet be defined
@@ -580,9 +575,7 @@ public:
   //! Svar_Identification Statement: match list of restrictions and equation number with lag
   void combine_lag_and_restriction(const string &lag);
   //! Svar_Identification Statement: match list of restrictions with equation number
-  void add_restriction_in_equation(const string &equation);
-  //! Svar_Identification Statement: add list of restriction symbol ids
-  void add_in_svar_restriction_symbols(const string &tmp_var);
+  void add_restriction_in_equation(const string &equation, const vector<string> &symbol_list);
   //! Svar_Identification Statement: add exclusions of constants
   void add_constants_exclusion();
   //! Svar_Identification Statement: add equation number for following restriction equations
@@ -612,7 +605,7 @@ public:
   void add_generate_irfs_element(string name);
   void add_generate_irfs_exog_element(string exo, const string &value);
   //! Forecast Statement
-  void forecast();
+  void forecast(vector<string> symbol_list);
   void set_trends();
   void set_deterministic_trends();
   void set_trend_element(string arg1, expr_t arg2);
@@ -624,10 +617,10 @@ public:
   void optim_weights();
   void set_optim_weights(string name, expr_t value);
   void set_optim_weights(const string &name1, const string &name2, expr_t value);
-  void set_osr_params();
-  void run_osr();
-  void run_dynasave(const string &filename);
-  void run_dynatype(const string &filename);
+  void set_osr_params(vector<string> symbol_list);
+  void run_osr(vector<string> symbol_list);
+  void run_dynasave(const string &filename, vector<string> symbol_list);
+  void run_dynatype(const string &filename, vector<string> symbol_list);
   void run_load_params_and_steady_state(const string &filename);
   void run_save_params_and_steady_state(const string &filename);
   void run_identification();
@@ -652,7 +645,7 @@ public:
   //! Ramsey constraint helper function
   void add_ramsey_constraint(const string &name, BinaryOpcode op_code, const expr_t rhs);
   //! Ramsey policy statement
-  void ramsey_policy();
+  void ramsey_policy(vector<string> symbol_list);
   //! Evaluate Planner Objective
   void evaluate_planner_objective();
   //! Set up Occbin
@@ -662,9 +655,9 @@ public:
   //! Run Occbin write XLS
   void occbin_write_regimes();
   //! Run plotting of Occbin results
-  void occbin_graph();
+  void occbin_graph(vector<string> symbol_list);
   //! Discretionary policy statement
-  void discretionary_policy();
+  void discretionary_policy(vector<string> symbol_list);
   //! Adds a write_latex_dynamic_model statement
   void write_latex_dynamic_model(bool write_equation_tags);
   //! Adds a write_latex_static_model statement
@@ -688,7 +681,7 @@ public:
   //! Markov Switching Statement: Probabilities
   void ms_compute_probabilities();
   //! Markov Switching Statement: IRF
-  void ms_irf();
+  void ms_irf(vector<string> symbol_list);
   //! Markov Switching Statement: Forecast
   void ms_forecast();
   //! Markov Switching Statement: Variance Decomposition
@@ -698,23 +691,23 @@ public:
   //! MarkovSwitching statement
   void markov_switching();
   //! Shock decomposition
-  void shock_decomposition();
+  void shock_decomposition(vector<string> symbol_list);
   //! Realtime Shock decomposition
-  void realtime_shock_decomposition();
+  void realtime_shock_decomposition(vector<string> symbol_list);
   //! Plot Shock decomposition
-  void plot_shock_decomposition();
+  void plot_shock_decomposition(vector<string> symbol_list);
   //! Initial Condition decomposition
-  void initial_condition_decomposition();
+  void initial_condition_decomposition(vector<string> symbol_list);
   //! squeeze_shock_decomposition statement
-  void squeeze_shock_decomposition();
+  void squeeze_shock_decomposition(vector<string> symbol_list);
   //! Conditional forecast statement
   void conditional_forecast();
   //! Conditional forecast paths block
   void conditional_forecast_paths();
   //! Plot conditional forecast statement
-  void plot_conditional_forecast(const string &periods = "");
+  void plot_conditional_forecast(const string &periods, vector<string> symbol_list);
   //! Smoother on calibrated models
-  void calib_smoother();
+  void calib_smoother(vector<string> symbol_list);
   //! Extended path
   void extended_path();
   //! Writes token "arg1=arg2" to model tree
@@ -847,19 +840,15 @@ public:
   //! Add an assignment equation in steady_state_model block
   void add_steady_state_model_equal(const string &varname, expr_t expr);
   //! Add a multiple assignment equation in steady_state_model block
-  void add_steady_state_model_equal_multiple(expr_t expr);
+  void add_steady_state_model_equal_multiple(const vector<string> &symbol_list, expr_t expr);
   //! Switches datatree
   void begin_trend();
-  //! Declares a trend variable with its growth factor
-  void declare_trend_var(bool log_trend, const string &name, const string &tex_name = "");
   //! Ends declaration of trend variable
-  void end_trend_var(expr_t growth_factor);
-  //! Declares a nonstationary variable with its deflator
-  void declare_nonstationary_var(const string &name, const string &tex_name = "", const vector<pair<string, string>> &partition_value = {});
+  void end_trend_var(bool log_trend, expr_t growth_factor, const vector<pair<string, string>> &symbol_list);
   //! Ends declaration of nonstationary variable
-  void end_nonstationary_var(bool log_deflator, expr_t deflator);
+  void end_nonstationary_var(bool log_deflator, expr_t deflator, const vector<tuple<string, string, vector<pair<string, string>>>> &symbol_list);
   //! Add a graph format to the list of formats requested
-  void add_graph_format(const string &name);
+  void add_graph_format(string name);
   //! Add the graph_format option to the OptionsList structure
   void process_graph_format_option();
   //! Add the graph_format option to the initial_condition_decomp substructure of the OptionsList structure
@@ -912,7 +901,7 @@ public:
   // Begin a model_replace statement
   void begin_model_replace(const vector<pair<string, string>> &listed_eqs_by_tags);
   // Add a var_remove statement
-  void var_remove();
+  void var_remove(const vector<string> &symbol_list);
   void begin_pac_target_info(string name);
   void end_pac_target_info();
   void set_pac_target_info_target(expr_t target);
diff --git a/src/SymbolList.cc b/src/SymbolList.cc
index 794095ff04c013c062e84caec81f3bec2a74a0dc..83517a6564b2de2f107ce6e1e88ce91d249a7720 100644
--- a/src/SymbolList.cc
+++ b/src/SymbolList.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2003-2021 Dynare Team
+ * Copyright © 2003-2022 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -21,21 +21,14 @@
 
 #include "SymbolList.hh"
 
-void
-SymbolList::setSymbolTable(const SymbolTable &symbol_table_arg)
-{
-  symbol_table = &symbol_table_arg;
-}
-
-void
-SymbolList::addSymbol(const string &symbol)
+SymbolList::SymbolList(vector<string> symbols_arg) :
+  symbols{move(symbols_arg)}
 {
-  symbols.push_back(symbol);
 }
 
 void
-SymbolList::checkPass(WarningConsolidation &warnings,
-                      const vector<SymbolType> &types) const noexcept(false)
+SymbolList::checkPass(WarningConsolidation &warnings, const vector<SymbolType> &types,
+                      const SymbolTable &symbol_table) const noexcept(false)
 {
   if (types.empty())
     return;
@@ -51,7 +44,7 @@ SymbolList::checkPass(WarningConsolidation &warnings,
   regex re("^(" + regex_str +")");
   for (const auto &symbol : symbols)
     {
-      if (!symbol_table->exists(symbol))
+      if (!symbol_table.exists(symbol))
         {
           if (regex_search(symbol, m, re))
             {
@@ -66,7 +59,7 @@ SymbolList::checkPass(WarningConsolidation &warnings,
 
       bool type_found = false;
       for (auto type : types)
-        if (symbol_table->getType(symbol) == type)
+        if (symbol_table.getType(symbol) == type)
           {
             type_found = true;
             break;
@@ -148,18 +141,6 @@ SymbolList::writeJsonOutput(ostream &output) const
   output << "]";
 }
 
-void
-SymbolList::clear()
-{
-  symbols.clear();
-}
-
-int
-SymbolList::getSize() const
-{
-  return symbols.size();
-}
-
 vector<string>
 SymbolList::getSymbols() const
 {
diff --git a/src/SymbolList.hh b/src/SymbolList.hh
index d009d9e50911dba9f63578a3be3af8f18d7b874b..14bc13f8ad4ffade43037c987f7a87898936a959 100644
--- a/src/SymbolList.hh
+++ b/src/SymbolList.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2003-2019 Dynare Team
+ * Copyright © 2003-2022 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -35,10 +35,12 @@ using namespace std;
 class SymbolList
 {
 private:
-  //! Internal container for symbol list
   vector<string> symbols;
-  const SymbolTable *symbol_table;
 public:
+  SymbolList() = default;
+  // This constructor is deliberately not marked explicit, to allow implicit conversion
+  SymbolList(vector<string> symbols_arg);
+
   class SymbolListException
   {
   public:
@@ -47,14 +49,10 @@ public:
     {
     };
   };
-  //! Set symbol table pointer
-  void setSymbolTable(const SymbolTable &symbol_table_arg);
-  //! Adds a symbol to the list
-  void addSymbol(const string &symbol);
-  //! Removed duplicate symbols
+  //! Remove duplicate symbols
   void removeDuplicates(const string &dynare_command, WarningConsolidation &warnings);
   //! Check symbols to ensure variables have been declared and are endogenous
-  void checkPass(WarningConsolidation &warnings, const vector<SymbolType> &types) const noexcept(false);
+  void checkPass(WarningConsolidation &warnings, const vector<SymbolType> &types, const SymbolTable &symbol_table) const noexcept(false);
   //! Output content in Matlab format
   /*! Creates a string array for Matlab, stored in variable "varname" */
   void writeOutput(const string &varname, ostream &output) const;
@@ -62,22 +60,12 @@ public:
   void write(ostream &output) const;
   //! Write JSON output
   void writeJsonOutput(ostream &output) const;
-  //! Clears all content
-  void clear();
-  //! Get a copy of the string vector
-  vector<string>
-  get_symbols() const
-  {
-    return symbols;
-  };
   //! Is Empty
   int
   empty() const
   {
     return symbols.empty();
   };
-  //! Return the number of Symbols contained in the list
-  int getSize() const;
   //! Return the list of symbols
   vector<string> getSymbols() const;
 };