diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc
index 86e665731a01b21c8f9598b5c0c23d6445bf6a3f..d77f040d5058df125f45185e9d3c9dfe5081520d 100644
--- a/src/ComputingTasks.cc
+++ b/src/ComputingTasks.cc
@@ -5109,18 +5109,19 @@ MethodOfMomentsStatement::checkPass(ModFileStructure &mod_file_struct,
       mod_file_struct.order_option = max(mod_file_struct.order_option, order);
     }
 
-  if (!options_list.contains("datafile"))
+  if (!options_list.contains("mom.mom_method"))
     {
-      cerr << "ERROR: The method_of_moments statement requires a data file to be supplied via the datafile option." << endl;
+      cerr << "ERROR: The 'method_of_moments' statement requires a method to be supplied via the 'mom_method' option. Possible values are 'GMM', 'SMM', or 'IRF_MATCHING'." << endl;
       exit(EXIT_FAILURE);
     }
 
-  if (!options_list.contains("mom.mom_method"))
+  auto mom_method_value = options_list.get_if<OptionsList::StringVal>("mom.mom_method");
+  if ((mom_method_value == "GMM" || mom_method_value == "SMM") && !options_list.contains("datafile"))
     {
-      cerr << "ERROR: The method_of_moments statement requires a method to be supplied via the mom_method option. Possible values are GMM or SMM." << endl;
+      cerr << "ERROR: The 'method_of_moments' statement requires a data file to be supplied via the 'datafile' option." << endl;
       exit(EXIT_FAILURE);
     }
- 
+    
   if (auto opt = options_list.get_if<OptionsList::StringVal>("mom.mom_method");
       opt && *opt == "GMM")
     mod_file_struct.GMM_present = true;
diff --git a/src/DynareBison.yy b/src/DynareBison.yy
index 3fcb9982f16a20f91a3756e6495c81caad76d1ce..ba6c3d73e686934e802191df54b61e16bc02077f 100644
--- a/src/DynareBison.yy
+++ b/src/DynareBison.yy
@@ -152,7 +152,7 @@ class ParsingDriver;
 %token RESTRICTION RESTRICTION_FNAME CROSS_RESTRICTIONS NLAGS CONTEMP_REDUCED_FORM REAL_PSEUDO_FORECAST
 %token DUMMY_OBS NSTATES INDXSCALESSTATES NO_BAYESIAN_PRIOR SPECIFICATION SIMS_ZHA
 %token <string> ALPHA BETA ABAND NINV CMS NCMS CNUM GAMMA INV_GAMMA INV_GAMMA1 INV_GAMMA2 NORMAL UNIFORM EPS PDF FIG DR NONE PRIOR PRIOR_VARIANCE HESSIAN IDENTITY_MATRIX DIRICHLET DIAGONAL OPTIMAL
-%token GSIG2_LMDM Q_DIAG FLAT_PRIOR NCSK NSTD WEIBULL WEIBULL_PDF GMM SMM
+%token GSIG2_LMDM Q_DIAG FLAT_PRIOR NCSK NSTD WEIBULL WEIBULL_PDF
 %token INDXPARR INDXOVR INDXAP APBAND INDXIMF INDXFORE FOREBAND INDXGFOREHAT INDXGIMFHAT
 %token INDXESTIMA INDXGDLS EQ_MS FILTER_COVARIANCE UPDATED_COVARIANCE FILTER_DECOMPOSITION SMOOTHED_STATE_UNCERTAINTY SMOOTHER_REDUX
 %token EQ_CMS TLINDX TLNUMBER RESTRICTIONS POSTERIOR_SAMPLER_OPTIONS
@@ -180,14 +180,16 @@ class ParsingDriver;
 %token PAC_TARGET_INFO COMPONENT TARGET AUXNAME AUXNAME_TARGET_NONSTATIONARY PAC_TARGET_NONSTATIONARY
 %token <string> KIND LL DL DD ADD MULTIPLY
 /* Method of Moments */
