diff --git a/matlab/bvar_forecast.m b/matlab/bvar_forecast.m
index 24f34673f66a92a2515cac13637f9f44f64a3260..e0f8c6ef7f8c74c1b31f7f2e52946914380a3326 100644
--- a/matlab/bvar_forecast.m
+++ b/matlab/bvar_forecast.m
@@ -48,7 +48,7 @@ function bvar_forecast(nlags)
         lags_data = forecast_data.initval;
         for t = 1:options_.forecast
             X = [ reshape(flipdim(lags_data, 1)', 1, ny*nlags) forecast_data.xdata(t, :) ];
-            y = X * Phi;
+            y = X(:,1:k) * Phi;
             lags_data = [ lags_data(2:end, :); y ];
             sims_no_shock(t, :, d) = y;
         end
@@ -58,7 +58,7 @@ function bvar_forecast(nlags)
         for t = 1:options_.forecast
             X = [ reshape(flipdim(lags_data, 1)', 1, ny*nlags) forecast_data.xdata(t, :) ];
             shock = (Sigma_lower_chol * randn(ny, 1))';
-            y = X * Phi + shock;
+            y = X(:,1:k) * Phi + shock;
             lags_data = [ lags_data(2:end, :); y ];
             sims_with_shocks(t, :, d) = y;
         end
diff --git a/matlab/bvar_toolbox.m b/matlab/bvar_toolbox.m
index d3965e2dc4c49189a4a67ddba0bcfb3b2586e009..12522f4d765a1ef55099aa490fcc6f2c8fe6fe26 100644
--- a/matlab/bvar_toolbox.m
+++ b/matlab/bvar_toolbox.m
@@ -39,10 +39,10 @@ function [ny, nx, posterior, prior, forecast_data] = bvar_toolbox(nlags)
     
     global options_
     
-    % Prepare dataset
+    % Load dataset
     dataset = read_variables(options_.datafile, options_.varobs, [], options_.xls_sheet, options_.xls_range);
     options_ = set_default_option(options_, 'nobs', size(dataset,1)-options_.first_obs+1);
-
+    
     % Parameters for prior
     options_ = set_default_option(options_, 'bvar_prior_tau', 3);
     options_ = set_default_option(options_, 'bvar_prior_decay', 0.5);
@@ -61,6 +61,16 @@ function [ny, nx, posterior, prior, forecast_data] = bvar_toolbox(nlags)
     if options_.first_obs + options_.presample - train <= nlags
         error('first_obs+presample-train should be > nlags (for initializating the VAR)')
     end
+
+    idx = options_.first_obs+options_.presample-train-nlags:options_.first_obs+options_.nobs-1;
+    
+    % Prepare dataset
+    if options_.loglinear & ~options_.logdata
+        dataset = log(dataset);
+    end
+    if options_.prefilter
+        dataset = dataset(idx,:) - ones(length(idx),1)*mean(dataset(idx,:));
+    end
     
     mnprior.tight = options_.bvar_prior_tau;
     mnprior.decay = options_.bvar_prior_decay;
@@ -74,13 +84,21 @@ function [ny, nx, posterior, prior, forecast_data] = bvar_toolbox(nlags)
     flat = options_.bvar_prior_flat;
     
     ny = size(dataset, 2);
-    nx = 1;
+    if options_.prefilter | options_.noconstant
+        nx = 0;
+    else
+        nx = 1;
+    end
     
     [ydum, xdum, pbreaks] = varprior(ny, nx, nlags, mnprior, vprior);
     
-    ydata = dataset(options_.first_obs+options_.presample-train-nlags:options_.first_obs+options_.nobs-1, :);
+    ydata = dataset(idx, :);
     T = size(ydata, 1);
-    xdata = ones(T, 1);
+    if nx
+        xdata = ones(T,1);
+    else
+        xdata = [];
+    end
 
     % Posterior density
     var = rfvar3([ydata; ydum], nlags, [xdata; xdum], [T; T+pbreaks], lambda, mu);
@@ -93,8 +111,12 @@ function [ny, nx, posterior, prior, forecast_data] = bvar_toolbox(nlags)
     
     % Prior density
     Tp = train + nlags;
-    varp = rfvar3([ydata(1:Tp, :); ydum], nlags, [xdata(1:Tp, :); xdum], ...
-                  [Tp; Tp + pbreaks], lambda, mu);
+    if nx
+        xdata = xdata(1:Tp, :);
+    else
+        xdata = [];
+    end
+    varp = rfvar3([ydata(1:Tp, :); ydum], nlags, [xdata; xdum], [Tp; Tp + pbreaks], lambda, mu);
     Tup = size(varp.u, 1);
     
     prior.df = Tup - ny*nlags - nx - flat*(ny+1);
@@ -109,6 +131,8 @@ function [ny, nx, posterior, prior, forecast_data] = bvar_toolbox(nlags)
     % Add forecast informations
     if nargout >= 5
         forecast_data.xdata = ones(options_.forecast, nx);
+        % Useless if nx=0, but with the declaration of an empty matrix here we would have to add an if statement  
+        % inside a loop (see bvar_forecast.m).
         forecast_data.initval = ydata(end-nlags+1:end, :);
         if options_.first_obs + options_.nobs <= size(dataset, 1)
             forecast_data.realized_val = dataset(options_.first_obs+options_.nobs:end, :);