diff --git a/src/ZSOLVER/rain_ice_red.f90 b/src/ZSOLVER/rain_ice_red.f90
index 3aeb5a1335d50b469af71689f3e57fb2b2e8e8a8..a5f8dcd59e603326ad4f89b0cbc21e3cfffd20bd 100644
--- a/src/ZSOLVER/rain_ice_red.f90
+++ b/src/ZSOLVER/rain_ice_red.f90
@@ -690,13 +690,6 @@ REAL, DIMENSION(:,:,:), pointer, contiguous :: ZTEMP_BUD
 !
 LOGICAL :: GTEST ! temporary variable for OpenACC character limitation (Cray CCE)
 
-!$acc data present( ODMICRO, PEXN, PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, &
-!$acc &             PHLC_HRC, PTHT, PRVT,                                                 &
-!$acc &             PRCT, PHLC_HCF, PHLI_HRI, PHLI_HCF, PRRT, PRIT, PRST, PRGT, PSIGS,    &
-!$acc &             PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS,                             &
-!$acc &             PINPRC, PINDEP, PINPRR, PEVAP3D, PINPRS, PINPRG, PRAINFR,             &
-!$acc &             PSEA, PTOWN, PRHT, PRHS, PINPRH, PFPR )
-
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
   CALL MPPDB_CHECK(ODMICRO,"RAIN_ICE_RED beg:ODMICRO")
@@ -735,6 +728,13 @@ IF (MPPDB_INITIALIZED) THEN
   IF (PRESENT(PRHS)) CALL MPPDB_CHECK(PRHS,"RAIN_ICE_RED beg:PRHS")
 END IF
 
+!$acc data present( ODMICRO, PEXN, PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, &
+!$acc &             PHLC_HRC, PTHT, PRVT,                                                 &
+!$acc &             PRCT, PHLC_HCF, PHLI_HRI, PHLI_HCF, PRRT, PRIT, PRST, PRGT, PSIGS,    &
+!$acc &             PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS,                             &
+!$acc &             PINPRC, PINDEP, PINPRR, PEVAP3D, PINPRS, PINPRG, PRAINFR,             &
+!$acc &             PSEA, PTOWN, PRHT, PRHS, PINPRH, PFPR )
+
 !$acc kernels
 imicro = count(odmicro)
 !$acc end kernels
@@ -1697,8 +1697,9 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies
                         &ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, &
                         &ZHLI_HCF, ZHLI_LCF, ZHLI_HRI, ZHLI_LRI, PRAINFR)
     ! External tendencies
-!$acc kernels
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     IF(GEXT_TEND) THEN
+!$acc kernels
 !$acc loop independent
       DO JL=1, IMICRO
         ZA_TH(JL) = ZA_TH(JL) + ZEXT_TH(JL)
@@ -1710,7 +1711,9 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies
         ZA_RG(JL) = ZA_RG(JL) + ZEXT_RG(JL)
         ZA_RH(JL) = ZA_RH(JL) + ZEXT_RH(JL)
       ENDDO
-    ENDIF
+!$acc end kernels
+   ENDIF
+!$acc kernels   
     !
     !***       4.2 Integration time
     !
@@ -1735,6 +1738,8 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies
                      ZW1D(JL) * MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
       ENDDO
     ENDIF
+!$acc end kernels
+!$acc kernels
     !We need to adjust tendencies when a specy disappears
     !When a species is missing, only the external tendencies can be negative (and we must keep track of it)
 !$acc loop independent
@@ -1769,7 +1774,8 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies
       ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                   &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RG(JL)+ZRGT(JL))/MIN(ZA_RG(JL), -1.E-20))
     ENDDO
-
+!$acc end kernels
+!$acc kernels
     IF(KRR==7) THEN
 !$acc loop independent
       DO JL=1, IMICRO
@@ -1778,7 +1784,9 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies
         ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
                     &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RH(JL)+ZRHT(JL))/MIN(ZA_RH(JL), -1.E-20))
       ENDDO
-    ENDIF
+   ENDIF
+!$acc end kernels
+!$acc kernels   
     !We stop when the end of the timestep is reached
     ZCOMPUTE(:)=ZCOMPUTE(:) * MAX(0., -SIGN(1., ZTIME(:)+ZMAXTIME(:)-PTSTEP))
 
