diff --git a/src/MNH/mode_mnh_zwork.f90 b/src/MNH/mode_mnh_zwork.f90
index e1d826d1de6a04d14b08fc0c68d1b44b431e693f..8bcc98143e064b910a26f3b392f14edd2aa21acd 100644
--- a/src/MNH/mode_mnh_zwork.f90
+++ b/src/MNH/mode_mnh_zwork.f90
@@ -7,6 +7,7 @@
 ! Modifications:
 !  P. Wautelet 10/07/2019: bugfix: MNH_REL_ZT3D_N0: access outside of array was possible
 !  P. Wautelet 20/10/2021: create ZT1DFLAT buffer that can be used for any size and shape arrays (real)
+!  P. Wautelet 31/01/2022: add new functionalities for integers, logicals and real flat pools
 !-----------------------------------------------------------------
 MODULE MODE_MNH_ZWORK
 
@@ -96,10 +97,10 @@ MODULE MODE_MNH_ZWORK
   INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_ALLOCATE_GT3DFLAT = 0
   INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_GETSIZE_GT1DFLAT       = 0 !Sum of all requested sizes in MNH_REL_GT1DFLAT
   INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_GETSIZE_GT2DFLAT       = 0 !Sum of all requested sizes in MNH_REL_GT2DFLAT
-  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_RELSIZE_GT1DFLAT       = 0 !Sum of all released sizes in MNH_REL_ZT1DFLAT
-  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_GT1DFLAT     = 0 !Sum of all requested sizes in MNH_ALLOCATE_ZT1DFLAT
-  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_GT2DFLAT     = 0 !Sum of all requested sizes in MNH_ALLOCATE_ZT1DFLAT
-  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_GT3DFLAT     = 0 !Sum of all requested sizes in MNH_ALLOCATE_ZT3DFLAT
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_RELSIZE_GT1DFLAT       = 0 !Sum of all released sizes in MNH_REL_GT1DFLAT
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_GT1DFLAT     = 0 !Sum of all requested sizes in MNH_ALLOCATE_GT1DFLAT
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_GT2DFLAT     = 0 !Sum of all requested sizes in MNH_ALLOCATE_GT2DFLAT
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_GT3DFLAT     = 0 !Sum of all requested sizes in MNH_ALLOCATE_GT3DFLAT
 
 
   !------ Integer 1DFLAT pool
@@ -155,16 +156,23 @@ MODULE MODE_MNH_ZWORK
     MODULE PROCEDURE :: MNH_ALLOCATE_GT1DFLAT_INT32
     MODULE PROCEDURE :: MNH_ALLOCATE_GT1DFLAT_INT64
     MODULE PROCEDURE :: MNH_ALLOCATE_GT2DFLAT
+    MODULE PROCEDURE :: MNH_ALLOCATE_GT2DFLAT_SIZE
     MODULE PROCEDURE :: MNH_ALLOCATE_GT3DFLAT
+    MODULE PROCEDURE :: MNH_ALLOCATE_GT3DFLAT_SIZE
     MODULE PROCEDURE :: MNH_ALLOCATE_IT1DFLAT_INT32
     MODULE PROCEDURE :: MNH_ALLOCATE_IT1DFLAT_INT64
     MODULE PROCEDURE :: MNH_ALLOCATE_IT2DFLAT
+    MODULE PROCEDURE :: MNH_ALLOCATE_IT2DFLAT_SIZE
     MODULE PROCEDURE :: MNH_ALLOCATE_IT3DFLAT
+    MODULE PROCEDURE :: MNH_ALLOCATE_IT3DFLAT_SIZE
     MODULE PROCEDURE :: MNH_ALLOCATE_ZT1DFLAT_INT32
     MODULE PROCEDURE :: MNH_ALLOCATE_ZT1DFLAT_INT64
     MODULE PROCEDURE :: MNH_ALLOCATE_ZT2DFLAT
+    MODULE PROCEDURE :: MNH_ALLOCATE_ZT2DFLAT_SIZE
     MODULE PROCEDURE :: MNH_ALLOCATE_ZT3DFLAT
