diff --git a/lib/count4.f90 b/lib/count4.f90
new file mode 100644
index 000000000..3c8c5ddcb
--- /dev/null
+++ b/lib/count4.f90
@@ -0,0 +1,54 @@
+program count4
+
+  parameter(NMAX=1000)
+  character*47 line
+  real snr(NMAX)
+  real dt(NMAX)
+  real f(NMAX)
+
+  open(10,file='/users/joe/appdata/local/wsjt-x/all.txt',status='old')
+
+  read(10,1000,end=10) line
+1000 format(a47)
+
+  nsync1=0
+  nsync2=0
+  n1=0
+  n2=0
+  nerr=0
+
+  do i=1,99999
+     read(10,1000,end=10) line
+     if(line(47:47).ne.' ') cycle                !Skip average decodes
+     if(line(20:20).eq.'*') nsync1=nsync1+1
+     if(line(20:20).eq.'#') nsync2=nsync2+1
+     if(line(22:34).eq.'CQ K1ABC FN42') then
+        n2=n2+1                                  !Correlation decode
+        read(line,1002) snr(n2),dt(n2),f(n2)
+1002    format(4x,f4.0,f5.2,f5.0)
+        if(line(42:42).eq.'*') n1=n1+1           !Convolutional decode
+     else
+        if(line(22:34).ne.'             ') nerr=nerr+1
+     endif
+  enddo
+
+10 call stats(snr,n2,snrave,snrdev)
+  call stats(dt,n2,dtave,dtdev)
+  call stats(f,n2,fave,fdev)
+
+write(*,1010) nsync1,nsync2,n1,n2,nerr,snrave,dtave,fave,snrdev,dtdev,fdev
+1010 format(5i5,f7.1,f7.2,f7.0/25x,f7.1,f7.2,f7.0)
+
+end program count4
+
+subroutine stats(x,nz,ave,rms)
+  real x(nz)
+
+  ave=0.
+  rms=0.
+  if(nz.gt.0) ave=sum(x)/nz
+  x=x-ave
+  if(nz.gt.1) rms=sqrt(dot_product(x,x)/(nz-1))
+
+  return
+end subroutine stats