Index: branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/iceini_2.F90
===================================================================
--- branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/iceini_2.F90	(revision 3144)
+++ branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/iceini_2.F90	(revision 3145)
@@ -23,6 +23,4 @@
    USE par_ice_2        ! LIM2 parameters
    USE thd_ice_2        ! LIM2 thermodynamical variables
-   USE limrhg           ! LIM2 EVP rheology
-   USE limrhg_2         ! LIM2  VP rheology (requires "key_lim2_vp")
    USE ice_2            ! LIM2 ice variable
    USE limmsh_2         ! LIM2 mesh
@@ -64,9 +62,5 @@
       ierr = ierr + sbc_ice_alloc  ()       ! surface forcing
       ierr = ierr + thd_ice_alloc_2()       ! thermodynamics
-#if ! defined key_lim2_vp
-      ierr = ierr + lim_rhg_alloc  ()
-#else
-      ierr = ierr + lim_rhg_alloc_2  ()
-#endif
+
       IF( lk_mpp    )   CALL mpp_sum( ierr )
       IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'ice_init_2 : unable to allocate ice arrays' )
Index: branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limadv_2.F90
===================================================================
--- branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limadv_2.F90	(revision 3144)
+++ branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limadv_2.F90	(revision 3145)
@@ -23,4 +23,5 @@
    USE in_out_manager     ! I/O manager
    USE lib_mpp            ! MPP library
+   USE wrk_nemo_2         ! work arrays
    USE prtctl             ! Print control
 
@@ -59,9 +60,4 @@
       !! Reference:  Prather, 1986, JGR, 91, D6. 6671-6681.
       !!--------------------------------------------------------------------
-      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released
-      USE wrk_nemo, ONLY:   zf0  => wrk_2d_11 , zfx   => wrk_2d_12 , zfy    => wrk_2d_13 , zbet => wrk_2d_14   ! 2D workspace
-      USE wrk_nemo, ONLY:   zfm  => wrk_2d_15 , zfxx  => wrk_2d_16 , zfyy   => wrk_2d_17 , zfxy => wrk_2d_18   !  -      -
-      USE wrk_nemo, ONLY:   zalg => wrk_2d_19 , zalg1 => wrk_2d_20 , zalg1q => wrk_2d_21                       !  -      -
-      !
       REAL(wp)                    , INTENT(in   ) ::   pdf                ! reduction factor for the time step
       REAL(wp)                    , INTENT(in   ) ::   pcrh               ! call lim_adv_x then lim_adv_y (=1) or the opposite (=0)
@@ -76,9 +72,11 @@
       REAL(wp) ::   zs1new, zalf , zalfq , zbt           !    -         -
       REAL(wp) ::   zs2new, zalf1, zalf1q, zbt1          !    -         -
+      REAL(wp), DIMENSION(:,:), POINTER ::   zf0, zfx , zfy , zbet   ! 2D workspace
+      REAL(wp), DIMENSION(:,:), POINTER ::   zfm, zfxx, zfyy, zfxy   !  -      -
+      REAL(wp), DIMENSION(:,:), POINTER ::   zalg, zalg1, zalg1q     !  -      -
       !---------------------------------------------------------------------
 
-      IF( wrk_in_use(2, 11,12,13,14,15,16,17,18,19,20,21) ) THEN
-         CALL ctl_stop( 'lim_adv_x_2 : requested workspace arrays unavailable.' )   ;   RETURN
-      ENDIF
+      CALL wrk_alloc( jpi, jpj, zf0 , zfx , zfy , zbet, zfm )
+      CALL wrk_alloc( jpi, jpj, zfxx, zfyy, zfxy, zalg, zalg1, zalg1q )
 
       ! Limitation of moments.                                           
@@ -225,6 +223,6 @@
       ENDIF
       !
-      IF( wrk_not_released(2, 11,12,13,14,15,16,17,18,19,20,21) )   &
-          CALL ctl_stop( 'lim_adv_x_2 : failed to release workspace arrays.' )
+      CALL wrk_dealloc( jpi, jpj, zf0 , zfx , zfy , zbet, zfm )
+      CALL wrk_dealloc( jpi, jpj, zfxx, zfyy, zfxy, zalg, zalg1, zalg1q )
       !
    END SUBROUTINE lim_adv_x_2
@@ -245,9 +243,4 @@
       !! Reference:  Prather, 1986, JGR, 91, D6. 6671-6681.
       !!---------------------------------------------------------------------
-      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released
-      USE wrk_nemo, ONLY:   zf0  => wrk_2d_11 , zfx   => wrk_2d_12 , zfy    => wrk_2d_13 , zbet => wrk_2d_14   ! 2D workspace
-      USE wrk_nemo, ONLY:   zfm  => wrk_2d_15 , zfxx  => wrk_2d_16 , zfyy   => wrk_2d_17 , zfxy => wrk_2d_18   !  -      -
-      USE wrk_nemo, ONLY:   zalg => wrk_2d_19 , zalg1 => wrk_2d_20 , zalg1q => wrk_2d_21                       !  -      -
-      !!
       REAL(wp)                    , INTENT(in   ) ::   pdf                ! reduction factor for the time step
       REAL(wp)                    , INTENT(in   ) ::   pcrh               ! call lim_adv_x then lim_adv_y (=1) or the opposite (=0)
