diff --git a/src/MNH/ice_adjust.f90 b/src/MNH/ice_adjust.f90
index 5876b4b4185805675da982907478e23387eb4bb8..1571bc2741f977d4f5903c3392b4fdb2767b7654 100644
--- a/src/MNH/ice_adjust.f90
+++ b/src/MNH/ice_adjust.f90
@@ -240,22 +240,21 @@ REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN)   ::  PRHS ! Hail       m.r. at t+1
 !
 ! IN variables
 !
-!$acc declare present(PPABST,PRRS,PRSS,PRGS)
-!acc declare present(PRHODJ,PEXNREF,PSIGS,PMFCONV,PPABST,PZZ, &
-!acc &               PCF_MF,PRC_MF,PRI_MF,PRVT,PRCT,          &
-!acc &               PRRT,PRIT,PRST,PRGT,      &
+!$acc declare present(PRHODJ,PEXNREF,PSIGS,PMFCONV,PPABST,PZZ, &
+!$acc &               PCF_MF,PRC_MF,PRI_MF,PRVT,PRCT,          &
+!$acc &               PRRS,PRSS,PRGS,PRRT,PRIT,PRST,PRGT,      &
+!Optional arguments: if declared present but not provided
+! => crash in the kernels using them (even if branch not taken)
+! (BUG PGI 16.10)
 !acc &               PRHT,PRHS,                               &
 !
 ! INOUT variables
 !
-!acc &                                    &
-!acc &                                    &
-!$acc declare present(PRVS,PRCS,PRIS,PTHS)
+!$acc &               PRVS,PRCS,PRIS,PTHS,                     &
 !
 ! OUT variables
 !
-!acc &               PSRCS)
-!acc &               PCLDFR)
+!$acc &               PSRCS,PCLDFR)
 !
 !*       0.2   Declarations of local variables :
 !
@@ -336,6 +335,7 @@ DO JITER =1,ITERMAX
 !
 !*       2.2    compute the intermediate temperature at t+1, T*
 !  
+!$acc data present(PRHS)
 !$acc kernels
   ZT(:,:,:) = ( PTHS(:,:,:) * PTSTEP ) * ZEXNS(:,:,:)
 !
@@ -368,6 +368,7 @@ ELSE IF( KRR == 2 ) THEN
                      + XCL   *PTSTEP*   PRCS(:,:,:)
 END IF
 !$acc end kernels
+!$acc end data
 !
 !
 !*       3.     FIRST ORDER SUBGRID CONDENSATION SCHEME
@@ -412,11 +413,12 @@ END IF
 !
 !*    compute the saturation vapor pressures at t+1
 !
-#ifndef _OPENACC
-      CALL GET_HALO(ZT)
-#else
-      CALL GET_HALO_D(ZT)
-#endif
+! PW: get_halo call looks unnecessary
+! #ifndef _OPENACC
+!       CALL GET_HALO(ZT)
+! #else
+!       CALL GET_HALO_D(ZT)
+! #endif
 
 !$acc kernels
 #ifndef MNH_BITREP
@@ -638,17 +640,29 @@ ELSE
                 /  PEXNREF(:,:,:) /PTSTEP
 ENDIF
 !$acc end kernels
-!$acc update self(PCLDFR,PSRCS,PRVS,PRCS,PRIS,PTHS)
+!$acc update self(PCLDFR,PSRCS)
 !
 !
 !
 !*       6.  STORE THE BUDGET TERMS
 !            ----------------------
 !
-IF (LBUDGET_RV) CALL BUDGET (PRVS(:,:,:) * PRHODJ(:,:,:),6,'DEPI_BU_RRV')
-IF (LBUDGET_RC) CALL BUDGET (PRCS(:,:,:) * PRHODJ(:,:,:),7,'DEPI_BU_RRC')
-IF (LBUDGET_RI) CALL BUDGET (PRIS(:,:,:) * PRHODJ(:,:,:),9,'DEPI_BU_RRI')
-IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:) * PRHODJ(:,:,:),4,'DEPI_BU_RTH')
+IF (LBUDGET_RV) THEN
+!$acc update self(PRVS)
+  CALL BUDGET (PRVS(:,:,:) * PRHODJ(:,:,:),6,'DEPI_BU_RRV')
+END IF
+IF (LBUDGET_RC) THEN
+!$acc update self(PRCS)
+  CALL BUDGET (PRCS(:,:,:) * PRHODJ(:,:,:),7,'DEPI_BU_RRC')
+END IF
+IF (LBUDGET_RI) THEN
+!$acc update self(PRIS)
+  CALL BUDGET (PRIS(:,:,:) * PRHODJ(:,:,:),9,'DEPI_BU_RRI')
+END IF
+IF (LBUDGET_TH) THEN
+!$acc update self(PTHS)
+  CALL BUDGET (PTHS(:,:,:) * PRHODJ(:,:,:),4,'DEPI_BU_RTH')
+END IF
 !
 !------------------------------------------------------------------------------
 !
diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90
index d143f4fced3e6bffb82077760c017017640d9861..87026443097eb2156b3ec7e61d049957dc6b286f 100644
--- a/src/MNH/rain_ice.f90
+++ b/src/MNH/rain_ice.f90
@@ -454,8 +454,7 @@ REAL, DIMENSION(SIZE(XRTMIN))     :: ZRTMIN
 !
 INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace the COUNT
 INTEGER                           :: JL       ! and PACK intrinsics
-!$acc declare create(GSEDIMR,GSEDIMC,GSEDIMI,GSEDIMS,GSEDIMG,GSEDIMH,             &
-!$acc &              GNEGT,GMICRO,GRIM,GACC,GDRY,GWET,GHAIL,GWORK,GDEP,           &
+!$acc declare create(GMICRO,GWET,GHAIL,GDEP,                                      &
 !$acc &              IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3,ZW,                            &
 !$acc &              ZPRCS,ZPRRS,ZPRSS,ZPRGS,ZPRHS,                               &
 !$acc &              ZWSED,ZWSEDW1,ZWSEDW2,ZCONC_TMP,ZT,ZRAY,ZLBC,ZFSEDC,         &
@@ -463,10 +462,13 @@ INTEGER                           :: JL       ! and PACK intrinsics
 !$acc &              ZRVS,ZRCS,ZRRS,ZRIS,ZRSS,ZRGS,ZRHS,ZTHS,                     &
 !$acc &              ZRHODREF,                                                    &
 !$acc &              ZRHODJ,ZZT,ZPRES,ZZW,ZLSFACT,ZLVFACT,                        &
-!$acc &              ZUSW,ZSSI,ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH,                       &
+!$acc &              ZUSW,ZSSI,ZLBDAS,ZLBDAG,ZLBDAH,                       &
 !$acc &              ZAI,ZCJ,ZKA,ZDV,ZZW1,ZRTMIN)                                 &
-!$acc &       device_resident(ZCRIAUTI,ZEXNREF,ZRDRYG,ZRWETG,ZSIGMA_RC,ZCF,       &
-!$acc &                       I1,I2,I3)
+!$acc & device_resident(GSEDIMR,GSEDIMC,GSEDIMI,GSEDIMS,GSEDIMG,GSEDIMH,          &
+!$acc &                 GNEGT,GRIM,GACC,GDRY,GWORK,                               &
+!$acc &                 ZCRIAUTI,ZEXNREF,ZLBDAR,ZRDRYG,ZRWETG,ZSIGMA_RC,ZCF,             &
+!$acc &                 I1,I2,I3)
+
 !
 #ifdef _OPENACC
 PRINT *,'OPENACC: RAIN_ICE being implemented'
@@ -642,7 +644,7 @@ IF( IMICRO >= 0 ) THEN
       ZRHODJ(JL) = PRHODJ(I1(JL),I2(JL),I3(JL))
     END DO
 !$acc end kernels
-!$acc update self(ZRHODJ) !used in BUDGET
+!$acc update self(ZRHODJ) !used only in BUDGET
   END IF
 !
   CALL RAIN_ICE_SLOW
@@ -1128,11 +1130,9 @@ DO JN = 1 , KSPLITR
       PRCS(:,:,:) = PRCS(:,:,:) * ZINVTSTEP
     END IF
   END IF
-!acc end kernels
 !
 !*       2.2   for rain
 !
-!acc kernels
   IF( JN==1 ) PRRS(:,:,:) = PRRS(:,:,:) * PTSTEP
   ZWSED(:,:,:) = 0.
 !
@@ -1158,11 +1158,9 @@ DO JN = 1 , KSPLITR
   IF ( JN==KSPLITR ) THEN
     PRRS(:,:,:) = PRRS(:,:,:) * ZINVTSTEP
   END IF
-!acc end kernels
 !
 !*       2.3   for pristine ice
 !
-!acc kernels
   IF( JN==1 ) PRIS(:,:,:) = PRIS(:,:,:) * PTSTEP
   ZWSED(:,:,:) = 0.
 !
@@ -1190,11 +1188,9 @@ DO JN = 1 , KSPLITR
   IF( JN==KSPLITR ) THEN
     PRIS(:,:,:) = PRIS(:,:,:) * ZINVTSTEP
   END IF
-!acc end kernels
 !
 !*       2.4   for aggregates/snow
 !
-!acc kernels
   IF( JN==1 ) PRSS(:,:,:) = PRSS(:,:,:) * PTSTEP
   ZWSED(:,:,:) = 0.
 !
@@ -1219,11 +1215,9 @@ DO JN = 1 , KSPLITR
   IF( JN==KSPLITR ) THEN
     PRSS(:,:,:) = PRSS(:,:,:) * ZINVTSTEP
   END IF
-!acc end kernels
 !
 !*       2.5   for graupeln
 !
-!acc kernels
   ZWSED(:,:,:) = 0.
   IF( JN==1 ) PRGS(:,:,:) = PRGS(:,:,:) * PTSTEP
 !
@@ -1248,11 +1242,9 @@ DO JN = 1 , KSPLITR
   IF( JN==KSPLITR ) THEN
     PRGS(:,:,:) = PRGS(:,:,:) * ZINVTSTEP
   END IF
-!acc end kernels
 !
 !*       2.6   for hail
 !
-!acc kernels
   IF ( KRR == 7 ) THEN
   IF( JN==1 ) PRHS(:,:,:) = PRHS(:,:,:) * PTSTEP
   ZWSED(:,:,:) = 0.
@@ -1282,25 +1274,33 @@ DO JN = 1 , KSPLITR
 !$acc end kernels
 !
 END DO
-!$acc update self(PRRS,PRSS,PRGS,PRIS)
-#ifdef _OPENACC
-IF (KRR==7) THEN
-!$acc update self(PRHS)
-END IF
-#endif
 !
 !*       2.3     budget storage
 !
 IF (LBUDGET_RC .AND. OSEDIC) THEN
 !$acc update self(PRCS)
-                CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7 ,'SEDI_BU_RRC')
+  CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7 ,'SEDI_BU_RRC')
+END IF
+IF (LBUDGET_RR) THEN
+!$acc update self(PRRS)
+  CALL BUDGET (PRRS(:,:,:)*PRHODJ(:,:,:),8 ,'SEDI_BU_RRR')
+END IF
+IF (LBUDGET_RI) THEN
+!$acc update self(PRIS)
+  CALL BUDGET (PRIS(:,:,:)*PRHODJ(:,:,:),9 ,'SEDI_BU_RRI')
+END IF
+IF (LBUDGET_RS) THEN
+!$acc update self(PRSS)
+  CALL BUDGET (PRSS(:,:,:)*PRHODJ(:,:,:),10,'SEDI_BU_RRS')
+END IF
+IF (LBUDGET_RG) THEN
+!$acc update self(PRGS)
+  CALL BUDGET (PRGS(:,:,:)*PRHODJ(:,:,:),11,'SEDI_BU_RRG')
+END IF
+IF ( KRR == 7 .AND. LBUDGET_RH) THEN
+!$acc update self(PRHS)
+  CALL BUDGET (PRHS(:,:,:)*PRHODJ(:,:,:),12,'SEDI_BU_RRH')
 END IF
-IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:)*PRHODJ(:,:,:),8 ,'SEDI_BU_RRR')
-IF (LBUDGET_RI) CALL BUDGET (PRIS(:,:,:)*PRHODJ(:,:,:),9 ,'SEDI_BU_RRI')
-IF (LBUDGET_RS) CALL BUDGET (PRSS(:,:,:)*PRHODJ(:,:,:),10,'SEDI_BU_RRS')
-IF (LBUDGET_RG) CALL BUDGET (PRGS(:,:,:)*PRHODJ(:,:,:),11,'SEDI_BU_RRG')
-IF ( KRR == 7 .AND. LBUDGET_RH) &
-                CALL BUDGET (PRHS(:,:,:)*PRHODJ(:,:,:),12,'SEDI_BU_RRH')
 !
 !
 !*       2.4  DROPLET DEPOSITION AT THE 1ST LEVEL ABOVE GROUND
@@ -1319,13 +1319,14 @@ IF (LDEPOSC) THEN
      PINDEP(:,:) = XVDEPOSC * PRCT(:,:,2) * PRHODJ(:,:,2) /XRHOLW 
   END WHERE
 !$acc end kernels
-!$acc update self(PRCS)
 END IF
 !
 !*       2.5     budget storage
 !
-IF ( LBUDGET_RC .AND. LDEPOSC ) &
+IF ( LBUDGET_RC .AND. LDEPOSC ) THEN
+!$acc update self(PRCS)
    CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7 ,'DEPO_BU_RRC')
