diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index e9baccd68955ecb123621c5787b79c19106b88ed..956abcf442326b3bd84f202c1cb539661cc3c977 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -1077,14 +1077,22 @@ END IF
 !*       3.5   Module MODD_DYN_n
 !
 CALL GET_DIM_EXT_ll('Y',IIY,IJY)
-IF (L2D) THEN
-  ALLOCATE(XBFY(IIY,IJY,IKU))
+IF ( CPRESOPT /= 'ZSOLV' ) THEN
+  IF (L2D) THEN
+    ALLOCATE(XBFY(IIY,IJY,IKU))
+  ELSE
+    ALLOCATE(XBFY(IJY,IIY,IKU)) ! transposition needed by the optimisation of the
+                                ! FFT solver
+  END IF
 ELSE
-  ALLOCATE(XBFY(IJY,IIY,IKU)) ! transposition needed by the optimisation of the
-                              ! FFT solver
+  ALLOCATE(XBFY(0,0,0))
 END IF
+
 CALL GET_DIM_EXT_ll('B',IIU_B,IJU_B)
-ALLOCATE(XBFB(IIU_B,IJU_B,IKU))
+IF ( CPRESOPT == 'ZRESI' .OR. CPRESOPT == 'ZSOLV' ) THEN
+  ALLOCATE(XBFB(IIU_B,IJU_B,IKU))
+END IF
+
 #ifdef MNH_MGSOLVER
 IF ( CPRESOPT == 'ZSOLV' ) THEN
   ALLOCATE(XAF_ZS(IIU_B,IJU_B,IKU))
@@ -1097,13 +1105,34 @@ IF ( CPRESOPT == 'ZSOLV' ) THEN
   ALLOCATE(XB_K(IKU))
   ALLOCATE(XC_K(IKU))
   ALLOCATE(XD_K(IKU))
+ELSE
+  ALLOCATE(XAF_ZS(0,0,0))
+  ALLOCATE(XBF_ZS(0,0,0))
+  ALLOCATE(XCF_ZS(0,0,0))
+  ALLOCATE(XDXATH_ZS(0,0))
+  ALLOCATE(XDYATH_ZS(0,0))
+  ALLOCATE(XRHO_ZS(0,0,0))
+  ALLOCATE(XA_K(0))
+  ALLOCATE(XB_K(0))
+  ALLOCATE(XC_K(0))
+  ALLOCATE(XD_K(0))
 END IF
 #endif
-CALL GET_DIM_EXTZ_ll('SXP2_YP1_Z',IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll)
-ALLOCATE(XBF_SXP2_YP1_Z(IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll))
-ALLOCATE(XAF(IKU),XCF(IKU))
-ALLOCATE(XTRIGSX(3*IIU_ll))
-ALLOCATE(XTRIGSY(3*IJU_ll))
+IF ( CPRESOPT == 'ZRESI' ) THEN
+  CALL GET_DIM_EXTZ_ll('SXP2_YP1_Z',IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll)
+  ALLOCATE(XBF_SXP2_YP1_Z(IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll))
+ELSE
+  ALLOCATE(XBF_SXP2_YP1_Z(0,0,0))
+END IF
+IF ( CPRESOPT /= 'ZSOLV' ) THEN
+  ALLOCATE(XAF(IKU),XCF(IKU))
+  ALLOCATE(XTRIGSX(3*IIU_ll))
+  ALLOCATE(XTRIGSY(3*IJU_ll))
+ELSE
+  ALLOCATE(XAF(0),XCF(0))
+  ALLOCATE(XTRIGSX(0))
+  ALLOCATE(XTRIGSY(0))
+END IF
 ALLOCATE(XRHOM(IKU))
 !$acc enter data create( XRHOM, XAF, XBFY, XCF, XTRIGSX, XTRIGSY, NIFAXX, NIFAXY, XBFB, XBF_SXP2_YP1_Z )
 ALLOCATE(XALK(IKU))
@@ -2193,20 +2222,20 @@ IF ( KMI > 1) THEN
   DPTR_XLBXSVM=>XLBXSVM
   DPTR_XLBYSVM=>XLBYSVM
   IF (CCONF=='START')  THEN
