diff --git a/src/ZSOLVER/mass_leak.f90 b/src/ZSOLVER/mass_leak.f90
index c5dc3e31e31f062be44979df10e5bc756e15877f..9ffe52c67bd2b3bceed6459854309e30d6eb4468 100644
--- a/src/ZSOLVER/mass_leak.f90
+++ b/src/ZSOLVER/mass_leak.f90
@@ -147,7 +147,9 @@ INTEGER             :: JJ         ! Loop index in y direction
 INTEGER             :: JK         ! Loop index in z direction
 !
 INTEGER             :: IINFO_ll   ! return code of parallel routine
-
+!
+LOGICAL :: GWEST,GEAST,GSOUTH,GNORTH
+REAL    :: ZLEAK_W,ZLEAK_E,ZLEAK_S,ZLEAK_N
 !
 !-------------------------------------------------------------------------------
 !
@@ -159,6 +161,10 @@ CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
 IKB = 1 + JPVEXT
 IKE = SIZE(PRUS,3) - JPVEXT
 !
+GWEST  = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() )
+GEAST  = ( HLBCX(2) /= 'CYCL' .AND. LEAST_ll() )
+GSOUTH = ( HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() )
+GNORTH = ( HLBCY(2) /= 'CYCL' .AND. LNORTH_ll() )
 !
 !-------------------------------------------------------------------------------
 !
@@ -166,57 +172,81 @@ IKE = SIZE(PRUS,3) - JPVEXT
 !              -------------------
 !
 ZLEAK=0.
+ZLEAK_E=0.
+ZLEAK_W=0.
+ZLEAK_S=0.
+ZLEAK_N=0.
 !
-IF( HLBCX(1) /= 'CYCL' ) THEN
+IF( HLBCY(1) /= 'CYCL' ) THEN
    ALLOCATE( ZLEAK_W_2D(IIB:IIB,IJB:IJE))
-   ZLEAK_W_2D = 0.0
-   IF (LWEST_ll()) THEN
+   ALLOCATE( ZLEAK_E_2D(IIE+1:IIE+1,IJB:IJE))   
+   !$acc kernels async
+   ZLEAK_W_2D = 0.0   
+   IF( GWEST ) THEN
       DO JK=IKB,IKE
          DO JJ=IJB,IJE
             ZLEAK_W_2D(IIB,JJ) = ZLEAK_W_2D(IIB,JJ) - 1./PDXX(IIB,JJ,JK) *PRUS(IIB,JJ,JK)
          END DO
-      END DO      
+      END DO
    END IF
-   ZLEAK =         SUM_DD_R2_ll(ZLEAK_W_2D)
-!
-  ALLOCATE( ZLEAK_E_2D(IIE+1:IIE+1,IJB:IJE))
-  ZLEAK_E_2D = 0.0
-  IF (LEAST_ll()) THEN
-     DO JK=IKB,IKE
-        DO JJ=IJB,IJE
-           ZLEAK_E_2D(IIE+1,JJ) = ZLEAK_E_2D(IIE+1,JJ) + 1./PDXX(IIE+1,JJ,JK)*PRUS(IIE+1,JJ,JK)
-        END DO
-     END DO
-  END IF
-  ZLEAK = ZLEAK + SUM_DD_R2_ll(ZLEAK_E_2D)  
-!
+   !$acc end kernels
+   !
+   !$acc kernels async   
+   ZLEAK_E_2D = 0.0
+   IF( GEAST ) THEN   
+      DO JK=IKB,IKE
+         DO JJ=IJB,IJE
+            ZLEAK_E_2D(IIE+1,JJ) = ZLEAK_E_2D(IIE+1,JJ) + 1./PDXX(IIE+1,JJ,JK)*PRUS(IIE+1,JJ,JK)
+         END DO
+      END DO       
+   END IF
+   !$acc end kernels
+   !
+   !$acc wait
+   !
+   ZLEAK_W = SUM_DD_R2_ll(ZLEAK_W_2D)
+   ZLEAK_E = SUM_DD_R2_ll(ZLEAK_E_2D)
 END IF
 !
 IF( HLBCY(1) /= 'CYCL' ) THEN
    ALLOCATE( ZLEAK_S_2D(IIB:IIE,IJB:IJB))
-   ZLEAK_S_2D = 0.0
-   IF (LSOUTH_ll()) THEN
+   ALLOCATE( ZLEAK_N_2D(IIB:IIE,IJE+1:IJE+1))
+   !
+   !$acc kernels async
+   ZLEAK_S_2D = 0.0 
+   IF( GSOUTH ) THEN
       DO JI=IIB,IIE
          DO JK=IKB,IKE
             ZLEAK_S_2D(JI,IJB) = ZLEAK_S_2D(JI,IJB) - 1./PDYY(JI,IJB,JK) *PRVS(JI,IJB,JK)
          END DO
       END DO
    END IF
