diff --git a/astro.cpp b/astro.cpp
index c4af0c4a7..6fffb4853 100644
--- a/astro.cpp
+++ b/astro.cpp
@@ -13,24 +13,31 @@
 #include <QDebug>
 
 #include "commons.h"
+#include "Configuration.hpp"
+#include "SettingsGroup.hpp"
 #include "qt_helpers.hpp"
 
 #include "ui_astro.h"
-
 #include "moc_astro.cpp"
 
-Astro::Astro(QSettings * settings, QWidget * parent)
-  : QWidget {parent}
+Astro::Astro(QSettings * settings, Configuration const * configuration, QWidget * parent)
+  : QWidget {parent, Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint}
   , settings_ {settings}
+  , configuration_ {configuration}
   , ui_ {new Ui::Astro}
+  , m_bRxAudioTrack {false}
+  , m_bTxAudioTrack {false}
+  , m_DopplerMethod {0}
+  , m_kHz {0}
+  , m_Hz {0}
+  , m_stepHz {1}
 {
-  ui_->setupUi(this);
-  setWindowFlags (Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint);
-  setWindowTitle(QApplication::applicationName () + " - " + tr ("Astronomical Data"));
+  ui_->setupUi (this);
+  setWindowTitle (QApplication::applicationName () + " - " + tr ("Astronomical Data"));
   setStyleSheet ("QWidget {background: white;}");
+  connect (ui_->cbDopplerTracking, &QAbstractButton::toggled, ui_->doppler_widget, &QWidget::setVisible);
   read_settings ();
-  m_Hz=0;
-  ui_->text_label->clear();
+  ui_->text_label->clear ();
 }
 
 Astro::~Astro ()
@@ -46,10 +53,10 @@ void Astro::closeEvent (QCloseEvent * e)
 
 void Astro::read_settings ()
 {
-  settings_->beginGroup ("Astro");
+  SettingsGroup g (settings_, "Astro");
   restoreGeometry (settings_->value ("geometry", saveGeometry ()).toByteArray ());
-  m_bDopplerTracking=settings_->value("DopplerTracking",false).toBool();
-  ui_->cbDopplerTracking->setChecked(m_bDopplerTracking);
+  ui_->cbDopplerTracking->setChecked (settings_->value ("DopplerTracking",false).toBool ());
+  ui_->doppler_widget->setVisible (ui_->cbDopplerTracking->isChecked ());
   m_DopplerMethod=settings_->value("DopplerMethod",0).toInt();
   if(m_DopplerMethod==0) ui_->rbNoDoppler->setChecked(true);
   if(m_DopplerMethod==1) ui_->rbFullTrack->setChecked(true);
@@ -64,47 +71,48 @@ void Astro::read_settings ()
   m_bTxAudioTrack=settings_->value("TxAudioTrack",false).toBool();
   ui_->cbTxAudioTrack->setChecked(m_bTxAudioTrack);
   move (settings_->value ("window/pos", pos ()).toPoint ());
-  settings_->endGroup ();
 }
 
 void Astro::write_settings ()
 {
-  settings_->beginGroup ("Astro");
+  SettingsGroup g (settings_, "Astro");
   settings_->setValue ("geometry", saveGeometry ());
-  settings_->setValue ("DopplerTracking",m_bDopplerTracking);
+  settings_->setValue ("DopplerTracking", ui_->cbDopplerTracking->isChecked ());
   settings_->setValue ("DopplerMethod",m_DopplerMethod);
   settings_->setValue ("StepHz",m_stepHz);
   settings_->setValue ("kHzAdd",m_kHz);
   settings_->setValue ("RxAudioTrack",m_bRxAudioTrack);
   settings_->setValue ("TxAudioTrack",m_bTxAudioTrack);
   settings_->setValue ("window/pos", pos ());
-  settings_->endGroup ();
 }
 