@@ -262,9 +255,11 @@
       REAL(wp) ::   zs1new, zalf , zalfq , zbt           !    -         -
       REAL(wp) ::   zs2new, zalf1, zalf1q, zbt1          !    -         -
+      REAL(wp), DIMENSION(:,:), POINTER ::   zf0, zfx , zfy , zbet   ! 2D workspace
+      REAL(wp), DIMENSION(:,:), POINTER ::   zfm, zfxx, zfyy, zfxy   !  -      -
+      REAL(wp), DIMENSION(:,:), POINTER ::   zalg, zalg1, zalg1q     !  -      -
       !---------------------------------------------------------------------
 
-      IF(wrk_in_use(2, 11,12,13,14,15,16,17,18,19,20,21) ) THEN
-         CALL ctl_stop( 'lim_adv_y_2 : requested workspace arrays unavailable.' )   ;   RETURN
-      END IF
+      CALL wrk_alloc( jpi, jpj, zf0 , zfx , zfy , zbet, zfm )
+      CALL wrk_alloc( jpi, jpj, zfxx, zfyy, zfxy, zalg, zalg1, zalg1q )
 
       ! Limitation of moments.
@@ -414,7 +409,6 @@
       ENDIF
       !
-      IF( wrk_not_released(2, 11,12,13,14,15,16,17,18,19,20,21) ) THEN
-        CALL ctl_stop( 'lim_adv_y_2 : failed to release workspace arrays.' )
-      END IF
+      CALL wrk_dealloc( jpi, jpj, zf0 , zfx , zfy , zbet, zfm )
+      CALL wrk_dealloc( jpi, jpj, zfxx, zfyy, zfxy, zalg, zalg1, zalg1q )
       !
    END SUBROUTINE lim_adv_y_2
Index: branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limdyn_2.F90
===================================================================
--- branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limdyn_2.F90	(revision 3144)
+++ branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limdyn_2.F90	(revision 3145)
@@ -28,4 +28,5 @@
    USE lbclnk           ! lateral boundary condition - MPP link
    USE lib_mpp          ! MPP library
+   USE wrk_nemo_2       ! work arrays
    USE in_out_manager   ! I/O manager
    USE prtctl           ! Print control
@@ -58,8 +59,4 @@
       !!              - treatment of the case if no ice dynamic
       !!---------------------------------------------------------------------
-      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released
-      USE wrk_nemo, ONLY:   wrk_1d_1, wrk_1d_2
-      USE wrk_nemo, ONLY:   zu_io => wrk_2d_1, zv_io => wrk_2d_2  ! ice-ocean velocity
-      !
       INTEGER, INTENT(in) ::   kt     ! number of iteration
       !!
@@ -67,13 +64,11 @@
       INTEGER  ::   i_j1, i_jpj        ! Starting/ending j-indices for rheology
       REAL(wp) ::   zcoef              ! temporary scalar
-      REAL(wp), POINTER, DIMENSION(:) ::   zind     ! i-averaged indicator of sea-ice
-      REAL(wp), POINTER, DIMENSION(:) ::   zmsk     ! i-averaged of tmask
+      REAL(wp), POINTER, DIMENSION(:  ) ::   zind           ! i-averaged indicator of sea-ice
+      REAL(wp), POINTER, DIMENSION(:  ) ::   zmsk           ! i-averaged of tmask
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zu_io, zv_io   ! ice-ocean velocity
       !!---------------------------------------------------------------------
 
-      IF(  wrk_in_use(1, 1,2)  .OR.  wrk_in_use(2, 1,2)  ) THEN
-         CALL ctl_stop( 'lim_dyn_2 : requested workspace arrays unavailable' )   ;   RETURN
-      ENDIF
-      zind => wrk_1d_1(1:jpj)      ! Set-up pointers to sub-arrays of workspaces
-      zmsk => wrk_1d_2(1:jpj)
+      CALL wrk_alloc( jpi, jpj, zu_io, zv_io )
+      CALL wrk_alloc(      jpj, zind , zmsk  )
 
       IF( kt == nit000 )   CALL lim_dyn_init_2   ! Initialization (first time-step only)
@@ -210,6 +205,6 @@
       IF(ln_ctl)   CALL prt_ctl(tab2d_1=ust2s , clinfo1=' lim_dyn  : ust2s :')
       !
-      IF( wrk_not_released(1, 1,2)     .OR.   &
-          wrk_not_released(2, 1,2) )   CALL ctl_stop('lim_dyn_2 : failed to release workspace arrays')
+      CALL wrk_dealloc( jpi, jpj, zu_io, zv_io )
+      CALL wrk_dealloc(      jpj, zind , zmsk  )
       !
    END SUBROUTINE lim_dyn_2
Index: branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limhdf_2.F90
===================================================================
--- branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limhdf_2.F90	(revision 3144)
+++ branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limhdf_2.F90	(revision 3145)
@@ -18,4 +18,5 @@
    USE lbclnk           ! lateral boundary condition - MPP exchanges
    USE lib_mpp          ! MPP library
+   USE wrk_nemo_2       ! work arrays
    USE prtctl           ! Print control
    USE in_out_manager   ! I/O manager
@@ -51,8 +52,4 @@
       !! ** Action  :    update ptab with the diffusive contribution
       !!-------------------------------------------------------------------
