diff --git a/sdrbase/ambe/ambeengine.cpp b/sdrbase/ambe/ambeengine.cpp
index b132e7182..d0cff37ec 100644
--- a/sdrbase/ambe/ambeengine.cpp
+++ b/sdrbase/ambe/ambeengine.cpp
@@ -33,7 +33,12 @@
 #endif
 #endif
 
+#include <chrono>
+#include <thread>
+
 #include <QThread>
+#include <QBuffer>
+#include <QDataStream>
 
 #include "ambeworker.h"
 #include "ambeengine.h"
@@ -42,10 +47,12 @@ AMBEEngine::AMBEEngine()
 {}
 
 AMBEEngine::~AMBEEngine()
-{}
+{
+    qDebug("AMBEEngine::~AMBEEngine: %lu controllers", m_controllers.size());
+}
 
 #ifdef __WINDOWS__
-void DVSerialEngine::getComList()
+void AMBEEngine::getComList()
 {
     m_comList.clear();
     m_comList8250.clear();
@@ -100,8 +107,8 @@ void AMBEEngine::getComList()
 
 #ifndef __WINDOWS__
 void AMBEEngine::register_comport(
-    std::list<std::string>& comList,
-    std::list<std::string>& comList8250,
+    std::vector<std::string>& comList,
+    std::vector<std::string>& comList8250,
     const std::string& dir)
 {
     // Get the driver the device is using
@@ -123,11 +130,11 @@ void AMBEEngine::register_comport(
 }
 
 void AMBEEngine::probe_serial8250_comports(
-    std::list<std::string>& comList,
-    std::list<std::string> comList8250)
+    std::vector<std::string>& comList,
+    std::vector<std::string> comList8250)
 {
     struct serial_struct serinfo;
-    std::list<std::string>::iterator it = comList8250.begin();
+    std::vector<std::string>::iterator it = comList8250.begin();
 
     // Iterate over all serial8250-devices
     while (it != comList8250.end())
@@ -177,16 +184,17 @@ std::string AMBEEngine::get_driver(const std::string& tty)
 }
 #endif // not Windows
 
-bool AMBEEngine::scan(std::vector<QString>& ambeDevices)
+void AMBEEngine::scan(std::vector<QString>& ambeDevices)
 {
     getComList();
-    std::list<std::string>::const_iterator it = m_comList.begin();
+    std::vector<std::string>::const_iterator it = m_comList.begin();
     ambeDevices.clear();
 
     while (it != m_comList.end())
     {
         AMBEWorker *worker = new AMBEWorker();
         qDebug("AMBEEngine::scan: com: %s", it->c_str());
+
         if (worker->open(*it))
         {
             ambeDevices.push_back(QString(it->c_str()));
@@ -214,6 +222,7 @@ bool AMBEEngine::registerController(const std::string& deviceRef)
         connect(m_controllers.back().worker, SIGNAL(finished()), m_controllers.back().worker, SLOT(deleteLater()));
         connect(m_controllers.back().thread, SIGNAL(finished()), m_controllers.back().thread, SLOT(deleteLater()));
         connect(&m_controllers.back().worker->m_inputMessageQueue, SIGNAL(messageEnqueued()), m_controllers.back().worker, SLOT(handleInputMessages()));
+        std::this_thread::sleep_for(std::chrono::seconds(1));
         m_controllers.back().thread->start();
 
         return true;
@@ -224,7 +233,6 @@ bool AMBEEngine::registerController(const std::string& deviceRef)
 
 void AMBEEngine::releaseController(const std::string& deviceRef)
 {
-    qDebug("AMBEEngine::releaseController");
     std::vector<AMBEController>::iterator it = m_controllers.begin();
 
     while (it != m_controllers.end())
@@ -237,7 +245,7 @@ void AMBEEngine::releaseController(const std::string& deviceRef)
             it->worker->m_inputMessageQueue.clear();
             it->worker->close();
             m_controllers.erase(it);
-            qDebug() << "DVSerialEngine::releaseController: closed device at: " << it->device.c_str();
+            qDebug() << "AMBEEngine::releaseController: closed device at: " << it->device.c_str();
             break;
         }
 
@@ -247,7 +255,6 @@ void AMBEEngine::releaseController(const std::string& deviceRef)
 
 void AMBEEngine::releaseAll()
 {
-    qDebug("AMBEEngine::releaseAll");
     std::vector<AMBEController>::iterator it = m_controllers.begin();
 
     while (it != m_controllers.end())
@@ -257,7 +264,7 @@ void AMBEEngine::releaseAll()
         it->thread->wait(100);
         it->worker->m_inputMessageQueue.clear();
         it->worker->close();
-        qDebug() << "DVSerialEngine::release: closed device at: " << it->device.c_str();
+        qDebug() << "AMBEEngine::release: closed device at: " << it->device.c_str();
         ++it;
     }
 
@@ -319,3 +326,47 @@ void AMBEEngine::pushMbeFrame(
         }
     }
 }
+
+QByteArray AMBEEngine::serialize() const
+{
+    QStringList qDeviceList;
+    std::vector<AMBEController>::const_iterator it = m_controllers.begin();
+
+    while (it != m_controllers.end())
+    {
+        qDebug("AMBEEngine::serialize: %s", it->device.c_str());
+        qDeviceList << QString(it->device.c_str());
+        ++it;
+    }
+
+    QByteArray data;
+    QDataStream *stream = new QDataStream(&data, QIODevice::WriteOnly);
+    (*stream) << qDeviceList;
+    delete stream;
+
+    return data;
+}
+
+bool AMBEEngine::deserialize(const QByteArray& data)
+{
+    if (data.size() <= 0)
+    {
+        qDebug("AMBEEngine::deserialize: invalid or no data");
+        return false;
+    }
+
+    QStringList qDeviceList;
+    QDataStream *stream = new QDataStream(data);
+    (*stream) >> qDeviceList;
+    delete stream;
+
+    releaseAll();
+
+    for (int i = 0; i < qDeviceList.size(); ++i)
+    {
+        qDebug(" AMBEEngine::deserialize: %s", qDeviceList.at(i).toStdString().c_str());
+        registerController(qDeviceList.at(i).toStdString());
+    }
+
+    return true;
+}
diff --git a/sdrbase/ambe/ambeengine.h b/sdrbase/ambe/ambeengine.h
index 199c9e44c..59c16291f 100644
--- a/sdrbase/ambe/ambeengine.h
+++ b/sdrbase/ambe/ambeengine.h
@@ -21,11 +21,11 @@
 
 #include <vector>
 #include <string>
-#include <list>
 
 #include <QObject>
 #include <QMutex>
 #include <QString>
+#include <QByteArray>
 
 #include "export.h"
 
@@ -40,7 +40,7 @@ public:
     AMBEEngine();
     ~AMBEEngine();
 
-    bool scan(std::vector<QString>& ambeDevices);
+    void scan(std::vector<QString>& ambeDevices);
     void releaseAll();
 
     int getNbDevices() const { return m_controllers.size(); }   //!< number of devices used
@@ -57,9 +57,17 @@ public:
             int upsampling,
             AudioFifo *audioFifo);
 
+    QByteArray serialize() const;
+    bool deserialize(const QByteArray& data);
+
 private:
     struct AMBEController
     {
+        AMBEController() :
+            thread(nullptr),
+            worker(nullptr)
+        {}
+
         QThread *thread;
         AMBEWorker *worker;
         std::string device;
@@ -67,14 +75,14 @@ private:
 
 #ifndef __WINDOWS__
     static std::string get_driver(const std::string& tty);
-    static void register_comport(std::list<std::string>& comList, std::list<std::string>& comList8250, const std::string& dir);
-    static void probe_serial8250_comports(std::list<std::string>& comList, std::list<std::string> comList8250);
+    static void register_comport(std::vector<std::string>& comList, std::vector<std::string>& comList8250, const std::string& dir);
+    static void probe_serial8250_comports(std::vector<std::string>& comList, std::vector<std::string> comList8250);
 #endif
     void getComList();
 
-    std::list<std::string> m_comList;
-    std::list<std::string> m_comList8250;
     std::vector<AMBEController> m_controllers;
+    std::vector<std::string> m_comList;
+    std::vector<std::string> m_comList8250;
     QMutex m_mutex;
 };
 
diff --git a/sdrbase/ambe/ambeworker.cpp b/sdrbase/ambe/ambeworker.cpp
index 59fabca85..233b6bf41 100644
--- a/sdrbase/ambe/ambeworker.cpp
+++ b/sdrbase/ambe/ambeworker.cpp
@@ -200,7 +200,7 @@ void AMBEWorker::noUpsample(short *in, int nbSamplesIn, unsigned char channels)
         }
         else
         {
-            qDebug("DVSerialWorker::noUpsample: audio buffer is full check its size");
+            qDebug("AMBEWorker::noUpsample: audio buffer is full check its size");
         }
     }
 }