-%token METHOD_OF_MOMENTS MOM_METHOD
+%token GMM SMM IRF_MATCHING
+%token METHOD_OF_MOMENTS MOM_METHOD SIMULATION_METHOD
 %token BARTLETT_KERNEL_LAG WEIGHTING_MATRIX WEIGHTING_MATRIX_SCALING_FACTOR ANALYTIC_STANDARD_ERRORS ANALYTIC_JACOBIAN PENALIZED_ESTIMATOR VERBOSE
 %token SIMULATION_MULTIPLE MOM_SEED SEED BOUNDED_SHOCK_SUPPORT ADDITIONAL_OPTIMIZER_STEPS MOM_SE_TOLX SE_TOLX MOM_BURNIN BURNIN
+%token IRF_MATCHING_FILE ADD_TINY_NUMBER_TO_CHOLESKY
 %token EQTAGS
 %token ANALYTICAL_GIRF IRF_IN_PERCENT EMAS_GIRF EMAS_DROP EMAS_TOLF EMAS_MAX_ITER
 %token NO_IDENTIFICATION_STRENGTH NO_IDENTIFICATION_REDUCEDFORM NO_IDENTIFICATION_MOMENTS
 %token NO_IDENTIFICATION_MINIMAL NO_IDENTIFICATION_SPECTRUM NORMALIZE_JACOBIANS GRID_NBR
-%token TOL_RANK TOL_DERIV TOL_SV CHECKS_VIA_SUBSETS MAX_DIM_SUBSETS_GROUPS ZERO_MOMENTS_TOLERANCE
+%token TOL_RANK TOL_DERIV TOL_SV CHECKS_VIA_SUBSETS MAX_DIM_SUBSETS_GROUPS
 %token MAX_NROWS SQUEEZE_SHOCK_DECOMPOSITION WITH_EPILOGUE MODEL_REMOVE MODEL_REPLACE MODEL_OPTIONS
 %token VAR_REMOVE ESTIMATED_PARAMS_REMOVE BLOCK_STATIC BLOCK_DYNAMIC INCIDENCE RESID NON_ZERO LEARNT_IN PLUS_EQUAL TIMES_EQUAL
 %token FSOLVE_OPTIONS
@@ -1501,61 +1503,97 @@ method_of_moments_options_list : method_of_moments_option COMMA method_of_moment
                                | method_of_moments_option
                                ;
 
-method_of_moments_option : o_mom_method
-                         | o_datafile
+method_of_moments_option : o_add_tiny_number_to_cholesky
+                         | o_additional_optimizer_steps
+                         | o_aim_solver
+                         | o_analytic_jacobian
+                         | o_analytic_standard_errors
                          | o_bartlett_kernel_lag
-                         | o_order
-                         | o_penalized_estimator
-                         | o_pruning
-                         | o_verbose
-                         | o_weighting_matrix
-                         | o_weighting_matrix_scaling_factor
-                         | o_mom_se_tolx
-                         | o_mom_burnin
                          | o_bounded_shock_support
-                         | o_mom_seed
-                         | o_simulation_multiple
-                         | o_analytic_standard_errors
+                         | o_brooks_gelman_plotrows
+                         | o_cova_compute
+                         | o_datafile
                          | o_dirname
-                         | o_graph_format
-                         | o_nodisplay
-                         | o_nograph
-                         | o_noprint
-                         | o_plot_priors
-                         | o_prior_trunc
-                         | o_tex
-                         | o_first_obs
-                         | o_logdata
-                         | o_nobs
-                         | o_prefilter
-                         | o_xls_sheet
-                         | o_xls_range
-                         | o_mode_compute
-                         | o_additional_optimizer_steps
-                         | o_optim
-                         | o_silent_optimizer
-                         | o_huge_number
-                         | o_analytic_jacobian
-                         | o_aim_solver
                          | o_dr
                          | o_dr_cycle_reduction_tol
-                         | o_dr_logarithmic_reduction_tol
                          | o_dr_logarithmic_reduction_maxiter
+                         | o_dr_logarithmic_reduction_tol
+                         | o_drop
+                         | o_first_obs
+                         | o_geweke_interval
+                         | o_graph_format
+                         | o_huge_number
+                         | o_irf_matching_file
                          | o_k_order_solver