+END IF
 !
   END SUBROUTINE RAIN_ICE_SEDIMENTATION_SPLIT
 !
@@ -1965,10 +1966,10 @@ IF( INEGT >= 1 ) THEN
   ZZWMAX = MAXVAL(ZZW(:))
 !$acc end kernels
   IF( ZZWMAX > 0.0 ) THEN
+!$acc kernels
 !
 !*       3.1.2   update the r_i and r_v mixing ratios
 !
-!$acc kernels
   ZZW(:) = MIN( ZZW(:),50.E3 ) ! limitation provisoire a 50 l^-1
   ZW(:,:,:) = 0.0
   DO JL=1,INEGT
@@ -1997,8 +1998,8 @@ IF( INEGT >= 1 ) THEN
     ZW(I1(JL),I2(JL),I3(JL)) = ZZW(JL)
   END DO
     PCIT(:,:,:) = MAX( ZW(:,:,:), PCIT(:,:,:) )
-!$acc end kernels
 #endif
+!$acc end kernels
   END IF
   DEALLOCATE(ZSSI)
   DEALLOCATE(ZUSW)
@@ -2432,8 +2433,8 @@ IMPLICIT NONE
 !
 INTEGER , DIMENSION(:),ALLOCATABLE :: I1 ! Used to replace the COUNT
 INTEGER                            :: JL ! and PACK intrinsics
-!acc declare device_resident(I1)
-!$acc declare create(I1)
+REAL,DIMENSION(SIZE(ZZW1,1)) :: ZTMP
+!$acc declare device_resident(I1)
 !
 !-------------------------------------------------------------------------------
 !
@@ -2616,11 +2617,13 @@ INTEGER                            :: JL ! and PACK intrinsics
 !
 !        5.2.1  select the (ZLBDAS,ZLBDAR) couplet
 !
+!$acc kernels copyin (XKER_RACCS,XKER_RACCSS,XKER_SACCRG)                 &
+!$acc &       present(GACC,ZLBDAS,ZRHODREF,ZZW,ZLSFACT,ZLVFACT,ZLBDAR,I1, &
+!$acc &               ZZW1,ZRRS,ZRSS,ZTHS,IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3)
 #ifndef _OPENACC
     ZVEC1(:) = PACK( ZLBDAS(:),MASK=GACC(:) )
     ZVEC2(:) = PACK( ZLBDAR(:),MASK=GACC(:) )
 #else
-!$acc kernels copyin(XKER_RACCSS)
     DO JL=1,IGACC
       ZVEC1(JL)  = ZLBDAS(I1(JL))
       ZVEC2(JL)  = ZLBDAR(I1(JL))
@@ -2667,14 +2670,10 @@ INTEGER                            :: JL ! and PACK intrinsics
     DO JL=1,IGACC
       ZZW(I1(JL)) = ZVEC3(JL)
     END DO
-!$acc end kernels
 #endif
 !
 !        5.2.4  raindrop accretion on the small sized aggregates
 !
-!$acc kernels present(GACC,ZLBDAS,ZRHODREF,ZZW,ZLSFACT,ZLVFACT,ZLBDAR,   &
-!$acc &               ZZW1,ZRRS,ZRSS,ZTHS,IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3) &
-!$acc &       copyin(XKER_RACCS)
     WHERE ( GACC(:) )
 #ifndef MNH_BITREP
       ZZW1(:,2) =                                            & !! coef of RRACCS
