diff --git a/.gitignore b/.gitignore
index 80e3c4b27..8a21e3b72 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,7 @@ jnq*
 *.txt
 *.bak
 !**/CMakeLists.txt
+!**/*.txt
 __pycache__
 cmake-build-debug
 cmake-build-release
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 78f332876..874302e6f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -898,6 +898,7 @@ message (STATUS "hamlib_LIBRARY_DIRS: ${hamlib_LIBRARY_DIRS}")
 
 set (CMAKE_REQUIRED_INCLUDES "${hamlib_INCLUDE_DIRS}")
 set (CMAKE_REQUIRED_LIBRARIES "${hamlib_LIBRARIES}")
+check_symbol_exists (CACHE_ALL "hamlib/rig.h" HAVE_HAMLIB_OLD_CACHING)
 check_symbol_exists (rig_set_cache_timeout_ms "hamlib/rig.h" HAVE_HAMLIB_CACHING)
 
 
@@ -1695,6 +1696,7 @@ if (NOT is_debug_build)
 	PATTERN "*quick*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE
 	PATTERN "*webgl*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE
 	PATTERN "*_debug${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE
+	PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}.dSYM" EXCLUDE
 	)
       install (
 	FILES
diff --git a/Darwin/sysctl.conf b/Darwin/sysctl.conf
index 830bba803..4d6cf69e0 100644
--- a/Darwin/sysctl.conf
+++ b/Darwin/sysctl.conf
@@ -1,6 +1,5 @@
-kern.sysv.shmmax=14680064
+kern.sysv.shmmax=104857600
 kern.sysv.shmmin=1
 kern.sysv.shmmni=128
 kern.sysv.shmseg=32
-kern.sysv.shmall=17920
-
+kern.sysv.shmall=25600
diff --git a/Network/PSKReporter.cpp b/Network/PSKReporter.cpp
index fcdebf2c5..8c8d7948d 100644
--- a/Network/PSKReporter.cpp
+++ b/Network/PSKReporter.cpp
@@ -145,8 +145,10 @@ public:
 
 #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
     connect (socket_.get (), &QAbstractSocket::errorOccurred, this, &PSKReporter::impl::handle_socket_error);
-#else
+#elif QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
     connect (socket_.data (), QOverload<QAbstractSocket::SocketError>::of (&QAbstractSocket::error), this, &PSKReporter::impl::handle_socket_error);
+#else
+    connect (socket_.data (), static_cast<void (QAbstractSocket::*) (QAbstractSocket::SocketError)> (&QAbstractSocket::error), this, &PSKReporter::impl::handle_socket_error);
 #endif
 
     // use this for pseudo connection with UDP, allows us to use
diff --git a/Transceiver/HamlibTransceiver.cpp b/Transceiver/HamlibTransceiver.cpp
index a2674a58f..67fc36dc3 100644
--- a/Transceiver/HamlibTransceiver.cpp
+++ b/Transceiver/HamlibTransceiver.cpp
@@ -14,6 +14,10 @@
 
 #include "moc_HamlibTransceiver.cpp"
 
+#if HAVE_HAMLIB_OLD_CACHING
+#define HAMLIB_CACHE_ALL CACHE_ALL
+#endif
+
 namespace
 {
   // Unfortunately bandwidth is conflated  with mode, this is probably
@@ -592,7 +596,7 @@ int HamlibTransceiver::do_start ()
         }
     }
 
-#if HAVE_HAMLIB_CACHING
+#if HAVE_HAMLIB_CACHING || HAVE_HAMLIB_OLD_CACHING
   // we must disable Hamlib caching because it lies about frequency
   // for less than 1 Hz resolution rigs
   auto orig_cache_timeout = rig_get_cache_timeout_ms (rig_.data (), HAMLIB_CACHE_ALL);
@@ -639,7 +643,7 @@ int HamlibTransceiver::do_start ()
       resolution = -1;          // best guess
     }
 
-#if HAVE_HAMLIB_CACHING
+#if HAVE_HAMLIB_CACHING || HAVE_HAMLIB_OLD_CACHING
   // revert Hamlib cache timeout
   rig_set_cache_timeout_ms (rig_.data (), HAMLIB_CACHE_ALL, orig_cache_timeout);
 #endif
diff --git a/doc/building-Boost-libs.txt b/doc/building-Boost-libs.txt
new file mode 100644
index 000000000..9a1dc5b5c
--- /dev/null
+++ b/doc/building-Boost-libs.txt
@@ -0,0 +1,227 @@
+Linux
+=====
+
+sudo apt install libboost-all-dev
+
+
+macOS
+=====
+
+Download the latest Boost sources from here: boost.org
+
+Currently v 1.74.0 - https://dl.bintray.com/boostorg/release/1.74.0/source/boost_1_74_0.tar.bz2
+
+cd ~/Downloads
+curl -L -O https://dl.bintray.com/boostorg/release/1.74.0/source/boost_1_74_0.tar.bz2
+mkdir src
+cd !$
+tar --bzip2 -xf boost_1_74_0.tar.bz2
+cd boost_1_74_0/tools/build
+./bootstrap.sh
+./b2 toolset=clang --prefix=$HOME/local/boost-build install
+cd ../..
+~/local/boost-build/bin/b2 -j8 toolset=clang cflags=-mmacosx-version-min=10.12 \
+   cxxflags=-mmacosx-version-min=10.12 mflags=-mmacosx-version-min=10.12 \
+   mmflags=-mmacosx-version-min=10.12 mflags=-mmacosx-version-min=10.12 \
+   linkflags=-mmacosx-version-min=10.12 \
+   architecture=x86 address-model=64 --prefix=$HOME/local/boost install
+
+That will take a while, once successful (warnings can be ignored) you can clean the build tree to save some space:
+
+~/local/boost-build/bin/b2 toolset=clang cflags=-mmacosx-version-min=10.12 \
+   cxxflags=-mmacosx-version-min=10.12 mflags=-mmacosx-version-min=10.12 \
+   mmflags=-mmacosx-version-min=10.12 mflags=-mmacosx-version-min=10.12 \
+   linkflags=-mmacosx-version-min=10.12 \
+   architecture=x86 address-model=64 --prefix=$HOME/local/boost clean
+
+All that remains is to reconfigure your WSJT-X build trees to include ~/local/boost in your CMAKE_PREFIX_PATH, maybe something like these (one each for Debug and Release configuration builds and assumes the Macports GCC v7 tool-chain is being used):
+
+FC=gfortran-mp-7 \
+   cmake \
+   -D CMAKE_PREFIX_PATH:PATH=~/local/boost\;~/Qt/5.15.0-clang\;~/local/hamlib/release\;/opt/local \
+   -D CMAKE_INSTALL_PREFIX=~/local/wsjtx/release \
+   -D CMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk \
+   -D CMAKE_BUILD_TYPE=Release \
+   -B ~/build/wsjtx-release \
+   ~/src/bitbucket.org/k1jt/wsjtx
+
+FC=gfortran-mp-7 \
+   cmake \
+   -D CMAKE_PREFIX_PATH:PATH=~/local/boost\;~/Qt/5.15.0-clang\;~/local/hamlib/debug\;/opt/local \
+   -D CMAKE_INSTALL_PREFIX=~/local/wsjtx/debug \
+   -D CMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk \
+   -D CMAKE_BUILD_TYPE=Debug \
+   -B ~/build/wsjtx-debug \
+   ~/src/bitbucket.org/k1jt/wsjtx
+
+Substitute you installed SDK version, Qt version and location, and Hamlib install locations.
+
+
+MS Windows
+==========
+
+Because 32-bit and 64-bit builds are possible and each use different
+tool-chains, two separate builds are necessary if both architectures
+are required.
+
+Common steps
+------------
+
+Download and extract the latest Boost library sources, at the time of
+writing that was
+https://dl.bintray.com/boostorg/release/1.74.0/source/boost_1_74_0.7z
+. Extract to some convenient location, I use %HOME%\src .
+
+Download and extract the libbacktrace sources from
+https://github.com/ianlancetaylor/libbacktrace as follows.
+
+cd %HOME%\src
+mkdir github.com
+cd github.com
+mkdir ianlancetaylor
+cd ianlancetaylor
+git clone git@github.com:ianlancetaylor/libbacktrace.git
+
+I install third-party tools under the C:\Tools directory, the
+following assumes that, adjust to taste. Note that it is OK to install
+both 32- and 64-bit builds of Boost to the same path as the library
+names are unique per architecture and tool-chain. This saves a lot of
+space as the boost header files are quite big, and there's no need to
+install multiple copies.
+
+Create a new file %HOME%\src\boost_1_74_0\project-config.jam with the
+following three lines to specify how Boost.Build finds the libbacktrace
+library matched to your relevant C++ compliers:
+
+import toolset ;
+
+using gcc : : C:\\Qt\\Tools\\mingw730_32\\bin\\g++ : <compileflags>-I"C:\\Tools\\libbacktrace-1.0\\MinGW32\\include" <linkflags>-L"C:\\Tools\\libbacktrace-1.0\\MinGW32\\lib" ;
+
+using gcc : 8~64 : C:\\Qt\\Tools\\mingw810_64\\bin\\g++ : <compileflags>-I"C:\\Tools\\libbacktrace-1.0\\MinGW64\\include" <linkflags>-L"C:\\Tools\\libbacktrace-1.0\\MinGW64\\lib" ;
+
+Note that it may need some local adjustment of the C++ compiler
+version and path depending on the exact tool-chains from your Qt
+installation. Above I am using the Qt v5.12.9 MinGW32 v7 tool-chain
+for 32-bit (toolset=gcc), and Qt v5.15.0 MinGW64 v8 tool-chain
+for 64-bit (toolchain=gcc-8~64).
+
+32-bit
+------
+
+Start an MSys or MSys2 shell with the 32-bit C/C++ tool-chain from
+your Qt installation on the PATH environment variable.
+
+cd ~/src/github.com/ianlancetaylor/libbacktrace
+./configure --prefix=/c/Tools/libbacktrace-1.0/MinGW32
+make && make install
+make clean
+
+Start a CMD window suitably configured for use of the 32-bit MinGW
+tool-chain bundled with your Qt binary installation. Verify the
+correct compiler is in the PATH. i.e. it identifies (g++ --version) as
+i686-posix-dwarf-rev0.
+
+cd %HOME%\src\boost_1_74_0\tools\build
+bootstrap.bat
+.\b2 --prefix=C:\Tools\boost-build\MinGW32 install
+cd ..\..
+C:\Tools\boost-build\MinGW32\bin\b2 -j8 toolset=gcc ^
+  --build-dir=%HOME%\build\boost ^
+  --build-type=complete --prefix=C:\Tools\boost install
+
+If all is well you should see the following line about a 1/3 of the
+way through the initial configuration steps.
+
+   - libbacktrace builds      : yes
+
+After some time it should complete with something like:
+
+...failed updating 1574 targets...
+...skipped 1112 targets...
+...updated 3924 targets...
+
+warnings can usually be ignored. If successful; you can release some
+space by cleaning the build tree:
+
+C:\Tools\boost-build\MinGW32\bin\b2 toolset=gcc ^
+  --build-dir=%HOME%\build\boost ^
+  --build-type=complete clean
+
+64-bit
+======
+
+Start an MSys or MSys2 shell with the 64-bit C/C++ tool-chain from
+your Qt installation on the PATH environment variable.
+
+cd ~/src/github.com/ianlancetaylor/libbacktrace
+./configure --prefix=/c/Tools/libbacktrace-1.0/MinGW64
+make && make install
+make clean
+
+Start a CMD window suitably configured for use of the 64-bit MinGW
+tool-chain bundled with your Qt binary installation. Verify the
+correct compiler is in the PATH. i.e. it identifies (g++ --version) as
+x86_64-posix-seh-rev0. Note the toolchain specified must match your
+compilers and the project-config.jam file you created above. With a v7
+64-bit C++ compiler use gcc-7~64, with a v8 64-bit C++ compiler use
+gcc-8~64. My example matches my 64-bit Qt v5.15.0 with the bundled
+MinGW64 v8.1.0.
+
+cd %HOME%\src\boost_1_74_0\tools\build
+bootstrap.bat
+.\b2 --prefix=C:\Tools\boost-build\MinGW64 install
+cd ..\..
+C:\Tools\boost-build\MinGW64\bin\b2 -j8 toolset=gcc-8~64 ^
+  address-model=64 --build-dir=%HOME%\build\boost ^
+  --build-type=complete --prefix=C:\Tools\boost install
+
+If all is well you should see the following line about a 1/3 of the
+way through the initial configuration steps.
+
+   - libbacktrace builds      : yes
+
+After some time it should complete with something like:
+
+...failed updating 108 targets...
+...skipped 32 targets...
+...updated 3648 targets...
+
+warnings can usually be ignored. If successful; you can release some
+space by cleaning the build tree:
+
+C:\Tools\boost-build\MinGW32\bin\b2 toolset=gcc-8~64 ^
+  address-model=64 --build-dir=%HOME%\build\boost ^
+  --build-type=complete clean
+
+Setting up WSJT-X builds
+------------------------
+
+All that remains is to add C:\Tools\boost\ to your 32- and 64-bit
+build configurations CMAKE_PREFIX_PATH variables. I use tool-chain
+files for my WSJT-X builds on Windows, an extract from my 32-bit Debug
+configuration tool-chain file:
+
+# ...
+
+set (BOOSTDIR C:/Tools/boost)
+set (QTDIR C:/Qt/5.12.9/mingw73_32)
+# set (QTDIR C:/Qt/5.15.0/mingw81_32)
+set (FFTWDIR C:/Tools/fftw-3.3.5-dll32)
+set (HAMLIBDIR C:/test-install/hamlib/mingw32/debug)
+set (LIBUSBDIR C:/Tools/libusb-1.0.23)
+set (PYTHONDIR C:/Python27)
+set (ASCIIDOCDIR C:/Tools/asciidoc-master)
+
+# where to find required packages
+set (CMAKE_PREFIX_PATH ${BOOSTDIR} ${QTDIR} ${FFTWDIR} ${HAMLIBDIR} ${HAMLIBDIR}/bin ${LIBUSBDIR} ${PYTHONDIR} ${ASCIIDOCDIR})
+
+# ...
+
+Run-time Environment
+--------------------
+
+You will need to add C:\Tools\boost\lib to your PATH environment
+variable in order to run installed Debug configurations of WSJT-X, or
+to execute build artefacts from a build tree. Installed Release
+configurations will move any required DLLs to the installation bin
+directory automatically.
diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp
index 905c406c7..eb0362a22 100644
--- a/widgets/mainwindow.cpp
+++ b/widgets/mainwindow.cpp
@@ -3020,34 +3020,19 @@ void MainWindow::decode()                                       //decode()
   if( m_diskData ) {
     dec_data.params.lapcqonly=false;
   }
-  m_msec0=QDateTime::currentMSecsSinceEpoch();
   if(!m_dataAvailable or m_TRperiod==0.0) return;
   ui->DecodeButton->setChecked (true);
-  if(!dec_data.params.nagain && m_diskData && (m_TRperiod >= 60.0)) {
+  if(!dec_data.params.nagain && m_diskData && m_TRperiod >= 60.) {
     dec_data.params.nutc=dec_data.params.nutc/100;
   }
   if(dec_data.params.nagain==0 && dec_data.params.newdat==1 && (!m_diskData)) {
-    qint64 nperiods=now.toMSecsSinceEpoch()/(1000.0*m_TRperiod);
-    m_dateTimeSeqStart=QDateTime::fromMSecsSinceEpoch(qint64(1000.0*nperiods*m_TRperiod)).toUTC();
-    qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
-    int imin=ms/60000;
-    int ihr=imin/60;
-    imin=imin % 60;
-    if(m_TRperiod>=60) imin=imin - (imin % (int(m_TRperiod)/60));
-    dec_data.params.nutc=100*ihr + imin;
-    if(m_TRperiod < 60) {
-      qint64 ms=1000.0*(2.0-m_TRperiod);
-      if(m_mode=="FST4") ms=1000.0*(6.0-m_TRperiod);
-      //Adjust for FT8 early decode:
-      if(m_mode=="FT8" and m_ihsym==m_earlyDecode and !m_diskData) ms+=(m_hsymStop-m_earlyDecode)*288;
-      if(m_mode=="FT8" and m_ihsym==m_earlyDecode2 and !m_diskData) ms+=(m_hsymStop-m_earlyDecode2)*288;
-      QDateTime t=QDateTime::currentDateTimeUtc().addMSecs(ms);
-      ihr=t.toString("hh").toInt();
-      imin=t.toString("mm").toInt();
-      int isec=t.toString("ss").toInt();
-      isec=isec - fmod(double(isec),m_TRperiod);
-      dec_data.params.nutc=10000*ihr + 100*imin + isec;
-    }
+    auto t_start = qt_truncate_date_time_to (QDateTime::currentDateTimeUtc (), m_TRperiod * 1.e3);
+    auto t = t_start.time ();
+    dec_data.params.nutc = t.hour () * 100 + t.minute ();
+    if (m_TRperiod < 60.)
+      {
+        dec_data.params.nutc = dec_data.params.nutc * 100 + t.second ();
+      }
   }
 
   if(m_nPick==1 and !m_diskData) {
diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h
index b7c78567f..42741e54a 100644
--- a/widgets/mainwindow.h
+++ b/widgets/mainwindow.h
@@ -402,7 +402,6 @@ private:
   qint64  m_msErase;
   qint64  m_secBandChanged;
   qint64  m_freqMoon;
-  qint64  m_msec0;
   qint64  m_fullFoxCallTime;
 
   Frequency m_freqNominal;
diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui
index 558fefe06..bf80c09ac 100644
--- a/widgets/mainwindow.ui
+++ b/widgets/mainwindow.ui
@@ -2848,7 +2848,6 @@ Yellow when too low</string>
      <string>Mode</string>
     </property>
     <addaction name="actionFST4"/>
-    <addaction name="actionFST4W"/>
     <addaction name="actionFT4"/>
     <addaction name="actionFT8"/>
     <addaction name="actionJT4"/>
@@ -2860,6 +2859,7 @@ Yellow when too low</string>
     <addaction name="actionISCAT"/>
     <addaction name="actionMSK144"/>
     <addaction name="separator"/>
+    <addaction name="actionFST4W"/>
     <addaction name="actionWSPR"/>
     <addaction name="separator"/>
     <addaction name="actionEcho"/>
diff --git a/wsjtx_config.h.in b/wsjtx_config.h.in
index fa41c3e03..ee4213ed7 100644
--- a/wsjtx_config.h.in
+++ b/wsjtx_config.h.in
@@ -19,6 +19,7 @@ extern "C"  {
 #cmakedefine PROJECT_SAMPLES_URL "@PROJECT_SAMPLES_URL@"
 #cmakedefine PROJECT_SUMMARY_DESCRIPTION "@PROJECT_SUMMARY_DESCRIPTION@"
 
+#cmakedefine01 HAVE_HAMLIB_OLD_CACHING
 #cmakedefine01 HAVE_HAMLIB_CACHING
 
 #cmakedefine01 WSJT_SHARED_RUNTIME