Index: branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90
===================================================================
--- branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90	(revision 10181)
+++ branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90	(revision 10276)
@@ -22,4 +22,5 @@
    USE obs_read_surf            ! Reading and allocation of surface obs
    USE obs_readmdt              ! Reading and allocation of MDT for SLA.
+   USE obs_readsnowdepth        ! Get model snow depth for conversion of freeboard to ice thickness.
    USE obs_prep                 ! Preparation of obs. (grid search etc).
    USE obs_oper                 ! Observation operators
@@ -98,4 +99,5 @@
       & surfdata, &          !: Initial surface data
       & surfdataqc           !: Surface data after quality control
+      
    TYPE(obs_prof), PUBLIC, POINTER, DIMENSION(:) :: &
       & profdata, &          !: Initial profile data
@@ -134,5 +136,8 @@
       !!        !  15-02  (M. Martin) Simplification of namelist and code
       !!----------------------------------------------------------------------
-
+#if defined key_cice
+      USE sbc_oce, ONLY : &        ! CICE variables
+         & thick_s                 ! snow depth for freeboard conversion       
+#endif         
       IMPLICIT NONE
 
@@ -831,4 +836,5 @@
             nextrsurf(jtype) = 0
             IF ( TRIM(cobstypessurf(jtype)) == 'sla' ) nextrsurf(jtype) = 2
+            IF ( TRIM(cobstypessurf(jtype)) == 'sit' ) nextrsurf(jtype) = 2            
 
             !Read in surface obs types
@@ -844,4 +850,8 @@
                IF ( ln_altbias ) &
                   & CALL obs_rea_altbias ( surfdataqc(jtype), n2dintsurf(jtype), cn_altbiasfile )
+            ENDIF
+            
+            IF ( TRIM(cobstypessurf(jtype)) == 'sit' ) THEN
+               CALL obs_rea_snowdepth( surfdataqc(jtype), n2dintsurf(jtype), thick_s(:,:) )
             ENDIF
 
@@ -1251,5 +1261,4 @@
                ELSE            
 #if defined key_cice
-               ! Will need to convert freeboard to thickness here
                   zsurfvar(:,:) = thick_i(:,:)
 #elif defined key_lim2 || defined key_lim3
@@ -1533,7 +1542,12 @@
                &               nit000, idaystp, zsurfvar, zsurfmask,    &
                &               n2dintsurf(jtype), llnightav(jtype),     &
-               &               ravglamscl(jtype), ravgphiscl(jtype),     &
+               &               ravglamscl(jtype), ravgphiscl(jtype),    &
                &               lfpindegs(jtype) )
 
+            ! Change label of data from FBD ("freeboard") to SIT ("Sea Ice Thickness")
+            IF ( TRIM(surfdataqc(jtype)%cvars(1)) == 'FBD' ) THEN
+              surfdata(jtype)%cvars(1) = 'SIT' 
+            ENDIF
+            
          END DO
 
Index: branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/OPA_SRC/OBS/obs_oper.F90
===================================================================
--- branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/OPA_SRC/OBS/obs_oper.F90	(revision 10181)
+++ branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/OPA_SRC/OBS/obs_oper.F90	(revision 10276)
@@ -37,5 +37,8 @@
    USE obs_grid,      ONLY : & 
       & obs_level_search     
-
+#if defined key_cice
+   USE ice_constants, ONLY : &    ! For conversion from sea ice freeboard to thickness
+      & rhos, rhoi, rhow
+#endif 
    IMPLICIT NONE
 
@@ -798,4 +801,13 @@
          ENDIF
          
+         IF ( TRIM(surfdataqc%cvars(1)) == 'FBD' ) THEN
+            ! Convert radar freeboard to true freeboard (add 1/4 snow depth; 1/4 based on ratio of speed of light in vacuum compared to snow (3.0e8 vs 2.4e8 m/s))
+            surfdataqc%rext(jobs,1) = surfdataqc%robs(jobs,1)            
+            surfdataqc%robs(jobs,1) = surfdataqc%rext(jobs,1) + 0.25*surfdataqc%rext(jobs,2)
+            ! Convert corrected freeboard to ice thickness following Tilling et al. (2016)
+            surfdataqc%robs(jobs,1) = (surfdataqc%robs(jobs,1)*rhow + surfdataqc%rext(jobs,2)*rhos)/ &
+                                      (rhow - rhoi)            
+         ENDIF
+         
          IF ( zext(1) == obfillflt ) THEN
             ! If the observation value is a fill value, set QC flag to bad