diff --git a/sdrbase/dsp/dspengine.cpp b/sdrbase/dsp/dspengine.cpp
index 4917d520c..57f1a519d 100644
--- a/sdrbase/dsp/dspengine.cpp
+++ b/sdrbase/dsp/dspengine.cpp
@@ -155,44 +155,25 @@ DSPDeviceMIMOEngine *DSPEngine::getDeviceMIMOEngineByUID(uint uid)
     return nullptr;
 }
 
-#ifdef DSD_USE_SERIALDV
-void DSPEngine::setDVSerialSupport(bool support)
-{
-    if (support)
-    {
-        m_dvSerialSupport = m_dvSerialEngine.scan();
-    }
-    else
-    {
-        m_dvSerialEngine.release();
-        m_dvSerialSupport = false;
-    }
-}
-#else
-void DSPEngine::setDVSerialSupport(bool support)
-{ (void) support; }
-#endif
-
 bool DSPEngine::hasDVSerialSupport()
 {
-#ifdef DSD_USE_SERIALDV
-    return m_dvSerialSupport;
-#else
-    return false;
-#endif
+    return m_ambeEngine.getNbDevices() > 0;
 }
 
-#ifdef DSD_USE_SERIALDV
+void DSPEngine::setDVSerialSupport(bool support)
+{ (void) support; }
+
 void DSPEngine::getDVSerialNames(std::vector<std::string>& deviceNames)
 {
-    m_dvSerialEngine.getDevicesNames(deviceNames);
-}
-#else
-void DSPEngine::getDVSerialNames(std::vector<std::string>& deviceNames)
-{ (void) deviceNames; }
-#endif
+    std::vector<QString> qDeviceRefs;
+    m_ambeEngine.getDeviceRefs(qDeviceRefs);
+    deviceNames.clear();
+
+    for (std::vector<QString>::const_iterator it = qDeviceRefs.begin(); it != qDeviceRefs.end(); ++it) {
+        deviceNames.push_back(it->toStdString());
+    }
+}
 