-void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, qint64 freqMoon,
-                        qint32* ndop, qint32* ndop00, bool bTx, QString jpleph)
+auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const& hisgrid, Frequency freq,
+                        bool dx_is_self, bool bTx) -> FrequencyDelta
 {
+  Frequency freq_moon {freq + 1000 * m_kHz + m_Hz};
   double azsun,elsun,azmoon,elmoon,azmoondx,elmoondx;
   double ramoon,decmoon,dgrd,poloffset,xnr,techo,width1,width2;
   int ntsky;
-  QString date = t.date().toString("yyyy MMM dd").trimmed ();
-  QString utc = t.time().toString().trimmed ();
-  int nyear=t.date().year();
-  int month=t.date().month();
-  int nday=t.date().day();
-  int nhr=t.time().hour();
-  int nmin=t.time().minute();
-  double sec=t.time().second() + 0.001*t.time().msec();
-  double uth=nhr + nmin/60.0 + sec/3600.0;
-  if(freqMoon < 1) freqMoon=144000000;
-  int nfreq=freqMoon/1000000;
-  double freq8=(double)freqMoon;
-
-  QString AzElFileName = QDir::toNativeSeparators(m_azelDir.absoluteFilePath ("azel.dat"));
+  QString date {t.date().toString("yyyy MMM dd").trimmed ()};
+  QString utc {t.time().toString().trimmed ()};
+  int nyear {t.date().year()};
+  int month {t.date().month()};
+  int nday {t.date().day()};
+  int nhr {t.time().hour()};
+  int nmin {t.time().minute()};
+  double sec {t.time().second() + 0.001*t.time().msec()};
+  double uth {nhr + nmin/60.0 + sec/3600.0};
+  if(freq_moon < 1) freq_moon = 144000000;
+  int nfreq {static_cast<int> (freq_moon / 1000000u)};
+  double freq8 {static_cast<double> (freq_moon)};
+  auto const& AzElFileName = QDir::toNativeSeparators (configuration_->azel_directory ().absoluteFilePath ("azel.dat"));
+  auto const& jpleph = configuration_->data_dir ().absoluteFilePath ("JPLEPH");
+  int ndop;
+  int ndop00;
 
   astrosub_(&nyear, &month, &nday, &uth, &freq8, mygrid.toLatin1().constData(),
             hisgrid.toLatin1().constData(), &azsun, &elsun, &azmoon, &elmoon,
-            &azmoondx, &elmoondx, &ntsky, ndop, ndop00, &ramoon, &decmoon,
+            &azmoondx, &elmoondx, &ntsky, &ndop, &ndop00, &ramoon, &decmoon,
             &dgrd, &poloffset, &xnr, &techo, &width1, &width2, &bTx,
             AzElFileName.toLatin1().constData(), jpleph.toLatin1().constData(), 6, 6,
             AzElFileName.length(), jpleph.length());
@@ -120,14 +128,14 @@ void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, qint64 fre
       << qSetRealNumberPrecision (1)
       << "Az:     " << azmoon << "\n"
       "El:     " << elmoon << "\n"
-      "SelfDop:" << *ndop00 << "\n"
+      "SelfDop:" << ndop00 << "\n"
       "Width:  " << int(width1) << "\n"
       << qSetRealNumberPrecision (2)
       << "Delay:  " << techo << "\n"
       << qSetRealNumberPrecision (1)
       << "DxAz:   " << azmoondx << "\n"
       "DxEl:   " << elmoondx << "\n"
-      "DxDop:  " << *ndop << "\n"
+      "DxDop:  " << ndop << "\n"
       "DxWid:  " << int(width2) << "\n"
       "Dec:    " << decmoon << "\n"
       "SunAz:  " << azsun << "\n"
@@ -192,18 +200,40 @@ void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, qint64 fre
   }
   f.close();
   */
-}
 
