diff --git a/mythtv/libs/libmythtv/recorders/hdhrstreamhandler.cpp b/mythtv/libs/libmythtv/recorders/hdhrstreamhandler.cpp
index 9ab44a402e..0de4b96026 100644
--- a/mythtv/libs/libmythtv/recorders/hdhrstreamhandler.cpp
+++ b/mythtv/libs/libmythtv/recorders/hdhrstreamhandler.cpp
@@ -104,6 +104,11 @@ HDHRStreamHandler::HDHRStreamHandler(const QString &device, int inputid,
     , m_majorid(majorid)
 {
     setObjectName("HDHRStreamHandler");
+
+    // KdW HDHR debug
+    m_hdhomerun_debug = hdhomerun_debug_create();
+    hdhomerun_debug_set_filename(m_hdhomerun_debug, "./log/hdhr-dbg.log");
+    hdhomerun_debug_enable(m_hdhomerun_debug);
 }
 
 /** \fn HDHRStreamHandler::run(void)
@@ -113,16 +118,20 @@ void HDHRStreamHandler::run(void)
 {
     RunProlog();
 
-    /* Create TS socket. */
-    if (!hdhomerun_device_stream_start(m_hdhomerun_device))
     {
-        LOG(VB_GENERAL, LOG_ERR, LOC +
-            "Starting recording (set target failed). Aborting.");
-        m_bError = true;
-        RunEpilog();
-        return;
+        QMutexLocker locker(&m_hdhr_lock);
+
+        /* Create TS socket. */
+        if (!hdhomerun_device_stream_start(m_hdhomerun_device))
+        {
+            LOG(VB_GENERAL, LOG_ERR, LOC +
+                "Starting recording (set target failed). Aborting.");
+            m_bError = true;
+            RunEpilog();
+            return;
+        }
+        hdhomerun_device_stream_flush(m_hdhomerun_device);
     }
-    hdhomerun_device_stream_flush(m_hdhomerun_device);
 
     SetRunning(true, false, false);
 
@@ -184,7 +193,10 @@ void HDHRStreamHandler::run(void)
 
     RemoveAllPIDFilters();
 
-    hdhomerun_device_stream_stop(m_hdhomerun_device);
+    {
+        QMutexLocker locker(&m_hdhr_lock);
+        hdhomerun_device_stream_stop(m_hdhomerun_device);
+    }
 
     if (VERBOSE_LEVEL_CHECK(VB_RECORD, LOG_INFO))
     {
@@ -365,7 +377,8 @@ void HDHRStreamHandler::Close(void)
 
 bool HDHRStreamHandler::Connect(void)
 {
-    m_device_selector = hdhomerun_device_selector_create(nullptr);
+    // m_device_selector = hdhomerun_device_selector_create(nullptr);
+    m_device_selector = hdhomerun_device_selector_create(m_hdhomerun_debug);        // KdW HDHR debug
     if (!m_device_selector)
     {
         LOG(VB_GENERAL, LOG_ERR, LOC + "Unable to create device selector");
@@ -480,6 +493,8 @@ QString HDHRStreamHandler::TunerSet(
 
 void HDHRStreamHandler::GetTunerStatus(struct hdhomerun_tuner_status_t *status)
 {
+    QMutexLocker locker(&m_hdhr_lock);
+
     hdhomerun_device_get_tuner_status(m_hdhomerun_device, nullptr, status);
 }
 
diff --git a/mythtv/libs/libmythtv/recorders/hdhrstreamhandler.h b/mythtv/libs/libmythtv/recorders/hdhrstreamhandler.h
index 72c60417fb..a8a0c90a94 100644
--- a/mythtv/libs/libmythtv/recorders/hdhrstreamhandler.h
+++ b/mythtv/libs/libmythtv/recorders/hdhrstreamhandler.h
@@ -89,6 +89,7 @@ class HDHRStreamHandler : public StreamHandler
   private:
     hdhomerun_device_t          *m_hdhomerun_device {nullptr};
     hdhomerun_device_selector_t *m_device_selector  {nullptr};
+    hdhomerun_debug_t           *m_hdhomerun_debug  {nullptr};    // KdW HDHR debug
     int                          m_tuner            {-1};
     vector<DTVTunerType>         m_tuner_types;
     HDHRTuneMode                 m_tune_mode        {hdhrTuneModeNone}; // debug self check
