diff --git a/matlab/global_initialization.m b/matlab/global_initialization.m
index cb463a8b7e6ced701b6e22b094bceeb4f002f92a..f3d3bd5983e745f5529b09e5f07f26d2f0cdb3b9 100644
--- a/matlab/global_initialization.m
+++ b/matlab/global_initialization.m
@@ -616,7 +616,6 @@ options_.convergence.geweke.taper_steps=[4 8 15];
 options_.convergence.geweke.geweke_interval=[0.2 0.5];
 
 % DMM
-options_.multinomial_index = 1;
 options_.dmm.seed = 0;
 options_.dmm.thinning_factor  = 1;
 options_.dmm.block_length = 1;
@@ -627,6 +626,7 @@ options_.mcmc.drop = 100;
 options_.mcmc.replic = 1000;
 
 options_.calibration = [];
+options_.multinomial = [];
 
 % initialize persistent variables in priordens()
 priordens([],[],[],[],[],[],1);
diff --git a/matlab/writeDmmNmlFile.m b/matlab/writeDmmNmlFile.m
index e9153f5d47c4675d5519f5b4833313385a0c141c..d271c0513f082bfe4592d3a6ce4b883253b8c9a2 100644
--- a/matlab/writeDmmNmlFile.m
+++ b/matlab/writeDmmNmlFile.m
@@ -41,7 +41,7 @@ fprintf(fid, 'from %s.mod on %d-%d-%d at %d:%d:%d\n', M_.fname, fix(clock));
 %% SSM
 fprintf(fid, '\n&ssm\n');
 fprintf(fid, 'nu=%d nv=%d nx=%d d=%d %d dllname=%s check=%s', M_.exo_nbr, ...
-        size(options_.multinomial_info,2), options_.dmm.nx, ...
+        size(options_.multinomial, 2), options_.dmm.nx, ...
         options_.dmm.max_order_of_integration, options_.dmm.num_nonstationary, ...
         [M_.fname '.dll'], options_.dmm.check_mats);
 fprintf(fid, '\n&end\n');
@@ -70,11 +70,13 @@ end
 fprintf(fid, '&end\n');
 
 %% S*
-for i=1:size(options_.multinomial_info,2)
+for i=1:size(options_.multinomial,2)
     fprintf(fid, '\n&S%d\n',i);
+    indx = find(strcmp(estimation_info.transition_probability_index, options_.multinomial(i).probability));
+    params = estimation_info.transition_probability(indx).prior.params;
     fprintf(fid, 'dynS%d=%s nS%d=%d hypS%d(1,1)=%d %d matS%d=%s',i,'I',i, ...
-            options_.multinomial_info(i).number_of_regimes, i, ...
-            options_.multinomial_info(i).values,i,'G');
+            options_.multinomial(i).number_of_regimes, i, ...
+            params, i, 'G');
     fprintf(fid, '\n&end\n');
 end
 
diff --git a/preprocessor/ComputingTasks.cc b/preprocessor/ComputingTasks.cc
index dfc871a46ac41f505f500ece8194bad8e4e8d754..46980420e2a1ce8ce5a637cb6f383b6374b3177b 100644
--- a/preprocessor/ComputingTasks.cc
+++ b/preprocessor/ComputingTasks.cc
@@ -1556,15 +1556,63 @@ MultinomialStatement::MultinomialStatement(const OptionsList &options_list_arg)
 void
 MultinomialStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
