diff --git a/matlab/default_option_values.m b/matlab/default_option_values.m
index 8de89f5f7e6c0b4c00bbae1bcf58fedbe061add9..d3773fc9377e6432e8e1689878908ca1e5743213 100644
--- a/matlab/default_option_values.m
+++ b/matlab/default_option_values.m
@@ -12,7 +12,7 @@ function options_ = default_option_values(M_)
 % SPECIAL REQUIREMENTS
 %    none
 
-% Copyright © 2018-2023 Dynare Team
+% Copyright © 2018-2024 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -372,8 +372,8 @@ options_.initial_period = NaN; %dates(1,1);
 options_.no_init_estimation_check_first_obs=false;
 options_.dataset.file = [];
 options_.dataset.series = [];
-options_.dataset.firstobs = dates();
-options_.dataset.lastobs = dates();
+options_.dataset.first_obs = dates();
+options_.dataset.last_obs = dates();
 options_.dataset.nobs = NaN;
 options_.dataset.xls_sheet = [];
 options_.dataset.xls_range = [];
diff --git a/matlab/histvalf_initvalf.m b/matlab/histvalf_initvalf.m
index b9727f86eb7ec8a31c11ef7ab159311137a758db..36aaf6200502c6ddac171db34c5b5f9611fcbf6e 100644
--- a/matlab/histvalf_initvalf.m
+++ b/matlab/histvalf_initvalf.m
@@ -121,104 +121,82 @@ nobs0 = series.nobs;
 first_obs_ispresent = false;
 last_obs_ispresent = false;
 
-first_obs = periods(1);
 if isfield(options, 'first_obs') && ~isempty(options.first_obs)
-    if options.first_obs < 1
-        error('%s_FILE: first_obs must be a positive number', caller)
-    elseif options.first_obs > nobs0
-        error('%s_FILE: first_obs = %d is larger than the number of observations in the data file (%d)', ...
-                      caller, options.first_obs, nobs0)
-    elseif isfield(options, 'first_simulation_period')
-        if  options.first_obs == options.first_simulation_period - M_.orig_maximum_lag
-            first_obs = periods(options.first_obs);
+    if isa(options.first_obs, 'numeric')
+        if options.first_obs < 1
+            error('%s_FILE: first_obs must be a positive number', caller)
+        elseif options.first_obs > nobs0
+            error('%s_FILE: first_obs = %d is larger than the number of observations in the data file (%d)', ...
+                  caller, options.first_obs, nobs0)
         else
-            error('%s_FILE: first_obs = %d and first_simulation_period = %d have values inconsistent with a maximum lag of %d periods', ...
-                  caller, options.first_obs, options.first_simulation_period, M_.orig_maximum_lag)
-        end
-    elseif isfield(options, 'firstsimulationperiod')
-        if  periods(options.first_obs) == options.firstsimulationperiod - M_.orig_maximum_lag
             first_obs = periods(options.first_obs);
-        else
-            error('%s_FILE: first_obs = %d and first_simulation_period = %s have values inconsistent with a maximum lag of %d periods', ...
-                  caller, options.first_obs, options.firstsimulationperiod, M_.orig_maximum_lag)
         end
+    elseif isa(options.first_obs, 'dates')
+        first_obs = options.first_obs;
     else
-        first_obs = periods(options.first_obs);
+        error('Incorrect class for the value of first_obs option')
     end
-    first_obs_ispresent = true;
-end
-
-if isfield(options, 'firstobs') && ~isempty(options.firstobs)
     if isfield(options, 'first_simulation_period')
