diff --git a/DynamicModel.cc b/DynamicModel.cc
index 4bb388ada230a2d5360874dfa383543f8ff552b0..79a630c5d0e560a59dc8b784c962a1412488c6a6 100644
--- a/DynamicModel.cc
+++ b/DynamicModel.cc
@@ -44,6 +44,10 @@ DynamicModel::DynamicModel(SymbolTable &symbol_table_arg,
   max_endo_lag(0), max_endo_lead(0),
   max_exo_lag(0), max_exo_lead(0),
   max_exo_det_lag(0), max_exo_det_lead(0),
+  max_lag_orig(0), max_lead_orig(0),
+  max_endo_lag_orig(0), max_endo_lead_orig(0),
+  max_exo_lag_orig(0), max_exo_lead_orig(0),
+  max_exo_det_lag_orig(0), max_exo_det_lead_orig(0),
   dynJacobianColsNbr(0),
   global_temporary_terms(true)
 {
@@ -2594,7 +2598,15 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de
       outstruct = "oo_.";
     }
 
-  output << modstruct << "lead_lag_incidence = [";
+  output << modstruct << "max_endo_lag_orig = " << max_endo_lag_orig << ";" << endl
+         << modstruct << "max_endo_lead_orig = " << max_endo_lead_orig << ";" << endl
+         << modstruct << "max_exo_lag_orig = " << max_exo_lag_orig << ";" << endl
+         << modstruct << "max_exo_lead_orig = " << max_exo_lead_orig << ";" << endl
+         << modstruct << "max_exo_det_lag_orig = " << max_exo_det_lag_orig << ";" << endl
+         << modstruct << "max_exo_det_lead_orig = " << max_exo_det_lead_orig << ";" << endl
+         << modstruct << "max_lag_orig = " << max_lag_orig << ";" << endl
+         << modstruct << "max_lead_orig = " << max_lead_orig << ";" << endl
+         << modstruct << "lead_lag_incidence = [";
   // Loop on endogenous variables
   int nstatic = 0,
     nfwrd   = 0,
@@ -3830,6 +3842,8 @@ DynamicModel::cloneDynamic(DynamicModel &dynamic_model) const
   for (size_t i = 0; i < static_only_equations.size(); i++)
     dynamic_model.addStaticOnlyEquation(static_only_equations[i]->cloneDynamic(dynamic_model),
                                         static_only_equations_lineno[i]);
+
+  dynamic_model.setLeadsLagsOrig();
 }
 
 void
@@ -4008,6 +4022,55 @@ DynamicModel::findUnusedExogenous()
   return unusedExo;
 }
 
