diff --git a/preprocessor/ComputingTasks.cc b/preprocessor/ComputingTasks.cc
index fcbda92303042618d8150f1a086b02e1c5f689f6..542cb55a79b3c113dd96c193f1510020e9338987 100644
--- a/preprocessor/ComputingTasks.cc
+++ b/preprocessor/ComputingTasks.cc
@@ -1652,6 +1652,57 @@ MarkovSwitchingStatement::writeOutput(ostream &output, const string &basename) c
            << itR->first.second << ", " << itR->second << "]};" << endl;
 }
 
+void
+MarkovSwitchingStatement::writeCOutput(ostream &output, const string &basename)
+{
+  output << endl;
+
+  OptionsList::num_options_t::const_iterator it =
+    options_list.num_options.find("ms.chain");
+  assert(it !=  options_list.num_options.end());
+  output << "chain = " << it->second << ";" << endl;
+
+  it = options_list.num_options.find("ms.number_of_regimes");
+  assert(it !=  options_list.num_options.end());
+  output << "number_of_regimes = " << it->second << ";" << endl;
+
+  it = options_list.num_options.find("ms.number_of_lags");
+  if (it !=  options_list.num_options.end())
+    output << "number_of_lags = " << it->second << ";" << endl
+           << "number_of_lags_was_passed = true;" << endl;
+  else
+    output << "number_of_lags_was_passed = false;" << endl;
+
+  it = options_list.num_options.find("ms.duration");
+  assert(it != options_list.num_options.end());
+  output << "duration.clear();" << endl;
+  using namespace boost;
+  vector<string> tokenizedDomain;
+  split(tokenizedDomain, it->second, is_any_of("[ ]"), token_compress_on);
+  for (vector<string>::iterator itvs = tokenizedDomain.begin();
+       itvs != tokenizedDomain.end(); itvs++ )
+    if (!itvs->empty())
+      output << "duration.push_back(" << *itvs << ");" << endl;
+
+  OptionsList::symbol_list_options_t::const_iterator itsl =
+    options_list.symbol_list_options.find("ms.parameters");
+  assert(itsl != options_list.symbol_list_options.end());
+  vector<string> parameters = itsl->second.get_symbols();
+  output << "parameters.clear();" << endl;
+  for (vector<string>::iterator itp = parameters.begin();
+       itp != parameters.end(); itp++ )
+    output << "parameters.push_back(param_names[\"" << *itp << "\"]);" << endl;
+
+  output << "restriction_map.clear();" << endl;
+  for (map <pair<int, int >, double >::iterator itrm = restriction_map.begin();
+       itrm != restriction_map.end(); itrm++)
+    output << "restriction_map[make_pair(" << itrm->first.first << ","
+           << itrm->first.second << ")] = " << itrm->second << ";" << endl;
+
+  output << "msdsgeinfo->addMarkovSwitching(new MarkovSwitching(" << endl
+         << "     chain, number_of_regimes, number_of_lags, number_of_lags_was_passed, parameters, duration, restriction_map));" << endl;
+}
+
 SvarStatement::SvarStatement(const OptionsList &options_list_arg) :
   options_list(options_list_arg)
 {
@@ -1950,6 +2001,14 @@ BasicPriorStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsoli
     }
 }
 