-  CALL INI_ONE_WAY_n(NDAD(KMI),KMI,                        &
-       DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4,        &
-       DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4,        &
-       NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),      &
-       DPTR_CLBCX,DPTR_CLBCY,NRIMX,NRIMY,                                &
-       DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU,      &
-       DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV,      &
-       DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW,      &
-       DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM,      &
-       CCLOUD, LUSECHAQ, LUSECHIC,                                                 &
-       DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM,DPTR_XLBXWM,DPTR_XLBYWM,    &
-       DPTR_XLBXTHM,DPTR_XLBYTHM,                                                  &
-       DPTR_XLBXTKEM,DPTR_XLBYTKEM,                                                &
-       DPTR_XLBXRM,DPTR_XLBYRM,DPTR_XLBXSVM,DPTR_XLBYSVM                           )
+  CALL INI_ONE_WAY_n(NDAD(KMI),KMI,                                                             &
+       DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4, &
+       DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, &
+       NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),                                                     &
+       DPTR_CLBCX,DPTR_CLBCY,NRIMX,NRIMY,                                                       &
+       DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU,                   &
+       DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV,                   &
+       DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW,                   &
+       DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM,                   &
+       CCLOUD, LUSECHAQ, LUSECHIC,                                                              &
+       DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM,DPTR_XLBXWM,DPTR_XLBYWM,                 &
+       DPTR_XLBXTHM,DPTR_XLBYTHM,                                                               &
+       DPTR_XLBXTKEM,DPTR_XLBYTKEM,                                                             &
+       DPTR_XLBXRM,DPTR_XLBYRM,DPTR_XLBXSVM,DPTR_XLBYSVM                                        )
    ENDIF
 END IF
 !
diff --git a/src/MNH/tridz.f90 b/src/MNH/tridz.f90
index 9125ca1c97a2b8578c38ca63ebb776fbc9bb93b6..93bf853351331290e8e11759d82db5d21abb16ba 100644
--- a/src/MNH/tridz.f90
+++ b/src/MNH/tridz.f90
@@ -552,10 +552,12 @@ IF ( HPRESOPT == 'ZSOLV' ) THEN
   C_K = 0.0
 END IF
 #endif
-DO JK = IKB,IKE
-  PAF(JK) = 0.5 * ( PRHOM(JK-1) + PRHOM(JK)   ) / ZDZM(JK)   **2 
-  PCF(JK) = 0.5 * ( PRHOM(JK)   + PRHOM(JK+1) ) / ZDZM(JK+1) **2 
-END DO
+IF ( HPRESOPT /= 'ZSOLV' ) THEN
+  DO JK = IKB,IKE
+    PAF(JK) = 0.5 * ( PRHOM(JK-1) + PRHOM(JK)   ) / ZDZM(JK)   **2
+    PCF(JK) = 0.5 * ( PRHOM(JK)   + PRHOM(JK+1) ) / ZDZM(JK+1) **2
+  END DO
+END IF
 
 #ifdef MNH_MGSOLVER
 IF ( HPRESOPT == 'ZSOLV' ) THEN
@@ -566,8 +568,8 @@ IF ( HPRESOPT == 'ZSOLV' ) THEN
                                        / ZDZM_ZS(IIB:IIE,IJB:IJE,JK+1) **2 
 
     D_K(JK) = PRHOM(JK) ! / ZDZM(JK)
-    B_K(JK) = PCF(JK) / D_K(JK)
-    C_K(JK) = PAF(JK) / D_K(JK)
+    B_K(JK) = ( 0.5 * ( PRHOM(JK)   + PRHOM(JK+1) ) / ZDZM(JK+1) **2 ) / D_K(JK)
+    C_K(JK) = ( 0.5 * ( PRHOM(JK-1) + PRHOM(JK)   ) / ZDZM(JK)   **2 ) / D_K(JK)
   END DO
 END IF
 #endif
@@ -575,28 +577,32 @@ END IF
 ! at the upper and lower levels PAF and PCF are computed using the Neumann 
 ! conditions applying on the vertical component of the gradient
 !            
-PAF(IKE+1) = -0.5 * ( PRHOM(IKE)   + PRHOM(IKE+1) ) / ZDZM(IKE+1) **2 
+IF ( HPRESOPT /= 'ZSOLV' ) THEN
+  PAF(IKE+1) = -0.5 * ( PRHOM(IKE)   + PRHOM(IKE+1) ) / ZDZM(IKE+1)**2
+END IF
 #ifdef MNH_MGSOLVER
 IF ( HPRESOPT == 'ZSOLV' ) THEN
   D_K(IKE+1) = PRHOM(IKE+1) ! / ZDZM(IKE+1)
