diff --git a/src/numerics_mod.F90 b/src/numerics_mod.F90
index ce5cedd1159dcae0a9e6b31e351ab085fd740881..edd297b22578b08c921d1cbd39c9f77efcd1b944 100644
--- a/src/numerics_mod.F90
+++ b/src/numerics_mod.F90
@@ -54,105 +54,34 @@ END SUBROUTINE build_dnjs_table
 !******************************************************************************!
 SUBROUTINE evaluate_kernels
   USE basic
-  USE array, Only : kernel_e, kernel_i, gxy, gyy, gxx
+  USE array, Only : kernel_e, kernel_i, kparray
   USE grid
   USE model, ONLY : tau_e, tau_i, sigma_e, sigma_i, q_e, q_i, lambdaD, CLOS, sigmae2_taue_o2, sigmai2_taui_o2
   IMPLICIT NONE
+  INTEGER    :: j_int
+  REAL(dp)   :: j_dp, y_, kp2_, kx_, ky_
 
-  REAL(dp)    :: factj, j_dp, j_int
-  REAL(dp)    :: be_2, bi_2, alphaD
-  REAL(dp)    :: kx, ky, kperp2
-
+DO ikx = ikxs,ikxe
+DO iky = ikys,ikye
+DO iz = izs,ize
   !!!!! Electron kernels !!!!!
-  !Precompute species dependant factors
-  factj = 1.0 ! Start of the recursive factorial
-  DO ij = 1, jmaxe+1
+  DO ij = ijsg_e, ijeg_e
     j_int = jarray_e(ij)
-    j_dp = REAL(j_int,dp) ! REAL of degree
-
-    ! Recursive factorial
-    IF (j_dp .GT. 0) THEN
-      factj = factj * j_dp
-    ELSE
-      factj = 1._dp
-    ENDIF
-
-    DO ikx = ikxs,ikxe
-      kx     = kxarray(ikx)
-      DO iky = ikys,ikye
-        ky    = kyarray(iky)
-        DO iz = izs,ize
-          kperp2= gxx(iz)*kx**2 + 2._dp*gxy(iz)*kx*ky + gyy(iz)*ky**2
-          be_2  =  kperp2 * sigmae2_taue_o2
-          kernel_e(ij, ikx, iky,iz) = be_2**j_int * exp(-be_2)/factj
-        ENDDO
-      ENDDO
-    ENDDO
+    j_dp  = REAL(j_int,dp)
+    y_    =  sigmae2_taue_o2 * kparray(ikx,iky,iz)**2
+    kernel_e(ij,ikx,iky,iz) = y_**j_int*EXP(-y_)/GAMMA(j_dp+1._dp)!factj
   ENDDO
-  ! Kernels closure
-  DO ikx = ikxs,ikxe
-    kx     = kxarray(ikx)
-    DO iky = ikys,ikye
-      ky    = kyarray(iky)
-      DO iz = izs,ize
-        kperp2= gxx(iz)*kx**2 + 2._dp*gxy(iz)*kx*ky + gyy(iz)*ky**2
-        be_2  = kperp2 * sigmae2_taue_o2
-        ! Kernel ghost + 1 with Kj+1 = y/(j+1) Kj (/!\ ij = j+1)
-        kernel_e(ijeg_e,ikx,iky,iz) = be_2/(real(ijeg_e-1,dp))*kernel_e(ije_e,ikx,iky,iz)
-        ! Kernel ghost - 1 with Kj-1 = j/y Kj(careful about the kperp=0)
-        IF ( be_2 .NE. 0 ) THEN
-          kernel_e(ijsg_e,ikx,iky,iz) = (real(ijsg_e,dp))/be_2*kernel_e(ijs_e,ikx,iky,iz)
-        ELSE
-          kernel_e(ijsg_e,ikx,iky,iz) = 0._dp
-        ENDIF
-      ENDDO
-    ENDDO
-  ENDDO
-
   !!!!! Ion kernels !!!!!