+    MODULE PROCEDURE :: MNH_ALLOCATE_ZT3DFLAT_SIZE
     MODULE PROCEDURE :: MNH_ALLOCATE_ZT4DFLAT
+    MODULE PROCEDURE :: MNH_ALLOCATE_ZT4DFLAT_SIZE
   END INTERFACE MNH_ALLOCATE_FLAT
 
   INTERFACE MNH_RELEASE_FLAT
@@ -1173,20 +1181,20 @@ CONTAINS
   END SUBROUTINE MNH_REL_GT1DFLAT
 
 
-  FUNCTION MNH_ALLOCATE_GT1DFLAT_INT32( PTAB, KSIZE ) RESULT( KINDEX )
+  FUNCTION MNH_ALLOCATE_GT1DFLAT_INT32( OTAB, KSIZE ) RESULT( KINDEX )
 
-    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:), INTENT(INOUT) :: PTAB
+    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:), INTENT(INOUT) :: OTAB
     INTEGER(KIND=MNHINT32),                      INTENT(IN)    :: KSIZE
     INTEGER                                                    :: KINDEX
 
-    kindex = MNH_Allocate_gt1dflat_int64( ptab, Int( ksize, kind = MNHINT64 ) )
+    kindex = MNH_Allocate_gt1dflat_int64( otab, Int( ksize, kind = MNHINT64 ) )
 
   END FUNCTION MNH_ALLOCATE_GT1DFLAT_INT32
 
 
-  FUNCTION MNH_ALLOCATE_GT1DFLAT_INT64( PTAB, KSIZE ) RESULT( KINDEX )
+  FUNCTION MNH_ALLOCATE_GT1DFLAT_INT64( OTAB, KSIZE ) RESULT( KINDEX )
 
-    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:), INTENT(INOUT) :: PTAB
+    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:), INTENT(INOUT) :: OTAB
     INTEGER(KIND=MNHINT64),                      INTENT(IN)    :: KSIZE
     INTEGER                                                    :: KINDEX
 
@@ -1194,14 +1202,14 @@ CONTAINS
     NTOT_ALLOCSIZE_GT1DFLAT     = NTOT_ALLOCSIZE_GT1DFLAT + KSIZE
 
     kindex = MNH_Get_gt1dflat( ksize )
-    ptab(1:KSIZE) => gt1dflat( NT1DFLAT_POOL_G(kindex) : NT1DFLAT_POOL_G(kindex)+ksize-1 )
+    otab(1:KSIZE) => gt1dflat( NT1DFLAT_POOL_G(kindex) : NT1DFLAT_POOL_G(kindex)+ksize-1 )
 
   END FUNCTION MNH_ALLOCATE_GT1DFLAT_INT64
 
 
-  FUNCTION MNH_ALLOCATE_GT2DFLAT( PTAB, KIB, KIE, KJB, KJE ) RESULT ( KINDEX )
+  FUNCTION MNH_ALLOCATE_GT2DFLAT( OTAB, KIB, KIE, KJB, KJE ) RESULT ( KINDEX )
 
-    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:), INTENT(INOUT) :: PTAB
+    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:), INTENT(INOUT) :: OTAB
     INTEGER,                                       INTENT(IN)    :: KIB
     INTEGER,                                       INTENT(IN)    :: KIE
     INTEGER,                                       INTENT(IN)    :: KJB
@@ -1224,14 +1232,26 @@ CONTAINS
 
     kindex = MNH_Get_gt1dflat( isize )
 
-    ptab(KIB:KIE, KJB:KJE) => gt1dflat( NT1DFLAT_POOL_G(kindex) : NT1DFLAT_POOL_G(kindex)+isize-1 )
+    otab(KIB:KIE, KJB:KJE) => gt1dflat( NT1DFLAT_POOL_G(kindex) : NT1DFLAT_POOL_G(kindex)+isize-1 )
 
   END FUNCTION MNH_ALLOCATE_GT2DFLAT
 
 
