diff --git a/ROMS/Nonlinear/lmd_vmix.F b/ROMS/Nonlinear/lmd_vmix.F
index 694f75d..be56e1c 100644
--- a/ROMS/Nonlinear/lmd_vmix.F
+++ b/ROMS/Nonlinear/lmd_vmix.F
@@ -37,6 +37,7 @@
       USE mod_grid
       USE mod_mixing
       USE mod_ocean
+      USE mod_scalars
       USE mod_stepping
 !
 # ifdef LMD_SKPP
@@ -57,7 +58,8 @@
 # ifdef PROFILE
       CALL wclock_on (ng, iNLM, 18)
 # endif
-      CALL lmd_vmix_tile (ng, tile,                                     &
+      IF (.not.PerfectRST(ng).or.iic(ng).ne.ntstart(ng)) THEN
+        CALL lmd_vmix_tile (ng, tile,                                   &
      &                    LBi, UBi, LBj, UBj,                           &
      &                    IminS, ImaxS, JminS, JmaxS,                   &
      &                    nstp(ng),                                     &
@@ -76,12 +78,13 @@
      &                    MIXING(ng) % Akt,                             &
      &                    MIXING(ng) % Akv)
 # ifdef LMD_SKPP
-      CALL lmd_skpp (ng, tile)
+        CALL lmd_skpp (ng, tile)
 # endif
 # ifdef LMD_BKPP
-      CALL lmd_bkpp (ng, tile)
+        CALL lmd_bkpp (ng, tile)
 # endif
-      CALL lmd_finish (ng, tile)
+        CALL lmd_finish (ng, tile)
+      END IF
 # ifdef PROFILE
       CALL wclock_off (ng, iNLM, 18)
 # endif
diff --git a/ROMS/Utility/checkvars.F b/ROMS/Utility/checkvars.F
index 033aafa..3b37251 100644
--- a/ROMS/Utility/checkvars.F
+++ b/ROMS/Utility/checkvars.F
@@ -327,6 +327,20 @@
           have_var(idTdif)=.TRUE.
         ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idSdif))) THEN
           have_var(idSdif)=.TRUE.
+#  ifdef LMD_SKPP
+        ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idHsbl))) THEN
+          have_var(idHsbl)=.TRUE.
+#  endif
+#  ifdef LMD_BKPP
+        ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idHbbl))) THEN
+          have_var(idHbbl)=.TRUE.
+#  endif
+#  ifdef LMD_NONLOCAL
+        ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idGhat(itemp)))) THEN
+          have_var(idGhat(itemp))=.TRUE.
+        ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idGhat(isalt)))) THEN
+          have_var(idGhat(isalt))=.TRUE.
+#  endif
 # endif
 # if defined GLS_MIXING || defined MY25_MIXING
         ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idMtke))) THEN
diff --git a/ROMS/Utility/def_rst.F b/ROMS/Utility/def_rst.F
index 7768fed..a0ebc7f 100644
--- a/ROMS/Utility/def_rst.F
+++ b/ROMS/Utility/def_rst.F
@@ -1008,7 +1008,7 @@
         Vinfo(22)='coordinates'
         Aval(5)=REAL(Iinfo(1,idHsbl,ng),r8)
         status=def_var(ng, iNLM, RST(ng)%ncid, RST(ng)%Vid(idHsbl),     &
-     &                 NF_FRST, nvd3, t2dgrd, Aval, Vinfo, ncname)
+     &                 NF_FRST, nvd3, sr2dgrd, Aval, Vinfo, ncname)
         IF (exit_flag.ne.NoError) RETURN
 # endif
 
@@ -1032,9 +1032,30 @@
         Vinfo(22)='coordinates'
         Aval(5)=REAL(Iinfo(1,idHbbl,ng),r8)
         status=def_var(ng, iNLM, RST(ng)%ncid, RST(ng)%Vid(idHbbl),     &
-     &                 NF_FRST, nvd3, t2dgrd, Aval, Vinfo, ncname)
+     &                 NF_FRST, nvd3, sr2dgrd, Aval, Vinfo, ncname)
         IF (exit_flag.ne.NoError) RETURN
 # endif
