diff --git a/doc/dynare.texi b/doc/dynare.texi
index 6d6a34df3b3e775a8eaa191444c0eb6734d064f1..9599feaf8e81f7ee3e0dc60894f90a7553ff1667 100644
--- a/doc/dynare.texi
+++ b/doc/dynare.texi
@@ -3729,6 +3729,9 @@ the square submatrix of the right Schur vectors corresponding to the
 forward looking variables (jumpers) and to the explosive eigenvalues
 must have full rank.
 
+Note that the outcome may be different from what would be suggested by
+@code{sum(abs(oo_.dr.eigval))} when eigenvalues are very close to @ref{qz_criterium}.
+
 @optionshead
 
 @table @code
@@ -4348,6 +4351,7 @@ exogenous variables are made available in @code{oo_.exo_simul}
 (@pxref{oo_.exo_simul}). Default: @code{0}.
 
 @item qz_criterium = @var{DOUBLE}
+@anchor{qz_criterium}
 Value used to split stable from unstable eigenvalues in reordering the
 Generalized Schur decomposition used for solving 1^st order
 problems. Default: @code{1.000001} (except when estimating with
diff --git a/matlab/check.m b/matlab/check.m
index f97a758f49ccd8fa355b5e78982faa6171a0148c..d1755fbb18c6bbdec8101930d27029e8e4e4eceb 100644
--- a/matlab/check.m
+++ b/matlab/check.m
@@ -78,7 +78,6 @@ end
 
 eigenvalues_ = dr.eigval;
 [m_lambda,i]=sort(abs(eigenvalues_));
-n_explod = nnz(abs(eigenvalues_) > options.qz_criterium);
 
 % Count number of forward looking variables
 if ~options.block
@@ -91,7 +90,7 @@ else
 end
 
 result = 0;
-if (nyf == n_explod) && (dr.full_rank)
+if (nyf == dr.edim) && (dr.full_rank)
     result = 1;
 end
 
@@ -101,7 +100,7 @@ if options.noprint == 0
     disp(sprintf('%16s %16s %16s\n','Modulus','Real','Imaginary'))
     z=[m_lambda real(eigenvalues_(i)) imag(eigenvalues_(i))]';
     disp(sprintf('%16.4g %16.4g %16.4g\n',z))
-    disp(sprintf('\nThere are %d eigenvalue(s) larger than 1 in modulus ', n_explod));
+    disp(sprintf('\nThere are %d eigenvalue(s) larger than 1 in modulus ', dr.edim));
     disp(sprintf('for %d forward-looking variable(s)',nyf));
     skipline()
     if result
diff --git a/matlab/dyn_first_order_solver.m b/matlab/dyn_first_order_solver.m
index c74786f82f082178811483f0ff5fff683c4e57c0..f262a61a1bfb3974e96031169969da489b87831c 100644
--- a/matlab/dyn_first_order_solver.m
+++ b/matlab/dyn_first_order_solver.m
@@ -202,6 +202,9 @@ else
         return
     end
 
+    dr.sdim = sdim;                      % Number of stable eigenvalues.
+    dr.edim = length(dr.eigval)-sdim;    % Number of exposive eigenvalues.
+
     nba = nd-sdim;
 
     if task==1
diff --git a/matlab/resol.m b/matlab/resol.m
index 8cee960d5d56e144ab64541657f631015872a968..e58eb7e1ba34de2316c1c2526a4914a3451ccf54 100644
--- a/matlab/resol.m
+++ b/matlab/resol.m
@@ -140,6 +140,8 @@ end
 
 if options.block
     [dr,info,M,options,oo] = dr_block(dr,check_flag,M,options,oo);
+    dr.edim = nnz(abs(dr.eigval) > options.qz_criterium);
+    dr.sdim = dr.nd-dr.edim;
 else
     [dr,info] = stochastic_solvers(dr,check_flag,M,options,oo);
 end
diff --git a/matlab/stochastic_solvers.m b/matlab/stochastic_solvers.m
index 9b62f5a46679ff5559c5ed92953d1d2e568143c4..587641023e4f8145470ecc97c93db787a1d820d0 100644
--- a/matlab/stochastic_solvers.m
+++ b/matlab/stochastic_solvers.m
@@ -232,10 +232,11 @@ if M_.maximum_endo_lead == 0
         end
         dr.eigval = eig(kalman_transition_matrix(dr,nstatic+(1:nspred),1:nspred,M_.exo_nbr));
         dr.full_rank = 1;
-        if any(abs(dr.eigval) > options_.qz_criterium)
+        dr.edim = nnz(abs(dr.eigval) > options_.qz_criterium);
+        dr.sdim = nd-dr.edim;
+        if dr.edim
             temp = sort(abs(dr.eigval));
-            nba = nnz(abs(dr.eigval) > options_.qz_criterium);
-            temp = temp(nd-nba+1:nd)-1-options_.qz_criterium;
+            temp = temp(dr.sdim+1:nd)-1-options_.qz_criterium;
             info(1) = 3;
             info(2) = temp'*temp;
         end