@@ -1796,7 +1804,10 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies
     !We must recompute tendencies when the maximum allowed change is reached
     !When a specy is missing, only the external tendencies can be active and we do not want to recompute
     !the microphysical tendencies when external tendencies are negative (results won't change because specy was already missing)
+!$acc end kernels
+
     IF(XMRSTEP/=0.) THEN
+!$acc kernels
 !$acc loop independent
       DO JL=1, IMICRO
         ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
@@ -1877,7 +1888,8 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies
                     &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
         ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
       ENDDO
-
+!$acc end kernels
+!$acc kernels
       IF(KRR==7) THEN
 !$acc loop independent
         DO JL=1, IMICRO
@@ -1895,7 +1907,8 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies
           ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
         ENDDO
       ENDIF
-
+!$acc end kernels
+!$acc kernels
 !$acc loop independent
       DO JL=1, IMICRO
         ZW1D(JL)=MAX(ABS(ZB_RV(JL)), ABS(ZB_RC(JL)), ABS(ZB_RR(JL)), ABS(ZB_RI(JL)), &
@@ -1905,10 +1918,12 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies
         ZMAXTIME(JL)=(1.-ZW1D(JL))*ZMAXTIME(JL)
         ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
       ENDDO
-    ENDIF
+!$acc end kernels
+   ENDIF
     !
     !***       4.3 New values of variables for next iteration
     !
+!$acc kernels
 !$acc loop independent
     DO JL=1, IMICRO
       ZTHT(JL)=ZTHT(JL)+ZA_TH(JL)*ZMAXTIME(JL)+ZB_TH(JL)
@@ -1994,7 +2009,7 @@ ENDDO
 !*       5.     UNPACKING DIAGNOSTICS
 !               ---------------------
 !
-! !$acc kernels
+! ! acc kernels
 IF(IMICRO>0) THEN
 !$acc kernels present_cr(ZHLC_HCF3D,ZHLC_LCF3D,ZHLC_HRC3D,ZHLC_LRC3D,ZHLI_HCF3D,ZHLI_LCF3D,ZHLI_HRI3D,ZHLI_LRI3D)
   ZHLC_HCF3D(:,:,:)=0.
@@ -2052,20 +2067,16 @@ CALL ICE4_NUCLEATION_WRAPPER(KIT, KJT, KKT, GDNOTMICRO, &
                              PTHT, PPABST, PRHODREF, PEXN, ZLSFACT3D, ZT, &
                              PRVT, &
                              PCIT, ZZ_RVHENI_MR)
-!$acc kernels
-!$acc loop independent collapse(3)
-DO JK = 1, KKT
-  DO JJ = 1, KJT
-    DO JI = 1, KIT
-      ZZ_LSFACT(JI,JJ,JK)=ZZ_LSFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK)
-      ZZ_LVFACT(JI,JJ,JK)=ZZ_LVFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK)
-      ZZ_RVHENI(JI,JJ,JK) = MIN(PRVS(JI,JJ,JK), ZZ_RVHENI_MR(JI,JJ,JK)/PTSTEP)
-      PRIS(JI,JJ,JK)=PRIS(JI,JJ,JK)+ZZ_RVHENI(JI,JJ,JK)
-      PRVS(JI,JJ,JK)=PRVS(JI,JJ,JK)-ZZ_RVHENI(JI,JJ,JK)
-      PTHS(JI,JJ,JK)=PTHS(JI,JJ,JK) + ZZ_RVHENI(JI,JJ,JK)*ZZ_LSFACT(JI,JJ,JK)
-    ENDDO
-  ENDDO
-ENDDO
+
+!$acc kernels present_cr( PEXNREF, PRIS, PRVS, PTHS, ZZ_LSFACT, ZZ_LVFACT, ZZ_RVHENI )
+!$mnh_do_concurrent( JI = 1 : KIT, JJ = 1 : KJT, JK = 1 : KKT )
+  ZZ_LSFACT(JI,JJ,JK)=ZZ_LSFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK)
+  ZZ_LVFACT(JI,JJ,JK)=ZZ_LVFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK)
+  ZZ_RVHENI(JI,JJ,JK) = MIN(PRVS(JI,JJ,JK), ZZ_RVHENI_MR(JI,JJ,JK)/PTSTEP)
+  PRIS(JI,JJ,JK)=PRIS(JI,JJ,JK)+ZZ_RVHENI(JI,JJ,JK)
+  PRVS(JI,JJ,JK)=PRVS(JI,JJ,JK)-ZZ_RVHENI(JI,JJ,JK)
+  PTHS(JI,JJ,JK)=PTHS(JI,JJ,JK) + ZZ_RVHENI(JI,JJ,JK)*ZZ_LSFACT(JI,JJ,JK)
+!$mnh_end_do()
 !$acc end kernels
 !$acc update self(PRIS,PRVS,PTHS)
 !