+# if defined PERFECT_RESTART && defined LMD_NONLOCAL
+!
+!  Define out KPP nonlocal transport.
+!
+        DO itrc=1,NAT
+          Vinfo( 1)=Vname(1,idGhat(itrc))
+          Vinfo( 2)=Vname(2,idGhat(itrc))
+          Vinfo( 3)=Vname(3,idGhat(itrc))
+          Vinfo(14)=Vname(4,idGhat(itrc))
+          Vinfo(16)=Vname(1,idtime)
+#  if defined WRITE_WATER && defined MASKING
+          Vinfo(20)='mask_rho'
+#  endif
+          Vinfo(22)='coordinates'
+          Aval(5)=REAL(Iinfo(1,idGhat(itrc),ng),r8)
+          status=def_var(ng, iNLM, RST(ng)%ncid,                        &
+     &                     RST(ng)%Vid(idGhat(itrc)), NF_FRST,          &
+     &                     nvd4, w3dgrd, Aval, Vinfo, ncname)
+          IF (exit_flag.ne.NoError) RETURN
+        END DO
+# endif
 # if defined BVF_MIXING || defined LMD_MIXING || \
      defined GLS_MIXING || defined MY25_MIXING
 !
@@ -1551,6 +1572,16 @@
             got_var(idHbbl)=.TRUE.
             RST(ng)%Vid(idHbbl)=var_id(i)
 # endif
+# if defined PERFECT_RESTART && defined LMD_NONLOCAL
+          ELSE IF (TRIM(var_name(i)).eq.                                &
+     &             TRIM(Vname(1,idGhat(itemp)))) THEN
+            got_var(idGhat(itemp))=.TRUE.
+            RST(ng)%Vid(idGhat(itemp))=var_id(i)
+          ELSE IF (TRIM(var_name(i)).eq.                                &
+     &             TRIM(Vname(1,idGhat(isalt)))) THEN
+            got_var(idGhat(isalt))=.TRUE.
+            RST(ng)%Vid(idGhat(isalt))=var_id(i)
+# endif
           ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idVvis))) THEN
             got_var(idVvis)=.TRUE.
             RST(ng)%Vid(idVvis)=var_id(i)
diff --git a/ROMS/Utility/get_state.F b/ROMS/Utility/get_state.F
index 97221ff..0c3f8fc 100644
--- a/ROMS/Utility/get_state.F
+++ b/ROMS/Utility/get_state.F
@@ -168,7 +168,7 @@
         Perfect3D=.TRUE.
       END IF
 #endif
-      PerfectRST(ng)=Perfect2d.or.Perfect3d
+      PerfectRST(ng)=Perfect2D.or.Perfect3D
 !
 !  Determine variables to read.
 !
@@ -441,12 +441,12 @@
         IF (get_var(idFsur)) THEN
           foundit=find_string(var_name, n_var, TRIM(Vname(1,idFsur)),   &
      &                        varid)
-          IF (Perfect2d) THEN
+          IF (Perfect2D) THEN
             gtype=var_flag(varid)*r3dvar
           ELSE
             gtype=var_flag(varid)*r2dvar
           END IF
