diff --git a/CodeInterpreter.hh b/CodeInterpreter.hh
index f730cbbc94ea013df5953d1b0a694de32ca17229..964d05c8910ad7165292ab2dba5e71bb2cdd2ccd 100644
--- a/CodeInterpreter.hh
+++ b/CodeInterpreter.hh
@@ -140,14 +140,15 @@ enum BlockSimulationType
 /*! Warning: do not to change existing values for 0 to 4: the values matter for homotopy_setup command */
 enum SymbolType
   {
-    eEndogenous = 0,               //!< Endogenous
-    eExogenous = 1,                //!< Exogenous
-    eExogenousDet = 2,             //!< Exogenous deterministic
-    eParameter = 4,                //!< Parameter
-    eModelLocalVariable = 10,      //!< Local variable whose scope is model (pound expression)
-    eModFileLocalVariable = 11,    //!< Local variable whose scope is mod file (model excluded)
-    eExternalFunction = 12,        //!< External (user-defined) function
-    eTrend = 13                    //!< Trend variable
+    eEndogenous = 0,                //!< Endogenous
+    eExogenous = 1,                 //!< Exogenous
+    eExogenousDet = 2,              //!< Exogenous deterministic
+    eParameter = 4,                 //!< Parameter
+    eModelLocalVariable = 10,       //!< Local variable whose scope is model (pound expression)
+    eModFileLocalVariable = 11,     //!< Local variable whose scope is mod file (model excluded)
+    eExternalFunction = 12,         //!< External (user-defined) function
+    eTrend = 13,                    //!< Trend variable
+    eStatementDeclaredVariable = 14 //!< Local variable assigned within a Statement (see subsample statement for example)
   };
 
 enum ExpressionType
diff --git a/ComputingTasks.cc b/ComputingTasks.cc
index aa3029dd78ce18a008c1d8780b7f76f1ac7ee7a1..aae564fe849c5bd38c1a19d1dc2371421d3b2970 100644
--- a/ComputingTasks.cc
+++ b/ComputingTasks.cc
@@ -1522,6 +1522,15 @@ BasicPriorStatement::checkPass(ModFileStructure &mod_file_struct)
       cerr << "ERROR: You must pass the shape option to the prior statement." << endl;
       exit(EXIT_FAILURE);
     }
+  if (options_list.num_options.find("date1") != options_list.num_options.end() ||
+      options_list.num_options.find("date2") != options_list.num_options.end())
+    if (options_list.num_options.find("date1") == options_list.num_options.end() ||
+        options_list.num_options.find("date2") == options_list.num_options.end())
+      {
+        cerr << "ERROR: PriorStatement::checkPass(1). Should not arrive here. "
+             << "Please inform Dynare Team." << endl;
+        exit(EXIT_FAILURE);
+      }
 }
 
 void