-void Astro::on_cbDopplerTracking_toggled(bool b)
-{
-  QRect g=this->geometry();
-  if(b) {
-    g.setWidth(430);
-  } else {
-    g.setWidth(200);
+  FrequencyDelta astro_correction {0};
+  //Apply Doppler corrections only for 50 MHz and above
+  if (freq_moon >= 50000000) {
+    if (ui_->cbDopplerTracking->isChecked ()) {
+      switch (m_DopplerMethod)
+        {
+        case 1:
+          // All Doppler correction done here; DX station stays at nominal dial frequency.
+          if(dx_is_self) {
+            astro_correction = m_stepHz*qRound(double(ndop00)/m_stepHz);
+          } else {
+            astro_correction = m_stepHz*qRound(double(ndop)/m_stepHz);
+          }
+          break;
+
+        case 2:
+          // Doppler correction to constant frequency on Moon
+          astro_correction = m_stepHz*qRound(double(ndop00/2.0)/m_stepHz);
+          break;
+        }
+
+      if (bTx) {
+        astro_correction = 1000 * m_kHz + m_Hz - astro_correction;
+      } else {
+        if(dx_is_self && m_DopplerMethod==1) {
+          astro_correction = 1000*m_kHz + m_Hz;
+        } else {
+          astro_correction += 1000*m_kHz + m_Hz;
+        }
+      }
+    }
   }
-  this->setGeometry(g);
-  m_bDopplerTracking=b;
+  return astro_correction;
 }
 
 void Astro::on_rbFullTrack_clicked()
@@ -229,7 +259,6 @@ void Astro::on_rb1Hz_clicked()
 void Astro::on_rb10Hz_clicked()
 {
   m_stepHz=10;
-
 }
 
 void Astro::on_rb100Hz_clicked()
diff --git a/astro.h b/astro.h
index 240aae7f5..843566380 100644
--- a/astro.h
+++ b/astro.h
@@ -3,10 +3,10 @@
 #define ASTRO_H
 
 #include <QWidget>
-#include <QDir>
+#include "Radio.hpp"
 
 class QSettings;
-
+class Configuration;
 namespace Ui {
   class Astro;
 }
@@ -16,31 +16,19 @@ class Astro final
 {
   Q_OBJECT;
 
-private:
-  Q_DISABLE_COPY (Astro);
+  using Frequency = Radio::Frequency;
+  using FrequencyDelta = Radio::FrequencyDelta;
 
 public:
-  explicit Astro(QSettings * settings, QWidget * parent = nullptr);
+  explicit Astro(QSettings * settings, Configuration const *, QWidget * parent = nullptr);
   ~Astro ();
-  void astroUpdate(QDateTime t, QString mygrid, QString hisgrid, qint64 freqMoon,
-                   qint32* ndop, qint32 *ndop00, bool bTx, QString jpleph);
-
-  bool m_bDopplerTracking;
-  bool m_bRxAudioTrack;
-  bool m_bTxAudioTrack;
-
-  qint32 m_DopplerMethod;
-  qint32 m_kHz;
-  qint32 m_Hz;
-  qint32 m_stepHz;
-
-  QDir   m_azelDir;
+  FrequencyDelta astroUpdate(QDateTime const& t, QString const& mygrid, QString const& hisgrid, Frequency frequency,
+                             bool dx_is_self, bool bTx);
 
 protected:
   void closeEvent (QCloseEvent *) override;
 
 private slots:
-  void on_cbDopplerTracking_toggled(bool b);
   void on_rbConstFreqOnMoon_clicked();
   void on_rbFullTrack_clicked();
   void on_rbNoDoppler_clicked();
@@ -56,8 +44,15 @@ private:
   void write_settings ();
 
   QSettings * settings_;
-//  QScopedPointer<Ui::Astro> ui_;
-  Ui::Astro *ui_;
+  Configuration const * configuration_;
+  Ui::Astro * ui_;
+  bool m_bRxAudioTrack;
+  bool m_bTxAudioTrack;
+
+  qint32 m_DopplerMethod;
+  qint32 m_kHz;
+  qint32 m_Hz;
+  qint32 m_stepHz;
 };
 
 extern "C" {
diff --git a/astro.ui b/astro.ui
index a13cb1b82..110e81588 100644
--- a/astro.ui
+++ b/astro.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>400</width>
-    <height>445</height>
+    <width>325</width>
+    <height>339</height>
    </rect>
   </property>
   <property name="sizePolicy">
@@ -16,359 +16,240 @@
     <verstretch>0</verstretch>
    </sizepolicy>
   </property>
-  <property name="minimumSize">
-   <size>
-    <width>200</width>
-    <height>440</height>
-   </size>
-  </property>
-  <property name="styleSheet">
-   <string notr="true"/>
-  </property>
-  <widget class="QLabel" name="text_label">
-   <property name="geometry">
-    <rect>
-     <x>0</x>
-     <y>0</y>
-     <width>201</width>
-     <height>410</height>
-    </rect>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="sizeConstraint">
+    <enum>QLayout::SetFixedSize</enum>
    </property>
-   <property name="sizePolicy">
-    <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
-     <horstretch>0</horstretch>
-     <verstretch>0</verstretch>
-    </sizepolicy>
-   </property>
-   <property name="maximumSize">
-    <size>
-     <width>300</width>
-     <height>16777215</height>
-    </size>
-   </property>
-   <property name="font">
-    <font>
-     <family>Courier</family>
-     <pointsize>14</pointsize>
-     <weight>75</weight>
-     <italic>false</italic>
-     <bold>true</bold>
-    </font>
-   </property>
-   <property name="styleSheet">
-    <string notr="true"/>
-   </property>
-   <property name="frameShadow">
-    <enum>QFrame::Sunken</enum>
-   </property>
-   <property name="text">
-    <string>Astro Data</string>
-   </property>
-   <property name="alignment">
-    <set>Qt::AlignCenter</set>
-   </property>
-   <property name="margin">
-    <number>6</number>
-   </property>
-  </widget>
-  <widget class="QWidget" name="layoutWidget">
-   <property name="geometry">
-    <rect>
-     <x>1</x>
-     <y>410</y>
-     <width>195</width>
-     <height>22</height>
-    </rect>
-   </property>
-   <layout class="QHBoxLayout" name="horizontalLayout">
-    <item>
-     <spacer name="horizontalSpacer">
-      <property name="orientation">
-       <enum>Qt::Horizontal</enum>
-      </property>
-      <property name="sizeHint" stdset="0">
-       <size>
-        <width>40</width>
-        <height>20</height>
-       </size>
-      </property>
-     </spacer>
-    </item>
-    <item>
-     <widget class="QCheckBox" name="cbDopplerTracking">
-      <property name="text">
-       <string>Doppler tracking</string>
-      </property>
-     </widget>
-    </item>
-    <item>
-     <spacer name="horizontalSpacer_2">
-      <property name="orientation">
-       <enum>Qt::Horizontal</enum>
-      </property>
-      <property name="sizeHint" stdset="0">
-       <size>
-        <width>40</width>
-        <height>20</height>
-       </size>
-      </property>
-     </spacer>
-    </item>
-   </layout>
-  </widget>
-  <widget class="QWidget" name="layoutWidget_1">
-   <property name="geometry">
-    <rect>
-     <x>200</x>
-     <y>12</y>
-     <width>198</width>
-     <height>411</height>
-    </rect>
-   </property>
-   <layout class="QVBoxLayout" name="verticalLayout">
-    <item>
-     <widget class="QGroupBox" name="groupBox_4">
-      <property name="minimumSize">
-       <size>
-        <width>196</width>
-        <height>0</height>
-       </size>
-      </property>
-      <property name="maximumSize">
-       <size>
-        <width>16777215</width>
-        <height>60</height>
-       </size>
-      </property>
-      <property name="title">
-       <string>Frequency above nominal band edge</string>
-      </property>
-      <widget class="QSpinBox" name="kHzSpinBox">
-       <property name="geometry">
-        <rect>
-         <x>20</x>
-         <y>20</y>
-         <width>75</width>
-         <height>22</height>
-        </rect>
+   <item row="0" column="0">
+    <layout class="QVBoxLayout" name="verticalLayout_3">
+     <item alignment="Qt::AlignHCenter">
+      <widget class="QLabel" name="text_label">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+         <horstretch>1</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
        </property>
-       <property name="minimumSize">
-        <size>
-         <width>75</width>
-         <height>0</height>
-        </size>
+       <property name="font">
+        <font>
+         <family>Courier</family>
+         <pointsize>12</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="styleSheet">
+        <string notr="true">* {
+	font-family: Courier;
+	font-size: 12pt;
+	font-weight: bold;
+}</string>
+       </property>
+       <property name="frameShadow">
+        <enum>QFrame::Sunken</enum>
+       </property>
+       <property name="text">
+        <string>Astro Data</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignCenter</set>
        </property>
-       <property name="suffix">
-        <string>  kHz</string>
-       </property>
-       <property name="maximum">
-        <number>999</number>
-       </property>
-       <property name="value">
-        <number>200</number>
+       <property name="margin">
+        <number>6</number>
        </property>
       </widget>
-      <widget class="QSpinBox" name="HzSpinBox">
-       <property name="geometry">
-        <rect>
-         <x>100</x>
-         <y>20</y>
-         <width>75</width>
-         <height>22</height>
-        </rect>
-       </property>
-       <property name="minimumSize">
-        <size>
-         <width>75</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="alignment">
-        <set>Qt::AlignCenter</set>
-       </property>
-       <property name="suffix">
-        <string>   Hz</string>
-       </property>
-       <property name="minimum">
-        <number>-2000</number>
-       </property>
-       <property name="maximum">
-        <number>2000</number>
-       </property>
-       <property name="singleStep">
-        <number>100</number>
-       </property>
-      </widget>
-     </widget>
-    </item>
-    <item>
-     <widget class="QGroupBox" name="groupBox">
-      <property name="minimumSize">
-       <size>
-        <width>196</width>
-        <height>0</height>
-       </size>
-      </property>
-      <property name="maximumSize">
-       <size>
-        <width>16777215</width>
-        <height>100</height>
-       </size>
-      </property>
-      <property name="title">
-       <string>Doppler tracking</string>
-      </property>
-      <layout class="QGridLayout" name="gridLayout">
-       <item row="0" column="0">
-        <widget class="QRadioButton" name="rbFullTrack">
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <widget class="QCheckBox" name="cbDopplerTracking">
+         <property name="styleSheet">
+          <string notr="true"/>
+         </property>
          <property name="text">
-          <string>Full Doppler to DX Grid</string>
-         </property>
-         <property name="checked">
-          <bool>true</bool>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="0">
-        <widget class="QRadioButton" name="rbConstFreqOnMoon">
-         <property name="text">
-          <string>Constant frequency on Moon</string>
-         </property>
-         <property name="checked">
-          <bool>false</bool>
-         </property>
-        </widget>
-       </item>
-       <item row="2" column="0">
-        <widget class="QRadioButton" name="rbNoDoppler">
-         <property name="text">
-          <string>None</string>
-         </property>
-         <property name="checked">
-          <bool>false</bool>
+          <string>Doppler tracking</string>
          </property>
         </widget>
        </item>
       </layout>
-     </widget>
-    </item>
-    <item>
-     <widget class="QGroupBox" name="groupBox_2">
-      <property name="minimumSize">
-       <size>
-        <width>196</width>
-        <height>0</height>
-       </size>
+     </item>
+    </layout>
+   </item>
+   <item row="0" column="1">
+    <widget class="QWidget" name="doppler_widget" native="true">
+     <property name="styleSheet">
+      <string notr="true">* {
+	font-weight: normal;
+}</string>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_6">
+      <property name="spacing">
+       <number>7</number>
       </property>
-      <property name="maximumSize">
-       <size>
-        <width>16777215</width>
-        <height>90</height>
-       </size>
+      <property name="leftMargin">
+       <number>0</number>
       </property>
-      <property name="title">
-       <string>Transceiver step size</string>
+      <property name="topMargin">
+       <number>0</number>
       </property>
-      <widget class="QRadioButton" name="rb1Hz">
-       <property name="geometry">
-        <rect>
-         <x>10</x>
-         <y>23</y>
-         <width>61</width>
-         <height>17</height>
-        </rect>
-       </property>
-       <property name="text">
-        <string>1 Hz</string>
-       </property>
-       <property name="checked">
-        <bool>true</bool>
-       </property>
-      </widget>
-      <widget class="QRadioButton" name="rb10Hz">
-       <property name="geometry">
-        <rect>
-         <x>10</x>
-         <y>46</y>
-         <width>71</width>
-         <height>17</height>
-        </rect>
-       </property>
-       <property name="text">
-        <string>10 Hz</string>
-       </property>
-      </widget>
-      <widget class="QRadioButton" name="rb100Hz">
-       <property name="geometry">
-        <rect>
-         <x>10</x>
-         <y>69</y>
-         <width>71</width>
-         <height>17</height>
-        </rect>
-       </property>
-       <property name="text">
-        <string>100 Hz</string>
-       </property>
-      </widget>
-     </widget>
-    </item>
-    <item>
-     <widget class="QGroupBox" name="groupBox_3">
-      <property name="minimumSize">
-       <size>
-        <width>196</width>
-        <height>0</height>
-       </size>
+      <property name="rightMargin">
+       <number>0</number>
       </property>
-      <property name="maximumSize">
-       <size>
-        <width>16777215</width>
-        <height>60</height>
-       </size>
+      <property name="bottomMargin">
+       <number>0</number>
       </property>
-      <property name="title">
-       <string>Tx audio tracking</string>
-      </property>
-      <widget class="QCheckBox" name="cbTxAudioTrack">
-       <property name="enabled">
-        <bool>false</bool>
-       </property>
-       <property name="geometry">
-        <rect>
-         <x>20</x>
-         <y>20</y>
-         <width>105</width>
-         <height>17</height>
-        </rect>
-       </property>
-       <property name="text">
-        <string>Enable</string>
-       </property>
-      </widget>
-     </widget>
-    </item>
-    <item>
-     <spacer name="verticalSpacer">
-      <property name="orientation">
-       <enum>Qt::Vertical</enum>
-      </property>
-      <property name="sizeType">
-       <enum>QSizePolicy::Fixed</enum>
-      </property>
-      <property name="sizeHint" stdset="0">
-       <size>
-        <width>20</width>
-        <height>44</height>
-       </size>
-      </property>
-     </spacer>
-    </item>
-   </layout>
-  </widget>
+      <item>
+       <widget class="QGroupBox" name="groupBox_4">
+        <property name="title">
+         <string>Frequency above nominal band edge</string>
+        </property>
+        <layout class="QHBoxLayout" name="horizontalLayout_3">
+         <item>
+          <widget class="QSpinBox" name="kHzSpinBox">
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+           <property name="suffix">
+            <string>  kHz</string>
+           </property>
+           <property name="maximum">
+            <number>999</number>
+           </property>
+           <property name="value">
+            <number>200</number>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QSpinBox" name="HzSpinBox">
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+           <property name="suffix">
+            <string>   Hz</string>
+           </property>
+           <property name="minimum">
+            <number>-2000</number>
+           </property>
+           <property name="maximum">
+            <number>2000</number>
+           </property>
+           <property name="singleStep">
+            <number>100</number>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item>
+       <widget class="QGroupBox" name="groupBox">
+        <property name="title">
+         <string>Doppler tracking</string>
+        </property>
+        <layout class="QVBoxLayout" name="verticalLayout_2">
+         <item>
+          <widget class="QRadioButton" name="rbFullTrack">
+           <property name="text">
+            <string>Full Doppler to DX Grid</string>
+           </property>
+           <property name="checked">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QRadioButton" name="rbConstFreqOnMoon">
+           <property name="text">
+            <string>Constant frequency on Moon</string>
+           </property>
+           <property name="checked">
+            <bool>false</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QRadioButton" name="rbNoDoppler">
+           <property name="text">
+            <string>None</string>
+           </property>
+           <property name="checked">
+            <bool>false</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item>
+       <widget class="QGroupBox" name="groupBox_2">
+        <property name="title">
+         <string>Transceiver step size</string>
+        </property>
+        <layout class="QVBoxLayout" name="verticalLayout_4">
+         <item>
+          <widget class="QRadioButton" name="rb1Hz">
+           <property name="text">
+            <string>1 Hz</string>
+           </property>
+           <property name="checked">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QRadioButton" name="rb10Hz">
+           <property name="text">
+            <string>10 Hz</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QRadioButton" name="rb100Hz">
+           <property name="text">
+            <string>100 Hz</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item>
+       <widget class="QGroupBox" name="groupBox_3">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="title">
+         <string>Tx audio tracking</string>
+        </property>
+        <layout class="QVBoxLayout" name="verticalLayout_5">
+         <item>
+          <widget class="QCheckBox" name="cbTxAudioTrack">
+           <property name="text">
+            <string>Enable</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item>
+       <spacer name="verticalSpacer">
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>0</width>
+          <height>0</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
  </widget>
  <resources/>
  <connections/>
diff --git a/mainwindow.cpp b/mainwindow.cpp
index bfbf88783..66330075e 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -432,15 +432,11 @@ MainWindow::MainWindow(bool multiple, QSettings * settings, QSharedMemory *shdme
   m_DTtol=0.5;
   m_wideGraph->setTol(m_tol);
   m_bShMsgs=false;
-  m_bDopplerTracking0=false;
   m_bTxTime=false;
   m_rxDone=false;
   m_bHaveTransmitted=false;
   m_bEchoTxOK=false;
   m_bTransmittedEcho=false;
-  m_nDop=0;
-  m_nDop00=0;
-  m_nDopr=0;
   m_nclearave=1;
 
   signalMeter = new SignalMeter(ui->meterFrame);
@@ -962,7 +958,6 @@ void MainWindow::on_actionSettings_triggered()               //Setup Dialog
     {
       Q_EMIT m_config.transceiver_frequency (m_dialFreq);
     }
-  if(m_astroWidget) m_astroWidget->m_azelDir=m_config.azel_directory();
 }
 
 void MainWindow::on_monitorButton_clicked (bool checked)
@@ -1223,11 +1218,7 @@ void MainWindow::displayDialFrequency ()
     valid = true;
   }
 
-  ui->labDialFreq->setProperty ("oob", !valid);
-  // the following sequence is necessary to update the style
-  ui->labDialFreq->style ()->unpolish (ui->labDialFreq);
-  ui->labDialFreq->style ()->polish (ui->labDialFreq);
-  ui->labDialFreq->update ();
+  update_dynamic_property (ui->labDialFreq, "oob", !valid);
   ui->labDialFreq->setText (Radio::pretty_frequency_MHz_string (m_dialFreq));
 }
 
