diff --git a/lib/fsk4hf/genwsprdpsk.f90 b/lib/fsk4hf/genwsprdpsk.f90
index b74da3d5f..1b6c58b10 100644
--- a/lib/fsk4hf/genwsprdpsk.f90
+++ b/lib/fsk4hf/genwsprdpsk.f90
@@ -56,6 +56,7 @@ write(*,'(232i1)') imsg(1:232)
   do i=2,232
     imsgde(i)=mod(imsgde(i-1)+imsg(i),2)
   enddo
+
 write(*,*) '-------------'
 write(*,'(232i1)') imsgde(1:232)
   return
diff --git a/lib/fsk4hf/wspr5d.f90 b/lib/fsk4hf/wspr5d.f90
index c47a06fa2..8a3c800b8 100644
--- a/lib/fsk4hf/wspr5d.f90
+++ b/lib/fsk4hf/wspr5d.f90
@@ -63,8 +63,8 @@ program wspr5d
   
   open(13,file=trim(data_dir)//'/ALL_WSPR.TXT',status='unknown',   &
        position='append')
-!  maxn=8                                 !Default value
-  maxn=20
+!  maxn=4                                 !Default value
+  maxn=2
   twopi=8.0*atan(1.0)
   fs=NSPS*12000.0/NSPS0                  !Sample rate
   dt=1.0/fs                              !Sample interval (s)
@@ -104,6 +104,7 @@ program wspr5d
      endif
   enddo
 
+write(*,*) 'iarg, nargs ',iarg,nargs
   do ifile=iarg,nargs
      call getarg(ifile,infile)
      open(10,file=infile,status='old',access='stream')
@@ -132,7 +133,6 @@ program wspr5d
      a(1)=-fc1
      a(2:5)=0.
      call twkfreq1(c,NZ,fs,a,c)       !Mix c down by fc1+fc2
-
 ! Find time offset xdt
      amax=0.
      jpk=0
@@ -153,7 +153,6 @@ program wspr5d
            ibb=NZ-1-j
         endif
         z=sum(c(ia:ib)*conjg(csync(iaa:ibb)))
-write(51,*) j/fs,real(z),imag(z)
         if(abs(z).gt.amax) then
            amax=abs(z)
            jpk=j
@@ -188,10 +187,11 @@ jpk=fs*xdt
         max_iterations=40
         ifer=0
         call bpdecode300(llr,apmask,max_iterations,decoded,niterations,cw)
-        if(niterations.lt.0) call osd300(llr,4,decoded,niterations,cw)
+        nhardmin=0
+        if(niterations.lt.0) call osd300(llr,apmask,5,decoded,cw,nhardmin,dmin)
         nbadcrc=0
-        if(niterations.ge.0) call chkcrc10(decoded,nbadcrc)
-        if(niterations.lt.0 .or. nbadcrc.ne.0) ifer=1
+        call chkcrc10(decoded,nbadcrc)
+        if(nbadcrc.ne.0) ifer=1
         if(ifer.eq.0) exit
      enddo                                !Freq dither loop
      message='                      '
@@ -209,9 +209,9 @@ jpk=fs*xdt
         nfdot=0
         write(13,1110) datetime,0,nsnr,xdt,freq,message,nfdot
 1110    format(a11,2i4,f6.2,f12.7,2x,a22,i3)
-        write(*,1112) datetime(8:11),nsnr,xdt,freq,nfdot,message,itry
+        write(*,1112) datetime(8:11),nsnr,xdt,freq,nfdot,message,itry,nhardmin
 !1112    format(a4,i4,f5.1,f11.6,i3,2x,a22,i4)
-1112    format(a4,i4,f8.3,f8.3,i3,2x,a22,i4)
+1112    format(a4,i4,f8.3,f8.3,i3,2x,a22,i4,i4)
      endif
   enddo                                   ! ifile loop
   write(*,1120)
diff --git a/lib/fsk4hf/wspr5d_exp.f90 b/lib/fsk4hf/wspr5d_exp.f90
index 4cb1f6246..6e6667b65 100644
--- a/lib/fsk4hf/wspr5d_exp.f90
+++ b/lib/fsk4hf/wspr5d_exp.f90
@@ -29,7 +29,7 @@ program wspr5d
   complex c(0:NZ-1)                     !Complex waveform
   complex cd(0:NZ-1)                    !Complex waveform
   complex ca(0:NZ-1)                    !Complex waveform
