diff --git a/source/calc_conc.f90 b/source/calc_conc.f90
index 807f527f2aea10b53330d750dbf2e1b030643fcb..e8f74afde824e4c606407510cdbef2a1912b2ee1 100644
--- a/source/calc_conc.f90
+++ b/source/calc_conc.f90
@@ -101,6 +101,8 @@ subroutine calc_conc(config, fluxes, obs, ngrid, gtime, hnest, hbkg, iobs, ix1,
   else
     ! GHG species
     obs%ghg(iobs) = 0.
+    ! ocean contribution only if lognormal is true and inc_ocean is false
+    obs%ocn(iobs) = 0.
   endif
 
   do n = 1, ngrid
@@ -135,6 +137,11 @@ subroutine calc_conc(config, fluxes, obs, ngrid, gtime, hnest, hbkg, iobs, ix1,
         ! no nested domain
         obs%ghg(iobs) = obs%ghg(iobs) + sum(hnest(:,:,n) * fluxes%flx(ix1:ix2,jy1:jy2,ilo))
       endif
+      if ( config%lognormal.and..not.config%inc_ocean ) then
+        ! since for lognormal fluxes are optimized (not offsets) if ocean fluxes are not optimized need
+        ! to still account for influence on mixing ratios
+        obs%ocn(iobs) = obs%ocn(iobs) + sum(hnest(:,:,n) * fluxes%flxocn(:,:,ilo))
+      endif
     endif
   end do ! ngrid
 
diff --git a/source/init_ghg.f90 b/source/init_ghg.f90
index e6f233a4682f1c2e9a644d56aede893eabb1590b..7071bde07257b39e9f346850d3462f7bf36e92d7 100644
--- a/source/init_ghg.f90
+++ b/source/init_ghg.f90
@@ -83,7 +83,7 @@ subroutine init_ghg(files, config, fluxes, obs, states, covar)
   integer                                    :: yyyymmdd, hhmiss
   real                                       :: area
   real(kind=8)                               :: jd
-  integer                                    :: ix, jy, ix0, jy0
+  integer                                    :: ix, jy, ix0, jy0, ix1, ix2, jy1, jy2
   integer                                    :: n, nb, nread, num
   integer                                    :: ierr
   real(kind=8), dimension(:), allocatable    :: jdate
@@ -144,10 +144,22 @@ subroutine init_ghg(files, config, fluxes, obs, states, covar)
     ! flux time stamp is start of time step
     fluxes%time(n) = jd
 
+    ! ocean fluxes for lognormal case when inc_ocean is false
+    ! cover only inversion domain
+    if ( config%lognormal.and..not.config%inc_ocean.and..not.config%nested ) then
+      ! use land-sea mask to set all land fluxes to zero
+      ix1 = int((rllx - llx + dx)/dx)
+      ix2 = int((rurx - llx)/dx)
+      jy1 = int((rlly - lly + dy)/dy)
+      jy2 = int((rury - lly)/dy)
+      fluxes%flxocn(:,:,n) = abs(lsm(:,:) - 1.)*fluxes%flx(ix1:ix2,jy1:jy2,n)
+    endif
+
     jd = jd + dble(statres)
 
   end do
 
+
   ! regional prior fluxes
   ! ---------------------
 
@@ -190,6 +202,12 @@ subroutine init_ghg(files, config, fluxes, obs, states, covar)
       fluxes%flx_nest(:,:,n) = sum(flx,dim=3)/real(nread)
       deallocate( flx )
 
+      ! ocean fluxes for lognormal case when inc_ocean is false
+      if ( config%lognormal.and..not.config%inc_ocean ) then
+        ! use land-sea mask to set all land fluxes to zero
+        fluxes%flxocn(:,:,n) = abs(lsm(:,:) - 1.)*fluxes%flx_nest(:,:,n)
+      endif
+
       jd = jd + dble(statres)
 
     end do
@@ -204,7 +222,6 @@ subroutine init_ghg(files, config, fluxes, obs, states, covar)
 
   endif
 
-
   ! prior state vector
   ! ------------------
 
diff --git a/source/initialize.f90 b/source/initialize.f90
index 6feb5136c9df20d669df8bf3924b377e1e3888c1..5f682a5bc70e325bd6c3239256727c1cfaad863b 100644
--- a/source/initialize.f90
+++ b/source/initialize.f90
@@ -61,6 +61,11 @@ subroutine initialize(files, config)
   ! -------------------
 
   if ( config%restart.eq.1 ) then
+    inquire(file=trim(files%path_output)//trim(files%file_log),exist=lexist)
+    if ( .not.lexist ) then
+      print*, 'ERROR initialize: logfile not found for restart'
+      stop
+    endif
     open(logid,file=trim(files%path_output)//trim(files%file_log),status='old',action='write',access='append',iostat=ierr)
     write(logid,*) 'Picking-up run here...'
   else
diff --git a/source/m1qn3_interface.f90 b/source/m1qn3_interface.f90
index 68ca430cfdc9a341c30f9a3c4bd0e19daf4d2fe3..58f6ea95487581ea7935f9dc8b6e6127127154c5 100644
--- a/source/m1qn3_interface.f90
+++ b/source/m1qn3_interface.f90
@@ -111,7 +111,7 @@ subroutine m1qn3_interface(iter, grad, files, config, fluxes, obs, states, covar
   ndz=6*n+1
   indic=4
   dxmin=1.e-20
-  df1=f
+  df1=0.01d0*f
   epsrel=1.e-10
   nits=maxiter
   nsim=100
@@ -194,12 +194,14 @@ subroutine m1qn3_interface(iter, grad, files, config, fluxes, obs, states, covar
       else
         ! normal
         ! 2Jp = x^Tx (where x = state vector in chi space)
-        cost_p = real(dot_product(x,x),kind=4) 
+        cost_p = real(dot_product(x,x),kind=4)
       endif
       ! J = 0.5*(Jp + Jo) 
       cost = 0.5*(cost_p + cost_o)
       f = cost
       write(aiter,'(I2.2)') iter
+      write(logid,*) 'Cost 2Jo iteration '//aiter//' = ',cost_o
+      write(logid,*) 'Cost 2Jp iteration '//aiter//' = ',cost_p
       write(logid,*) 'Cost iteration '//aiter//': ',cost
       ! save cost in case of a restart
       open(100,file=trim(files%path_output)//'cost.txt',status='unknown',access='append',action='write',iostat=ierr)
diff --git a/source/mod_fluxes.f90 b/source/mod_fluxes.f90
index fcf39182f9d608db81cfcbe955cf9bd0de792cba..c865b49c2363a31367a5fdec2a6fc47bc5b7f27a 100644
--- a/source/mod_fluxes.f90
+++ b/source/mod_fluxes.f90
@@ -127,6 +127,11 @@ module mod_fluxes
         allocate( fluxes%flx_nest(nxregrid,nyregrid,ntstate), stat = ierr )
         if ( ierr.ne.0 ) stop 'ERROR alloc_fluxes: not enough memory'
       endif
+      allocate( fluxes%flxocn(nxregrid,nyregrid,ntstate), stat = ierr )
+      if ( ierr.ne.0 ) then
+        write(logid,*) 'ERROR alloc_fluxes: not enough memory'
+        stop
+      endif
     endif
 
   end subroutine alloc_fluxes
diff --git a/source/mod_save.f90 b/source/mod_save.f90
index 8d139246f636afa1b8d2b18de8a3e093183401b0..f905a85450aa205a9171b8c9ee7e74437f969a79 100644
--- a/source/mod_save.f90
+++ b/source/mod_save.f90
@@ -92,9 +92,16 @@ module mod_save
       do i = 1, nobs
         cinipri = sum(obs%cini(i,:))
         call caldate(obs%jdate(i), jjjjmmdd, hhmiss)
-        write(100,fmt=rowfmt) obs%recs(i), jjjjmmdd, hhmiss, obs%jdate(i), &
-                obs%conc(i), cinipri, obs%cinipos(i), obs%bkg(i), &
-                obs%ghg(i), obs%prior(i), obs%model(i), obs%delta(i), obs%err(i)
+        if ( config%lognormal.and..not.config%inc_ocean ) then
+          ! if ocean grid cells not optimized include ocean contribution in prior and posterior model
+          write(100,fmt=rowfmt) obs%recs(i), jjjjmmdd, hhmiss, obs%jdate(i), &
+                  obs%conc(i), cinipri, obs%cinipos(i), obs%bkg(i), &
+                  obs%ghg(i), obs%prior(i)+obs%ocn(i), obs%model(i)+obs%ocn(i), obs%delta(i), obs%err(i)
+        else
+          write(100,fmt=rowfmt) obs%recs(i), jjjjmmdd, hhmiss, obs%jdate(i), &
+                  obs%conc(i), cinipri, obs%cinipos(i), obs%bkg(i), &
+                  obs%ghg(i), obs%prior(i), obs%model(i), obs%delta(i), obs%err(i)
+        endif
       end do
     endif
 
diff --git a/source/simulate.f90 b/source/simulate.f90
index d67c1a1e3aa183babc60abcafdce6a4eea3dbac5..b31c016fefb0cf30e5367c9bc4655c896f0e1066 100644
--- a/source/simulate.f90
+++ b/source/simulate.f90
@@ -509,8 +509,9 @@ subroutine simulate(iter, files, config, fluxes, obs, states, grad_o, cost_o)
                       obs%conc(i) + obs%bkg(i) + obs%cinipos(i)
     else
       if ( config%lognormal ) then
-        ! optimize scalar of fluxes so no contribution from best guess fluxes (ghg)
-        obs%delta(i) = obs%model(i) - obs%conc(i) + obs%bkg(i) + obs%cinipos(i)
+        ! optimize scalar of fluxes so no contribution from best guess fluxes (ghg) 
+        ! but add ocn contribution (zero if ocean pixels optimized)
+        obs%delta(i) = obs%model(i) - obs%conc(i) + obs%bkg(i) + obs%cinipos(i) + obs%ocn(i)
       else
         ! optimize offsets so account for contribution from best guess fluxes (ghg)
         obs%delta(i) = obs%model(i) + obs%ghg(i) - obs%conc(i) + obs%bkg(i) + obs%cinipos(i)