+bool
+BasicPriorStatement::is_structural_innovation(const SymbolType symb_type) const
+{
+  if (symb_type == eExogenous || symb_type == eExogenousDet)
+    return true;
+  return false;
+}
+
 void
 BasicPriorStatement::get_base_name(const SymbolType symb_type, string &lhs_field) const
 {
@@ -2007,6 +2066,73 @@ BasicPriorStatement::writePriorOutput(ostream &output, string &lhs_field, const
   writeCommonOutput(output, lhs_field);
 }
 
+void
+BasicPriorStatement::writeCVarianceOption(ostream &output) const
+{
+  output << "variance = ";
+  if (variance)
+    variance->writeOutput(output);
+  else
+    output << "numeric_limits<double>::quiet_NaN()";
+  output << ";" << endl;
+}
+
+void
+BasicPriorStatement::writeCDomain(ostream &output) const
+{
+  output << "domain.clear();" << endl;
+  OptionsList::num_options_t::const_iterator it_num = options_list.num_options.find("domain");
+  if (it_num != options_list.num_options.end())
+    {
+      using namespace boost;
+      vector<string> tokenizedDomain;
+      split(tokenizedDomain, it_num->second, is_any_of("[ ]"), token_compress_on);
+      for (vector<string>::iterator it = tokenizedDomain.begin();
+           it != tokenizedDomain.end(); it++ )
+        if (!it->empty())
+          output << "domain.push_back(" << *it << ");" << endl;
+    }
+}
+
+void
+BasicPriorStatement::writeCOutputHelper(ostream &output, const string &field) const
+{
+  OptionsList::num_options_t::const_iterator itn = options_list.num_options.find(field);
+  if (itn != options_list.num_options.end())
+    output << field << " = " << itn->second << ";" << endl;
+  else
+    output << field << " = " << "numeric_limits<double>::quiet_NaN();" << endl;
+}
+
+void
+BasicPriorStatement::writeCShape(ostream &output) const
+{
+  output << "shape = ";
+  switch (prior_shape)
+    {
+    case eBeta:
+      output  << "\"beta\";" << endl;
+      break;
+    case eGamma:
+      output  << "\"gamma\";" << endl;
+      break;
+    case eNormal:
+      output  << "\"normal\";" << endl;
+      break;
+    case eInvGamma:
+      output  << "\"inv_gamma\";" << endl;
+      break;
+    case eUniform:
+      output  << "\"uniform\";" << endl;
+      break;
+    case eInvGamma2:
+      output  << "\"inv_gamma2\";" << endl;
+      break;
+    case eNoShape:
+      assert(prior_shape != eNoShape);
+    }
+}
+
 PriorStatement::PriorStatement(const string &name_arg,
                                const string &subsample_name_arg,
                                const PriorDistributions &prior_shape_arg,
@@ -2026,6 +2152,23 @@ PriorStatement::writeOutput(ostream &output, const string &basename) const
   writePriorOutput(output, lhs_field, "");
 }
 
+void
+PriorStatement::writeCOutput(ostream &output, const string &basename)
+{
+  output << endl
+         << "index = param_names[\""<< name << "\"];" << endl;
+  writeCShape(output);
+  writeCOutputHelper(output, "mean");
+  writeCOutputHelper(output, "mode");
+  writeCOutputHelper(output, "stdev");
+  writeCVarianceOption(output);
+  writeCDomain(output);
+
+  output << "msdsgeinfo->addPrior(new ModFilePrior(" << endl
+         << "     index, shape, mean, mode, stdev, variance, domain));" << endl;
+
+}
+
 StdPriorStatement::StdPriorStatement(const string &name_arg,
                                      const string &subsample_name_arg,
                                      const PriorDistributions &prior_shape_arg,
@@ -2050,6 +2193,31 @@ StdPriorStatement::writeOutput(ostream &output, const string &basename) const
   writePriorOutput(output, lhs_field, "");
 }
 
+void
+StdPriorStatement::writeCOutput(ostream &output, const string &basename)
+{
+  output << endl
+         << "index = ";
+  if (is_structural_innovation(symbol_table.getType(name)))
+    output << "exo_names";
+  else
+    output << "endo_names";
+  output << "[\""<< name << "\"];" << endl;
+
+  writeCShape(output);
+  writeCOutputHelper(output, "mean");
+  writeCOutputHelper(output, "mode");
+  writeCOutputHelper(output, "stdev");
+  writeCVarianceOption(output);
+  writeCDomain(output);
+
+  if (is_structural_innovation(symbol_table.getType(name)))
+    output << "msdsgeinfo->addStructuralInnovationPrior(new ModFileStructuralInnovationPrior(";
+  else
+    output << "msdsgeinfo->addMeasurementErrorPrior(new ModFileMeasurementErrorPrior(";
+  output << endl << "     index, shape, mean, mode, stdev, variance, domain));" << endl;
+}
+
 CorrPriorStatement::CorrPriorStatement(const string &name_arg1, const string &name_arg2,
                                        const string &subsample_name_arg,
                                        const PriorDistributions &prior_shape_arg,
@@ -2111,6 +2279,42 @@ PriorEqualStatement::PriorEqualStatement(const string &to_declaration_type_arg,
 {
 }
 
+void
+CorrPriorStatement::writeCOutput(ostream &output, const string &basename)
+{
+  output << endl
+         << "index = ";
+  if (is_structural_innovation(symbol_table.getType(name)))
+    output << "exo_names";
+  else
+    output << "endo_names";
+  output << "[\""<< name << "\"];" << endl;
+
+  output << "index1 = ";
+  if (is_structural_innovation(symbol_table.getType(name1)))
+    output << "exo_names";
+  else
+    output << "endo_names";
+  output << "[\""<< name1 << "\"];" << endl;
+
+  writeCShape(output);
+  writeCOutputHelper(output, "mean");
+  writeCOutputHelper(output, "mode");
+  writeCOutputHelper(output, "stdev");
+  writeCVarianceOption(output);
+  writeCDomain(output);
+
+  if (is_structural_innovation(symbol_table.getType(name)))
+    output << "msdsgeinfo->addStructuralInnovationCorrPrior(new ModFileStructuralInnovationCorrPrior(";
+  else
+    output << "msdsgeinfo->addMeasurementErrorCorrPrior(new ModFileMeasurementErrorCorrPrior(";
+  output << endl <<"     index, index1, shape, mean, mode, stdev, variance, domain));" << endl;
+}
+
+BasicOptionsStatement::~BasicOptionsStatement()
+{
+}
+
 void
 PriorEqualStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
diff --git a/preprocessor/ComputingTasks.hh b/preprocessor/ComputingTasks.hh
index feddfbbc2ebe1b857453d2c6d0be6847b7df6f43..c76728fe4b326b88a97f043bd28d95a09ed64dc8 100644
--- a/preprocessor/ComputingTasks.hh
+++ b/preprocessor/ComputingTasks.hh
@@ -571,6 +571,7 @@ public:
   MarkovSwitchingStatement(const OptionsList &options_list_arg);
   virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
+  virtual void writeCOutput(ostream &output, const string &basename);
 };
 
 class SvarStatement : public Statement
@@ -658,6 +659,15 @@ protected:
   void writeCommonOutput(ostream &output, const string &lhs_field) const;
   void writeCommonOutputHelper(ostream &output, const string &field, const string &lhs_field) const;
   void writePriorOutput(ostream &output, string &lhs_field, const string &name2) const;
+  bool is_structural_innovation(const SymbolType symb_type) const;
+  void writePriorIndex(ostream &output, const string &lhs_field) const;
+  void writeVarianceOption(ostream &output, const string &lhs_field) const;
+  void writeOutputHelper(ostream &output, const string &field, const string &lhs_field) const;
+  void writeShape(ostream &output, const string &lhs_field) const;
+  void writeCOutputHelper(ostream &output, const string &field) const;
+  void writeCShape(ostream &output) const;
+  void writeCVarianceOption(ostream &output) const;
+  void writeCDomain(ostream &output) const;
 };
 
 class PriorStatement : public BasicPriorStatement
@@ -669,6 +679,7 @@ public:
                  const expr_t &variance_arg,
                  const OptionsList &options_list_arg);
   virtual void writeOutput(ostream &output, const string &basename) const;