-          IF (Perfect2d) THEN
+          IF (Perfect2D) THEN
             status=nf_fread3d(ng, IDmod, ncname, ncINPid,               &
      &                        Vname(1,idFsur), varid,                   &
      &                        InpRec, gtype, Vsize,                     &
@@ -970,6 +970,104 @@
         END IF
 #   endif
 #  endif
+#  if defined LMD_SKPP
+!
+!  Read in Hsbl
+!
+        IF (have_var(idHsbl).and.Perfect3D) THEN
+          foundit=find_string(var_name, n_var, TRIM(Vname(1,idHsbl)),   &
+     &                        varid)
+          gtype=var_flag(varid)*r2dvar
+          status=nf_fread2d(ng, IDmod, ncname, ncINPid,                 &
+     &                      Vname(1,idHsbl), varid,                     &
+     &                      InpRec, gtype, Vsize,                       &
+     &                      LBi, UBi, LBj, UBj,                         &
+     &                      Fscl, Fmin, Fmax,                           &
+# ifdef MASKING
+     &                      GRID(ng) % rmask,                           &
+# endif
+     &                      MIXING(ng) % Hsbl)
+          IF (status.ne.nf90_noerr) THEN
+            IF (Master) THEN
+              WRITE (stdout,60) string, TRIM(Vname(1,idHsbl)), InpRec,  &
+     &                          TRIM(ncname)
+            END IF
+            exit_flag=2
+            ioerror=status
+            RETURN
+          ELSE
+            IF (Master) THEN
+              WRITE (stdout,70) TRIM(Vname(2,idHsbl)), Fmin, Fmax
+            END IF
+          END IF
+        END IF
+#  endif
+#  if defined LMD_BKPP
+!
+!  Read in Hbbl
+!
+        IF (have_var(idHbbl).and.Perfect3D) THEN
+          foundit=find_string(var_name, n_var, TRIM(Vname(1,idHbbl)),   &
+     &                        varid)
+          gtype=var_flag(varid)*r2dvar
+          status=nf_fread2d(ng, IDmod, ncname, ncINPid,                 &
+     &                      Vname(1,idHbbl), varid,                     &
+     &                      InpRec, gtype, Vsize,                       &
+     &                      LBi, UBi, LBj, UBj,                         &
+     &                      Fscl, Fmin, Fmax,                           &
+# ifdef MASKING
+     &                      GRID(ng) % rmask,                           &
+# endif
+     &                      MIXING(ng) % Hbbl)
+          IF (status.ne.nf90_noerr) THEN
+            IF (Master) THEN
+              WRITE (stdout,60) string, TRIM(Vname(1,idHbbl)), InpRec,  &
+     &                          TRIM(ncname)
+            END IF
+            exit_flag=2
+            ioerror=status
+            RETURN
+          ELSE
+            IF (Master) THEN
+              WRITE (stdout,70) TRIM(Vname(2,idHbbl)), Fmin, Fmax
+            END IF
+          END IF
+        END IF
+#  endif
+#  if defined LMD_NONLOCAL && defined PERFECT_RESTART
+!
+!  Read in Ghats
+!
+      DO itrc=1,NAT
+        IF (have_var(idGhat(itrc))) THEN
+          foundit=find_string(var_name, n_var,                          &
+     &                        TRIM(Vname(1,idGhat(itrc))), varid)
+          gtype=var_flag(varid)*w3dvar
+          status=nf_fread3d(ng, IDmod, ncname, ncINPid,                 &
+     &                      Vname(1,idGhat(itrc)), varid,                     &
+     &                      InpRec, gtype, Vsize,                       &
+     &                      LBi, UBi, LBj, UBj, 0, N(ng),               &
+     &                      Fscl, Fmin,Fmax,                            &
+#   ifdef MASKING
+     &                      GRID(ng) % rmask,                           &
+#   endif
+     &                      MIXING(ng) % Ghats(:,:,:,itrc))
+          IF (status.ne.nf90_noerr) THEN
+            IF (Master) THEN
+              WRITE (stdout,60) string, TRIM(Vname(1,idGhat(itrc))),  &
+     &                          InpRec, TRIM(ncname)
+            END IF
+            exit_flag=2
+            ioerror=status
+            RETURN
+          ELSE
+            IF (Master) THEN
+              WRITE (stdout,70) TRIM(Vname(2,idGhat(itrc))), Fmin, Fmax
+            END IF
+          END IF
+        END IF
+      END DO
+#  endif
 #  if defined GLS_MIXING || defined MY25_MIXING
 !
 !  Read in turbulent kinetic energy.
diff --git a/ROMS/Utility/wrt_rst.F b/ROMS/Utility/wrt_rst.F
index 8b4045a..6272b9b 100644
--- a/ROMS/Utility/wrt_rst.F
+++ b/ROMS/Utility/wrt_rst.F
@@ -593,6 +593,31 @@
         RETURN
       END IF
 # endif
+# if defined PERFECT_RESTART && defined LMD_NONLOCAL
+!
+!  Write out KPP nonlocal transport.
+!
+      DO i=1,NAT
+        scale=1.0_r8
+        gtype=gfactor*w3dvar
+        status=nf_fwrite3d(ng, iNLM, RST(ng)%ncid,                      &
+     &                       RST(ng)%Vid(idGhat(i)),                    &
+     &                       RST(ng)%Rindex, gtype,                     &
+     &                       LBi, UBi, LBj, UBj, 0, N(ng), scale,       &
+#  ifdef MASKING
+     &                       GRID(ng) % rmask_io,                       &
+#  endif
+     &                       MIXING(ng) % ghats(:,:,:,i))
+        IF (status.ne.nf90_noerr) THEN
+          IF (Master) THEN
+            WRITE (stdout,10) TRIM(Vname(1,idGhat(i))), RST(ng)%Rindex
+          END IF
+          exit_flag=3
+          ioerror=status
+          RETURN
+        END IF
+      END DO
+# endif
 # if defined BVF_MIXING  || defined GLS_MIXING || \
      defined MY25_MIXING || defined LMD_MIXING
 !