-  factj = 1.0 ! Start of the recursive factorial
-  DO ij = 1, jmaxi+1
-    j_int = jarray_e(ij)
-    j_dp = REAL(j_int,dp) ! REAL of degree
-
-    ! Recursive factorial
-    IF (j_dp .GT. 0) THEN
-      factj = factj * j_dp
-    ELSE
-      factj = 1._dp
-    ENDIF
-
-    DO ikx = ikxs,ikxe
-      kx     = kxarray(ikx)
-      DO iky = ikys,ikye
-        ky    = kyarray(iky)
-        DO iz = izs,ize
-          kperp2= gxx(iz)*kx**2 + 2._dp*gxy(iz)*kx*ky + gyy(iz)*ky**2
-          bi_2  = kperp2 * sigmai2_taui_o2
-          kernel_i(ij, ikx, iky,iz) = bi_2**j_int * exp(-bi_2)/factj
-        ENDDO
-      ENDDO
-    ENDDO
-  ENDDO
-  ! Kernels closure
-  DO ikx = ikxs,ikxe
-    kx     = kxarray(ikx)
-    DO iky = ikys,ikye
-      ky    = kyarray(iky)
-      DO iz = izs,ize
-        kperp2= gxx(iz)*kx**2 + 2._dp*gxy(iz)*kx*ky + gyy(iz)*ky**2
-        bi_2  =  kperp2 * sigmai2_taui_o2
-        ! Kernel ghost + 1 with Kj+1 = y/(j+1) Kj
-        kernel_i(ijeg_i,ikx,iky,iz) = bi_2/(real(ijeg_i-1,dp))*kernel_i(ije_i,ikx,iky,iz)
-        ! Kernel ghost - 1 with Kj-1 = j/y Kj(careful about the kperp=0)
-        IF ( bi_2 .NE. 0 ) THEN
-          kernel_i(ijsg_i,ikx,iky,iz) = (real(ijsg_i,dp))/bi_2*kernel_i(ijs_i,ikx,iky,iz)
-        ELSE
-          kernel_i(ijsg_i,ikx,iky,iz) = 0._dp
-        ENDIF
-      ENDDO
-    ENDDO
+  DO ij = ijsg_i, ijeg_i
+    j_int = jarray_i(ij)
+    j_dp  = REAL(j_int,dp)
+    y_    =  sigmai2_taui_o2 * kparray(ikx,iky,iz)**2
+    kernel_i(ij,ikx,iky,iz) = y_**j_int*EXP(-y_)/GAMMA(j_dp+1._dp)!factj
   ENDDO
+ENDDO
+ENDDO
+ENDDO
+
 END SUBROUTINE evaluate_kernels
 !******************************************************************************!
 
@@ -174,30 +103,35 @@ SUBROUTINE compute_lin_coeff
     DO ij = ijs_e, ije_e
       j_int= jarray_e(ij)   ! Laguerre degree
       j_dp = REAL(j_int,dp) ! REAL of Laguerre degree
+      ! All Napj terms
       xnepj(ip,ij) = taue_qe*(CurvB*(2._dp*p_dp + 1._dp) &
                              +GradB*(2._dp*j_dp + 1._dp))