@@ -2706,19 +2705,24 @@ INTEGER                            :: JL ! and PACK intrinsics
                     -  XKER_RACCS(IVEC2(JJ)  ,IVEC1(JJ)  )*(ZVEC1(JJ) - 1.0) ) &
                                                            * (ZVEC2(JJ) - 1.0)
     END DO
-!$acc end kernels
 #ifndef _OPENACC
     ZZW1(:,2) = ZZW1(:,2)*UNPACK( VECTOR=ZVEC3(:),MASK=GACC(:),FIELD=0.0 ) 
 #else
-!$acc update self(I1)
-!$acc kernels present(I1,ZZW1,ZVEC3,IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3) copyin(XKER_SACCRG)
-    ZZW1(1:I1(1)-1,2) = 0.0
-    ZZW1(I1(1),2) = ZZW1(I1(1),2)*ZVEC3(1)
-    DO JL=2,IGACC
-      ZZW1(I1(JL-1)+1:I1(JL)-1,2) = 0.0
-      ZZW1(I1(JL),2) = ZZW1(I1(JL),2)*ZVEC3(JL)
-    END DO
-    ZZW1(I1(IGACC)+1:,2) = 0.0
+    !Problems when doing it this way on GPU (PGI 16.10/17.01):
+    !ZZW1(1:I1(1)-1,2) = 0.0
+    !ZZW1(I1(1),2) = ZZW1(I1(1),2)*ZVEC3(1)
+    !DO JL=2,IGACC
+    !  ZZW1(I1(JL-1)+1:I1(JL)-1,2) = 0.0
+    !  ZZW1(I1(JL),2) = ZZW1(I1(JL),2)*ZVEC3(JL)
+    !END DO
+    !ZZW1(I1(IGACC)+1:,2) = 0.0
+    !
+    !OK on GPU:
+    ZTMP(:) = ZZW1(:,2)
+    ZZW1(:,2) = 0.0
+    DO JL=1,IGACC
+    ZZW1(I1(JL),2) = ZTMP(I1(JL))*ZVEC3(JL)
+END DO
 #endif
                                                                        !! RRACCS!
 !        5.2.5  perform the bilinear interpolation of the normalized
@@ -2748,8 +2752,6 @@ INTEGER                            :: JL ! and PACK intrinsics
     WHERE ( GWORK(:) )
       ZZW1(:,2) = MAX( MIN( ZRRS(:),ZZW1(:,2)-ZZW1(:,4) ),0.0 )       ! RRACCSG
     END WHERE
-!$acc end kernels
-!$acc kernels present(GWORK,GACC,ZLBDAS,ZRHODREF,ZLSFACT,ZLVFACT,ZLBDAR,ZZW1,ZRRS,ZRSS,ZRGS,ZTHS,ZZW) default(none)
     GWORK(:) = GWORK(:) .AND. ZZW1(:,2)>0.0
     WHERE ( GWORK(:) )
 #ifndef MNH_BITREP
@@ -2779,6 +2781,7 @@ INTEGER                            :: JL ! and PACK intrinsics
     DEALLOCATE(ZVEC1)
   END IF
   DEALLOCATE(GACC)
+  DEALLOCATE(I1)
   IF (LBUDGET_TH) THEN
 !$acc update self(ZTHS)
     CALL BUDGET (UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:), 4,'ACC_BU_RTH')
@@ -2856,9 +2859,11 @@ IMPLICIT NONE
 !
 INTEGER                          :: JL
 INTEGER,DIMENSION(:),ALLOCATABLE :: I1
-!$acc declare create(I1)
+!$acc declare device_resident(I1)
 !
 !-------------------------------------------------------------------------------
+  ALLOCATE(GDRY(IMICRO))
+  ALLOCATE(I1(IMICRO)) !I1 is bigger than necessary but it easier to do it now (instead of computing IGDRY before allocating I1)
 !
 !*       6.1    rain contact freezing
 !
@@ -2932,13 +2937,9 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1
                                      * ZRIT(:) * ZZW(:) )             ! RIDRYG
 #endif
   END WHERE
-!$acc end kernels
 !
 !*       6.2.1  accretion of aggregates on the graupeln
 !