-  C_K(IKE+1) = PAF(IKE+1) / D_K(IKE+1)
+  C_K(IKE+1) = ( -0.5 * ( PRHOM(IKE)   + PRHOM(IKE+1) ) / ZDZM(IKE+1) **2 ) / D_K(IKE+1)
 END IF
 #endif
 
-PCF(IKB-1) =  0.5 * ( PRHOM(IKB-1) + PRHOM(IKB)   ) / ZDZM(IKB)   **2 
+IF ( HPRESOPT /= 'ZSOLV' ) THEN
+  PCF(IKB-1) =  0.5 * ( PRHOM(IKB-1) + PRHOM(IKB)   ) / ZDZM(IKB)**2
+END IF
 #ifdef MNH_MGSOLVER
 IF ( HPRESOPT == 'ZSOLV' ) THEN
   D_K(IKB-1) = PRHOM(IKB-1) ! / ZDZM(IKB-1)
-  B_K(IKB-1) = PCF(IKB-1) / D_K(IKB-1)
+  B_K(IKB-1) = ( 0.5 * ( PRHOM(IKB-1) + PRHOM(IKB)   ) / ZDZM(IKB)**2 ) / D_K(IKB-1)
 END IF
 #endif
 !
-PAF(IKB-1) =  0.0 ! 0.5 * ( PRHOM(IKB-1) + PRHOM(IKB)   ) / ZDZM(IKB)   **2
+IF ( HPRESOPT /= 'ZSOLV' ) PAF(IKB-1) =  0.0 ! 0.5 * ( PRHOM(IKB-1) + PRHOM(IKB)   ) / ZDZM(IKB)   **2
 #ifdef MNH_MGSOLVER
 IF ( HPRESOPT == 'ZSOLV' ) C_K(IKB-1) =  0.0
 
 #endif
-PCF(IKE+1) =  0.0 ! 0.5 * ( PRHOM(IKE)   + PRHOM(IKE+1) ) / ZDZM(IKE+1) **2
+IF ( HPRESOPT /= 'ZSOLV' ) PCF(IKE+1) =  0.0 ! 0.5 * ( PRHOM(IKE)   + PRHOM(IKE+1) ) / ZDZM(IKE+1) **2
 #ifdef MNH_MGSOLVER
 IF ( HPRESOPT == 'ZSOLV' ) THEN
   B_K(IKE+1) =  0.0
@@ -715,11 +721,12 @@ DEALLOCATE(ZEIGENX_ll)
 !*       7.2   compute the matrix diagonal elements
 !
 !
-PBFY = 1.
-PBFB = 1.  ! JUAN Z_SLIDE
-PBF_SXP2_YP1_Z = 1.  ! JUAN Z_SLIDE
+IF ( HPRESOPT /= 'ZSOLV' ) PBFY = 1.
+IF ( HPRESOPT == 'ZRESI' .OR. HPRESOPT == 'ZSOLV' ) PBFB = 1.  ! JUAN Z_SLIDE
+IF ( HPRESOPT == 'ZRESI' ) PBF_SXP2_YP1_Z = 1.  ! JUAN Z_SLIDE
 !
 IF (L2D) THEN
+ IF ( HPRESOPT /= 'ZSOLV' ) THEN
   DO JK= IKB,IKE
     DO JJ= 1, IYMODEY_ll
       DO JI= 1, IXMODEY_ll
@@ -737,8 +744,10 @@ IF (L2D) THEN
   !
   PBFY(1:IXMODEY_ll,1:IYMODEY_ll,IKE+1) =  0.5 * ( PRHOM(IKE)   + PRHOM(IKE+1) ) /  &
                                ZDZM(IKE+1) **2
+ END IF
   !
 ELSE
+ IF ( HPRESOPT /= 'ZSOLV' ) THEN
   IF ( CSPLIT /= 'BSPLITTING' ) THEN
   !print*,"WARNING CSPLIT /= 'BSPLITTING =", CSPLIT     
   DO JK= IKB,IKE
