function [hm1,h,hl1,j,resid] = get_deriv(M_,ys_)

iy_ = M_.lead_lag_incidence;
it_ = 1;

x = zeros(1,M_.exo_nbr);

% For most models, there are leads, lags and current values of variables
if size(iy_,1)==3
    % find non-zero columns of hm1
    lag_cols = find(iy_(1,:)~=0);
    % find non-zero columns of h
    con_cols = find(iy_(2,:));
    % find non-zero columns of hl1
    lea_cols = find(iy_(3,:));

    % If models either lacks leads or lags, iy_ will have two rows
    % In this case, we guess that the row with more nonzeros is the row with current variables
elseif size(iy_,1)==2
    % if first row has more nonzero entries than the second, assume model lacks lagged variables
    if length(find(iy_(1,:)))>length(find(iy_(2,:)))
        warning('Model does not have lagged endogenous variables')
        con_cols = find(iy_(1,:));
        lea_cols = find(iy_(2,:));
        lag_cols = [];
    else
        warning('Model does not have expected future endogenous variables')
        lag_cols = find(iy_(1,:));
        con_cols = find(iy_(2,:));
        lea_cols = [];
    end

end



% find number of entries for y vector
ny = length(find(iy_~=0));

% build steady state y
y = ys_(lag_cols);
y = [y;ys_(con_cols)];
y = [y;ys_(lea_cols)];


if ismac
    eval(['[resid,g1]=',M_.fname,'.dynamic(y,x, M_.params, ys_, it_);']);
    % Older versions of DYNARE for Mac did not include ys_ in the call structure
    %eval(['[resid,g1]=',M_.fname,'.dynamic(y,x, M_.params, it_);']);
else
    eval(['[resid,g1]=',M_.fname,'.dynamic(y,x, M_.params, ys_, it_);']);
end


hm1=zeros(M_.endo_nbr);
h = hm1;
hl1 = hm1;
j = zeros(M_.endo_nbr,M_.exo_nbr);


% build hm1
nlag_cols = length(lag_cols);
for i=1:nlag_cols
    hm1(:,lag_cols(i)) = g1(:,i);
end

% build h
ncon_cols = length(con_cols);
for i=1:ncon_cols
    h(:,con_cols(i)) = g1(:,i+nlag_cols);
end

% build hl1
nlea_cols = length(lea_cols);
for i=1:nlea_cols
    hl1(:,lea_cols(i)) = g1(:,i+nlag_cols+ncon_cols);
end


for i = 1:M_.exo_nbr
    j(:,i) =g1(:,i+ny);
end