-      ynepp1j  (ip,ij) = -SQRT(tau_e)/sigma_e * (j_dp+1)*SQRT(p_dp+1._dp)
-      ynepm1j  (ip,ij) = -SQRT(tau_e)/sigma_e * (j_dp+1)*SQRT(p_dp)
-      ynepp1jm1(ip,ij) = +SQRT(tau_e)/sigma_e *     j_dp*SQRT(p_dp+1._dp)
-      ynepm1jm1(ip,ij) = +SQRT(tau_e)/sigma_e *     j_dp*SQRT(p_dp)
-      zNepm1j  (ip,ij) = -SQRT(tau_e)/sigma_e * (2._dp*j_dp+1_dp)*SQRT(p_dp)
-      zNepm1jp1(ip,ij) = +SQRT(tau_e)/sigma_e *       (j_dp+1_dp)*SQRT(p_dp)
-      zNepm1jm1(ip,ij) = +SQRT(tau_e)/sigma_e *              j_dp*SQRT(p_dp)
+      ! Mirror force terms
+      ynepp1j  (ip,ij) = -SQRT(tau_e)/sigma_e *          (j_dp+1)*SQRT(p_dp+1._dp)
+      ynepm1j  (ip,ij) = -SQRT(tau_e)/sigma_e *          (j_dp+1)*SQRT(p_dp)
+      ynepp1jm1(ip,ij) = +SQRT(tau_e)/sigma_e *              j_dp*SQRT(p_dp+1._dp)
+      ynepm1jm1(ip,ij) = +SQRT(tau_e)/sigma_e *              j_dp*SQRT(p_dp)
+      zNepm1j  (ip,ij) = +SQRT(tau_e)/sigma_e * (2._dp*j_dp+1_dp)*SQRT(p_dp)
+      zNepm1jp1(ip,ij) = -SQRT(tau_e)/sigma_e *       (j_dp+1_dp)*SQRT(p_dp)
+      zNepm1jm1(ip,ij) = -SQRT(tau_e)/sigma_e *              j_dp*SQRT(p_dp)
     ENDDO
   ENDDO
   DO ip = ips_e, ipe_e
     p_int= parray_e(ip)   ! Hermite degree
     p_dp = REAL(p_int,dp) ! REAL of Hermite degree
-    xnepp1j(ip) = sqrtTaue_qe * SQRT(p_dp + 1_dp)
-    xnepm1j(ip) = sqrtTaue_qe * SQRT(p_dp)
-    xnepp2j(ip) = taue_qe * SQRT((p_dp + 1._dp) * (p_dp + 2._dp))
-    xnepm2j(ip) = taue_qe * SQRT(p_dp * (p_dp - 1._dp))
+    ! Landau damping coefficients (ddz napj term)
+    xnepp1j(ip) = SQRT(tau_e)/sigma_e * SQRT(p_dp + 1_dp)
+    xnepm1j(ip) = SQRT(tau_e)/sigma_e * SQRT(p_dp)
+    ! Magnetic curvature term
+    xnepp2j(ip) = taue_qe * CurvB * SQRT((p_dp + 1._dp) * (p_dp + 2._dp))
+    xnepm2j(ip) = taue_qe * CurvB * SQRT(p_dp * (p_dp - 1._dp))
   ENDDO
   DO ij = ijs_e, ije_e
     j_int= jarray_e(ij)   ! Laguerre degree
     j_dp = REAL(j_int,dp) ! REAL of Laguerre degree
-    xnepjp1(ij) = -taue_qe * (j_dp + 1._dp)
-    xnepjm1(ij) = -taue_qe * j_dp
+    ! Magnetic gradient term
+    xnepjp1(ij) = -taue_qe * GradB * (j_dp + 1._dp)
+    xnepjm1(ij) = -taue_qe * GradB * j_dp
   ENDDO
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   !! Ions linear coefficients for moment RHS !!!!!!!!!!
@@ -207,30 +141,36 @@ SUBROUTINE compute_lin_coeff
     DO ij = ijs_i, ije_i
       j_int= jarray_i(ij)   ! Laguerre degree
       j_dp = REAL(j_int,dp) ! REAL of Laguerre degree
