diff --git a/src/OCE/IOM/iom.F90 b/src/OCE/IOM/iom.F90
index f6ac95b9274941401aabc032ec7056627736b1f9..7c336684c5d5048f1adc4191e3a70c20e48dbea2 100644
--- a/src/OCE/IOM/iom.F90
+++ b/src/OCE/IOM/iom.F90
@@ -117,12 +117,13 @@ CONTAINS
       !
       TYPE(xios_duration) :: dtime    = xios_duration(0, 0, 0, 0, 0, 0)
       TYPE(xios_date)     :: start_date
-      CHARACTER(len=lc) :: clname
+      CHARACTER(len=lc) :: clname, cltmpn
       INTEGER             :: irefyear, irefmonth, irefday
       INTEGER           :: ji
       LOGICAL           :: llrst_context              ! is context related to restart
       LOGICAL           :: llrstr, llrstw
       INTEGER           :: inum
+      INTEGER           :: iln
       !
       REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zt_bnds, zw_bnds
       REAL(wp), DIMENSION(2,jpkam1)         :: za_bnds   ! ABL vertical boundaries
@@ -135,8 +136,14 @@ CONTAINS
       !
       ALLOCATE( zt_bnds(2,jpk), zw_bnds(2,jpk) )
       !
-      clname = cdname
-      IF( TRIM(Agrif_CFixed()) /= '0' )   clname = TRIM(Agrif_CFixed())//"_"//TRIM(cdname)
+      clname = TRIM(cdname)
+      IF ( .NOT. Agrif_Root() ) THEN
+         iln    = INDEX(clname,'/', BACK=.TRUE.)
+         cltmpn = clname(1:iln)
+         clname = clname(iln+1:LEN_TRIM(clname))
+         clname = TRIM(cltmpn)//TRIM(Agrif_CFixed())//'_'//TRIM(clname)
+      ENDIF
+
       CALL xios_context_initialize(TRIM(clname), mpi_comm_oce)
       CALL iom_swap( cdname )
 
@@ -462,13 +469,13 @@ CONTAINS
       IF(nxioso.eq.1) THEN
          CALL xios_set_file_attr( "wrestart", type="one_file", enabled=.TRUE.,&
                                        mode="write", output_freq=xios_timestep)