+                         | o_load_mh_file
+                         | o_load_results_after_load_mh
+                         | o_logdata
                          | o_lyapunov
                          | o_lyapunov_complex_threshold
-                         | o_lyapunov_fixed_point_tol
                          | o_lyapunov_doubling_tol
-                         | o_sylvester
-                         | o_sylvester_fixed_point_tol
-                         | o_qz_criterium
-                         | o_qz_zero_threshold
-                         | o_schur_vec_tol
-                         | o_zero_moments_tolerance
+                         | o_lyapunov_fixed_point_tol
+                         | o_mcmc_jumping_covariance
+                         | o_mh_conf_sig
+                         | o_mh_drop
+                         | o_mh_init_scale_factor
+                         | o_mh_initialize_from_previous_mcmc
+                         | o_mh_initialize_from_previous_mcmc_directory
+                         | o_mh_initialize_from_previous_mcmc_prior
+                         | o_mh_initialize_from_previous_mcmc_record
+                         | o_mh_jscale
+                         | o_mh_nblocks
+                         | o_mh_posterior_mode_estimation
+                         | o_mh_recover
+                         | o_mh_replic
+                         | o_mh_tune_guess
+                         | o_mh_tune_jscale
+                         | o_mom_burnin
+                         | o_mom_method
+                         | o_mom_seed
+                         | o_mom_se_tolx
                          | o_mode_check
                          | o_mode_check_neighbourhood_size
-                         | o_mode_check_symmetric_plots
                          | o_mode_check_number_of_points
+                         | o_mode_check_symmetric_plots
+                         | o_mode_compute
+                         | o_mode_file
+                         | o_nobs
+                         | o_no_posterior_kernel_density
+                         | o_nodiagnostic
+                         | o_nodisplay
+                         | o_nograph
+                         | o_noprint
+                         | o_optim
+                         | o_order
+                         | o_penalized_estimator
+                         | o_plot_priors
+                         | o_posterior_max_subsample_draws
+                         | o_posterior_sampler_options
+                         | o_posterior_sampling_method
+                         | o_prefilter
+                         | o_prior_trunc
+                         | o_pruning
+                         | o_qz_criterium
+                         | o_qz_zero_threshold
+                         | o_raftery_lewis_diagnostics
+                         | o_raftery_lewis_qrs
+                         | o_relative_irf
+                         | o_replic
+                         | o_schur_vec_tol
+                         | o_silent_optimizer
+                         | o_simulation_method
+                         | o_simulation_multiple
+                         | o_sub_draws
+                         | o_sylvester
+                         | o_sylvester_fixed_point_tol
+                         | o_taper_steps
+                         | o_tex
+                         | o_use_penalized_objective_for_hessian
+                         | o_verbose
+                         | o_weighting_matrix
+                         | o_weighting_matrix_scaling_factor
+                         | o_xls_range
+                         | o_xls_sheet
                          ;
 
 prior_function : PRIOR_FUNCTION '(' prior_posterior_function_options_list ')' ';'
@@ -2436,7 +2474,6 @@ identification_option : o_ar
                       | o_max_dim_subsets_groups
                       | o_order
                       | o_schur_vec_tol
-                      | o_zero_moments_tolerance
                       ;
 
 model_comparison : MODEL_COMPARISON mc_filename_list ';'
@@ -4101,30 +4138,28 @@ o_fsolve_options : FSOLVE_OPTIONS EQUAL '(' name_value_pair_with_boolean_list ')
 
 // Some options to "method_of_moments"
 o_bartlett_kernel_lag : BARTLETT_KERNEL_LAG EQUAL INT_NUMBER { driver.option_num("mom.bartlett_kernel_lag", $3); };
-
 o_weighting_matrix : WEIGHTING_MATRIX EQUAL vec_str { driver.option_vec_cellstr("mom.weighting_matrix", $3); }
-
 o_weighting_matrix_scaling_factor : WEIGHTING_MATRIX_SCALING_FACTOR EQUAL non_negative_number { driver.option_num("mom.weighting_matrix_scaling_factor", $3); };