-      xnepj(ip,ij) = taui_qi*(CurvB*(2._dp*p_dp + 1._dp) &
+      ! All Napj terms
+      xnipj(ip,ij) = taui_qi*(CurvB*(2._dp*p_dp + 1._dp) &
                              +GradB*(2._dp*j_dp + 1._dp))
-      ynipp1j  (ip,ij) = -SQRT(tau_i)/sigma_i * (j_dp+1)*SQRT(p_dp+1._dp)
-      ynipm1j  (ip,ij) = -SQRT(tau_i)/sigma_i * (j_dp+1)*SQRT(p_dp)
-      ynipp1jm1(ip,ij) = +SQRT(tau_i)/sigma_i *     j_dp*SQRT(p_dp+1._dp)
-      ynipm1jm1(ip,ij) = +SQRT(tau_i)/sigma_i *     j_dp*SQRT(p_dp)
-      zNipm1j  (ip,ij) = -SQRT(tau_i)/sigma_i * (2._dp*j_dp+1_dp)*SQRT(p_dp)
-      zNipm1jp1(ip,ij) = +SQRT(tau_i)/sigma_i *       (j_dp+1_dp)*SQRT(p_dp)
-      zNipm1jm1(ip,ij) = +SQRT(tau_i)/sigma_i *              j_dp*SQRT(p_dp)
+      ! Mirror force terms
+      ynipp1j  (ip,ij) = -SQRT(tau_i)/sigma_i*          (j_dp+1)*SQRT(p_dp+1._dp)
+      ynipm1j  (ip,ij) = -SQRT(tau_i)/sigma_i*          (j_dp+1)*SQRT(p_dp)
+      ynipp1jm1(ip,ij) = +SQRT(tau_i)/sigma_i*              j_dp*SQRT(p_dp+1._dp)
+      ynipm1jm1(ip,ij) = +SQRT(tau_i)/sigma_i*              j_dp*SQRT(p_dp)
+      ! Trapping terms
+      zNipm1j  (ip,ij) = +SQRT(tau_i)/sigma_i* (2._dp*j_dp+1_dp)*SQRT(p_dp)
+      zNipm1jp1(ip,ij) = -SQRT(tau_i)/sigma_i*       (j_dp+1_dp)*SQRT(p_dp)
+      zNipm1jm1(ip,ij) = -SQRT(tau_i)/sigma_i*              j_dp*SQRT(p_dp)
     ENDDO
   ENDDO
   DO ip = ips_i, ipe_i
     p_int= parray_i(ip)   ! Hermite degree
     p_dp = REAL(p_int,dp) ! REAL of Hermite degree
-    xnipp1j(ip) = sqrtTaui_qi * SQRT(p_dp + 1._dp)
-    xnipm1j(ip) = sqrtTaui_qi * SQRT(p_dp)
-    xnipp2j(ip) = taui_qi * SQRT((p_dp + 1._dp) * (p_dp + 2._dp))
-    xnipm2j(ip) = taui_qi * SQRT(p_dp * (p_dp - 1._dp))
+    ! Landau damping coefficients (ddz napj term)
+    xnipp1j(ip) = SQRT(tau_i)/sigma_i * SQRT(p_dp + 1._dp)
+    xnipm1j(ip) = SQRT(tau_i)/sigma_i * SQRT(p_dp)
+    ! Magnetic curvature term
+    xnipp2j(ip) = taui_qi * CurvB * SQRT((p_dp + 1._dp) * (p_dp + 2._dp))
+    xnipm2j(ip) = taui_qi * CurvB * SQRT(p_dp * (p_dp - 1._dp))
   ENDDO
   DO ij = ijs_i, ije_i
     j_int= jarray_i(ij)   ! Laguerre degree
     j_dp = REAL(j_int,dp) ! REAL of Laguerre degree
-    xnipjp1(ij) = -taui_qi * (j_dp + 1._dp)
-    xnipjm1(ij) = -taui_qi * j_dp
+    ! Magnetic gradient term
+    xnipjp1(ij) = -taui_qi * GradB * (j_dp + 1._dp)
+    xnipjm1(ij) = -taui_qi * GradB * j_dp
   ENDDO
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   !! ES linear coefficients for moment RHS !!!!!!!!!!