diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index f039d2212fa6b025b41defa2213240159afc26c3..90704a8933e1c3f03a7262bdf8bd63db510f0de6 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -510,6 +510,19 @@ ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL))
 IDX = IDX+1
 !
 IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'ZTOP'
+TFIELDLIST(IDX)%CSTDNAME   = 'altitude_at_top_of_atmosphere_model'
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: ZTOP'
+TFIELDLIST(IDX)%CUNITS     = 'm'
+TFIELDLIST(IDX)%CDIR       = '--'
+TFIELDLIST(IDX)%CCOMMENT   = 'Height of top level'
+TFIELDLIST(IDX)%NGRID      = 4
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 0
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
 TFIELDLIST(IDX)%CMNHNAME   = 'DXHAT'
 !TODO: check stdname
 TFIELDLIST(IDX)%CSTDNAME   = ''
@@ -3210,6 +3223,13 @@ IF (.NOT.LFIELDLIST_ISINIT) THEN
 END IF
 !
 !
+IF (.NOT.ASSOCIATED(XZTOP)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XZTOP was not associated')
+  ALLOCATE(XZTOP)
+  CALL FIND_FIELD_ID_FROM_MNHNAME('ZTOP',IID,IRESP)
+  TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XZTOP
+END IF
+!
 IF (.NOT.ASSOCIATED(LSLEVE)) THEN
   CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' LSLEVE was not associated')
   ALLOCATE(LSLEVE)