-         IF(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in one_file mode'
+         IF(lwp) write(numout,*) 'OPEN ', TRIM(cdrst_file), ' in one_file mode'
       ELSE
          CALL xios_set_file_attr( "wrestart", type="multiple_file", enabled=.TRUE.,&
                                             mode="write", output_freq=xios_timestep)
-         IF(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in multiple_file mode'
+         IF(lwp) write(numout,*) 'OPEN ', TRIM(cdrst_file), ' in multiple_file mode'
       ENDIF
-      CALL xios_set_file_attr( "wrestart", name=trim(cdrst_file))
+      CALL xios_set_file_attr( "wrestart", name=TRIM(cdrst_file))
 #endif
    END SUBROUTINE iom_set_rstw_file
 
@@ -676,14 +683,21 @@ CONTAINS
       !! ** Purpose :  swap context between different agrif grid for xmlio_server
       !!---------------------------------------------------------------------
       CHARACTER(len=*), INTENT(in) :: cdname
+      CHARACTER(len=256)           :: clname, cltmpn
+      INTEGER                      :: iln
 #if defined key_xios
       TYPE(xios_context) :: nemo_hdl
-      IF( TRIM(Agrif_CFixed()) == '0' ) THEN
-        CALL xios_get_handle(TRIM(cdname),nemo_hdl)
-      ELSE
-        CALL xios_get_handle(TRIM(Agrif_CFixed())//"_"//TRIM(cdname),nemo_hdl)
+
+      clname = TRIM(cdname)
+      IF ( .NOT. Agrif_Root() ) THEN
+         iln    = INDEX(clname,'/', BACK=.TRUE.)
+         cltmpn = clname(1:iln)
+         clname = clname(iln+1:LEN_TRIM(clname))
+         clname = TRIM(cltmpn)//TRIM(Agrif_CFixed())//'_'//TRIM(clname)
       ENDIF
       !
+      CALL xios_get_handle(clname,nemo_hdl)
+      !
       CALL xios_set_current_context(nemo_hdl)
 #endif
       !
@@ -749,12 +763,12 @@ CONTAINS
       ENDIF
       ! create the file name by added, if needed, TRIM(Agrif_CFixed()) and TRIM(clsuffix)
       ! =============
-      clname   = trim(cdname)
+      clname   = TRIM(cdname)
       IF ( .NOT. Agrif_Root() .AND. .NOT. lliof ) THEN
          iln    = INDEX(clname,'/', BACK=.TRUE.)
          cltmpn = clname(1:iln)
          clname = clname(iln+1:LEN_TRIM(clname))
-         clname=TRIM(cltmpn)//TRIM(Agrif_CFixed())//'_'//TRIM(clname)
+         clname = TRIM(cltmpn)//TRIM(Agrif_CFixed())//'_'//TRIM(clname)
       ENDIF
       ! which suffix should we use?
       clsuffix = '.nc'
@@ -778,7 +792,7 @@ CONTAINS
          INQUIRE( FILE = clname, EXIST = llok )
          ! we try different formats for the cpu number by adding 0
          DO WHILE( .NOT.llok .AND. icnt < jpmax_digits )
-            clcpu  = "0"//trim(clcpu)
+            clcpu  = "0"//TRIM(clcpu)
             clname = clname(1:iln-1)//'_'//TRIM(clcpu)//TRIM(clsuffix)
             INQUIRE( FILE = clname, EXIST = llok )
             icnt = icnt + 1
@@ -883,9 +897,9 @@ CONTAINS
       ENDIF
       !
       IF( kiomid > 0 ) THEN
-         clinfo = 'iom_varid, file: '//trim(iom_file(kiomid)%name)//', var: '//trim(cdvar)
+         clinfo = 'iom_varid, file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(cdvar)
          IF( iom_file(kiomid)%nfid == 0 ) THEN
-            CALL ctl_stop( trim(clinfo), 'the file is not open' )
+            CALL ctl_stop( TRIM(clinfo), 'the file is not open' )
          ELSE
             ll_fnd  = .FALSE.
             iiv = 0
@@ -900,7 +914,7 @@ CONTAINS
                IF( iiv <= jpmax_vars ) THEN
                   iom_varid = iom_nf90_varid( kiomid, cdvar, iiv, kdimsz, kndims, lduld )
                ELSE
-                  CALL ctl_stop( trim(clinfo), 'Too many variables in the file '//iom_file(kiomid)%name,   &
+                  CALL ctl_stop( TRIM(clinfo), 'Too many variables in the file '//iom_file(kiomid)%name,   &
                         &                      'increase the parameter jpmax_vars')
                ENDIF
                IF( llstop .AND. iom_varid == -1 )   CALL ctl_stop( TRIM(clinfo)//' not found' )
@@ -912,7 +926,7 @@ CONTAINS
                      kdimsz(1:i_nvd) = iom_file(kiomid)%dimsz(1:i_nvd,iiv)
                   ELSE
                      WRITE(ctmp1,*) i_nvd, size(kdimsz)
-                     CALL ctl_stop( trim(clinfo), 'error in kdimsz size'//trim(ctmp1) )
+                     CALL ctl_stop( TRIM(clinfo), 'error in kdimsz size'//TRIM(ctmp1) )
                   ENDIF
                ENDIF
                IF( PRESENT(kndims) )  kndims = iom_file(kiomid)%ndims(iiv)
@@ -949,7 +963,7 @@ CONTAINS
          IF( PRESENT(ktime) ) itime = ktime
          !
          clname = iom_file(kiomid)%name
-         clinfo = '          iom_g0d, file: '//trim(clname)//', var: '//trim(cdvar)
+         clinfo = '          iom_g0d, file: '//TRIM(clname)//', var: '//TRIM(cdvar)
          !
          IF( kiomid > 0 ) THEN
             idvar = iom_varid( kiomid, cdvar )
@@ -966,12 +980,12 @@ CONTAINS
          ENDIF
       ELSE
 #if defined key_xios
-         IF(lwp) WRITE(numout,*) 'XIOS RST READ (0D): ', trim(cdvar)
+         IF(lwp) WRITE(numout,*) 'XIOS RST READ (0D): ', TRIM(cdvar)
          CALL iom_swap(context)
-         CALL xios_recv_field( trim(cdvar), pvar)
+         CALL xios_recv_field( TRIM(cdvar), pvar)
          CALL iom_swap(cxios_context)
 #else
-         WRITE(ctmp1,*) 'Can not use XIOS in iom_g0d, file: '//trim(clname)//', var:'//trim(cdvar)
+         WRITE(ctmp1,*) 'Can not use XIOS in iom_g0d, file: '//TRIM(clname)//', var:'//TRIM(cdvar)
          CALL ctl_stop( 'iom_g0d', ctmp1 )
 #endif
       ENDIF
@@ -998,7 +1012,7 @@ CONTAINS
          IF( PRESENT(ktime) ) itime = ktime
          !
          clname = iom_file(kiomid)%name
-         clinfo = '          iom_g0d, file: '//trim(clname)//', var: '//trim(cdvar)
+         clinfo = '          iom_g0d, file: '//TRIM(clname)//', var: '//TRIM(cdvar)
          !
          IF( kiomid > 0 ) THEN
             idvar = iom_varid( kiomid, cdvar )
@@ -1014,12 +1028,12 @@ CONTAINS
          ENDIF
       ELSE
 #if defined key_xios
-         IF(lwp) WRITE(numout,*) 'XIOS RST READ (0D): ', trim(cdvar)
+         IF(lwp) WRITE(numout,*) 'XIOS RST READ (0D): ', TRIM(cdvar)
          CALL iom_swap(context)
-         CALL xios_recv_field( trim(cdvar), pvar)
+         CALL xios_recv_field( TRIM(cdvar), pvar)
          CALL iom_swap(cxios_context)
 #else
-         WRITE(ctmp1,*) 'Can not use XIOS in iom_g0d, file: '//trim(clname)//', var:'//trim(cdvar)
+         WRITE(ctmp1,*) 'Can not use XIOS in iom_g0d, file: '//TRIM(clname)//', var:'//TRIM(cdvar)
          CALL ctl_stop( 'iom_g0d', ctmp1 )
 #endif
       ENDIF
@@ -1214,10 +1228,10 @@ CONTAINS
       !
       IF(context == "NONE") THEN
          clname = iom_file(kiomid)%name   !   esier to read
-         clinfo = '          iom_get_123d, file: '//trim(clname)//', var: '//trim(cdvar)
+         clinfo = '          iom_get_123d, file: '//TRIM(clname)//', var: '//TRIM(cdvar)
          ! check kcount and kstart optionals parameters...
-         IF( PRESENT(kcount) .AND. .NOT. PRESENT(kstart) ) CALL ctl_stop(trim(clinfo), 'kcount present needs kstart present')
-         IF( PRESENT(kstart) .AND. .NOT. PRESENT(kcount) ) CALL ctl_stop(trim(clinfo), 'kstart present needs kcount present')
+         IF( PRESENT(kcount) .AND. .NOT. PRESENT(kstart) ) CALL ctl_stop(TRIM(clinfo), 'kcount present needs kstart present')
+         IF( PRESENT(kstart) .AND. .NOT. PRESENT(kcount) ) CALL ctl_stop(TRIM(clinfo), 'kstart present needs kcount present')
          IF( PRESENT(kstart) .AND. idom /= jpdom_unknown .AND. idom /= jpdom_auto_xy ) &
             &          CALL ctl_stop(TRIM(clinfo), 'kstart present needs idom = jpdom_unknown or idom = jpdom_auto_xy')
          IF( idom == jpdom_auto_xy .AND. .NOT. PRESENT(kstart) ) &
@@ -1232,7 +1246,7 @@ CONTAINS
             inbdim = iom_file(kiomid)%ndims(idvar)            ! number of dimensions in the file
             idmspc = inbdim                                   ! number of spatial dimensions in the file
             IF( iom_file(kiomid)%luld(idvar) )   idmspc = inbdim - 1
-            IF( idmspc > 3 )   CALL ctl_stop(trim(clinfo), 'the file has more than 3 spatial dimensions this case is not coded...')
+            IF( idmspc > 3 )   CALL ctl_stop(TRIM(clinfo), 'the file has more than 3 spatial dimensions this case is not coded...')
             !
             ! Identify the domain in case of jpdom_auto definition
             IF( idom == jpdom_auto .OR. idom == jpdom_auto_xy ) THEN
@@ -1270,7 +1284,7 @@ CONTAINS
                   &   CALL ctl_stop( TRIM(clinfo), 'case not coded...You must use jpdom_unknown' )
             ELSEIF( idmspc >  irankpv ) THEN                     ! it seems we want to read less than we should...
                   IF( PRESENT(pv_r2d) .AND. itime == 1 .AND. idimsz(3) == 1 .AND. idmspc == 3 ) THEN
-                     CALL ctl_warn( trim(clinfo), '2D array input but 3 spatial dimensions in the file...'              ,   &
+                     CALL ctl_warn( TRIM(clinfo), '2D array input but 3 spatial dimensions in the file...'              ,   &
                            &         'As the size of the z dimension is 1 and as we try to read the first record, ',   &
                            &         'we accept this case, even if there is a possible mix-up between z and time dimension' )
                      idmspc = idmspc - 1
@@ -1316,7 +1330,7 @@ CONTAINS
                IF( itmp > idimsz(jl) .AND. idimsz(jl) /= 0 ) THEN
                   WRITE( ctmp1, FMT="('(istart(', i1, ') + icnt(', i1, ') - 1) = ', i5)" ) jl, jl, itmp
                   WRITE( ctmp2, FMT="(' is larger than idimsz(', i1,') = ', i5)"         ) jl, idimsz(jl)
-                  CALL ctl_stop( trim(clinfo), 'start and count too big regarding to the size of the data, ', ctmp1, ctmp2 )
+                  CALL ctl_stop( TRIM(clinfo), 'start and count too big regarding to the size of the data, ', ctmp1, ctmp2 )
                ENDIF
             END DO
             !
@@ -1388,24 +1402,24 @@ CONTAINS
 
          IF( PRESENT(pv_r3d) ) THEN
             IF(lwp) WRITE(numout,*) 'XIOS RST READ (3D): ',TRIM(cdvar)
-            CALL xios_recv_field( trim(cdvar), pv_r3d(:, :, :))
+            CALL xios_recv_field( TRIM(cdvar), pv_r3d(:, :, :))
             IF(idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
                CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill)
             ENDIF
          ELSEIF( PRESENT(pv_r2d) ) THEN
             IF(lwp) WRITE(numout,*) 'XIOS RST READ (2D): ', TRIM(cdvar)
-            CALL xios_recv_field( trim(cdvar), pv_r2d(:, :))
+            CALL xios_recv_field( TRIM(cdvar), pv_r2d(:, :))
             IF(idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
                CALL lbc_lnk('iom', pv_r2d, cl_type, zsgn, kfillmode = kfill)
             ENDIF
          ELSEIF( PRESENT(pv_r1d) ) THEN
             IF(lwp) WRITE(numout,*) 'XIOS RST READ (1D): ', TRIM(cdvar)
-            CALL xios_recv_field( trim(cdvar), pv_r1d)
+            CALL xios_recv_field( TRIM(cdvar), pv_r1d)
          ENDIF
          CALL iom_swap(cxios_context)
 #else
          istop = istop + 1
-         clinfo = 'Can not use XIOS in iom_get_123d, file: '//trim(clname)//', var:'//trim(cdvar)
+         clinfo = 'Can not use XIOS in iom_get_123d, file: '//TRIM(clname)//', var:'//TRIM(cdvar)
 #endif
       ENDIF
 
@@ -1613,14 +1627,14 @@ CONTAINS
       IF( llx ) THEN
 #ifdef key_xios
          IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_put(trim(cdvar), pvar)
+            CALL iom_put(TRIM(cdvar), pvar)
             CALL iom_swap(cxios_context)
          ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 0D) ',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: define (XIOS 0D) ',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_set_rstw_active( trim(cdvar), rs0 = pvar )
+            CALL iom_set_rstw_active( TRIM(cdvar), rs0 = pvar )
             CALL iom_swap(cxios_context)
          ENDIF
 #endif
@@ -1653,14 +1667,14 @@ CONTAINS
       IF( llx ) THEN
 #ifdef key_xios
          IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_put(trim(cdvar), pvar)
+            CALL iom_put(TRIM(cdvar), pvar)
             CALL iom_swap(cxios_context)
          ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 0D) ',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: define (XIOS 0D) ',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_set_rstw_active( trim(cdvar), rd0 = pvar )
+            CALL iom_set_rstw_active( TRIM(cdvar), rd0 = pvar )
             CALL iom_swap(cxios_context)
          ENDIF
 #endif
@@ -1694,14 +1708,14 @@ CONTAINS
       IF( llx ) THEN
 #ifdef key_xios
          IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_put(trim(cdvar), pvar)
+            CALL iom_put(TRIM(cdvar), pvar)
             CALL iom_swap(cxios_context)
          ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 1D)',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: define (XIOS 1D)',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_set_rstw_active( trim(cdvar), rs1 = pvar )
+            CALL iom_set_rstw_active( TRIM(cdvar), rs1 = pvar )
             CALL iom_swap(cxios_context)
          ENDIF
 #endif
@@ -1734,14 +1748,14 @@ CONTAINS
       IF( llx ) THEN
 #ifdef key_xios
          IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_put(trim(cdvar), pvar)
+            CALL iom_put(TRIM(cdvar), pvar)
             CALL iom_swap(cxios_context)
          ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 1D)',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: define (XIOS 1D)',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_set_rstw_active( trim(cdvar), rd1 = pvar )
+            CALL iom_set_rstw_active( TRIM(cdvar), rd1 = pvar )
             CALL iom_swap(cxios_context)
          ENDIF
 #endif
@@ -1775,14 +1789,14 @@ CONTAINS
       IF( llx ) THEN
 #ifdef key_xios
          IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_put(trim(cdvar), pvar)
+            CALL iom_put(TRIM(cdvar), pvar)
             CALL iom_swap(cxios_context)
          ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 2D)',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: define (XIOS 2D)',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_set_rstw_active( trim(cdvar), rs2 = pvar )
+            CALL iom_set_rstw_active( TRIM(cdvar), rs2 = pvar )
             CALL iom_swap(cxios_context)
          ENDIF
 #endif
@@ -1815,14 +1829,14 @@ CONTAINS
       IF( llx ) THEN
 #ifdef key_xios
          IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_put(trim(cdvar), pvar)
+            CALL iom_put(TRIM(cdvar), pvar)
             CALL iom_swap(cxios_context)
          ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 2D)',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: define (XIOS 2D)',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_set_rstw_active( trim(cdvar), rd2 = pvar )
+            CALL iom_set_rstw_active( TRIM(cdvar), rd2 = pvar )
             CALL iom_swap(cxios_context)
          ENDIF
 #endif
@@ -1856,14 +1870,14 @@ CONTAINS
       IF( llx ) THEN
 #ifdef key_xios
          IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_put(trim(cdvar), pvar)
+            CALL iom_put(TRIM(cdvar), pvar)
             CALL iom_swap(cxios_context)
          ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 3D)',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: define (XIOS 3D)',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_set_rstw_active( trim(cdvar), rs3 = pvar )
+            CALL iom_set_rstw_active( TRIM(cdvar), rs3 = pvar )
             CALL iom_swap(cxios_context)
          ENDIF
 #endif
@@ -1896,14 +1910,14 @@ CONTAINS
       IF( llx ) THEN
 #ifdef key_xios
          IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_put(trim(cdvar), pvar)
+            CALL iom_put(TRIM(cdvar), pvar)
             CALL iom_swap(cxios_context)
          ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 3D)',trim(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: define (XIOS 3D)',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_set_rstw_active( trim(cdvar), rd3 = pvar )
+            CALL iom_set_rstw_active( TRIM(cdvar), rd3 = pvar )
             CALL iom_swap(cxios_context)
          ENDIF
 #endif
@@ -2293,9 +2307,17 @@ CONTAINS
       !!----------------------------------------------------------------------
       CHARACTER(LEN=*), INTENT(in) :: cdname
       CHARACTER(LEN=120)           :: clname
+      CHARACTER(LEN=256)           :: cltmpn    ! tempory name to store clname (in writting mode)
+      INTEGER                      :: iln
       !!----------------------------------------------------------------------
-      clname = cdname
-      IF( TRIM(Agrif_CFixed()) .NE. '0' ) clname = TRIM(Agrif_CFixed())//"_"//clname
+      clname = TRIM(cdname)
+      IF ( .NOT. Agrif_Root() ) THEN
+         iln    = INDEX(clname,'/', BACK=.TRUE.)
+         cltmpn = clname(1:iln)
+         clname = clname(iln+1:LEN_TRIM(clname))
+         clname = TRIM(cltmpn)//TRIM(Agrif_CFixed())//'_'//TRIM(clname)
+      ENDIF
+
       IF( xios_is_valid_context(clname) ) THEN
          CALL iom_swap( cdname )   ! swap to cdname context
          CALL xios_context_finalize() ! finalize the context
@@ -2632,11 +2654,11 @@ CONTAINS
       !!----------------------------------------------------------------------
       CHARACTER(LEN=*)          , INTENT(in) ::   cdid
       !
-      CHARACTER(LEN=256) ::   clname
+      CHARACTER(LEN=256) ::   clname, cltmpn
       CHARACTER(LEN=20)  ::   clfreq
       CHARACTER(LEN=20)  ::   cldate
       INTEGER            ::   idx
-      INTEGER            ::   jn
+      INTEGER            ::   jn, iln
       INTEGER            ::   itrlen
       INTEGER            ::   iyear, imonth, iday, isec
       REAL(wp)           ::   zsec
@@ -2717,7 +2739,12 @@ CONTAINS
                idx = INDEX(clname,'@enddatefull@') + INDEX(clname,'@ENDDATEFULL@')
             END DO
             !
-            IF( jn == 1 .AND. TRIM(Agrif_CFixed()) /= '0' )   clname = TRIM(Agrif_CFixed())//"_"//TRIM(clname)
+            IF( (jn ==1).AND.(.NOT. Agrif_Root())) THEN
+               iln    = INDEX(clname,'/', BACK=.TRUE.)
+               cltmpn = clname(1:iln)
+               clname = clname(iln+1:LEN_TRIM(clname))
+               clname = TRIM(cltmpn)//TRIM(Agrif_CFixed())//'_'//TRIM(clname)
+            ENDIF
             IF( jn == 1 )   CALL iom_set_file_attr( cdid, name        = clname )
             IF( jn == 2 )   CALL iom_set_file_attr( cdid, name_suffix = clname )
             !