diff --git a/matlab/+occbin/set_default_options.m b/matlab/+occbin/set_default_options.m
index 173f6947ef01712c074580ddab3e137720ee5633..417e7ea9eb330212d1300c2dd8ee70364bb97975 100644
--- a/matlab/+occbin/set_default_options.m
+++ b/matlab/+occbin/set_default_options.m
@@ -185,6 +185,7 @@ if ismember(flag,{'simul','all'})
     options_occbin_.simul.curb_retrench=false;
     options_occbin_.simul.endo_init=zeros(M_.endo_nbr,1);
     options_occbin_.simul.full_output=true;
+    options_occbin_.simul.gabaix = false;
     options_occbin_.simul.init_regime=[];
     options_occbin_.simul.init_binding_indicator=false(0);
     options_occbin_.simul.exo_pos=1:M_.exo_nbr;
diff --git a/matlab/+occbin/solve_one_constraint.m b/matlab/+occbin/solve_one_constraint.m
index 2f7834df9d589ea14b7c7f497f30411d432eaad2..947510c285b5008cd1ab1940f531966546a4c37c 100644
--- a/matlab/+occbin/solve_one_constraint.m
+++ b/matlab/+occbin/solve_one_constraint.m
@@ -71,6 +71,13 @@ if solve_DM
     DM.n_vars = M_base.endo_nbr;
     DM.n_exo = M_base.exo_nbr;
 
+    if opts_simul_.gabaix
+    % set behavioral matrices
+        for k=1:length(M_base.gabaix_weights)
+            mbeha0 = get_param_by_name_locally(['GABAIX_' M_base.gabaix_weights{k}],M_base);
+            M_base = set_param_value_locally(M_base,M_base.gabaix_weights{k},mbeha0);
+        end
+    end
     % get the matrices holding the first derivatives for the model
     % each regime is treated separately
     [DM.Cbarmat, DM.Bbarmat, DM.Abarmat, DM.Jbarmat] = occbin.get_deriv(M_base,data.ys);
@@ -78,6 +85,14 @@ if solve_DM
     Mstar_= M_base;
     Mstar_.params(M_.occbin.pswitch(1))= 1;
     [DM.Cstarbarmat, DM.Bstarbarmat, DM.Astarbarmat, DM.Jstarbarmat, DM.Dstarbarmat] = occbin.get_deriv(Mstar_,data.ys);
+    if opts_simul_.gabaix
+    % re-set behavioral matrices to compute constant term!
+        for k=1:length(M_base.gabaix_weights)
+            M_base = set_param_value_locally(M_base,M_base.gabaix_weights{k},1);
+            Mstar_ = set_param_value_locally(Mstar_,M_base.gabaix_weights{k},1);
+        end
+        [~,~,~,~,DM.Dstarbarmat] = occbin.get_deriv(Mstar_,data.ys);
+    end
     
     [DM.decrulea,DM.decruleb]=occbin.get_pq(dr_base);
     
@@ -322,7 +337,7 @@ for shock_period = 1:n_shocks_periods
                     error_flag = 313;
                 else
                 disp_verbose('Did not converge -- increase maxit.',opts_simul_.debug)
-                    error_flag = 311;
+                error_flag = 311;
                 end
                 if opts_simul_.waitbar; dyn_waitbar_close(hh); end
                 return
diff --git a/matlab/+occbin/solve_two_constraints.m b/matlab/+occbin/solve_two_constraints.m
index eab9c269b6614321f7e9cbd40a36567957834c52..7f7e509179c8ba9edf61b13eb4a873d9cbff801d 100644
--- a/matlab/+occbin/solve_two_constraints.m
+++ b/matlab/+occbin/solve_two_constraints.m
@@ -67,20 +67,49 @@ M00_ = M_;
 data.ys = dr.ys;
 
 if solve_DM %recompute solution matrices
