diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc
index 3522f192b765d5b707b0a3d680179f55c1334bf0..e08b60b07fb673d10a9ec584d11915c86b36727e 100644
--- a/src/ComputingTasks.cc
+++ b/src/ComputingTasks.cc
@@ -2761,6 +2761,14 @@ ShockDecompositionStatement::ShockDecompositionStatement(SymbolList symbol_list_
 {
 }
 
+void
+ShockDecompositionStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
+{
+  if (auto it = options_list.num_options.find("shock_decomp.with_epilogue");
+      it != options_list.num_options.end() && it->second == "true")
+    mod_file_struct.with_epilogue_option = true;
+}
+
 void
 ShockDecompositionStatement::writeOutput(ostream &output, const string &basename, bool minimal_workspace) const
 {
@@ -2793,6 +2801,14 @@ RealtimeShockDecompositionStatement::RealtimeShockDecompositionStatement(SymbolL
 {
 }
 
+void
+RealtimeShockDecompositionStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
+{
+  if (auto it = options_list.num_options.find("shock_decomp.with_epilogue");
+      it != options_list.num_options.end() && it->second == "true")
+    mod_file_struct.with_epilogue_option = true;
+}
+
 void
 RealtimeShockDecompositionStatement::writeOutput(ostream &output, const string &basename, bool minimal_workspace) const
 {
@@ -2858,6 +2874,14 @@ InitialConditionDecompositionStatement::InitialConditionDecompositionStatement(S
 {
 }
 
+void
+InitialConditionDecompositionStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
+{
+  if (auto it = options_list.num_options.find("initial_condition_decomp.with_epilogue");
+      it != options_list.num_options.end() && it->second == "true")
+    mod_file_struct.with_epilogue_option = true;
+}
+
 void
 InitialConditionDecompositionStatement::writeOutput(ostream &output, const string &basename, bool minimal_workspace) const
 {
diff --git a/src/ComputingTasks.hh b/src/ComputingTasks.hh
index e8e2a7ca3c552b5a26c77b55d938a17005cbeb35..82c77210cf84d0f478565a07e1c0ce71c086d3e8 100644
--- a/src/ComputingTasks.hh
+++ b/src/ComputingTasks.hh
@@ -720,6 +720,7 @@ private:
 public:
   ShockDecompositionStatement(SymbolList symbol_list_arg,
                               OptionsList options_list_arg);
+  void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
 };
@@ -732,6 +733,7 @@ private:
 public:
   RealtimeShockDecompositionStatement(SymbolList symbol_list_arg,
                                       OptionsList options_list_arg);
+  void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
 };
@@ -756,6 +758,7 @@ private:
 public:
   InitialConditionDecompositionStatement(SymbolList symbol_list_arg,
                                          OptionsList options_list_arg);
+  void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
 };
diff --git a/src/DynareBison.yy b/src/DynareBison.yy
index ad8fd04ec7af174895ef9acf6dbcdcf32fdd7d1e..047f81ac082f9218d7d818994729c622541a85f1 100644
--- a/src/DynareBison.yy
+++ b/src/DynareBison.yy
@@ -169,7 +169,7 @@ class ParsingDriver;
 %token NO_IDENTIFICATION_STRENGTH NO_IDENTIFICATION_REDUCEDFORM NO_IDENTIFICATION_MOMENTS
 %token NO_IDENTIFICATION_MINIMAL NO_IDENTIFICATION_SPECTRUM NORMALIZE_JACOBIANS GRID_NBR
 %token TOL_RANK TOL_DERIV TOL_SV CHECKS_VIA_SUBSETS MAX_DIM_SUBSETS_GROUPS
-%token MAX_NROWS SQUEEZE_SHOCK_DECOMPOSITION
+%token MAX_NROWS SQUEEZE_SHOCK_DECOMPOSITION WITH_EPILOGUE
 
 %token <vector<string>> SYMBOL_VEC
 
@@ -2830,6 +2830,7 @@ shock_decomposition_option : o_parameter_set
                            | o_nobs
                            | o_init_state
 			   | o_forecast_type
+                           | o_shock_decomposition_with_epilogue
                            ;
 
 realtime_shock_decomposition_options_list : realtime_shock_decomposition_option COMMA realtime_shock_decomposition_options_list
@@ -2847,6 +2848,7 @@ realtime_shock_decomposition_option : o_parameter_set
                                     | o_shock_decomposition_forecast
                                     | o_save_realtime
                                     | o_fast_realtime
+                                    | o_shock_decomposition_with_epilogue
                                     ;
 
 plot_shock_decomposition_options_list : plot_shock_decomposition_option COMMA plot_shock_decomposition_options_list
@@ -2892,6 +2894,7 @@ initial_condition_decomposition_option : o_icd_type
                                        | o_icd_flip
                                        | o_icd_colormap
                                        | o_icd_max_nrows
+                                       | o_icd_with_epilogue
                                        ;
 
 homotopy_setup: HOMOTOPY_SETUP ';' homotopy_list END ';'
@@ -3308,6 +3311,8 @@ o_psd_graph_format : GRAPH_FORMAT EQUAL allowed_graph_formats
                    | GRAPH_FORMAT EQUAL '(' list_allowed_graph_formats ')'
                      { driver.plot_shock_decomp_process_graph_format_option(); }
                    ;
+o_shock_decomposition_with_epilogue : WITH_EPILOGUE { driver.option_num("shock_decomp.with_epilogue", "true"); };
+o_icd_with_epilogue : WITH_EPILOGUE { driver.option_num("initial_condition_decomp.with_epilogue", "true"); };
 allowed_graph_formats : EPS
                         { driver.add_graph_format("eps"); }
                       | FIG
diff --git a/src/DynareFlex.ll b/src/DynareFlex.ll
index 005610f99ad1a8430836c4571370d4cd6d618726..eb2913914bb1237efbcf6db0d44a66fcfc7ac92b 100644
--- a/src/DynareFlex.ll
+++ b/src/DynareFlex.ll
@@ -704,6 +704,7 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4]|w([1-9]{1}|[1-4][0-9]|5[0-2]))
 <DYNARE_STATEMENT>checks_via_subsets {return token::CHECKS_VIA_SUBSETS;}
 <DYNARE_STATEMENT>max_dim_subsets_groups {return token::MAX_DIM_SUBSETS_GROUPS;}
 <DYNARE_STATEMENT>max_nrows {return token::MAX_NROWS;}
+<DYNARE_STATEMENT>with_epilogue {return token::WITH_EPILOGUE;}
 
 <DYNARE_STATEMENT>\$[^$]*\$ {
   strtok(yytext+1, "$");
diff --git a/src/ModFile.cc b/src/ModFile.cc
index dd43b49686edaf23481dbec2679bba5ef9e51c77..2e26a507b5bbb12a343c7dc73d4dd945beccd8d3 100644
--- a/src/ModFile.cc
+++ b/src/ModFile.cc
@@ -114,7 +114,7 @@ ModFile::checkPass(bool nostrict, bool stochastic)
   steady_state_model.checkPass(mod_file_struct, warnings);
 
   // Check epilogue block
-  epilogue.checkPass(warnings);
+  epilogue.checkPass(mod_file_struct, warnings);
 
   if (mod_file_struct.write_latex_steady_state_model_present &&
       !mod_file_struct.steady_state_model_present)
diff --git a/src/ModelEquationBlock.cc b/src/ModelEquationBlock.cc
index c7027bfa80bf93924c33c6c94dbc45aacfcc787c..e901b88ae9f782023bd1c9f126bfc221de743b04 100644
--- a/src/ModelEquationBlock.cc
+++ b/src/ModelEquationBlock.cc
@@ -321,10 +321,17 @@ Epilogue::addDefinition(int symb_id, expr_t expr)
 }
 
 void
-Epilogue::checkPass(WarningConsolidation &warnings) const
+Epilogue::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) const
 {
   if (dynamic_def_table.size() == 0)
-    return;
+    {
+      if (mod_file_struct.with_epilogue_option)
+        {
+          cerr << "ERROR: the 'with_epilogue' option cannot be specified when there is no 'epilogue' block" << endl;
+          exit(EXIT_FAILURE);
+        }
+      return;
+    }
 
   vector<int> so_far_defined;
   for (const auto & it : dynamic_def_table)
diff --git a/src/ModelEquationBlock.hh b/src/ModelEquationBlock.hh
index 19871b594484fc5d7181fdea48f274f86c283106..c51a6f2e227a95bdfc9d6a3bdcbca2505a5ca698 100644
--- a/src/ModelEquationBlock.hh
+++ b/src/ModelEquationBlock.hh
@@ -86,8 +86,8 @@ public:
   //! Add an expression of the form "var = expr;"
   void addDefinition(int symb_id, expr_t expr);
 
-  //! Checks that no variable is declared twice
-  void checkPass(WarningConsolidation &warnings) const;
+  //! Checks that no variable is declared twice, and that “with_epilogue” is not misused
+  void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) const;
 
   //! Creates static epilogue equations
   void toStatic();
diff --git a/src/Statement.hh b/src/Statement.hh
index b6d6eab380fcdc071a836c57d6df5b6aa35aca76..cf43942597044690f4242092ee72e520cca1e607 100644
--- a/src/Statement.hh
+++ b/src/Statement.hh
@@ -131,6 +131,9 @@ public:
   set<int> pac_params;
   //! Instruments if ramsey_model, ramsey_policy or discretionary_policy is present
   SymbolList instruments;
+  /* Whether any of shock_decomposition, realtime_shock_decomposition and
+     initial_condition_decomposition has the “with_epilogue” option */
+  bool with_epilogue_option{false};
 };
 
 class Statement