+  virtual void writeCOutput(ostream &output, const string &basename);
 };
 
 class StdPriorStatement : public BasicPriorStatement
@@ -683,6 +694,7 @@ public:
                     const OptionsList &options_list_arg,
                     const SymbolTable &symbol_table_arg);
   virtual void writeOutput(ostream &output, const string &basename) const;
+  virtual void writeCOutput(ostream &output, const string &basename);
 };
 
 class CorrPriorStatement : public BasicPriorStatement
@@ -727,6 +739,7 @@ public:
   void get_base_name(const SymbolType symb_type, string &lhs_field) const;
   virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
+  virtual void writeCOutput(ostream &output, const string &basename);
 };
 
 class BasicOptionsStatement : public Statement
diff --git a/preprocessor/ModFile.cc b/preprocessor/ModFile.cc
index a5ab0a424d436487f47ff8c6ae9d60aa80f819a2..bb2a45fb0a27cb0f59ac73845409cedff0d4b9d7 100644
--- a/preprocessor/ModFile.cc
+++ b/preprocessor/ModFile.cc
@@ -823,7 +823,7 @@ ModFile::writeCOutputFiles(const string &basename) const
   statfile = basename + "_static_mex.c";
   unlink(statfile.c_str());
 
-  string filename = "cdriver.cc";
+  string filename = "preprocessorOutput.cc";
   unlink(filename.c_str());
 
   ofstream mDriverCFile;
@@ -839,12 +839,12 @@ ModFile::writeCOutputFiles(const string &basename) const
                << " *" << endl
                << " * Warning : this file is generated automatically by Dynare" << endl
                << " *           from model file (.mod)" << endl
-               << endl
                << " */" << endl
                << endl
                << "#include \"ms_dsge_c_driver.hh\"" << endl
                << endl
-               << "int main()" << endl
+               << "MsDsgeInfo *" << endl
+               << "preprocessorOutput()" << endl
                << "{" << endl;
 
   // Write basic info
@@ -854,13 +854,25 @@ ModFile::writeCOutputFiles(const string &basename) const
 
   mDriverCFile << "/*" << endl
                << " * Writing statements" << endl
-               << " */" << endl;
+               << " */" << endl
+               << "/* prior args*/" << endl
+               << "MsDsgeInfo *msdsgeinfo = new MsDsgeInfo(exo_names, exo_det_names, endo_names, param_names, params, aux_vars, predetermined_variables, varobs, lead_lag_incidence, NNZDerivatives);" << endl
+               << "int index, index1;" << endl
+               << "string shape;" << endl
+               << "double mean, mode, stdev, variance;" << endl
+               << "vector<double> domain;" << endl
+               << "/* markov_switching args*/" << endl
+               << "int chain, number_of_regimes, number_of_lags, number_of_lags_was_passed;" << endl
+               << "vector<int> parameters;" << endl
+               << "vector<double> duration;" << endl
+               << "restriction_map_t restriction_map;" << endl << endl;
 
   // Print statements
   for (vector<Statement *>::const_iterator it = statements.begin();
        it != statements.end(); it++)
       (*it)->writeCOutput(mDriverCFile, basename);
 
+  mDriverCFile << "return msdsgeinfo;" << endl;
   mDriverCFile << "}" << endl;
   mDriverCFile.close();