-      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
-      USE wrk_nemo, ONLY:   zflu => wrk_2d_11, zdiv  => wrk_2d_13, zrlx  => wrk_2d_15 
-      USE wrk_nemo, ONLY:   zflv => wrk_2d_12, zdiv0 => wrk_2d_14, ztab0 => wrk_2d_16
-      !
       REAL(wp), DIMENSION(jpi,jpj), INTENT( inout ) ::   ptab   ! Field on which the diffusion is applied  
       !
@@ -60,10 +57,9 @@
       INTEGER  ::   its, iter, ierr   ! local integers
       REAL(wp) ::   zalfa, zrlxint, zconv, zeps   ! local scalars
+      REAL(wp), DIMENSION(:,:), POINTER :: zrlx, zflu, zflv, zdiv0, zdiv, ztab0 
       CHARACTER (len=55) :: charout
       !!-------------------------------------------------------------------
 
-      IF( wrk_in_use(2, 11,12,13,14,15,16) ) THEN
-         CALL ctl_stop( 'lim_hdf_2 : requested workspace arrays unavailable.' )   ;   RETURN
-      END IF
+      CALL wrk_alloc( jpi, jpj, zrlx, zflu, zflv, zdiv0, zdiv, ztab0 )
 
       !                       !==  Initialisation  ==!
@@ -149,5 +145,5 @@
       ENDIF
       !
-      IF( wrk_not_released(2, 11,12,13,14,15,16) )   CALL ctl_stop('lim_hdf_2: failed to release workspace arrays')
+      CALL wrk_dealloc( jpi, jpj, zrlx, zflu, zflv, zdiv0, zdiv, ztab0 )
       !
    END SUBROUTINE lim_hdf_2
Index: branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limmsh_2.F90
===================================================================
--- branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limmsh_2.F90	(revision 3144)
+++ branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limmsh_2.F90	(revision 3145)
@@ -20,4 +20,7 @@
    USE in_out_manager
    USE lib_mpp          ! MPP library
+#if defined key_lim2_vp
+   USE wrk_nemo_2       ! work arrays
+#endif
 
    IMPLICIT NONE
@@ -46,6 +49,4 @@
       !! ** Refer.  : Deleersnijder et al. Ocean Modelling 100, 7-10 
       !!--------------------------------------------------------------------- 
-      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
-      USE wrk_nemo, ONLY: zd2d1 => wrk_2d_1, zd1d2 => wrk_2d_2
       INTEGER :: ji, jj      ! dummy loop indices
       REAL(wp) ::   zusden   ! local scalars
@@ -54,10 +55,11 @@
       REAL(wp) ::   zh1p  , zh2p      !   -      -
       REAL(wp) ::   zd2d1p, zd1d2p    !   -      -
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zd2d1, zd1d2   ! 2D workspace
 #endif
       !!---------------------------------------------------------------------
 
-      IF( wrk_in_use(2, 1,2) ) THEN
-         CALL ctl_stop('lim_msh_2 : requested workspace arrays unavailable')   ;   RETURN
-      ENDIF
+#if defined key_lim2_vp
+      CALL wrk_alloc( jpi, jpj, zd2d1, zd1d2 )
+#endif
 
       IF(lwp) THEN
@@ -281,5 +283,7 @@
       area(:,:) = e1t(:,:) * e2t(:,:)
       !
-      IF( wrk_not_released(2, 1,2) )   CALL ctl_stop('lim_msh_2 : failed to release workspace arrays')
+#if defined key_lim2_vp
+      CALL wrk_dealloc( jpi, jpj, zd2d1, zd1d2 )
+#endif
       !
    END SUBROUTINE lim_msh_2
Index: branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limrhg_2.F90
===================================================================
--- branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limrhg_2.F90	(revision 3144)
+++ branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limrhg_2.F90	(revision 3145)
@@ -27,4 +27,5 @@
    USE lbclnk         ! lateral boundary condition - MPP exchanges
    USE lib_mpp        ! MPP library
+   USE wrk_nemo_2     ! work arrays
    USE in_out_manager ! I/O manager
    USE prtctl         ! Print control
@@ -34,17 +35,7 @@
 
    PUBLIC   lim_rhg_2         ! routine called by lim_dyn
-   PUBLIC   lim_rhg_alloc_2   ! routine called by lim_dyn_alloc_2
 
    REAL(wp) ::   rzero   = 0._wp   ! constant value: zero
    REAL(wp) ::   rone    = 1._wp   !            and  one
-
-   ! 2D workspaces for lim_rhg_2. Can't use wrk_nemo module for them because
-   ! extent in 2nd dimension is > jpj.
-   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:) ::   zu0, zv0
-   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:) ::   zu_n, zv_n
-   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:) ::   zu_a, zv_a
-   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:) ::   zviszeta, zviseta
-   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:) ::   zzfrld, zztms
-   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:) ::   zi1, zi2, zmasst, zpresh
 
    !! * Substitutions
@@ -56,22 +47,4 @@
    !!----------------------------------------------------------------------
 CONTAINS