-  complex zz
+  complex zz,zzsum
   real*8 fMHz
   real rxdata(ND),llr(ND)               !Soft symbols
   real pp(32)                       !Shaped pulse for OQPSK
@@ -44,6 +44,7 @@ program wspr5d
   integer*1 idat(7)
   integer*1 decoded(KK),apmask(ND),cw(ND)
   integer*1 hbits(412),bits(13)
+  logical reset
   data ib13/1,1,1,1,1,-1,-1,1,1,-1,1,-1,1/
 
   nargs=iargc()
@@ -131,41 +132,57 @@ program wspr5d
     fb=150.0
     fs400=400.0
     call getfc1(c400,fs400,fa,fb,fc1,xsnr)         !First approx for freq
-!write(*,*) datetime,'initial guess ',fc1
     npeaks=5
     call getfc2(c400,npeaks,fs400,fc1,fpks)      !Refined freq
 
-    do idf=1,npeaks ! consider the top npeak peaks 
-      fc2=fpks(idf)
+!    do idf=1,npeaks ! consider the top npeak peaks 
+    do idf=1,1  ! for genie-aided sync 
+      fc1=125.0 ! genie provided
+      fc2=0.0   ! from the genie
+!      fc2=fpks(idf) 
       call downsample(c400,fc1+fc2,cd)
       s2=sum(cd*conjg(cd))/(16*412)
       cd=cd/sqrt(s2)
-      do is=0,8 ! dt search range is narrow, to save time. 
+      do is=0,0 ! dt search range is zeroed for genie-aided sync 
         idt=is/2
         if( mod(is,2).eq. 1 ) idt=-(is+1)/2 
         xdt=real(22+idt)/22.222 - 1.0
         ca=cshift(cd,22+idt)
-        do iseq=1,3  ! try sequence estimation lengths of 3, 6, and 9 bits.
-          k=1-2*iseq
-          nseq=iseq*3
-          do i=1,408,iseq*4
-            k=k+iseq*2
+        zzsum=0.0
+        do iseq=3,4 
+          if(iseq.eq.4) then
+            k=1-2*3
+            nseq=9
+            istep=3*4
+          else 
+            k=1-2*iseq 
+            nseq=iseq*3
+            istep=iseq*4
+          endif
+          do i=1,408,istep
             j=(i+1)*16
-            call mskseqdet(nseq,ca(j),pp,id(k),softbits,1,phase)
-            hbits(i:i+iseq*4)=bits
-            sbits(i:i+iseq*4)=bits
-
+            if(iseq.eq.4) then
+! phase=-1.18596900
+! For now, average complex corr. coeffs over the entire frame to 
+! estimate phase
+               phase=atan2(imag(zzsum),real(zzsum))
+               k=k+3*2
+               call mskcohdet(nseq,ca(j),pp,id(k),softbits,phase)
+            else
+               k=k+iseq*2
+               call mskseqdet(nseq,ca(j),pp,id(k),softbits,1,zz)
+               zzsum=zzsum+zz
+            endif 
             sbits(i+1)=softbits(1)
             sbits(i+2)=softbits(2)
             if( id(k+1) .ne. 0 ) sbits(i+2)=id(k+1)*25
               sbits(i+3)=softbits(3)
-
             if( iseq .ge. 2 ) then
               sbits(i+5)=softbits(4)
               sbits(i+6)=softbits(5)
             if( id(k+3) .ne. 0 ) sbits(i+6)=id(k+3)*25
               sbits(i+7)=softbits(6)
-              if( iseq .eq. 3 ) then
+              if( iseq .ge. 3 ) then
                 sbits(i+9)=softbits(7)
                 sbits(i+10)=softbits(8)
                 if( id(k+5) .ne. 0 ) sbits(i+10)=id(k+5)*25
@@ -188,18 +205,21 @@ program wspr5d
           rx2av=sum(rxdata*rxdata)/ND
           rxsig=sqrt(rx2av-rxav*rxav)
           rxdata=rxdata/rxsig
-!          sigma=0.84
           sigma=1.20
           llr=2*rxdata/(sigma*sigma)
           apmask=0
           max_iterations=40
