diff --git a/src/MNH/mode_mnh_zwork.f90 b/src/MNH/mode_mnh_zwork.f90
index 2cb5509b4d3bb6852d05c5ff724882868c4ad266..d9046e79db2a59a560913611f2b6a2850a94d0c2 100644
--- a/src/MNH/mode_mnh_zwork.f90
+++ b/src/MNH/mode_mnh_zwork.f90
@@ -102,6 +102,30 @@ MODULE MODE_MNH_ZWORK
   INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_GT3DFLAT     = 0 !Sum of all requested sizes in MNH_ALLOCATE_ZT3DFLAT
 
 
+  !------ Integer 1DFLAT pool
+  INTEGER, PARAMETER                                 :: JPMAX_T1DFLAT_I = 10       !Used to determine max size of buffer IT1DFLAT
+                                                                                   !(3D size of the mesh * JPMAX_T1DFLAT_I)
+  INTEGER,                SAVE                       :: NPMAX_POOL_T1DFLAT_I = 100 !Maximum size of the pool (max number of arrays)
+  INTEGER(KIND=MNHINT64), ALLOCATABLE, DIMENSION (:) :: NT1DFLAT_POOL_I   !Position in ZT1DFLAT of the beginning of each array
+  INTEGER(KIND=MNHINT64), ALLOCATABLE, DIMENSION (:) :: NT1DFLAT_SIZE_I   !Size of each array
+  INTEGER(KIND=MNHINT64), SAVE                       :: NT1DFLAT_MAXSIZE_I                      !Total allocated size of ZT1DFLAT
+  INTEGER,                SAVE                       :: NT1DFLAT_TOP_I, NT1DFLAT_TOP_I_MAX = 0  !Position in the pool
+  INTEGER(KIND=MNHINT64), SAVE                       :: NT1DFLAT_POS_I, NT1DFLAT_POS_I_MAX = 0  !Position in the array
+  INTEGER, SAVE, ALLOCATABLE, TARGET, DIMENSION(:)   :: IT1DFLAT
+
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_GET_IT1DFLAT      = 0
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_REL_IT1DFLAT      = 0
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_ALLOCATE_IT1DFLAT = 0
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_ALLOCATE_IT2DFLAT = 0
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_ALLOCATE_IT3DFLAT = 0
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_GETSIZE_IT1DFLAT       = 0 !Sum of all requested sizes in MNH_REL_IT1DFLAT
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_GETSIZE_IT2DFLAT       = 0 !Sum of all requested sizes in MNH_REL_IT2DFLAT
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_RELSIZE_IT1DFLAT       = 0 !Sum of all released sizes in MNH_REL_IT1DFLAT
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_IT1DFLAT     = 0 !Sum of all requested sizes in MNH_ALLOCATE_IT1DFLAT
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_IT2DFLAT     = 0 !Sum of all requested sizes in MNH_ALLOCATE_IT2DFLAT
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_IT3DFLAT     = 0 !Sum of all requested sizes in MNH_ALLOCATE_IT3DFLAT
+
+
 !------ Real 1DFLAT pool
   INTEGER, PARAMETER                                 :: JPMAX_T1DFLAT_R = 60       !Used to determine max size of buffer ZT1DFLAT
                                                                                    !(3D size of the mesh * JPMAX_T1DFLAT_R)
@@ -132,6 +156,10 @@ MODULE MODE_MNH_ZWORK
     MODULE PROCEDURE :: MNH_ALLOCATE_GT1DFLAT_INT64
     MODULE PROCEDURE :: MNH_ALLOCATE_GT2DFLAT
     MODULE PROCEDURE :: MNH_ALLOCATE_GT3DFLAT
+    MODULE PROCEDURE :: MNH_ALLOCATE_IT1DFLAT_INT32
+    MODULE PROCEDURE :: MNH_ALLOCATE_IT1DFLAT_INT64
+    MODULE PROCEDURE :: MNH_ALLOCATE_IT2DFLAT
+    MODULE PROCEDURE :: MNH_ALLOCATE_IT3DFLAT
     MODULE PROCEDURE :: MNH_ALLOCATE_ZT1DFLAT_INT32
     MODULE PROCEDURE :: MNH_ALLOCATE_ZT1DFLAT_INT64
     MODULE PROCEDURE :: MNH_ALLOCATE_ZT2DFLAT
