diff --git a/doc/manual/source/the-model-file.rst b/doc/manual/source/the-model-file.rst
index e0405236e17e500ddc69ff42955777d441b35e8c..dcf20277e09ba1519d99c0d3dda0b4d062549efb 100644
--- a/doc/manual/source/the-model-file.rst
+++ b/doc/manual/source/the-model-file.rst
@@ -3101,6 +3101,7 @@ After computation, the steady state is available in the following variable:
     been computed with ``steady``, it will first try to compute it.
 
 .. block:: homotopy_setup ;
+           homotopy_setup(from_initval_to_endval) ;
 
     This block is used to declare initial and final values when using
     a homotopy method. It is used in conjunction with the option
@@ -3129,12 +3130,26 @@ After computation, the steady state is available in the following variable:
 
     Here only the final value is specified for a given
     parameter/exogenous; the initial value is taken from the
-    preceeding ``initval`` block.
+    preceeding ``initval`` block (or from the preceeding ``endval`` block if
+    there is one before the ``homotopy_setup`` block).
 
     A necessary condition for a successful homotopy is that Dynare
     must be able to solve the steady state for the initial
     parameters/exogenous without additional help (using the guess
-    values given in the ``initval`` block).
+    values given in the ``initval`` or ``endval`` block).
+
+    The ``from_initval_to_endval`` option can be used in the context of a
+    permanent shock, when the initial steady state has already been computed.
+    This option can be used following the ``endval`` block that describes the
+    terminal steady state. In that case, in the subsequent ``steady`` command,
+    Dynare will perform a homotopy from the initial to the terminal steady
+    state (technically, using this option is equivalent to writing a
+    ``homotopy_setup`` block where all exogenous variables are asked to
+    transition from their values in the ``initval`` to their values in the
+    ``endval`` block). When this option is used, the ``homotopy_setup`` block
+    is typically empty (but it’s nevertheless possible to add explicit
+    directives for moving exogenous or parameters; these will be added on top
+    of those implicitly generated by the ``from_initval_to_endval`` option).
 
     If the homotopy fails, a possible solution is to increase the
     number of steps (given in ``homotopy_steps`` option of
diff --git a/matlab/steady.m b/matlab/steady.m
index 9866224b3220fbb7a0e3ac0bbd6213a782fbb2fe..106f4c201f01ece8e9e1c3f6e810ea36a1ea71a6 100644
--- a/matlab/steady.m
+++ b/matlab/steady.m
@@ -28,7 +28,7 @@ function steady()
 % You should have received a copy of the GNU General Public License
 % along with Dynare.  If not, see <https://www.gnu.org/licenses/>.
 
-global M_ oo_ options_
+global M_ oo_ options_ ex0_
 
 test_for_deep_parameters_calibration(M_);
 
@@ -62,6 +62,18 @@ if options_.homotopy_mode ~= 0
         error('HOMOTOPY_SETUP: incorrect variable types specified')
     end
 
+    % If the “from_initval_to_endval” option was passed to the “homotopy_setup” block, add the relevant homotopy information
+    if options_.homotopy_from_initval_to_endval
+        if isempty(ex0_)
+            error('HOMOTOPY_SETUP: the from_initval_to_endval option cannot be used without an endval block')
+        end
+        for i = 1:M_.exo_nbr
+            if ~any(hv(:,1)==1 & hv(:,2)==i) % Do not overwrite information manually specified by the user
+                hv = vertcat(hv, [ 1 i ex0_(i) oo_.exo_steady_state(i)]);
+            end
+        end
+    end
+
     homotopy_func = str2func(['homotopy' num2str(options_.homotopy_mode)]);
     [M_,oo_,errorcode] = homotopy_func(hv, options_.homotopy_steps, M_, options_, oo_);
 
diff --git a/meson.build b/meson.build
index 136beca405aeaa3af72ad9677d090102007fb884..647b8d6b1523c1f61b0a1d2c01016532f3f6579f 100644
--- a/meson.build
+++ b/meson.build
@@ -1062,6 +1062,8 @@ mod_and_m_tests = [
     'extra' : [ 'steady_state/homotopy/common.mod' ] },
   { 'test' : [ 'steady_state/homotopy/homotopy3_test.mod' ],
     'extra' : [ 'steady_state/homotopy/common.mod' ] },
+  { 'test' : [ 'steady_state/homotopy/homotopy_from_initval_to_endval.mod' ],
+    'extra' : [ 'steady_state/homotopy/common.mod' ] },
   { 'test' : [ 'bvar_a_la_sims/bvar_standalone.mod' ],
     'extra' : [ 'bvar_a_la_sims/bvar_sample.m' ] },
   { 'test' : [ 'bvar_a_la_sims/bvar_and_dsge.mod' ],
diff --git a/preprocessor b/preprocessor
index 86b24dc9bf1c8fa5738f084e3cfac54d5523ca56..084372a314a5f3081dc055ba83dd879947809576 160000
--- a/preprocessor
+++ b/preprocessor
@@ -1 +1 @@
-Subproject commit 86b24dc9bf1c8fa5738f084e3cfac54d5523ca56
+Subproject commit 084372a314a5f3081dc055ba83dd879947809576
diff --git a/tests/steady_state/homotopy/common.mod b/tests/steady_state/homotopy/common.mod
index 347dd464ab64b3cbb022ccfb07ef9682fa98bc57..eea56c1b7af218e8da3e86950f6978629dca5da6 100644
--- a/tests/steady_state/homotopy/common.mod
+++ b/tests/steady_state/homotopy/common.mod
@@ -19,11 +19,26 @@ k = ((delt+bet)/(aa*x*alph))^(1/(alph-1));
 c = aa*x*k^alph-delt*k;
 end;
 
+@#ifdef homotopy_from_initval_to_endval
+
+steady;
+
+endval;
+x = 2;
+end;
+
+homotopy_setup(from_initval_to_endval);
+end;
+
+@#else
+
 homotopy_setup;
 bet, 0.05, 0.1;
 x, 2;
 end;
 
+@#endif
+
 steady(homotopy_mode = @{homotopy_mode}, homotopy_steps = 50);
 
 if abs(oo_.steady_state(1)/(aa*oo_.exo_steady_state(1)*oo_.steady_state(2)^alph-delt*oo_.steady_state(2)) - 1) > 1e-4
diff --git a/tests/steady_state/homotopy/homotopy_from_initval_to_endval.mod b/tests/steady_state/homotopy/homotopy_from_initval_to_endval.mod
new file mode 100644
index 0000000000000000000000000000000000000000..40064187c167a7edc49aa293093b315a6ca8d334
--- /dev/null
+++ b/tests/steady_state/homotopy/homotopy_from_initval_to_endval.mod
@@ -0,0 +1,3 @@
+@#define homotopy_from_initval_to_endval
+@#define homotopy_mode = 3
+@#include "common.mod"