diff --git a/matlab/discretionary_policy/discretionary_policy_1.m b/matlab/discretionary_policy/discretionary_policy_1.m
index 440b74f6a865fd81a68319ad5a895cc396b228c0..d75dd9718db3a9f05357b0a53a429e7f2c128525 100644
--- a/matlab/discretionary_policy/discretionary_policy_1.m
+++ b/matlab/discretionary_policy/discretionary_policy_1.m
@@ -76,32 +76,20 @@ g2_v = feval([M_.fname,'.objective.sparse.static_g2'], y, [], params, T_order, T
 W = build_two_dim_hessian(M_.objective_g2_sparse_indices, g2_v, 1, M_.endo_nbr);
 W=reshape(W,M_.endo_nbr,M_.endo_nbr);
 
-klen = M_.maximum_lag + M_.maximum_lead + 1;
-iyv=M_.lead_lag_incidence';
 % Find the jacobian
-z = repmat(ys,1,klen);
-iyr0 = find(iyv(:)) ;
-
-z = z(iyr0);
-it_ = M_.maximum_lag + 1 ;
-
-[junk,jacobia_] = feval([M_.fname '.dynamic'],z,zeros(M_.exo_nbr+M_.exo_det_nbr,klen), M_.params, ys, it_);
-if max(abs(junk))>options_.solve_tolf
+y3n = repmat(ys, 1, 3);
+x = zeros(M_.exo_nbr+M_.exo_det_nbr, 1);
+[resid, T_order, T] = feval([M_.fname '.sparse.dynamic_resid'], y3n, x, M_.params, ys);
+if max(abs(resid)) > options_.solve_tolf
      info = 65; %the model must be written in deviation form and not have constant terms or have a steady state provided
      return;
 end
+g1 = feval([M_.fname '.sparse.dynamic_g1'], y3n, x, M_.params, ys, M_.dynamic_g1_sparse_rowval, M_.dynamic_g1_sparse_colval, M_.dynamic_g1_sparse_colptr, T_order, T);
 
-Indices={'lag','contemp','lead'};
-iter=1;
-for j=1:numel(Indices)
-    A.(Indices{j})=zeros(M_.eq_nbr,M_.endo_nbr);
-    if strcmp(Indices{j},'contemp')||(strcmp(Indices{j},'lag') && M_.maximum_lag)||(strcmp(Indices{j},'lead') && M_.maximum_lead)
-        [~,row,col]=find(M_.lead_lag_incidence(iter,:));
-        A.(Indices{j})(:,row)=jacobia_(:,col);
-        iter=iter+1;
-    end
-end
-B=jacobia_(:,nnz(iyv)+1:end);
+A.lag = full(g1(:,1:M_.endo_nbr));
+A.contemp = full(g1(:,M_.endo_nbr+(1:M_.endo_nbr)));
+A.lead = full(g1(:,2*M_.endo_nbr+(1:M_.endo_nbr)));
+B = full(g1(:,3*M_.endo_nbr+1:end));
 
 %%% MAIN ENGINE %%%