-        if  options.firstobs == periods(options.first_simulation_period) - M_.orig_maximum_lag
-            first_obs = options.firstobs;
-        else
-            error('%s_FILE: first_obs = %s and first_simulation_period = %d have values inconsistent with a maximum lag of %d periods', ...
-                  caller, options.firstobs, options.first_simulation_period, M_.orig_maximum_lag)
-        end
-    elseif isfield(options, 'firstsimulationperiod')
-        if  options.firstobs == options.firstsimulationperiod - M_.orig_maximum_lag
-            first_obs = options.firstobs;
+        if isa(options.first_simulation_period, 'numeric')
+            if first_obs ~= periods(options.first_simulation_period) - M_.orig_maximum_lag
+                error('%s_FILE: first_obs = %s and first_simulation_period = %d have values inconsistent with a maximum lag of %d periods', ...
+                      caller, first_obs, options.first_simulation_period, M_.orig_maximum_lag)
+            end
+        elseif isa(options.first_simulation_period, 'dates')
+            if first_obs ~= options.first_simulation_period - M_.orig_maximum_lag
+                error('%s_FILE: first_obs = %s and first_simulation_period = %s have values inconsistent with a maximum lag of %d periods', ...
+                      caller, first_obs, options.first_simulation_period, M_.orig_maximum_lag)
+            end
         else
-            error('%s_FILE: firstobs = %s and first_simulation_period = %s have values inconsistent with a maximum lag of %d periods', ...
-                  caller, options.firstobs, options.firstsimulationperiod, M_.orig_maximum_lag)
+            error('Incorrect class for the value of first_simulation_period option')
         end
-    else
-        first_obs = options.firstobs;
     end
     first_obs_ispresent = true;
+else
+    first_obs = periods(1);
 end
 
-if ~first_obs_ispresent
-    if isfield(options, 'first_simulation_period')
+if ~first_obs_ispresent && isfield(options, 'first_simulation_period')
+    if isa(options.first_simulation_period, 'numeric')
         if options.first_simulation_period < M_.orig_maximum_lag
             error('%s_FILE: first_simulation_period = %d must be larger than the maximum lag (%d)', ...
                   caller, options.first_simulation_period, M_.orig_maximum_lag)
         elseif options.first_simulation_period > nobs0
             error('%s_FILE: first_simulations_period = %d is larger than the number of observations in the data file (%d)', ...
-                          caller, options.first_obs, nobs0)
-        else
-            first_obs = periods(options.first_simulation_period) - M_.orig_maximum_lag;
+                  caller, options.first_obs, nobs0)
         end
+        first_obs = periods(options.first_simulation_period) - M_.orig_maximum_lag;
         first_obs_ispresent = true;
-    elseif isfield(options, 'firstsimulationperiod')
-        first_obs = options.firstsimulationperiod - M_.orig_maximum_lag;
+    elseif isa(options.first_simulation_period, 'dates')
+        first_obs = options.first_simulation_period - M_.orig_maximum_lag;
         first_obs_ispresent = true;
+    else
+        error('Incorrect class for the value of first_simulation_period option')
     end
 end
 
 if isfield(options, 'last_obs')
-    if options.last_obs > nobs0
-        error('%s_FILE: last_obs = %d is larger than the number of observations in the dataset (%d)', caller, options.last_obs, nobs0)
-    elseif first_obs_ispresent
-        if nobs > 0 && (periods(options.last_obs) ~= first_obs + nobs - 1)
-            error('%s_FILE: FIRST_OBS, LAST_OBS and NOBS contain inconsistent information. Use only two of these options.', caller)
+    if isa(options.last_obs, 'numeric')
+        if options.last_obs > nobs0
+            error('%s_FILE: last_obs = %d is larger than the number of observations in the dataset (%d)', caller, options.last_obs, nobs0)
         else
             last_obs = periods(options.last_obs);
         end
-    else
-        last_obs = periods(options.last_obs);
-        if nobs > 0
-            first_obs = last_obs - nobs + 1;
+    elseif isa(options.last_obs, 'dates')
+        if options.last_obs > series.last
+            error('%s_FILE: last_obs = %s is larger than the number of observations in the dataset (%s)', caller, options.last_obs, series.last)
         else
-            first_obs = periods(1);
+            last_obs = options.last_obs;
         end
     end
-elseif isfield(options, 'lastobs')
-    if options.lastobs > series.last
-        error('%s_FILE: last_obs = %s is larger than the number of observations in the dataset (%s)', caller, options.lastobs, series.last)
-    elseif first_obs_ispresent
-        if nobs > 0 && (options.lastobs ~= first_obs + nobs - 1)
+
+    if first_obs_ispresent
+        if nobs > 0 && (last_obs ~= first_obs + nobs - 1)
             error('%s_FILE: FIRST_OBS, LAST_OBS and NOBS contain inconsistent information. Use only two of these options.', caller)