+
           ifer=0
-          nbadcrc=0
           call bpdecode300(llr,apmask,max_iterations,decoded,niterations,cw)
 ! niterations will be equal to the Hamming distance between hard received word and the codeword
-          if(niterations.lt.0) call osd300(llr,3,decoded,niterations,cw)
-          if(niterations.ge.0) call chkcrc10(decoded,nbadcrc)
-          if(niterations.lt.0 .or. nbadcrc.ne.0) ifer=1
+          nhardmin=0
+          if(niterations.lt.0) call osd300(llr,apmask,5,decoded,cw,nhardmin,dmin)
+          if(nhardmin.gt.0) niterations=nhardmin 
+          nbadcrc=0
+          call chkcrc10(decoded,nbadcrc)
+          if(nbadcrc.ne.0) ifer=1
+
           if( ifer.eq.0 ) then
             write(cbits,1200) decoded(1:50)
 1200        format(50i1)
@@ -213,9 +233,9 @@ program wspr5d
             nfdot=0
             write(13,1210) datetime,0,nsnr,xdt,freq,message,nfdot
 1210        format(a11,2i4,f6.2,f12.7,2x,a22,i3)
-            write(*,1212) datetime(8:11),nsnr,xdt,freq,nfdot,message,'*',idf,nseq,is,niterations
+            write(*,1212) datetime(8:11),nsnr,xdt,freq,nfdot,message,'*',idf,nseq,is,iseq,niterations
 !1212        format(a4,i4,f5.1,f11.6,i3,2x,a22,a1,i3,i3,i3,i4)
-1212        format(a4,i4,f8.3,f8.3,i3,2x,a22,a1,i3,i3,i3,i4)
+1212        format(a4,i4,f8.3,f8.3,i3,2x,a22,a1,i3,i3,i3,i3,i4)
             goto 888
           endif
         enddo !iseq
@@ -241,7 +261,7 @@ subroutine getmetric(ib,ps,xmet)
   return
 end subroutine getmetric
 
-subroutine mskseqdet(ns,cdat,pp,bsync,softbits,ncoh,phase)
+subroutine mskseqdet(ns,cdat,pp,bsync,softbits,ncoh,zz)
 !
 ! Detect sequences of 3, 6, or 9 bits (ns).
 ! Sync bits are assumed to be known. 
@@ -261,7 +281,7 @@ np=2**ns-1
 idfmax=40
 if( ncoh .eq. 1 ) idfmax=0
 do idf=0,idfmax
-  if( mod(idf,2).eq.1 ) deltaf=idf/2*0.02
+  if( mod(idf,2).eq.0 ) deltaf=idf/2*0.02
   if( mod(idf,2).eq.1 ) deltaf=-(idf+1)/2*0.02
   dphi=twopi*deltaf*dt
   cfac=cmplx(cos(dphi),sin(dphi)) 
@@ -327,7 +347,6 @@ do idf=0,idfmax
       cbest=cideal
       fbest=deltaf
       zz=sum(cdat*conjg(cbest))/1.e3
-      phase=atan2(imag(zz),real(zz))
     endif
   enddo
   if( ibflag .eq. 1 ) then ! new best found
@@ -350,6 +369,29 @@ if( ns .ge. 6 ) then
 endif
 end subroutine mskseqdet
 
+subroutine mskcohdet(ns,cdat,pp,bsync,softbits,phase)
+!
+! Coherent demodulate blocks of 9 bits (ns).
+!
+  complex cdat(16*12),crot(16*12)
+  real pp(32),softbits(9)
+
+  np=2**ns-1
+
+  softbits=0.0
+  crot=cdat*cmplx(cos(phase),-sin(phase))
+  softbits(1)=sum(imag(crot(1:32)*pp))
+  softbits(2)=sum(real(crot(17:48)*pp))
+  softbits(3)=sum(imag(crot(33:64)*pp))
+  softbits(4)=sum(imag(crot(65:96)*pp))
+  softbits(5)=sum(real(crot(81:112)*pp))
+  softbits(6)=sum(imag(crot(97:128)*pp))
+  softbits(7)=sum(imag(crot(129:160)*pp))
+  softbits(8)=sum(real(crot(145:176)*pp))
+  softbits(9)=sum(imag(crot(161:192)*pp))
+  softbits=softbits/64.
+end subroutine mskcohdet
+
 subroutine downsample(ci,f0,co)
   parameter(NI=412*288,NO=NI/18)
   complex ci(0:NI-1),ct(0:NI-1) 