+    if opts_simul_.gabaix
+    % set behavioral matrices
+        for k=1:length(M00_.gabaix_weights)
+            mbeha0 = get_param_by_name_locally(['GABAIX_' M00_.gabaix_weights{k}],M00_);
+            M00_ = set_param_value_locally(M00_,M00_.gabaix_weights{k},mbeha0);
+        end
+    end
     [DM.Cbarmat ,DM.Bbarmat, DM.Abarmat, DM.Jbarmat] = occbin.get_deriv(M00_,data.ys);
     
     M10_ = M00_;
     M10_.params(M_.occbin.pswitch(1))= 1;
     [DM.Cbarmat10, DM.Bbarmat10, DM.Abarmat10, DM.Jbarmat10, DM.Dbarmat10] = occbin.get_deriv(M10_,data.ys);
-    
+    if opts_simul_.gabaix
+    % compute the constant term with the original non Gabaix params
+        for k=1:length(M00_.gabaix_weights)
+            M10_ = set_param_value_locally(M10_,M00_.gabaix_weights{k},1);
+        end
+        [~,~,~,~,DM.Dbarmat10] = get_deriv(M10_,data.ys);
+    end
+
     M01_ = M00_;
     M01_.params(M_.occbin.pswitch(2))= 1;
     [DM.Cbarmat01, DM.Bbarmat01, DM.Abarmat01, DM.Jbarmat01, DM.Dbarmat01] = occbin.get_deriv(M01_,data.ys);
+    if opts_simul_.gabaix
+    % compute the constant term with the original non Gabaix params
+        for k=1:length(M00_.gabaix_weights)
+            M01_ = set_param_value_locally(M01_,M00_.gabaix_weights{k},1);
+        end
+        [~,~,~,~,DM.Dbarmat01] = get_deriv(M01_,data.ys);
+    end
     
     M11_ = M00_;
     M11_.params(M_.occbin.pswitch(1))= 1;
     M11_.params(M_.occbin.pswitch(2))= 1;
     [DM.Cbarmat11, DM.Bbarmat11, DM.Abarmat11, DM.Jbarmat11, DM.Dbarmat11] = occbin.get_deriv(M11_,data.ys);
+    if opts_simul_.gabaix
+    % compute the constant term with the original non Gabaix params
+        for k=1:length(M00_.gabaix_weights)
+            M11_ = set_param_value_locally(M11_,M00_.gabaix_weights{k},1);
+            M00_ = set_param_value_locally(M00_,M00_.gabaix_weights{k},1); % also re-set the base model
+        end
+        [~,~,~,~,DM.Dbarmat11] = get_deriv(M11_,data.ys);
+    end
     
     [DM.decrulea,DM.decruleb]=occbin.get_pq(dr);      
     update_flag=true;
diff --git a/matlab/+occbin/solver.m b/matlab/+occbin/solver.m
index 3dc465ba3cfeb102ed811a6e78cd4fade92d275e..28f7466f489ae81fb99b7d80060a24c3195ea559 100644
--- a/matlab/+occbin/solver.m
+++ b/matlab/+occbin/solver.m
@@ -19,7 +19,7 @@ function [oo_, out, ss] = solver(M_,oo_,options_)
 %                                           - R: [n_vars by n_exo by n_shock_period] array of shock response matrices
 %                                           - C: [n_vars by n_shock_period] array of constants
 
-% Copyright © 2021 Dynare Team
+% Copyright � 2021 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -64,10 +64,32 @@ if solve_dr
         print_info(error_flag, options_.noprint, options_)
         return;
     end
+    dr0 = dr;
+    if options_.gabaix
+        % set behvioral form
+        options_.occbin.simul.gabaix=true;
+        [A,B,~,error_flag] = gabaix_dynare_resolve(M_,options_,oo_);
+        if ~error_flag
+            endo_nbr = M_.endo_nbr;
+            nstatic = M_.nstatic;
+            nspred = M_.nspred;
+            ic = [ nstatic+(1:nspred) endo_nbr+(1:size(dr.ghx,2)-nspred) ]';
+            dr.ghu=B ;
+            dr.ghx=A(:,ic) ;
+        end
+    else
+        options_.occbin.simul.gabaix=false;
+    end
     oo_.dr = dr;
     sto_dr=dr;
     sto_M=M_;