-  FUNCTION MNH_ALLOCATE_GT3DFLAT( PTAB, KIB, KIE, KJB, KJE, KKB, KKE ) RESULT ( KINDEX )
+  FUNCTION MNH_ALLOCATE_GT2DFLAT_SIZE( OTAB, KISIZE, KJSIZE ) RESULT ( KINDEX )
 
-    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: PTAB
+    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:), INTENT(INOUT) :: OTAB
+    INTEGER,                                       INTENT(IN)    :: KISIZE
+    INTEGER,                                       INTENT(IN)    :: KJSIZE
+    INTEGER                                                      :: KINDEX
+
+    KINDEX = MNH_ALLOCATE_GT2DFLAT( OTAB, 1, KISIZE, 1, KJSIZE )
+
+  END FUNCTION MNH_ALLOCATE_GT2DFLAT_SIZE
+
+
+  FUNCTION MNH_ALLOCATE_GT3DFLAT( OTAB, KIB, KIE, KJB, KJE, KKB, KKE ) RESULT ( KINDEX )
+
+    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: OTAB
     INTEGER,                                         INTENT(IN)    :: KIB
     INTEGER,                                         INTENT(IN)    :: KIE
     INTEGER,                                         INTENT(IN)    :: KJB
@@ -1258,11 +1278,24 @@ CONTAINS
 
     kindex = MNH_Get_gt1dflat( isize )
 
-    ptab(KIB:KIE, KJB:KJE, KKB:KKE) => gt1dflat( NT1DFLAT_POOL_G(kindex) : NT1DFLAT_POOL_G(kindex)+isize-1 )
+    otab(KIB:KIE, KJB:KJE, KKB:KKE) => gt1dflat( NT1DFLAT_POOL_G(kindex) : NT1DFLAT_POOL_G(kindex)+isize-1 )
 
   END FUNCTION MNH_ALLOCATE_GT3DFLAT
 
 
+  FUNCTION MNH_ALLOCATE_GT3DFLAT_SIZE( OTAB, KISIZE, KJSIZE, KKSIZE ) RESULT ( KINDEX )
+
+    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: OTAB
+    INTEGER,                                         INTENT(IN)    :: KISIZE
+    INTEGER,                                         INTENT(IN)    :: KJSIZE
+    INTEGER,                                         INTENT(IN)    :: KKSIZE
+    INTEGER                                                      :: KINDEX
+
+    KINDEX = MNH_ALLOCATE_GT3DFLAT( OTAB, 1, KISIZE, 1, KJSIZE, 1, KKSIZE )
+
+  END FUNCTION MNH_ALLOCATE_GT3DFLAT_SIZE
+
+
   ! End Logical 1DFLAT management
 
 
@@ -1407,6 +1440,18 @@ CONTAINS
   END FUNCTION MNH_ALLOCATE_IT2DFLAT
 
 
+  FUNCTION MNH_ALLOCATE_IT2DFLAT_SIZE( KTAB, KISIZE, KJSIZE ) RESULT ( KINDEX )
+
+    INTEGER, POINTER, CONTIGUOUS , DIMENSION(:,:), INTENT(INOUT) :: KTAB
+    INTEGER,                                       INTENT(IN)    :: KISIZE
+    INTEGER,                                       INTENT(IN)    :: KJSIZE
+    INTEGER                                                      :: KINDEX
+
+    KINDEX = MNH_ALLOCATE_IT2DFLAT( KTAB, 1, KISIZE, 1, KJSIZE )
+
+  END FUNCTION MNH_ALLOCATE_IT2DFLAT_SIZE
+
+
   FUNCTION MNH_ALLOCATE_IT3DFLAT( KTAB, KIB, KIE, KJB, KJE, KKB, KKE ) RESULT ( KINDEX )
 
     INTEGER, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: KTAB
@@ -1441,6 +1486,19 @@ CONTAINS
   END FUNCTION MNH_ALLOCATE_IT3DFLAT
 
 
