diff --git a/plugins/channel/demoddsd/dsddecoder.h b/plugins/channel/demoddsd/dsddecoder.h
index 02bdb2409..8d3f3a25a 100644
--- a/plugins/channel/demoddsd/dsddecoder.h
+++ b/plugins/channel/demoddsd/dsddecoder.h
@@ -33,8 +33,14 @@ public:
     void resetAudio() { m_decoder.resetAudio(); }
 
     int getInLevel() const { return m_decoder.getInLevel(); }
+    int getSamplesPerSymbol() const { return m_decoder.getSamplesPerSymbol(); }
+    DSDcc::DSDDecoder::DSDSyncType getSyncType() const { return m_decoder.getSyncType(); }
+    DSDcc::DSDDecoder::DSDStationType getStationType() const { return m_decoder.getStationType(); }
     const char *getFrameTypeText() const { return m_decoder.getFrameTypeText(); }
     const char *getModulationText() const { return m_decoder.getModulationText(); }
+    const char *getSlot0Text() const { return m_decoder.getSlot0Text(); }
+    const char *getSlot1Text() const { return m_decoder.getSlot1Text(); }
+    const DSDcc::DSDDstar& getDStarDecoder() const { return m_decoder.getDStarDecoder(); }
 
     void setAudioGain(float gain) { m_decoder.setAudioGain(gain); }
 
diff --git a/plugins/channel/demoddsd/dsddemod.cpp b/plugins/channel/demoddsd/dsddemod.cpp
index 6df2f1fd5..a546a1802 100644
--- a/plugins/channel/demoddsd/dsddemod.cpp
+++ b/plugins/channel/demoddsd/dsddemod.cpp
@@ -95,6 +95,7 @@ void DSDDemod::configure(MessageQueue* messageQueue,
 void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool firstOfBurst)
 {
 	Complex ci;
+	int samplesPerSymbol = m_dsdDecoder.getSamplesPerSymbol();
 
 	m_settingsMutex.lock();
 	m_scopeSampleBuffer.clear();
@@ -147,10 +148,10 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
 
             m_sampleBuffer[m_sampleBufferIndex] = sample;
 
-            if (m_sampleBufferIndex < 20) {
-                delayedSample = m_sampleBuffer[(1<<17) - 20 + m_sampleBufferIndex];
+            if (m_sampleBufferIndex < samplesPerSymbol) {
+                delayedSample = m_sampleBuffer[(1<<17) - samplesPerSymbol + m_sampleBufferIndex]; // wrap
             } else {
-                delayedSample = m_sampleBuffer[m_sampleBufferIndex - 20];
+                delayedSample = m_sampleBuffer[m_sampleBufferIndex - samplesPerSymbol];
             }
 
             Sample s(sample, delayedSample); // I=signal, Q=signal delayed by 20 samples (2400 baud: lowest rate)
diff --git a/plugins/channel/demoddsd/dsddemod.h b/plugins/channel/demoddsd/dsddemod.h
index c4c38fea8..23e42011b 100644
--- a/plugins/channel/demoddsd/dsddemod.h
+++ b/plugins/channel/demoddsd/dsddemod.h
@@ -58,7 +58,7 @@ public:
 		m_dsdDemodGUI = dsdDemodGUI;
 	}
 
-	Real getMagSq() { return m_magsq; }
+	Real getMagSq() { return m_movingAverage.average(); }
 	bool getSquelchOpen() const { return m_squelchOpen; }
 
 	const DSDDecoder& getDecoder() const { return m_dsdDecoder; }
diff --git a/plugins/channel/demoddsd/dsddemodgui.cpp b/plugins/channel/demoddsd/dsddemodgui.cpp
index 56a1aff06..6ed11e664 100644
--- a/plugins/channel/demoddsd/dsddemodgui.cpp
+++ b/plugins/channel/demoddsd/dsddemodgui.cpp
@@ -250,6 +250,7 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, QWidget* parent) :
 	m_channelMarker(this),
 	m_basicSettingsShown(false),
 	m_doApplySettings(true),
+	m_signalFormat(signalFormatNone),
 	m_squelchOpen(false),
 	m_channelPowerDbAvg(20,0),
 	m_tickCount(0)
@@ -353,6 +354,80 @@ void DSDDemodGUI::blockApplySettings(bool block)
 	m_doApplySettings = !block;
 }
 