@@ -361,7 +403,8 @@ subroutine downsample(ci,f0,co)
   i0=nint(f0/df)
   co=0.0
   co(0)=ct(i0)
-  b=3.0
+!  b=3.0 !optimized for sequence detection
+  b=6.0
   do i=1,NO/2
      arg=(i*df/b)**2
      filt=exp(-arg)
diff --git a/lib/fsk4hf/wsprdpskd.f90 b/lib/fsk4hf/wsprdpskd.f90
index 15e5665ec..223e2e4fc 100644
--- a/lib/fsk4hf/wsprdpskd.f90
+++ b/lib/fsk4hf/wsprdpskd.f90
@@ -161,8 +161,14 @@ program wsprdpskd
       enddo 
 ! 2-bit differential detection
       do i=1,231
-        sbits(i)=-real(cs(i)*conjg(cs(i-1)))
+!      do i=1,232
+        sbits(i)=-real(cs(i)*conjg(cs(i-1))) !2 symbol dpsk
+!        sbits(i)=real(cs(i-1)) !for coherent dpsk
+!        sbits(i)=real(cs(i))   !for coherent bpsk
       enddo
+!      do i=1,231
+!        sbits3(i)=-sbits(i+1)*sbits(i)  ! for coherent dpsk
+!      enddo
 
 ! detect a differentially encoded block of symbols using the 
 ! Divsalar and Simon approach, except that we estimate only
@@ -170,7 +176,7 @@ program wsprdpskd
 ! by one symbol.
 !
       sbits3=sbits
-goto 100
+!goto 100
       nbit=13  ! number of decoded bits to be derived from nbit+1 symbols
       numseq=2**nbit
       il=(nbit+1)/2
@@ -192,7 +198,8 @@ goto 100
             enddo
             csum=csum+bb*cs(i1+i)
           enddo
-          ps(iseq)=abs(csum)**2
+!          ps(iseq)=abs(csum)**2
+          ps(iseq)=abs(csum)
           if(ps(iseq).gt.rmax) then
             bbest=b
             rmax=ps(iseq)
@@ -291,6 +298,22 @@ subroutine getmetric(ib,ps,ns,xmet)
   return
 end subroutine getmetric
 
+subroutine getmetric3(ib,ps,ns,xmet)
+  real ps(0:ns-1)
+  xm1=0
+  xm0=0
+  do i=0,ns-1
+    if( iand(i/ib,1) .eq. 1 ) then
+      xm1=xm1+ps(i) 
+    endif
+    if( iand(i/ib,1) .eq. 0 ) then
+      xm0=xm0+ps(i) 
+    endif
+  enddo
+  xmet=xm1-xm0
+  return
+end subroutine getmetric3
+
 subroutine dsdpsk(ci,f0,co)
   parameter(NI=240*200,NH=NI/2,NO=NI/20)  ! downsample from 200 samples per symbol to 10
   complex ci(0:NI-1),ct(0:NI-1) 
diff --git a/lib/fsk4hf/wsprdpsksim.f90 b/lib/fsk4hf/wsprdpsksim.f90
index 80f7dff13..fa5e34e4d 100644
--- a/lib/fsk4hf/wsprdpsksim.f90
+++ b/lib/fsk4hf/wsprdpsksim.f90
@@ -144,6 +144,8 @@ write(*,*) 'sample SNR: ',10*log10(snrtest)+10*log10(0.4/2.5)
      call four2a(c0wav,NMAX,1,-1,1)
      xx=sum(abs(c0wav(istart:istart+NN*200*NDOWN-1))**2)/(NN*200*NDOWN)
      c0wav=c0wav/sqrt(xx)
+write(*,*) 'Peak power: ',maxval(abs(c0wav)**2)
+write(*,*) 'Average power: ',sum(abs(c0wav(istart:istart+NN*200*NDOWN-1))**2)/(NN*200*NDOWN)
      call sgran()
      do ifile=1,nfiles
        cwav=c0wav