+    out.error_flag=error_flag;
+    if error_flag
+        print_info(error_flag, options_.noprint, options_)
+        return;
+    end
 else
+    dr0=oo_.dr;
     oo_.dr=sto_dr;
 end
 
@@ -105,3 +127,7 @@ end
 out.exo_pos = options_.occbin.simul.exo_pos;
 
 oo_.occbin.simul=out;
+
+if options_.gabaix
+    oo_.dr = dr0;
+end
diff --git a/matlab/check.m b/matlab/check.m
index ec9ec65136bc93e71309c656321b868b8df5eb70..a9dc5e670bdb7993c89f7fd1d3a37c4c5e1590f4 100644
--- a/matlab/check.m
+++ b/matlab/check.m
@@ -43,6 +43,13 @@ end
 oo.dr=set_state_space(oo.dr,M,options);
 
 [dr,info,M,~] = resol(1,M,options,oo);
+if options.gabaix
+    % set behvioral form
+    [~,~,~,info,M,oo1] = gabaix_dynare_resolve(M,options,oo);
+    dr.eigval=oo1.dr.eigval;
+    dr.edim=oo1.dr.edim;
+    dr.full_rank=oo1.dr.full_rank;
+end
 
 if info(1) ~= 0 && info(1) ~= 3 && info(1) ~= 4
     print_info(info, 0, options);
diff --git a/matlab/default_option_values.m b/matlab/default_option_values.m
index 5ca97e08610c15937ec936774f94dce2ca9aaf32..d63adf65448a439e55618447e17358b4831b135a 100644
--- a/matlab/default_option_values.m
+++ b/matlab/default_option_values.m
@@ -348,6 +348,7 @@ options_.ACES_solver = false;
 options_.conditional_variance_decomposition = [];
 options_.gabaix = false;
 options_.gabaix_check_long_run = true;
+options_.gabaix_long_run = true;
 
 % Ramsey policy
 options_.ramsey_policy = false;
diff --git a/matlab/gabaix_dynare_resolve.m b/matlab/gabaix_dynare_resolve.m
index f1bf41a899a32ddc9d3817fa36ef1f136b753881..81b926e768fb014262a3a43282932673e06d4f97 100644
--- a/matlab/gabaix_dynare_resolve.m
+++ b/matlab/gabaix_dynare_resolve.m
@@ -9,19 +9,22 @@ if nargin<=4
     A = A(DynareResults.dr.inv_order_var,DynareResults.dr.inv_order_var);
     B = B(DynareResults.dr.inv_order_var,:);
     
-    [hm1_,h_,~,Jbarmat_] = get_deriv(Model,SteadyState);
     Mbase_=M_;
     for k=1:length(Model.gabaix_weights)
         mbeha0 = get_param_by_name_locally(['GABAIX_' Model.gabaix_weights{k}],Mbase_);
         Mbase_ = set_param_value_locally(Mbase_,Model.gabaix_weights{k},mbeha0);
     end
-    [hm1_,h_,hl1_,Jbarmat_] = get_deriv(Mbase_,SteadyState);
+    [hm1_,h_,hl1_,Jbarmat_] = occbin.get_deriv(Mbase_,SteadyState);
 %     [~,~,hl1_,~] = get_deriv(Mbase_,SteadyState); % only apply behavioral M to leads
     Cbarmat = hm1_; % lag
     Bbarmat = h_;
     Abarmat = hl1_; % lead
     
-    if options_.gabaix_check_long_run
+    endo_nbr = Model.endo_nbr;
+    nstatic = Model.nstatic;
+    nspred = Model.nspred;
+    ic = [ nstatic+(1:nspred) endo_nbr+(1:size(oo_.dr.ghx,2)-nspred) ]';
+    if DynareOptions.gabaix_check_long_run || DynareOptions.gabaix_long_run
         % check BK of behavioral model, to make sure it solves in forward looking mode
         klen = M_.maximum_lag + M_.maximum_lead + 1;
         exo_simul = [repmat(oo_.exo_steady_state',klen,1) repmat(oo_.exo_det_steady_state',klen,1)];