-  ALLOCATE(GDRY(IMICRO))
-  ALLOCATE(I1(IMICRO)) !I1 is bigger than necessary but it easier to do it now (instead of computing IGDRY before allocating I1)
-!$acc kernels
   GDRY(:) = (ZRST(:)>XRTMIN(5)) .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRSS(:)>0.0)
 !$acc end kernels
 #ifndef _OPENACC
@@ -2959,11 +2960,12 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1
 !
 !*       6.2.3  select the (ZLBDAG,ZLBDAS) couplet
 !
+!$acc kernels copyin(XKER_SDRYG,XCOLEXSG,XCXG) &
+!$acc & present(IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3,GDRY,ZZW1,ZRSS,ZZW,ZZT,ZLBDAS,ZLBDAG,ZRHODREF)
 #ifndef _OPENACC
     ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) )
     ZVEC2(:) = PACK( ZLBDAS(:),MASK=GDRY(:) )
 #else
-!$acc kernels
     DO JL=1,IGDRY
       ZVEC1(JL)  = ZLBDAG(I1(JL))
       ZVEC2(JL)  = ZLBDAS(I1(JL))
@@ -2991,13 +2993,10 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1
 #endif
     IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) )
     ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - FLOAT( IVEC2(1:IGDRY) )
-!$acc end kernels
 !
 !*       6.2.5  perform the bilinear interpolation of the normalized
 !               SDRYG-kernel
 !
-!$acc kernels copyin(XKER_SDRYG,XCOLEXSG,XCXG) default(none) &
-!$acc & present(IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3,GDRY,ZZW1,ZRSS,ZZW,ZZT,ZLBDAS,ZLBDAG,ZRHODREF)
     DO JJ = 1,IGDRY
       ZVEC3(JJ) =  (  XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ)          &
                     - XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)  )*(ZVEC2(JJ) - 1.0) ) &
@@ -3065,11 +3064,12 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1
 !
 !*       6.2.8  select the (ZLBDAG,ZLBDAR) couplet
 !
+!$acc kernels copyin(XKER_RDRYG,XCXG) &
+!$acc & present(IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3,GDRY,ZZW1,ZRRS,ZZW,ZLBDAR,ZLBDAG,ZRHODREF)
 #ifndef _OPENACC
     ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) )
     ZVEC2(:) = PACK( ZLBDAR(:),MASK=GDRY(:) )
 #else
-!$acc kernels
     DO JL=1,IGDRY
       ZVEC1(JL)  = ZLBDAG(I1(JL))
       ZVEC2(JL)  = ZLBDAR(I1(JL))
@@ -3097,13 +3097,10 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1
 #endif
     IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) )
     ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - FLOAT( IVEC2(1:IGDRY) )
-!$acc end kernels
 !
 !*       6.2.10 perform the bilinear interpolation of the normalized
 !               RDRYG-kernel
 !
-!$acc kernels copyin(XKER_RDRYG,XCXG) default(none) &
-!$acc & present(IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3,GDRY,ZZW1,ZRRS,ZZW,ZLBDAR,ZLBDAG,ZRHODREF)
     DO JJ = 1,IGDRY
       ZVEC3(JJ) =  (  XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ)          &
                     - XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)  )*(ZVEC2(JJ) - 1.0) ) &
@@ -3146,15 +3143,14 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1
     DEALLOCATE(ZVEC1)
   END IF
 !
-!$acc kernels
-  ZRDRYG(:) = ZZW1(:,1) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,4)
-!$acc end kernels
   DEALLOCATE(GDRY)
 !
+!$acc kernels copyin(XRTMIN,XEX0DEPG,XEX1DEPG) &
+!$acc & present(ZZW,ZRWETG,ZRGT,ZZW1,ZRIS,ZRSS,ZRVT,ZZT,ZPRES,ZKA,ZDV,ZLBDAG,ZCJ)
+  ZRDRYG(:) = ZZW1(:,1) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,4)
+!
 !*       6.3    compute the Wet growth case
 !
-!$acc kernels default(none) copyin(XRTMIN,XEX0DEPG,XEX1DEPG) &
-!$acc & present(ZZW,ZRWETG,ZRGT,ZZW1,ZRIS,ZRSS,ZRVT,ZZT,ZPRES,ZKA,ZDV,ZLBDAG,ZCJ)
   ZZW(:) = 0.0
   ZRWETG(:) = 0.0
   WHERE( ZRGT(:)>XRTMIN(6) )