@@ -275,6 +303,18 @@ CONTAINS
        NT1DFLAT_SIZE_G(:) = NNEGUNDEF
        NT1DFLAT_TOP_G = 0
 
+!------ Integer 1DFLAT pool
+
+       NT1DFLAT_MAXSIZE_I = INT( IIU, KIND=MNHINT64 ) * IJU * IKU * JPMAX_T1DFLAT_I
+       ALLOCATE( IT1DFLAT(NT1DFLAT_MAXSIZE_I) )
+       !$acc enter data create( IT1DFLAT )
+
+       ALLOCATE( NT1DFLAT_POOL_I(NPMAX_POOL_T1DFLAT_I) )
+       ALLOCATE( NT1DFLAT_SIZE_I(NPMAX_POOL_T1DFLAT_I) )
+       NT1DFLAT_POOL_I(:) = NNEGUNDEF
+       NT1DFLAT_SIZE_I(:) = NNEGUNDEF
+       NT1DFLAT_TOP_I = 0
+
 !------ Real 1DFLAT pool
 
        NT1DFLAT_MAXSIZE_R = INT( IIU, KIND=MNHINT64 ) * IJU * IKU * JPMAX_T1DFLAT_R
@@ -1225,6 +1265,184 @@ CONTAINS
   ! End Logical 1DFLAT management
 
 