@@ -1357,13 +1348,12 @@ void MainWindow::on_actionAstronomical_data_triggered()
 {
   if (!m_astroWidget)
     {
-      m_astroWidget.reset (new Astro {m_settings});
+      m_astroWidget.reset (new Astro {m_settings, &m_config});
 
       // hook up termination signal
       connect (this, &MainWindow::finished, m_astroWidget.data (), &Astro::close);
     }
   m_astroWidget->showNormal();
-  m_astroWidget->m_azelDir=m_config.azel_directory();
 }
 
 void MainWindow::on_actionMessage_averaging_triggered()
@@ -2137,28 +2127,6 @@ void MainWindow::guiUpdate()
     on_actionOpen_next_in_directory_triggered();
   }
 
-  Frequency f;
-  if(m_astroWidget) {
-    m_bDopplerTracking = m_astroWidget->m_bDopplerTracking;
-    m_DopplerMethod = m_astroWidget->m_DopplerMethod;
-    if((m_bDopplerTracking0 and !m_bDopplerTracking) or
-       (m_DopplerMethod==0 and m_DopplerMethod0>0)) {
-//Doppler tracking has just been turned off.  Reset dial frequency to "nominal + kHz"
-      if(m_transmitting) {
-        m_dialFreqTx=m_freqNominal + 1000*m_astroWidget->m_kHz + m_astroWidget->m_Hz;
-        ui->labDialFreq->setText (Radio::pretty_frequency_MHz_string (m_dialFreqTx));
-        Q_EMIT m_config.transceiver_tx_frequency (m_dialFreqTx);
-      } else {
-        f=m_freqNominal + 1000*m_astroWidget->m_kHz + m_astroWidget->m_Hz;
-//        m_dialFreq=f;
-//        ui->labDialFreq->setText (Radio::pretty_frequency_MHz_string (m_dialFreq));
-        Q_EMIT m_config.transceiver_frequency(f);
-      }
-    }
-    m_bDopplerTracking0 = m_bDopplerTracking;
-    m_DopplerMethod0 = m_DopplerMethod;
-  }
-
   if(m_auto and m_mode=="Echo" and m_bEchoTxOK) progressBar->setValue(
         int(100*m_s6/6.0));
 
