diff --git a/src/MNH/advecuvw_rk.f90 b/src/MNH/advecuvw_rk.f90
index 34153fbe7b89e0068ac88ea6a57854333b4bfbdf..62b012caafbdbd384945bab1439a49fdf5522257 100644
--- a/src/MNH/advecuvw_rk.f90
+++ b/src/MNH/advecuvw_rk.f90
@@ -256,9 +256,6 @@ allocate(ZWT(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)))
 #endif
 
 #ifdef MNH_OPENACC
-!Data zone necessary to work around a bug seen with PGI at least up to 18.10
-!If not, update on a section of ZRUS will update a section of the total size of ZRUS
-!$acc data present(ZRUS,ZRVS,ZRWS)
 CALL INIT_ON_HOST_AND_DEVICE(ZUT,4e99,'ADVECUVW_RK::ZUT')
 CALL INIT_ON_HOST_AND_DEVICE(ZVT,5e99,'ADVECUVW_RK::ZVT')
 CALL INIT_ON_HOST_AND_DEVICE(ZWT,6e99,'ADVECUVW_RK::ZWT')
@@ -426,10 +423,15 @@ INBVAR = 3
 CALL INIT_HALO2_ll(TZHALO2MT_ll,INBVAR,SIZE(PUT,1),SIZE(PUT,2),SIZE(PWT,3))
 !
 !$acc kernels
-ZRUS = 0.
-ZRVS = 0.
-ZRWS = 0.
+ZRUS(:, :, :, : ) = 0.
+ZRVS(:, :, :, : ) = 0.
+ZRWS(:, :, :, : ) = 0.
 !$acc end kernels
+
+!Necessary to work around a PGI bug (19.10)
+!because following update ZRUS(:,:,:,JS) are done on the WHOLE array
+!$acc update self(ZRUS,ZRVS,ZRWS)
+
 !-------------------------------------------------------------------------------
 !
 !*       3.     BEGINNING of Runge-Kutta loop
@@ -528,7 +530,6 @@ CALL CLEANLIST_ll(TZFIELDMT_ll)
 CALL  DEL_HALO2_ll(TZHALO2MT_ll)
 !$acc update self(PRUS_ADV,PRVS_ADV,PRWS_ADV)
 !-------------------------------------------------------------------------------
-!$acc end data
 !
 IF (MPPDB_INITIALIZED) THEN
   !Check all OUT arrays
diff --git a/src/MNH/ice4_fast_rg.f90 b/src/MNH/ice4_fast_rg.f90
index c319ceb3e5979f5bdd0de9f9a40e74c0390560de..7d46ac697a0f2c5fb8d1f31d6349dba9474a1a52 100644
--- a/src/MNH/ice4_fast_rg.f90
+++ b/src/MNH/ice4_fast_rg.f90
@@ -367,10 +367,10 @@ DO JJ = 1, SIZE(GDRY)
   END IF
 END DO
 !$acc end kernels
-!PW: BUG: this is necessary to get correct results (PGI 18.10)
+!PW: BUG: this is necessary to get correct results (PGI 18.10, 19.10)
 ! !$acc update self(GDRY,IGDRY)
 ! !$acc update self(IGDRY)
-! IF(JJ==-999) print *,'PW: IGDRY=',IGDRY,COUNT(GDRY)
+IF(JJ==-999) print *,jj
 ! !$acc kernels
 IF(GDSOFT) THEN
 !$acc kernels
diff --git a/src/MNH/ice4_sedimentation_split.f90 b/src/MNH/ice4_sedimentation_split.f90
index 89b442ffcbca712e0d93c49d619c83fd170eb513..9f81ca088e65d15d8bf77bceecf50dcabba2e1bc 100644
--- a/src/MNH/ice4_sedimentation_split.f90
+++ b/src/MNH/ice4_sedimentation_split.f90
@@ -658,13 +658,19 @@ if (JK==-9999) print *,'PW: ISEDIM=',ISEDIM
     ENDIF
   ENDDO
   ZREMAINT(:,:) = ZREMAINT(:,:) - ZMAX_TSTEP(:,:)