-   ZLEAK = ZLEAK + SUM_DD_R2_ll(ZLEAK_S_2D)  
+   !$acc end kernels
    !
-   ALLOCATE( ZLEAK_N_2D(IIB:IIE,IJE+1:IJE+1))  
+   !$acc kernels async
    ZLEAK_N_2D = 0.0
-   IF (LNORTH_ll()) THEN
+   IF ( GNORTH ) THEN
       DO JI=IIB,IIE
          DO JK=IKB,IKE
             ZLEAK_N_2D(JI,IJE+1) = ZLEAK_N_2D(JI,IJE+1)  + 1./PDYY(JI,IJE+1,JK)*PRVS(JI,IJE+1,JK)
          END DO
       END DO
    END IF
-   ZLEAK = ZLEAK + SUM_DD_R2_ll(ZLEAK_N_2D)  
+   !$acc end kernels
    !
+   !$acc wait
+   !
+   ZLEAK_S = SUM_DD_R2_ll(ZLEAK_S_2D)
+   ZLEAK_N = SUM_DD_R2_ll(ZLEAK_N_2D)   
+!
 END IF
 !
+ZLEAK = ZLEAK_E + ZLEAK_W + ZLEAK_S + ZLEAK_N
+!!$ZLEAK = ZLEAK_E
+!!$ZLEAK = ZLEAK + ZLEAK_W
+!!$ZLEAK = ZLEAK + ZLEAK_S
+!!$ZLEAK = ZLEAK + ZLEAK_N
+!
 !CALL REDUCESUM_ll(ZLEAK,IINFO_ll)	! we do the reducesum_ll in SUM_DD_R2_ll so we do not do it here
 !
 !-------------------------------------------------------------------------------
@@ -227,18 +257,31 @@ END IF
 ZUSTOP=ZLEAK
 ZUSTOP=ZUSTOP/PLINMASS
 !
-IF (HLBCX(1)=='OPEN' .AND. LWEST_ll() ) &
- PRUS(IIB,:,:)=PRUS(IIB,:,:)+ZUSTOP*0.5*(PRHODJ(IIB,:,:)+PRHODJ(IIB-1,:,:))
+IF (HLBCX(1)=='OPEN' .AND. LWEST_ll() ) THEN
+   !$acc kernels async
+   PRUS(IIB,:,:)=PRUS(IIB,:,:)+ZUSTOP*0.5*(PRHODJ(IIB,:,:)+PRHODJ(IIB-1,:,:))
+   !$acc end kernels
+END IF
 !
-IF (HLBCX(2)=='OPEN' .AND. LEAST_ll() ) &
- PRUS(IIE+1,:,:)=PRUS(IIE+1,:,:)-ZUSTOP*0.5*(PRHODJ(IIE+1,:,:)+PRHODJ(IIE,:,:))
+IF (HLBCX(2)=='OPEN' .AND. LEAST_ll() ) THEN
+   !$acc kernels async
+   PRUS(IIE+1,:,:)=PRUS(IIE+1,:,:)-ZUSTOP*0.5*(PRHODJ(IIE+1,:,:)+PRHODJ(IIE,:,:))
+   !$acc end kernels
+END IF
 !
-IF (HLBCY(1)=='OPEN' .AND. LSOUTH_ll() ) &
- PRVS(:,IJB,:)=PRVS(:,IJB,:)+ZUSTOP*0.5*(PRHODJ(:,IJB,:)+PRHODJ(:,IJB-1,:))
+IF (HLBCY(1)=='OPEN' .AND. LSOUTH_ll() ) THEN
+   !$acc kernels async
+   PRVS(:,IJB,:)=PRVS(:,IJB,:)+ZUSTOP*0.5*(PRHODJ(:,IJB,:)+PRHODJ(:,IJB-1,:))
+   !$acc end kernels
+END IF
 !
-IF (HLBCY(2)=='OPEN' .AND. LNORTH_ll() ) &
- PRVS(:,IJE+1,:)=PRVS(:,IJE+1,:)-ZUSTOP*0.5*(PRHODJ(:,IJE+1,:)+PRHODJ(:,IJE,:))
+IF (HLBCY(2)=='OPEN' .AND. LNORTH_ll() ) THEN
+   !$acc kernels async
+   PRVS(:,IJE+1,:)=PRVS(:,IJE+1,:)-ZUSTOP*0.5*(PRHODJ(:,IJE+1,:)+PRHODJ(:,IJE,:))
+   !$acc end kernels
+END IF
 !
+!$acc wait
 !
 !
 !-------------------------------------------------------------------------------