-
-   INTEGER FUNCTION lim_rhg_alloc_2()
-      !!-------------------------------------------------------------------
-      !!               ***  FUNCTION lim_rhg_alloc_2  ***
-      !!-------------------------------------------------------------------
-      ALLOCATE( zu0(jpi,0:jpj+1),      zv0(jpi,0:jpj+1),     &
-         &      zu_n(jpi,0:jpj+1),     zv_n(jpi,0:jpj+1),    &
-         &      zu_a(jpi,0:jpj+1),     zv_a(jpi,0:jpj+1),    &
-         &      zviszeta(jpi,0:jpj+1), zviseta(jpi,0:jpj+1), &
-         &      zzfrld(jpi,0:jpj+1),   zztms(jpi,0:jpj+1),   &
-         &      zi1(jpi,0:jpj+1),      zi2(jpi,0:jpj+1),     &
-         &      zmasst(jpi,0:jpj+1),   zpresh(jpi,0:jpj+1),  &
-         &      Stat=lim_rhg_alloc_2)
-         !
-      IF( lim_rhg_alloc_2 /= 0 )   CALL ctl_warn('lim_rhg_alloc_2 : failed to allocate arrays')
-      !
-   END FUNCTION lim_rhg_alloc_2
-
 
    SUBROUTINE lim_rhg_2( k_j1, k_jpj )
@@ -87,10 +60,4 @@
       !!              at I-point
       !!-------------------------------------------------------------------
-      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
-      USE wrk_nemo, ONLY: zfrld => wrk_2d_1, zmass => wrk_2d_2, zcorl => wrk_2d_3
-      USE wrk_nemo, ONLY: za1ct => wrk_2d_4, za2ct => wrk_2d_5, zresr => wrk_2d_6
-      USE wrk_nemo, ONLY: zc1u  => wrk_2d_7, zc1v  => wrk_2d_8, zc2u => wrk_2d_9
-      USE wrk_nemo, ONLY: zc2v  => wrk_2d_10, zsang => wrk_2d_11
-      !!
       INTEGER, INTENT(in) ::   k_j1    ! southern j-index for ice computation
       INTEGER, INTENT(in) ::   k_jpj   ! northern j-index for ice computation
@@ -113,6 +80,21 @@
       REAL(wp) ::   zs21_11, zs21_12, zs21_21, zs21_22
       REAL(wp) ::   zs22_11, zs22_12, zs22_21, zs22_22
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zfrld, zmass, zcorl
+      REAL(wp), POINTER, DIMENSION(:,:) ::   za1ct, za2ct, zresr
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zc1u, zc1v, zc2u, zc2v
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zsang
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zu0, zv0
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zu_n, zv_n
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zu_a, zv_a
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zviszeta, zviseta
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zzfrld, zztms
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zi1, zi2, zmasst, zpresh
       !!-------------------------------------------------------------------
       
+      CALL wrk_alloc( jpi,jpj, zfrld, zmass, zcorl, za1ct, za2ct, zresr )
+      CALL wrk_alloc( jpi,jpj, zc1u , zc1v , zc2u , zc2v , zsang )
+      CALL wrk_alloc( jpi,jpj+2, zu0, zv0, zu_n, zv_n, zu_a, zv_a, zviszeta, zviseta, kistart = 0 )
+      CALL wrk_alloc( jpi,jpj+2, zzfrld, zztms, zi1, zi2, zmasst, zpresh, kistart = 0 )
+
       !  Store initial velocities
       !  ----------------
@@ -592,4 +574,9 @@
       ENDIF
 
+      CALL wrk_dealloc( jpi,jpj, zfrld, zmass, zcorl, za1ct, za2ct, zresr )
+      CALL wrk_dealloc( jpi,jpj, zc1u , zc1v , zc2u , zc2v , zsang )
+      CALL wrk_dealloc( jpi,jpj+2, zu0, zv0, zu_n, zv_n, zu_a, zv_a, zviszeta, zviseta, kistart = 0 )
+      CALL wrk_dealloc( jpi,jpj+2, zzfrld, zztms, zi1, zi2, zmasst, zpresh, kistart = 0 )
+
    END SUBROUTINE lim_rhg_2
 
Index: branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limsbc_2.F90
===================================================================
--- branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limsbc_2.F90	(revision 3144)
+++ branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limsbc_2.F90	(revision 3145)
@@ -32,4 +32,5 @@
    USE lbclnk           ! ocean lateral boundary condition - MPP exchanges
    USE lib_mpp          ! MPP library
+   USE wrk_nemo_2       ! work arrays
    USE in_out_manager   ! I/O manager
    USE diaar5, ONLY :   lk_diaar5
@@ -51,5 +52,4 @@
    !
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   soce_0, sice_0   ! constant SSS and ice salinity used in levitating sea-ice case
-
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau_oce, vtau_oce   ! air-ocean surface i- & j-stress              [N/m2]
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tmod_io              ! modulus of the ice-ocean relative velocity   [m/s]
@@ -101,7 +101,4 @@
       !!              Tartinville et al. 2001 Ocean Modelling, 3, 95-108.
       !!---------------------------------------------------------------------
-      USE wrk_nemo, ONLY: wrk_not_released, wrk_in_use
-      USE wrk_nemo, ONLY: zqnsoce => wrk_2d_1 ! 2D workspace
-      USE wrk_nemo, ONLY: wrk_3d_4, wrk_3d_5
       INTEGER, INTENT(in) ::   kt    ! number of iteration
       !!