@@ -3193,11 +3189,9 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1
                           ( ZRHODREF(:)*(XLMTT-XCL*(XTT-ZZT(:))) )   )
 #endif
   END WHERE
-!$acc end kernels
 !
 !*       6.4    Select Wet or Dry case
 !
-!$acc kernels
   ZZW(:) = 0.0
   IF     ( KRR == 7 ) THEN
     GWORK(:) = ZRGT(:)>XRTMIN(6) .AND. ZZT(:)<XTT .AND. & ! Wet
diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90
index 7afd1d7408bc47946cb8bb74cd884977069bbcfb..99d742e83b0909aa0aff31e5130234e720463d5c 100644
--- a/src/MNH/resolved_cloud.f90
+++ b/src/MNH/resolved_cloud.f90
@@ -702,6 +702,45 @@ CALL ABORT
       END WHERE
     END IF
 #else
+#if 1
+!$acc kernels present(PTHS,PRS) present(ZEXN,ZLV,ZLS,ZCPH,ZCOR)
+    DO JK=1,SIZE(PZZ,3)
+      DO JJ=1,SIZE(PZZ,2)
+        DO JI=1,SIZE(PZZ,1)
+          IF (PRS(JI,JJ,JK,4) < 0.) THEN
+            PRS(JI,JJ,JK,1) = PRS(JI,JJ,JK,1) + PRS(JI,JJ,JK,4)
+            PTHS(JI,JJ,JK) = PTHS(JI,JJ,JK) - PRS(JI,JJ,JK,4) * ZLS(JI,JJ,JK) /  &
+                             ZCPH(JI,JJ,JK) / ZEXN(JI,JJ,JK)
+            PRS(JI,JJ,JK,4) = 0.
+          END IF
+          !   cloud
+          IF (PRS(JI,JJ,JK,2) < 0.) THEN
+            PRS(JI,JJ,JK,1) = PRS(JI,JJ,JK,1) + PRS(JI,JJ,JK,2)
+            PTHS(JI,JJ,JK) = PTHS(JI,JJ,JK) - PRS(JI,JJ,JK,2) * ZLV(JI,JJ,JK) /  &
+                             ZCPH(JI,JJ,JK) / ZEXN(JI,JJ,JK)
+            PRS(JI,JJ,JK,2) = 0.
+          END IF
+          ! if rc or ri are positive, we can correct negative rv
+          !   cloud
+          IF ( PRS(JI,JJ,JK,1) < 0. .AND. (PRS(JI,JJ,JK,2)> 0.) ) THEN
+            PRS(JI,JJ,JK,1) = PRS(JI,JJ,JK,1) + PRS(JI,JJ,JK,2)
+            PTHS(JI,JJ,JK) = PTHS(JI,JJ,JK) - PRS(JI,JJ,JK,2) * ZLV(JI,JJ,JK) /  &
+                             ZCPH(JI,JJ,JK) / ZEXN(JI,JJ,JK)
+            PRS(JI,JJ,JK,2) = 0.
+          END IF
+          !   ice
+          IF (KRR>3 .AND. (PRS(JI,JJ,JK,1) < 0.).AND.(PRS(JI,JJ,JK,4) > 0.)) THEN
+              ZCOR(JI,JJ,JK)=MIN(-PRS(JI,JJ,JK,1),PRS(JI,JJ,JK,4))
+              PRS(JI,JJ,JK,1) = PRS(JI,JJ,JK,1) + ZCOR(JI,JJ,JK)
+              PTHS(JI,JJ,JK) = PTHS(JI,JJ,JK) - ZCOR(JI,JJ,JK) * ZLS(JI,JJ,JK) /  &
+                               ZCPH(JI,JJ,JK) / ZEXN(JI,JJ,JK)
+              PRS(JI,JJ,JK,4) = PRS(JI,JJ,JK,4) -ZCOR(JI,JJ,JK)
+            END IF
+          END DO
+        END DO
+      END DO
+!$acc end kernels
+#else
 !$acc kernels present(PTHS,PRS) present(ZEXN,ZLV,ZLS,ZCPH,ZCOR)
     DO JK=1,SIZE(PZZ,3)
       DO JJ=1,SIZE(PZZ,2)
@@ -740,6 +779,7 @@ CALL ABORT
       END DO
     END DO
 !$acc end kernels
+#endif
 !
 !
 #endif