diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc
index 11682d52c997f160ce8e319e299711ceeab7e132..949914e2cde12018c39d9728afd0b0e2e8628a73 100644
--- a/src/ComputingTasks.cc
+++ b/src/ComputingTasks.cc
@@ -146,7 +146,9 @@ SimulStatement::writeOutput(ostream &output, const string &basename, bool minima
       it != options_list_new.string_options.end())
     {
       output << "options_.initval_file = true;" << endl
-             << "initvalf('" << it->second << "');" << endl;
+             << "options_initvalf = struct();" << endl
+             << "options_initvalf.datafile = '" << it->second << "';" << endl
+             << "oo_.initval_series = histvalf_initvalf('INITVALF', M_, options_initvalf);" << endl;
       options_list_new.string_options.erase(it);
     }
   options_list_new.writeOutput(output);
@@ -179,7 +181,9 @@ PerfectForesightSetupStatement::writeOutput(ostream &output, const string &basen
       it != options_list_new.string_options.end())
     {
       output << "options_.initval_file = true;" << endl
-             << "initvalf('" << it->second << "');" << endl;
+             << "options_initvalf = struct();" << endl
+             << "options_initvalf.datafile = '" << it->second << "';" << endl
+             << "oo_.initval_series = histvalf_initvalf('INITVALF', M_, options_initvalf);" << endl;
       options_list_new.string_options.erase(it);
     }
   options_list_new.writeOutput(output);
diff --git a/src/DynareBison.yy b/src/DynareBison.yy
index 79563148d84363661e462d3fd30d207acc8abf6a..c8294fbba535d74b06629ddf0e90b8bdb226625f 100644
--- a/src/DynareBison.yy
+++ b/src/DynareBison.yy
@@ -82,7 +82,8 @@ class ParsingDriver;
 %token COMMA CONSIDER_ALL_ENDOGENOUS CONSIDER_ONLY_OBSERVED INITIAL_CONDITION_DECOMPOSITION
 %token DATAFILE FILE SERIES DET_COND_FORECAST DOUBLING DR_CYCLE_REDUCTION_TOL DR_LOGARITHMIC_REDUCTION_TOL DR_LOGARITHMIC_REDUCTION_MAXITER DR_ALGO DROP DSAMPLE DYNASAVE DYNATYPE CALIBRATION DIFFERENTIATE_FORWARD_VARS
 %token END ENDVAL EQUAL ESTIMATION ESTIMATED_PARAMS ESTIMATED_PARAMS_BOUNDS ESTIMATED_PARAMS_INIT EXTENDED_PATH ENDOGENOUS_PRIOR EXPRESSION
-%token FILENAME DIRNAME FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS LAST_OBS SET_TIME OSR_PARAMS_BOUNDS KEEP_KALMAN_ALGO_IF_SINGULARITY_IS_DETECTED
+%token FILENAME DIRNAME FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS FIRST_SIMULATION_PERIOD LAST_OBS 
+%token SET_TIME OSR_PARAMS_BOUNDS KEEP_KALMAN_ALGO_IF_SINGULARITY_IS_DETECTED
 %token <string> FLOAT_NUMBER DATES
 %token DEFAULT FIXED_POINT FLIP OPT_ALGO COMPILATION_SETUP COMPILER ADD_FLAGS SUBSTITUTE_FLAGS ADD_LIBS SUBSTITUTE_LIBS
 %token FORECAST K_ORDER_SOLVER INSTRUMENTS SHIFT MEAN STDEV VARIANCE MODE INTERVAL SHAPE DOMAINN
@@ -851,9 +852,27 @@ initval : INITVAL ';' initval_list END ';'
           { driver.end_initval(true); }
         ;
 
-initval_file : INITVAL_FILE '(' FILENAME EQUAL filename ')' ';'
-               { driver.initval_file($5); }
-             ;
+histval_file : HISTVAL_FILE '(' h_options_list ')' ';'
+              { driver.histval_file();};
+
+initval_file : INITVAL_FILE '(' h_options_list ')' ';'
+              { driver.initval_file();};
+
+h_options_list: h_options_list COMMA h_options
+               | h_options
+               ;
+
+h_options: o_filename
+          | o_datafile
+          | o_first_obs
+          | o_data_first_obs
+          | o_first_simulation_period
+          | o_date_first_simulation_period
+          | o_last_obs
+          | o_data_last_obs
+          | o_nobs
+          | o_series2
+          ;
 
 endval : ENDVAL ';' initval_list END ';'
          { driver.end_endval(false); }
@@ -879,10 +898,6 @@ histval_list : histval_list histval_elem
 
 histval_elem : symbol '(' signed_integer ')' EQUAL expression ';' { driver.hist_val($1, $3, $6); };
 