+  FUNCTION MNH_ALLOCATE_IT3DFLAT_SIZE( KTAB, KISIZE, KJSIZE, KKSIZE ) RESULT ( KINDEX )
+
+    INTEGER, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: KTAB
+    INTEGER,                                         INTENT(IN)    :: KISIZE
+    INTEGER,                                         INTENT(IN)    :: KJSIZE
+    INTEGER,                                         INTENT(IN)    :: KKSIZE
+    INTEGER                                                        :: KINDEX
+
+    KINDEX = MNH_ALLOCATE_IT3DFLAT( KTAB, 1, KISIZE, 1, KJSIZE, 1, KKSIZE )
+
+  END FUNCTION MNH_ALLOCATE_IT3DFLAT_SIZE
+
+
   ! End Integer 1DFLAT management
 
 
@@ -1619,6 +1677,18 @@ CONTAINS
   END FUNCTION MNH_ALLOCATE_ZT2DFLAT
 
 
+  FUNCTION MNH_ALLOCATE_ZT2DFLAT_SIZE( PTAB, KISIZE, KJSIZE ) RESULT ( KINDEX )
+
+    REAL, POINTER, CONTIGUOUS , DIMENSION(:,:), INTENT(INOUT) :: PTAB
+    INTEGER,                                    INTENT(IN)    :: KISIZE
+    INTEGER,                                    INTENT(IN)    :: KJSIZE
+    INTEGER                                                   :: KINDEX
+
+    KINDEX = MNH_ALLOCATE_ZT2DFLAT( PTAB, 1, KISIZE, 1, KJSIZE )
+
+  END FUNCTION MNH_ALLOCATE_ZT2DFLAT_SIZE
+
+
   FUNCTION MNH_ALLOCATE_ZT3DFLAT( PTAB, KIB, KIE, KJB, KJE, KKB, KKE ) RESULT ( KINDEX )
 
     REAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: PTAB
@@ -1653,6 +1723,19 @@ CONTAINS
   END FUNCTION MNH_ALLOCATE_ZT3DFLAT
 
 
+  FUNCTION MNH_ALLOCATE_ZT3DFLAT_SIZE( PTAB, KISIZE, KJSIZE, KKSIZE ) RESULT ( KINDEX )
+
+    REAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: PTAB
+    INTEGER,                                      INTENT(IN)    :: KISIZE
+    INTEGER,                                      INTENT(IN)    :: KJSIZE
+    INTEGER,                                      INTENT(IN)    :: KKSIZE
+    INTEGER                                                     :: KINDEX
+
+    KINDEX = MNH_ALLOCATE_ZT3DFLAT( PTAB, 1, KISIZE, 1, KJSIZE, 1, KKSIZE )
+
+  END FUNCTION MNH_ALLOCATE_ZT3DFLAT_SIZE
+
+
   FUNCTION MNH_ALLOCATE_ZT4DFLAT( PTAB, KIB, KIE, KJB, KJE, KKB, KKE, KPB, KPE ) RESULT ( KINDEX )
 
     REAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:,:), INTENT(INOUT) :: PTAB
@@ -1691,6 +1774,20 @@ CONTAINS
   END FUNCTION MNH_ALLOCATE_ZT4DFLAT
 
 
+  FUNCTION MNH_ALLOCATE_ZT4DFLAT_SIZE( PTAB, KISIZE, KJSIZE, KKSIZE, KPSIZE ) RESULT ( KINDEX )
+
+    REAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:,:), INTENT(INOUT) :: PTAB
+    INTEGER,                                        INTENT(IN)    :: KISIZE
+    INTEGER,                                        INTENT(IN)    :: KJSIZE
+    INTEGER,                                        INTENT(IN)    :: KKSIZE
+    INTEGER,                                        INTENT(IN)    :: KPSIZE
+    INTEGER                                                     :: KINDEX
+
+    KINDEX = MNH_ALLOCATE_ZT4DFLAT( PTAB, 1, KISIZE, 1, KJSIZE, 1, KKSIZE, 1, KPSIZE )
+
+  END FUNCTION MNH_ALLOCATE_ZT4DFLAT_SIZE
+
+
   ! End Real 1DFLAT management