diff --git a/src/DynareBison.yy b/src/DynareBison.yy
index 1a9c213e7f2dd5f03c3f28ed45a22044f1fa1144..2a55a2050de931c9f28894fe292ba191cddc149a 100644
--- a/src/DynareBison.yy
+++ b/src/DynareBison.yy
@@ -186,7 +186,9 @@ class ParsingDriver;
 %type <string> vec_value_1 vec_value signed_inf signed_number_w_inf
 %type <string> range vec_value_w_inf vec_value_1_w_inf
 %type <string> integer_range signed_integer_range boolean
-%type <string> sub_sampling_options list_sub_sampling_option
+%type <string> name_value_pair name_value_pair_list
+%type <string> name_value_pair_with_boolean name_value_pair_with_boolean_list
+%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
@@ -2014,42 +2016,48 @@ estimation_options : o_datafile
                    | o_occbin_smoother
                    ;
 
-list_optim_option : QUOTED_STRING COMMA QUOTED_STRING
-                    { driver.optim_options_string($1, $3); }
-                  | QUOTED_STRING COMMA signed_number
-                    { driver.optim_options_num($1, $3); }
-                  | QUOTED_STRING COMMA boolean
-                    { driver.optim_options_num($1, $3); }
-                  ;
-
-optim_options : list_optim_option
-              | optim_options COMMA list_optim_option;
-              ;
-
-list_sub_sampling_option : QUOTED_STRING COMMA QUOTED_STRING
-                           { $$ = "''" + $1 + "'', ''" + $3 + "''"; }
-                         | QUOTED_STRING COMMA signed_number
-                           { $$ = "''" + $1 + "''," + $3; }
-                         ;
+name_value_pair : QUOTED_STRING COMMA QUOTED_STRING
+                  { $$ = "''" + $1 + "'', ''" + $3 + "''"; }
+                | QUOTED_STRING COMMA signed_number
+                  { $$ = "''" + $1 + "''," + $3; }
+                ;
 
-sub_sampling_options : list_sub_sampling_option
-                     | sub_sampling_options COMMA list_sub_sampling_option
+name_value_pair_list : name_value_pair
+                     | name_value_pair_list COMMA name_value_pair
                        { $$ = $1 + ',' + $3; }
                      ;
 
-list_sampling_option : QUOTED_STRING COMMA QUOTED_STRING
-                       { driver.sampling_options_string($1, $3); }
-                     | QUOTED_STRING COMMA signed_number
-                       { driver.sampling_options_num($1, $3); }
-                     | QUOTED_STRING COMMA vec_str
-                       { driver.sampling_options_vec_str($1, $3); }
-                     | QUOTED_STRING COMMA '(' sub_sampling_options ')'
-                       { driver.sampling_options_string($1, '(' + $4 + ')'); }
-                     ;
+name_value_pair_with_boolean : name_value_pair
+                             | QUOTED_STRING COMMA boolean
+                               { $$ = "''" + $1 + "''," + $3; }
+                             ;
 
-sampling_options : list_sampling_option
-                 | sampling_options COMMA list_sampling_option;
-                 ;
+name_value_pair_with_boolean_list : name_value_pair_with_boolean
+                                  | name_value_pair_with_boolean_list COMMA name_value_pair_with_boolean
+                                    { $$ = $1 + ',' + $3; }
+                                  ;
+
+
+name_value_pair_with_suboptions : name_value_pair
+                                | QUOTED_STRING COMMA vec_str
+                                  {
+                                    $$ = "''" + $1 + "'',{";
+                                    for (auto &it : $3)
+                                      {
+                                        if (&it != &($3).front())
+                                          $$ += ",";
+                                        $$ += "''" + it + "''";
+                                      }
+                                    $$ += '}';
+                                  }
+                                | QUOTED_STRING COMMA '(' name_value_pair_list ')'
+                                  { $$ = "''" + $1 + "'',''(" + $4 + ")''"; }
+                                ;
+
+name_value_pair_with_suboptions_list : name_value_pair_with_suboptions
+                                     | name_value_pair_with_suboptions_list COMMA name_value_pair_with_suboptions
+                                       { $$ = $1 + ',' + $3; }
+                                     ;
 
 varobs : VAROBS { driver.check_varobs(); } varobs_list ';';
 
@@ -3273,8 +3281,8 @@ o_mh_tune_jscale : MH_TUNE_JSCALE EQUAL non_negative_number
                  { driver.option_num("mh_tune_jscale.target", $3); driver.option_num("mh_tune_jscale.status", "true");}
                  | MH_TUNE_JSCALE {driver.option_num("mh_tune_jscale.status", "true");};
 o_mh_tune_guess : MH_TUNE_GUESS EQUAL non_negative_number { driver.option_num("mh_tune_jscale.guess", $3); };
