diff --git a/doc/dynare.texi b/doc/dynare.texi
index 0fbc242b278e43fd66faf4653a975b6f19e5eb01..16528a3e75cca5d7d0242102d8fcb52dca6d3f42 100644
--- a/doc/dynare.texi
+++ b/doc/dynare.texi
@@ -5809,8 +5809,8 @@ recursions as described by @cite{Herbst, 2015}. This setting is only used with
 
 @item filter_covariance
 @anchor{filter_covariance} Saves the series of one step ahead error of
-forecast covariance matrices in @ref{oo_.Smoother.Variance}. Not available 
-with Metropolis.
+forecast covariance matrices. With Metropolis, they are saved in @ref{oo_.FilterCovariance},
+otherwise in @ref{oo_.Smoother.Variance}.
 
 @item filter_step_ahead = [@var{INTEGER1}:@var{INTEGER2}]
 See below.
@@ -6287,6 +6287,23 @@ After an estimation with Metropolis, fields are of the form:
 @end example
 @end defvr
 
+@defvr {MATLAB/Octave variable} oo_.FilterCovariance
+@anchor{oo_.FilterCovariance}
+Three-dimensional array set by the @code{estimation} command if used with the
+@code{smoother} and Metropolis, if the @code{filter_covariance} option
+has been requested.
+Contains the series of one-step ahead forecast error covariance matrices
+from the Kalman smoother. The @code{M_.endo_nbr} times @code{M_.endo_nbr} times
+@code{T+1} array contains the variables in declaration order along the first 
+two dimensions. The third dimension of the array provides the
+observation for which the forecast has been made.
+Fields are of the form:
+@example
+@code{oo_.FilterCovariance.@var{MOMENT_NAME}}
+@end example
+Note that density estimation is not supported.
+@end defvr
+
 @defvr {MATLAB/Octave variable} oo_.Smoother.Variance
 @anchor{oo_.Smoother.Variance}
 Three-dimensional array set by the @code{estimation} command (if used with the
diff --git a/matlab/pm3.m b/matlab/pm3.m
index 747389d5eee8d421cd7155bb67c3f9783d72b61f..7beaab1e266462023d86f76f1cdd3d075d825a5d 100644
--- a/matlab/pm3.m
+++ b/matlab/pm3.m
@@ -86,6 +86,8 @@ fprintf(['Estimation::mcmc: ' tit1 '\n']);
 stock1 = zeros(n1,n2,B);
 k = 0;
 filter_step_ahead_indicator=0;
+filter_covar_indicator=0;
+
 for file = 1:ifil
     load([DirectoryName '/' M_.fname var_type int2str(file)]);
     if strcmp(var_type,'_filter_step_ahead')
@@ -100,10 +102,22 @@ for file = 1:ifil
         end
         stock = squeeze(stock(1,:,1+1:1+n2,:)); %1 step ahead starts at entry 2
     end
-    k = k(end)+(1:size(stock,3));
-    stock1(:,:,k) = stock;
+    if strcmp(var_type,'_filter_covar')
+        if file==1 %on first run, initialize variable for storing filter_step_ahead
+            stock1_filter_covar=NaN(n1,n2,size(stock,3),B); 
+        end
+        filter_covar_indicator=1;
+    end
+    if ~strcmp(var_type,'_filter_covar')
+        k = k(end)+(1:size(stock,3));
+        stock1(:,:,k) = stock;
+    else
+        k = k(end)+(1:size(stock,4));
+    end
     if filter_step_ahead_indicator
         stock1_filter_step_ahead(:,:,k,:) = stock_filter_step_ahead;
+    elseif filter_covar_indicator
+        stock1_filter_covar(:,:,:,k) = stock;
     end
 end
 clear stock
@@ -119,8 +133,30 @@ if filter_step_ahead_indicator
         Density_filter_step_ahead = zeros(options_.estimation.moments_posterior_density.gridpoints,2,filter_steps,nvar,n2);
     end
 end
+if filter_covar_indicator
+    draw_dimension=4;
+    oo_.FilterCovariance.Mean = squeeze(mean(stock1_filter_covar,draw_dimension));
+    oo_.FilterCovariance.Median = squeeze(median(stock1_filter_covar,draw_dimension));
+    oo_.FilterCovariance.var = squeeze(var(stock1_filter_covar,0,draw_dimension));
+    if size(stock1_filter_covar,draw_dimension)>2
+        hpd_interval = quantile(stock1_filter_covar,[(1-options_.mh_conf_sig)/2 (1-options_.mh_conf_sig)/2+options_.mh_conf_sig],draw_dimension);
+    else
+        size_matrix=size(stock1_filter_covar);
+        hpd_interval=NaN([size_matrix(1:3),2]);
+    end
+    if size(stock1_filter_covar,draw_dimension)>9
+        post_deciles =quantile(stock1_filter_covar,[0.1:0.1:0.9],draw_dimension);
+    else
+        size_matrix=size(stock1_filter_covar);
+        post_deciles=NaN([size_matrix(1:3),9]);
+    end
+    oo_.FilterCovariance.post_deciles=post_deciles;
+    oo_.FilterCovariance.HPDinf=squeeze(hpd_interval(:,:,:,1));
+    oo_.FilterCovariance.HPDsup=squeeze(hpd_interval(:,:,:,2));
+    fprintf(['Estimation::mcmc: ' tit1 ', done!\n']);
+    return
+end
 
-tmp =zeros(B,1);
 for i = 1:nvar
     for j = 1:n2
         if options_.estimation.moments_posterior_density.indicator
diff --git a/matlab/prior_posterior_statistics.m b/matlab/prior_posterior_statistics.m
index bfce7bcb3ac4269ba950d6da347e13278c7bfe44..37e00ff62d6acd04b1530a312e1e6a2af3aac68d 100644
--- a/matlab/prior_posterior_statistics.m
+++ b/matlab/prior_posterior_statistics.m
@@ -53,17 +53,14 @@ ncx  = estim_params_.ncx;
 ncn  = estim_params_.ncn;
 np   = estim_params_.np ;
 npar = nvx+nvn+ncx+ncn+np;
-offset = npar-np;
 naK = length(options_.filter_step_ahead);
 
 MaxNumberOfBytes=options_.MaxNumberOfBytes;
 endo_nbr=M_.endo_nbr;
 exo_nbr=M_.exo_nbr;
 meas_err_nbr=length(M_.Correlation_matrix_ME);
-nvobs     = length(options_.varobs);
 iendo = 1:endo_nbr;
 horizon = options_.forecast;
-filtered_vars = options_.filtered_vars;
 IdObs    = bayestopt_.mfys;
 if horizon
     i_last_obs = gend+(1-M_.maximum_endo_lag:0);
@@ -106,11 +103,14 @@ end
 
 if horizon
     MAX_nforc1 = min(B,ceil(MaxNumberOfBytes/((endo_nbr)*(horizon+maxlag))/8));
-    MAX_nforc2 = min(B,ceil(MaxNumberOfBytes/((endo_nbr)*(horizon+maxlag))/ ...
-                            8));
+    MAX_nforc2 = min(B,ceil(MaxNumberOfBytes/((endo_nbr)*(horizon+maxlag))/8));
 end
 MAX_momentsno = min(B,ceil(MaxNumberOfBytes/(get_moments_size(options_)*8)));
 
+if options_.filter_covariance
+    MAX_filter_covariance = min(B,ceil(MaxNumberOfBytes/(endo_nbr^2*(gend+1))/8));
+end
+
 varlist = options_.varlist;
 if isempty(varlist)
     varlist = M_.endo_names(1:M_.orig_endo_nbr, :);
@@ -123,39 +123,26 @@ for i=1:nvar
     end
 end
 
-irun = ones(7,1);
-ifil = zeros(7,1);
+n_variables_to_fill=8;
 
+irun = ones(n_variables_to_fill,1);
+ifil = zeros(n_variables_to_fill,1);
 
-stock_param = zeros(MAX_nruns, npar);
-stock_logpo = zeros(MAX_nruns,1);
-stock_ys = zeros(MAX_nruns,endo_nbr);
 run_smoother = 0;
-if options_.smoother
-    stock_smooth = zeros(endo_nbr,gend,MAX_nsmoo);
-    stock_innov  = zeros(exo_nbr,gend,B);
-    stock_error = zeros(nvobs,gend,MAX_nerro);
-    stock_update = zeros(endo_nbr,gend,MAX_nsmoo);
+if options_.smoother || options_.forecast || options_.filter_step_ahead
     run_smoother = 1;
 end
 
-if options_.filter_step_ahead
-    stock_filter_step_ahead = zeros(naK,endo_nbr,gend+ ...
-                                    options_.filter_step_ahead(end),MAX_naK);
-    run_smoother = 1;
-end
-if options_.forecast
-    stock_forcst_mean = zeros(endo_nbr,horizon,MAX_nforc1);
-    stock_forcst_point = zeros(endo_nbr,horizon,MAX_nforc2);
-    run_smoother = 1;
+filter_covariance=0;
+if options_.filter_covariance
+    filter_covariance=1;
 end
 
-
-
 % Store the variable mandatory for local/remote parallel computing.
 
 localVars.type=type;
 localVars.run_smoother=run_smoother;
+localVars.filter_covariance=filter_covariance;
 localVars.gend=gend;
 localVars.Y=Y;
 localVars.data_index=data_index;
@@ -182,6 +169,9 @@ localVars.MAX_nerro = MAX_nerro;
 if naK
     localVars.MAX_naK=MAX_naK;
 end
+if options_.filter_covariance
+    localVars.MAX_filter_covariance = MAX_filter_covariance;
+end
 localVars.MAX_nruns=MAX_nruns;
 localVars.MAX_momentsno = MAX_momentsno;
 localVars.ifil=ifil;
@@ -189,6 +179,7 @@ localVars.DirectoryName = DirectoryName;
 
 if strcmpi(type,'posterior'),
     b=0;
+    logpost=NaN(B,1);
     while b<=B
         b = b + 1;
         [x(b,:), logpost(b,1)] = GetOneDraw(type);
@@ -206,7 +197,7 @@ if isnumeric(options_.parallel),
     % Parallel execution!
 else
     [nCPU, totCPU, nBlockPerCPU] = distributeJobs(options_.parallel, 1, B);
-    ifil=zeros(7,totCPU);
+    ifil=zeros(n_variables_to_fill,totCPU);
     for j=1:totCPU-1,
         if run_smoother
             nfiles = ceil(nBlockPerCPU(j)/MAX_nsmoo);
@@ -228,6 +219,10 @@ else
             nfiles = ceil(nBlockPerCPU(j)/MAX_nforc2);
             ifil(7,j+1) =ifil(7,j)+nfiles;
         end
+        if options_.filter_covariance
+            nfiles = ceil(nBlockPerCPU(j)/MAX_filter_covariance);
+            ifil(8,j+1) =ifil(8,j)+nfiles;
+        end
     end
     localVars.ifil = ifil;
     globalVars = struct('M_',M_, ...
@@ -296,11 +291,17 @@ if options_.forecast
     pm3(endo_nbr,horizon,ifil(6),B,'Forecasted variables (mean)',...
         '',varlist,M_.endo_names_tex,M_.endo_names,...
         varlist,'MeanForecast',DirectoryName,'_forc_mean');
-    pm3(endo_nbr,horizon,ifil(6),B,'Forecasted variables (point)',...
+    pm3(endo_nbr,horizon,ifil(7),B,'Forecasted variables (point)',...
         '',varlist,M_.endo_names_tex,M_.endo_names,...
         varlist,'PointForecast',DirectoryName,'_forc_point');
 end
 
+if options_.filter_covariance
+    pm3(endo_nbr,endo_nbr,ifil(8),B,'Filtered covariances',...
+        '',varlist,M_.endo_names_tex,M_.endo_names,...
+        varlist,'FilterCovariance',DirectoryName,'_filter_covar');
+end
+
 
 if ~isnumeric(options_.parallel),
     options_.parallel_info.leaveSlaveOpen = leaveSlaveOpen;
diff --git a/matlab/prior_posterior_statistics_core.m b/matlab/prior_posterior_statistics_core.m
index 267029e62e0c0606965554466a4ac87dd1312840..a7e34f7d2ddbcec60a913610a4bab8db784d1ba5 100644
--- a/matlab/prior_posterior_statistics_core.m
+++ b/matlab/prior_posterior_statistics_core.m
@@ -52,6 +52,7 @@ end
 
 type=myinputs.type;
 run_smoother=myinputs.run_smoother;
+filter_covariance=myinputs.filter_covariance;
 gend=myinputs.gend;
 Y=myinputs.Y;
 data_index=myinputs.data_index;
@@ -73,6 +74,9 @@ end
 if naK
     MAX_naK=myinputs.MAX_naK;
 end
+if filter_covariance
+   MAX_filter_covariance=myinputs.MAX_filter_covariance;
+end
 
 exo_nbr=myinputs.exo_nbr;
 maxlag=myinputs.maxlag;
@@ -127,6 +131,7 @@ if RemoteFlag==1,
     OutputFileName_param = {};
     OutputFileName_forc_mean = {};
     OutputFileName_forc_point = {};
+    OutputFileName_filter_covar ={};
     % OutputFileName_moments = {};
 end
 
@@ -149,6 +154,9 @@ end
 stock_param = NaN(MAX_nruns,size(myinputs.x,2));
 stock_logpo = NaN(MAX_nruns,1);
 stock_ys = NaN(MAX_nruns,endo_nbr);
+if filter_covariance
+    stock_filter_covariance = zeros(endo_nbr,endo_nbr,gend+1,MAX_filter_covariance);
+end
 
 for b=fpar:B
     if strcmpi(type,'prior')
@@ -167,9 +175,9 @@ for b=fpar:B
 
     if run_smoother
         [dr,info,M_,options_,oo_] = resol(0,M_,options_,oo_);
-        [alphahat,etahat,epsilonhat,alphatilde,SteadyState,trend_coeff,aK,junk1,junk2,junk3,junk4,junk5,trend_addition] = ...
+        [alphahat,etahat,epsilonhat,alphatilde,SteadyState,trend_coeff,aK,junk1,junk2,P,junk4,junk5,trend_addition] = ...
             DsgeSmoother(deep,gend,Y,data_index,missing_value);
-
+                
         if options_.loglinear %reads values from smoother results, which are in dr-order and put them into declaration order
             stock_smooth(dr.order_var,:,irun(1)) = alphahat(1:endo_nbr,:)+ ...
                 repmat(log(SteadyState(dr.order_var)),1,gend);
@@ -263,6 +271,9 @@ for b=fpar:B
             stock_forcst_mean(:,:,irun(6)) = yf(maxlag+1:end,:)';
             stock_forcst_point(:,:,irun(7)) = yf1(maxlag+1:end,:)';
         end
+        if filter_covariance
+            stock_filter_covariance(dr.order_var,dr.order_var,:,irun(8)) = P;
+        end
     else
         [T,R,SteadyState,info,M_,options_,oo_] = dynare_resolve(M_,options_,oo_);
     end
@@ -270,7 +281,8 @@ for b=fpar:B
     stock_logpo(irun(5),1) = logpo;
     stock_ys(irun(5),:) = SteadyState';
 
-    irun = irun +  ones(7,1);
+
+    irun = irun +  ones(8,1);
 
 
     if run_smoother && (irun(1) > MAX_nsmoo || b == B),
@@ -348,6 +360,17 @@ for b=fpar:B
         end
         irun(7) = 1;
     end
+    
+    if run_smoother && filter_covariance && (irun(8) > MAX_filter_covariance || b == B)
+        stock = stock_filter_covariance(:,:,:,1:irun(8)-1);
+        ifil(8) = ifil(8) + 1;
+        save([DirectoryName '/' M_.fname '_filter_covar' int2str(ifil(8)) '.mat'],'stock');
+        if RemoteFlag==1,
+            OutputFileName_filter_covar = [OutputFileName_filter_covar; {[DirectoryName filesep], [M_.fname '_filter_covar' int2str(ifil(8)) '.mat']}];
+        end
+        irun(8) = 1;
+    end
+
     dyn_waitbar((b-fpar+1)/(B-fpar+1),h);
 end
 
@@ -360,7 +383,8 @@ if RemoteFlag==1,
                         OutputFileName_filter_step_ahead;
                         OutputFileName_param;
                         OutputFileName_forc_mean;
-                        OutputFileName_forc_point];
+                        OutputFileName_forc_point
+                        OutputFileName_filter_covar];
 end
 
 dyn_waitbar_close(h);
diff --git a/tests/TeX/fs2000_corr_ME.mod b/tests/TeX/fs2000_corr_ME.mod
index a26447fb058b8480deac5ac4dad9072a7de024c4..9413e4f3b641d180085232b3ad66e3361459bd87 100644
--- a/tests/TeX/fs2000_corr_ME.mod
+++ b/tests/TeX/fs2000_corr_ME.mod
@@ -144,7 +144,7 @@ stderr gy_obs, 1;
 corr gp_obs, gy_obs,0;
 end;
 
-estimation(order=1,datafile='../fs2000/fsdat_simul',mode_check,smoother,filter_decomposition,forecast = 8,filtered_vars,filter_step_ahead=[1,3],irf=20,contemporaneous_correlation) m P c e W R k d y gy_obs;
+estimation(order=1,datafile='../fs2000/fsdat_simul',mode_check,smoother,filter_covariance,filter_decomposition,forecast = 8,filtered_vars,filter_step_ahead=[1,3],irf=20,contemporaneous_correlation) m P c e W R k d y gy_obs;