diff --git a/matlab/write_fort90.m b/matlab/write_fort90.m
index 2e818e7f0e97f58f2e247cb4c992d33c3990a268..37f813442ac15800f5d79409e43ee05c3d305361 100644
--- a/matlab/write_fort90.m
+++ b/matlab/write_fort90.m
@@ -19,6 +19,7 @@ fprintf(fid,['  Nr   = ', num2str(GRID.Nr),'\n']);
 fprintf(fid,['  Lr = ', num2str(GRID.Lr),'\n']);
 fprintf(fid,['  Nz   = ', num2str(GRID.Nz),'\n']);
 fprintf(fid,['  Lz = ', num2str(GRID.Lz),'\n']);
+fprintf(fid,['  kpar = ', num2str(GRID.kpar),'\n']);
 fprintf(fid,'/\n');
 
 fprintf(fid,'&OUTPUT_PAR\n');
@@ -39,6 +40,7 @@ fprintf(fid,'/\n');
 fprintf(fid,'&MODEL_PAR\n');
 fprintf(fid,'  ! Collisionality\n');
 fprintf(fid,['  CO      = ', num2str(MODEL.CO),'\n']);
+fprintf(fid,['  DK      = ', num2str(MODEL.DK),'\n']);
 fprintf(fid,['  NON_LIN = ', MODEL.NON_LIN,'\n']);
 fprintf(fid,['  mu      = ', num2str(MODEL.mu),'\n']);
 fprintf(fid,['  nu      = ', num2str(MODEL.nu),'\n']);
diff --git a/src/grid_mod.F90 b/src/grid_mod.F90
index c239c8df72abf0266ad3dd94454b5dfcb16ae517..0987ba2836a982e36586afed1d72f817a9548147 100644
--- a/src/grid_mod.F90
+++ b/src/grid_mod.F90
@@ -18,6 +18,7 @@ MODULE grid
   REAL(dp), PUBLIC, PROTECTED :: Lkr   = 1._dp  ! horizontal length of the fourier box
   INTEGER,  PUBLIC, PROTECTED :: Nkz   = 16     ! Number of total internal grid points in kz
   REAL(dp), PUBLIC, PROTECTED :: Lkz   = 1._dp  ! vertical length of the fourier box
+  REAL(dp), PUBLIC, PROTECTED :: kpar  = 0_dp   ! parallel wave vector component
 
   ! For Orszag filter
   REAL(dp), PUBLIC, PROTECTED :: two_third_krmax
@@ -195,7 +196,7 @@ CONTAINS
     INTEGER :: lu_in   = 90              ! File duplicated from STDIN
 
     NAMELIST /GRID/ pmaxe, jmaxe, pmaxi, jmaxi, &
-                    Nr,  Lr,  Nz,  Lz
+                    Nr,  Lr,  Nz,  Lz, kpar
     READ(lu_in,grid)
 
   END SUBROUTINE grid_readinputs
diff --git a/src/moments_eq_rhs.F90 b/src/moments_eq_rhs.F90
index 4ad31556154b5b51710f205dbc09dc37665b9d19..a32f750586369e135df6228f53cf27db9059c46b 100644
--- a/src/moments_eq_rhs.F90
+++ b/src/moments_eq_rhs.F90
@@ -14,12 +14,13 @@ SUBROUTINE moments_eq_rhs
   REAL(dp)    :: ip_dp, ij_dp
   REAL(dp)    :: kr, kz, kperp2
   REAL(dp)    :: taue_qe_etaB, taui_qi_etaB
+  REAL(dp)    :: sqrtTaue_qe, sqrtTaui_qi, qe_sigmae_sqrtTaue, qi_sigmai_sqrtTaui
   REAL(dp)    :: kernelj, kerneljp1, kerneljm1, b_e2, b_i2 ! Kernel functions and variable
   REAL(dp)    :: factj, sigmae2_taue_o2, sigmai2_taui_o2 ! Auxiliary variables
-  REAL(dp)    :: xNapj, xNapp2j, xNapm2j, xNapjp1, xNapjm1 ! Mom. factors depending on the pj loop
-  REAL(dp)    :: xphij, xphijp1, xphijm1   ! ESpot. factors depending on the pj loop
+  REAL(dp)    :: xNapj, xNapp1j, xNapm1j, xNapp2j, xNapm2j, xNapjp1, xNapjm1 ! Mom. factors depending on the pj loop
+  REAL(dp)    :: xphij, xphijp1, xphijm1, xphijpar ! ESpot. factors depending on the pj loop
   REAL(dp)    :: xCapj,   xCa20,   xCa01, xCa10 ! Coll. factors depending on the pj loop