-!$acc loop independent private(ZMRCHANGE)
+!PW:BUG PGI: do not set independent (wrong results with PGI 19.10)
+!acc loop independent private(ZMRCHANGE)
   DO JK = KKTB , KKTE
     ZMRCHANGE(:,:) = ZMAX_TSTEP(:,:) * POORHODZ(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
     PRXT(:,:,JK) = PRXT(:,:,JK) + ZMRCHANGE(:,:) + PPRXS(:,:,JK) * ZMAX_TSTEP(:,:)
     PRXS(:,:,JK) = PRXS(:,:,JK) + ZMRCHANGE(:,:) * ZINVTSTEP
   ENDDO
+!$acc end kernels
+!$acc update self(ZWSED,ZMAX_TSTEP,PINPRX)
+!PW: BUG PGI: done on CPU to work around a PGI 19.10 bug
   PINPRX(:,:) = PINPRX(:,:) + ZWSED(:,:,KKB) / XRHOLW * (ZMAX_TSTEP(:,:) * ZINVTSTEP)
+!$acc update device(PINPRX)
+!$acc kernels
   IF (GPRESENT_PFPR) THEN
 !$acc loop independent
     DO JK = KKTB , KKTE
diff --git a/src/MNH/prandtl.f90 b/src/MNH/prandtl.f90
index b5d26757535100b21d55ed33341c123b47e28bee..8ec0361d6011910c2e724fe6dcadf21211634959 100644
--- a/src/MNH/prandtl.f90
+++ b/src/MNH/prandtl.f90
@@ -611,20 +611,21 @@ call Print_msg( NVERB_WARNING, 'GEN', 'PRANDTL', 'OpenACC: L2D=.T. and KRR=0 not
 #else
     PRED2TH3(:,:,:) = BR_P2(PREDTH1(:,:,:)) +  BR_P2(XCTV)*BR_P2(PBLL_O_E(:,:,:)) * ZTMP2_DEVICE
 #endif
-!$acc end kernels
-!$acc kernels async
+!PW: merge kernels + remove async to prevent compiler crash...(bug PGI 19.10)
+! !$acc end kernels
+! !$acc kernels async
     PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL)
-!$acc end kernels
+! !$acc end kernels
 #endif
 !
-!$acc kernels async
+! !$acc kernels async
     PRED2R3(:,:,:) = 0.
-!$acc end kernels
+! !$acc end kernels
 !
-!$acc kernels async
+! !$acc kernels async
     PRED2THR3(:,:,:) = 0.
 !$acc end kernels
-!$acc wait
+! !$acc wait
 !
   END IF
 !
diff --git a/src/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90
index 8f92eb5987a5621a03597db7db609b0d1540d6dd..4dbcb63e618ebe4dff2206ba195aeca8c8e42eca 100644
--- a/src/MNH/turb_hor_vw.f90
+++ b/src/MNH/turb_hor_vw.f90
@@ -467,7 +467,7 @@ END IF
 IF (LLES_CALL .AND. KSPLT==1) THEN
   CALL SECOND_MNH(ZTIME1)
 #ifndef MNH_OPENACC
-  CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MYF(ZFLX)), X_LES_SUBGRID_WV , .TRUE. ) 
+  CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MYF(ZFLX)), X_LES_SUBGRID_WV , .TRUE. )
   CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MYF(GZ_V_VW(1,IKU,1,PVM,PDZZ)*ZFLX)), X_LES_RES_ddxa_V_SBG_UaV , .TRUE.)
   CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MYF(GY_W_VW(1,IKU,1,PWM,PDYY,PDZZ,PDZY)*ZFLX)), X_LES_RES_ddxa_W_SBG_UaW , .TRUE.)
   CALL LES_MEAN_SUBGRID( MXF(GY_M_V(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY)*MZF(1,IKU,1,ZFLX)), &
@@ -486,7 +486,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
   !
   CALL MYF_DEVICE(ZFLX,ZTMP1_DEVICE)
   CALL MZF_DEVICE(1,IKU,1,ZTMP1_DEVICE,ZTMP2_DEVICE)
-  CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_SUBGRID_WV , .TRUE. ) 
+  CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_SUBGRID_WV , .TRUE. )
   !
   CALL GZ_V_VW_DEVICE(1,IKU,1,PVM,PDZZ,ZTMP1_DEVICE)
   !$acc kernels
@@ -498,7 +498,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
   !
   CALL GY_W_VW_DEVICE(1,IKU,1,PWM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
   !$acc kernels
-  ZTMP2_DEVICE = ZTMP1_DEVICE*ZFLX
+  ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLX(:,:,:)
   !$acc end kernels
   CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE)
   CALL MZF_DEVICE(1,IKU,1,ZTMP1_DEVICE,ZTMP2_DEVICE)
@@ -506,9 +506,12 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
   !
   CALL GY_M_V_DEVICE(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
   CALL MZF_DEVICE(1,IKU,1,ZFLX,ZTMP2_DEVICE)
-  !$acc kernels
-  ZTMP3_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE
-  !$acc end kernels
+!PW: kernel removed to work around a PGI 19.10 bug
+!$acc update self(ZTMP1_DEVICE,ZTMP2_DEVICE)
+!   !$acc kernels
+  ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
+!   !$acc end kernels
+!$acc update device(ZTMP3_DEVICE)
   CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE)
   CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE, X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.)
   !
@@ -518,9 +521,12 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
     !
     CALL GY_M_V_DEVICE(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
     CALL MZF_DEVICE(1,IKU,1,ZFLX,ZTMP2_DEVICE)
-    !$acc kernels
-    ZTMP3_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE
-    !$acc end kernels
+!PW: kernel removed to work around a PGI 19.10 bug
+!$acc update self(ZTMP1_DEVICE,ZTMP2_DEVICE)
+!     !$acc kernels
+    ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
+!     !$acc end kernels
+!$acc update device(ZTMP3_DEVICE)
     CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE)
     CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE, X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE.)
     !