@@ -112,12 +109,10 @@
       REAL(wp) ::   zqsr, zqns, zfm            ! local scalars
       REAL(wp) ::   zinda, zfons, zemp         !   -      -
+      REAL(wp), POINTER, DIMENSION(:,:)   ::   zqnsoce       ! 2D workspace
       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zalb, zalbp   ! 2D/3D workspace
       !!---------------------------------------------------------------------
      
-      IF( wrk_in_use(2, 1) .OR. wrk_in_use(3, 4,5) )THEN
-         CALL ctl_stop('lim_sbc_flx_2 : requested workspace arrays unavailable')   ;   RETURN
-      ENDIF
-      zalb  => wrk_3d_4(:,:,1:1)      ! Set-up pointers to sub-arrays of 3d workspaces
-      zalbp => wrk_3d_5(:,:,1:1)
+      CALL wrk_alloc( jpi, jpj, zqnsoce )
+      CALL wrk_alloc( jpi, jpj, 1, zalb, zalbp )
 
       !------------------------------------------!
@@ -254,6 +249,6 @@
       ENDIF 
       !
-      IF( wrk_not_released(2, 1)     .OR.    &
-          wrk_not_released(3, 4,5) )   CALL ctl_stop('lim_sbc_flx_2 : failed to release workspace arrays')
+      CALL wrk_dealloc( jpi, jpj, zqnsoce )
+      CALL wrk_dealloc( jpi, jpj, 1, zalb, zalbp )
       !
    END SUBROUTINE lim_sbc_flx_2
@@ -286,6 +281,4 @@
       !!              - taum       : modulus of the surface ocean stress (T-point) updated with ice-ocean fluxes
       !!---------------------------------------------------------------------
-      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
-      USE wrk_nemo, ONLY: ztio_u => wrk_2d_1, ztio_v => wrk_2d_2     ! ocean stress below sea-ice
       INTEGER ,                     INTENT(in) ::   kt               ! ocean time-step index
       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pu_oce, pv_oce   ! surface ocean currents
@@ -295,9 +288,8 @@
       REAL(wp) ::   zfrldv, zat_v, zv_i, zvtau_ice, zv_t, zmodi   !   -      -
       REAL(wp) ::   zsang, zumt                                   !    -         -
+      REAL(wp), POINTER, DIMENSION(:,:) ::   ztio_u, ztio_v   ! ocean stress below sea-ice
       !!---------------------------------------------------------------------
       !
-      IF( wrk_in_use(2, 1,2) ) THEN
-         CALL ctl_stop('lim_sbc_tau_2 : requested workspace arrays unavailable.')   ;   RETURN
-      ENDIF
+      CALL wrk_alloc( jpi, jpj, ztio_u, ztio_v )
       !
       SELECT CASE( cp_ice_msh )     
@@ -413,5 +405,5 @@
          &                       tab2d_2=vtau, clinfo2=' vtau    : '        , mask2=vmask )
       !  
-      IF( wrk_not_released(2, 1,2) )   CALL ctl_stop('lim_sbc_tau_2 : failed to release workspace arrays')
+      CALL wrk_dealloc( jpi, jpj, ztio_u, ztio_v )
       !
    END SUBROUTINE lim_sbc_tau_2
Index: branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limthd_2.F90
===================================================================
--- branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limthd_2.F90	(revision 3144)
+++ branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limthd_2.F90	(revision 3145)
@@ -22,4 +22,5 @@
    USE in_out_manager  ! I/O manager
    USE lib_mpp
+   USE wrk_nemo_2      ! work arrays
    USE iom             ! IOM library
    USE ice_2           ! LIM sea-ice variables
@@ -75,17 +76,4 @@
       !! References :   Goosse et al. 1996, Bul. Soc. Roy. Sc. Liege, 65, 87-90
       !!---------------------------------------------------------------------
-      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
-      USE wrk_nemo, ONLY: ztmp    => wrk_2d_1, & ! 2D workspace
-                          zqlbsbq => wrk_2d_2, & ! link with lead energy budget qldif
-                          zlicegr => wrk_2d_3    ! link with lateral ice growth 
-      USE wrk_nemo, ONLY: zmsk => wrk_3d_4       ! 3D workspace
-      USE wrk_nemo, ONLY: zdvosif => wrk_2d_4, & !: Variation of volume at surface
-                          zdvobif => wrk_2d_5, & !: Variation of ice volume at the bottom ice     (outputs only)
-                          zdvolif => wrk_2d_6, & !: Total variation of ice volume                 (outputs only)
-                          zdvonif => wrk_2d_7, & !: Surface accretion Snow to Ice transformation  (outputs only)
-                          zdvomif => wrk_2d_8, & !: Bottom variation of ice volume due to melting (outputs only)
-                          zu_imasstr =>wrk_2d_9, & !: Sea-ice transport along i-axis at U-point     (outputs only) 
-                          zv_imasstr =>wrk_2d_10   !: Sea-ice transport along j-axis at V-point     (outputs only) 
-      !!
       INTEGER, INTENT(in) ::   kt     ! number of iteration
       !!
@@ -110,14 +98,23 @@
       REAL(wp) ::   zrhoij, zrhoijm1     ! temporary scalars
       REAL(wp) ::   zztmp                ! temporary scalars within a loop