-#ifdef DSD_USE_SERIALDV
 void DSPEngine::pushMbeFrame(
         const unsigned char *mbeFrame,
         int mbeRateIndex,
@@ -202,24 +183,5 @@ void DSPEngine::pushMbeFrame(
         int upsampling,
         AudioFifo *audioFifo)
 {
-    m_dvSerialEngine.pushMbeFrame(mbeFrame, mbeRateIndex, mbeVolumeIndex, channels, useHP, upsampling, audioFifo);
+    m_ambeEngine.pushMbeFrame(mbeFrame, mbeRateIndex, mbeVolumeIndex, channels, useHP, upsampling, audioFifo);
 }
-#else
-void DSPEngine::pushMbeFrame(
-        const unsigned char *mbeFrame,
-        int mbeRateIndex,
-        int mbeVolumeIndex,
-        unsigned char channels,
-        bool useHP,
-        int upsampling,
-        AudioFifo *audioFifo)
-{
-    (void) mbeFrame;
-    (void) mbeRateIndex;
-    (void) mbeVolumeIndex;
-    (void) channels;
-    (void) useHP;
-    (void) upsampling;
-    (void) audioFifo;
-}
-#endif
diff --git a/sdrbase/dsp/dspengine.h b/sdrbase/dsp/dspengine.h
index 01bd58be8..c28bda5e9 100644
--- a/sdrbase/dsp/dspengine.h
+++ b/sdrbase/dsp/dspengine.h
@@ -27,9 +27,6 @@
 #include "audio/audiooutput.h"
 #include "audio/audioinput.h"
 #include "export.h"
-#ifdef DSD_USE_SERIALDV
-#include "dsp/dvserialengine.h"
-#endif
 #include "ambe/ambeengine.h"
 
 class DSPDeviceSourceEngine;
@@ -56,6 +53,7 @@ public:
 	void removeLastDeviceMIMOEngine();
 
 	AudioDeviceManager *getAudioDeviceManager() { return &m_audioDeviceManager; }
+	AMBEEngine *getAMBEEngine() { return &m_ambeEngine; }
 
     uint32_t getDeviceSourceEnginesNumber() const { return m_deviceSourceEngines.size(); }
     DSPDeviceSourceEngine *getDeviceSourceEngineByIndex(uint deviceIndex) { return m_deviceSourceEngines[deviceIndex]; }
@@ -82,7 +80,6 @@ public:
 	        bool useHP,
 	        int upsampling,
 	        AudioFifo *audioFifo);