+void
+DynamicModel::setLeadsLagsOrig()
+{
+  set<pair<int, int> > dynvars;
+
+  for (int i = 0; i < (int) equations.size(); i++)
+    {
+      equations[i]->collectDynamicVariables(eEndogenous, dynvars);
+      equations[i]->collectDynamicVariables(eExogenous, dynvars);
+      equations[i]->collectDynamicVariables(eExogenousDet, dynvars);
+    }
+
+    for (set<pair<int, int> >::const_iterator it = dynvars.begin();
+         it != dynvars.end(); it++)
+    {
+      int lag = it->second;
+      SymbolType type = symbol_table.getType(it->first);
+
+      if (max_lead_orig < lag)
+        max_lead_orig= lag;
+      else if (-max_lag_orig > lag)
+        max_lag_orig = -lag;
+
+      switch (type)
+        {
+        case eEndogenous:
+          if (max_endo_lead_orig < lag)
+            max_endo_lead_orig = lag;
+          else if (-max_endo_lag_orig > lag)
+            max_endo_lag_orig = -lag;
+          break;
+        case eExogenous:
+          if (max_exo_lead_orig < lag)
+            max_exo_lead_orig = lag;
+          else if (-max_exo_lag_orig > lag)
+            max_exo_lag_orig = -lag;
+          break;
+        case eExogenousDet:
+          if (max_exo_det_lead_orig < lag)
+            max_exo_det_lead_orig = lag;
+          else if (-max_exo_det_lag_orig > lag)
+            max_exo_det_lag_orig = -lag;
+          break;
+        default:
+          break;
+        }
+    }
+}
+
 void
 DynamicModel::computeDerivIDs()
 {
diff --git a/DynamicModel.hh b/DynamicModel.hh
index f51d3ac89777192a86988797e180e93853fe7779..712d2ccaee19c31359582aa7f8d58ed2b4b88807 100644
--- a/DynamicModel.hh
+++ b/DynamicModel.hh
@@ -61,6 +61,14 @@ private:
   //! Maximum lag and lead over deterministic exogenous variables (positive values)
   /*! Set by computeDerivIDs() */
   int max_exo_det_lag, max_exo_det_lead;
+  //! Maximum lag and lead over all types of variables (positive values) of original model
+  int max_lag_orig, max_lead_orig;
+  //! Maximum lag and lead over endogenous variables (positive values) of original model
+  int max_endo_lag_orig, max_endo_lead_orig;
+  //! Maximum lag and lead over exogenous variables (positive values) of original model
+  int max_exo_lag_orig, max_exo_lead_orig;
+  //! Maximum lag and lead over deterministic exogenous variables (positive values) of original model
+  int max_exo_det_lag_orig, max_exo_det_lead_orig;
 
   //! Cross reference information
   map<int, ExprNode::EquationInfo> xrefs;
@@ -287,6 +295,9 @@ public:
   //! Find exogenous variables not used in model
   set<int> findUnusedExogenous();
 
+  //! Set the max leads/lags of the original model
+  void setLeadsLagsOrig();
+
   //! Copies a dynamic model (only the equations)
   /*! It assumes that the dynamic model given in argument has just been allocated */
   void cloneDynamic(DynamicModel &dynamic_model) const;
diff --git a/DynareBison.yy b/DynareBison.yy
index 446f88c8b9b74f6f021875821e2e34d94dd68495..48dbca09c932d48f5b81df30b773d6f4900fe000 100644
--- a/DynareBison.yy
+++ b/DynareBison.yy
@@ -2688,8 +2688,8 @@ plot_shock_decomposition_options_list : plot_shock_decomposition_option COMMA pl
                                       | plot_shock_decomposition_option
                                       ;
 
-plot_shock_decomposition_option : o_psd_use_shock_groups
-                                | o_psd_colormap
+plot_shock_decomposition_option : o_use_shock_groups
+                                | o_colormap
                                 | o_psd_nodisplay
                                 | o_psd_graph_format
                                 | o_psd_detail_plot
@@ -3514,14 +3514,10 @@ o_lmmcp : LMMCP {driver.option_num("lmmcp.status", "1"); };
 o_occbin : OCCBIN {driver.option_num("occbin", "1"); };
 o_function : FUNCTION EQUAL filename { driver.option_str("function", $3); };
 o_sampling_draws : SAMPLING_DRAWS EQUAL INT_NUMBER { driver.option_num("sampling_draws",$3); };
-o_use_shock_groups : USE_SHOCK_GROUPS { driver.option_str("use_shock_groups","default"); }
-                   | USE_SHOCK_GROUPS EQUAL symbol { driver.option_str("use_shock_groups", $3); }
+o_use_shock_groups : USE_SHOCK_GROUPS { driver.option_str("plot_shock_decomp.use_shock_groups","default"); }
+                   | USE_SHOCK_GROUPS EQUAL symbol { driver.option_str("plot_shock_decomp.use_shock_groups", $3); }
                    ;
-o_psd_use_shock_groups : USE_SHOCK_GROUPS { driver.option_str("plot_shock_decomp.use_shock_groups","default"); }
-                       | USE_SHOCK_GROUPS EQUAL symbol { driver.option_str("plot_shock_decomp.use_shock_groups", $3); }
-                       ;
 o_colormap : COLORMAP EQUAL symbol { driver.option_num("plot_shock_decomp.colormap",$3); };
-o_psd_colormap : COLORMAP EQUAL symbol { driver.option_num("plot_shock_decomp.colormap",$3); };
 
 range : symbol ':' symbol
         {