+void DSDDemodGUI::formatStatusText()
+{
+    switch (m_dsdDemod->getDecoder().getSyncType())
+    {
+    case DSDcc::DSDDecoder::DSDSyncDMRDataN:
+    case DSDcc::DSDDecoder::DSDSyncDMRDataP:
+    case DSDcc::DSDDecoder::DSDSyncDMRVoiceN:
+    case DSDcc::DSDDecoder::DSDSyncDMRVoiceP:
+        if (m_signalFormat != signalFormatDMR)
+        {
+            memcpy(m_formatStatusText, "Station: ", 9);
+            memcpy(&m_formatStatusText[12], "TDMA: ", 6);
+        }
+
+        switch (m_dsdDemod->getDecoder().getStationType())
+        {
+        case DSDcc::DSDDecoder::DSDBaseStation:
+            memcpy(&m_formatStatusText[9], "BS ", 3);
+            break;
+        case DSDcc::DSDDecoder::DSDMobileStation:
+            memcpy(&m_formatStatusText[9], "MS ", 3);
+            break;
+        default:
+            memcpy(&m_formatStatusText[9], "NA ", 3);
+            break;
+        }
+
+        memcpy(&m_formatStatusText[18], m_dsdDemod->getDecoder().getSlot0Text(), 7);
+        m_formatStatusText[25] = ' ';
+        memcpy(&m_formatStatusText[26], m_dsdDemod->getDecoder().getSlot1Text(), 7);
+        m_formatStatusText[33] = '\0';
+        m_signalFormat = signalFormatDMR;
+
+        break;
+    case DSDcc::DSDDecoder::DSDSyncDStarHeaderN:
+    case DSDcc::DSDDecoder::DSDSyncDStarHeaderP:
+    case DSDcc::DSDDecoder::DSDSyncDStarN:
+    case DSDcc::DSDDecoder::DSDSyncDStarP:
+        if (m_signalFormat != signalFormatDStar)
+        {
+            strcpy(m_formatStatusText, "RPT1: ________ RPT2: ________ YOUR: ________ MY: ________/____");
+        }
+
+        {
+            const std::string& rpt1 = m_dsdDemod->getDecoder().getDStarDecoder().getRpt1();
+            const std::string& rpt2 = m_dsdDemod->getDecoder().getDStarDecoder().getRpt2();
+            const std::string& mySign = m_dsdDemod->getDecoder().getDStarDecoder().getMySign();
+            const std::string& yrSign = m_dsdDemod->getDecoder().getDStarDecoder().getYourSign();
+
+            if (rpt1.length() > 0) { // 0 or 8
+                memcpy(&m_formatStatusText[6], rpt1.c_str(), 8);
+            }
+            if (rpt2.length() > 0) { // 0 or 8
+                memcpy(&m_formatStatusText[21], rpt2.c_str(), 8);
+            }
+            if (yrSign.length() > 0) { // 0 or 8
+                memcpy(&m_formatStatusText[36], yrSign.c_str(), 8);
+            }
+            if (mySign.length() > 0) { // 0 or 13
+                memcpy(&m_formatStatusText[49], mySign.c_str(), 13);
+            }
+        }
+
+        m_signalFormat = signalFormatDStar;
+        break;
+    default:
+        m_signalFormat = signalFormatNone;
+        m_formatStatusText[0] = '\0';
+        break;
+    }
+
+    m_formatStatusText[80] = '\0'; // guard
+}
+
 void DSDDemodGUI::tick()
 {
 	Real powDb = CalcDb::dbPower(m_dsdDemod->getMagSq());
@@ -382,6 +457,10 @@ void DSDDemodGUI::tick()
 	    ui->inLevelText->setText(QString::number(m_dsdDemod->getDecoder().getInLevel()));
 	    ui->syncText->setText(QString(m_dsdDemod->getDecoder().getFrameTypeText()));
 	    ui->modulationText->setText(QString(m_dsdDemod->getDecoder().getModulationText()));
+
+	    formatStatusText();
+	    ui->formatStatusText->setText(QString(m_formatStatusText));
+
 	    m_tickCount = 0;
 	}
 }
diff --git a/plugins/channel/demoddsd/dsddemodgui.h b/plugins/channel/demoddsd/dsddemodgui.h
index bfcb065a6..feb4418c1 100644
--- a/plugins/channel/demoddsd/dsddemodgui.h
+++ b/plugins/channel/demoddsd/dsddemodgui.h
@@ -55,6 +55,7 @@ public:
 
 private slots:
 	void viewChanged();
+	void formatStatusText();
 	void on_deltaFrequency_changed(quint64 value);
 	void on_deltaMinus_toggled(bool minus);
 	void on_rfBW_valueChanged(int index);
@@ -69,11 +70,20 @@ private slots:
 	void tick();
 
 private:
+	typedef enum
+	{
+	    signalFormatNone,
+	    signalFormatDMR,
+	    signalFormatDStar
+	} SignalFormat;
+
 	Ui::DSDDemodGUI* ui;
 	PluginAPI* m_pluginAPI;
 	ChannelMarker m_channelMarker;
 	bool m_basicSettingsShown;
 	bool m_doApplySettings;
+	char m_formatStatusText[80+1]; //!< Fixed signal format dependent status text
+	SignalFormat m_signalFormat;
 
 	ThreadedSampleSink* m_threadedChannelizer;
 	Channelizer* m_channelizer;
diff --git a/plugins/channel/demoddsd/dsddemodgui.ui b/plugins/channel/demoddsd/dsddemodgui.ui
index 6ac0a0048..cef8fadf2 100644
--- a/plugins/channel/demoddsd/dsddemodgui.ui
+++ b/plugins/channel/demoddsd/dsddemodgui.ui
@@ -36,12 +36,12 @@
     
      0
      0
-     501
+     521
      171
     
    
    
-    
+    
      0
      0
     
@@ -577,6 +577,36 @@
       
      
     
+    - 
+     
+      - 
+       
+        
+         
+          400
+          0
+         
+        
+        
+         ___
+        
+       
+      +
- 
+       
+        
+         Qt::Horizontal
+        
+        
+         
+          40
+          20
+         
+        
+       
+      +     
+