+  !-------- Integer 1DFLAT Pool Managment
+
+  FUNCTION MNH_GET_IT1DFLAT( KSIZE ) RESULT( KINDEX )
+
+    USE MODD_PARAMETERS, ONLY: NNEGUNDEF
+
+    IMPLICIT NONE
+
+    INTEGER(KIND=MNHINT64), INTENT(IN)  :: KSIZE
+    INTEGER                             :: KINDEX
+
+    CHARACTER(LEN=32) :: YAVAIL, YMAX, YSIZE
+    INTEGER(KIND=MNHINT64), ALLOCATABLE, DIMENSION (:) :: IT1DFLAT_POOL_I
+    INTEGER(KIND=MNHINT64), ALLOCATABLE, DIMENSION (:) :: IT1DFLAT_SIZE_I
+
+    NCALL_MNH_GET_IT1DFLAT = NCALL_MNH_GET_IT1DFLAT + 1
+    NTOT_GETSIZE_IT1DFLAT  = NTOT_GETSIZE_IT1DFLAT + KSIZE
+
+    IF ( NT1DFLAT_POS_I + KSIZE > NT1DFLAT_MAXSIZE_I ) THEN
+      WRITE( YSIZE,  '( I0 )' ) KSIZE
+      WRITE( YAVAIL, '( I0 )' ) NT1DFLAT_MAXSIZE_I - NT1DFLAT_POS_I
+      WRITE( YMAX,   '( I0 )' ) NT1DFLAT_MAXSIZE_I
+      call Print_msg( NVERB_FATAL, 'GEN', 'MNH_GET_IT1DFLAT', 'IT1DFLAT too small (asked=' // Trim( ysize ) // &
+                      ', available=' // Trim( yavail ) // ', total=' // Trim( ymax ) // ')' )
+    ELSE
+      NT1DFLAT_TOP_I = NT1DFLAT_TOP_I + 1
+      KINDEX = NT1DFLAT_TOP_I
+
+      IF ( KINDEX > NPMAX_POOL_T1DFLAT_I ) THEN
+        WRITE( YSIZE,  '( I0 )' ) NPMAX_POOL_T1DFLAT_I
+        WRITE( YMAX,   '( I0 )' ) NPMAX_POOL_T1DFLAT_I+JPPOOLSTEP_FLAT
+        call Print_msg( NVERB_INFO, 'GEN', 'MNH_GET_IT1DFLAT', 'pool for IT1DFLAT was too small (' // TRIM( YSIZE ) &
+                        // '->' // TRIM( YMAX ) // ')' )
+
+        ALLOCATE( IT1DFLAT_POOL_I(NPMAX_POOL_T1DFLAT_I+JPPOOLSTEP_FLAT) )
+        ALLOCATE( IT1DFLAT_SIZE_I(NPMAX_POOL_T1DFLAT_I+JPPOOLSTEP_FLAT) )
+
+        IT1DFLAT_POOL_I(1:NPMAX_POOL_T1DFLAT_I) = NT1DFLAT_POOL_I(:)
+        IT1DFLAT_SIZE_I(1:NPMAX_POOL_T1DFLAT_I) = NT1DFLAT_SIZE_I(:)
+        IT1DFLAT_POOL_I(NPMAX_POOL_T1DFLAT_I+1:) = NNEGUNDEF
+        IT1DFLAT_SIZE_I(NPMAX_POOL_T1DFLAT_I+1:) = NNEGUNDEF
+
+        CALL MOVE_ALLOC( FROM = IT1DFLAT_POOL_I, TO = NT1DFLAT_POOL_I )
+        CALL MOVE_ALLOC( FROM = IT1DFLAT_SIZE_I, TO = NT1DFLAT_SIZE_I )
+
+        NPMAX_POOL_T1DFLAT_I = NPMAX_POOL_T1DFLAT_I + JPPOOLSTEP_FLAT
+      END IF
+
+      NT1DFLAT_POOL_I( KINDEX ) = NT1DFLAT_POS_I + 1
+      NT1DFLAT_SIZE_I( KINDEX ) = KSIZE
+
+      NT1DFLAT_POS_I = NT1DFLAT_POS_I + KSIZE
+
+      IF ( NT1DFLAT_TOP_I > NT1DFLAT_TOP_I_MAX ) NT1DFLAT_TOP_I_MAX = NT1DFLAT_TOP_I
+      IF ( NT1DFLAT_POS_I > NT1DFLAT_POS_I_MAX ) NT1DFLAT_POS_I_MAX = NT1DFLAT_POS_I
+    END IF
+
+  END FUNCTION MNH_GET_IT1DFLAT
+
+
+  SUBROUTINE MNH_REL_IT1DFLAT( KINDEX )
+
+    USE MODD_PARAMETERS, ONLY: NNEGUNDEF
+
+    IMPLICIT NONE
+
+    INTEGER :: KINDEX
+
+    NCALL_MNH_REL_IT1DFLAT = NCALL_MNH_REL_IT1DFLAT + 1
+
+    !Release only if last block
+    IF ( KINDEX /= NT1DFLAT_TOP_I ) &
+      call Print_msg( NVERB_FATAL, 'GEN', 'MNH_REL_IT1DFLAT', 'trying to release block that is not the last one' )
+
+    NTOT_RELSIZE_IT1DFLAT = NTOT_RELSIZE_IT1DFLAT + NT1DFLAT_SIZE_I( KINDEX )
+
+    NT1DFLAT_TOP_I = NT1DFLAT_TOP_I - 1
+    NT1DFLAT_POS_I = NT1DFLAT_POS_I - NT1DFLAT_SIZE_I( KINDEX )
+
+    NT1DFLAT_POOL_I( KINDEX ) = NNEGUNDEF
+    NT1DFLAT_SIZE_I( KINDEX ) = NNEGUNDEF
+
+  END SUBROUTINE MNH_REL_IT1DFLAT
+
+
+  FUNCTION MNH_ALLOCATE_IT1DFLAT_INT32( KTAB, KSIZE ) RESULT( KINDEX )
+
+    INTEGER, POINTER, CONTIGUOUS , DIMENSION(:), INTENT(INOUT) :: KTAB
+    INTEGER(KIND=MNHINT32),                      INTENT(IN)    :: KSIZE
+    INTEGER                                                    :: KINDEX
+
+    kindex = MNH_Allocate_it1dflat_int64( ktab, Int( ksize, kind = MNHINT64 ) )
+
+  END FUNCTION MNH_ALLOCATE_IT1DFLAT_INT32
+
+
+  FUNCTION MNH_ALLOCATE_IT1DFLAT_INT64( KTAB, KSIZE ) RESULT( KINDEX )
+
+    INTEGER, POINTER, CONTIGUOUS , DIMENSION(:), INTENT(INOUT) :: KTAB
+    INTEGER(KIND=MNHINT64),                      INTENT(IN)    :: KSIZE
+    INTEGER                                                    :: KINDEX
+
+    NCALL_MNH_ALLOCATE_IT1DFLAT = NCALL_MNH_ALLOCATE_IT1DFLAT + 1
+    NTOT_ALLOCSIZE_IT1DFLAT     = NTOT_ALLOCSIZE_IT1DFLAT + KSIZE
+
+    kindex = MNH_Get_it1dflat( ksize )
+    ktab(1:KSIZE) => it1dflat( NT1DFLAT_POOL_I(kindex) : NT1DFLAT_POOL_I(kindex)+ksize-1 )
+
+  END FUNCTION MNH_ALLOCATE_IT1DFLAT_INT64
+
+
+  FUNCTION MNH_ALLOCATE_IT2DFLAT( KTAB, KIB, KIE, KJB, KJE ) RESULT ( KINDEX )
+
+    INTEGER, POINTER, CONTIGUOUS , DIMENSION(:,:), INTENT(INOUT) :: KTAB
+    INTEGER,                                       INTENT(IN)    :: KIB
+    INTEGER,                                       INTENT(IN)    :: KIE
+    INTEGER,                                       INTENT(IN)    :: KJB
+    INTEGER,                                       INTENT(IN)    :: KJE
+    INTEGER                                                      :: KINDEX
+
+    INTEGER(KIND=MNHINT64) :: ISIZE
+    INTEGER(KIND=MNHINT64) :: IIB, IIE, IJB, IJE
+
+    NCALL_MNH_ALLOCATE_IT2DFLAT = NCALL_MNH_ALLOCATE_IT2DFLAT + 1
+
+    IIB = KIB
+    IIE = KIE
+    IJB = KJB
+    IJE = KJE
+
+    ISIZE = ( IIE - IIB + 1_MNHINT64 ) * ( IJE - IJB + 1_MNHINT64 )
+
+    NTOT_ALLOCSIZE_IT2DFLAT = NTOT_ALLOCSIZE_IT2DFLAT + ISIZE
+
+    kindex = MNH_Get_it1dflat( isize )
+
+    ktab(KIB:KIE, KJB:KJE) => it1dflat( NT1DFLAT_POOL_I(kindex) : NT1DFLAT_POOL_I(kindex)+isize-1 )
+
+  END FUNCTION MNH_ALLOCATE_IT2DFLAT
+
+
+  FUNCTION MNH_ALLOCATE_IT3DFLAT( KTAB, KIB, KIE, KJB, KJE, KKB, KKE ) RESULT ( KINDEX )
+
+    INTEGER, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: KTAB
+    INTEGER,                                         INTENT(IN)    :: KIB
+    INTEGER,                                         INTENT(IN)    :: KIE
+    INTEGER,                                         INTENT(IN)    :: KJB
+    INTEGER,                                         INTENT(IN)    :: KJE
+    INTEGER,                                         INTENT(IN)    :: KKB
+    INTEGER,                                         INTENT(IN)    :: KKE
+    INTEGER                                                        :: KINDEX
+
+    INTEGER(KIND=MNHINT64) :: ISIZE
+    INTEGER(KIND=MNHINT64) :: IIB, IIE, IJB, IJE, IKB, IKE
+
+    NCALL_MNH_ALLOCATE_IT3DFLAT = NCALL_MNH_ALLOCATE_IT3DFLAT + 1
+
+    IIB = KIB
+    IIE = KIE
+    IJB = KJB
+    IJE = KJE
+    IKB = KKB
+    IKE = KKE
+
+    ISIZE = ( IIE - IIB + 1_MNHINT64 ) * ( IJE - IJB + 1_MNHINT64 ) * ( IKE - IKB + 1_MNHINT64 )
+
+    NTOT_ALLOCSIZE_IT3DFLAT = NTOT_ALLOCSIZE_IT3DFLAT + ISIZE
+
+    kindex = MNH_Get_it1dflat( isize )
+
+    ktab(KIB:KIE, KJB:KJE, KKB:KKE) => it1dflat( NT1DFLAT_POOL_I(kindex) : NT1DFLAT_POOL_I(kindex)+isize-1 )
+
+  END FUNCTION MNH_ALLOCATE_IT3DFLAT
+
+
+  ! End Integer 1DFLAT management
+
+
   !-------- Real 1DFLAT Pool Managment
 
   FUNCTION MNH_GET_ZT1DFLAT( KSIZE ) RESULT( KINDEX )
@@ -1467,6 +1685,30 @@ CONTAINS
     call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' )
 
 
+    cmnhmsg(1) = 'INTEGER flat pool: Number of calls:'
+    Write( cmnhmsg(2), "( '  MNH_GET_IT1DFLAT        = ', I20 )" ) NCALL_MNH_GET_IT1DFLAT
+    Write( cmnhmsg(3), "( '    MNH_ALLOCATE_IT1DFLAT = ', I20 )" ) NCALL_MNH_ALLOCATE_IT1DFLAT
+    Write( cmnhmsg(4), "( '    MNH_ALLOCATE_IT2DFLAT = ', I20 )" ) NCALL_MNH_ALLOCATE_IT2DFLAT
+    Write( cmnhmsg(5), "( '    MNH_ALLOCATE_IT3DFLAT = ', I20 )" ) NCALL_MNH_ALLOCATE_IT3DFLAT
+    Write( cmnhmsg(6), "( '  MNH_REL_IT1DFLAT        = ', I20 )" ) NCALL_MNH_REL_IT1DFLAT
+    call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' )
+
+    cmnhmsg(1) = 'INTEGER flat pool: Maximum sizes:'
+    Write( cmnhmsg(2), "( '  Entries (current / max used / max avail) = ', I10, '/', I10, '/', I10, &
+            ' (max is automatically increased if necessary)' )" ) NT1DFLAT_TOP_I, NT1DFLAT_TOP_I_MAX, NPMAX_POOL_T1DFLAT_I
+    Write( cmnhmsg(3), "( '  Memory  (current / max used / max avail) = ', I20, '/', I20, '/', I20 )" ) &
+           NT1DFLAT_POS_I, NT1DFLAT_POS_I_MAX, NT1DFLAT_MAXSIZE_I
+    call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' )
+
+    cmnhmsg(1) = 'INTEGER flat pool: Total provided and released sizes (in bytes):'
+    Write( cmnhmsg(2), "( '  Provided = ', I20 )" ) NTOT_GETSIZE_IT1DFLAT
+    Write( cmnhmsg(3), "( '    1D     = ', I20 )" ) NTOT_ALLOCSIZE_IT1DFLAT
+    Write( cmnhmsg(4), "( '    2D     = ', I20 )" ) NTOT_ALLOCSIZE_IT2DFLAT
+    Write( cmnhmsg(5), "( '    3D     = ', I20 )" ) NTOT_ALLOCSIZE_IT3DFLAT
+    Write( cmnhmsg(6), "( '  Released = ', I20 )" ) NTOT_RELSIZE_IT1DFLAT
+    call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' )
+
+
     cmnhmsg(1) = 'REAL flat pool: Number of calls:'
     Write( cmnhmsg(2), "( '  MNH_GET_ZT1DFLAT        = ', I20 )" ) NCALL_MNH_GET_ZT1DFLAT
     Write( cmnhmsg(3), "( '    MNH_ALLOCATE_ZT1DFLAT = ', I20 )" ) NCALL_MNH_ALLOCATE_ZT1DFLAT