-histval_file : HISTVAL_FILE '(' FILENAME EQUAL filename ')' ';'
-               { driver.histval_file($5); }
-             ;
-
 epilogue : EPILOGUE ';' { driver.begin_epilogue(); }
            epilogue_equation_list END ';' { driver.end_epilogue(); }
          ;
@@ -3227,7 +3242,9 @@ o_pac_steady_state_growth : STEADY_STATE_GROWTH EQUAL signed_number { driver.set
 o_var_name : MODEL_NAME EQUAL symbol { driver.option_str("var.model_name", $3); };
 o_var_order : ORDER EQUAL INT_NUMBER { driver.option_num("var.order", $3); };
 o_series : SERIES EQUAL symbol { driver.option_str("series", $3); };
+o_series2 : SERIES EQUAL symbol { driver.option_num("series", $3); };
 o_datafile : DATAFILE EQUAL filename { driver.option_str("datafile", $3); };
+o_filename : FILENAME EQUAL filename { driver.option_str("filename", $3); };
 o_var_datafile : DATAFILE EQUAL filename { driver.option_str("var_estimation.datafile", $3); };
 o_var_model_name : symbol { driver.option_str("var_estimation.model_name", $1); };
 o_var_eq_tags : EQTAGS EQUAL vec_str { driver.option_vec_str("var.eqtags", $3); }
@@ -3255,6 +3272,9 @@ o_posterior_sampling_method : POSTERIOR_SAMPLING_METHOD EQUAL QUOTED_STRING
                               { driver.option_str("posterior_sampler_options.posterior_sampling_method", $3); } ;
 o_first_obs : FIRST_OBS EQUAL INT_NUMBER { driver.option_num("first_obs", $3); };
 o_data_first_obs : FIRST_OBS EQUAL date_expr { driver.option_date("firstobs", $3); } ;
+o_first_simulation_period : FIRST_SIMULATION_PERIOD EQUAL INT_NUMBER { driver.option_num("first_simulation_period", $3); };
+o_date_first_simulation_period : FIRST_SIMULATION_PERIOD EQUAL date_expr { driver.option_date("firstsimulationperiod", $3); } ;
+o_last_obs : LAST_OBS EQUAL INT_NUMBER { driver.option_num("last_obs", $3); };
 o_data_last_obs : LAST_OBS EQUAL date_expr { driver.option_date("lastobs", $3); } ;
 o_keep_kalman_algo_if_singularity_is_detected : KEEP_KALMAN_ALGO_IF_SINGULARITY_IS_DETECTED { driver.option_num("kalman.keep_kalman_algo_if_singularity_is_detected", "true"); } ;
 o_data_nobs : NOBS EQUAL INT_NUMBER { driver.option_num("nobs", $3); };
diff --git a/src/DynareFlex.ll b/src/DynareFlex.ll
index 5a79add0ae625e2577c21aa0b6e0658c28913b66..47ccde607f2a1a309c26a223ab60d2d7100c5f59 100644
--- a/src/DynareFlex.ll
+++ b/src/DynareFlex.ll
@@ -437,6 +437,7 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4])
 <DYNARE_STATEMENT>expression    {return token::EXPRESSION;}
 <DYNARE_STATEMENT>occbin_likelihood {return token::OCCBIN_LIKELIHOOD;}
 <DYNARE_STATEMENT>occbin_smoother {return token::OCCBIN_SMOOTHER;}
+<DYNARE_STATEMENT>first_simulation_period {return token::FIRST_SIMULATION_PERIOD;}
 
 <DYNARE_STATEMENT>alpha {
   yylval->build<string>(yytext);
diff --git a/src/NumericalInitialization.cc b/src/NumericalInitialization.cc
index 12eeb420428817e6570503a2adceef249ddb2f36..ad19ffc9f842097a29ffa5986043cc8671be86f9 100644
--- a/src/NumericalInitialization.cc
+++ b/src/NumericalInitialization.cc
@@ -411,8 +411,8 @@ HistValStatement::writeJsonOutput(ostream &output) const
   output << "]}";
 }
 
-InitvalFileStatement::InitvalFileStatement(string filename_arg) :
-  filename{move(filename_arg)}
+InitvalFileStatement::InitvalFileStatement(OptionsList options_list_arg) :
+  options_list{move(options_list_arg)}
 {
 }
 
@@ -422,35 +422,49 @@ InitvalFileStatement::writeOutput(ostream &output, const string &basename, bool
   output << "%" << endl
          << "% INITVAL_FILE statement" << endl
          << "%" << endl
-         << "options_.initval_file = true;" << endl
-         << "initvalf('" << filename << "');" << endl;
+         << "options_.initval_file = true;" << endl;
+  options_list.writeOutput(output, "options_initvalf");
+  output << "oo_.initval_series = initvalf(M_, options_initvalf);" << endl;
 }
 
 void
 InitvalFileStatement::writeJsonOutput(ostream &output) const
 {
-  output << R"({"statementName": "init_val_file")"
-         << R"(, "filename": ")" << filename << R"(")"
-         << "}";
+  output << R"({"statementName": "initval_file")";
+  if (options_list.getNumberOfOptions())
+    {
+      output << ", ";
+      options_list.writeJsonOutput(output);
+    }
+  output << "}";
 }
 