+  if (options_list.string_options.find("parameter") == options_list.string_options.end())
+    {
+      cerr << "ERROR: The parameter option must be passed to the multinomial statement" << endl;
+      exit(EXIT_FAILURE);
+    }
+
+  if (options_list.string_options.find("process") == options_list.string_options.end() &&
+      options_list.num_options.find("process") == options_list.num_options.end())
+    {
+      cerr << "ERROR: The process option must be passed to the multinomial statement" << endl;
+      exit(EXIT_FAILURE);
+    }
+
+  if (options_list.num_options.find("number_of_regimes") == options_list.num_options.end())
+    {
+      cerr << "ERROR: The number_of_regimes option must be passed to the multinomial statement" << endl;
+      exit(EXIT_FAILURE);
+    }
+
+  if (options_list.symbol_list_options.find("probability") == options_list.symbol_list_options.end())
+    {
+      cerr << "ERROR: The probability option must be passed to the multinomial statement" << endl;
+      exit(EXIT_FAILURE);
+    }
 }
 
 void
 MultinomialStatement::writeOutput(ostream &output, const string &basename) const
 {
-  output << "options_.multinomial = set_multinomial_default();" << endl;
-  options_list.writeOutput(output);
-  output << "options_.multinomial_info(options_.multinomial_index) = options_.multinomial;" << endl
-         << "options_.multinomial_index = options_.multinomial_index + 1;" << endl;
+  string lhs_field = "options_.multinomial(multind)";
+  output << "multind = size(options_.multinomial, 2) + 1;" << endl;
+  writeOutputHelper(output, lhs_field, "process");
+  writeOutputHelper(output, lhs_field, "parameter");
+  writeOutputHelper(output, lhs_field, "probability");
+  writeOutputHelper(output, lhs_field, "number_of_regimes");
+}
+
+void
+MultinomialStatement::writeOutputHelper(ostream &output, const string &lhs_field, const string &field) const
+{
+  OptionsList::num_options_t::const_iterator itn = options_list.num_options.find(field);
+  if (itn != options_list.num_options.end())
+    {
+      output << lhs_field << "." << field << " = "<< itn->second << ";" << endl;
+      return;
+    }
+
+  OptionsList::string_options_t::const_iterator its = options_list.string_options.find(field);
+  if (its != options_list.string_options.end())
+    {
+      output << lhs_field << "." << field << " = '"<< its->second << "';" << endl;
+      return;
+    }
+
+  OptionsList::symbol_list_options_t::const_iterator itsl = options_list.symbol_list_options.find(field);
+  if (itsl != options_list.symbol_list_options.end())
+    itsl->second.writeOutput(lhs_field + "." + field, output);
 }
 
 TransitionProbPriorStatement::TransitionProbPriorStatement(const string &name_arg,
diff --git a/preprocessor/ComputingTasks.hh b/preprocessor/ComputingTasks.hh
index 8171f3c407dfb07f7de94187ff6994faf1c42dc1..9814508ba0bef84e8b594134ad250fa6bd0d757d 100644
--- a/preprocessor/ComputingTasks.hh
+++ b/preprocessor/ComputingTasks.hh
@@ -646,6 +646,7 @@ public:
   MultinomialStatement(const OptionsList &options_list_arg);
   virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
+  void writeOutputHelper(ostream &output, const string &lhs_field, const string &field) const;
 };
 
 class SubsamplesStatement : public Statement
diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy
index e7ffebc7a574cd7b5acbf05cde1dc9c924dcc022..73070c74d1ce7da41e8466adbd56807470a32a90 100644
--- a/preprocessor/DynareBison.yy
+++ b/preprocessor/DynareBison.yy
@@ -159,7 +159,7 @@ class ParsingDriver;
 %token SELECTED_VARIABLES_ONLY COVA_COMPUTE SIMULATION_FILE_TAG FILE_TAG
 %token NO_ERROR_BANDS ERROR_BAND_PERCENTILES SHOCKS_PER_PARAMETER NO_CREATE_INIT
 %token SHOCK_DRAWS FREE_PARAMETERS MEDIAN DATA_OBS_NBR NEIGHBORHOOD_WIDTH PVALUE_KS PVALUE_CORR
-%token FILTERED_PROBABILITIES REAL_TIME_SMOOTHED
+%token FILTERED_PROBABILITIES REAL_TIME_SMOOTHED PARAMETER
 %token PROPOSAL_TYPE PROPOSAL_UPPER_BOUND PROPOSAL_LOWER_BOUND PROPOSAL_DRAWS USE_MEAN_CENTER
 %token ADAPTIVE_MH_DRAWS THINNING_FACTOR COEFFICIENTS_PRIOR_HYPERPARAMETERS
 %token CONVERGENCE_STARTING_VALUE CONVERGENCE_ENDING_VALUE CONVERGENCE_INCREMENT_VALUE
@@ -1414,7 +1414,7 @@ calibration_options_list : calibration_options_list COMMA calibration_options
                          | calibration_options
                          ;
 
-calibration_options : o_calibration_process
+calibration_options : o_process
                     | o_calibration_regime
                     ;
 
@@ -1604,9 +1604,10 @@ multinomial_options_list : multinomial_options_list COMMA multinomial_options
                          | multinomial_options
                          ;
 
-multinomial_options : o_multinomial_process
+multinomial_options : o_process
                     | o_multinomial_number_of_regimes
-                    | o_multinomial_probability
+                    | o_probability
+                    | o_parameter
                     ;
 
 estimation : ESTIMATION ';'
@@ -2812,16 +2813,13 @@ o_equations : EQUATIONS EQUAL vec_int
             | EQUATIONS EQUAL vec_int_number
               { driver.option_vec_int("ms.equations",$3); }
             ;