-  COMPLEX(dp) :: TNapj, TNapp2j, TNapm2j, TNapjp1, TNapjm1, Tphi
+  COMPLEX(dp) :: TNapj, TNapp1j, TNapm1j, TNapp2j, TNapm2j, TNapjp1, TNapjm1, Tphi
   COMPLEX(dp) :: TColl, TColl20, TColl01, TColl10 ! terms of the rhs
   COMPLEX(dp) :: test_nan
   REAL(dp)    :: nu_e, nu_i, nu_ee, nu_ie ! Species collisional frequency
@@ -27,6 +28,10 @@ SUBROUTINE moments_eq_rhs
   !Precompute species dependant factors
   taue_qe_etaB    = tau_e/q_e * eta_B ! factor of the magnetic moment coupling
   taui_qi_etaB    = tau_i/q_i * eta_B
+  sqrtTaue_qe     = sqrt(tau_e)/q_e   ! factor of parallel moment term
+  sqrtTaui_qi     = sqrt(tau_i)/q_i
+  qe_sigmae_sqrtTaue = q_e/sigma_e/SQRT(tau_e) ! factor of parallel phi term
+  qi_sigmai_sqrtTaui = q_i/sigma_i/SQRT(tau_i)
   sigmae2_taue_o2 = sigma_e**2 * tau_e/2._dp ! factor of the Kernel argument
   sigmai2_taui_o2 = sigma_i**2 * tau_i/2._dp
   nu_e  = nu ! electron-ion collision frequency (where already multiplied by 0.532)
@@ -40,6 +45,11 @@ SUBROUTINE moments_eq_rhs
   ploope : DO ip = ips_e, ipe_e ! This loop is from 1 to pmaxe+1
     ip_dp = REAL(ip-1,dp) ! REAL index is one minus the loop index (0 to pmaxe)
 
+    ! N_e^{p+1,j} coeff
+    xNapp1j = sqrtTaue_qe * SQRT(ip_dp + 1)
+    ! N_e^{p-1,j} coeff
+    xNapm1j = sqrtTaue_qe * SQRT(ip_dp)
+
     ! N_e^{p+2,j} coeff
     xNapp2j = taue_qe_etaB * SQRT((ip_dp + 1._dp) * (ip_dp + 2._dp))
     ! N_e^{p-2,j} coeff
@@ -83,11 +93,15 @@ SUBROUTINE moments_eq_rhs
         xphij   =  (eta_n + 2.*ij_dp*eta_T - 2._dp*eta_B*(ij_dp+1._dp) )
         xphijp1 = -(eta_T - eta_B)*(ij_dp+1._dp)
         xphijm1 = -(eta_T - eta_B)* ij_dp
+        xphijpar= 0._dp
+      ELSE IF (ip .EQ. 2) THEN ! kronecker p1
+        xphijpar =  qe_sigmae_sqrtTaue
+        xphij = 0._dp; xphijp1 = 0._dp; xphijm1 = 0._dp
       ELSE IF (ip .EQ. 3) THEN ! kronecker p2
         xphij   =  (eta_T/SQRT2 - SQRT2*eta_B)
-        xphijp1 = 0._dp; xphijm1 = 0._dp
+        xphijp1 = 0._dp; xphijm1 = 0._dp; xphijpar= 0._dp
       ELSE
-        xphij = 0._dp; xphijp1 = 0._dp; xphijm1 = 0._dp
+        xphij = 0._dp; xphijp1 = 0._dp; xphijm1 = 0._dp; xphijpar= 0._dp
       ENDIF
 
       ! Recursive factorial
@@ -103,11 +117,28 @@ SUBROUTINE moments_eq_rhs
           kr     = krarray(ikr)   ! Poloidal wavevector
           kz     = kzarray(ikz)   ! Toroidal wavevector
           kperp2 = kr**2 + kz**2  ! perpendicular wavevector
-          b_e2   = kperp2 * sigmae2_taue_o2 ! Bessel argument
+
+          IF ( DK ) THEN ! Drift kinetic model
+            b_e2   = 0._dp
+          ELSE
+            b_e2   = kperp2 * sigmae2_taue_o2 ! Bessel argument
+          ENDIF
 
           !! Compute moments and mixing terms
           ! term propto N_e^{p,j}
           TNapj = xNapj * moments_e(ip,ij,ikr,ikz,updatetlevel)