@@ -3527,6 +3547,7 @@ CALL FIND_FIELD_ID_FROM_MNHNAME('ZSMT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(K
 CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XXHAT
 CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XYHAT
 CALL FIND_FIELD_ID_FROM_MNHNAME('ZHAT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XZHAT
+CALL FIND_FIELD_ID_FROM_MNHNAME('ZTOP', IID,IRESP); TFIELDLIST(IID)%TFIELD_X0D(KFROM)%DATA => XZTOP
 CALL FIND_FIELD_ID_FROM_MNHNAME('DXHAT',IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XDXHAT
 CALL FIND_FIELD_ID_FROM_MNHNAME('DYHAT',IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XDYHAT
 CALL FIND_FIELD_ID_FROM_MNHNAME('ALT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XZZ
@@ -3856,6 +3877,15 @@ CALL FIND_FIELD_ID_FROM_MNHNAME('ZSMT', IID,IRESP); XZSMT  => TFIELDLIST(IID)%TF
 CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT', IID,IRESP); XXHAT  => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA
 CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT', IID,IRESP); XYHAT  => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA
 CALL FIND_FIELD_ID_FROM_MNHNAME('ZHAT', IID,IRESP); XZHAT  => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA
+!
+CALL FIND_FIELD_ID_FROM_MNHNAME('ZTOP', IID,IRESP)
+IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN
+  CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',&
+                 'TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME)
+  ALLOCATE(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)
+END IF
+XZTOP  => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA
+!
 CALL FIND_FIELD_ID_FROM_MNHNAME('DXHAT',IID,IRESP); XDXHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA
 CALL FIND_FIELD_ID_FROM_MNHNAME('DYHAT',IID,IRESP); XDYHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA
 !
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 5fc10c2580f319cdedd65e570aa20f9aa402db6b..0a896fe3cd477132771dd11450fb937265ac243c 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -584,6 +584,7 @@ IKU=NKMAX+2*JPVEXT
 !
 ALLOCATE(XZHAT(IKU))
 CALL IO_READ_FIELD(TPINIFILE,'ZHAT',XZHAT)
+CALL IO_READ_FIELD(TPINIFILE,'ZTOP',XZTOP)
 IF (XALZBOT>=XZHAT(IKU) .AND. LVE_RELAX) THEN
   WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR: you want to use vertical relaxation"
   WRITE(ILUOUT,FMT=*) "                  but bottom of layer XALZBOT(",XALZBOT,")"
@@ -1563,7 +1564,7 @@ CALL SET_GRID(KMI,TPINIFILE,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll,               &
               XTSTEP,XSEGLEN,                                            &
               XLONORI,XLATORI,XLON,XLAT,                                 &
               XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP,                           &
-              XZS,XZZ,XZHAT,LSLEVE,XLEN1,XLEN2,XZSMT,                    &
+              XZS,XZZ,XZHAT,XZTOP,LSLEVE,XLEN1,XLEN2,XZSMT,              &
               ZJ,                                                        &
               TDTMOD,TDTCUR,NSTOP,NBAK_NUMB,NOUT_NUMB,TBACKUPN,TOUTPUTN)
 !
diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90
index 384d41ffa6d7acb244d48811d16d0b10569fa937..384f43ed65612064af202f8d310078611e33b0dd 100644
--- a/src/MNH/ini_spectren.f90
+++ b/src/MNH/ini_spectren.f90
@@ -224,6 +224,7 @@ IKU=NKMAX+2*JPVEXT
 !
 ALLOCATE(XZHAT(IKU))
 CALL IO_READ_FIELD(TPINIFILE,'ZHAT',XZHAT)
+CALL IO_READ_FIELD(TPINIFILE,'ZTOP',XZTOP)
 IF (XALZBOT>=XZHAT(IKU) .AND. LVE_RELAX) THEN
   WRITE(ILUOUT,FMT=*) "INI_SPECTRE_n ERROR: you want to use vertical relaxation"
   WRITE(ILUOUT,FMT=*) "                  but bottom of layer XALZBOT(",XALZBOT,")"
@@ -716,7 +717,7 @@ CALL SET_GRID(KMI,TPINIFILE,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll,               &
               XTSTEP,XSEGLEN,                                            &
               XLONORI,XLATORI,XLON,XLAT,                                 &
               XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP,                           &
-              XZS,XZZ,XZHAT,LSLEVE,XLEN1,XLEN2,XZSMT,                    &
+              XZS,XZZ,XZHAT,XZTOP,LSLEVE,XLEN1,XLEN2,XZSMT,              &
               ZJ,                                                        &
               TDTMOD,TDTCUR,NSTOP,NBAK_NUMB,NOUT_NUMB,TBACKUPN,TOUTPUTN)
 !
diff --git a/src/MNH/init_for_convlfi.f90 b/src/MNH/init_for_convlfi.f90
index c3d723b7498cf523b5534c58adce41bf2a85c2b3..2479f6880c402f5ef869300da0b128886d2254b8 100644
--- a/src/MNH/init_for_convlfi.f90
+++ b/src/MNH/init_for_convlfi.f90
@@ -235,6 +235,7 @@ IF (IRESP/=0) XZSMT(:,:)=XZS(:,:)
 !
 ALLOCATE(XZHAT(IKU))
 CALL IO_READ_FIELD(TPINIFILE,'ZHAT',XZHAT)
+CALL IO_READ_FIELD(TPINIFILE,'ZTOP',XZTOP)
 !
 CALL IO_READ_FIELD(TPINIFILE,'SLEVE',LSLEVE,IRESP)
 IF (IRESP/=0) LSLEVE = .FALSE.
diff --git a/src/MNH/mnh2lpdm_ini.f90 b/src/MNH/mnh2lpdm_ini.f90
index d91ef88d968ab641526ea723f1be87cfa8de9230..9852c2aa24620b3f93ba2608b031ab350b08eca4 100644
--- a/src/MNH/mnh2lpdm_ini.f90
+++ b/src/MNH/mnh2lpdm_ini.f90
@@ -197,6 +197,7 @@ ALLOCATE( XSFV(NIU,NJU))
 !*	2.6 Decoupage vertical.
 !
 CALL IO_READ_FIELD(TPFILE1,'ZHAT',XZHAT)
+CALL IO_READ_FIELD(TPFILE1,'ZTOP',XZTOP)
 !
 !*	2.7 Orographie. 
 !
diff --git a/src/MNH/modd_gridn.f90 b/src/MNH/modd_gridn.f90
index 68e03c97e19f9d42233d9c0780cb29fcba0ccdbc..75fd2f485e38b8796365db1534fa1f6202b823f2 100644
--- a/src/MNH/modd_gridn.f90
+++ b/src/MNH/modd_gridn.f90
@@ -56,6 +56,7 @@ REAL, DIMENSION(:),    POINTER :: XDYHAT=>NULL()            ! horizontal stretch
 REAL, DIMENSION(:,:),  POINTER :: XMAP=>NULL()              ! Map factor 
 REAL, DIMENSION(:,:),  POINTER :: XZS=>NULL()               ! orography
 REAL, DIMENSION(:,:,:),POINTER :: XZZ=>NULL()               ! height z 
+REAL,                  POINTER :: XZTOP=>NULL()             ! model top (m)
 REAL, DIMENSION(:),    POINTER :: XZHAT=>NULL()             ! height level without orography
 REAL, DIMENSION(:,:),  POINTER :: XDIRCOSXW=>NULL(),XDIRCOSYW=>NULL(),XDIRCOSZW=>NULL() ! director cosinus of the normal
                                                                                         ! to the ground surface
diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90
index 0bb587beb87a96e72da5ed5bb746edb19fc4f04e..2593caab7cebbbb89b65bb055893b2bdf31ee242 100644
--- a/src/MNH/read_ver_grid.f90
+++ b/src/MNH/read_ver_grid.f90
@@ -320,6 +320,9 @@ CASE DEFAULT
   CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_VER_GRID','')
 END SELECT
 !
+!Set model top
+XZTOP = XZHAT(IKU)
+!
 !-------------------------------------------------------------------------------
 !
 !*       5.    TEST ON STRETCHING :
diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90
index a9d5d2fca18976cb98c5a6b1e4c2eb47c12890fe..1e2d99424246b106b90dbe543d6f880dc0f49226 100644
--- a/src/MNH/set_grid.f90
+++ b/src/MNH/set_grid.f90
@@ -23,7 +23,7 @@ INTERFACE
                           PTSTEP,PSEGLEN,                                     &
                           PLONORI,PLATORI,PLON,PLAT,                          &
                           PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP,                    &
-                          PZS,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2,PZSMT,             &
+                          PZS,PZZ,PZHAT,PZTOP,OSLEVE,PLEN1,PLEN2,PZSMT,       &
                           PJ,                                                 &
                           TPDTMOD,TPDTCUR,KSTOP,                              &
                           KBAK_NUMB,KOUT_NUMB,TPBACKUPN,TPOUTPUTN             )
@@ -75,6 +75,7 @@ REAL, DIMENSION(:,:),   INTENT(OUT) :: PMAP      ! Map factor
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PZS       ! orography
 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PZZ       ! Height z
 REAL, DIMENSION(:),     INTENT(OUT) :: PZHAT     ! Height  level
+REAL,                   INTENT(OUT) :: PZTOP     ! Model top
 LOGICAL,                INTENT(OUT) :: OSLEVE    ! flag for SLEVE coordinate
 REAL,                   INTENT(OUT) :: PLEN1     ! Decay scale for smooth topography
 REAL,                   INTENT(OUT) :: PLEN2     ! Decay scale for small-scale topography deviation
@@ -112,7 +113,7 @@ END MODULE MODI_SET_GRID
                           PTSTEP,PSEGLEN,                                     &
                           PLONORI,PLATORI,PLON,PLAT,                          &
                           PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP,                    &
-                          PZS,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2,PZSMT,             &
+                          PZS,PZZ,PZHAT,PZTOP,OSLEVE,PLEN1,PLEN2,PZSMT,       &
                           PJ,                                                 &
                           TPDTMOD,TPDTCUR,KSTOP,                              &
                           KBAK_NUMB,KOUT_NUMB,TPBACKUPN,TPOUTPUTN             )
@@ -304,6 +305,7 @@ REAL, DIMENSION(:,:),   INTENT(OUT) :: PMAP      ! Map factor
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PZS       ! orography
 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PZZ       ! Height z
 REAL, DIMENSION(:),     INTENT(OUT) :: PZHAT     ! Height  level
+REAL,                   INTENT(OUT) :: PZTOP     ! Model top
 LOGICAL,                INTENT(OUT) :: OSLEVE    ! flag for SLEVE coordinate
 REAL,                   INTENT(OUT) :: PLEN1     ! Decay scale for smooth topography
 REAL,                   INTENT(OUT) :: PLEN2     ! Decay scale for small-scale topography deviation
@@ -401,6 +403,7 @@ END IF
 
 CALL IO_READ_FIELD(TPINIFILE,'ZS',PZS)
 CALL IO_READ_FIELD(TPINIFILE,'ZHAT',PZHAT)
+CALL IO_READ_FIELD(TPINIFILE,'ZTOP',PZTOP)
 !
 CALL DEFAULT_SLEVE(OSLEVE,PLEN1,PLEN2)
 !
diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90
index 24bdb779f5a2b313076d478b61b405b5c89916a2..25cd9b3f5b156b8688379882349ae1507f79abc4 100644
--- a/src/MNH/write_lfifm1_for_diag.f90
+++ b/src/MNH/write_lfifm1_for_diag.f90
@@ -428,6 +428,7 @@ CALL IO_WRITE_FIELD(TPFILE,'BETA',XBETA)
 CALL IO_WRITE_FIELD(TPFILE,'XHAT',XXHAT)
 CALL IO_WRITE_FIELD(TPFILE,'YHAT',XYHAT)
 CALL IO_WRITE_FIELD(TPFILE,'ZHAT',XZHAT)
+CALL IO_WRITE_FIELD(TPFILE,'ZTOP',XZTOP)
 !
 CALL IO_WRITE_FIELD(TPFILE,'ZS',   XZS)
 CALL IO_WRITE_FIELD(TPFILE,'ZSMT', XZSMT)
diff --git a/src/MNH/write_lfifmn_fordiachron.f90 b/src/MNH/write_lfifmn_fordiachron.f90
index b40493e3fc00ec90904acf2aeea6ce106f726d03..d152d850d364a977de8f594ccc6311417ca7a10a 100644
--- a/src/MNH/write_lfifmn_fordiachron.f90
+++ b/src/MNH/write_lfifmn_fordiachron.f90
@@ -202,6 +202,7 @@ CALL IO_WRITE_FIELD(TPFILE,'BETA',XBETA)
 CALL IO_WRITE_FIELD(TPFILE,'XHAT',XXHAT)
 CALL IO_WRITE_FIELD(TPFILE,'YHAT',XYHAT)
 CALL IO_WRITE_FIELD(TPFILE,'ZHAT',XZHAT)
+CALL IO_WRITE_FIELD(TPFILE,'ZTOP',XZTOP)
 !
 CALL IO_WRITE_FIELD(TPFILE,'ZS',   XZS)
 CALL IO_WRITE_FIELD(TPFILE,'ZSMT', XZSMT)
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index 04e74197343343c39de925bdf7370be4eb3f5119..3bbbacb6aa89255a67dd572d2ef584ddeff8387e 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -396,6 +396,7 @@ CALL IO_WRITE_FIELD(TPFILE,'BETA',XBETA)
 CALL IO_WRITE_FIELD(TPFILE,'XHAT',XXHAT)
 CALL IO_WRITE_FIELD(TPFILE,'YHAT',XYHAT)
 CALL IO_WRITE_FIELD(TPFILE,'ZHAT',XZHAT)
+CALL IO_WRITE_FIELD(TPFILE,'ZTOP',XZTOP)
 !
 ! #ifdef MNH_NCWRIT
 ! !