-
-o_multinomial_process : PROCESS EQUAL symbol { driver.option_str("multinomial.process",$3); }
-                      | PROCESS EQUAL INT_NUMBER { driver.option_num("multinomial.process",$3); }
-                      ;
-o_multinomial_number_of_regimes : NUMBER_OF_REGIMES EQUAL INT_NUMBER { driver.option_num("multinomial.number_of_regimes",$3); };
-o_multinomial_probability : PROBABILITY EQUAL vec_value
-                            { driver.option_num("multinomial.probability",$3); }
-                          | PROBABILITY EQUAL '[' prob_symbol_list ']'
-                            { driver.option_symbol_list("multinomial.probability"); }
-                          ;
+o_multinomial_number_of_regimes : NUMBER_OF_REGIMES EQUAL INT_NUMBER { driver.option_num("number_of_regimes",$3); };
+o_parameter : PARAMETER EQUAL symbol{ driver.option_str("parameter", $3); };
+o_probability : PROBABILITY EQUAL vec_value
+                { driver.option_num("probability",$3); }
+              | PROBABILITY EQUAL '[' prob_symbol_list ']'
+                { driver.option_symbol_list("probability"); }
+              ;
 o_instruments : INSTRUMENTS EQUAL '(' symbol_list ')' {driver.option_symbol_list("instruments"); };
 
 o_ext_func_name : EXT_FUNC_NAME EQUAL filename { driver.external_function_option("name", $3); };
@@ -2927,9 +2925,9 @@ o_dmm_simulate_data : SIMULATE_DATA EQUAL symbol { driver.option_str("dmm.simula
 o_dmm_check_mats : CHECK_MATS EQUAL symbol { driver.option_str("dmm.check_mats", $3); };
 o_dmm_calc_marg_lik : CALC_MARG_LIK EQUAL symbol { driver.option_str("dmm.calc_marg_lik", $3); };
 o_dmm_block_length : BLOCK_LENGTH EQUAL symbol { driver.option_str("dmm.block_length", $3); };
-o_calibration_process : PROCESS EQUAL symbol { driver.option_str("process",$3); }
-                      | PROCESS EQUAL INT_NUMBER { driver.option_num("process",$3); }
-                      ;
+o_process : PROCESS EQUAL symbol { driver.option_str("process",$3); }
+          | PROCESS EQUAL INT_NUMBER { driver.option_num("process",$3); }
+          ;
 o_calibration_regime : REGIME EQUAL INT_NUMBER { driver.option_num("regime",$3); };
 o_consider_all_endogenous : CONSIDER_ALL_ENDOGENOUS { driver.option_str("endo_vars_for_moment_computations_in_estimation", "all_endogenous_variables"); };
 o_consider_only_observed : CONSIDER_ONLY_OBSERVED { driver.option_str("endo_vars_for_moment_computations_in_estimation", "only_observed_variables"); };
diff --git a/preprocessor/DynareFlex.ll b/preprocessor/DynareFlex.ll
index ff394f06284f8cc5a3c0253fc5b9d533ddafe142..035a02036e8b80ab14a9fd2d239adc8b469ee14f 100644
--- a/preprocessor/DynareFlex.ll
+++ b/preprocessor/DynareFlex.ll
@@ -731,6 +731,7 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2
 <DYNARE_STATEMENT>neighborhood_width {return token::NEIGHBORHOOD_WIDTH;}
 <DYNARE_STATEMENT>pvalue_ks {return token::PVALUE_KS;}
 <DYNARE_STATEMENT>pvalue_corr {return token::PVALUE_CORR;}
+<DYNARE_STATEMENT>parameter {return token::PARAMETER;}
  /* end of GSA options */
 
  /* For identification() statement */
diff --git a/tests/nile.mod b/tests/nile.mod
index dafee68629b3a9f5d2d47e773a0ba44ad77f9882..f5607e9023bb307c34c1c43c6ae98652cd58f5e6 100644
--- a/tests/nile.mod
+++ b/tests/nile.mod
@@ -3,8 +3,8 @@ varobs y;
 varexo ee emu;
 parameters Ve, Vmu, delta, S1, S2;
 
-multinomial( process=A, number_of_regimes=2, probability = [P1]);
-multinomial( process=2, number_of_regimes=2, probability = [P2]);
+multinomial( process=1, number_of_regimes=2, probability = [P1], parameter = S1);
+multinomial( process=2, number_of_regimes=2, probability = [P2], parameter = S2);
 // probability can be a single object representing a vector with a Dirlichet prior (see below) or a vector of calibrated values
 //add bernoulli instruction (similar to markov-switching for independent draws) and new options to create bernoulli process
 // I don' know if probabilities would be a better name than probability (vector  being implicit)