@@ -1556,10 +1565,16 @@ BasicPriorStatement::writeVarianceOption(ostream &output, const string &lhs_fiel
 void
 BasicPriorStatement::writeOutputHelper(ostream &output, const string &field, const string &lhs_field) const
 {
-  OptionsList::num_options_t::const_iterator it = options_list.num_options.find(field);
-  if (it != options_list.num_options.end())
+
+  OptionsList::num_options_t::const_iterator itn = options_list.num_options.find(field);
+  if (itn != options_list.num_options.end())
+    output << "estimation_info" << lhs_field << "(prior_indx)." << field
+           << " = " << itn->second << ";" << endl;
+
+  OptionsList::date_options_t::const_iterator itd = options_list.date_options.find(field);
+  if (itd != options_list.date_options.end())
     output << "estimation_info" << lhs_field << "(prior_indx)." << field
-           << " = " << it->second << ";" << endl;
+           << " = '" << itd->second << "';" << endl;
 }
 
 PriorStatement::PriorStatement(const string &name_arg,
@@ -1592,6 +1607,8 @@ PriorStatement::writeOutput(ostream &output, const string &basename) const
   writeOutputHelper(output, "stdev", lhs_field);
   writeOutputHelper(output, "shape", lhs_field);
   writeOutputHelper(output, "shift", lhs_field);
+  writeOutputHelper(output, "date1", lhs_field);
+  writeOutputHelper(output, "date2", lhs_field);
   writeOutputHelper(output, "domain", lhs_field);
   writeOutputHelper(output, "interval", lhs_field);
   BasicPriorStatement::writeVarianceOption(output, lhs_field);
diff --git a/DynareBison.yy b/DynareBison.yy
index 299bae37d8e0a192c6203d303a15f67ef0ac187d..0dcbffb64cc5f12739f94a1d3be7506cec6c0bd5 100644
--- a/DynareBison.yy
+++ b/DynareBison.yy
@@ -105,7 +105,7 @@ class ParsingDriver;
 %token <string_val> INT_NUMBER
 %token <string_val> DATE_NUMBER
 %token INV_GAMMA_PDF INV_GAMMA1_PDF INV_GAMMA2_PDF IRF IRF_SHOCKS
-%token KALMAN_ALGO KALMAN_TOL
+%token KALMAN_ALGO KALMAN_TOL SUBSAMPLES
 %token LABELS LAPLACE LIK_ALGO LIK_INIT LINEAR LOAD_IDENT_FILES LOAD_MH_FILE LOAD_PARAMS_AND_STEADY_STATE LOGLINEAR
 %token MARKOWITZ MARGINAL_DENSITY MAX MAXIT
 %token MFS MH_DROP MH_INIT_SCALE MH_JSCALE MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER MIN MINIMAL_SOLVING_PERIODS
@@ -217,6 +217,7 @@ statement : parameters
           | set_time
           | data
           | prior
+          | subsamples
           | varobs
           | observation_trends
           | unit_root_vars
@@ -1197,8 +1198,21 @@ data_options : o_file
              | o_xls_range
              ;
 
+subsamples : symbol '.' SUBSAMPLES '(' subsamples_name_list ')' ';'
+             { driver.set_subsamples($1); }
+           ;
+
+subsamples_name_list : subsamples_name_list COMMA o_subsample_name
+                     | o_subsample_name
+                     ;
+
 prior : symbol '.' PRIOR '(' prior_options_list ')' ';'
         { driver.set_prior($1); }
+      | symbol '.' symbol '.' PRIOR '(' prior_options_list ')' ';'
+        {
+          driver.add_subsample_range(new string (*$1), $3);
+          driver.set_prior($1);
+        }
       | STD '(' symbol ')' '.' PRIOR '(' prior_options_list ')' ';'
         { driver.set_std_prior($3); }
       | CORR '(' symbol COMMA symbol')' '.' PRIOR '(' prior_options_list ')' ';'
@@ -1955,6 +1969,12 @@ o_nograph : NOGRAPH
           | GRAPH
             { driver.option_num("nograph", "0"); }
           ;
+o_subsample_name : symbol EQUAL date_number ':' date_number
+                   {
+                     driver.declare_statement_local_variable(new string (*$1));
+                     driver.set_subsample_name_equal_to_date_range($1, $3, $5);
+                   }
+                 ;
 o_conf_sig : CONF_SIG EQUAL non_negative_number { driver.option_num("conf_sig", $3); };
 o_mh_replic : MH_REPLIC EQUAL INT_NUMBER { driver.option_num("mh_replic", $3); };
 o_mh_drop : MH_DROP EQUAL non_negative_number { driver.option_num("mh_drop", $3); };
diff --git a/DynareFlex.ll b/DynareFlex.ll
index 56afce82ef6bb4abb0c42624e0d3f09783170860..d0ff91fd7933e9eeada1aa6b82f476de949bd326 100644
--- a/DynareFlex.ll
+++ b/DynareFlex.ll
@@ -189,6 +189,7 @@ string eofbuff;
  /* End of a Dynare block */
 <DYNARE_BLOCK>end 	{BEGIN INITIAL; return token::END;}
 
+<DYNARE_STATEMENT>subsamples {return token::SUBSAMPLES;}
 <DYNARE_STATEMENT>prior {return token::PRIOR;}
 <INITIAL>std {BEGIN DYNARE_STATEMENT; return token::STD;}
 <INITIAL>corr {BEGIN DYNARE_STATEMENT; return token::CORR;}
diff --git a/ExprNode.cc b/ExprNode.cc
index 0f1f63763c3788f5c8241c051f33c3115b55a927..0a8a06a947bd132615ea1201b2c715c8dae1d5c7 100644
--- a/ExprNode.cc
+++ b/ExprNode.cc
@@ -496,6 +496,7 @@ VariableNode::prepareForDerivation()
       non_null_derivatives = datatree.local_variables_table[symb_id]->non_null_derivatives;
       break;
     case eModFileLocalVariable:
+    case eStatementDeclaredVariable:
       // Such a variable is never derived
       break;
     case eExternalFunction:
@@ -523,6 +524,9 @@ VariableNode::computeDerivative(int deriv_id)
     case eModFileLocalVariable:
       cerr << "ModFileLocalVariable is not derivable" << endl;
       exit(EXIT_FAILURE);
+    case eStatementDeclaredVariable:
+      cerr << "eStatementDeclaredVariable is not derivable" << endl;
+      exit(EXIT_FAILURE);
     case eExternalFunction:
       cerr << "Impossible case!" << endl;
       exit(EXIT_FAILURE);
@@ -735,6 +739,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
 
     case eExternalFunction:
     case eTrend:
+    case eStatementDeclaredVariable:
       cerr << "Impossible case" << endl;
       exit(EXIT_FAILURE);
     }
@@ -917,6 +922,9 @@ VariableNode::getChainRuleDerivative(int deriv_id, const map<int, expr_t> &recur
     case eModFileLocalVariable:
       cerr << "ModFileLocalVariable is not derivable" << endl;
       exit(EXIT_FAILURE);
+    case eStatementDeclaredVariable:
+      cerr << "eStatementDeclaredVariable is not derivable" << endl;
+      exit(EXIT_FAILURE);
     case eExternalFunction:
       cerr << "Impossible case!" << endl;
       exit(EXIT_FAILURE);
diff --git a/ParsingDriver.cc b/ParsingDriver.cc
index 9cf200c89fd54def8ece0410b03404de46b1ad09..c16e6fedd87e6264664b802fb5230e91c589a260 100644
--- a/ParsingDriver.cc
+++ b/ParsingDriver.cc
@@ -175,6 +175,16 @@ ParsingDriver::declare_parameter(string *name, string *tex_name)
     delete tex_name;
 }
 
+void
+ParsingDriver::declare_statement_local_variable(string *name)
+{
+  if (mod_file->symbol_table.exists(*name))
+    error("Symbol " + *name + " cannot be assigned within a statement " +
+          "while being assigned elsewhere in the modfile");
+  declare_symbol(name, eStatementDeclaredVariable, NULL);
+  delete name;
+}
+
 void
 ParsingDriver::declare_optimal_policy_discount_factor_parameter(expr_t exprnode)
 {
@@ -1224,6 +1234,56 @@ ParsingDriver::estimation_data()
   options_list.clear();
 }
 
+void
+ParsingDriver::set_subsamples(string *name)
+{
+  check_symbol_is_parameter(name);
+  if (subsample_declarations.find(*name) != subsample_declarations.end())
+    error("Parameter " + *name + " has more than one subsample statement." +
+          "You may only have one subsample statement per parameter.");
+  subsample_declarations[*name] = subsample_declaration_map;
+  subsample_declaration_map.clear();
+  delete name;
+}
+
+void
+ParsingDriver::check_symbol_is_statement_variable(string *name)
+{
+  check_symbol_existence(*name);
+  int symb_id = mod_file->symbol_table.getID(*name);
+  if (mod_file->symbol_table.getType(symb_id) != eStatementDeclaredVariable)
+    error(*name + " is not a variable assigned in a statement");
+}
+
+void
+ParsingDriver::set_subsample_name_equal_to_date_range(string *name, string *date1, string *date2)
+{
+  check_symbol_is_statement_variable(name);
+  if (subsample_declaration_map.find(*name) != subsample_declaration_map.end())
+    error("Symbol " + *name + " may only be assigned once in a SUBSAMPLE statement");
+  subsample_declaration_map[*name] = make_pair(*date1, *date2);
+  delete name;
+  delete date1;
+  delete date2;
+}
+
+void
+ParsingDriver::add_subsample_range(string *parameter, string *subsample_name)
+{
+  check_symbol_is_parameter(parameter);
+  check_symbol_is_statement_variable(subsample_name);
+  subsample_declarations_t::const_iterator it = subsample_declarations.find(*parameter);
+  if (it == subsample_declarations.end())
+    error("A subsample statement has not been issued for " + *parameter);
+  subsample_declaration_map_t tmp_map = it->second;
+  if (tmp_map.find(*subsample_name) == tmp_map.end())
+    error("The subsample name " + *subsample_name + " was not previously declared in a subsample statement.");
+  option_date("date1", tmp_map[*subsample_name].first);
+  option_date("date2", tmp_map[*subsample_name].second);
+  delete parameter;
+  delete subsample_name;
+}
+
 void
 ParsingDriver::set_prior(string *name)
 {
diff --git a/ParsingDriver.hh b/ParsingDriver.hh
index 6c35297e807b2f84962491c3c4932ed288a32cc7..0deebfd147909729e7efac6a9f3500fb9fd58544 100644
--- a/ParsingDriver.hh
+++ b/ParsingDriver.hh
@@ -84,6 +84,9 @@ private:
   //! Checks that a given symbol exists and is a parameter, and stops with an error message if it isn't
   void check_symbol_is_parameter(string *name);
 
+  //! Checks that a given symbol was assigned within a Statement
+  void check_symbol_is_statement_variable(string *name);
+
   //! Checks that a given symbol exists and is a endogenous or exogenous, and stops with an error message if it isn't
   void check_symbol_is_endogenous_or_exogenous(string *name);
 
@@ -186,6 +189,12 @@ private:
   vector<int> declared_nonstationary_vars;
   //! Temporary storage for a variance declared in the prior statement
   expr_t prior_variance;
+  //! Temporary storage for declaring subsamples: map<statement_local_var, <date1, date2 >
+  typedef map<string, pair<string, string> > subsample_declaration_map_t;
+  subsample_declaration_map_t subsample_declaration_map;
+  //! Temporary storage for subsample statement: map<parameter, subsample_declaration_map >
+  typedef map<string, subsample_declaration_map_t > subsample_declarations_t;
+  subsample_declarations_t subsample_declarations;
   //! reset the values for temporary storage
   void reset_current_external_function_options();
   //! Adds a model lagged variable to ModelTree and VariableTable
@@ -239,6 +248,14 @@ public:
   void declare_exogenous_det(string *name, string *tex_name = NULL);
   //! Declares a parameter
   void declare_parameter(string *name, string *tex_name = NULL);
+  //! Declares a statement local variable
+  void declare_statement_local_variable(string *name);
+  //! Completes a subsample statement
+  void set_subsamples(string *name);
+  //! Declares a subsample, assigning the value to name
+  void set_subsample_name_equal_to_date_range(string *name, string *date1, string *date2);
+  //! Adds a subsample range to the list of options for the prior statement
+  void add_subsample_range(string *parameter, string *subsample_name);
   //! Declares declare_optimal_policy_discount_factor as a parameter and initializes it to exprnode
   void declare_optimal_policy_discount_factor_parameter(expr_t exprnode);
   //! Adds a predetermined_variable
@@ -375,8 +392,6 @@ public:
   void set_std_prior(string *arg);
   //! Sets the prior for estimated correlation
   void set_corr_prior(string *arg1, string *arg2);
-  //! Sets the subsamples for a parameter
-  void set_subsamples(string *arg);
   //! Runs estimation process
   void run_estimation();
   //! Runs dynare_sensitivy()