@@ -2169,53 +2137,17 @@ void MainWindow::guiUpdate()
       progressBar->setValue(ipct);
     }
     QDateTime t = QDateTime::currentDateTimeUtc();
-    if(m_astroWidget) {
-      m_freqMoon=m_dialFreq + 1000*m_astroWidget->m_kHz + m_astroWidget->m_Hz;
-      m_astroWidget->astroUpdate(t, m_config.my_grid (), m_hisGrid,m_freqMoon,
-                                 &m_nDop, &m_nDop00, m_transmitting,
-                                 m_config.data_dir().absoluteFilePath("JPLEPH"));
-
-//Apply Doppler corrections only for 50 MHz and above
-      if(m_freqNominal>=50000000) {
-
-        if(m_astroWidget->m_bDopplerTracking) {
-
-          m_nDopr=0;
-          if(m_DopplerMethod==1) {
-// All Doppler correction done here; DX station stays at nominal dial frequency.
-            if(m_mode=="Echo") {
-              m_nDopr=m_astroWidget->m_stepHz*qRound(double(m_nDop00)/double(
-                                                   m_astroWidget->m_stepHz));
-            } else {
-              m_nDopr=m_astroWidget->m_stepHz*qRound(double(m_nDop)/double(
-                                                   m_astroWidget->m_stepHz));
-            }
-          }
-          if(m_DopplerMethod==2) {
-            // Doppler correction to constant frequency on Moon
-            m_nDopr=m_astroWidget->m_stepHz*qRound(double(m_nDop00/2.0)/double(
-                                                   m_astroWidget->m_stepHz));
-          }
-
-          if(m_transmitting) {
-            m_dialFreqTx=m_freqNominal + 1000*m_astroWidget->m_kHz +
-                m_astroWidget->m_Hz - m_nDopr;
-            ui->labDialFreq->setText (Radio::pretty_frequency_MHz_string (
-                                        m_dialFreqTx));
-            Q_EMIT m_config.transceiver_tx_frequency (m_dialFreqTx);
-          } else {
-            if(m_mode=="Echo" and m_DopplerMethod==1) {
-              m_dialFreq=m_freqNominal + 1000*m_astroWidget->m_kHz +
-                  m_astroWidget->m_Hz;
-            } else {
-              m_dialFreq=m_freqNominal + 1000*m_astroWidget->m_kHz +
-                  m_astroWidget->m_Hz + m_nDopr;
-            }
-              ui->labDialFreq->setText (Radio::pretty_frequency_MHz_string (
-                                        m_dialFreq));
-            Q_EMIT m_config.transceiver_frequency(m_dialFreq);
-          }
-        }
+    if (m_astroWidget) {
+      auto astro_correction = m_astroWidget->astroUpdate(t, m_config.my_grid (), m_hisGrid
+                                                         , m_dialFreq, "Echo" == m_mode, m_transmitting);
+      if(m_transmitting) {
+        m_dialFreqTx = m_freqNominal + astro_correction;
+        ui->labDialFreq->setText (Radio::pretty_frequency_MHz_string (m_dialFreqTx));
+        Q_EMIT m_config.transceiver_tx_frequency (m_dialFreqTx);
+      } else {
+        m_dialFreq = m_freqNominal + astro_correction;
+        ui->labDialFreq->setText (Radio::pretty_frequency_MHz_string (m_dialFreq));
+        Q_EMIT m_config.transceiver_frequency(m_dialFreq);
       }
     }
 
diff --git a/mainwindow.h b/mainwindow.h
index a22742820..70533cc9d 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -327,15 +327,10 @@ private:
   qint32  m_MinW;
   qint32  m_tol;
   qint32  m_nclearave;
-  qint32  m_DopplerMethod;
-  qint32  m_DopplerMethod0;
   qint32  m_minSync;
   qint32  m_dBm;
   qint32  m_pctx;
   qint32  m_nseq;
-  qint32  m_nDop;         //Doppler shift of EME DX station
-  qint32  m_nDop00;       //EME self-Doppler
-  qint32  m_nDopr;        //Applied Doppler (rounded to nearest 1, 10 or 100 Hz)
 
   bool    m_btxok;		//True if OK to transmit
   bool    m_diskData;
@@ -380,8 +375,6 @@ private:
   bool    m_bAstroData;
   bool    m_bEME;
   bool    m_bShMsgs;
-  bool    m_bDopplerTracking;
-  bool    m_bDopplerTracking0;
   bool    m_uploadSpots;
   bool    m_uploading;
   bool    m_txNext;