Index: branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_surf.F90
===================================================================
--- branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_surf.F90	(revision 10181)
+++ branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_surf.F90	(revision 10276)
@@ -369,4 +369,8 @@
          surfdata%cext(2) = 'MDT'
       ENDIF
+      IF ( ldmod .AND. ( TRIM( surfdata%cvars(1) ) == 'FBD' ) ) THEN
+         surfdata%cext(1) = 'freeboard'
+         surfdata%cext(2) = 'thick_s'
+      ENDIF
       IF ( iextr > kextr ) surfdata%cext(iextr) = 'STD'
 
@@ -450,4 +454,8 @@
                ! Observed value
                surfdata%robs(iobs,1) = inpfiles(jj)%pob(1,ji,1)
+               IF ( TRIM(surfdata%cvars(1)) == 'FBD' ) THEN
+                   surfdata%rext(iobs,1) = inpfiles(jj)%pob(1,ji,1)
+                   surfdata%rext(iobs,2) = fbrmdi
+               ENDIF               
 
                ! Model and MDT is set to fbrmdi unless read from file
Index: branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/OPA_SRC/OBS/obs_readsnowdepth.F90
===================================================================
--- branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/OPA_SRC/OBS/obs_readsnowdepth.F90	(revision 10276)
+++ branches/UKMO/dev_r5518_obs_oper_update_icethick/NEMOGCM/NEMO/OPA_SRC/OBS/obs_readsnowdepth.F90	(revision 10276)
@@ -0,0 +1,152 @@
+MODULE obs_readsnowdepth
+   !!======================================================================
+   !!                       ***  MODULE obs_readsnowdepth  ***
+   !! Observation diagnostics: Get the snow depth for freeboard conversion to thickness
+   !!======================================================================
+   !! History :      ! 2018-10 (E. Fiedler) Initial version
+   !!----------------------------------------------------------------------
+
+   !!----------------------------------------------------------------------
+   !!   obs_rea_snowdepth    : Driver for reading MDT
+   !!----------------------------------------------------------------------
+   USE wrk_nemo         ! Memory Allocation
+   USE par_kind         ! Precision variables
+   USE par_oce          ! Domain parameters
+   USE in_out_manager   ! I/O manager
+   USE obs_surf_def     ! Surface observation definitions
+   USE obs_inter_sup    ! Interpolation support routines
+   USE obs_inter_h2d    ! 2D interpolation
+   USE obs_utils        ! Various observation tools
+   USE iom_nf90         ! IOM NetCDF
+   USE netcdf           ! NetCDF library
+   USE lib_mpp          ! MPP library
+   USE dom_oce, ONLY : &                  ! Domain variables
+      &                    tmask, tmask_i, e1t, e2t, gphit, glamt
+   USE obs_const, ONLY :   obfillflt      ! Fillvalue
+   USE oce      , ONLY :   sshn           ! Model variables
+
+
+
+   IMPLICIT NONE
+   PRIVATE
+   
+   PUBLIC   obs_rea_snowdepth     ! called by dia_obs
+
+   !!----------------------------------------------------------------------
+   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
+   !! $Id$
+   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
+   !!----------------------------------------------------------------------
+CONTAINS
+
+   SUBROUTINE obs_rea_snowdepth( fbddata, k2dint, thick_s )
+      !!---------------------------------------------------------------------
+      !!
+      !!                   *** ROUTINE obs_rea_snowdepth ***
+      !!
+      !! ** Purpose : Get snowdepth from CICE
+      !!
+      !! ** Method  : 
+      !!
+      !! ** Action  : 
+      !!----------------------------------------------------------------------
+      USE iom
+      !
+      TYPE(obs_surf), INTENT(inout)  ::   fbddata   ! Sea ice freeboard data
+      INTEGER       , INTENT(in)     ::   k2dint    ! ?
+      REAL(wp), INTENT(IN), DIMENSION(jpi,jpj) :: thick_s ! Model snow depth
+     
+      CHARACTER(LEN=12), PARAMETER ::   cpname  = 'obs_rea_snowdepth'
+
+      INTEGER ::   jobs                ! Obs loop variable
+      INTEGER ::   jpi_thick_s, jpj_thick_s      ! Number of grid point in lat/lon for the snow depth
+      INTEGER ::   iico, ijco          ! Grid point indices
+
+      !
+      REAL(wp), DIMENSION(1)     ::   zext, zobsmask
+      REAL(wp), DIMENSION(2,2,1) ::   zweig
+      !
+      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   zmask, z_thick_s_l, zglam, zgphi
+      INTEGER , DIMENSION(:,:,:), ALLOCATABLE ::   igrdi, igrdj
+      !
+      REAL(wp), POINTER, DIMENSION(:,:) ::  z_thick_s, thick_s_mask
+         
+      REAL(wp) :: zlam, zphi, zfill, zinfill    ! local scalar
+      !!----------------------------------------------------------------------
+
+      CALL wrk_alloc(jpi,jpj,z_thick_s,thick_s_mask) 
+
+      IF(lwp)WRITE(numout,*) 
+      IF(lwp)WRITE(numout,*) ' obs_rea_snowdepth : Get model snow depth for freeboard conversion to sea ice thickness'
+      IF(lwp)WRITE(numout,*) ' ------------- '
+      CALL FLUSH(numout)
+
+      ! Get ice thickness information
+      z_thick_s = thick_s
+
+      ! Setup mask based on tmask
+      thick_s_mask(:,:) = tmask(:,:,1)
+
+      ! Interpolate the snow depth already on the model grid at the observation point
+  
+      ALLOCATE( &
+         & igrdi(2,2,fbddata%nsurf), &
+         & igrdj(2,2,fbddata%nsurf), &
+         & zglam(2,2,fbddata%nsurf), &
+         & zgphi(2,2,fbddata%nsurf), &
+         & zmask(2,2,fbddata%nsurf), &
+         & z_thick_s_l(2,2,fbddata%nsurf)  &
+         & )
+         
+      DO jobs = 1, fbddata%nsurf
+
+         igrdi(1,1,jobs) = fbddata%mi(jobs)-1
+         igrdj(1,1,jobs) = fbddata%mj(jobs)-1
+         igrdi(1,2,jobs) = fbddata%mi(jobs)-1
+         igrdj(1,2,jobs) = fbddata%mj(jobs)
+         igrdi(2,1,jobs) = fbddata%mi(jobs)
+         igrdj(2,1,jobs) = fbddata%mj(jobs)-1
+         igrdi(2,2,jobs) = fbddata%mi(jobs)
+         igrdj(2,2,jobs) = fbddata%mj(jobs)
+
+      END DO
+
+      CALL obs_int_comm_2d( 2, 2, fbddata%nsurf, jpi, jpj, igrdi, igrdj, glamt  , zglam )
+      CALL obs_int_comm_2d( 2, 2, fbddata%nsurf, jpi, jpj, igrdi, igrdj, gphit  , zgphi )
+      CALL obs_int_comm_2d( 2, 2, fbddata%nsurf, jpi, jpj, igrdi, igrdj, thick_s_mask, zmask )
+      CALL obs_int_comm_2d( 2, 2, fbddata%nsurf, jpi, jpj, igrdi, igrdj, z_thick_s  , z_thick_s_l )
+
+      DO jobs = 1, fbddata%nsurf
+            
+         zlam = fbddata%rlam(jobs)
+         zphi = fbddata%rphi(jobs)
+
+         CALL obs_int_h2d_init( 1, 1, k2dint, zlam, zphi,         &
+            &                   zglam(:,:,jobs), zgphi(:,:,jobs), &
+            &                   zmask(:,:,jobs), zweig, zobsmask )
+            
+         CALL obs_int_h2d( 1, 1, zweig, z_thick_s_l(:,:,jobs),  zext )
+ 
+         fbddata%rext(jobs,2) = zext(1)
+
+! mark any masked data with a QC flag
+         IF( zobsmask(1) == 0 )   fbddata%nqc(jobs) = IBSET(fbddata%nqc(jobs),15)
+
+         END DO
+         
+      DEALLOCATE( &
+         & igrdi, &
+         & igrdj, &
+         & zglam, &
+         & zgphi, &
+         & zmask, &
+         & z_thick_s_l  &
+         & )
+
+      CALL wrk_dealloc(jpi,jpj,z_thick_s,thick_s_mask) 
+      IF(lwp)WRITE(numout,*) ' ------------- '
+      !
+   END SUBROUTINE obs_rea_snowdepth
+   
+   !!======================================================================
+END MODULE obs_readsnowdepth