-        else
-            last_obs = options.lastobs;
         end
     else
-        last_obs = options.last_obs;
         if nobs > 0
             first_obs = last_obs - nobs + 1;
-        else
-            first_obs = periods(1);
         end
     end
 elseif nobs > 0
@@ -228,28 +206,19 @@ else
 end
 
 if isfield(options, 'last_simulation_period')
-    lastsimulationperiod = periods(options.last_simulation_period);
-end
-
-if isfield(options, 'lastsimulationperiod')
-    lastsimulationperiod = options.lastsimulationperiod;
-end
-
-
-if exist('lastsimulationperiod', 'var')
-    if lastsimulationperiod<=last_obs-M_.orig_maximum_lead
+    if isa(options.last_simulation_period, 'numeric')
+        lastsimulationperiod = periods(options.last_simulation_period);
+    elseif isa(options.last_simulation_period, 'dates')
+        lastsimulationperiod = options.last_simulation_period;
+    else
+        error('Incorrect class for the value of last_simulation_period option')
+    end
+    if lastsimulationperiod <= last_obs-M_.orig_maximum_lead
         last_obs = lastsimulationperiod+M_.orig_maximum_lead;
     else
         error('%s_FILE: LAST_SIMULATION_PERIOD is too large compared to the available data.', caller)
     end
-end
-
-if exist('lastsimulationperiod', 'var') && exist('firstsimulationperiod', 'var')
-    p = lastsimulationperiod-firstsimulationperiod+1;
-elseif exist('lastsimulationperiod', 'var')
     p = lastsimulationperiod-(first_obs+M_.orig_maximum_lag)+1;
-elseif exist('firstsimulationperiod', 'var')
-    p = (last_obs-M_.orig_maximum_lead)-firstsimulationperiod+1;
 else
     p = (last_obs-M_.orig_maximum_lead)-(first_obs+M_.orig_maximum_lag)+1;
 end
diff --git a/matlab/utilities/dataset/makedataset.m b/matlab/utilities/dataset/makedataset.m
index 7455aefb1d569cf158b833d71995a75cfcf2416f..9061021c4c63db9dfa071455ddc2bf42e873b8d4 100644
--- a/matlab/utilities/dataset/makedataset.m
+++ b/matlab/utilities/dataset/makedataset.m
@@ -22,7 +22,7 @@ function [dataset_, dataset_info, newdatainterface] = makedataset(options_, init
 %
 % See also dynare_estimation_init
 
-% Copyright © 2014-2023 Dynare Team
+% Copyright © 2014-2024 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -179,25 +179,25 @@ end
 
 % Set firstobs, lastobs and nobs
 if newdatainterface
-    if isempty(options_.dataset.firstobs)
+    if isempty(options_.dataset.first_obs)
         % first_obs option was not used in the data command.
         firstobs = dataset_.init;
     else
-        firstobs = options_.dataset.firstobs;
+        firstobs = options_.dataset.first_obs;
     end
     if isnan(options_.dataset.nobs)
         % nobs option was not used in the data command.
-        if isempty(options_.dataset.lastobs)
+        if isempty(options_.dataset.last_obs)
             % last_obs option was not used in the data command.
             nobs = dataset_.nobs;
             lastobs = dataset_.dates(end);
         else
-            lastobs = options_.dataset.lastobs;
+            lastobs = options_.dataset.last_obs;
             nobs = lastobs-firstobs+1;
         end
     else
         nobs = options_.dataset.nobs;
-        if isempty(options_.dataset.lastobs)
+        if isempty(options_.dataset.last_obs)
             % last_obs option was not used in the data command.
             lastobs = firstobs+(nobs-1);
         else
diff --git a/preprocessor b/preprocessor
index 1a1f249fc27d091d146329dd5c5e694f6e3e9cc5..b2b2801bcf063111214220a982c51b2c3eafe1f0 160000
--- a/preprocessor
+++ b/preprocessor
@@ -1 +1 @@
-Subproject commit 1a1f249fc27d091d146329dd5c5e694f6e3e9cc5
+Subproject commit b2b2801bcf063111214220a982c51b2c3eafe1f0