-
 o_analytic_standard_errors : ANALYTIC_STANDARD_ERRORS { driver.option_num("mom.analytic_standard_errors", "true"); };
-
 o_analytic_jacobian : ANALYTIC_JACOBIAN { driver.option_num("mom.analytic_jacobian", "true"); };
-
 o_mom_method : MOM_METHOD EQUAL GMM
                { driver.option_str("mom.mom_method", "GMM"); }
              | MOM_METHOD EQUAL SMM
                { driver.option_str("mom.mom_method", "SMM"); }
-             ;
+             | MOM_METHOD EQUAL IRF_MATCHING
+               { driver.option_str("mom.mom_method", "IRF_MATCHING"); };
+o_simulation_method : SIMULATION_METHOD EQUAL STOCH_SIMUL
+               { driver.option_str("mom.simulation_method", "STOCH_SIMUL"); };
 o_penalized_estimator : PENALIZED_ESTIMATOR { driver.option_num("mom.penalized_estimator", "true"); };
 o_verbose : VERBOSE { driver.option_num("mom.verbose", "true"); };
-
 o_simulation_multiple : SIMULATION_MULTIPLE EQUAL INT_NUMBER { driver.option_num("mom.simulation_multiple", $3); };
 o_mom_burnin : BURNIN EQUAL INT_NUMBER { driver.option_num("mom.burnin", $3); };
 o_bounded_shock_support : BOUNDED_SHOCK_SUPPORT { driver.option_num("mom.bounded_shock_support", "true"); };
 o_mom_seed : SEED EQUAL INT_NUMBER { driver.option_num("mom.seed", $3); };
 o_additional_optimizer_steps : ADDITIONAL_OPTIMIZER_STEPS EQUAL vec_int { driver.option_vec_int("additional_optimizer_steps", $3); };
-
 o_mom_se_tolx : SE_TOLX EQUAL non_negative_number { driver.option_num("mom.se_tolx", $3); };
+o_irf_matching_file : IRF_MATCHING_FILE EQUAL filename { driver.option_str("mom.irf_matching_file.name", $3); };
+o_add_tiny_number_to_cholesky : ADD_TINY_NUMBER_TO_CHOLESKY EQUAL non_negative_number { driver.option_num("add_tiny_number_to_cholesky", $3); };
 
 o_analytical_girf : ANALYTICAL_GIRF { driver.option_num("irf_opt.analytical_GIRF", "true"); };
 o_irf_in_percent : IRF_IN_PERCENT { driver.option_num("irf_opt.percent", "true"); };
@@ -4147,7 +4182,6 @@ o_tol_deriv : TOL_DERIV EQUAL non_negative_number { driver.option_num("tol_deriv
 o_tol_sv : TOL_SV EQUAL non_negative_number { driver.option_num("tol_sv", $3); };
 o_checks_via_subsets : CHECKS_VIA_SUBSETS EQUAL INT_NUMBER { driver.option_num("checks_via_subsets", $3); };
 o_max_dim_subsets_groups : MAX_DIM_SUBSETS_GROUPS EQUAL INT_NUMBER { driver.option_num("max_dim_subsets_groups", $3); };
-o_zero_moments_tolerance : ZERO_MOMENTS_TOLERANCE EQUAL non_negative_number { driver.option_num("zero_moments_tolerance", $3); };
 o_block_static : BLOCK_STATIC { driver.option_num("block_static","true"); };
 o_block_dynamic : BLOCK_DYNAMIC { driver.option_num("block_dynamic","true"); };
 o_incidence : INCIDENCE { driver.option_num("incidence","true"); };
diff --git a/src/DynareFlex.ll b/src/DynareFlex.ll
index c98f582962a6436164789b8945231acae093215c..921d716f28ff0980c341e940f8de9f5f6a8b2c1c 100644
--- a/src/DynareFlex.ll
+++ b/src/DynareFlex.ll
@@ -734,11 +734,14 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4])
 }
 <DYNARE_STATEMENT>gmm {return token::GMM;}
 <DYNARE_STATEMENT>smm {return token::SMM;}
