diff --git a/DynamicModel.cc b/DynamicModel.cc
index 74235425206f0ba2e0bf4ee9933f9f2951c5c4dd..4c97c64c5b44450717730d5b40d95dfd5fdf5224 100644
--- a/DynamicModel.cc
+++ b/DynamicModel.cc
@@ -3382,6 +3382,19 @@ DynamicModel::addEquationsForVar(map<string, pair<SymbolList, int> > &var_model_
     cout << "Accounting for var_model lags not in model block: added " << count << " auxiliary variables and equations." << endl;
 }
 
+void
+DynamicModel::walkPacParameters()
+{
+  for (size_t i = 0; i < equations.size(); i++)
+    {
+      bool pac_encountered = false;
+      set<pair<int, pair<int, int> > > params_and_vals;
+      equations[i]->walkPacParameters(pac_encountered, params_and_vals);
+      if (pac_encountered)
+        equations[i]->addParamInfoToPac(params_and_vals);
+    }
+}
+
 void
 DynamicModel::fillPacExpectationVarInfo(string &var_model_name,
                                         vector<int> &lhs,
diff --git a/DynamicModel.hh b/DynamicModel.hh
index 598a5c681ff3704973b5c2cbc7bc1c041276216a..afcd72b9bb34ecc2aadb03360f2445ac85dba70e 100644
--- a/DynamicModel.hh
+++ b/DynamicModel.hh
@@ -297,6 +297,8 @@ public:
   void setVarExpectationIndices(map<string, pair<SymbolList, int> > &var_model_info);
   //! Add aux equations (and aux variables) for variables declared in var_model at max order if they don't already exist
   void addEquationsForVar(map<string, pair<SymbolList, int> > &var_model_info);
+  //! Get Pac equation parameter info
+  void walkPacParameters();
   //! Add var_model info to pac_expectation nodes
   void fillPacExpectationVarInfo(string &var_model_name,
                                  vector<int> &lhs,
diff --git a/ExprNode.cc b/ExprNode.cc
index 959074d7de07cad44fbf2cbf71c01c7338107a53..aaa4b24c65dc285b5878423e518c21a874a7a56c 100644
--- a/ExprNode.cc
+++ b/ExprNode.cc
@@ -578,6 +578,16 @@ NumConstNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_mo
 {
 }
 
+void
+NumConstNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
+{
+}
+
+void
+NumConstNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
+{
+}
+
 void
 NumConstNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
 {
@@ -1634,6 +1644,16 @@ VariableNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_mo
 {
 }
 
+void
+VariableNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
+{
+}
+
+void
+VariableNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
+{
+}
+
 void
 VariableNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
 {
@@ -3031,6 +3051,18 @@ UnaryOpNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_mod
   arg->setVarExpectationIndex(var_model_info);
 }
 
+void
+UnaryOpNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
+{
+  arg->walkPacParameters(pac_encountered, params_and_vals);
+}
+
+void
+UnaryOpNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
+{
+  arg->addParamInfoToPac(params_and_vals_arg);
+}
+
 void
 UnaryOpNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
 {
@@ -4567,6 +4599,45 @@ BinaryOpNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_mo
   arg2->setVarExpectationIndex(var_model_info);
 }
 
+void
+BinaryOpNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
+{
+  if (op_code == oTimes)
+    {
+      set<int> params;
+      set<pair<int, int> > endogs;
+      arg1->collectVariables(eParameter, params);
+      arg2->collectDynamicVariables(eEndogenous, endogs);
+      if (params.size() == 1 && endogs.size() == 1)
+        {
+          params_and_vals.insert(make_pair(*(params.begin()), *(endogs.begin())));
+          return;
+        }
+      else
+        {
+          params.clear();
+          endogs.clear();
+          arg1->collectDynamicVariables(eEndogenous, endogs);
+          arg2->collectVariables(eParameter, params);
+          if (params.size() == 1 && endogs.size() == 1)
+            {
+              params_and_vals.insert(make_pair(*(params.begin()), *(endogs.begin())));
+              return;
+            }
+        }
+    }
+
+  arg1->walkPacParameters(pac_encountered, params_and_vals);
+  arg2->walkPacParameters(pac_encountered, params_and_vals);
+}
+
+void
+BinaryOpNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
+{
+  arg1->addParamInfoToPac(params_and_vals_arg);
+  arg2->addParamInfoToPac(params_and_vals_arg);
+}
+
 void
 BinaryOpNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
 {
@@ -5343,6 +5414,22 @@ TrinaryOpNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_m
   arg3->setVarExpectationIndex(var_model_info);
 }
 
+void
+TrinaryOpNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
+{
+  arg1->walkPacParameters(pac_encountered, params_and_vals);
+  arg2->walkPacParameters(pac_encountered, params_and_vals);
+  arg3->walkPacParameters(pac_encountered, params_and_vals);
+}
+
+void
+TrinaryOpNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
+{
+  arg1->addParamInfoToPac(params_and_vals_arg);
+  arg2->addParamInfoToPac(params_and_vals_arg);
+  arg3->addParamInfoToPac(params_and_vals_arg);
+}
+
 void
 TrinaryOpNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
 {
@@ -5717,6 +5804,20 @@ AbstractExternalFunctionNode::setVarExpectationIndex(map<string, pair<SymbolList
     (*it)->setVarExpectationIndex(var_model_info);
 }
 
+void
+AbstractExternalFunctionNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
+{
+  for (vector<expr_t>::const_iterator it = arguments.begin(); it != arguments.end(); it++)
+    (*it)->walkPacParameters(pac_encountered, params_and_vals);
+}
+
+void
+AbstractExternalFunctionNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
+{
+  for (vector<expr_t>::const_iterator it = arguments.begin(); it != arguments.end(); it++)
+    (*it)->addParamInfoToPac(params_and_vals_arg);
+}
+
 void
 AbstractExternalFunctionNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
 {
@@ -7188,6 +7289,16 @@ VarExpectationNode::setVarExpectationIndex(map<string, pair<SymbolList, int> > &
   yidx = find(vs.begin(), vs.end(), datatree.symbol_table.getName(symb_id)) - vs.begin();
 }
 
+void
+VarExpectationNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
+{
+}
+
+void
+VarExpectationNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
+{
+}
+
 void
 VarExpectationNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
 {
@@ -7289,9 +7400,35 @@ PacExpectationNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
     output << "M_.pac_expectation." << model_name << ".growth_name = '"
            << datatree.symbol_table.getName(growth_symb_id) << "';" << endl
            << "M_.pac_expectation." << model_name << ".growth_neutrality_param_index = "
-           << datatree.symbol_table.getTypeSpecificID(growth_param_index) + 1 << ";" << endl;
-
-  output << "M_.pac_expectation." << model_name << ".h0_param_indices = [";
+           << datatree.symbol_table.getTypeSpecificID(growth_param_index) + 1 << ";" << endl
+           << "M_.pac_expectation." << model_name << ".equation_params = [";
+  for (set<pair<int, pair<int, int> > >::const_iterator it = params_and_vals.begin();
+       it != params_and_vals.end(); it++)
+    {
+      if (it != params_and_vals.begin())
+        output << " ";
+      output << datatree.symbol_table.getTypeSpecificID(it->first) + 1;
+    }
+  output << "];" << endl
+         << "M_.pac_expectation." << model_name << ".equation_vars = [";
+  for (set<pair<int, pair<int, int> > >::const_iterator it = params_and_vals.begin();
+       it != params_and_vals.end(); it++)
+    {
+      if (it != params_and_vals.begin())
+        output << " ";
+      output << datatree.symbol_table.getTypeSpecificID(it->second.first) + 1;
+    }
+  output << "];" << endl
+         << "M_.pac_expectation." << model_name << ".equation_var_lags = [";
+  for (set<pair<int, pair<int, int> > >::const_iterator it = params_and_vals.begin();
+       it != params_and_vals.end(); it++)
+    {
+      if (it != params_and_vals.begin())
+        output << " ";
+      output << it->second.second;
+    }
+  output << "];" << endl
+         << "M_.pac_expectation." << model_name << ".h0_param_indices = [";
   for (vector<int>::const_iterator it = h0_indices.begin();
        it != h0_indices.end(); it++)
     {
@@ -7559,6 +7696,19 @@ PacExpectationNode::writeJsonOutput(ostream &output,
   output << ")";
 }
 
+void
+PacExpectationNode::walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const
+{
+  pac_encountered = true;
+}
+
+void
+PacExpectationNode::addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg)
+{
+  params_and_vals = params_and_vals_arg;
+}
+
+
 void
 PacExpectationNode::fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg)
 {
diff --git a/ExprNode.hh b/ExprNode.hh
index 1d3a2392f52207d50ecdbc8720cf0a4bca64d6e3..b292b474daa690b95d3e932aba2b92bda9718ea3 100644
--- a/ExprNode.hh
+++ b/ExprNode.hh
@@ -489,6 +489,12 @@ class ExprNode
       //! Returns true if model_info_name is referenced by a VarExpectationNode
       virtual bool isVarModelReferenced(const string &model_info_name) const = 0;
 
+      //! Fills parameter information related to PAC equation
+      virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const = 0;
+
+      //! Adds PAC equation param info to pac_expectation
+      virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg) = 0;
+
       //! Fills var_model info for pac_expectation node
       virtual void fillPacExpectationVarInfo(string &var_model_name, vector<int> &lhs, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg) = 0;
 
@@ -560,6 +566,8 @@ public:
   virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
   virtual bool isInStaticForm() const;
   virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
+  virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
+  virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
   virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
   virtual bool isVarModelReferenced(const string &model_info_name) const;
   virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@@ -639,6 +647,8 @@ public:
   virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
   virtual bool isInStaticForm() const;
   virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
+  virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
+  virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
   virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
   virtual bool isVarModelReferenced(const string &model_info_name) const;
   virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@@ -741,6 +751,8 @@ public:
   virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
   virtual bool isInStaticForm() const;
   virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
+  virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
+  virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
   virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
   virtual bool isVarModelReferenced(const string &model_info_name) const;
   virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@@ -861,6 +873,8 @@ public:
   expr_t getNonZeroPartofEquation() const;
   virtual bool isInStaticForm() const;
   virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
+  virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
+  virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
   virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
   virtual bool isVarModelReferenced(const string &model_info_name) const;
   virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@@ -949,6 +963,8 @@ public:
   virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
   virtual bool isInStaticForm() const;
   virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
+  virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
+  virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
   virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
   virtual bool isVarModelReferenced(const string &model_info_name) const;
   virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@@ -1045,6 +1061,8 @@ public:
   virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
   virtual bool isInStaticForm() const;
   virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
+  virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
+  virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
   virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
   virtual bool isVarModelReferenced(const string &model_info_name) const;
   virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@@ -1234,6 +1252,8 @@ public:
   virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
   virtual bool isInStaticForm() const;
   virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
+  virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
+  virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
   virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
   virtual bool isVarModelReferenced(const string &model_info_name) const;
   virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
@@ -1251,6 +1271,7 @@ private:
   map<int, set<int > > z_vec; // lag -> set< symb_id > (all vars that appear at a given lag)
   vector<int> h0_indices, h1_indices;
   int growth_param_index, equation_number;
+  set<pair<int, pair<int, int> > > params_and_vals;
 public:
   PacExpectationNode(DataTree &datatree_arg, const string &model_name, const string &var_model_name,
                      const int discount_arg, const int growth_arg);
@@ -1305,6 +1326,8 @@ public:
   virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
   virtual bool isInStaticForm() const;
   virtual void setVarExpectationIndex(map<string, pair<SymbolList, int> > &var_model_info);
+  virtual void walkPacParameters(bool &pac_encountered, set<pair<int, pair<int, int> > > &params_and_vals) const;
+  virtual void addParamInfoToPac(set<pair<int, pair<int, int> > > &params_and_vals_arg);
   virtual void fillPacExpectationVarInfo(string &var_model_name_arg, vector<int> &lhs_arg, map<int, set<int > > &rhs_arg, vector<bool> &nonstationary_arg, int equation_number_arg);
   virtual bool isVarModelReferenced(const string &model_info_name) const;
   virtual void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const;
diff --git a/ModFile.cc b/ModFile.cc
index faf33ece44b58c3fb84b60fefdd19e25067005ed..eb4a374b2b73e53277f46c15769ee4030dbff03e 100644
--- a/ModFile.cc
+++ b/ModFile.cc
@@ -389,6 +389,7 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, const
               map<int, set<int > > rhs_pac;
               vms->getVarModelName(var_model_name);
               vms->getVarModelRHS(rhs_pac);
+              dynamic_model.walkPacParameters();
               dynamic_model.fillPacExpectationVarInfo(var_model_name, lhs, rhs_pac, nonstationary);
               dynamic_model.substitutePacExpectation();
             }