diff --git a/doc/dynare.texi b/doc/dynare.texi
index a50248eeac6df894ec56d5f8d4befe99b77f490c..75cec054cd7ef4b86971c8b4b716f919ac6a3cce 100644
--- a/doc/dynare.texi
+++ b/doc/dynare.texi
@@ -4322,7 +4322,7 @@ Use @code{plot_conditional_forecast} to graph the results.
 
 @table @code
 
-@item parameter_set = @code{prior_mode} | @code{prior_mean} | @code{posterior_mode} | @code{posterior_mean} | @code{posterior_median}
+@item parameter_set = @code{calibration} | @code{prior_mode} | @code{prior_mean} | @code{posterior_mode} | @code{posterior_mean} | @code{posterior_median}
 Specify the parameter set to use for the forecasting. No default
 value, mandatory option.
 
@@ -4362,7 +4362,7 @@ end;
 
 conditional_forecast(parameter_set = calibration, controlled_varexo = (e, u), replic = 3000);
 
-plot_conditional_forecast(periods = 10) e u;
+plot_conditional_forecast(periods = 10) a y;
 @end example
 
 @end deffn
diff --git a/matlab/imcforecast.m b/matlab/imcforecast.m
index b7f5a214c02a75725b8d3469b74f2bdf511f1232..726b09815c43807b72ddc8bb028e4a1d327bead4 100644
--- a/matlab/imcforecast.m
+++ b/matlab/imcforecast.m
@@ -45,38 +45,10 @@ function imcforecast(constrained_paths, constrained_vars, options_cond_fcst)
 
 global options_ oo_ M_ bayestopt_
 
-if isfield(options_cond_fcst,'parameter_set') || isempty(options_cond_fcst.parameter_set)
+if ~isfield(options_cond_fcst,'parameter_set') || isempty(options_cond_fcst.parameter_set)
     options_cond_fcst.parameter_set = 'posterior_mode';
 end
 
-if ischar(options_cond_fcst.parameter_set)
-    switch options_cond_fcst.parameter_set
-      case 'posterior_mode'
-        xparam = get_posterior_parameters('mode');
-      case 'posterior_mean'
-        xparam = get_posterior_parameters('mean');
-      case 'posterior_median'
-        xparam = get_posterior_parameters('median');
-      case 'prior_mode'
-        xparam = bayestopt_.p5(:);
-      case 'prior_mean'
-        xparam = bayestopt_.p1;
-      otherwise
-        disp('eval_likelihood:: If the input argument is a string, then it has to be equal to:')
-        disp('                   ''posterior_mode'', ')
-        disp('                   ''posterior_mean'', ')
-        disp('                   ''posterior_median'', ')
-        disp('                   ''prior_mode'' or')
-        disp('                   ''prior_mean''.')
-        error('imcforecast:: Wrong argument type!')
-    end
-else
-    xparam = options_cond_fcst.parameter_set;
-    if length(xparam)~=length(M_.params)
-        error('imcforecast:: The dimension of the vector of parameters doesn''t match the number of estimated parameters!')
-    end
-end
-
 if ~isfield(options_cond_fcst,'replic') || isempty(options_cond_fcst.replic)
     options_cond_fcst.replic = 5000;
 end
@@ -89,56 +61,100 @@ if ~isfield(options_cond_fcst,'conf_sig') || isempty(options_cond_fcst.conf_sig)
     options_cond_fcst.conf_sig = .8;
 end
 