-!!$      REAL(wp), DIMENSION(jpi,jpj) ::   firic         !: IR flux over the ice            (outputs only)
-!!$      REAL(wp), DIMENSION(jpi,jpj) ::   fcsic         !: Sensible heat flux over the ice (outputs only)
-!!$      REAL(wp), DIMENSION(jpi,jpj) ::   fleic         !: Latent heat flux over the ice   (outputs only)
-!!$      REAL(wp), DIMENSION(jpi,jpj) ::   qlatic        !: latent flux                     (outputs only)
+      REAL(wp), POINTER, DIMENSION(:,:)     ::   ztmp      ! 2D workspace
+      REAL(wp), POINTER, DIMENSION(:,:)     ::   zqlbsbq   ! link with lead energy budget qldif
+      REAL(wp), POINTER, DIMENSION(:,:)     ::   zlicegr   ! link with lateral ice growth 
+!!$      REAL(wp), DIMENSION(:,:) ::   firic         ! IR flux over the ice            (outputs only)
+!!$      REAL(wp), DIMENSION(:,:) ::   fcsic         ! Sensible heat flux over the ice (outputs only)
+!!$      REAL(wp), DIMENSION(:,:) ::   fleic         ! Latent heat flux over the ice   (outputs only)
+!!$      REAL(wp), DIMENSION(:,:) ::   qlatic        ! latent flux                     (outputs only)
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zdvosif       ! Variation of volume at surface                (outputs only)
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zdvobif       ! Variation of ice volume at the bottom ice     (outputs only)
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zdvolif       ! Total variation of ice volume                 (outputs only)
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zdvonif       ! Surface accretion Snow to Ice transformation  (outputs only)
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zdvomif       ! Bottom variation of ice volume due to melting (outputs only)
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zu_imasstr    ! Sea-ice transport along i-axis at U-point     (outputs only) 
+      REAL(wp), POINTER, DIMENSION(:,:) ::   zv_imasstr    ! Sea-ice transport along j-axis at V-point     (outputs only) 
+      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zmsk        ! 3D workspace
       !!-------------------------------------------------------------------
 
-      IF( wrk_in_use(2, 1,2,3,4,5,6,7,8,9,10)   .OR.  &
-          wrk_in_use(3, 4)                    ) THEN
-         CALL ctl_stop('lim_thd_2 : requested workspace arrays unavailable')   ;   RETURN
-      ENDIF
+      CALL wrk_alloc( jpi, jpj, ztmp, zqlbsbq, zlicegr, zdvosif, zdvobif, zdvolif, zdvonif, zdvomif, zu_imasstr, zv_imasstr )
+      CALL wrk_alloc( jpi, jpj, jpk, zmsk )
 
       IF( kt == nit000 )   CALL lim_thd_init_2  ! Initialization (first time-step only)
@@ -520,8 +517,6 @@
       ENDIF
        !
-      IF( wrk_not_released(2, 1,2,3,4,5,6,7,8,9,10)   .OR.  &
-          wrk_not_released(3, 4)                    ) THEN
-         CALL ctl_stop('lim_thd_2 : failed to release workspace arrays')
-      ENDIF
+      CALL wrk_dealloc( jpi, jpj, ztmp, zqlbsbq, zlicegr, zdvosif, zdvobif, zdvolif, zdvonif, zdvomif, zu_imasstr, zv_imasstr )
+      CALL wrk_dealloc( jpi, jpj, jpk, zmsk )
       !
     END SUBROUTINE lim_thd_2
Index: branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limthd_lac_2.F90
===================================================================
--- branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limthd_lac_2.F90	(revision 3144)
+++ branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limthd_lac_2.F90	(revision 3145)
@@ -15,4 +15,5 @@
    USE limistate_2 
    USE lib_mpp          ! MPP library
+   USE wrk_nemo_2       ! work arrays
 
    IMPLICIT NONE
@@ -68,7 +69,4 @@
       !!   2.0  !  02-08 (C. Ethe, G. Madec)  F90, mpp
       !!-------------------------------------------------------------------
-      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
-      USE wrk_nemo, ONLY: wrk_1d_1, wrk_1d_2, wrk_1d_3, wrk_1d_4, wrk_1d_5, wrk_1d_6
-      !
       INTEGER , INTENT(IN)::  &
          kideb          ,   &  ! start point on which the the computation is applied
@@ -104,14 +102,5 @@
       !!---------------------------------------------------------------------      
                
-      IF( wrk_in_use(1, 1,2,3,4,5,6) ) THEN
-         CALL ctl_stop('lim_thd_lac_2 : requestead workspace arrays unavailable')   ;   RETURN
-      ENDIF
-      ! Set-up pointers to sub-arrays of workspace arrays
-      zqbgow    => wrk_1d_1(1:jpij)
-      zfrl_old  => wrk_1d_2(1:jpij)         
-      zhice_old => wrk_1d_3(1:jpij)        
-      zhice0    => wrk_1d_4(1:jpij)        
-      zfrlmin   => wrk_1d_5(1:jpij)        
-      zdhicbot  => wrk_1d_6(1:jpij) 
+      CALL wrk_alloc( jpij, zqbgow, zfrl_old, zhice_old, zhice0, zfrlmin, zdhicbot )
       
       !--------------------------------------------------------------
@@ -232,5 +221,5 @@
       END DO
       