+<DYNARE_STATEMENT>irf_matching {return token::IRF_MATCHING;}
+<DYNARE_STATEMENT>stoch_simul {return token::STOCH_SIMUL;}
 <DYNARE_STATEMENT>weighting_matrix {return token::WEIGHTING_MATRIX; }
 <DYNARE_STATEMENT>weighting_matrix_scaling_factor {return token::WEIGHTING_MATRIX_SCALING_FACTOR; }
 <DYNARE_STATEMENT>analytic_standard_errors {return token::ANALYTIC_STANDARD_ERRORS; }
 <DYNARE_STATEMENT>analytic_jacobian {return token::ANALYTIC_JACOBIAN; }
 <DYNARE_STATEMENT>mom_method {return token::MOM_METHOD; }
+<DYNARE_STATEMENT>simulation_method {return token::SIMULATION_METHOD; }
 <DYNARE_STATEMENT>penalized_estimator {return token::PENALIZED_ESTIMATOR; }
 <DYNARE_STATEMENT>verbose {return token::VERBOSE; }
 <DYNARE_STATEMENT>simulation_multiple {return token::SIMULATION_MULTIPLE; }
@@ -746,6 +749,9 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4])
 <DYNARE_STATEMENT>seed {return token::SEED; }
 <DYNARE_STATEMENT>se_tolx {return token::SE_TOLX;}
 <DYNARE_STATEMENT>bounded_shock_support {return token::BOUNDED_SHOCK_SUPPORT; }
+<DYNARE_STATEMENT>irf_matching_file {return token::IRF_MATCHING_FILE;}
+<DYNARE_STATEMENT>add_tiny_number_to_cholesky {return token::ADD_TINY_NUMBER_TO_CHOLESKY; }
+
 <DYNARE_STATEMENT>analytical_girf {return token::ANALYTICAL_GIRF; }
 <DYNARE_STATEMENT>irf_in_percent {return token::IRF_IN_PERCENT; }
 <DYNARE_STATEMENT>emas_girf {return token::EMAS_GIRF; }
@@ -765,7 +771,6 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4])
 <DYNARE_STATEMENT>tol_sv {return token::TOL_SV;}
 <DYNARE_STATEMENT>checks_via_subsets {return token::CHECKS_VIA_SUBSETS;}
 <DYNARE_STATEMENT>max_dim_subsets_groups {return token::MAX_DIM_SUBSETS_GROUPS;}
-<DYNARE_STATEMENT>zero_moments_tolerance {return token::ZERO_MOMENTS_TOLERANCE;}
 <DYNARE_STATEMENT>max_nrows {return token::MAX_NROWS;}
 <DYNARE_STATEMENT>with_epilogue {return token::WITH_EPILOGUE;}
 <DYNARE_STATEMENT>heteroskedastic_filter {return token::HETEROSKEDASTIC_FILTER;}
diff --git a/src/ModFile.cc b/src/ModFile.cc
index ae13c4ba143764ebd7e5fc0bf4eddd744d35b0bc..ab261c46307bdcc66096baf7655be9c60a3ef6d2 100644
--- a/src/ModFile.cc
+++ b/src/ModFile.cc
@@ -1036,7 +1036,9 @@ ModFile::writeMOutput(const string &basename, bool clear_all, bool clear_global,
                   << "if exist('dataset_info', 'var') == 1" << endl
                   << "  save([M_.dname filesep 'Output' filesep '" << basename << "_results.mat'], 'dataset_info', '-append');" << endl << "end" << endl
                   << "if exist('oo_recursive_', 'var') == 1" << endl
-                  << "  save([M_.dname filesep 'Output' filesep '" << basename << "_results.mat'], 'oo_recursive_', '-append');" << endl << "end" << endl;
+                  << "  save([M_.dname filesep 'Output' filesep '" << basename << "_results.mat'], 'oo_recursive_', '-append');" << endl << "end" << endl
+                  << "if exist('options_mom_', 'var') == 1" << endl
+                  << "  save([M_.dname filesep 'Output' filesep '" << basename << "_results.mat'], 'options_mom_', '-append');" << endl << "end" << endl;
 
       config_file.writeEndParallel(mOutputFile);