diff --git a/ComputingTasks.cc b/ComputingTasks.cc
index f280d34167e96cfc28b9105ed96170468fb6404e..123c6ebb836d09501a511199f6409faea614d4e1 100644
--- a/ComputingTasks.cc
+++ b/ComputingTasks.cc
@@ -827,16 +827,16 @@ ModelComparisonStatement::writeOutput(ostream &output, const string &basename) c
 {
   options_list.writeOutput(output);
 
-  output << "ModelNames_ = {};" << endl;
-  output << "ModelPriors_ = [];" << endl;
+  output << "ModelNames_ = {};\n";
+  output << "ModelPriors_ = {};\n";
 
   for(filename_list_type::const_iterator it = filename_list.begin();
       it != filename_list.end(); it++)
     {
-      output << "ModelNames_ = { ModelNames_{:} '" << it->first << "'};" << endl;
-      output << "ModelPriors_ = [ ModelPriors_ ; " << it->second << "];" << endl;
+      output << "ModelNames_ = { ModelNames_{:} '" << it->first << "};\n";
+      output << "ModelPriors_ = { ModelPriors_{:} '" << it->second << "};\n";
     }
-  output << "model_comparison(ModelNames_,ModelPriors_,oo_,options_,M_.fname);" << endl;
+  output << "model_comparison(ModelNames_,ModelPriors_);\n";
 }
 
 PlannerObjectiveStatement::PlannerObjectiveStatement(ModelTree *model_tree_arg) :
diff --git a/DynareBison.yy b/DynareBison.yy
index 2405142fa278b8d2430b6ed3e75d75715366f1ea..b2360f78057897e8ad47b744e665cb280b45f643 100644
--- a/DynareBison.yy
+++ b/DynareBison.yy
@@ -87,8 +87,7 @@ class ParsingDriver;
 %token CALIB CALIB_VAR CHECK CONF_SIG CONSTANT CORR COVAR CUTOFF
 %token DATAFILE DR_ALGO DROP DSAMPLE DYNASAVE DYNATYPE
 %token END ENDVAL EQUAL ESTIMATION ESTIMATED_PARAMS ESTIMATED_PARAMS_BOUNDS ESTIMATED_PARAMS_INIT
-%token <string_val> FILENAME
-%token FILENAME_KEYWORD FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS
+%token FILENAME FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS
 %token <string_val> FLOAT_NUMBER
 %token FORECAST
 %token GAMMA_PDF GAUSSIAN_ELIMINATION GCC_COMPILER GMRES GRAPH
@@ -97,11 +96,10 @@ class ParsingDriver;
 %token <string_val> INT_NUMBER
 %token INV_GAMMA1_PDF INV_GAMMA2_PDF IRF
 %token KALMAN_ALGO KALMAN_TOL
-%token LAPLACE LCC_COMPILER LIK_ALGO LIK_INIT LINEAR LOAD_MH_FILE LOGLINEAR LU
-%token MARKOWITZ MARGINAL_DENSITY MAX
+%token LAPLACE LCC_COMPILER LIK_ALGO LIK_INIT LINEAR LOAD_MH_FILE LOGLINEAR LU MARKOWITZ MAX
 %token METHOD MH_DROP MH_INIT_SCALE MH_JSCALE MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER MIN
 %token MODE_CHECK MODE_COMPUTE MODE_FILE MODEL MODEL_COMPARISON MODEL_INFO MSHOCKS
-%token MODIFIEDHARMONICMEAN MOMENTS_VARENDO DIFFUSE_FILTER
+%token MODEL_COMPARISON_APPROXIMATION MODIFIEDHARMONICMEAN MOMENTS_VARENDO DIFFUSE_FILTER
 %token <string_val> NAME
 %token NO_COMPILER NOBS NOCONSTANT NOCORR NODIAGNOSTIC NOFUNCTIONS
 %token NOGRAPH NOMOMENTS NOPRINT NORMAL_PDF
@@ -137,7 +135,7 @@ class ParsingDriver;
 %type <node_val> expression
 %type <node_val> equation hand_side model_var
 %type <string_val> signed_float signed_integer prior
-%type <string_val> value value1 vec_int_elem vec_int_1 vec_int
+%type <string_val> value value1 filename filename_elem vec_int_elem vec_int_1 vec_int
 %type <string_val> vec_value_1 vec_value
 %type <string_val> calib_arg2 range number
 
@@ -372,7 +370,7 @@ comma_expression : expression
 initval : INITVAL ';' initval_list END
           { driver.end_initval(); }
 
-initval_file : INITVAL_FILE '(' FILENAME_KEYWORD EQUAL NAME ')' ';'
+initval_file : INITVAL_FILE '(' FILENAME EQUAL NAME ')' ';'
                { driver.initval_file($5); }
              ;
 
@@ -1119,25 +1117,44 @@ dynasave : DYNASAVE '(' NAME ')'';'
            { driver.run_dynasave($2, $4); }
          ;
 
-model_comparison : MODEL_COMPARISON mc_filename_list ';'
-                   { driver.run_model_comparison(); }
-                 | MODEL_COMPARISON '(' o_marginal_density ')' mc_filename_list ';'
-                   { driver.run_model_comparison(); }
-                 ;
+model_comparison : MODEL_COMPARISON '(' model_comparison_options ')' filename_list ';'
+                   { driver.run_model_comparison(); };
 