-      IF( wrk_not_released(1, 1,2,3,4,5,6) )   CALL ctl_stop('lim_thd_lac_2 : failed to release workspace arrays.')
+      CALL wrk_dealloc( jpij, zqbgow, zfrl_old, zhice_old, zhice0, zfrlmin, zdhicbot )
       !
    END SUBROUTINE lim_thd_lac_2
Index: branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limthd_zdf_2.F90
===================================================================
--- branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limthd_zdf_2.F90	(revision 3144)
+++ branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limthd_zdf_2.F90	(revision 3145)
@@ -20,4 +20,5 @@
    USE in_out_manager
    USE lib_mpp          ! MPP library
+   USE wrk_nemo_2       ! work arrays
    USE cpl_oasis3, ONLY : lk_cpl
       
@@ -67,12 +68,4 @@
       !!              Fichefet T. and M. Maqueda 1999, Clim. Dyn, 15(4), 251-268  
       !!------------------------------------------------------------------
-      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
-      USE wrk_nemo, ONLY: wrk_1d_1,  wrk_1d_2,  wrk_1d_3,  wrk_1d_4,  wrk_1d_5 
-      USE wrk_nemo, ONLY: wrk_1d_6,  wrk_1d_7,  wrk_1d_8,  wrk_1d_9,  wrk_1d_10
-      USE wrk_nemo, ONLY: wrk_1d_11, wrk_1d_12, wrk_1d_13, wrk_1d_14, wrk_1d_15
-      USE wrk_nemo, ONLY: wrk_1d_16, wrk_1d_17, wrk_1d_18, wrk_1d_19, wrk_1d_20
-      USE wrk_nemo, ONLY: wrk_1d_21, wrk_1d_22, wrk_1d_23, wrk_1d_24, wrk_1d_25
-      USE wrk_nemo, ONLY: wrk_1d_26, wrk_1d_27
-      !!
       INTEGER, INTENT(in) ::   kideb    ! Start point on which the  the computation is applied
       INTEGER, INTENT(in) ::   kiut     ! End point on which the  the computation is applied
@@ -166,40 +159,7 @@
           , zihsn, zidhb, zihic, zihe, zihq, ziexp, ziqf, zihnf, zibmlt, ziqr, zihgnew, zind
        !!----------------------------------------------------------------------
-
-       IF(wrk_in_use(1, 1,  2, 3, 4, 5, 6, 7, 8, 9,10, &
-          &             11,12,13,14,15,16,17,18,19,20, &
-          &             21,22,23,24,25,26,27) ) THEN
-          CALL ctl_stop('lim_thd_zdf_2 : requested workspace arrays unavailable')   ;   RETURN
-       ENDIF
-
-       ztsmlt  => wrk_1d_1(1:jpij)
-       ztbif   => wrk_1d_2(1:jpij)  
-       zksn    => wrk_1d_3(1:jpij)  
-       zkic    => wrk_1d_4(1:jpij)   
-       zksndh  => wrk_1d_5(1:jpij)   
-       zfcsu   => wrk_1d_6(1:jpij)   
-       zfcsudt => wrk_1d_7(1:jpij)  
-       zi0     => wrk_1d_8(1:jpij)   
-       z1mi0   => wrk_1d_9(1:jpij)    
-       zqmax   => wrk_1d_10(1:jpij)    
-       zrcpdt  => wrk_1d_11(1:jpij)  
-       zts_old => wrk_1d_12(1:jpij)  
-       zidsn   => wrk_1d_13(1:jpij) 
-       z1midsn => wrk_1d_14(1:jpij) 
-       zidsnic => wrk_1d_15(1:jpij)
-
-       zfnet     => wrk_1d_16(1:jpij)
-       zsprecip  => wrk_1d_17(1:jpij)  
-       zhsnw_old => wrk_1d_18(1:jpij) 
-       zdhictop  => wrk_1d_19(1:jpij) 
-       zdhicbot  => wrk_1d_20(1:jpij)
-       zqsup     => wrk_1d_21(1:jpij)  
-       zqocea    => wrk_1d_22(1:jpij)
-       zfrl_old  => wrk_1d_23(1:jpij) 
-       zfrld_1d  => wrk_1d_24(1:jpij) 
-       zep       => wrk_1d_25(1:jpij) 
-
-       zqcmlts   => wrk_1d_26(1:jpij)
-       zqcmltb   => wrk_1d_27(1:jpij)
+       CALL wrk_alloc( jpij, ztsmlt, ztbif  , zksn    , zkic    , zksndh , zfcsu  , zfcsudt , zi0      , z1mi0   , zqmax    )
+       CALL wrk_alloc( jpij, zrcpdt, zts_old, zidsn   , z1midsn , zidsnic, zfnet  , zsprecip, zhsnw_old, zdhictop, zdhicbot )
+       CALL wrk_alloc( jpij, zqsup , zqocea , zfrl_old, zfrld_1d, zep    , zqcmlts, zqcmltb                                 )
 
        !-----------------------------------------------------------------------
@@ -806,8 +766,7 @@
        END DO
        ! 