-o_optim : OPTIM  EQUAL '(' optim_options ')';
-o_posterior_sampler_options : POSTERIOR_SAMPLER_OPTIONS EQUAL '(' sampling_options ')' ;
+o_optim : OPTIM  EQUAL '(' name_value_pair_with_boolean_list ')' { driver.option_str("optim_opt", $4); };
+o_posterior_sampler_options : POSTERIOR_SAMPLER_OPTIONS EQUAL '(' name_value_pair_with_suboptions_list ')' { driver.option_str("posterior_sampler_options.sampling_opt", $4); };
 o_proposal_distribution : PROPOSAL_DISTRIBUTION EQUAL symbol { driver.option_str("posterior_sampler_options.posterior_sampling_method.proposal_distribution", $3); };
 o_no_posterior_kernel_density : NO_POSTERIOR_KERNEL_DENSITY
                              { driver.option_num("estimation.moments_posterior_density.indicator", "false"); }
diff --git a/src/ParsingDriver.cc b/src/ParsingDriver.cc
index 9b0695c732e54d639b32d0d9f9ce18e9d17cfdaa..4670113b327f8cc762c9bbcc63a0bd7ec7be57e0 100644
--- a/src/ParsingDriver.cc
+++ b/src/ParsingDriver.cc
@@ -1833,69 +1833,6 @@ ParsingDriver::dynare_sensitivity()
   options_list.clear();
 }
 
-void
-ParsingDriver::optim_options_helper(const string &name)
-{
-  if (options_list.string_options.find("optim_opt") == options_list.string_options.end())
-    options_list.string_options["optim_opt"] = "";
-  else
-    options_list.string_options["optim_opt"] += ",";
-  options_list.string_options["optim_opt"] += "''" + name + "'',";
-}
-
-void
-ParsingDriver::optim_options_string(const string &name, const string &value)
-{
-  optim_options_helper(name);
-  options_list.string_options["optim_opt"] += "''" + value + "''";
-}
-
-void
-ParsingDriver::optim_options_num(const string &name, const string &value)
-{
-  optim_options_helper(name);
-  options_list.string_options["optim_opt"] += value;
-}
-
-void
-ParsingDriver::sampling_options_helper(const string &name)
-{
-  if (options_list.string_options.find("posterior_sampler_options.sampling_opt") ==
-      options_list.string_options.end())
-    options_list.string_options["posterior_sampler_options.sampling_opt"] = "";
-  else
-    options_list.string_options["posterior_sampler_options.sampling_opt"] += ",";
-  options_list.string_options["posterior_sampler_options.sampling_opt"] += "''" + name + "'',";
-}
-
-void
-ParsingDriver::sampling_options_string(const string &name, const string &value)
-{
-  sampling_options_helper(name);
-  options_list.string_options["posterior_sampler_options.sampling_opt"] += "''" + value + "''";
-}
-
-void
-ParsingDriver::sampling_options_num(const string &name, const string &value)
-{
-  sampling_options_helper(name);
-  options_list.string_options["posterior_sampler_options.sampling_opt"] += value;
-}
-
-void
-ParsingDriver::sampling_options_vec_str(const string &name, vector<string> value)
-{
-  sampling_options_helper(name);
-  options_list.string_options["posterior_sampler_options.sampling_opt"] += "{";
-  for (auto &it : value)
-    {
-      if (&it != &value.front())
-        options_list.string_options["posterior_sampler_options.sampling_opt"] += ",";
-      options_list.string_options["posterior_sampler_options.sampling_opt"] += "''" + it + "''";
-    }
-  options_list.string_options["posterior_sampler_options.sampling_opt"] += "}";
-}
-
 void
 ParsingDriver::check_varobs()
 {
diff --git a/src/ParsingDriver.hh b/src/ParsingDriver.hh
index ed4ef240175195191ffc8df6c4a8cc449323822c..eb200ca34b0316e7366e1d531feb9fe8224c768e 100644
--- a/src/ParsingDriver.hh
+++ b/src/ParsingDriver.hh
@@ -111,10 +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);
 
-  //! Creates option "optim_opt" in OptionsList if it doesn't exist, else add a comma, and adds the option name
-  void optim_options_helper(const string &name);
-  void sampling_options_helper(const string &name);
-
   //! Stores temporary symbol table
   SymbolList symbol_list;
 
@@ -553,16 +549,6 @@ public:
   void run_estimation();
   //! Runs dynare_sensitivy()
   void dynare_sensitivity();
-  //! Adds an optimization option (string value)
-  void optim_options_string(const string &name, const string &value);
-  //! Adds an optimization option (numeric value)
-  void optim_options_num(const string &name, const string &value);
-  //! Adds an sampling option (string value)
-  void sampling_options_string(const string &name, const string &value);
-  //! Adds an sampling option (numeric value)
-  void sampling_options_num(const string &name, const string &value);
-  //! Adds an sampling option (vec_str value)
-  void sampling_options_vec_str(const string &name, vector<string> value);
   //! Check that no observed variable has yet be defined
   void check_varobs();
   //! Add a new observed variable