diff --git a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmod.h b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmod.h
index 555a8fdc4..fa2c614b3 100644
--- a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmod.h
+++ b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmod.h
@@ -113,6 +113,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 0; }
     virtual int getNbSourceStreams() const { return 2; }
+    virtual int getStreamIndex() const { return -1; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelmimo/doa2/doa2.h b/plugins/channelmimo/doa2/doa2.h
index 9907698a3..236f90b29 100644
--- a/plugins/channelmimo/doa2/doa2.h
+++ b/plugins/channelmimo/doa2/doa2.h
@@ -113,6 +113,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 2; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return -1; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelmimo/interferometer/interferometer.h b/plugins/channelmimo/interferometer/interferometer.h
index 5e87ffbe9..0eed37d8a 100644
--- a/plugins/channelmimo/interferometer/interferometer.h
+++ b/plugins/channelmimo/interferometer/interferometer.h
@@ -113,6 +113,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 2; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return -1; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/chanalyzer/chanalyzer.h b/plugins/channelrx/chanalyzer/chanalyzer.h
index c311f51d1..018720ce2 100644
--- a/plugins/channelrx/chanalyzer/chanalyzer.h
+++ b/plugins/channelrx/chanalyzer/chanalyzer.h
@@ -100,6 +100,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
     uint32_t getNumberOfDeviceStreams() const;
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
diff --git a/plugins/channelrx/demodadsb/adsbdemod.h b/plugins/channelrx/demodadsb/adsbdemod.h
index 2a3ab8f7e..2ded12ee9 100644
--- a/plugins/channelrx/demodadsb/adsbdemod.h
+++ b/plugins/channelrx/demodadsb/adsbdemod.h
@@ -115,6 +115,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodais/aisdemod.h b/plugins/channelrx/demodais/aisdemod.h
index 1be40065c..54b521af2 100644
--- a/plugins/channelrx/demodais/aisdemod.h
+++ b/plugins/channelrx/demodais/aisdemod.h
@@ -125,6 +125,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodam/amdemod.h b/plugins/channelrx/demodam/amdemod.h
index 5ed4b3c54..64ade14b3 100644
--- a/plugins/channelrx/demodam/amdemod.h
+++ b/plugins/channelrx/demodam/amdemod.h
@@ -88,6 +88,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodapt/aptdemod.h b/plugins/channelrx/demodapt/aptdemod.h
index aa580dcc5..67fe1192c 100644
--- a/plugins/channelrx/demodapt/aptdemod.h
+++ b/plugins/channelrx/demodapt/aptdemod.h
@@ -220,6 +220,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodatv/atvdemod.h b/plugins/channelrx/demodatv/atvdemod.h
index 51d199969..09eddbcf3 100644
--- a/plugins/channelrx/demodatv/atvdemod.h
+++ b/plugins/channelrx/demodatv/atvdemod.h
@@ -86,6 +86,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodbfm/bfmdemod.h b/plugins/channelrx/demodbfm/bfmdemod.h
index ac9f58f24..f9b81ddcd 100644
--- a/plugins/channelrx/demodbfm/bfmdemod.h
+++ b/plugins/channelrx/demodbfm/bfmdemod.h
@@ -96,6 +96,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodchirpchat/chirpchatdemod.h b/plugins/channelrx/demodchirpchat/chirpchatdemod.h
index b2e770a69..f1432f4f4 100644
--- a/plugins/channelrx/demodchirpchat/chirpchatdemod.h
+++ b/plugins/channelrx/demodchirpchat/chirpchatdemod.h
@@ -228,6 +228,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demoddab/dabdemod.h b/plugins/channelrx/demoddab/dabdemod.h
index ca2a63cf3..8f90cc756 100644
--- a/plugins/channelrx/demoddab/dabdemod.h
+++ b/plugins/channelrx/demoddab/dabdemod.h
@@ -355,6 +355,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demoddatv/datvdemod.h b/plugins/channelrx/demoddatv/datvdemod.h
index c8db06f6f..a3785b712 100644
--- a/plugins/channelrx/demoddatv/datvdemod.h
+++ b/plugins/channelrx/demoddatv/datvdemod.h
@@ -67,6 +67,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
     uint32_t getNumberOfDeviceStreams() const;
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
diff --git a/plugins/channelrx/demoddsc/dscdemod.h b/plugins/channelrx/demoddsc/dscdemod.h
index cbdfe5da0..bcd768b2b 100644
--- a/plugins/channelrx/demoddsc/dscdemod.h
+++ b/plugins/channelrx/demoddsc/dscdemod.h
@@ -122,6 +122,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demoddsd/dsddemod.h b/plugins/channelrx/demoddsd/dsddemod.h
index bb9ed0a98..6d47bf739 100644
--- a/plugins/channelrx/demoddsd/dsddemod.h
+++ b/plugins/channelrx/demoddsd/dsddemod.h
@@ -121,6 +121,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodfreedv/freedvdemod.h b/plugins/channelrx/demodfreedv/freedvdemod.h
index 3b560deda..61e13041e 100644
--- a/plugins/channelrx/demodfreedv/freedvdemod.h
+++ b/plugins/channelrx/demodfreedv/freedvdemod.h
@@ -103,6 +103,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodft8/ft8demod.h b/plugins/channelrx/demodft8/ft8demod.h
index 89202be50..8b57d2b23 100644
--- a/plugins/channelrx/demodft8/ft8demod.h
+++ b/plugins/channelrx/demodft8/ft8demod.h
@@ -92,6 +92,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodils/ilsdemod.h b/plugins/channelrx/demodils/ilsdemod.h
index fc98d10c5..accc95ce7 100644
--- a/plugins/channelrx/demodils/ilsdemod.h
+++ b/plugins/channelrx/demodils/ilsdemod.h
@@ -134,6 +134,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodm17/m17demod.h b/plugins/channelrx/demodm17/m17demod.h
index 22dbd9478..758299e0b 100644
--- a/plugins/channelrx/demodm17/m17demod.h
+++ b/plugins/channelrx/demodm17/m17demod.h
@@ -177,6 +177,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodnavtex/navtexdemod.h b/plugins/channelrx/demodnavtex/navtexdemod.h
index 72c1b11cd..a9dc61f47 100644
--- a/plugins/channelrx/demodnavtex/navtexdemod.h
+++ b/plugins/channelrx/demodnavtex/navtexdemod.h
@@ -141,6 +141,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodnfm/nfmdemod.h b/plugins/channelrx/demodnfm/nfmdemod.h
index 7cd54e745..14ca52d10 100644
--- a/plugins/channelrx/demodnfm/nfmdemod.h
+++ b/plugins/channelrx/demodnfm/nfmdemod.h
@@ -88,6 +88,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodpacket/packetdemod.h b/plugins/channelrx/demodpacket/packetdemod.h
index 701baaa0a..1d0d1238a 100644
--- a/plugins/channelrx/demodpacket/packetdemod.h
+++ b/plugins/channelrx/demodpacket/packetdemod.h
@@ -93,6 +93,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodpager/pagerdemod.h b/plugins/channelrx/demodpager/pagerdemod.h
index 64b8dcc96..cae8e7658 100644
--- a/plugins/channelrx/demodpager/pagerdemod.h
+++ b/plugins/channelrx/demodpager/pagerdemod.h
@@ -148,6 +148,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodradiosonde/radiosondedemod.h b/plugins/channelrx/demodradiosonde/radiosondedemod.h
index ca49ac0d9..5fce1de41 100644
--- a/plugins/channelrx/demodradiosonde/radiosondedemod.h
+++ b/plugins/channelrx/demodradiosonde/radiosondedemod.h
@@ -128,6 +128,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodrtty/rttydemod.h b/plugins/channelrx/demodrtty/rttydemod.h
index a00535e2b..aa0267a0f 100644
--- a/plugins/channelrx/demodrtty/rttydemod.h
+++ b/plugins/channelrx/demodrtty/rttydemod.h
@@ -135,6 +135,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodssb/ssbdemod.h b/plugins/channelrx/demodssb/ssbdemod.h
index 75e4834c9..49c3aa067 100644
--- a/plugins/channelrx/demodssb/ssbdemod.h
+++ b/plugins/channelrx/demodssb/ssbdemod.h
@@ -92,6 +92,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodssb/ssbdemodsink.cpp b/plugins/channelrx/demodssb/ssbdemodsink.cpp
index 7531b4d69..3635ac96e 100644
--- a/plugins/channelrx/demodssb/ssbdemodsink.cpp
+++ b/plugins/channelrx/demodssb/ssbdemodsink.cpp
@@ -178,7 +178,7 @@ void SSBDemodSink::processOneSample(Complex &ci)
         // Only if AGC is active
         if (m_agcActive && m_agcClamping && agcVal > 100.0)
         {
-            qDebug("SSBDemodSink::processOneSample: %f", agcVal);
+            // qDebug("SSBDemodSink::processOneSample: %f", agcVal);
             m_agc.reset(m_agcTarget*m_agcTarget);
             m_squelchDelayLine.write(fftfilt::cmplx{0.0, 0.0});
         }
diff --git a/plugins/channelrx/demodvor/vordemod.h b/plugins/channelrx/demodvor/vordemod.h
index c7d165e6c..61816fe60 100644
--- a/plugins/channelrx/demodvor/vordemod.h
+++ b/plugins/channelrx/demodvor/vordemod.h
@@ -90,6 +90,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/demodwfm/wfmdemod.h b/plugins/channelrx/demodwfm/wfmdemod.h
index 6a118e7b5..df9d15b96 100644
--- a/plugins/channelrx/demodwfm/wfmdemod.h
+++ b/plugins/channelrx/demodwfm/wfmdemod.h
@@ -88,6 +88,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/filesink/filesink.h b/plugins/channelrx/filesink/filesink.h
index a86e189fb..516bd2d23 100644
--- a/plugins/channelrx/filesink/filesink.h
+++ b/plugins/channelrx/filesink/filesink.h
@@ -107,6 +107,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/freqscanner/freqscanner.cpp b/plugins/channelrx/freqscanner/freqscanner.cpp
index f59856762..d11326f5e 100644
--- a/plugins/channelrx/freqscanner/freqscanner.cpp
+++ b/plugins/channelrx/freqscanner/freqscanner.cpp
@@ -302,9 +302,9 @@ void FreqScanner::setDeviceCenterFrequency(qint64 frequency)
 
 void FreqScanner::initScan()
 {
-    if (m_scanChannelIndex < 0) {
-        applyChannelSetting(m_settings.m_channel);
-    }
+    // if (m_scanChannelIndex < 0) { // Always false
+    //     applyChannelSetting(m_settings.m_channel);
+    // }
     ChannelWebAPIUtils::setAudioMute(m_scanDeviceSetIndex, m_scanChannelIndex, true);
 
     if (m_centerFrequency != m_stepStartFrequency) {
@@ -700,6 +700,7 @@ void FreqScanner::applySettings(const FreqScannerSettings& settings, const QStri
             m_deviceAPI->removeChannelSink(this, m_settings.m_streamIndex);
             m_deviceAPI->addChannelSink(this, settings.m_streamIndex);
             m_deviceAPI->addChannelSinkAPI(this);
+            scanAvailableChannels(); // re-scan
         }
     }
 
@@ -1108,22 +1109,53 @@ void FreqScanner::handleIndexInDeviceSetChanged(int index)
 
 void FreqScanner::scanAvailableChannels()
 {
-    MainCore* mainCore = MainCore::instance();
-    std::vector<DeviceSet*>& deviceSets = mainCore->getDeviceSets();
     m_availableChannels.clear();
 
-    for (const auto& deviceSet : deviceSets)
+    DSPDeviceSourceEngine* deviceSourceEngine = getDeviceAPI()->getDeviceSourceEngine();
+
+    if (deviceSourceEngine)
     {
-        DSPDeviceSourceEngine* deviceSourceEngine = deviceSet->m_deviceSourceEngine;
-
-        if (deviceSourceEngine)
+        for (int chi = 0; chi < getDeviceAPI()->getNbSinkChannels(); chi++) // Rx channels
         {
-            for (int chi = 0; chi < deviceSet->getNumberOfChannels(); chi++)
-            {
-                ChannelAPI* channel = deviceSet->getChannelAt(chi);
+            ChannelAPI* channel = getDeviceAPI()->getChanelSinkAPIAt(chi);
 
+            if (channel->getIndexInDeviceSet() == getIndexInDeviceSet()) { // Exclude oneself
+                continue;
+            }
+
+            FreqScannerSettings::AvailableChannel availableChannel =
+                FreqScannerSettings::AvailableChannel{
+                    channel->getDeviceSetIndex(),
+                    channel->getIndexInDeviceSet(),
+                    -1
+                };
+            m_availableChannels[channel] = availableChannel;
+        }
+    }
+
+    DSPDeviceMIMOEngine *deviceMIMOEngine = getDeviceAPI()->getDeviceMIMOEngine();
+
+    if (deviceMIMOEngine)
+    {
+        for (int chi = 0; chi < getDeviceAPI()->getNbSinkChannels(); chi++) // Rx channels
+        {
+            ChannelAPI* channel = getDeviceAPI()->getChanelSinkAPIAt(chi);
+
+            if (channel->getIndexInDeviceSet() == getIndexInDeviceSet()) { // Exclude oneself
+                continue;
+            }
+
+            // Single Rx on the same I/Q stream
+            if ((channel->getNbSinkStreams() == 1)
+                && (channel->getNbSourceStreams() == 0)
+                && (channel->getStreamIndex() == m_settings.m_streamIndex))
+            {
                 FreqScannerSettings::AvailableChannel availableChannel =
-                    FreqScannerSettings::AvailableChannel{ channel->getDeviceSetIndex(), channel->getIndexInDeviceSet()};
+                    FreqScannerSettings::AvailableChannel{
+                        channel->getDeviceSetIndex(),
+                        channel->getIndexInDeviceSet(),
+                        channel->getStreamIndex()
+                    };
                 m_availableChannels[channel] = availableChannel;
             }
         }
@@ -1134,16 +1166,34 @@ void FreqScanner::scanAvailableChannels()
 
 void FreqScanner::handleChannelAdded(int deviceSetIndex, ChannelAPI* channel)
 {
+    if (deviceSetIndex != getDeviceSetIndex()) { // Can control channels only in the same device set
+        return;
+    }
+
     qDebug("FreqScanner::handleChannelAdded: deviceSetIndex: %d:%d channel: %s (%p)",
         deviceSetIndex, channel->getIndexInDeviceSet(), qPrintable(channel->getURI()), channel);
-    std::vector<DeviceSet*>& deviceSets = MainCore::instance()->getDeviceSets();
-    DeviceSet* deviceSet = deviceSets[deviceSetIndex];
-    DSPDeviceSourceEngine* deviceSourceEngine = deviceSet->m_deviceSourceEngine;
+    DSPDeviceSourceEngine* deviceSourceEngine = getDeviceAPI()->getDeviceSourceEngine();
 
     if (deviceSourceEngine)
     {
         FreqScannerSettings::AvailableChannel availableChannel =
-            FreqScannerSettings::AvailableChannel{ deviceSetIndex, channel->getIndexInDeviceSet()};
+            FreqScannerSettings::AvailableChannel{ deviceSetIndex, channel->getIndexInDeviceSet(), -1};
+        m_availableChannels[channel] = availableChannel;
+    }
+
+    DSPDeviceMIMOEngine *deviceMIMOEngine = getDeviceAPI()->getDeviceMIMOEngine();
+
+    if (deviceMIMOEngine
+        && (channel->getNbSinkStreams() == 1)
+        && (channel->getNbSourceStreams() == 0)
+        && (channel->getStreamIndex() == m_settings.m_streamIndex))
+    {
+        FreqScannerSettings::AvailableChannel availableChannel =
+            FreqScannerSettings::AvailableChannel{
+                deviceSetIndex,
+                channel->getIndexInDeviceSet(),
+                channel->getStreamIndex()
+            };
         m_availableChannels[channel] = availableChannel;
     }
 
@@ -1152,13 +1202,16 @@ void FreqScanner::handleChannelAdded(int deviceSetIndex, ChannelAPI* channel)
 
 void FreqScanner::handleChannelRemoved(int deviceSetIndex, ChannelAPI* channel)
 {
+    if (deviceSetIndex != getDeviceSetIndex()) { // Can control channels only in the same device set
+        return;
+    }
+
     qDebug("FreqScanner::handleChannelRemoved: deviceSetIndex: %d:%d channel: %s (%p)",
         deviceSetIndex, channel->getIndexInDeviceSet(), qPrintable(channel->getURI()), channel);
-    std::vector<DeviceSet*>& deviceSets = MainCore::instance()->getDeviceSets();
-    DeviceSet* deviceSet = deviceSets[deviceSetIndex];
-    DSPDeviceSourceEngine* deviceSourceEngine = deviceSet->m_deviceSourceEngine;
+    DSPDeviceSourceEngine* deviceSourceEngine = getDeviceAPI()->getDeviceSourceEngine();
+    DSPDeviceMIMOEngine *deviceMIMOEngine = getDeviceAPI()->getDeviceMIMOEngine();
 
-    if (deviceSourceEngine) {
+    if (deviceSourceEngine || deviceMIMOEngine) {
         m_availableChannels.remove(channel);
     }
 
@@ -1178,8 +1231,9 @@ void FreqScanner::notifyUpdateChannels()
             FreqScannerSettings::AvailableChannel msgChannel =
                 FreqScannerSettings::AvailableChannel{
                     it->m_deviceSetIndex,
-                    it->m_channelIndex
-            };
+                    it->m_channelIndex,
+                    it->m_streamIndex
+                };
             msgChannels.push_back(msgChannel);
         }
 
diff --git a/plugins/channelrx/freqscanner/freqscanner.h b/plugins/channelrx/freqscanner/freqscanner.h
index e0e7ba2c6..e56262e2d 100644
--- a/plugins/channelrx/freqscanner/freqscanner.h
+++ b/plugins/channelrx/freqscanner/freqscanner.h
@@ -307,6 +307,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/freqscanner/freqscannergui.cpp b/plugins/channelrx/freqscanner/freqscannergui.cpp
index 8563e183e..71030f12b 100644
--- a/plugins/channelrx/freqscanner/freqscannergui.cpp
+++ b/plugins/channelrx/freqscanner/freqscannergui.cpp
@@ -225,7 +225,14 @@ void FreqScannerGUI::updateChannelsCombo(QComboBox *combo, const QList<FreqScann
         // Add channels in this device set, other than ourself (Don't use ChannelGUI::getDeviceSetIndex()/getIndex() as not valid when this is first called)
         if ((channel.m_deviceSetIndex == m_freqScanner->getDeviceSetIndex()) && (channel.m_channelIndex != m_freqScanner->getIndexInDeviceSet()))
         {
-            QString name = QString("R%1:%2").arg(channel.m_deviceSetIndex).arg(channel.m_channelIndex);
+            QString name;
+
+            if (channel.m_streamIndex < 0) { // Rx
+                name = QString("R%1:%2").arg(channel.m_deviceSetIndex).arg(channel.m_channelIndex);
+            } else { // MIMO
+                name = QString("M%1:%2.%3").arg(channel.m_deviceSetIndex).arg(channel.m_channelIndex).arg(channel.m_streamIndex);
+            }
+
             combo->addItem(name);
         }
     }
diff --git a/plugins/channelrx/freqscanner/freqscannersettings.h b/plugins/channelrx/freqscanner/freqscannersettings.h
index 8c073e119..439f06419 100644
--- a/plugins/channelrx/freqscanner/freqscannersettings.h
+++ b/plugins/channelrx/freqscanner/freqscannersettings.h
@@ -35,6 +35,7 @@ struct FreqScannerSettings
     {
         int m_deviceSetIndex;
         int m_channelIndex;
+        int m_streamIndex;
 
         AvailableChannel() = default;
         AvailableChannel(const AvailableChannel&) = default;
diff --git a/plugins/channelrx/freqtracker/freqtracker.h b/plugins/channelrx/freqtracker/freqtracker.h
index 7a38e11c3..451ebf44f 100644
--- a/plugins/channelrx/freqtracker/freqtracker.h
+++ b/plugins/channelrx/freqtracker/freqtracker.h
@@ -88,6 +88,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/heatmap/heatmap.h b/plugins/channelrx/heatmap/heatmap.h
index 3d9fe71d4..91505d224 100644
--- a/plugins/channelrx/heatmap/heatmap.h
+++ b/plugins/channelrx/heatmap/heatmap.h
@@ -95,6 +95,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/localsink/localsink.h b/plugins/channelrx/localsink/localsink.h
index cfb02001e..663d76687 100644
--- a/plugins/channelrx/localsink/localsink.h
+++ b/plugins/channelrx/localsink/localsink.h
@@ -108,6 +108,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/noisefigure/noisefigure.h b/plugins/channelrx/noisefigure/noisefigure.h
index 316180604..bc9335db7 100644
--- a/plugins/channelrx/noisefigure/noisefigure.h
+++ b/plugins/channelrx/noisefigure/noisefigure.h
@@ -198,6 +198,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/radioastronomy/radioastronomy.h b/plugins/channelrx/radioastronomy/radioastronomy.h
index d287fe9ba..1021f8590 100644
--- a/plugins/channelrx/radioastronomy/radioastronomy.h
+++ b/plugins/channelrx/radioastronomy/radioastronomy.h
@@ -386,6 +386,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/radioclock/radioclock.h b/plugins/channelrx/radioclock/radioclock.h
index a281b2091..4f367ff1a 100644
--- a/plugins/channelrx/radioclock/radioclock.h
+++ b/plugins/channelrx/radioclock/radioclock.h
@@ -138,6 +138,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/remotesink/remotesink.h b/plugins/channelrx/remotesink/remotesink.h
index 47369a225..4fbc49e4d 100644
--- a/plugins/channelrx/remotesink/remotesink.h
+++ b/plugins/channelrx/remotesink/remotesink.h
@@ -87,6 +87,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/remotetcpsink/remotetcpsink.h b/plugins/channelrx/remotetcpsink/remotetcpsink.h
index 57cb6e3d6..4b5cf1108 100644
--- a/plugins/channelrx/remotetcpsink/remotetcpsink.h
+++ b/plugins/channelrx/remotetcpsink/remotetcpsink.h
@@ -129,6 +129,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/sigmffilesink/sigmffilesink.h b/plugins/channelrx/sigmffilesink/sigmffilesink.h
index 7a11253d5..3a5f3e29a 100644
--- a/plugins/channelrx/sigmffilesink/sigmffilesink.h
+++ b/plugins/channelrx/sigmffilesink/sigmffilesink.h
@@ -107,6 +107,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channelrx/udpsink/udpsink.h b/plugins/channelrx/udpsink/udpsink.h
index 65bda9d35..c08d4d256 100644
--- a/plugins/channelrx/udpsink/udpsink.h
+++ b/plugins/channelrx/udpsink/udpsink.h
@@ -94,6 +94,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/filesource/filesource.h b/plugins/channeltx/filesource/filesource.h
index b71a20165..20bb8e0b4 100644
--- a/plugins/channeltx/filesource/filesource.h
+++ b/plugins/channeltx/filesource/filesource.h
@@ -169,6 +169,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 0; }
     virtual int getNbSourceStreams() const { return 1; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/localsource/localsource.h b/plugins/channeltx/localsource/localsource.h
index bcd5e2258..4ce4e9eee 100644
--- a/plugins/channeltx/localsource/localsource.h
+++ b/plugins/channeltx/localsource/localsource.h
@@ -84,6 +84,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 0; }
     virtual int getNbSourceStreams() const { return 1; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/mod802.15.4/ieee_802_15_4_mod.h b/plugins/channeltx/mod802.15.4/ieee_802_15_4_mod.h
index ca5254107..956f48209 100644
--- a/plugins/channeltx/mod802.15.4/ieee_802_15_4_mod.h
+++ b/plugins/channeltx/mod802.15.4/ieee_802_15_4_mod.h
@@ -113,6 +113,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/modais/aismod.h b/plugins/channeltx/modais/aismod.h
index bbc4d6a49..d93a350eb 100644
--- a/plugins/channeltx/modais/aismod.h
+++ b/plugins/channeltx/modais/aismod.h
@@ -174,6 +174,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/modam/ammod.h b/plugins/channeltx/modam/ammod.h
index 647b4a446..61f427a53 100644
--- a/plugins/channeltx/modam/ammod.h
+++ b/plugins/channeltx/modam/ammod.h
@@ -196,6 +196,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/modatv/atvmod.h b/plugins/channeltx/modatv/atvmod.h
index 7f8f04c49..bc77a82fc 100644
--- a/plugins/channeltx/modatv/atvmod.h
+++ b/plugins/channeltx/modatv/atvmod.h
@@ -267,6 +267,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/modchirpchat/chirpchatmod.h b/plugins/channeltx/modchirpchat/chirpchatmod.h
index c1f8bc22a..583118235 100644
--- a/plugins/channeltx/modchirpchat/chirpchatmod.h
+++ b/plugins/channeltx/modchirpchat/chirpchatmod.h
@@ -112,6 +112,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/moddatv/datvmod.h b/plugins/channeltx/moddatv/datvmod.h
index 98781f861..bb259141a 100644
--- a/plugins/channeltx/moddatv/datvmod.h
+++ b/plugins/channeltx/moddatv/datvmod.h
@@ -222,6 +222,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/modfreedv/freedvmod.h b/plugins/channeltx/modfreedv/freedvmod.h
index d050e219e..698dee921 100644
--- a/plugins/channeltx/modfreedv/freedvmod.h
+++ b/plugins/channeltx/modfreedv/freedvmod.h
@@ -200,6 +200,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/modm17/m17mod.h b/plugins/channeltx/modm17/m17mod.h
index 8122f4f3c..aa5e0657e 100644
--- a/plugins/channeltx/modm17/m17mod.h
+++ b/plugins/channeltx/modm17/m17mod.h
@@ -200,6 +200,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/modnfm/nfmmod.h b/plugins/channeltx/modnfm/nfmmod.h
index 6c0d9de67..36478dbac 100644
--- a/plugins/channeltx/modnfm/nfmmod.h
+++ b/plugins/channeltx/modnfm/nfmmod.h
@@ -196,6 +196,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/modpacket/packetmod.h b/plugins/channeltx/modpacket/packetmod.h
index ba006f920..66bb7c4ee 100644
--- a/plugins/channeltx/modpacket/packetmod.h
+++ b/plugins/channeltx/modpacket/packetmod.h
@@ -164,6 +164,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/modpsk31/psk31mod.h b/plugins/channeltx/modpsk31/psk31mod.h
index 58b41de77..4b217ab88 100644
--- a/plugins/channeltx/modpsk31/psk31mod.h
+++ b/plugins/channeltx/modpsk31/psk31mod.h
@@ -148,6 +148,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/modrtty/rttymod.h b/plugins/channeltx/modrtty/rttymod.h
index dd6ad4324..ea332c678 100644
--- a/plugins/channeltx/modrtty/rttymod.h
+++ b/plugins/channeltx/modrtty/rttymod.h
@@ -148,6 +148,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/modssb/ssbmod.h b/plugins/channeltx/modssb/ssbmod.h
index 43685e310..2587bf1e0 100644
--- a/plugins/channeltx/modssb/ssbmod.h
+++ b/plugins/channeltx/modssb/ssbmod.h
@@ -198,6 +198,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/modwfm/wfmmod.h b/plugins/channeltx/modwfm/wfmmod.h
index 879aa5547..b538e003a 100644
--- a/plugins/channeltx/modwfm/wfmmod.h
+++ b/plugins/channeltx/modwfm/wfmmod.h
@@ -196,6 +196,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/remotesource/remotesource.h b/plugins/channeltx/remotesource/remotesource.h
index 67c251cc2..02fcfd29d 100644
--- a/plugins/channeltx/remotesource/remotesource.h
+++ b/plugins/channeltx/remotesource/remotesource.h
@@ -178,6 +178,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 0; }
     virtual int getNbSourceStreams() const { return 1; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/plugins/channeltx/udpsource/udpsource.h b/plugins/channeltx/udpsource/udpsource.h
index 6e6662794..c633b5fcc 100644
--- a/plugins/channeltx/udpsource/udpsource.h
+++ b/plugins/channeltx/udpsource/udpsource.h
@@ -117,6 +117,7 @@ public:
 
     virtual int getNbSinkStreams() const { return 1; }
     virtual int getNbSourceStreams() const { return 0; }
+    virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
 
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
     {
diff --git a/sdrbase/channel/channelapi.h b/sdrbase/channel/channelapi.h
index 260546f21..c9301c433 100644
--- a/sdrbase/channel/channelapi.h
+++ b/sdrbase/channel/channelapi.h
@@ -153,6 +153,7 @@ public:
     StreamType getStreamType() const { return m_streamType; }
     virtual int getNbSinkStreams() const = 0;
     virtual int getNbSourceStreams() const = 0;
+    virtual int getStreamIndex() const = 0;
     virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const = 0;
 
     void handlePipeMessageQueue(MessageQueue* messageQueue)