+          ! term propto N_e^{p+1,j}
+          IF (ip+1 .LE. pmaxe+1) THEN ! OoB check
+            TNapp1j = xNapp1j * moments_e(ip+1,ij,ikr,ikz,updatetlevel)
+          ELSE
+            TNapp1j = 0._dp
+          ENDIF
+          ! term propto N_e^{p-1,j}
+          IF (ip-1 .GE. 1) THEN ! OoB check
+            TNapm1j = xNapm1j * moments_e(ip-1,ij,ikr,ikz,updatetlevel)
+          ELSE
+            TNapm1j = 0._dp
+          ENDIF
           ! term propto N_e^{p+2,j}
           IF (ip+2 .LE. pmaxe+1) THEN ! OoB check
             TNapp2j = xNapp2j * moments_e(ip+2,ij,ikr,ikz,updatetlevel)
@@ -179,13 +210,13 @@ SUBROUTINE moments_eq_rhs
           ENDIF
 
           !! Electrical potential term
-          IF ( (ip .EQ. 1) .OR. (ip .EQ. 3) ) THEN ! kronecker p0 or  p2
+          IF ( (ip .LE. 3) ) THEN ! kronecker p0 p1 p2
             kernelj    = b_e2**(ij-1) * exp(-b_e2)/factj
             kerneljp1  = kernelj * b_e2  /(ij_dp + 1._dp)
             IF ( b_e2 .NE. 0 ) THEN
               kerneljm1  = kernelj * ij_dp / b_e2
             ELSE
-              kerneljm1 = 0.5_dp
+              kerneljm1 = 0._dp
             ENDIF
             Tphi = (xphij*kernelj + xphijp1*kerneljp1 + xphijm1*kerneljm1) * phi(ikr,ikz)
           ELSE
@@ -195,7 +226,8 @@ SUBROUTINE moments_eq_rhs
           ! Sum of all linear terms
           moments_rhs_e(ip,ij,ikr,ikz,updatetlevel) = &
               -imagu * kz * (TNapj + TNapp2j + TNapm2j + TNapjp1 + TNapjm1 - Tphi)&
-               + TColl
+              -imagu * kpar*(TNapp1j + TNapm1j + xphijpar*kernelj*phi(ikr,ikz)) &
+              + TColl
 
           ! Adding non linearity and Hyperdiffusivity
           IF ( NON_LIN ) THEN
@@ -216,6 +248,11 @@ SUBROUTINE moments_eq_rhs
   ploopi : DO ip = ips_i, ipe_i  ! This loop is from 1 to pmaxi+1
     ip_dp = REAL(ip-1,dp) ! REAL index is one minus the loop index (0 to pmaxi)
 
+    ! N_i^{p+1,j} coeff
+    xNapp1j = sqrtTaui_qi * SQRT(ip_dp + 1)
+    ! N_i^{p-1,j} coeff
+    xNapm1j = sqrtTaui_qi * SQRT(ip_dp)
+
     ! x N_i^{p+2,j} coeff
     xNapp2j = taui_qi_etaB * SQRT((ip_dp + 1._dp) * (ip_dp + 2._dp))
     ! x N_i^{p-2,j} coeff
@@ -259,11 +296,15 @@ SUBROUTINE moments_eq_rhs
         xphij   =  (eta_n + 2._dp*ij_dp*eta_T - 2._dp*eta_B*(ij_dp+1._dp))
         xphijp1 = -(eta_T - eta_B)*(ij_dp+1._dp)
         xphijm1 = -(eta_T - eta_B)* ij_dp
+        xphijpar =  0._dp
+      ELSE IF (ip .EQ. 2) THEN ! kronecker p1
+        xphijpar =  qi_sigmai_sqrtTaui
+        xphij = 0._dp; xphijp1 = 0._dp; xphijm1 = 0._dp
       ELSE IF (ip .EQ. 3) THEN !krokecker p2
         xphij   =  (eta_T/SQRT2 - SQRT2*eta_B)
-        xphijp1 = 0._dp; xphijm1 = 0._dp
+        xphijp1 = 0._dp; xphijm1 = 0._dp; xphijpar =  0._dp
       ELSE
-        xphij = 0._dp; xphijp1 = 0._dp; xphijm1 = 0._dp
+        xphij = 0._dp; xphijp1 = 0._dp; xphijm1 = 0._dp; xphijpar =  0._dp
       ENDIF
 
       ! Recursive factorial
@@ -279,11 +320,28 @@ SUBROUTINE moments_eq_rhs
           kr     = krarray(ikr)   ! Poloidal wavevector
           kz     = kzarray(ikz)   ! Toroidal wavevector
           kperp2 = kr**2 + kz**2  ! perpendicular wavevector