-mc_filename_list : FILENAME
-                   { driver.add_mc_filename($1); }
-                 | FILENAME '(' value ')'
-                   { driver.add_mc_filename($1, $3); }
-                 | mc_filename_list FILENAME
-                   { driver.add_mc_filename($2); }
-                 | mc_filename_list FILENAME '(' value ')'
-                   { driver.add_mc_filename($2, $4); }
-                 | mc_filename_list COMMA FILENAME
-                   { driver.add_mc_filename($3); }
-                 | mc_filename_list COMMA FILENAME '(' value ')'
-                   { driver.add_mc_filename($3, $5); }
-                 ;
+model_comparison_options : model_comparison_options COMMA model_comparison_option
+                         | model_comparison_option
+                         ;
+
+model_comparison_option : o_model_comparison_approximation
+                        | o_print
+                        | o_noprint
+                        ;
+
+filename_list : filename
+                { driver.add_mc_filename($1); }
+              | filename_list COMMA filename
+                { driver.add_mc_filename($3); }
+              | filename '(' value ')'
+                { driver.add_mc_filename($1, $3); }
+              | filename_list COMMA filename '(' value ')'
+                { driver.add_mc_filename($3, $5); }
+              ;
+
+filename : filename_elem
+           { $$ = $1; }
+         | filename filename_elem
+           { $1->append(*$2); delete $2; $$ = $1; }
+         ;
+
+filename_elem : NAME
+              | '\\'
+                { $$ = new string("\\"); }
+              | DIVIDE
+                { $$ = new string("/"); }
+              | ':'
+                { $$ = new string(":"); }
+              | '.'
+                { $$ = new string("."); }
+              ;
 
 planner_objective : PLANNER_OBJECTIVE { driver.begin_planner_objective(); }
                     hand_side { driver.end_planner_objective($3); } ';';
@@ -1358,11 +1375,11 @@ o_filtered_vars : FILTERED_VARS { driver.option_num("filtered_vars", "1"); };
 o_relative_irf : RELATIVE_IRF { driver.option_num("relative_irf", "1"); };
 o_kalman_algo : KALMAN_ALGO EQUAL INT_NUMBER { driver.option_num("kalman_algo", $3); };
 o_kalman_tol : KALMAN_TOL EQUAL INT_NUMBER { driver.option_num("kalman_tol", $3); };
-o_marginal_density : MARGINAL_DENSITY EQUAL LAPLACE
-                     { driver.option_str("mc_marginal_density", "laplace"); }
-                   | MARGINAL_DENSITY EQUAL MODIFIEDHARMONICMEAN
-                     { driver.option_str("mc_marginal_density", "modifiedharmonicmean"); }
-                   ;
+o_model_comparison_approximation : MODEL_COMPARISON_APPROXIMATION EQUAL LAPLACE
+                                   { driver.option_str("model_comparison_approximation", "Laplace"); }
+                                 | MODEL_COMPARISON_APPROXIMATION EQUAL MODIFIEDHARMONICMEAN
+                                   { driver.option_str("model_comparison_approximation", "MODIFIEDHARMONICMEAN"); }
+                                 ;
 o_print : PRINT { driver.option_num("noprint", "0"); };
 o_noprint : NOPRINT { driver.option_num("noprint", "1"); };
 o_xls_sheet : XLS_SHEET EQUAL NAME { driver.option_str("xls_sheet", $3); };
diff --git a/DynareFlex.ll b/DynareFlex.ll
index e49b22d31fa440798a0def640391f1aed848ca85..6a2ebd90feb7aeb6f5d8a61e5f639a1b82439d5f 100644
--- a/DynareFlex.ll
+++ b/DynareFlex.ll
@@ -204,13 +204,13 @@ int sigma_e = 0;
 <DYNARE_STATEMENT>periods	{return token::PERIODS;}
 <DYNARE_STATEMENT>cutoff	{return token::CUTOFF;}
 <DYNARE_STATEMENT>markowitz	{return token::MARKOWITZ;}
-<DYNARE_STATEMENT>marginal_density {return token::MARGINAL_DENSITY;}
+<DYNARE_STATEMENT>model_comparison_approximation {return token::MODEL_COMPARISON;}
 <DYNARE_STATEMENT>laplace {return token::LAPLACE;}
 <DYNARE_STATEMENT>modifiedharmonicmean {return token::MODIFIEDHARMONICMEAN;}
 <DYNARE_STATEMENT>constant	{return token::CONSTANT;}
 <DYNARE_STATEMENT>noconstant	{return token::NOCONSTANT;}
 <DYNARE_STATEMENT>covar {return token::COVAR;}
-<DYNARE_STATEMENT>filename {return token::FILENAME_KEYWORD;}
+<DYNARE_STATEMENT>filename {return token::FILENAME;}
 <DYNARE_STATEMENT>diffuse_filter {return token::DIFFUSE_FILTER;}
 
 <DYNARE_STATEMENT>bvar_prior_tau { return token::BVAR_PRIOR_TAU; }
@@ -380,11 +380,6 @@ int sigma_e = 0;
   return token::INT_NUMBER;
 }
 
-<DYNARE_STATEMENT,DYNARE_BLOCK>[A-Za-z0-9_/:\\\.]+ {
-  yylval->string_val = new string(yytext);
-  return token::FILENAME;
-}
-
  /* an instruction starting with a recognized symbol (which is not a modfile local variable)
     is passed as NAME,
     otherwise it is a native statement until the end of the line
diff --git a/include/ComputingTasks.hh b/include/ComputingTasks.hh
index 04426a1fbec30592a0a6af89e7076062052a0758..1d5a749b55467060afe6ecd295e51a23eb507ac9 100644
--- a/include/ComputingTasks.hh
+++ b/include/ComputingTasks.hh
@@ -292,7 +292,7 @@ public:
 class ModelComparisonStatement : public Statement
 {
 public:
-  typedef map<string, string> filename_list_type;
+  typedef map<string, string, less<string> > filename_list_type;
 private:
   filename_list_type filename_list;
   OptionsList options_list;