diff --git a/matlab/solve_two_boundaries.m b/matlab/solve_two_boundaries.m
index cde94b9dda7d3a12821514fd5204765432b6ca03..27db7f4a51a4314f0f4351c6e874d08f03b4280e 100644
--- a/matlab/solve_two_boundaries.m
+++ b/matlab/solve_two_boundaries.m
@@ -74,69 +74,11 @@ g1=spalloc( Blck_size*periods, Jacobian_Size, nze*periods);
 reduced = 0;
 while ~(cvg==1 || iter>maxit_),
     [r, y, g1, g2, g3, b]=feval(fname, y, x, params, steady_state, periods, 0, y_kmin, Blck_size);
-    %     fjac = zeros(Blck_size, Blck_size*(y_kmin_l+1+y_kmax_l));
-    %     disp(['Blck_size=' int2str(Blck_size) ' size(y_index)=' int2str(size(y_index,2))]);
-    %     dh = max(abs(y(y_kmin+1-y_kmin_l:y_kmin+1+y_kmax_l, y_index)),options_.gstep*ones(y_kmin_l+1+y_kmax_l, Blck_size))*eps^(1/3);
-    %     fvec = r;
-    %     %for i = y_kmin+1-y_kmin_l:y_kmin+1+y_kmax_l
-    %     i = y_kmin+1;
-    %       i
-    %       for j = 1:Blck_size
-    %             ydh = y ;
-    %           ydh(i, y_index(j)) = ydh(i, y_index(j)) + dh(i, j)  ;
-    %           if(j==11 && i==2)
-    %               disp(['y(i,y_index(11)=' int2str(y_index(11)) ')= ' num2str(y(i,y_index(11))) ' ydh(i, y_index(j))=' num2str(ydh(i, y_index(j))) ' dh(i,j)= ' num2str(dh(i,j))]);
-    %           end;
-    %           [t, y1, g11, g21, g31, b1]=feval(fname, ydh, x, params, periods, 0, y_kmin, Blck_size);
-    %           fjac(:,j+(i-(y_kmin+1-y_kmin_l))*Blck_size) = (t(:, 1+y_kmin) - fvec(:, 1+y_kmin))./dh(i, j) ;
-    %           if(j==11 && i==2)
-    %                disp(['fjac(:,' int2str(j+(i-(y_kmin+1-y_kmin_l))*Blck_size) ')=']);
-    %                disp([num2str(fjac(:,j+(i-(y_kmin+1-y_kmin_l))*Blck_size))]);
-    %           end;
-    %       end;
-    % %    end
-    %     %diff = g1(1:Blck_size, 1:Blck_size*(y_kmin_l+1+y_kmax_l)) -fjac;
-    %     diff = g1(1:Blck_size, y_kmin_l*Blck_size+1:(y_kmin_l+1)*Blck_size) -fjac(1:Blck_size, y_kmin_l*Blck_size+1:(y_kmin_l+1)*Blck_size);
-    %     disp(diff);
-    %     [c_max, i_c_max] = max(abs(diff));
-    %     [l_c_max, i_r_max] = max(c_max);
-    %     disp(['maximum element row=' int2str(i_c_max(i_r_max)) ' and column=' int2str(i_r_max) ' value = ' num2str(l_c_max)]);
-    %     equation = i_c_max(i_r_max);
-    %     variable = i_r_max;
-    %     variable
-    %     disp(['equation ' int2str(equation) ' and variable ' int2str(y_index(mod(variable, Blck_size))) ' ' M_.endo_names(y_index(mod(variable, Blck_size)), :)]);
-    %     disp(['g1(' int2str(equation) ', ' int2str(variable) ')=' num2str(g1(equation, y_kmin_l*Blck_size+variable),'%3.10f') ' fjac(' int2str(equation) ', ' int2str(variable) ')=' num2str(fjac(equation, y_kmin_l*Blck_size+variable), '%3.10f')]);
-    %     return;
-
-
-
-    %     for i=1:periods;
-    %       disp([sprintf('%5.14f ',[T9025(i) T1149(i) T11905(i)])]);
-    %     end;
-    %     return;
-    %residual = r(:,y_kmin+1:y_kmin+1+y_kmax_l);
-    %num2str(residual,' %1.6f')
-    %jac_ = g1(1:(y_kmin)*Blck_size, 1:(y_kmin+1+y_kmax_l)*Blck_size);
-    %jac_
-    
+    preconditioner = 2;
     g1a=g1(:, y_kmin*Blck_size+1:(periods+y_kmin)*Blck_size);
     term1 = g1(:, 1:y_kmin_l*Blck_size)*reshape(y(1+y_kmin-y_kmin_l:y_kmin,y_index)',1,y_kmin_l*Blck_size)';
     term2 = g1(:, (periods+y_kmin_l)*Blck_size+1:(periods+y_kmin_l+y_kmax_l)*Blck_size)*reshape(y(periods+y_kmin+1:periods+y_kmin+y_kmax_l,y_index)',1,y_kmax_l*Blck_size)';
     b = b - term1 - term2;
-    
-    %      fid = fopen(['result' num2str(iter)],'w');
-    %      fg1a = full(g1a);
-    %      fprintf(fid,'%d\n',size(fg1a,1));
-    %      fprintf(fid,'%d\n',size(fg1a,2));
-    %      fprintf(fid,'%5.14f\n',fg1a);
-    %      fprintf(fid,'%d\n',size(b,1));
-    %      fprintf(fid,'%5.14f\n',b);
-    %      fclose(fid);
-    %      return;
-    %ipconfigb_ = b(1:(1+y_kmin)*Blck_size);
-    %b_ 
-    
-    
     [max_res, max_indx]=max(max(abs(r')));
     if(~isreal(r))
         max_res = (-max_res^2)^0.5;
@@ -255,7 +197,33 @@ while ~(cvg==1 || iter>maxit_),
         elseif(stack_solve_algo==2),
             flag1=1;
             while(flag1>0)
-                [L1, U1]=luinc(g1a,luinc_tol);
+                if preconditioner == 2
+                    [L1, U1]=luinc(g1a,luinc_tol);
+                elseif preconditioner == 3
+                    Size = Blck_size;
+                     gss1 =  g1a(Size + 1: 2*Size,Size + 1: 2*Size) + g1a(Size + 1: 2*Size,2*Size+1: 3*Size);
+                     [L1, U1]=lu(gss1);
+                     L(1:Size,1:Size) = L1;
+                     U(1:Size,1:Size) = U1;
+                     gss2 = g1a(Size + 1: 2*Size,1: Size) + g1a(Size + 1: 2*Size,Size+1: 2*Size) + g1a(Size + 1: 2*Size,2*Size+1: 3*Size);
+                     [L2, U2]=lu(gss2);
+                     L(Size+1:(periods-1)*Size,Size+1:(periods-1)*Size) = kron(eye(periods-2), L2);
+                     U(Size+1:(periods-1)*Size,Size+1:(periods-1)*Size) = kron(eye(periods-2), U2);
+                     gss2 = g1a(Size + 1: 2*Size,1: Size) + g1a(Size + 1: 2*Size,Size+1: 2*Size);
+                     [L3, U3]=lu(gss2);
+                     L((periods-1)*Size+1:periods*Size,(periods-1)*Size+1:periods*Size) = L3;
+                     U((periods-1)*Size+1:periods*Size,(periods-1)*Size+1:periods*Size) = U3;
+                     L1 = L;
+                     U1 = U;
+                elseif preconditioner == 4
+                    Size = Blck_size;
+                    gss1 =  g1a(1: 3*Size, 1: 3*Size);
+                    [L, U] = lu(gss1);
+                    L1 = kron(eye(ceil(periods/3)),L);
+                    U1 = kron(eye(ceil(periods/3)),U);
+                    L1 = L1(1:periods * Size, 1:periods * Size);
+                    U1 = U1(1:periods * Size, 1:periods * Size);
+                end;
                 [za,flag1] = gmres(g1a,b,Blck_size,1e-6,Blck_size*periods,L1,U1);
                 if (flag1>0 || reduced)
                     if(flag1==1)
@@ -276,8 +244,25 @@ while ~(cvg==1 || iter>maxit_),
         elseif(stack_solve_algo==3),
             flag1=1;
             while(flag1>0)
-                [L1, U1]=luinc(g1a,luinc_tol);
-                [za,flag1] = bicgstab(g1a,b,1e-7,Blck_size*periods,L1,U1);
+                if (preconditioner == 3)
+                    Size = Blck_size;
+                    gss0 = g1a(Size + 1: 2*Size,1: Size) + g1a(Size + 1: 2*Size,Size+1: 2*Size) + g1a(Size + 1: 2*Size,2*Size+1: 3*Size);
+                    [L1, U1]=lu(gss0);
+                    P1 = eye(size(gss0));
+                    Q1 = eye(size(gss0));
+                    L = kron(eye(periods),L1);
+                    U = kron(eye(periods),U1);
+                    P = kron(eye(periods),P1);
+                    Q = kron(eye(periods),Q1);
+                    [za,flag1] = bicgstab1(g1a,b,1e-7,Blck_size*periods,L,U, P, Q);
+                else
+                    Size = Blck_size;
+                    gss0 = g1a(Size + 1: 2*Size,1: Size) + g1a(Size + 1: 2*Size,Size+1: 2*Size) + g1a(Size + 1: 2*Size,2*Size+1: 3*Size);
+                    [L1, U1]=lu(gss0);
+                    L1 = kron(eye(periods),L1);
+                    U1 = kron(eye(periods),U1);
+                    [za,flag1] = bicgstab(g1a,b,1e-7,Blck_size*periods,L1,U1);
+                end;
                 if (flag1>0 || reduced)
                     if(flag1==1)
                         disp(['Error in simul: No convergence inside BICGSTAB after ' num2str(periods*10,'%6d') ' iterations, in block' num2str(Block_Size,'%3d')]);