-set_parameters(xparam);
-
-n_varobs = size(options_.varobs,1);
-rawdata = read_variables(options_.datafile,options_.varobs,[],options_.xls_sheet,options_.xls_range);
-options_ = set_default_option(options_,'nobs',size(rawdata,1)-options_.first_obs+1);
-gend = options_.nobs;
-rawdata = rawdata(options_.first_obs:options_.first_obs+gend-1,:);
-% Transform the data.
-if options_.loglinear
-    if ~options_.logdata
-        rawdata = log(rawdata);  
-    end
-end
-% Test if the data set is real.
-if ~isreal(rawdata)
-    error('There are complex values in the data! Probably  a wrong transformation')
-end
-% Detrend the data.
-options_.missing_data = any(any(isnan(rawdata)));
-if options_.prefilter == 1
-    if options_.missing_data
-        bayestopt_.mean_varobs = zeros(n_varobs,1);
-        for variable=1:n_varobs
-            rdx = find(~isnan(rawdata(:,variable)));
-            m = mean(rawdata(rdx,variable));
-            rawdata(rdx,variable) = rawdata(rdx,variable)-m;
-            bayestopt_.mean_varobs(variable) = m;
+if isequal(options_cond_fcst.parameter_set,'calibration')
+    estimated_model = 0;
+else
+    estimated_model = 1;
+end
+
+if estimated_model
+    if ischar(options_cond_fcst.parameter_set)
+        switch options_cond_fcst.parameter_set
+          case 'posterior_mode'
+            xparam = get_posterior_parameters('mode');
+          case 'posterior_mean'
+            xparam = get_posterior_parameters('mean');
+          case 'posterior_median'
+            xparam = get_posterior_parameters('median');
+          case 'prior_mode'
+            xparam = bayestopt_.p5(:);
+          case 'prior_mean'
+            xparam = bayestopt_.p1;
+          otherwise
+            disp('imcforecast:: If the input argument is a string, then it has to be equal to:')
+            disp('                   ''calibration'', ')
+            disp('                   ''posterior_mode'', ')
+            disp('                   ''posterior_mean'', ')
+            disp('                   ''posterior_median'', ')
+            disp('                   ''prior_mode'' or')
+            disp('                   ''prior_mean''.')
+            error('imcforecast:: Wrong argument type!')
         end
     else
