diff --git a/.gitmodules b/.gitmodules
index c1b148f57a47132f1861281becf55b3c8a3b63c0..1bb00333bacd54e4f97899a75be898a442523261 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -14,9 +14,6 @@
 	path = matlab/modules/dseries
 	url = ../../Dynare/dseries.git
 	branch = master
-[submodule "contrib/jsonlab"]
-	path = contrib/jsonlab
-	url = https://github.com/fangq/jsonlab.git
 [submodule "preprocessor"]
 	path = preprocessor
 	url = ../../Dynare/preprocessor.git
diff --git a/contrib/jsonlab b/contrib/jsonlab
deleted file mode 160000
index 5a58fafdca239e61be4d7b2270307b2445bb571a..0000000000000000000000000000000000000000
--- a/contrib/jsonlab
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 5a58fafdca239e61be4d7b2270307b2445bb571a
diff --git a/doc/manual/source/installation-and-configuration.rst b/doc/manual/source/installation-and-configuration.rst
index 7c0bcf5f6c87e334a299fa1d7641a00a8d43500f..08315de1ebe31622888ad1a5c7602e1c18c56a75 100644
--- a/doc/manual/source/installation-and-configuration.rst
+++ b/doc/manual/source/installation-and-configuration.rst
@@ -15,7 +15,7 @@ compilation steps are necessary in that case.
 In order to run Dynare, you need one of the following:
 
 * MATLAB, any version ranging from 9.5 (R2018b) to 23.2 (R2023b);
-* GNU Octave, any version ranging from 6.2.0 to 8.4.0, with the statistics package
+* GNU Octave, any version ranging from 7.1.0 to 8.4.0, with the statistics package
   from `Octave-Forge`_. Note however that the Dynare installer for Windows
   requires a more specific version of Octave, as indicated on the download
   page.
diff --git a/macOS/build.sh b/macOS/build.sh
index e94d70d2f76fbbf02fb4cff10a2e52bc2da4c51f..18c6fbc9e6586893630c6a313c619d9158f1a9a2 100755
--- a/macOS/build.sh
+++ b/macOS/build.sh
@@ -145,7 +145,6 @@ fi
 
 cp -p  "$ROOTDIR"/scripts/dynare.el                                  "$PKGFILES"/scripts
 cp -pr "$ROOTDIR"/contrib/ms-sbvar/TZcode/MatlabFiles                "$PKGFILES"/contrib/ms-sbvar/TZcode
