diff --git a/plugins/channelrx/demoddatv/datvconstellation.h b/plugins/channelrx/demoddatv/datvconstellation.h
index 79d956b0f..cdd5c9f6a 100644
--- a/plugins/channelrx/demoddatv/datvconstellation.h
+++ b/plugins/channelrx/demoddatv/datvconstellation.h
@@ -114,7 +114,7 @@ template<typename T> struct datvconstellation: runnable
     unsigned long decimation;
     long pixels_per_frame;
     cstln_lut<eucl_ss, 256> **cstln;  // Optional ptr to optional constellation
-    TVScreen *m_objDATVScreen;
+    TVScreen *m_tvScreen;
     pipereader<std::complex<T> > in;
     unsigned long phase;
     std::vector<int> cstln_rows;
@@ -126,14 +126,14 @@ template<typename T> struct datvconstellation: runnable
             T _xymin,
             T _xymax,
             const char *_name = nullptr,
-            TVScreen *objDATVScreen = nullptr) :
+            TVScreen *tvScreen = nullptr) :
         runnable(sch, _name ? _name : _in.name),
         xymin(_xymin),
         xymax(_xymax),
         decimation(DEFAULT_GUI_DECIMATION),
         pixels_per_frame(1024),
         cstln(0),
-        m_objDATVScreen(objDATVScreen),
+        m_tvScreen(tvScreen),
         in(_in),
         phase(0)
     {
@@ -144,16 +144,16 @@ template<typename T> struct datvconstellation: runnable
         //Symbols
         while (in.readable() >= pixels_per_frame)
         {
-            if ((!phase) && m_objDATVScreen)
+            if ((!phase) && m_tvScreen)
             {
-                m_objDATVScreen->resetImage();
+                m_tvScreen->resetImage();
 
                 std::complex<T> *p = in.rd(), *pend = p + pixels_per_frame;
 
                 for (; p < pend; ++p)
                 {
-                    m_objDATVScreen->selectRow(256 * (p->real() - xymin) / (xymax - xymin));
-                    m_objDATVScreen->setDataColor(
+                    m_tvScreen->selectRow(256 * (p->real() - xymin) / (xymax - xymin));
+                    m_tvScreen->setDataColor(
                         256 - 256 * ((p->imag() - xymin) / (xymax - xymin)),
                         255, 0, 255);
                 }
@@ -166,12 +166,12 @@ template<typename T> struct datvconstellation: runnable
 
                     for (;(row_it != cstln_rows.end()) && (col_it != cstln_cols.end()); ++row_it, ++col_it)
                     {
-                        m_objDATVScreen->selectRow(*row_it);
-                        m_objDATVScreen->setDataColor(*col_it, 250, 250, 5);
+                        m_tvScreen->selectRow(*row_it);
+                        m_tvScreen->setDataColor(*col_it, 250, 250, 5);
                     }
                 }
 
-                m_objDATVScreen->renderImage(0);
+                m_tvScreen->renderImage(0);
             }
 
             in.read(pixels_per_frame);
diff --git a/plugins/channelrx/demoddatv/datvdemod.cpp b/plugins/channelrx/demoddatv/datvdemod.cpp
index bff0c8db5..4ac7da94d 100644
--- a/plugins/channelrx/demoddatv/datvdemod.cpp
+++ b/plugins/channelrx/demoddatv/datvdemod.cpp
@@ -129,9 +129,106 @@ void DATVDemod::applySettings(const DATVDemodSettings& settings, bool force)
     QString debugMsg = tr("DATVDemod::applySettings: force: %1").arg(force);
     settings.debug(debugMsg);
 
+    QList<QString> reverseAPIKeys;
+
+    if (settings.m_rgbColor != m_settings.m_rgbColor) {
+        reverseAPIKeys.append("rgbColor");
+    }
+    if (settings.m_title != m_settings.m_title) {
+        reverseAPIKeys.append("title");
+    }
+    if (settings.m_rfBandwidth != m_settings.m_rfBandwidth) {
+        reverseAPIKeys.append("rfBandwidth");
+    }
+    if (settings.m_centerFrequency != m_settings.m_centerFrequency) {
+        reverseAPIKeys.append("centerFrequency");
+    }
+    if (settings.m_standard != m_settings.m_standard) {
+        reverseAPIKeys.append("standard");
+    }
+    if (settings.m_modulation != m_settings.m_modulation) {
+        reverseAPIKeys.append("modulation");
+    }
+    if (settings.m_fec != m_settings.m_fec) {
+        reverseAPIKeys.append("fec");
+    }
+    if (settings.m_softLDPC != m_settings.m_softLDPC) {
+        reverseAPIKeys.append("softLDPC");
+    }
+    if (settings.m_softLDPCToolPath != m_settings.m_softLDPCToolPath) {
+        reverseAPIKeys.append("softLDPCToolPath");
+    }
+    if (settings.m_softLDPCMaxTrials != m_settings.m_softLDPCMaxTrials) {
+        reverseAPIKeys.append("softLDPCMaxTrials");
+    }
+    if (settings.m_maxBitflips != m_settings.m_maxBitflips) {
+        reverseAPIKeys.append("maxBitflips");
+    }
+    if (settings.m_audioMute != m_settings.m_audioMute) {
+        reverseAPIKeys.append("audioMute");
+    }
+    if (settings.m_audioDeviceName != m_settings.m_audioDeviceName) {
+        reverseAPIKeys.append("audioDeviceName");
+    }
+    if (settings.m_symbolRate != m_settings.m_symbolRate) {
+        reverseAPIKeys.append("symbolRate");
+    }
+    if (settings.m_notchFilters != m_settings.m_notchFilters) {
+        reverseAPIKeys.append("notchFilters");
+    }
+    if (settings.m_allowDrift != m_settings.m_allowDrift) {
+        reverseAPIKeys.append("allowDrift");
+    }
+    if (settings.m_fastLock != m_settings.m_fastLock) {
+        reverseAPIKeys.append("fastLock");
+    }
+    if (settings.m_filter != m_settings.m_filter) {
+        reverseAPIKeys.append("filter");
+    }
+    if (settings.m_hardMetric != m_settings.m_hardMetric) {
+        reverseAPIKeys.append("hardMetric");
+    }
+    if (settings.m_rollOff != m_settings.m_rollOff) {
+        reverseAPIKeys.append("rollOff");
+    }
+    if (settings.m_viterbi != m_settings.m_viterbi) {
+        reverseAPIKeys.append("viterbi");
+    }
+    if (settings.m_excursion != m_settings.m_excursion) {
+        reverseAPIKeys.append("excursion");
+    }
+    if (settings.m_audioVolume != m_settings.m_audioVolume) {
+        reverseAPIKeys.append("audioVolume");
+    }
+    if (settings.m_videoMute != m_settings.m_videoMute) {
+        reverseAPIKeys.append("videoMute");
+    }
+    if (settings.m_udpTSAddress != m_settings.m_udpTSAddress) {
+        reverseAPIKeys.append("udpTSAddress");
+    }
+    if (settings.m_udpTSPort != m_settings.m_udpTSPort) {
+        reverseAPIKeys.append("udpTSPort");
+    }
+    if (settings.m_udpTS != m_settings.m_udpTS) {
+        reverseAPIKeys.append("udpTS");
+    }
+    if (settings.m_playerEnable != m_settings.m_playerEnable) {
+        reverseAPIKeys.append("playerEnable");
+    }
+
     DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(settings, force);
     m_basebandSink->getInputMessageQueue()->push(msg);
 
+    if (settings.m_useReverseAPI)
+    {
+        bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
+                (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
+                (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
+                (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
+                (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
+        webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
+    }
+
     m_settings = settings;
 }
 
@@ -274,6 +371,9 @@ void DATVDemod::webapiUpdateChannelSettings(
     if (channelSettingsKeys.contains("udpTS")) {
         settings.m_udpTS = response.getDatvDemodSettings()->getUdpTs() == 1;
     }
+    if (channelSettingsKeys.contains("playerEnable")) {
+        settings.m_playerEnable = response.getDatvDemodSettings()->getPlayerEnable() == 1;
+    }
     if (channelSettingsKeys.contains("streamIndex")) {
         settings.m_streamIndex = response.getDatvDemodSettings()->getStreamIndex();
     }
@@ -346,6 +446,8 @@ void DATVDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& res
     }
 
     response.getDatvDemodSettings()->setUdpTsPort(settings.m_udpTSPort);
+    response.getDatvDemodSettings()->setUdpTs(settings.m_udpTS ? 1 : 0);
+    response.getDatvDemodSettings()->setPlayerEnable(settings.m_playerEnable ? 1 : 0);
     response.getDatvDemodSettings()->setStreamIndex(settings.m_streamIndex);
     response.getDatvDemodSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0);
 
@@ -372,6 +474,8 @@ void DATVDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respons
     response.getDatvDemodReport()->setUdpRunning(udpRunning() ? 1 : 0);
     response.getDatvDemodReport()->setVideoActive(videoActive() ? 1 : 0);
     response.getDatvDemodReport()->setVideoDecodeOk(videoDecodeOK() ? 1 : 0);
+    response.getDatvDemodReport()->setMer(getMERAvg());
+    response.getDatvDemodReport()->setCnr(getCNRAvg());
 }
 
 void DATVDemod::sendChannelSettings(
@@ -493,6 +597,9 @@ void DATVDemod::webapiFormatChannelSettings(
     if (channelSettingsKeys.contains("udpTS") || force) {
         swgDATVDemodSettings->setUdpTs(settings.m_udpTS ? 1 : 0);
     }
+    if (channelSettingsKeys.contains("playerEnable") || force) {
+        swgDATVDemodSettings->setPlayerEnable(settings.m_playerEnable ? 1 : 0);
+    }
     if (channelSettingsKeys.contains("streamIndex") || force) {
         swgDATVDemodSettings->setStreamIndex(settings.m_streamIndex);
     }
diff --git a/plugins/channelrx/demoddatv/datvdemod.h b/plugins/channelrx/demoddatv/datvdemod.h
index 6c4bab512..40dc093f9 100644
--- a/plugins/channelrx/demoddatv/datvdemod.h
+++ b/plugins/channelrx/demoddatv/datvdemod.h
@@ -99,7 +99,7 @@ public:
         m_basebandSink->setMessageQueueToGUI(queue);
     }
 
-    void SetTVScreen(TVScreen *objScreen) { m_basebandSink->setTVScreen(objScreen); }
+    void SetTVScreen(TVScreen *tvScreen) { m_basebandSink->setTVScreen(tvScreen); }
     void SetVideoRender(DATVideoRender *objScreen) { m_basebandSink->SetVideoRender(objScreen); }
     DATVideostream *getVideoStream() { return m_basebandSink->getVideoStream(); }
     DATVUDPStream *getUDPStream() { return m_basebandSink->getUDPStream(); }
diff --git a/plugins/channelrx/demoddatv/datvdemodgui.cpp b/plugins/channelrx/demoddatv/datvdemodgui.cpp
index c2f6af455..b2d14a95d 100644
--- a/plugins/channelrx/demoddatv/datvdemodgui.cpp
+++ b/plugins/channelrx/demoddatv/datvdemodgui.cpp
@@ -167,7 +167,7 @@ void DATVDemodGUI::onMenuDialogCalled(const QPoint &p)
     else if ((m_contextMenuType == ContextMenuStreamSettings) && (m_deviceUISet->m_deviceMIMOEngine))
     {
         DeviceStreamSelectionDialog dialog(this);
-        dialog.setNumberOfStreams(m_objDATVDemod->getNumberOfDeviceStreams());
+        dialog.setNumberOfStreams(m_datvDemod->getNumberOfDeviceStreams());
         dialog.setStreamIndex(m_settings.m_streamIndex);
         dialog.move(p);
         dialog.exec();
@@ -196,6 +196,7 @@ DATVDemodGUI::DATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, Ba
 {
     ui->setupUi(this);
     ui->screenTV->setColor(true);
+    ui->screenTV->resizeTVScreen(256,256);
     setAttribute(Qt::WA_DeleteOnClose, true);
     connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
     connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &)));
@@ -209,16 +210,16 @@ DATVDemodGUI::DATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, Ba
     ui->cnrMeter->setRange(0, 30);
     ui->cnrMeter->setAverageSmoothing(2);
 
-    m_objDATVDemod = (DATVDemod*) rxChannel;
-    m_objDATVDemod->setMessageQueueToGUI(getInputMessageQueue());
+    m_datvDemod = (DATVDemod*) rxChannel;
+    m_datvDemod->setMessageQueueToGUI(getInputMessageQueue());
 
-    m_objDATVDemod->SetTVScreen(ui->screenTV);
-    m_objDATVDemod->SetVideoRender(ui->screenTV_2);
+    m_datvDemod->SetTVScreen(ui->screenTV);
+    m_datvDemod->SetVideoRender(ui->screenTV_2);
 
     if (m_settings.m_playerEnable) {
-        connect(m_objDATVDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
+        connect(m_datvDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
     } else {
-        connect(m_objDATVDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
+        connect(m_datvDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
     }
 
     connect(ui->screenTV_2, &DATVideoRender::onMetaDataChanged, this, &DATVDemodGUI::on_StreamMetaDataChanged);
@@ -377,13 +378,13 @@ void DATVDemodGUI::displaySettings()
 
     if (m_settings.m_playerEnable)
     {
-        disconnect(m_objDATVDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
-        connect(m_objDATVDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
+        disconnect(m_datvDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
+        connect(m_datvDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
     }
     else
     {
-        disconnect(m_objDATVDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
-        connect(m_objDATVDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
+        disconnect(m_datvDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
+        connect(m_datvDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
     }
 
     blockApplySettings(false);
@@ -454,7 +455,7 @@ void DATVDemodGUI::applySettings(bool force)
         m_settings.debug(msg);
 
         DATVDemod::MsgConfigureDATVDemod* message = DATVDemod::MsgConfigureDATVDemod::create(m_settings, force);
-	    m_objDATVDemod->getInputMessageQueue()->push(message);
+	    m_datvDemod->getInputMessageQueue()->push(message);
     }
 }
 
@@ -502,16 +503,16 @@ void DATVDemodGUI::ldpcToolSelect()
 
 void DATVDemodGUI::tick()
 {
-    if (m_objDATVDemod)
+    if (m_datvDemod)
     {
-        m_objMagSqAverage(m_objDATVDemod->getMagSq());
+        m_objMagSqAverage(m_datvDemod->getMagSq());
         double magSqDB = CalcDb::dbPower(m_objMagSqAverage / (SDR_RX_SCALED*SDR_RX_SCALED));
         ui->channePowerText->setText(tr("%1 dB").arg(magSqDB, 0, 'f', 1));
 
-        if ((m_modcodModulationIndex != m_objDATVDemod->getModcodModulation()) || (m_modcodCodeRateIndex != m_objDATVDemod->getModcodCodeRate()))
+        if ((m_modcodModulationIndex != m_datvDemod->getModcodModulation()) || (m_modcodCodeRateIndex != m_datvDemod->getModcodCodeRate()))
         {
-            m_modcodModulationIndex = m_objDATVDemod->getModcodModulation();
-            m_modcodCodeRateIndex = m_objDATVDemod->getModcodCodeRate();
+            m_modcodModulationIndex = m_datvDemod->getModcodModulation();
+            m_modcodCodeRateIndex = m_datvDemod->getModcodCodeRate();
             DATVDemodSettings::DATVModulation modulation = DATVDemodSettings::getModulationFromLeanDVBCode(m_modcodModulationIndex);
             DATVDemodSettings::DATVCodeRate rate = DATVDemodSettings::getCodeRateFromLeanDVBCode(m_modcodCodeRateIndex);
             QString modcodModulationStr = DATVDemodSettings::getStrFromModulation(modulation);
@@ -519,9 +520,9 @@ void DATVDemodGUI::tick()
             ui->statusText->setText(tr("MCOD %1 %2").arg(modcodModulationStr).arg(modcodCodeRateStr));
         }
 
-        if (m_cstlnSetByModcod != m_objDATVDemod->isCstlnSetByModcod())
+        if (m_cstlnSetByModcod != m_datvDemod->isCstlnSetByModcod())
         {
-            m_cstlnSetByModcod = m_objDATVDemod->isCstlnSetByModcod();
+            m_cstlnSetByModcod = m_datvDemod->isCstlnSetByModcod();
 
             if (m_cstlnSetByModcod) {
                 ui->statusText->setStyleSheet("QLabel { background-color : green; }");
@@ -537,9 +538,9 @@ void DATVDemodGUI::tick()
         ui->lblRate->setText(QString("Speed: %1b/s").arg(formatBytes(m_intLastSpeed)));
     }
 
-    if (m_objDATVDemod->audioActive())
+    if (m_datvDemod->audioActive())
     {
-        if (m_objDATVDemod->audioDecodeOK()) {
+        if (m_datvDemod->audioDecodeOK()) {
             ui->audioMute->setStyleSheet("QToolButton { background-color : green; }");
         } else {
             ui->audioMute->setStyleSheet("QToolButton { background-color : red; }");
@@ -550,9 +551,9 @@ void DATVDemodGUI::tick()
         ui->audioMute->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
     }
 
-    if (m_objDATVDemod->videoActive())
+    if (m_datvDemod->videoActive())
     {
-		if (m_objDATVDemod->videoDecodeOK()) {
+		if (m_datvDemod->videoDecodeOK()) {
 			ui->videoMute->setStyleSheet("QToolButton { background-color : green; }");
 		} else {
 			ui->videoMute->setStyleSheet("QToolButton { background-color : red; }");
@@ -566,7 +567,7 @@ void DATVDemodGUI::tick()
     m_intPreviousDecodedData = m_intLastDecodedData;
 
     //Try to start video rendering
-    bool success = m_objDATVDemod->playVideo();
+    bool success = m_datvDemod->playVideo();
 
     if (success) {
         ui->playerIndicator->setStyleSheet("QLabel { background-color: rgb(85, 232, 85); border-radius: 8px; }"); // green
@@ -574,7 +575,7 @@ void DATVDemodGUI::tick()
         ui->playerIndicator->setStyleSheet("QLabel { background-color: gray; border-radius: 8px; }");
     }
 
-    if (m_objDATVDemod->udpRunning()) {
+    if (m_datvDemod->udpRunning()) {
         ui->udpIndicator->setStyleSheet("QLabel { background-color: rgb(85, 232, 85); border-radius: 8px; }"); // green
     } else {
         ui->udpIndicator->setStyleSheet("QLabel { background-color: gray; border-radius: 8px; }");
@@ -583,10 +584,10 @@ void DATVDemodGUI::tick()
 
 void DATVDemodGUI::tickMeter()
 {
-    ui->merMeter->levelChanged(m_objDATVDemod->getMERRMS(), m_objDATVDemod->getMERPeak(), m_objDATVDemod->getMERNbAvg());
-    ui->cnrMeter->levelChanged(m_objDATVDemod->getCNRRMS(), m_objDATVDemod->getCNRPeak(), m_objDATVDemod->getCNRNbAvg());
-    ui->merText->setText(QString("%1").arg(m_objDATVDemod->getMERAvg(), 0, 'f', 1));
-    ui->cnrText->setText(QString("%1").arg(m_objDATVDemod->getCNRAvg(), 0, 'f', 1));
+    ui->merMeter->levelChanged(m_datvDemod->getMERRMS(), m_datvDemod->getMERPeak(), m_datvDemod->getMERNbAvg());
+    ui->cnrMeter->levelChanged(m_datvDemod->getCNRRMS(), m_datvDemod->getCNRPeak(), m_datvDemod->getCNRNbAvg());
+    ui->merText->setText(QString("%1").arg(m_datvDemod->getMERAvg(), 0, 'f', 1));
+    ui->cnrText->setText(QString("%1").arg(m_datvDemod->getCNRAvg(), 0, 'f', 1));
 }
 
 void DATVDemodGUI::on_cmbStandard_currentIndexChanged(int index)
@@ -844,13 +845,13 @@ void DATVDemodGUI::on_playerEnable_clicked()
 
     if (m_settings.m_playerEnable)
     {
-        disconnect(m_objDATVDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
-        connect(m_objDATVDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
+        disconnect(m_datvDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
+        connect(m_datvDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
     }
     else
     {
-        disconnect(m_objDATVDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
-        connect(m_objDATVDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
+        disconnect(m_datvDemod->getVideoStream(), &DATVideostream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
+        connect(m_datvDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable);
     }
 
     applySettings();
diff --git a/plugins/channelrx/demoddatv/datvdemodgui.h b/plugins/channelrx/demoddatv/datvdemodgui.h
index 512cc1c90..71afc7e9a 100644
--- a/plugins/channelrx/demoddatv/datvdemodgui.h
+++ b/plugins/channelrx/demoddatv/datvdemodgui.h
@@ -101,7 +101,7 @@ private:
     DeviceUISet* m_deviceUISet;
 
     ChannelMarker m_objChannelMarker;
-    DATVDemod* m_objDATVDemod;
+    DATVDemod* m_datvDemod;
     MessageQueue m_inputMessageQueue;
     DATVDemodSettings m_settings;
 
diff --git a/plugins/channelrx/demoddatv/datvdemodsink.cpp b/plugins/channelrx/demoddatv/datvdemodsink.cpp
index 1ac11b0e8..f0f584128 100644
--- a/plugins/channelrx/demoddatv/datvdemodsink.cpp
+++ b/plugins/channelrx/demoddatv/datvdemodsink.cpp
@@ -34,11 +34,11 @@ const unsigned int DATVDemodSink::m_rfFilterFftLength = 1024;
 
 DATVDemodSink::DATVDemodSink() :
     m_blnNeedConfigUpdate(false),
-    m_objRegisteredTVScreen(nullptr),
-    m_objRegisteredVideoRender(nullptr),
-    m_objVideoStream(new DATVideostream()),
+    m_tvScreen(nullptr),
+    m_videoRender(nullptr),
+    m_videoStream(new DATVideostream()),
     m_udpStream(leansdr::tspacket::SIZE),
-    m_objRenderThread(nullptr),
+    m_videoThread(nullptr),
     m_audioFifo(48000),
     m_blnRenderingVideo(false),
     m_cstlnSetByModcod(false),
@@ -60,14 +60,14 @@ DATVDemodSink::~DATVDemodSink()
     m_blnInitialized = false;
 
     //Immediately exit from DATVideoStream if waiting for data before killing thread
-    m_objVideoStream->setThreadTimeout(0);
-    m_objVideoStream->deleteLater();
+    m_videoStream->setThreadTimeout(0);
+    m_videoStream->deleteLater();
 
     stopVideo();
     CleanUpDATVFramework();
 
-    if (m_objRenderThread) {
-        delete m_objRenderThread;
+    if (m_videoThread) {
+        delete m_videoThread;
     }
 
     delete m_objRFFilter;
@@ -75,34 +75,33 @@ DATVDemodSink::~DATVDemodSink()
 
 void DATVDemodSink::stopVideo()
 {
-    if (m_objRenderThread)
+    if (m_videoThread)
     {
-        if (m_objRenderThread->isRunning())
+        if (m_videoThread->isRunning())
         {
-            m_objRenderThread->stopRendering();
-            m_objRenderThread->quit();
-            m_objRenderThread->wait();
+            m_videoThread->stopRendering();
+            m_videoThread->quit();
+            m_videoThread->wait();
         }
     }
 }
 
-bool DATVDemodSink::setTVScreen(TVScreen *objScreen)
+void DATVDemodSink::setTVScreen(TVScreen *tvScreen)
 {
-    m_objRegisteredTVScreen = objScreen;
-    return true;
+    m_tvScreen = tvScreen;
 }
 
-void DATVDemodSink::SetVideoRender(DATVideoRender *objScreen)
+void DATVDemodSink::SetVideoRender(DATVideoRender *screen)
 {
-    m_objRegisteredVideoRender = objScreen;
-    m_objRegisteredVideoRender->setAudioFIFO(&m_audioFifo);
-    m_objRenderThread = new DATVideoRenderThread(m_objRegisteredVideoRender, m_objVideoStream);
+    m_videoRender = screen;
+    m_videoRender->setAudioFIFO(&m_audioFifo);
+    m_videoThread = new DATVideoRenderThread(m_videoRender, m_videoStream);
 }
 
 bool DATVDemodSink::audioActive()
 {
-    if (m_objRegisteredVideoRender) {
-        return m_objRegisteredVideoRender->getAudioStreamIndex() >= 0;
+    if (m_videoRender) {
+        return m_videoRender->getAudioStreamIndex() >= 0;
     } else {
         return false;
     }
@@ -110,8 +109,8 @@ bool DATVDemodSink::audioActive()
 
 bool DATVDemodSink::videoActive()
 {
-    if (m_objRegisteredVideoRender) {
-        return m_objRegisteredVideoRender->getVideoStreamIndex() >= 0;
+    if (m_videoRender) {
+        return m_videoRender->getVideoStreamIndex() >= 0;
     } else {
         return false;
     }
@@ -119,8 +118,8 @@ bool DATVDemodSink::videoActive()
 
 bool DATVDemodSink::audioDecodeOK()
 {
-    if (m_objRegisteredVideoRender) {
-        return m_objRegisteredVideoRender->getAudioDecodeOK();
+    if (m_videoRender) {
+        return m_videoRender->getAudioDecodeOK();
     } else {
         return false;
     }
@@ -128,8 +127,8 @@ bool DATVDemodSink::audioDecodeOK()
 
 bool DATVDemodSink::videoDecodeOK()
 {
-    if (m_objRegisteredVideoRender) {
-        return m_objRegisteredVideoRender->getVideoDecodeOK();
+    if (m_videoRender) {
+        return m_videoRender->getVideoDecodeOK();
     } else {
         return false;
     }
@@ -151,27 +150,27 @@ bool DATVDemodSink::playVideo()
 {
     QMutexLocker mlock(&m_mutex);
 
-    if (m_objVideoStream == nullptr) {
+    if (m_videoStream == nullptr) {
         return false;
     }
 
-    if (m_objRegisteredVideoRender == nullptr) {
+    if (m_videoRender == nullptr) {
         return false;
     }
 
-    if (m_objRenderThread == nullptr) {
+    if (m_videoThread == nullptr) {
         return false;
     }
 
-    if (m_objRenderThread->isRunning()) {
+    if (m_videoThread->isRunning()) {
         return true;
     }
 
-    if (m_objVideoStream->bytesAvailable() > 0)
+    if (m_videoStream->bytesAvailable() > 0)
     {
-        m_objVideoStream->setMultiThreaded(true);
-        m_objVideoStream->setThreadTimeout(DATVideoRenderThread::videoThreadTimeoutMs);
-        m_objRenderThread->start();
+        m_videoStream->setMultiThreaded(true);
+        m_videoStream->setThreadTimeout(DATVideoRenderThread::videoThreadTimeoutMs);
+        m_videoThread->start();
     }
 
     return false;
@@ -179,8 +178,8 @@ bool DATVDemodSink::playVideo()
 
 void DATVDemodSink::CleanUpDATVFramework()
 {
-    if (m_objVideoStream) {
-        m_objVideoStream->cleanUp();
+    if (m_videoStream) {
+        m_videoStream->cleanUp();
     }
 
     if (m_objScheduler != nullptr)
@@ -556,7 +555,7 @@ void DATVDemodSink::InitDATVFramework()
     m_objCfg.rrc_rej = (float) m_settings.m_excursion;  //dB
     m_objCfg.rrc_steps = 0; //auto
 
-    m_objVideoStream->resetTotalReceived();
+    m_videoStream->resetTotalReceived();
     m_udpStream.resetTotalReceived();
 
     switch(m_settings.m_modulation)
@@ -769,12 +768,11 @@ void DATVDemodSink::InitDATVFramework()
 
     //constellation
 
-    if (m_objRegisteredTVScreen)
+    if (m_tvScreen)
     {
-        qDebug("DATVDemodSink::InitDATVFramework: Register DVBSTVSCREEN");
+        qDebug("DATVDemodSink::InitDATVFramework: Register DVB constellation TV screen");
 
-        m_objRegisteredTVScreen->resizeTVScreen(256,256);
-        r_scope_symbols = new leansdr::datvconstellation<leansdr::f32>(m_objScheduler, *p_sampled, -128,128, nullptr, m_objRegisteredTVScreen);
+        r_scope_symbols = new leansdr::datvconstellation<leansdr::f32>(m_objScheduler, *p_sampled, -128,128, nullptr, m_tvScreen);
         r_scope_symbols->decimation = 1;
         r_scope_symbols->cstln = &m_objDemodulator->cstln;
         r_scope_symbols->calculate_cstln_points();
@@ -850,7 +848,7 @@ void DATVDemodSink::InitDATVFramework()
 
     // OUTPUT
     if (m_settings.m_playerEnable) {
-        r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, m_objVideoStream, &m_udpStream);
+        r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, m_videoStream, &m_udpStream);
     } else {
         r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, nullptr, &m_udpStream);
     }
@@ -895,7 +893,7 @@ void DATVDemodSink::InitDATVS2Framework()
     m_objCfg.rrc_rej = (float) m_settings.m_excursion;  //dB
     m_objCfg.rrc_steps = 0; //auto
 
-    m_objVideoStream->resetTotalReceived();
+    m_videoStream->resetTotalReceived();
     m_udpStream.resetTotalReceived();
 
     switch(m_settings.m_modulation)
@@ -1075,11 +1073,10 @@ void DATVDemodSink::InitDATVS2Framework()
 
     //constellation
 
-    if (m_objRegisteredTVScreen)
+    if (m_tvScreen)
     {
         qDebug("DATVDemodSink::InitDATVS2Framework: Register DVBS 2 TVSCREEN");
-        m_objRegisteredTVScreen->resizeTVScreen(256,256);
-        r_scope_symbols_dvbs2 = new leansdr::datvdvbs2constellation<leansdr::f32>(m_objScheduler, *p_cstln /* *p_sampled */ /* *p_cstln */, -128,128, nullptr, m_objRegisteredTVScreen);
+        r_scope_symbols_dvbs2 = new leansdr::datvdvbs2constellation<leansdr::f32>(m_objScheduler, *p_cstln /* *p_sampled */ /* *p_cstln */, -128,128, nullptr, m_tvScreen);
         r_scope_symbols_dvbs2->decimation = 1;
         r_scope_symbols_dvbs2->cstln = (leansdr::cstln_base**) &objDemodulatorDVBS2->cstln;
         r_scope_symbols_dvbs2->calculate_cstln_points();
@@ -1213,7 +1210,7 @@ void DATVDemodSink::InitDATVS2Framework()
 
     // OUTPUT
     if (m_settings.m_playerEnable) {
-        r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, m_objVideoStream, &m_udpStream);
+        r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, m_videoStream, &m_udpStream);
     } else {
         r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, nullptr, &m_udpStream);
     }
@@ -1410,22 +1407,22 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force)
 
     if ((settings.m_audioVolume) != (m_settings.m_audioVolume) || force)
     {
-        if (m_objRegisteredVideoRender) {
-            m_objRegisteredVideoRender->setAudioVolume(settings.m_audioVolume);
+        if (m_videoRender) {
+            m_videoRender->setAudioVolume(settings.m_audioVolume);
         }
     }
 
     if ((settings.m_audioMute) != (m_settings.m_audioMute) || force)
     {
-        if (m_objRegisteredVideoRender) {
-            m_objRegisteredVideoRender->setAudioMute(settings.m_audioMute);
+        if (m_videoRender) {
+            m_videoRender->setAudioMute(settings.m_audioMute);
         }
     }
 
     if ((settings.m_videoMute) != (m_settings.m_videoMute) || force)
     {
-        if (m_objRegisteredVideoRender) {
-            m_objRegisteredVideoRender->setVideoMute(settings.m_videoMute);
+        if (m_videoRender) {
+            m_videoRender->setVideoMute(settings.m_videoMute);
         }
     }
 
diff --git a/plugins/channelrx/demoddatv/datvdemodsink.h b/plugins/channelrx/demoddatv/datvdemodsink.h
index a6287e414..d4dcd75b9 100644
--- a/plugins/channelrx/demoddatv/datvdemodsink.h
+++ b/plugins/channelrx/demoddatv/datvdemodsink.h
@@ -51,7 +51,6 @@
 class TVScreen;
 class DATVideoRender;
 class QLabel;
-class LevelMeterSignalDB;
 
 class DATVDemodSink : public ChannelSampleSink {
 public:
@@ -60,9 +59,9 @@ public:
 
 	virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
 
-    bool setTVScreen(TVScreen *objScreen);
-    void SetVideoRender(DATVideoRender *objScreen);
-    DATVideostream *getVideoStream() { return m_objVideoStream; }
+    void setTVScreen(TVScreen *tvScreen);
+    void SetVideoRender(DATVideoRender *screen);
+    DATVideostream *getVideoStream() { return m_videoStream; }
     DATVUDPStream *getUDPStream() { return &m_udpStream; }
     bool audioActive();
     bool audioDecodeOK();
@@ -318,11 +317,11 @@ private:
     leansdr::datvmeter *r_cnrMeter;
 
     //*************** DATV PARAMETERS  ***************
-    TVScreen *m_objRegisteredTVScreen;
-    DATVideoRender *m_objRegisteredVideoRender;
-    DATVideostream *m_objVideoStream;
+    TVScreen *m_tvScreen;
+    DATVideoRender *m_videoRender;
+    DATVideostream *m_videoStream;
     DATVUDPStream m_udpStream;
-    DATVideoRenderThread *m_objRenderThread;
+    DATVideoRenderThread *m_videoThread;
 
     // Audio
 	AudioFifo m_audioFifo;
diff --git a/plugins/channelrx/demoddatv/datvideorender.h b/plugins/channelrx/demoddatv/datvideorender.h
index 84e797bce..ad131bc88 100644
--- a/plugins/channelrx/demoddatv/datvideorender.h
+++ b/plugins/channelrx/demoddatv/datvideorender.h
@@ -23,6 +23,8 @@
 #include <QIODevice>
 #include <QThread>
 #include <QWidget>
+#include <QTextStream>
+#include <QDebug>
 
 #include "datvideostream.h"
 #include "gui/tvscreen.h"
diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html
index 890390b99..3d3009985 100644
--- a/sdrbase/resources/webapi/doc/html2/index.html
+++ b/sdrbase/resources/webapi/doc/html2/index.html
@@ -3799,15 +3799,23 @@ margin-bottom: 20px;
     },
     "modcodModulation" : {
       "type" : "integer",
-      "description" : "Modulation set by DVB-S2 MODCOD\n  * 0: BPSK\n  * 1: QPSK\n  * 2: PSK8\n  * 3: APSK16\n  * 4: APSK32\n  * 5: APSK64E\n  * 6: QAM16\n  * 7: QAM64\n  * 8: QAM256\n"
+      "description" : "Modulation set by DVB-S2 MODCOD\n  * -1: Unset\n  *  0: BPSK\n  *  1: QPSK\n  *  2: PSK8\n  *  3: APSK16\n  *  4: APSK32\n  *  5: APSK64E\n  *  6: QAM16\n  *  7: QAM64\n  *  8: QAM256\n"
     },
     "modcodCodeRate" : {
       "type" : "integer",
-      "description" : "Code rate (FEC) set by DVB-S2 MODCOD\n  * 0:  1/2\n  * 1:  2/3\n  * 2:  4/6\n  * 3:  3/4\n  * 4:  5/6\n  * 5:  7/8\n  * 6:  4/5\n  * 7:  8/9\n  * 8:  9/10\n  * 9:  1/4\n  * 10: 1/3\n  * 11: 2/5\n  * 12: 3/5\n"
+      "description" : "Code rate (FEC) set by DVB-S2 MODCOD\n  * -1: Unset\n  *  0: 1/2\n  *  1: 2/3\n  *  2: 4/6\n  *  3: 3/4\n  *  4: 5/6\n  *  5: 7/8\n  *  6: 4/5\n  *  7: 8/9\n  *  8: 9/10\n  *  9: 1/4\n  * 10: 1/3\n  * 11: 2/5\n  * 12: 3/5\n"
     },
     "setByModcod" : {
       "type" : "integer",
       "description" : "Modulation and code rate set by DVB-S2 MODCOD (1 for yes, 0 for no)"
+    },
+    "mer" : {
+      "type" : "number",
+      "format" : "float"
+    },
+    "cnr" : {
+      "type" : "number",
+      "format" : "float"
     }
   },
   "description" : "DATVDemod"
@@ -3913,6 +3921,10 @@ margin-bottom: 20px;
       "type" : "integer",
       "description" : "boolean"
     },
+    "playerEnable" : {
+      "type" : "integer",
+      "description" : "boolean"
+    },
     "streamIndex" : {
       "type" : "integer",
       "description" : "MIMO channel. Not relevant when connected to SI (single Rx)."
@@ -7905,14 +7917,15 @@ margin-bottom: 20px;
     "fftCount" : {
       "type" : "integer"
     },
-    "frequencySpec" : {
-      "type" : "integer"
+    "sweepSpec" : {
+      "type" : "integer",
+      "description" : "(0 - Range, 1 - Step, 2 - List)"
     },
-    "startFrequency" : {
+    "startValue" : {
       "type" : "number",
       "format" : "float"
     },
-    "stopFrequency" : {
+    "stopValue" : {
       "type" : "number",
       "format" : "float"
     },
@@ -7923,9 +7936,13 @@ margin-bottom: 20px;
       "type" : "number",
       "format" : "float"
     },
-    "frequencies" : {
+    "list" : {
       "type" : "string"
     },
+    "setting" : {
+      "type" : "string",
+      "description" : "The device setting to sweep (E.g. centerFrequency or gain)"
+    },
     "visaDevice" : {
       "type" : "string"
     },
@@ -51207,7 +51224,7 @@ except ApiException as e:
           </div>
           <div id="generator">
             <div class="content">
-              Generated 2021-10-26T22:25:01.367+02:00
+              Generated 2021-10-29T08:40:21.343+02:00
             </div>
           </div>
       </div>
diff --git a/sdrbase/resources/webapi/doc/swagger/include/DATVDemod.yaml b/sdrbase/resources/webapi/doc/swagger/include/DATVDemod.yaml
index d00ee6b96..1d4dbd076 100644
--- a/sdrbase/resources/webapi/doc/swagger/include/DATVDemod.yaml
+++ b/sdrbase/resources/webapi/doc/swagger/include/DATVDemod.yaml
@@ -104,6 +104,9 @@ DATVDemodSettings:
     udpTS:
       description: boolean
       type: integer
+    playerEnable:
+      description: boolean
+      type: integer
     streamIndex:
       description: MIMO channel. Not relevant when connected to SI (single Rx).
       type: integer
@@ -145,34 +148,40 @@ DATVDemodReport:
       type: integer
       description: >
         Modulation set by DVB-S2 MODCOD
-          * 0: BPSK
-          * 1: QPSK
-          * 2: PSK8
-          * 3: APSK16
-          * 4: APSK32
-          * 5: APSK64E
-          * 6: QAM16
-          * 7: QAM64
-          * 8: QAM256
+          * -1: Unset
+          *  0: BPSK
+          *  1: QPSK
+          *  2: PSK8
+          *  3: APSK16
+          *  4: APSK32
+          *  5: APSK64E
+          *  6: QAM16
+          *  7: QAM64
+          *  8: QAM256
     modcodCodeRate:
       type: integer
       description: >
         Code rate (FEC) set by DVB-S2 MODCOD
-          * 0:  1/2
-          * 1:  2/3
-          * 2:  4/6
-          * 3:  3/4
-          * 4:  5/6
-          * 5:  7/8
-          * 6:  4/5
-          * 7:  8/9
-          * 8:  9/10
-          * 9:  1/4
+          * -1: Unset
+          *  0: 1/2
+          *  1: 2/3
+          *  2: 4/6
+          *  3: 3/4
+          *  4: 5/6
+          *  5: 7/8
+          *  6: 4/5
+          *  7: 8/9
+          *  8: 9/10
+          *  9: 1/4
           * 10: 1/3
           * 11: 2/5
           * 12: 3/5
     setByModcod:
       type: integer
       description: Modulation and code rate set by DVB-S2 MODCOD (1 for yes, 0 for no)
-
-
+    mer:
+      type: number
+      format: float
+    cnr:
+      type: number
+      format: float
diff --git a/sdrbase/resources/webapi/doc/swagger/include/NoiseFigure.yaml b/sdrbase/resources/webapi/doc/swagger/include/NoiseFigure.yaml
index 1d26b3266..fa5c1c27e 100644
--- a/sdrbase/resources/webapi/doc/swagger/include/NoiseFigure.yaml
+++ b/sdrbase/resources/webapi/doc/swagger/include/NoiseFigure.yaml
@@ -8,12 +8,13 @@ NoiseFigureSettings:
       type: integer
     fftCount:
       type: integer
-    frequencySpec:
+    sweepSpec:
+      description: "(0 - Range, 1 - Step, 2 - List)"
       type: integer
-    startFrequency:
+    startValue:
       type: number
       format: float
-    stopFrequency:
+    stopValue:
       type: number
       format: float
     steps:
@@ -21,7 +22,10 @@ NoiseFigureSettings:
     step:
       type: number
       format: float
-    frequencies:
+    list:
+      type: string
+    setting:
+      description: "The device setting to sweep (E.g. centerFrequency or gain)"
       type: string
     visaDevice:
       type: string
diff --git a/swagger/sdrangel/api/swagger/include/DATVDemod.yaml b/swagger/sdrangel/api/swagger/include/DATVDemod.yaml
index 3aed4b127..1d4dbd076 100644
--- a/swagger/sdrangel/api/swagger/include/DATVDemod.yaml
+++ b/swagger/sdrangel/api/swagger/include/DATVDemod.yaml
@@ -104,6 +104,9 @@ DATVDemodSettings:
     udpTS:
       description: boolean
       type: integer
+    playerEnable:
+      description: boolean
+      type: integer
     streamIndex:
       description: MIMO channel. Not relevant when connected to SI (single Rx).
       type: integer
@@ -176,5 +179,9 @@ DATVDemodReport:
     setByModcod:
       type: integer
       description: Modulation and code rate set by DVB-S2 MODCOD (1 for yes, 0 for no)
-
-
+    mer:
+      type: number
+      format: float
+    cnr:
+      type: number
+      format: float
diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html
index 890390b99..3d3009985 100644
--- a/swagger/sdrangel/code/html2/index.html
+++ b/swagger/sdrangel/code/html2/index.html
@@ -3799,15 +3799,23 @@ margin-bottom: 20px;
     },
     "modcodModulation" : {
       "type" : "integer",
-      "description" : "Modulation set by DVB-S2 MODCOD\n  * 0: BPSK\n  * 1: QPSK\n  * 2: PSK8\n  * 3: APSK16\n  * 4: APSK32\n  * 5: APSK64E\n  * 6: QAM16\n  * 7: QAM64\n  * 8: QAM256\n"
+      "description" : "Modulation set by DVB-S2 MODCOD\n  * -1: Unset\n  *  0: BPSK\n  *  1: QPSK\n  *  2: PSK8\n  *  3: APSK16\n  *  4: APSK32\n  *  5: APSK64E\n  *  6: QAM16\n  *  7: QAM64\n  *  8: QAM256\n"
     },
     "modcodCodeRate" : {
       "type" : "integer",
-      "description" : "Code rate (FEC) set by DVB-S2 MODCOD\n  * 0:  1/2\n  * 1:  2/3\n  * 2:  4/6\n  * 3:  3/4\n  * 4:  5/6\n  * 5:  7/8\n  * 6:  4/5\n  * 7:  8/9\n  * 8:  9/10\n  * 9:  1/4\n  * 10: 1/3\n  * 11: 2/5\n  * 12: 3/5\n"
+      "description" : "Code rate (FEC) set by DVB-S2 MODCOD\n  * -1: Unset\n  *  0: 1/2\n  *  1: 2/3\n  *  2: 4/6\n  *  3: 3/4\n  *  4: 5/6\n  *  5: 7/8\n  *  6: 4/5\n  *  7: 8/9\n  *  8: 9/10\n  *  9: 1/4\n  * 10: 1/3\n  * 11: 2/5\n  * 12: 3/5\n"
     },
     "setByModcod" : {
       "type" : "integer",
       "description" : "Modulation and code rate set by DVB-S2 MODCOD (1 for yes, 0 for no)"
+    },
+    "mer" : {
+      "type" : "number",
+      "format" : "float"
+    },
+    "cnr" : {
+      "type" : "number",
+      "format" : "float"
     }
   },
   "description" : "DATVDemod"
@@ -3913,6 +3921,10 @@ margin-bottom: 20px;
       "type" : "integer",
       "description" : "boolean"
     },
+    "playerEnable" : {
+      "type" : "integer",
+      "description" : "boolean"
+    },
     "streamIndex" : {
       "type" : "integer",
       "description" : "MIMO channel. Not relevant when connected to SI (single Rx)."
@@ -7905,14 +7917,15 @@ margin-bottom: 20px;
     "fftCount" : {
       "type" : "integer"
     },
-    "frequencySpec" : {
-      "type" : "integer"
+    "sweepSpec" : {
+      "type" : "integer",
+      "description" : "(0 - Range, 1 - Step, 2 - List)"
     },
-    "startFrequency" : {
+    "startValue" : {
       "type" : "number",
       "format" : "float"
     },
-    "stopFrequency" : {
+    "stopValue" : {
       "type" : "number",
       "format" : "float"
     },
@@ -7923,9 +7936,13 @@ margin-bottom: 20px;
       "type" : "number",
       "format" : "float"
     },
-    "frequencies" : {
+    "list" : {
       "type" : "string"
     },
+    "setting" : {
+      "type" : "string",
+      "description" : "The device setting to sweep (E.g. centerFrequency or gain)"
+    },
     "visaDevice" : {
       "type" : "string"
     },
@@ -51207,7 +51224,7 @@ except ApiException as e:
           </div>
           <div id="generator">
             <div class="content">
-              Generated 2021-10-26T22:25:01.367+02:00
+              Generated 2021-10-29T08:40:21.343+02:00
             </div>
           </div>
       </div>
diff --git a/swagger/sdrangel/code/qt5/client/SWGDATVDemodReport.cpp b/swagger/sdrangel/code/qt5/client/SWGDATVDemodReport.cpp
index 053332355..a5679d7b3 100644
--- a/swagger/sdrangel/code/qt5/client/SWGDATVDemodReport.cpp
+++ b/swagger/sdrangel/code/qt5/client/SWGDATVDemodReport.cpp
@@ -46,6 +46,10 @@ SWGDATVDemodReport::SWGDATVDemodReport() {
     m_modcod_code_rate_isSet = false;
     set_by_modcod = 0;
     m_set_by_modcod_isSet = false;
+    mer = 0.0f;
+    m_mer_isSet = false;
+    cnr = 0.0f;
+    m_cnr_isSet = false;
 }
 
 SWGDATVDemodReport::~SWGDATVDemodReport() {
@@ -72,6 +76,10 @@ SWGDATVDemodReport::init() {
     m_modcod_code_rate_isSet = false;
     set_by_modcod = 0;
     m_set_by_modcod_isSet = false;
+    mer = 0.0f;
+    m_mer_isSet = false;
+    cnr = 0.0f;
+    m_cnr_isSet = false;
 }
 
 void
@@ -85,6 +93,8 @@ SWGDATVDemodReport::cleanup() {
 
 
 
+
+
 }
 
 SWGDATVDemodReport*
@@ -116,6 +126,10 @@ SWGDATVDemodReport::fromJsonObject(QJsonObject &pJson) {
     
     ::SWGSDRangel::setValue(&set_by_modcod, pJson["setByModcod"], "qint32", "");
     
+    ::SWGSDRangel::setValue(&mer, pJson["mer"], "float", "");
+    
+    ::SWGSDRangel::setValue(&cnr, pJson["cnr"], "float", "");
+    
 }
 
 QString
@@ -159,6 +173,12 @@ SWGDATVDemodReport::asJsonObject() {
     if(m_set_by_modcod_isSet){
         obj->insert("setByModcod", QJsonValue(set_by_modcod));
     }
+    if(m_mer_isSet){
+        obj->insert("mer", QJsonValue(mer));
+    }
+    if(m_cnr_isSet){
+        obj->insert("cnr", QJsonValue(cnr));
+    }
 
     return obj;
 }
@@ -253,6 +273,26 @@ SWGDATVDemodReport::setSetByModcod(qint32 set_by_modcod) {
     this->m_set_by_modcod_isSet = true;
 }
 
+float
+SWGDATVDemodReport::getMer() {
+    return mer;
+}
+void
+SWGDATVDemodReport::setMer(float mer) {
+    this->mer = mer;
+    this->m_mer_isSet = true;
+}
+
+float
+SWGDATVDemodReport::getCnr() {
+    return cnr;
+}
+void
+SWGDATVDemodReport::setCnr(float cnr) {
+    this->cnr = cnr;
+    this->m_cnr_isSet = true;
+}
+
 
 bool
 SWGDATVDemodReport::isSet(){
@@ -285,6 +325,12 @@ SWGDATVDemodReport::isSet(){
         if(m_set_by_modcod_isSet){
             isObjectUpdated = true; break;
         }
+        if(m_mer_isSet){
+            isObjectUpdated = true; break;
+        }
+        if(m_cnr_isSet){
+            isObjectUpdated = true; break;
+        }
     }while(false);
     return isObjectUpdated;
 }
diff --git a/swagger/sdrangel/code/qt5/client/SWGDATVDemodReport.h b/swagger/sdrangel/code/qt5/client/SWGDATVDemodReport.h
index cd9b1f7f0..55cb6f1df 100644
--- a/swagger/sdrangel/code/qt5/client/SWGDATVDemodReport.h
+++ b/swagger/sdrangel/code/qt5/client/SWGDATVDemodReport.h
@@ -68,6 +68,12 @@ public:
     qint32 getSetByModcod();
     void setSetByModcod(qint32 set_by_modcod);
 
+    float getMer();
+    void setMer(float mer);
+
+    float getCnr();
+    void setCnr(float cnr);
+
 
     virtual bool isSet() override;
 
@@ -99,6 +105,12 @@ private:
     qint32 set_by_modcod;
     bool m_set_by_modcod_isSet;
 
+    float mer;
+    bool m_mer_isSet;
+
+    float cnr;
+    bool m_cnr_isSet;
+
 };
 
 }
diff --git a/swagger/sdrangel/code/qt5/client/SWGDATVDemodSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGDATVDemodSettings.cpp
index 9d21fb144..ca35f5791 100644
--- a/swagger/sdrangel/code/qt5/client/SWGDATVDemodSettings.cpp
+++ b/swagger/sdrangel/code/qt5/client/SWGDATVDemodSettings.cpp
@@ -82,6 +82,8 @@ SWGDATVDemodSettings::SWGDATVDemodSettings() {
     m_udp_ts_port_isSet = false;
     udp_ts = 0;
     m_udp_ts_isSet = false;
+    player_enable = 0;
+    m_player_enable_isSet = false;
     stream_index = 0;
     m_stream_index_isSet = false;
     use_reverse_api = 0;
@@ -156,6 +158,8 @@ SWGDATVDemodSettings::init() {
     m_udp_ts_port_isSet = false;
     udp_ts = 0;
     m_udp_ts_isSet = false;
+    player_enable = 0;
+    m_player_enable_isSet = false;
     stream_index = 0;
     m_stream_index_isSet = false;
     use_reverse_api = 0;
@@ -209,6 +213,7 @@ SWGDATVDemodSettings::cleanup() {
 
 
 
+
     if(reverse_api_address != nullptr) { 
         delete reverse_api_address;
     }
@@ -282,6 +287,8 @@ SWGDATVDemodSettings::fromJsonObject(QJsonObject &pJson) {
     
     ::SWGSDRangel::setValue(&udp_ts, pJson["udpTS"], "qint32", "");
     
+    ::SWGSDRangel::setValue(&player_enable, pJson["playerEnable"], "qint32", "");
+    
     ::SWGSDRangel::setValue(&stream_index, pJson["streamIndex"], "qint32", "");
     
     ::SWGSDRangel::setValue(&use_reverse_api, pJson["useReverseAPI"], "qint32", "");
@@ -391,6 +398,9 @@ SWGDATVDemodSettings::asJsonObject() {
     if(m_udp_ts_isSet){
         obj->insert("udpTS", QJsonValue(udp_ts));
     }
+    if(m_player_enable_isSet){
+        obj->insert("playerEnable", QJsonValue(player_enable));
+    }
     if(m_stream_index_isSet){
         obj->insert("streamIndex", QJsonValue(stream_index));
     }
@@ -683,6 +693,16 @@ SWGDATVDemodSettings::setUdpTs(qint32 udp_ts) {
     this->m_udp_ts_isSet = true;
 }
 
+qint32
+SWGDATVDemodSettings::getPlayerEnable() {
+    return player_enable;
+}
+void
+SWGDATVDemodSettings::setPlayerEnable(qint32 player_enable) {
+    this->player_enable = player_enable;
+    this->m_player_enable_isSet = true;
+}
+
 qint32
 SWGDATVDemodSettings::getStreamIndex() {
     return stream_index;
@@ -829,6 +849,9 @@ SWGDATVDemodSettings::isSet(){
         if(m_udp_ts_isSet){
             isObjectUpdated = true; break;
         }
+        if(m_player_enable_isSet){
+            isObjectUpdated = true; break;
+        }
         if(m_stream_index_isSet){
             isObjectUpdated = true; break;
         }
diff --git a/swagger/sdrangel/code/qt5/client/SWGDATVDemodSettings.h b/swagger/sdrangel/code/qt5/client/SWGDATVDemodSettings.h
index ce3e99355..7c2f0598a 100644
--- a/swagger/sdrangel/code/qt5/client/SWGDATVDemodSettings.h
+++ b/swagger/sdrangel/code/qt5/client/SWGDATVDemodSettings.h
@@ -123,6 +123,9 @@ public:
     qint32 getUdpTs();
     void setUdpTs(qint32 udp_ts);
 
+    qint32 getPlayerEnable();
+    void setPlayerEnable(qint32 player_enable);
+
     qint32 getStreamIndex();
     void setStreamIndex(qint32 stream_index);
 
@@ -226,6 +229,9 @@ private:
     qint32 udp_ts;
     bool m_udp_ts_isSet;
 
+    qint32 player_enable;
+    bool m_player_enable_isSet;
+
     qint32 stream_index;
     bool m_stream_index_isSet;