@@ -759,6 +768,7 @@ ELSE
   PBFY(1:IYMODEY_ll,1:IXMODEY_ll,IKE+1) =  0.5 * ( PRHOM(IKE)   + PRHOM(IKE+1) ) /  &
                                ZDZM(IKE+1) **2
   END IF
+ END IF
   !
 
 !JUAN Z_SPLITTING
@@ -767,6 +777,7 @@ ELSE
 #ifdef MNH_MGSOLVER
   IF ( HPRESOPT == 'ZSOLV' ) PBF_ZS(:,:,:) = 1.0
 #endif
+  IF ( HPRESOPT == 'ZRESI' .OR. HPRESOPT == 'ZSOLV' ) THEN
   DO JK= IKB,IKE
     DO JJ= IJB,IJE
       DO JI= IIB, IIE
@@ -776,6 +787,7 @@ ELSE
       END DO
     END DO
   END DO
+  END IF
 #ifdef MNH_MGSOLVER
   IF ( HPRESOPT == 'ZSOLV' ) THEN
     DO JK= IKB,IKE
@@ -792,9 +804,11 @@ ELSE
 ! at the upper and lower levels PBFB is computed using the Neumann
 ! condition
 !
+  IF ( HPRESOPT == 'ZRESI' .OR. HPRESOPT == 'ZSOLV' ) THEN
   PBFB(IIB:IIE,IJB:IJE,IKB-1) = - 0.5 * ( PRHOM(IKB-1) + PRHOM(IKB)   ) / ZDZM(IKB)   **2
   !
   PBFB(IIB:IIE,IJB:IJE,IKE+1) = + 0.5 * ( PRHOM(IKE)   + PRHOM(IKE+1) ) / ZDZM(IKE+1) **2
+  END IF
 #ifdef MNH_MGSOLVER
   IF ( HPRESOPT == 'ZSOLV' ) THEN
     PBF_ZS(IIB:IIE,IJB:IJE,IKB-1) = - 0.5 * ( PRHO_ZS(IIB:IIE,IJB:IJE,IKB-1) + PRHO_ZS(IIB:IIE,IJB:IJE,IKB)   ) &
@@ -822,6 +836,7 @@ END IF
 !JUAN Z_SPLITTING
 !JUAN for Z splitting we need to do the vertical substitution
 !JUAN in _SXP2_YP1_Zsplitting slides so need PBF_SXP2_YP1_Z 
+IF ( HPRESOPT == 'ZRESI' ) THEN
   DO JK=IKB,IKE
     DO JJ= 1, IJU_SXP2_YP1_Z_ll
       DO JI= 1, IIU_SXP2_YP1_Z_ll
@@ -842,12 +857,15 @@ END IF
   !
 !JUAN Z_SPLITTING
 END IF
+END IF
 !
 ! second coefficent is meaningless in cyclic case
+IF ( HPRESOPT /= 'ZSOLV' ) THEN
 IF (HLBCX(1) == 'CYCL' .AND. L2D .AND. SIZE(PBFY,1) .GE. 2 ) PBFY(2,:,:)=1.
 IF (HLBCX(1) == 'CYCL' .AND. .NOT.(L2D) .AND. LWEST_ll(HSPLITTING='Y') .AND. SIZE(PBFY,2) .GE.2 ) &
     PBFY(:,2,:)=1.
 IF (HLBCY(1) == 'CYCL' .AND. .NOT.(L2D) .AND. SIZE(PBFY,1) .GE. 2  ) PBFY(2,:,:)=1.
+END IF
 !JUAN Z_SPLITTING
 ! second coefficent is meaningless in cyclic case
 !IF (HLBCX(1) == 'CYCL' .AND. L2D  .AND. SIZE(PBFB,1) .GE. 2  ) PBFB(2,:,:)=1.
@@ -862,6 +880,7 @@ DEALLOCATE(ZEIGEN_ll)
 !------------------------------------------------------------------------------
 !*       8.    INITIALIZATION OF THE TRIGS AND IFAX ARRAYS FOR THE FFT 
 !              -------------------------------------------------------
+NOT_ZSOLV: IF ( HPRESOPT /= 'ZSOLV' ) THEN
 !
 !        8.1 x lateral boundary conditions
 !
@@ -936,6 +955,8 @@ IF (.NOT. L2D) THEN
  ENDIF
  !
 ENDIF
+
+END IF NOT_ZSOLV
 !
 !------------------------------------------------------------------------------
 !