-          b_i2   = kperp2 * sigmai2_taui_o2 ! Bessel argument
+
+          IF ( DK ) THEN ! Drift kinetic model
+            b_i2   = 0._dp
+          ELSE
+            b_i2   = kperp2 * sigmai2_taui_o2 ! Bessel argument
+          ENDIF
 
           !! Compute moments and mixing terms
           ! term propto N_i^{p,j}
           TNapj = xNapj * moments_i(ip,ij,ikr,ikz,updatetlevel)
+          ! term propto N_i^{p+1,j}
+          IF (ip+1 .LE. pmaxi+1) THEN ! OoB check
+            TNapp1j = xNapp1j * moments_i(ip+1,ij,ikr,ikz,updatetlevel)
+          ELSE
+            TNapp1j = 0._dp
+          ENDIF
+          ! term propto N_i^{p-1,j}
+          IF (ip-1 .GE. 1) THEN ! OoB check
+            TNapm1j = xNapm1j * moments_i(ip-1,ij,ikr,ikz,updatetlevel)
+          ELSE
+            TNapm1j = 0._dp
+          ENDIF
           ! term propto N_i^{p+2,j}
           IF (ip+2 .LE. pmaxi+1) THEN ! OoB check
             TNapp2j = xNapp2j * moments_i(ip+2,ij,ikr,ikz,updatetlevel)
@@ -355,13 +413,13 @@ SUBROUTINE moments_eq_rhs
           ENDIF
 
           !! Electrical potential term
-          IF ( (ip .EQ. 1) .OR. (ip .EQ. 3) ) THEN ! kronecker p0 or p2
+          IF ( (ip .LE. 3) ) THEN ! kronecker p0 p1 p2
             kernelj    = b_i2**(ij-1) * exp(-b_i2)/factj
             kerneljp1  = kernelj * b_i2  /(ij_dp + 1._dp)
             IF ( b_i2 .NE. 0 ) THEN
               kerneljm1  = kernelj * ij_dp / b_i2
             ELSE
-              kerneljm1 = 0.5_dp
+              kerneljm1 = 0._dp
             ENDIF
             Tphi = (xphij*kernelj + xphijp1*kerneljp1 + xphijm1*kerneljm1) * phi(ikr,ikz)
           ELSE
@@ -371,6 +429,7 @@ SUBROUTINE moments_eq_rhs
           ! Sum of linear terms
           moments_rhs_i(ip,ij,ikr,ikz,updatetlevel) = &
               -imagu * kz * (TNapj + TNapp2j + TNapm2j + TNapjp1 + TNapjm1 - Tphi)&
+              -imagu * kpar*(TNapp1j + TNapm1j + xphijpar*kernelj*phi(ikr,ikz)) &
                + TColl
 
           ! Adding non linearity and Hyperdiffusivity
diff --git a/src/poisson.F90 b/src/poisson.F90
index d91fe1ffbd50a381517a5ab4bbd69bd84a19104d..948bc78d35407b21e9417ddd735d10886916dc15 100644
--- a/src/poisson.F90
+++ b/src/poisson.F90
@@ -5,7 +5,7 @@ SUBROUTINE poisson
   USE array
   USE fields
   USE grid
-  use model, ONLY : tau_e, tau_i, sigma_e, sigma_i, q_e, q_i, lambdaD
+  use model, ONLY : tau_e, tau_i, sigma_e, sigma_i, q_e, q_i, lambdaD, DK
 
   USE prec_const
   IMPLICIT NONE
@@ -35,7 +35,11 @@ SUBROUTINE poisson
       kperp2 = kr**2 + kz**2
 
       !! Electrons sum(Kernel * Ne0n)  (skm) and sum(Kernel**2) (sk2)
-      b_e2  =  kperp2 * sigmae2_taue_o2 ! non dim kernel argument (kperp2 sigma_a sqrt(2 tau_a))
+      IF ( DK ) THEN
+        b_e2 = 0.0_dp
+      ELSE
+        b_e2  =  kperp2 * sigmae2_taue_o2 ! non dim kernel argument (kperp2 sigma_a sqrt(2 tau_a))
+      ENDIF
 
       ! Initialization for n = 0 (ine = 1)
       Kne  = exp(-b_e2)
@@ -55,7 +59,11 @@ SUBROUTINE poisson
       endif
 
       !! Ions sum(Kernel * Ni0n)  (skm) and sum(Kernel**2) (sk2)
-      b_i2  = kperp2 * sigmai2_taui_o2
+      IF ( DK ) THEN
+        b_i2 = 0._dp
+      ELSE
+        b_i2  = kperp2 * sigmai2_taui_o2
+      ENDIF
 
       ! Initialization for n = 0 (ini = 1)
       Kni  = exp(-b_i2)