-        bayestopt_.mean_varobs = mean(rawdata,1)';
-        rawdata = rawdata-repmat(bayestopt_.mean_varobs',gend,1);
+        xparam = options_cond_fcst.parameter_set;
+        if length(xparam)~=length(M_.params)
+            error('imcforecast:: The dimension of the vector of parameters doesn''t match the number of estimated parameters!')
+        end
     end
-end
-data = transpose(rawdata);
-% Handle the missing observations.
-[data_index,number_of_observations,no_more_missing_observations] = describe_missing_data(data,gend,n_varobs);
-missing_value = ~(number_of_observations == gend*n_varobs);
-
-[atT,innov,measurement_error,filtered_state_vector,ys,trend_coeff] = DsgeSmoother(xparam,gend,data,data_index,number_of_observations);
 
-trend = repmat(ys,1,options_cond_fcst.periods+1);
-for i=1:M_.endo_nbr
-    j = strmatch(deblank(M_.endo_names(i,:)),options_.varobs,'exact');
-    if ~isempty(j)
-        trend(i,:) = trend(i,:)+trend_coeff(j)*(gend+(0:options_cond_fcst.periods));
+    set_parameters(xparam);
+
+    n_varobs = size(options_.varobs,1);
+    rawdata = read_variables(options_.datafile,options_.varobs,[],options_.xls_sheet,options_.xls_range);
+    options_ = set_default_option(options_,'nobs',size(rawdata,1)-options_.first_obs+1);
+    gend = options_.nobs;
+    rawdata = rawdata(options_.first_obs:options_.first_obs+gend-1,:);
+    % Transform the data.
+    if options_.loglinear
+        if ~options_.logdata
+            rawdata = log(rawdata);  
+        end
+    end
+    % Test if the data set is real.
+    if ~isreal(rawdata)
+        error('There are complex values in the data! Probably  a wrong transformation')
+    end
+    % Detrend the data.
+    options_.missing_data = any(any(isnan(rawdata)));
+    if options_.prefilter == 1
+        if options_.missing_data
+            bayestopt_.mean_varobs = zeros(n_varobs,1);
+            for variable=1:n_varobs
+                rdx = find(~isnan(rawdata(:,variable)));
+                m = mean(rawdata(rdx,variable));
+                rawdata(rdx,variable) = rawdata(rdx,variable)-m;
+                bayestopt_.mean_varobs(variable) = m;
+            end
+        else
+            bayestopt_.mean_varobs = mean(rawdata,1)';
+            rawdata = rawdata-repmat(bayestopt_.mean_varobs',gend,1);
+        end
+    end
+    data = transpose(rawdata);
+    % Handle the missing observations.
+    [data_index,number_of_observations,no_more_missing_observations] = describe_missing_data(data,gend,n_varobs);
+    missing_value = ~(number_of_observations == gend*n_varobs);
+
+    [atT,innov,measurement_error,filtered_state_vector,ys,trend_coeff] = DsgeSmoother(xparam,gend,data,data_index,number_of_observations);
+
+    trend = repmat(ys,1,options_cond_fcst.periods+1);
+    for i=1:M_.endo_nbr
+        j = strmatch(deblank(M_.endo_names(i,:)),options_.varobs,'exact');
+        if ~isempty(j)
+            trend(i,:) = trend(i,:)+trend_coeff(j)*(gend+(0:options_cond_fcst.periods));
+        end
     end
+    trend = trend(oo_.dr.order_var,:);
+
+    InitState(:,1) = atT(:,end);
+else
+    InitState(:,1) = zeros(M_.endo_nbr,1);
+    trend = repmat(oo_.steady_state(oo_.dr.order_var),1,options_cond_fcst.periods+1);
 end
-trend = trend(oo_.dr.order_var,:);
 
-InitState(:,1) = atT(:,end);
+if isempty(options_.qz_criterium)
+    options_.qz_criterium = 1+1e-6;
+end
 [T,R,ys,info] = dynare_resolve;
 
 sQ = sqrt(M_.Sigma_e);
@@ -146,9 +162,7 @@ sQ = sqrt(M_.Sigma_e);
 NumberOfStates = length(InitState);
 FORCS1 = zeros(NumberOfStates,options_cond_fcst.periods+1,options_cond_fcst.replic);
 
-for b=1:options_cond_fcst.replic
-    FORCS1(:,1,b) = InitState;
-end
+FORCS1(:,1,:) = repmat(InitState,1,options_cond_fcst.replic);
 
 EndoSize = M_.endo_nbr;
 ExoSize = M_.exo_nbr;
@@ -164,7 +178,7 @@ idx = [];
 jdx = [];
 
 for i = 1:n1
-    idx = [idx ; oo_.dr.inv_order_var(strmatch(deblank(constrained_vars(i,:)),M_.endo_names,'exact'))];
+    idx = [idx ; oo_.dr.inv_order_var(constrained_vars(i,:))];
     jdx = [jdx ; strmatch(deblank(options_cond_fcst.controlled_varexo(i,:)),M_.exo_names,'exact')];
 end
 mv = zeros(n1,NumberOfStates);
@@ -182,7 +196,7 @@ end
 
 constrained_paths = bsxfun(@minus,constrained_paths,trend(idx,1:cL));
 
-randn('state',0);
+%randn('state',0);
 
 for b=1:options_cond_fcst.replic
     shocks = sQ*randn(ExoSize,options_cond_fcst.periods);
diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy
index 3a871914a6ae210cf71bec822cff7967d5bb48b9..6479f85b066699412a3ab3a496fddfe7c48bfcd5 100644
--- a/preprocessor/DynareBison.yy
+++ b/preprocessor/DynareBison.yy
@@ -94,7 +94,7 @@ class ParsingDriver;
 %token BVAR_PRIOR_MU BVAR_PRIOR_OMEGA BVAR_PRIOR_TAU BVAR_PRIOR_TRAIN
 %token BVAR_REPLIC BYTECODE
 %token CHANGE_TYPE CHECK CONDITIONAL_FORECAST CONDITIONAL_FORECAST_PATHS CONF_SIG CONSTANT CONTROLLED_VAREXO CORR COVAR CUTOFF
-%token DATAFILE DR_ALGO DROP DSAMPLE DYNASAVE DYNATYPE
+%token DATAFILE DR_ALGO DROP DSAMPLE DYNASAVE DYNATYPE CALIBRATION
 %token END ENDVAL EQUAL ESTIMATION ESTIMATED_PARAMS ESTIMATED_PARAMS_BOUNDS ESTIMATED_PARAMS_INIT
 %token FILENAME FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS
 %token <string_val> FLOAT_NUMBER
@@ -1969,6 +1969,8 @@ o_parameter_set : PARAMETER_SET EQUAL PRIOR_MODE
                   { driver.option_str("parameter_set", "posterior_mode"); }
                 | PARAMETER_SET EQUAL POSTERIOR_MEDIAN
                   { driver.option_str("parameter_set", "posterior_median"); }
+                | PARAMETER_SET EQUAL CALIBRATION
+                  { driver.option_str("parameter_set", "calibration"); }
                 ;
 o_shocks : SHOCKS EQUAL '(' list_of_symbol_lists ')' { driver.option_symbol_list("shocks"); };
 o_labels : LABELS EQUAL '(' symbol_list ')' { driver.option_symbol_list("labels"); };
diff --git a/preprocessor/DynareFlex.ll b/preprocessor/DynareFlex.ll
index 0b86c993a33d36f78b5856599b5af9d1bc589e57..414307a0ea055b00db84927b3b0de5646d467340 100644
--- a/preprocessor/DynareFlex.ll
+++ b/preprocessor/DynareFlex.ll
@@ -443,6 +443,7 @@ string eofbuff;
 <DYNARE_STATEMENT>mh_recover {return token::MH_RECOVER;}
 <DYNARE_STATEMENT>planner_discount {return token::PLANNER_DISCOUNT;}
 <DYNARE_STATEMENT>labels {return token::LABELS;}
+<DYNARE_STATEMENT>calibration {return token::CALIBRATION;}
 
 <DYNARE_BLOCK>equation {return token::EQUATION;}
 <DYNARE_BLOCK>exclusion {return token::EXCLUSION;}
diff --git a/preprocessor/Shocks.cc b/preprocessor/Shocks.cc
index 750b93679c9dab4268eaf34a203fe74edeaa2e74..eebd89fd0c5bcdbfcf3616565563daeb18455204 100644
--- a/preprocessor/Shocks.cc
+++ b/preprocessor/Shocks.cc
@@ -289,9 +289,9 @@ ConditionalForecastPathsStatement::writeOutput(ostream &output, const string &ba
        it != paths.end(); it++)
     {
       if (it == paths.begin())
-        output << "constrained_vars_ = '" << it->first << "';" << endl;
+        output << "constrained_vars_ = " << it->first << ";" << endl;
       else
-        output << "constrained_vars_ = char(constrained_vars_, '" << it->first << "');" << endl;
+        output << "constrained_vars_ = [constrained_vars_; " << it->first << "];" << endl;
 
       const vector<AbstractShocksStatement::DetShockElement> &elems = it->second;
       for (int i = 0; i < (int) elems.size(); i++)
diff --git a/tests/conditional_forecasts/fs2000.mod b/tests/conditional_forecasts/fs2000.mod
new file mode 100644
index 0000000000000000000000000000000000000000..eed075c206c3b2c0eca4e92cc9c7380fc3f9546a
--- /dev/null
+++ b/tests/conditional_forecasts/fs2000.mod
@@ -0,0 +1,72 @@
+// See fs2000.mod in the examples/ directory for details on the model
+
+var m P c e W R k d n l gy_obs gp_obs y dA;
+varexo e_a e_m;
+
+parameters alp bet gam mst rho psi del;
+
+alp = 0.33;
+bet = 0.99;
+gam = 0.003;
+mst = 1.011;
+rho = 0.7;
+psi = 0.787;
+del = 0.02;
+
+model;
+dA = exp(gam+e_a);
+log(m) = (1-rho)*log(mst) + rho*log(m(-1))+e_m;
+-P/(c(+1)*P(+1)*m)+bet*P(+1)*(alp*exp(-alp*(gam+log(e(+1))))*k^(alp-1)*n(+1)^(1-alp)+(1-del)*exp(-(gam+log(e(+1)))))/(c(+2)*P(+2)*m(+1))=0;
+W = l/n;
+-(psi/(1-psi))*(c*P/(1-n))+l/n = 0;
+R = P*(1-alp)*exp(-alp*(gam+e_a))*k(-1)^alp*n^(-alp)/W;
+1/(c*P)-bet*P*(1-alp)*exp(-alp*(gam+e_a))*k(-1)^alp*n^(1-alp)/(m*l*c(+1)*P(+1)) = 0;
+c+k = exp(-alp*(gam+e_a))*k(-1)^alp*n^(1-alp)+(1-del)*exp(-(gam+e_a))*k(-1);
+P*c = m;
+m-1+d = l;
+e = exp(e_a);
+y = k(-1)^alp*n^(1-alp)*exp(-alp*(gam+e_a));
+gy_obs = dA*y/y(-1);
+gp_obs = (P/P(-1))*m(-1)/dA;
+end;
+
+initval;
+k = 6;
+m = mst;
+P = 2.25;
+c = 0.45;
+e = 1;
+W = 4;
+R = 1.02;
+d = 0.85;
+n = 0.19;
+l = 0.86;
+y = 0.6;
+gy_obs = exp(gam);
+gp_obs = exp(-gam);
+dA = exp(gam);
+end;
+
+shocks;
+var e_a; stderr 0.014;
+var e_m; stderr 0.005;
+end;
+
+steady;
+
+check;
+
+stoch_simul(irf=0);
+
+conditional_forecast_paths;
+var gy_obs;
+periods  1  2  3:5;
+values   0.01 -0.02 0;
+var gp_obs;
+periods 1:5;
+values  0.05;
+end;
+
+conditional_forecast(parameter_set=calibration, controlled_varexo=(e_a,e_m));
+
+plot_conditional_forecast(periods=10) gy_obs gp_obs;
\ No newline at end of file