@@ -2104,7 +2115,7 @@ IF(GEXT_TEND) THEN
 !$acc kernels
   !Z..T variables contain the exeternal tendency, we substract it
 !$acc loop independent
-  DO CONCURRENT ( JL = 1 : IMICRO )
+  !$mnh_do_concurrent ( JL = 1 : IMICRO )
     ZRVT(JL) = ZRVT(JL) - ZEXT_RV(JL) * PTSTEP
     ZRCT(JL) = ZRCT(JL) - ZEXT_RC(JL) * PTSTEP
     ZRRT(JL) = ZRRT(JL) - ZEXT_RR(JL) * PTSTEP
@@ -2112,14 +2123,14 @@ IF(GEXT_TEND) THEN
     ZRST(JL) = ZRST(JL) - ZEXT_RS(JL) * PTSTEP
     ZRGT(JL) = ZRGT(JL) - ZEXT_RG(JL) * PTSTEP
     ZTHT(JL) = ZTHT(JL) - ZEXT_TH(JL) * PTSTEP
-  END DO
+  !$mnh_end_do()
 !$acc end kernels
   IF (KRR==7) THEN
 !$acc kernels
 !$acc loop independent
-    DO CONCURRENT ( JL = 1 : IMICRO )
+    !$mnh_do_concurrent ( JL = 1 : IMICRO )
       ZRHT(JL) = ZRHT(JL) - ZEXT_RH(JL) * PTSTEP
-    END DO
+    !$mnh_end_do()
 !$acc end kernels
   END IF
 END IF
@@ -2181,14 +2192,14 @@ IF (KRR==7) THEN
 ELSE
 
 !PW: BUG: this should work...
-! !$acc kernels
+! ! acc kernels
 !   ZW_RVS(JI,JJ,JK) = 0.
 !   ZW_RCS(JI,JJ,JK) = 0.
 !   ZW_RRS(JI,JJ,JK) = 0.
 !   ZW_RIS(JI,JJ,JK) = 0.
 !   ZW_RSS(JI,JJ,JK) = 0.
 !   ZW_RGS(JI,JJ,JK) = 0.
-! !$acc loop independent
+! ! acc loop independent
 !   DO JL=1,IMICRO
 !     ZW_RVS(I1(JL), I2(JL), I3(JL)) = ( ZRVT(JL) - PRVT(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP
 !     ZW_RCS(I1(JL), I2(JL), I3(JL)) = ( ZRCT(JL) - PRCT(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP
@@ -2197,7 +2208,7 @@ ELSE
 !     ZW_RSS(I1(JL), I2(JL), I3(JL)) = ( ZRST(JL) - PRST(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP
 !     ZW_RGS(I1(JL), I2(JL), I3(JL)) = ( ZRGT(JL) - PRGT(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP
 !   END DO
-! !$acc end kernels
+! ! acc end kernels
 
 #if 0
 !$acc kernels
@@ -2767,6 +2778,8 @@ ENDIF
 
 !$acc end data
 
+!$acc end data
+
 #ifdef MNH_OPENACC
 !Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
 CALL MNH_MEM_RELEASE()
@@ -2794,8 +2807,6 @@ IF (MPPDB_INITIALIZED) THEN
   IF (PRESENT(PFPR))   CALL MPPDB_CHECK(PFPR,  "RAIN_ICE_RED end:PFPR")
 END IF
 
-!$acc end data
-
 CONTAINS
   !
   SUBROUTINE CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRV, PRC, PRR, &