@@ -30,16 +33,30 @@ if nargin<=4
         iyr0 = find(iyv) ;
         it_ = M_.maximum_lag + 1;
         z = repmat(oo_.dr.ys,1,klen);
-        task=1; % only check eigvals
+        task=not(DynareOptions.gabaix_long_run); % only check eigvals
         [~,jacobia_] = feval([M_.fname '.dynamic'],z(iyr0),exo_simul, ...
             Mbase_.params, oo_.dr.ys, it_);
         [dr,info] = dyn_first_order_solver(jacobia_,Mbase_,oo_.dr,DynareOptions,task);
+        oo_.dr.eigval = dr.eigval;
+        oo_.dr.edim = dr.edim;
+        if ~DynareOptions.gabaix_long_run
+            oo_.dr.full_rank = dr.full_rank;
+        else
+            oo_.dr.full_rank = info(1)==0;
+        end
         if info(1)
             A=[];
             B=[];
             return
         else
-            A = -(Bbarmat+Abarmat*A)\Cbarmat;
+            if DynareOptions.gabaix_long_run
+                oo_.dr.ghu=dr.ghu;
+                oo_.dr.ghx=dr.ghx;
+                B(DynareResults.dr.order_var,:) =oo_.dr.ghu;
+                A(DynareResults.dr.order_var,DynareResults.dr.order_var(ic))= oo_.dr.ghx ;
+            else
+                A = -(Bbarmat+Abarmat*A)\Cbarmat;
+            end
         end
 
     else
@@ -56,13 +73,11 @@ if nargin<=4
             return
         end
     end
-    B = -(Bbarmat+Abarmat*A)\Jbarmat_;
-    endo_nbr = Model.endo_nbr;
-    nstatic = Model.nstatic;
-    nspred = Model.nspred;
-    ic = [ nstatic+(1:nspred) endo_nbr+(1:size(oo_.dr.ghx,2)-nspred) ]';
-    oo_.dr.ghu=B(DynareResults.dr.order_var,:) ;
-    oo_.dr.ghx=A(DynareResults.dr.order_var,DynareResults.dr.order_var(ic)) ;
+    if ~DynareOptions.gabaix_long_run
+        B = -(Bbarmat+Abarmat*A)\Jbarmat_;
+        oo_.dr.ghu=B(DynareResults.dr.order_var,:) ;
+        oo_.dr.ghx=A(DynareResults.dr.order_var,DynareResults.dr.order_var(ic)) ;
+    end
 else
     A = A(DynareResults.dr.inv_order_var,DynareResults.dr.inv_order_var);
     B = B(DynareResults.dr.inv_order_var,:);
diff --git a/matlab/gsa/stab_map_.m b/matlab/gsa/stab_map_.m
index 4a3efcfe8cfc52e80820a66b086d0151db2c23c3..6a0ff9fe1bc73fe5366688a6651ad743bc540c9b 100644
--- a/matlab/gsa/stab_map_.m
+++ b/matlab/gsa/stab_map_.m
@@ -242,9 +242,17 @@ if fload==0
         %try stoch_simul([]);
         try
             if ~ isempty(options_.endogenous_prior_restrictions.moment)
+                if options_.gabaix
+                    [Tt,Rr,SteadyState,info,M_,oo_] = gabaix_dynare_resolve(M_,options_,oo_);
+                else
                 [Tt,Rr,SteadyState,info,M_,oo_] = dynare_resolve(M_,options_,oo_);
+                end
+            else
+                if options_.gabaix
+                    [Tt,Rr,SteadyState,info,M_,oo_] = gabaix_dynare_resolve(M_,options_,oo_,'restrict');
             else
                 [Tt,Rr,SteadyState,info,M_,oo_] = dynare_resolve(M_,options_,oo_,'restrict');
+                end
             end
             infox(j,1)=info(1);
             if infox(j,1)==0 && ~exist('T','var')