-HistvalFileStatement::HistvalFileStatement(string filename_arg) :
-  filename{move(filename_arg)}
+HistvalFileStatement::HistvalFileStatement(OptionsList options_list_arg) :
+  options_list{move(options_list_arg)}
 {
 }
 
 void
 HistvalFileStatement::writeOutput(ostream &output, const string &basename, bool minimal_workspace) const
 {
-  output << "histvalf('" << filename << "');" << endl;
+  output << "%" << endl
+         << "% HISTVAL_FILE statement" << endl
+         << "%" << endl
+         << "options_.histval_file = true;" << endl;
+  options_list.writeOutput(output, "options_histvalf");
+  output << "[M_.endo_histval, M_.exo_histval, M_.exo_det_histval] = histvalf(M_, options_histvalf);" << endl;
 }
 
 void
 HistvalFileStatement::writeJsonOutput(ostream &output) const
 {
-  output << R"({"statementName": "hist_val_file")"
-         << R"(, "filename": ")" << filename << R"(")"
-         << "}";
+  output << R"({"statementName": "histval_file")";
+  if (options_list.getNumberOfOptions())
+    {
+      output << ", ";
+      options_list.writeJsonOutput(output);
+    }
+  output << "}";
 }
 
 HomotopyStatement::HomotopyStatement(homotopy_values_t homotopy_values_arg,
diff --git a/src/NumericalInitialization.hh b/src/NumericalInitialization.hh
index 93b24f9d9040a2d0ac56037999099a9139daf8be..6a114b7fb1c33d9bb7d0cec4683ee4edddf07684 100644
--- a/src/NumericalInitialization.hh
+++ b/src/NumericalInitialization.hh
@@ -123,9 +123,9 @@ public:
 class InitvalFileStatement : public Statement
 {
 private:
-  const string filename;
+  const OptionsList options_list;
 public:
-  explicit InitvalFileStatement(string filename_arg);
+  explicit InitvalFileStatement(OptionsList options_list_arg);
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
 };
@@ -133,9 +133,9 @@ public:
 class HistvalFileStatement : public Statement
 {
 private:
-  const string filename;
+  const OptionsList options_list;
 public:
-  explicit HistvalFileStatement(string filename_arg);
+  explicit HistvalFileStatement(OptionsList options_list_arg);
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
 };
diff --git a/src/ParsingDriver.cc b/src/ParsingDriver.cc
index ef1a36901399d8233d7f03a19a89cd91acf17060..a1df034f67309e08ffd6d71a5efe5b4dfb25a2d6 100644
--- a/src/ParsingDriver.cc
+++ b/src/ParsingDriver.cc
@@ -647,9 +647,10 @@ ParsingDriver::init_val(const string &name, expr_t rhs)
 }
 
 void
-ParsingDriver::initval_file(const string &filename)
+ParsingDriver::initval_file()
 {
-  mod_file->addStatement(make_unique<InitvalFileStatement>(filename));
+  mod_file->addStatement(make_unique<InitvalFileStatement>(options_list));
+  options_list.clear(); 
 }
 
 void
@@ -3345,9 +3346,10 @@ ParsingDriver::smoother2histval()
 }
 
 void
-ParsingDriver::histval_file(const string &filename)
+ParsingDriver::histval_file()
 {
-  mod_file->addStatement(make_unique<HistvalFileStatement>(filename));
+  mod_file->addStatement(make_unique<HistvalFileStatement>(options_list));
+  options_list.clear();
 }
 
 void
diff --git a/src/ParsingDriver.hh b/src/ParsingDriver.hh
index 7c8fec8526c3963af0eb8a78e31401e225bb1bd3..fa8a97368ad5a026f99d420837df2050446805f3 100644
--- a/src/ParsingDriver.hh
+++ b/src/ParsingDriver.hh
@@ -375,7 +375,7 @@ public:
   //! balanced_growth_test_tol option of model block
   void balanced_growth_test_tol(const string &value);
   //! Sets the FILENAME for the initial value in initval
-  void initval_file(const string &filename);
+  void initval_file();
   //! Declares an endogenous variable
   void declare_endogenous(const string &name, const string &tex_name = "", const vector<pair<string, string>> &partition_value = {});
   //! Declares an exogenous variable
@@ -889,7 +889,7 @@ public:
   //! End init2shocks declaration
   void end_init2shocks(const string &name);
   void smoother2histval();
-  void histval_file(const string &filename);
+  void histval_file();
   void perfect_foresight_setup();
   void perfect_foresight_solver();
   void prior_posterior_function(bool prior_func);