-cp -pr "$ROOTDIR"/contrib/jsonlab                                    "$PKGFILES"/contrib
 
 cp     "$ROOTDIR"/build-doc/*.pdf                                    "$PKGFILES"/doc
 cp     "$ROOTDIR"/build-doc/preprocessor/doc/*.pdf                   "$PKGFILES"/doc
diff --git a/matlab/+estimate/nls.m b/matlab/+estimate/nls.m
index 46c18c848feb6cdcc2de6335b175ecbb70f385e5..a7673004aec884b61058760d0b70738442a89e40 100644
--- a/matlab/+estimate/nls.m
+++ b/matlab/+estimate/nls.m
@@ -28,7 +28,7 @@ function nls(eqname, params, data, range, optimizer, varargin)
 %     equation must have NaN values in the object.
 % [4] It is assumed that the residual is additive.
 
-% Copyright © 2021-2022 Dynare Team
+% Copyright © 2021-2023 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -179,12 +179,6 @@ write_residuals_routine(lhs, rhs, eqname, ipnames_, M_);
 % Create a routine for evaluating the sum of squared residuals of the nonlinear model
 write_ssr_routine(lhs, rhs, eqname, ipnames_, M_);
 
-% Workaround for Octave bug https://savannah.gnu.org/bugs/?46282
-% Octave will randomly fail to read the ssr_* file generated in the +folder
-if isoctave && octave_ver_less_than('7')
-    path(path)
-end
-
 % Create a function handle returning the sum of square residuals for a given vector of parameters.
 ssrfun = @(p) feval([M_.fname '.ssr_' eqname], p, DATA, M_, oo_);
 
diff --git a/matlab/+pac/+estimate/nls.m b/matlab/+pac/+estimate/nls.m
index 5f0d89b3c8ea410866b1581af4033da8ffd9a412..5fa8a626ecf13b0fc5949d5c804edf3979b00b90 100644
--- a/matlab/+pac/+estimate/nls.m
+++ b/matlab/+pac/+estimate/nls.m
@@ -42,7 +42,7 @@ function nls(eqname, params, data, range, optimizer, varargin)
 % is available only if the matylab optimization toolbox is installed), the
 % remaining inputs are the options (key/value) passed to the optimizers.
 
-% Copyright © 2018-2022 Dynare Team
+% Copyright © 2018-2023 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -96,12 +96,6 @@ write_residuals_routine(lhs, rhs, eqname, ipnames_, M_, pacmodl);
 % Create a routine for evaluating the sum of squared residuals of the nonlinear model
 write_ssr_routine(lhs, rhs, eqname, ipnames_, M_, pacmodl);
 
-% Workaround for Octave bug https://savannah.gnu.org/bugs/?46282
-% Octave will randomly fail to read the ssr_* file generated in the +folder
-if isoctave && octave_ver_less_than('7')
-    path(path)
-end
-
 % Copy (sub)sample data in a matrix.
 DATA = data([range(1)-1, range]).data;
 
diff --git a/matlab/dynare.m b/matlab/dynare.m
index 68db17156bdc98c8355ac2d412ea2026361dcbf4..84ff83a087b9a01d915477fb148472c5cab9e47e 100644
--- a/matlab/dynare.m
+++ b/matlab/dynare.m
@@ -81,9 +81,9 @@ if isoctave
                  'of precompiled mex files and some\nfeatures, like solution ' ...
                  'of models approximated at third order, will not be available.'], supported_octave_version())
         skipline()
-    elseif octave_ver_less_than('6.2.0') % Should match the test in meson.build, and also the one in matlab/modules/dseries/src/initialize_dseries_class.m
+    elseif octave_ver_less_than('7.1.0') % Should match the test in meson.build, and also the one in matlab/modules/dseries/src/initialize_dseries_class.m
         skipline()
-        warning(['This version of Dynare has only been tested on Octave 6.2.0 and above. Dynare may fail to run or give unexpected result. Consider upgrading your version of Octave.'])
+        warning(['This version of Dynare has only been tested on Octave 7.1.0 and above. Dynare may fail to run or give unexpected result. Consider upgrading your version of Octave.'])
         skipline()
     end
 else
diff --git a/matlab/dynare_estimation_1.m b/matlab/dynare_estimation_1.m
index 368ddb7cf7034978a55968e6116ca67dc6cfcbcc..f1d41fed096964110775f2533448e54dc25e51d4 100644
--- a/matlab/dynare_estimation_1.m
+++ b/matlab/dynare_estimation_1.m
@@ -34,11 +34,6 @@ global M_ options_ oo_ estim_params_ bayestopt_ dataset_ dataset_info
 dispString = 'Estimation::mcmc';
 
 if ~exist([M_.dname filesep 'Output'],'dir')
-    if isoctave && octave_ver_less_than('7') && ~exist(M_.dname)
-        % See https://savannah.gnu.org/bugs/index.php?61166
-        % This workaround is needed for recursive estimation.
-        mkdir(M_.dname)
-    end
     mkdir(M_.dname,'Output');
 end
 
diff --git a/matlab/loadjson_.m b/matlab/loadjson_.m
index 70c61b28681fe0d22bbaad8bfbbfee16ad2b3255..6cbf10806eaefcf9ffddc8bd2babd19f4c56515e 100644
--- a/matlab/loadjson_.m
+++ b/matlab/loadjson_.m
@@ -1,6 +1,6 @@
 function o = loadjson_(jsonfilename)
 
-% Reads a json file using jsonlab toolbox or jsondecode builtin if available.
+% Reads a json file using jsondecode builtin.
 %
 % INPUTS
 % - jsonfilename   [char]      1×n char array, name of the JSON file.
@@ -28,11 +28,6 @@ function o = loadjson_(jsonfilename)
 % You should have received a copy of the GNU General Public License
 % along with Dynare.  If not, see <https://www.gnu.org/licenses/>.
 
-if isoctave && octave_ver_less_than('7')
-    o = loadjson(jsonfilename);
-    return
-end
-
 json = fileread(jsonfilename);
 
 o = jsondecode(json); clear('json');
diff --git a/matlab/missing/mex/mjdgges/mjdgges.m b/matlab/missing/mex/mjdgges/mjdgges.m
index b28214e9234bcaa17c28ea62b6be94601d9093fd..4b1ef0648c87790382e96d6449e680fbdb1723b4 100644
--- a/matlab/missing/mex/mjdgges/mjdgges.m
+++ b/matlab/missing/mex/mjdgges/mjdgges.m
@@ -39,10 +39,6 @@ if nargin > 5 || nargin < 2 || nargout > 7 || nargout == 0
     error('MJDGGES: takes 2, 3 or 4 input arguments and between 1 and 7 output arguments.')
 end
 
-if isoctave && octave_ver_less_than('7')
-    error('Octave version 7 or higher is required (Octave 6 lacks the ordqz function)')
-end
-
 [me, ne] = size(e);
 [md, nd] = size(d);
 if ~isreal(e) || ~isreal(d) || me ~= ne || md ~= nd || me ~= nd
diff --git a/matlab/modules/dseries b/matlab/modules/dseries
index 99b6f167e71945a45249dbc6b5100d2ca6b1474f..80446e7cdcf392167e91b428b61d77e028e47674 160000
--- a/matlab/modules/dseries
+++ b/matlab/modules/dseries
@@ -1 +1 @@
-Subproject commit 99b6f167e71945a45249dbc6b5100d2ca6b1474f
+Subproject commit 80446e7cdcf392167e91b428b61d77e028e47674
diff --git a/matlab/ols/pooled_ols.m b/matlab/ols/pooled_ols.m
index 15569b124998984cdefd9e73b9bed4f9e577a2c3..41b714e5887268028737b86ace21d2f42ef8943f 100644
--- a/matlab/ols/pooled_ols.m
+++ b/matlab/ols/pooled_ols.m
@@ -27,7 +27,7 @@ function varargout = pooled_ols(ds, param_common, param_regex, overlapping_dates
 % SPECIAL REQUIREMENTS
 %   dynare must have been run with the option: json=compute
 
-% Copyright © 2017-2019 Dynare Team
+% Copyright © 2017-2023 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -76,10 +76,6 @@ else
 end
 
 st = dbstack(1);
-if isoctave && octave_ver_less_than('6.3.0')
-    % Workaround for https://savannah.gnu.org/bugs/?60531, fixed in 6.3.0
-    st = st(2:end);
-end
 if ~isempty(st) && strcmp(st(1).name, 'pooled_fgls')
     save_structure_name = 'pooled_fgls';
 else
diff --git a/matlab/ols/sur.m b/matlab/ols/sur.m
index c1dfb1730594b54bc62200f96f4383340d8f63a5..208969f92e5eb9ec0b7f01ca6c53cdb7d60decf2 100644
--- a/matlab/ols/sur.m
+++ b/matlab/ols/sur.m
@@ -18,7 +18,7 @@ function varargout = sur(ds, param_names, eqtags, model_name, noniterative, ds_r
 % SPECIAL REQUIREMENTS
 %   dynare must have been run with the option: json=compute
 
-% Copyright © 2017-2021 Dynare Team
+% Copyright © 2017-2023 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -121,10 +121,6 @@ end
 %
 
 st = dbstack(1);
-if isoctave && octave_ver_less_than('6.3.0')
-    % Workaround for https://savannah.gnu.org/bugs/?60531, fixed in 6.3.0
-    st = st(2:end);
-end
 if ~isempty(st) && strcmp(st(1).name, 'surgibbs')
     varargout{1} = nobs;
     varargout{2} = X{param_names{:}}.data;
diff --git a/meson.build b/meson.build
index 3a6ac503db425d8483fd3048f30f9fae77578b1b..ff248b79fb6198eb86b85466f059388a04cd7f27 100644
--- a/meson.build
+++ b/meson.build
@@ -163,7 +163,7 @@ if get_option('build_for') == 'matlab'
 else # Octave build
   octave_exe = find_program('octave', required : not meson.is_cross_build(), disabler : true)
   mkoctfile_exe = find_program('mkoctfile')
-  octave_minimal_version = '6.2.0'
+  octave_minimal_version = '7.1.0'
   octave_version = run_command(mkoctfile_exe, '-v', check : true).stdout().replace('mkoctfile, version ', '').strip()
 
   if octave_version.version_compare('<' + octave_minimal_version)
diff --git a/tests/run_all_unit_tests.m b/tests/run_all_unit_tests.m
index d346a1ba00d0ca928a071600490ef72df8f08978..0bdffdb2950cd0f226588514ecc85b271b64659b 100644
--- a/tests/run_all_unit_tests.m
+++ b/tests/run_all_unit_tests.m
@@ -36,13 +36,7 @@ if isoctave
     mlist = mlist(find(~strcmp([matlab_dir filesep 'load_m_file_data_legacy.m'], mlist)));
 end
 
-% Set random seed, for reproducibility
-if isoctave && octave_ver_less_than('7')
-    randn('state',1);
-    rand('state',1);
-else
-    rng(1);
-end
+rng(1);
 
 failedtests = {};
 
diff --git a/windows/build.sh b/windows/build.sh
index b6909e4cfe1f70a2d1d7a4fc0d23f24f1f57679d..9c1c854de16cec567c5bf922dd1243df5cb357a2 100755
--- a/windows/build.sh
+++ b/windows/build.sh
@@ -119,8 +119,6 @@ cp -p windows/README.txt "$ZIPDIR"
 cp -pr windows/deps/mingw64 "$ZIPDIR"
 mkdir -p "$ZIPDIR"/contrib/ms-sbvar/TZcode
 cp -pr contrib/ms-sbvar/TZcode/MatlabFiles "$ZIPDIR"/contrib/ms-sbvar/TZcode
-mkdir -p "$ZIPDIR"/contrib/jsonlab
-cp -pr contrib/jsonlab/* "$ZIPDIR"/contrib/jsonlab
 mkdir -p "$ZIPDIR"/mex/matlab/win64-9.5-23.2
 cp -p build-win-matlab/*.mexw64 "$ZIPDIR"/mex/matlab/win64-9.5-23.2
 mkdir -p "$ZIPDIR"/mex/octave/win64