-	AMBEEngine& getAMBEEngine() { return m_ambeEngine; }
 
     const QTimer& getMasterTimer() const { return m_masterTimer; }
     void setMIMOSupport(bool mimoSupport) { m_mimoSupport = mimoSupport; }
@@ -101,9 +98,6 @@ private:
     QTimer m_masterTimer;
 	bool m_dvSerialSupport;
     bool m_mimoSupport;
-#ifdef DSD_USE_SERIALDV
-	DVSerialEngine m_dvSerialEngine;
-#endif
 	AMBEEngine m_ambeEngine;
 };
 
diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html
index 8927af033..f0241dcff 100644
--- a/sdrbase/resources/webapi/doc/html2/index.html
+++ b/sdrbase/resources/webapi/doc/html2/index.html
@@ -707,7 +707,7 @@ margin-bottom: 20px;
       "description" : "1 if device is to be removed from active list"
     }
   },
-  "description" : "AMBE devices actibe in the system"
+  "description" : "AMBE devices active in the system"
 };
             defs.AMBEDevices = {
   "required" : [ "nbDevices" ],
@@ -27046,7 +27046,7 @@ except ApiException as e:
           </div>
           <div id="generator">
             <div class="content">
-              Generated 2019-07-19T18:33:26.198+02:00
+              Generated 2019-07-20T20:43:22.760+02:00
             </div>
           </div>
       </div>
diff --git a/sdrbase/resources/webapi/doc/swagger/swagger.yaml b/sdrbase/resources/webapi/doc/swagger/swagger.yaml
index 77a35cf8c..c17a93af0 100644
--- a/sdrbase/resources/webapi/doc/swagger/swagger.yaml
+++ b/sdrbase/resources/webapi/doc/swagger/swagger.yaml
@@ -1767,7 +1767,7 @@ definitions:
           $ref: "#/definitions/AMBEDevice"
 
   AMBEDevice:
-    description: "AMBE devices actibe in the system"
+    description: "AMBE devices active in the system"
     properties:
       deviceRef:
         description: "Serial device name or server address"
diff --git a/sdrbase/settings/mainsettings.cpp b/sdrbase/settings/mainsettings.cpp
index 1ebdbde0a..66062a442 100644
--- a/sdrbase/settings/mainsettings.cpp
+++ b/sdrbase/settings/mainsettings.cpp
@@ -3,8 +3,12 @@
 
 #include "settings/mainsettings.h"
 #include "commands/command.h"
+#include "audio/audiodevicemanager.h"
+#include "ambe/ambeengine.h"
 
-MainSettings::MainSettings() : m_audioDeviceManager(0)
+MainSettings::MainSettings() :
+    m_audioDeviceManager(nullptr),
+    m_ambeEngine(nullptr)
 {
 	resetToDefaults();
     qInfo("MainSettings::MainSettings: settings file: format: %d location: %s", getFileFormat(), qPrintable(getFileLocation()));
@@ -42,11 +46,14 @@ void MainSettings::load()
 	m_preferences.deserialize(qUncompress(QByteArray::fromBase64(s.value("preferences").toByteArray())));
 	m_workingPreset.deserialize(qUncompress(QByteArray::fromBase64(s.value("current").toByteArray())));
 
-	if (m_audioDeviceManager)
-	{
+	if (m_audioDeviceManager) {
 	    m_audioDeviceManager->deserialize(qUncompress(QByteArray::fromBase64(s.value("audio").toByteArray())));
 	}
 
+    if (m_ambeEngine) {
+        m_ambeEngine->deserialize(qUncompress(QByteArray::fromBase64(s.value("ambe").toByteArray())));
+    }
+
 	QStringList groups = s.childGroups();
 
 	for(int i = 0; i < groups.size(); ++i)
@@ -95,11 +102,14 @@ void MainSettings::save() const
 	s.setValue("preferences", qCompress(m_preferences.serialize()).toBase64());
 	s.setValue("current", qCompress(m_workingPreset.serialize()).toBase64());
 
-	if (m_audioDeviceManager)
-	{
+	if (m_audioDeviceManager) {
 	    s.setValue("audio", qCompress(m_audioDeviceManager->serialize()).toBase64());
 	}
 
+    if (m_ambeEngine) {
+        s.setValue("ambe", qCompress(m_ambeEngine->serialize()).toBase64());
+    }
+
 	QStringList groups = s.childGroups();
 
 	for(int i = 0; i < groups.size(); ++i)
diff --git a/sdrbase/settings/mainsettings.h b/sdrbase/settings/mainsettings.h
index f4c833906..c49bbda3d 100644
--- a/sdrbase/settings/mainsettings.h
+++ b/sdrbase/settings/mainsettings.h
@@ -2,13 +2,14 @@
 #define INCLUDE_SETTINGS_H
 
 #include <QString>
-#include "audio/audiodevicemanager.h"
 #include "device/deviceuserargs.h"
 #include "preferences.h"
 #include "preset.h"
 #include "export.h"
 
 class Command;
+class AudioDeviceManager;
+class AMBEEngine;
 
 class SDRBASE_API MainSettings {
 public:
@@ -63,6 +64,7 @@ public:
 
 	const AudioDeviceManager *getAudioDeviceManager() const { return m_audioDeviceManager; }
 	void setAudioDeviceManager(AudioDeviceManager *audioDeviceManager) { m_audioDeviceManager = audioDeviceManager; }
+    void setAMBEEngine(AMBEEngine *ambeEngine) { m_ambeEngine = ambeEngine; }
 
 protected:
 	Preferences m_preferences;
@@ -73,6 +75,7 @@ protected:
     typedef QList<Command*> Commands;
     Commands m_commands;
 	DeviceUserArgs m_hardwareDeviceUserArgs;
+    AMBEEngine *m_ambeEngine;
 };
 
 #endif // INCLUDE_SETTINGS_H
diff --git a/sdrbench/parserbench.cpp b/sdrbench/parserbench.cpp
index 830fd5e56..adbe3b135 100644
--- a/sdrbench/parserbench.cpp
+++ b/sdrbench/parserbench.cpp
@@ -24,7 +24,7 @@
 
 ParserBench::ParserBench() :
     m_testOption(QStringList() << "t" << "test",
-        "Test type.",
+        "Test type: decimateii, decimatefi, decimateff, decimateif, decimateinfii, decimatesupii, ambe",
         "test",
         "decimateii"),
     m_nbSamplesOption(QStringList() << "n" << "nb-samples",
diff --git a/sdrgui/gui/ambedevicesdialog.cpp b/sdrgui/gui/ambedevicesdialog.cpp
index d6e685e32..63c855550 100644
--- a/sdrgui/gui/ambedevicesdialog.cpp
+++ b/sdrgui/gui/ambedevicesdialog.cpp
@@ -22,7 +22,7 @@
 #include "ambedevicesdialog.h"
 #include "ui_ambedevicesdialog.h"
 
-AMBEDevicesDialog::AMBEDevicesDialog(AMBEEngine& ambeEngine, QWidget* parent) :
+AMBEDevicesDialog::AMBEDevicesDialog(AMBEEngine* ambeEngine, QWidget* parent) :
     QDialog(parent),
     ui(new Ui::AMBEDevicesDialog),
     m_ambeEngine(ambeEngine)
@@ -40,7 +40,7 @@ AMBEDevicesDialog::~AMBEDevicesDialog()
 void AMBEDevicesDialog::populateSerialList()
 {
     std::vector<QString> ambeSerialDevices;
-    m_ambeEngine.scan(ambeSerialDevices);
+    m_ambeEngine->scan(ambeSerialDevices);
     ui->ambeSerialDevices->clear();
     std::vector<QString>::const_iterator it = ambeSerialDevices.begin();
 
@@ -53,7 +53,7 @@ void AMBEDevicesDialog::populateSerialList()
 void AMBEDevicesDialog::refreshInUseList()
 {
     std::vector<QString> inUseDevices;
-    m_ambeEngine.getDeviceRefs(inUseDevices);
+    m_ambeEngine->getDeviceRefs(inUseDevices);
     ui->ambeDeviceRefs->clear();
     std::vector<QString>::const_iterator it = inUseDevices.begin();
 
@@ -80,7 +80,7 @@ void AMBEDevicesDialog::on_importSerial_clicked(bool checked)
 
     if (foundItems.size() == 0)
     {
-        if (m_ambeEngine.registerController(serialName.toStdString()))
+        if (m_ambeEngine->registerController(serialName.toStdString()))
         {
             ui->ambeDeviceRefs->addItem(serialName);
             ui->statusText->setText(tr("%1 added").arg(serialName));
@@ -109,7 +109,7 @@ void AMBEDevicesDialog::on_importAllSerial_clicked(bool checked)
 
         if (foundItems.size() == 0)
         {
-            if (m_ambeEngine.registerController(serialName.toStdString()))
+            if (m_ambeEngine->registerController(serialName.toStdString()))
             {
                 ui->ambeDeviceRefs->addItem(serialName);
                 count++;
@@ -132,7 +132,7 @@ void AMBEDevicesDialog::on_removeAmbeDevice_clicked(bool checked)
     }
 
     QString deviceName = deviceItem->text();
-    m_ambeEngine.releaseController(deviceName.toStdString());
+    m_ambeEngine->releaseController(deviceName.toStdString());
     ui->statusText->setText(tr("%1 removed").arg(deviceName));
     refreshInUseList();
 }
@@ -151,7 +151,7 @@ void AMBEDevicesDialog::on_clearAmbeList_clicked(bool checked)
         return;
     }
 
-    m_ambeEngine.releaseAll();
+    m_ambeEngine->releaseAll();
     ui->ambeDeviceRefs->clear();
     ui->statusText->setText("All items released");
 }
@@ -164,7 +164,7 @@ void AMBEDevicesDialog::on_importAddress_clicked(bool checked)
 
     if (foundItems.size() == 0)
     {
-        if (m_ambeEngine.registerController(addressAndPort.toStdString()))
+        if (m_ambeEngine->registerController(addressAndPort.toStdString()))
         {
             ui->ambeDeviceRefs->addItem(addressAndPort);
             ui->statusText->setText(tr("%1 added").arg(addressAndPort));
diff --git a/sdrgui/gui/ambedevicesdialog.h b/sdrgui/gui/ambedevicesdialog.h
index dba322820..c0309f395 100644
--- a/sdrgui/gui/ambedevicesdialog.h
+++ b/sdrgui/gui/ambedevicesdialog.h
@@ -34,7 +34,7 @@ class SDRGUI_API AMBEDevicesDialog : public QDialog {
     Q_OBJECT
 
 public:
-    explicit AMBEDevicesDialog(AMBEEngine& ambeEngine, QWidget* parent = nullptr);
+    explicit AMBEDevicesDialog(AMBEEngine* ambeEngine, QWidget* parent = nullptr);
     ~AMBEDevicesDialog();
 
 private:
@@ -42,7 +42,7 @@ private:
     void refreshInUseList();
 
     Ui::AMBEDevicesDialog* ui;
-    AMBEEngine& m_ambeEngine;
+    AMBEEngine* m_ambeEngine;
 
 private slots:
     void on_importSerial_clicked(bool checked);
diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp
index e571e2128..4d523e866 100644
--- a/sdrgui/mainwindow.cpp
+++ b/sdrgui/mainwindow.cpp
@@ -123,6 +123,7 @@ MainWindow::MainWindow(qtwebapp::LoggerWithFile *logger, const MainParser& parse
     splash->showStatusMessage("starting...", Qt::white);
 
 	m_settings.setAudioDeviceManager(m_dspEngine->getAudioDeviceManager());
+    m_settings.setAMBEEngine(m_dspEngine->getAMBEEngine());
 
 	ui->setupUi(this);
 	createStatusBar();
@@ -1628,48 +1629,6 @@ void MainWindow::on_action_AMBE_triggered()
     ambeDevicesDialog.exec();
 }
 
-void MainWindow::on_action_DV_Serial_triggered(bool checked)
-{
-    m_dspEngine->setDVSerialSupport(checked);
-
-    if (checked)
-    {
-        if (m_dspEngine->hasDVSerialSupport())
-        {
-            std::vector<std::string> deviceNames;
-            m_dspEngine->getDVSerialNames(deviceNames);
-
-            if (deviceNames.size() == 0)
-            {
-                QMessageBox::information(this, tr("Message"), tr("No DV serial devices found"));
-                qDebug("MainWindow::on_action_DV_Serial_triggered: No DV serial devices found");
-            }
-            else
-            {
-                std::vector<std::string>::iterator it = deviceNames.begin();
-                std::string deviceNamesStr = "DV Serial devices found: ";
-
-                while (it != deviceNames.end())
-                {
-                    if (it != deviceNames.begin()) {
-                        deviceNamesStr += ",";
-                    }
-
-                    deviceNamesStr += *it;
-                    ++it;
-                }
-
-                QMessageBox::information(this, tr("Message"), tr(deviceNamesStr.c_str()));
-            }
-        }
-        else
-        {
-            QMessageBox::information(this, tr("Message"), tr("No DV serial support"));
-            qDebug("MainWindow::on_action_DV_Serial_triggered: No DV serial support");
-        }
-    }
-}
-
 void MainWindow::sampleSourceChanged()
 {
     // Do it in the currently selected source tab
diff --git a/sdrgui/mainwindow.h b/sdrgui/mainwindow.h
index 36117af86..a091e754c 100644
--- a/sdrgui/mainwindow.h
+++ b/sdrgui/mainwindow.h
@@ -380,7 +380,6 @@ private slots:
 	void on_action_Audio_triggered();
     void on_action_Logging_triggered();
     void on_action_AMBE_triggered();
-	void on_action_DV_Serial_triggered(bool checked);
 	void on_action_My_Position_triggered();
     void on_action_DeviceUserArguments_triggered();
 	void sampleSourceChanged();
diff --git a/sdrgui/mainwindow.ui b/sdrgui/mainwindow.ui
index e1c4aa248..5f1ef57eb 100644
--- a/sdrgui/mainwindow.ui
+++ b/sdrgui/mainwindow.ui
@@ -64,7 +64,7 @@
      <x>0</x>
      <y>0</y>
      <width>1012</width>
-     <height>19</height>
+     <height>20</height>
     </rect>
    </property>
    <widget class="QMenu" name="menu_File">
@@ -126,7 +126,6 @@
     <addaction name="action_Audio"/>
     <addaction name="action_Logging"/>
     <addaction name="action_AMBE"/>
-    <addaction name="action_DV_Serial"/>
     <addaction name="action_My_Position"/>
     <addaction name="menuDevices"/>
    </widget>
diff --git a/sdrsrv/maincore.cpp b/sdrsrv/maincore.cpp
index 8924b47cb..7e6220777 100644
--- a/sdrsrv/maincore.cpp
+++ b/sdrsrv/maincore.cpp
@@ -59,6 +59,7 @@ MainCore::MainCore(qtwebapp::LoggerWithFile *logger, const MainParser& parser, Q
 
     m_instance = this;
     m_settings.setAudioDeviceManager(m_dspEngine->getAudioDeviceManager());
+    m_settings.setAMBEEngine(m_dspEngine->getAMBEEngine());
 
     m_pluginManager = new PluginManager(this);
     m_pluginManager->loadPlugins(QString("pluginssrv"));
diff --git a/swagger/sdrangel/api/swagger/swagger.yaml b/swagger/sdrangel/api/swagger/swagger.yaml
index 93d22cf9f..e0d0f221d 100644
--- a/swagger/sdrangel/api/swagger/swagger.yaml
+++ b/swagger/sdrangel/api/swagger/swagger.yaml
@@ -1767,7 +1767,7 @@ definitions:
           $ref: "#/definitions/AMBEDevice"
 
   AMBEDevice:
-    description: "AMBE devices actibe in the system"
+    description: "AMBE devices active in the system"
     properties:
       deviceRef:
         description: "Serial device name or server address"
diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html
index 8927af033..f0241dcff 100644
--- a/swagger/sdrangel/code/html2/index.html
+++ b/swagger/sdrangel/code/html2/index.html
@@ -707,7 +707,7 @@ margin-bottom: 20px;
       "description" : "1 if device is to be removed from active list"
     }
   },
-  "description" : "AMBE devices actibe in the system"
+  "description" : "AMBE devices active in the system"
 };
             defs.AMBEDevices = {
   "required" : [ "nbDevices" ],
@@ -27046,7 +27046,7 @@ except ApiException as e:
           </div>
           <div id="generator">
             <div class="content">
-              Generated 2019-07-19T18:33:26.198+02:00
+              Generated 2019-07-20T20:43:22.760+02:00
             </div>
           </div>
       </div>
diff --git a/swagger/sdrangel/code/qt5/client/SWGAMBEDevice.h b/swagger/sdrangel/code/qt5/client/SWGAMBEDevice.h
index ff70aa138..fad69088b 100644
--- a/swagger/sdrangel/code/qt5/client/SWGAMBEDevice.h
+++ b/swagger/sdrangel/code/qt5/client/SWGAMBEDevice.h
@@ -13,7 +13,7 @@
 /*
  * SWGAMBEDevice.h
  *
- * AMBE devices actibe in the system
+ * AMBE devices active in the system
  */
 
 #ifndef SWGAMBEDevice_H_