diff --git a/doc/dynare.texi b/doc/dynare.texi
index afd6ec22a79a96504f4559bb3ca71e9e94f39ce5..6a814468930106ae7fe116fbccb9b082b269081b 100644
--- a/doc/dynare.texi
+++ b/doc/dynare.texi
@@ -5300,6 +5300,9 @@ filtered variables and forecasts (when requested) on all the observed
 variables. This is equivalent to manually listing all the observed
 variables after the @code{estimation} command.
 
+@item number_of_particles = @var{INTEGER}
+Number of particles used when evaluating the likelihood of a non linear state space model. Default: @code{1000}.
+
 @end table
 
 @customhead{Note}
diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy
index 0c754a4bc06edef53640eedf800aec4df12c14d7..44b42e37aeb94c3253126256a9fb49ca3e3f1eee 100644
--- a/preprocessor/DynareBison.yy
+++ b/preprocessor/DynareBison.yy
@@ -107,6 +107,7 @@ class ParsingDriver;
 %token MFS MH_CONF_SIG MH_DROP MH_INIT_SCALE MH_JSCALE MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER POSTERIOR_MAX_SUBSAMPLE_DRAWS MIN MINIMAL_SOLVING_PERIODS
 %token MODE_CHECK MODE_CHECK_NEIGHBOURHOOD_SIZE MODE_CHECK_SYMMETRIC_PLOTS MODE_CHECK_NUMBER_OF_POINTS MODE_COMPUTE MODE_FILE MODEL MODEL_COMPARISON MODEL_INFO MSHOCKS ABS SIGN
 %token MODEL_DIAGNOSTICS MODIFIEDHARMONICMEAN MOMENTS_VARENDO DIFFUSE_FILTER SUB_DRAWS TAPER_STEPS GEWEKE_INTERVAL MCMC_JUMPING_COVARIANCE MOMENT_CALIBRATION
+%token NUMBER_OF_PARTICLES
 %token <string_val> NAME
 %token NAN_CONSTANT NO_STATIC NOBS NOCONSTANT NODISPLAY NOCORR NODIAGNOSTIC NOFUNCTIONS NO_HOMOTOPY
 %token NOGRAPH NOMOMENTS NOPRINT NORMAL_PDF SAVE_DRAWS
@@ -1676,6 +1677,7 @@ estimation_options : o_datafile
                    | o_posterior_max_subsample_draws
                    | o_consider_all_endogenous
                    | o_consider_only_observed
+		   | o_number_of_particles
                    ;
 
 list_optim_option : QUOTED_STRING COMMA QUOTED_STRING
@@ -2638,6 +2640,8 @@ o_bvar_prior_flat : BVAR_PRIOR_FLAT { driver.option_num("bvar_prior_flat", "1");
 o_bvar_prior_train : BVAR_PRIOR_TRAIN EQUAL INT_NUMBER { driver.option_num("bvar_prior_train", $3); };
 o_bvar_replic : BVAR_REPLIC EQUAL INT_NUMBER { driver.option_num("bvar_replic", $3); };
 
+o_number_of_particles : NUMBER_OF_PARTICLES EQUAL INT_NUMBER { driver.option_num("particle.number_of_particles", $3); };
+
 o_gsa_identification : IDENTIFICATION EQUAL INT_NUMBER { driver.option_num("identification", $3); }; /*not in doc */
 o_gsa_morris : MORRIS EQUAL INT_NUMBER { driver.option_num("morris", $3); };
 o_gsa_stab : STAB  EQUAL INT_NUMBER { driver.option_num("stab", $3); };
diff --git a/preprocessor/DynareFlex.ll b/preprocessor/DynareFlex.ll
index a552f19973237dd2298e4a5c11e466c30c2b1f17..37386530a0ac57fbbda0b7fb7709a0e59b5f58fe 100644
--- a/preprocessor/DynareFlex.ll
+++ b/preprocessor/DynareFlex.ll
@@ -352,6 +352,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>use_univariate_filters_if_singularity_is_detected {return token::USE_UNIVARIATE_FILTERS_IF_SINGULARITY_IS_DETECTED;}
 <DYNARE_STATEMENT>hybrid {return token::HYBRID;}
 <DYNARE_STATEMENT>default {return token::DEFAULT;}
+<DYNARE_STATEMENT>number_of_particles {return token::NUMBER_OF_PARTICLES;}
 <DYNARE_STATEMENT>alpha {
   yylval->string_val = new string(yytext);
   return token::ALPHA;