-       IF( wrk_not_released(1, 1,  2, 3, 4, 5, 6, 7, 8, 9,10,   &
-           &                   11,12,13,14,15,16,17,18,19,20,   &
-           &                   21,22,23,24,25,26,27)        )   &
-           CALL ctl_stop('lim_thd_zdf_2 : failed to release workspace arrays.')
+       CALL wrk_dealloc( jpij, ztsmlt, ztbif  , zksn    , zkic    , zksndh , zfcsu  , zfcsudt , zi0      , z1mi0   , zqmax    )
+       CALL wrk_dealloc( jpij, zrcpdt, zts_old, zidsn   , z1midsn , zidsnic, zfnet  , zsprecip, zhsnw_old, zdhictop, zdhicbot )
+       CALL wrk_dealloc( jpij, zqsup , zqocea , zfrl_old, zfrld_1d, zep    , zqcmlts, zqcmltb                                 )
        !
     END SUBROUTINE lim_thd_zdf_2
Index: branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limtrp_2.F90
===================================================================
--- branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limtrp_2.F90	(revision 3144)
+++ branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limtrp_2.F90	(revision 3145)
@@ -27,4 +27,5 @@
    USE lbclnk          ! lateral boundary conditions -- MPP exchanges
    USE lib_mpp         ! MPP library
+   USE wrk_nemo_2      ! work arrays
 
    IMPLICIT NONE
@@ -63,10 +64,4 @@
       !! ** action :
       !!---------------------------------------------------------------------
-      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
-      USE wrk_nemo, ONLY: zui_u  => wrk_2d_1, zvi_v => wrk_2d_2, zsm  => wrk_2d_3
-      USE wrk_nemo, ONLY: zs0ice => wrk_2d_4, zs0sn => wrk_2d_5, zs0a => wrk_2d_6
-      USE wrk_nemo, ONLY: zs0c0 => wrk_2d_7,  zs0c1 => wrk_2d_8, zs0c2 => wrk_2d_9, &
-                          zs0st => wrk_2d_10
-      !!
       INTEGER, INTENT(in) ::   kt     ! number of iteration
       !!
@@ -77,9 +72,10 @@
       REAL(wp) ::   zvbord , zcfl   , zusnit            !   -      -
       REAL(wp) ::   zrtt   , ztsn   , ztic1 , ztic2     !   -      -
+      REAL(wp), POINTER, DIMENSION(:,:)  ::   zui_u , zvi_v , zsm             ! 2D workspace
+      REAL(wp), POINTER, DIMENSION(:,:)  ::   zs0ice, zs0sn , zs0a            !  -      -
+      REAL(wp), POINTER, DIMENSION(:,:)  ::   zs0c0 , zs0c1 , zs0c2 , zs0st   !  -      -
       !---------------------------------------------------------------------
 
-      IF( wrk_in_use(2, 1,2,3,4,5,6,7,8,9,10) ) THEN
-         CALL ctl_stop('lim_trp_2 : requested workspace arrays unavailable')   ;   RETURN
-      ENDIF
+      CALL wrk_alloc( jpi, jpj, zui_u , zvi_v , zsm, zs0ice, zs0sn , zs0a, zs0c0 , zs0c1 , zs0c2 , zs0st )
 
       IF( kt == nit000  )   CALL lim_trp_init_2      ! Initialization (first time-step only)
@@ -273,5 +269,5 @@
       ENDIF
       !
-      IF( wrk_not_released(2, 1,2,3,4,5,6,7,8,9,10) )   CALL ctl_stop('lim_trp_2 : failed to release workspace arrays')
+      CALL wrk_dealloc( jpi, jpj, zui_u , zvi_v , zsm, zs0ice, zs0sn , zs0a, zs0c0 , zs0c1 , zs0c2 , zs0st )
       !
    END SUBROUTINE lim_trp_2
Index: branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limwri_2.F90
===================================================================
--- branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limwri_2.F90	(revision 3144)
+++ branches/2011/dev_NEMO_MERGE_2011/NEMOGCM/NEMO/LIM_SRC_2/limwri_2.F90	(revision 3145)
@@ -30,4 +30,5 @@
    USE in_out_manager
    USE lib_mpp         ! MPP library
+   USE wrk_nemo_2      ! work arrays
    USE iom
    USE ioipsl
@@ -100,7 +101,4 @@
       !!      of a day
       !!-------------------------------------------------------------------
-      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
-      USE wrk_nemo, ONLY: zfield => wrk_2d_1
-      !!
       INTEGER, INTENT(in) ::   kt     ! number of iteration
       !!
@@ -110,9 +108,8 @@
          &          zindh, zinda, zindb, ztmu
       REAL(wp), DIMENSION(1)                ::   zdept
-      !!-------------------------------------------------------------------
-
-      IF( wrk_in_use(2, 1) ) THEN
-         CALL ctl_stop('lim_wri_2 : requested workspace array unavailable')   ;   RETURN
-      ENDIF
+      REAL(wp), POINTER, DIMENSION(:,:)     ::   zfield
+      !!-------------------------------------------------------------------
+
+      CALL wrk_alloc( jpi, jpj, zfield )
                                                  !--------------------!
       IF( kt == nit000 ) THEN                    !   Initialisation   !
@@ -207,5 +204,5 @@
       IF( ( nn_fsbc * niter ) >= nitend )   CALL histclo( nice ) 
 
-      IF( wrk_not_released(2, 1) )   CALL ctl_stop('lim_wri_2 : failed to release workspace array.')
+      CALL wrk_dealloc( jpi, jpj, zfield )
       !
    END SUBROUTINE lim_wri_2
