diff --git a/mythtv/libs/libmythtv/cardutil.cpp b/mythtv/libs/libmythtv/cardutil.cpp
index 41224166d9..682a3f8b4d 100644
--- a/mythtv/libs/libmythtv/cardutil.cpp
+++ b/mythtv/libs/libmythtv/cardutil.cpp
@@ -574,6 +574,81 @@ QStringList CardUtil::ProbeVideoDevices(const QString &rawtype)
     return devs;
 }
 
+// Get the list of delivery systems from the card
+QStringList CardUtil::ProbeDeliverySystems(const QString &device)
+{
+    QStringList delsys;
+
+    if (device.isEmpty())
+        return delsys;
+
+#ifdef USING_DVB
+    QString dvbdev = CardUtil::GetDeviceName(DVB_DEV_FRONTEND, device);
+    QByteArray dev = dvbdev.toLatin1();
+
+    int fd_frontend = open(dev.constData(), O_RDWR | O_NONBLOCK);
+    if (fd_frontend < 0)
+    {
+        LOG(VB_GENERAL, LOG_ERR, LOC +
+            QString("Can't open DVB frontend (%1) for %2.")
+                .arg(dvbdev).arg(device) + ENO);
+        return delsys;
+    }
+
+#if DVB_API_VERSION >=5
+    unsigned int i;
+    struct dtv_property prop;
+    struct dtv_properties cmd;
+
+    memset(&prop, 0, sizeof(prop));
+    prop.cmd = DTV_API_VERSION;
+    cmd.num = 1;
+    cmd.props = &prop;
+    if (ioctl(fd_frontend, FE_GET_PROPERTY, &cmd) == 0)
+    {
+        LOG(VB_GENERAL, LOG_INFO, QString("CardUtil[%1]: ").arg(dvbdev) +
+            QString("dvb api version %1.%2").arg((prop.u.data>>8)&0xff).arg((prop.u.data)&0xff));
+    }
+    else
+    {
+        LOG(VB_GENERAL, LOG_ERR, LOC + QString("FE_GET_PROPERTY ioctl failed (%1)")
+            .arg(dvbdev) + ENO);
+        close(fd_frontend);
+        return delsys;
+    }
+
+    memset(&prop, 0, sizeof(prop));
+    prop.cmd = DTV_ENUM_DELSYS;
+    cmd.num = 1;
+    cmd.props = &prop;
+    if (ioctl(fd_frontend, FE_GET_PROPERTY, &cmd) == 0)
+    {
+        for (i = 0; i < prop.u.buffer.len; i++)
+        {
+            delsys.push_back(DTVModulationSystem::toString(prop.u.buffer.data[i]));
+        }
+        QStringList::iterator it = delsys.begin();
+        QString msg = "Delivery systems:";
+        for (; it != delsys.end(); it++)
+        {
+            msg += " ";
+            msg += *it;
+        }
+        LOG(VB_GENERAL, LOG_INFO, QString("CardUtil: (%1) num props:%2 ")
+            .arg(dvbdev).arg(prop.u.buffer.len) + msg);
+    }
+    else
+    {
+        LOG(VB_GENERAL, LOG_ERR, LOC + QString("FE_GET_PROPERTY ioctl failed (%1)")
+            .arg(dvbdev) + ENO);
+    }
+#endif  // DVB_API_VERSION >= 5
+    close(fd_frontend);
+#endif  // USING_DVB
+
+    return delsys;
+}
+
 QString CardUtil::ProbeDVBType(const QString &device)
 {
     QString ret = "ERROR_UNKNOWN";
@@ -605,6 +680,13 @@ QString CardUtil::ProbeDVBType(const QString &device)
     }
 
     DTVTunerType type(info.type);
+
+    LOG(VB_GENERAL, LOG_INFO, QString("CardUtil: (%1) ").arg(dvbdev) +
+        QString("info.type:%1 info.caps:0x%2 FE_CAN_2G_MODULATION:%3 type:%4")
+            .arg(info.type).arg(info.caps,8,16,QChar('0'))
+            .arg((info.caps & FE_CAN_2G_MODULATION)?"yes":"no")
+            .arg(type.toString()));
+
 #if HAVE_FE_CAN_2G_MODULATION
     if (info.caps & FE_CAN_2G_MODULATION)
     {
@@ -615,41 +697,20 @@ QString CardUtil::ProbeDVBType(const QString &device)
     }
 #endif // HAVE_FE_CAN_2G_MODULATION
 
-#if DVB_API_VERSION >=5
-    unsigned int i;
-    struct dtv_property prop;
-    struct dtv_properties cmd;
-
-    memset(&prop, 0, sizeof(prop));
-    prop.cmd = DTV_ENUM_DELSYS;
-    cmd.num = 1;
-    cmd.props = &prop;
+    LOG(VB_GENERAL, LOG_INFO, QString("CardUtil: (%1) ").arg(dvbdev) +
+        QString("info.type:%1 info.caps:0x%2 FE_CAN_2G_MODULATION:%3 type:%4")
+            .arg(info.type).arg(info.caps,8,16,QChar('0'))
+            .arg((info.caps & FE_CAN_2G_MODULATION)?"yes":"no")
+            .arg(type.toString()));
 
-    if (ioctl(fd_frontend, FE_GET_PROPERTY, &cmd) == 0)
-    {
-        for (i = 0; i < prop.u.buffer.len; i++)
-        {
-            switch (prop.u.buffer.data[i])
-            {
-                // TODO: not supported. you can have DVBC and DVBT on the same card
-                // The following are backwards compatible so its ok
-                case SYS_DVBS2:
-                    type = DTVTunerType::kTunerTypeDVBS2;
-                    break;
-                case SYS_DVBT2:
-                    type = DTVTunerType::kTunerTypeDVBT2;
-                    break;
-                default:
-                    break;
-            }
-        }
-    }
-#endif
     close(fd_frontend);
 
     ret = (type.toString() != "UNKNOWN") ? type.toString().toUpper() : ret;
 #endif // USING_DVB
 
+    LOG(VB_GENERAL, LOG_INFO, QString("CardUtil::%1: (%2) type:%3")
+        .arg(__FUNCTION__).arg(dvbdev).arg(ret));
+
     return ret;
 }
 
@@ -730,7 +791,51 @@ QString CardUtil::ProbeSubTypeName(uint inputid)
     if (device.isEmpty())
         return "ERROR_OPEN";
 
-    return ProbeDVBType(device);
+    QString delsys_db = GetDeliverySystem(inputid);
+
+    DTVModulationSystem delsys;
+    bool res = delsys.Parse(delsys_db);
+
+    DTVTunerType tunertype;
+    if (res)
+    {
+        switch (delsys)
+        {
+            case DTVModulationSystem::kModulationSystem_DVBT:
+                tunertype = DTVTunerType::kTunerTypeDVBT;
+                break;
+            case DTVModulationSystem::kModulationSystem_DVBT2:
+                tunertype = DTVTunerType::kTunerTypeDVBT2;
+                break;
+            case DTVModulationSystem::kModulationSystem_DVBC_ANNEX_A:
+                tunertype = DTVTunerType::kTunerTypeDVBC;
+                break;
+            default:
+                LOG(VB_GENERAL, LOG_ERR, QString("CardUtil::%1[%2]: TODO Add to switch case delsys:%3 %4")
+                    .arg(__FUNCTION__).arg(inputid).arg(type).arg(delsys).arg(delsys.toString()));
+                break;
+        }
+
+        // If we changed the tunertype to match the modulation system
+        // then we need to setup the tuner for this
+        SetDeliverySystem(inputid, delsys);
+    }
+
+    QString subtype;
+    if (DTVTunerType::kTunerTypeUnknown != tunertype)
+    {
+        subtype = tunertype.toString();
+    }
+    else
+    {
+        subtype = ProbeDVBType(device);
+    }
+
+    LOG(VB_GENERAL, LOG_INFO, QString("CardUtil::%1[%2]: delsys:%3 %4 tunertype:%5 %6 subtype:%7")
+        .arg(__FUNCTION__).arg(inputid).arg(delsys).arg(delsys.toString())
+        .arg(tunertype).arg(tunertype.toString()).arg(subtype));
+
+    return subtype;
 }
 
 /// \brief Returns true iff the input_type is one of the DVB types.
@@ -741,6 +846,102 @@ bool CardUtil::IsDVBInputType(const QString &inputType)
         (t == "OFDM") || (t == "ATSC") || (t == "DVB_S2");
 }
 
+int CardUtil::SetDeliverySystem(uint inputid, DTVModulationSystem delsys)
+{
+    LOG(VB_GENERAL, LOG_INFO, QString("CardUtil::%1[%2]: delsys:%3 %4")
+        .arg(__FUNCTION__).arg(inputid).arg(delsys).arg(delsys.toString()));
+
+    int ret = -1;
+#ifdef USING_DVB
+#if DVB_API_VERSION >=5
+    QString device = GetVideoDevice(inputid);
+
+    if (device.isEmpty())
+        return ret;
+
+    QString dvbdev = CardUtil::GetDeviceName(DVB_DEV_FRONTEND, device);
+    QByteArray dev = dvbdev.toLatin1();
+    int fd_frontend = open(dev.constData(), O_RDWR | O_NONBLOCK);
+    if (fd_frontend < 0)
+    {
+        LOG(VB_GENERAL, LOG_ERR, LOC +
+            QString("open failed (%1)")
+                .arg(dvbdev) + ENO);
+        return errno;
+    }
+
+    ret = SetDeliverySystem(inputid, delsys, fd_frontend);
+
+    close(fd_frontend);
+#endif // DVB_API_VERSION >=5
+#endif // USING_DVB
+
+    return ret;
+}
+
+int CardUtil::SetDeliverySystem(uint inputid, int fd)
+{
+    LOG(VB_GENERAL, LOG_INFO, QString("CardUtil::%1[%2]: fd:%3")
+        .arg(__FUNCTION__).arg(inputid).arg(fd));
+
+    int ret = -1;
+#ifdef USING_DVB
+#if DVB_API_VERSION >=5
+
+    // Get the selected delivery system from database table capturecard
+    QString delsys_db = GetDeliverySystem(inputid);
+    if (delsys_db.isEmpty())
+        return ret;
+
+    LOG(VB_GENERAL, LOG_INFO, QString("CardUtil::%1[%2]: delsys_db:%3")
+        .arg(__FUNCTION__).arg(inputid).arg(delsys_db));
+
+    // Convert delivery system string to enum value and write to the card
+    DTVModulationSystem delsys;
+    if (delsys.Parse(delsys_db))
+    {
+        LOG(VB_GENERAL, LOG_INFO, QString("CardUtil::%1[%2]: delsys_db:%3 delsys:%4 %5")
+            .arg(__FUNCTION__).arg(inputid).arg(delsys_db).arg(delsys).arg(delsys.toString()));
+
+        ret = SetDeliverySystem(inputid, delsys, fd);
+    }
+#endif // DVB_API_VERSION >=5
+#endif // USING_DVB
+
+    return ret;
+}
+
+int CardUtil::SetDeliverySystem(uint inputid, DTVModulationSystem delsys, int fd)
+{
+    LOG(VB_GENERAL, LOG_INFO, QString("CardUtil::%1[%2]: fd:%3 delsys:%4 %5")
+        .arg(__FUNCTION__).arg(inputid).arg(fd).arg(delsys).arg(delsys.toString()));
+
+    int ret = -1;
+#ifdef USING_DVB
+#if DVB_API_VERSION >=5
+    struct dtv_property prop;
+    struct dtv_properties cmd;
+
+    memset(&prop, 0, sizeof(prop));
+    prop.cmd = DTV_DELIVERY_SYSTEM;
+    prop.u.data = delsys;
+    cmd.num = 1;
+    cmd.props = &prop;
+
+    ret = ioctl(fd, FE_SET_PROPERTY, &cmd);
+    if (ret < 0)
+    {
+        LOG(VB_GENERAL, LOG_ERR, LOC +
+            QString("FE_SET_PROPERTY ioctl failed (%1)")
+                .arg(inputid) + ENO);
+        return ret;
+	}
+#endif // DVB_API_VERSION >=5
+#endif // USING_DVB
+
+    return ret;
+}
+
 QString get_on_input(const QString &to_get, uint inputid)
 {
     MSqlQuery query(MSqlQuery::InitCon());
diff --git a/mythtv/libs/libmythtv/cardutil.h b/mythtv/libs/libmythtv/cardutil.h
index 1de3a3ac48..2681a6c798 100644
--- a/mythtv/libs/libmythtv/cardutil.h
+++ b/mythtv/libs/libmythtv/cardutil.h
@@ -14,6 +14,7 @@ using namespace std;
 
 // MythTV headers
 #include "mythtvexp.h"
+#include "dtvconfparserhelpers.h"
 
 class InputInfo;
 class CardInput;
@@ -275,6 +276,8 @@ class MTV_PUBLIC CardUtil
         { return get_on_input("audiodevice", inputid); }
     static QString      GetVBIDevice(uint inputid)
         { return get_on_input("vbidevice", inputid); }
+    static QString      GetDeliverySystem(uint inputid)
+        { return get_on_input("displayname", inputid); }      // KdW TODO change to "deliverysystem"
 
     static QString      GetHostname(uint inputid)
         { return get_on_input("hostname", inputid); }
@@ -372,11 +375,15 @@ class MTV_PUBLIC CardUtil
         { return "DVB" == GetRawInputType(inputid); }
     static bool         IsDVBInputType(const QString &input_type);
     static QString      ProbeDVBFrontendName(const QString &device);
+    static QStringList  ProbeDeliverySystems(const QString &device);
     static QString      ProbeDVBType(const QString &device);
     static bool         HasDVBCRCBug(const QString &device);
     static uint         GetMinSignalMonitoringDelay(const QString &device);
     static QString      GetDeviceName(dvb_dev_type_t, const QString &device);
     static InputNames   GetConfiguredDVBInputs(const QString &device);
+    static int          SetDeliverySystem(uint inputid, DTVModulationSystem delsys);
+    static int          SetDeliverySystem(uint inputid, int fd);
+    static int          SetDeliverySystem(uint inputid, DTVModulationSystem delsys, int fd);
 
     // V4L info
     static bool         hasV4L2(int videofd);
diff --git a/mythtv/libs/libmythtv/dtvconfparserhelpers.cpp b/mythtv/libs/libmythtv/dtvconfparserhelpers.cpp
index 55af025dac..b34646db92 100644
--- a/mythtv/libs/libmythtv/dtvconfparserhelpers.cpp
+++ b/mythtv/libs/libmythtv/dtvconfparserhelpers.cpp
@@ -448,7 +448,7 @@ const char *DTVPolarity::s_dbStr[DTVPolarity::kDBStrCnt] =
 const DTVParamHelperStruct DTVModulationSystem::s_confTable[] =
 {
     { "SYS_UNDEFINED",     kModulationSystem_UNDEFINED     },
-    { "SYS_DVBC_ANNEX_AC", kModulationSystem_DVBC_ANNEX_AC },
+    { "SYS_DVBC_ANNEX_A",  kModulationSystem_DVBC_ANNEX_A  },
     { "SYS_DVBC_ANNEX_B",  kModulationSystem_DVBC_ANNEX_B  },
     { "SYS_DVBT",          kModulationSystem_DVBT          },
     { "SYS_DVBT2",         kModulationSystem_DVBT2         },
@@ -478,49 +478,49 @@ const DTVParamHelperStruct DTVModulationSystem::s_vdrTable[] =
 
 const DTVParamHelperStruct DTVModulationSystem::s_parseTable[] =
 {
-    { "UNDEFINED", kModulationSystem_UNDEFINED     },
-    { "DVBC_AC",   kModulationSystem_DVBC_ANNEX_AC },
-    { "DVBC_B",    kModulationSystem_DVBC_ANNEX_B  },
-    { "DVB-T",     kModulationSystem_DVBT          },
-    { "DVB-T2",    kModulationSystem_DVBT2         },
-    { "DSS",       kModulationSystem_DSS           },
-    { "DVB-S",     kModulationSystem_DVBS          },
-    { "DVB-S2",    kModulationSystem_DVBS2         },
-    { "DVBH",      kModulationSystem_DVBH          },
-    { "ISDBT",     kModulationSystem_ISDBT         },
-    { "ISDBS",     kModulationSystem_ISDBS         },
-    { "ISDBC",     kModulationSystem_ISDBC         },
-    { "ATSC",      kModulationSystem_ATSC          },
-    { "ATSCMH",    kModulationSystem_ATSCMH        },
-    { "DMBTH",     kModulationSystem_DMBTH         },
-    { "CMMB",      kModulationSystem_CMMB          },
-    { "DAB",       kModulationSystem_DAB           },
-    { "TURBO",     kModulationSystem_TURBO         },
-    { "DVBC_C",    kModulationSystem_DVBC_ANNEX_C  },
-    { nullptr,     kModulationSystem_UNDEFINED     },
+    { "UNDEFINED",    kModulationSystem_UNDEFINED     },
+    { "DVBC/ANNEX_A", kModulationSystem_DVBC_ANNEX_A  },
+    { "DVBC/ANNEX_B", kModulationSystem_DVBC_ANNEX_B  },
+    { "DVBT",         kModulationSystem_DVBT          },
+    { "DSS",          kModulationSystem_DSS           },
+    { "DVBS",         kModulationSystem_DVBS          },
+    { "DVBS2",        kModulationSystem_DVBS2         },
+    { "DVBH",         kModulationSystem_DVBH          },
+    { "ISDBT",        kModulationSystem_ISDBT         },
+    { "ISDBS",        kModulationSystem_ISDBS         },
+    { "ISDBC",        kModulationSystem_ISDBC         },
+    { "ATSC",         kModulationSystem_ATSC          },
+    { "ATSCMH",       kModulationSystem_ATSCMH        },
+    { "DMBTH",        kModulationSystem_DMBTH         },
+    { "CMMB",         kModulationSystem_CMMB          },
+    { "DAB",          kModulationSystem_DAB           },
+    { "DVBT2",        kModulationSystem_DVBT2         },
+    { "TURBO",        kModulationSystem_TURBO         },
+    { "DVBC/ANNEX_C", kModulationSystem_DVBC_ANNEX_C  },
+    { nullptr,        kModulationSystem_UNDEFINED     },
 };
 
 const char *DTVModulationSystem::s_dbStr[DTVModulationSystem::kDBStrCnt] =
 {
-    "UNDEFINED", ///< kModulationSystem_UNDEFINED
-    "DVBCAC",    ///< kModulationSystem_DVBC_ANNEX_AC
-    "DVBC_B",    ///< kModulationSystem_DVBC_ANNEX_B
-    "DVB-T",     ///< kModulationSystem_DVBT
-    "DSS",       ///< kModulationSystem_DSS
-    "DVB-S",     ///< kModulationSystem_DVBS
-    "DVB-S2",    ///< kModulationSystem_DVBS2
-    "DVBH",      ///< kModulationSystem_DVBH
-    "ISDBT",     ///< kModulationSystem_ISDBT
-    "ISDBS",     ///< kModulationSystem_ISDBS
-    "ISDBC",     ///< kModulationSystem_ISDBC
-    "ATSC",      ///< kModulationSystem_ATSC
-    "ATSCMH",    ///< kModulationSystem_ATSCMH
-    "DMBTH",     ///< kModulationSystem_DMBTH
-    "CMMB",      ///< kModulationSystem_CMMB
-    "DAB",       ///< kModulationSystem_DAB
-    "DVB-T2",    ///< kModulationSystem_DVBT2
-    "TURBO",     ///< kModulationSystem_TURBO
-    "DVBC-C",    ///< kModulationSystem_DVBC_ANNEX_C
+    "UNDEFINED",     ///< kModulationSystem_UNDEFINED
+    "DVBC/ANNEX_A",  ///< kModulationSystem_DVBC_ANNEX_A
+    "DVBC/ANNEX_B",  ///< kModulationSystem_DVBC_ANNEX_B
+    "DVBT",          ///< kModulationSystem_DVBT
+    "DSS",           ///< kModulationSystem_DSS
+    "DVBS",          ///< kModulationSystem_DVBS
+    "DVBS2",         ///< kModulationSystem_DVBS2
+    "DVBH",          ///< kModulationSystem_DVBH
+    "ISDBT",         ///< kModulationSystem_ISDBT
+    "ISDBS",         ///< kModulationSystem_ISDBS
+    "ISDBC",         ///< kModulationSystem_ISDBC
+    "ATSC",          ///< kModulationSystem_ATSC
+    "ATSCMH",        ///< kModulationSystem_ATSCMH
+    "DMBTH",         ///< kModulationSystem_DMBTH
+    "CMMB",          ///< kModulationSystem_CMMB
+    "DAB",           ///< kModulationSystem_DAB
+    "DVBT2",         ///< kModulationSystem_DVBT2
+    "TURBO",         ///< kModulationSystem_TURBO
+    "DVBC/ANNEX_C",  ///< kModulationSystem_DVBC_ANNEX_C
 };
 
 const DTVParamHelperStruct DTVRollOff::s_confTable[] =
diff --git a/mythtv/libs/libmythtv/dtvconfparserhelpers.h b/mythtv/libs/libmythtv/dtvconfparserhelpers.h
index 69111b98de..dd172f1a6c 100644
--- a/mythtv/libs/libmythtv/dtvconfparserhelpers.h
+++ b/mythtv/libs/libmythtv/dtvconfparserhelpers.h
@@ -593,7 +593,7 @@ class DTVModulationSystem : public DTVParamHelper
     {
         // see fe_delivery_system in frontend.h
         kModulationSystem_UNDEFINED,
-        kModulationSystem_DVBC_ANNEX_AC,
+        kModulationSystem_DVBC_ANNEX_A,
         kModulationSystem_DVBC_ANNEX_B,
         kModulationSystem_DVBT,
         kModulationSystem_DSS,
diff --git a/mythtv/libs/libmythtv/recorders/dvbchannel.cpp b/mythtv/libs/libmythtv/recorders/dvbchannel.cpp
index 4cb8bed226..9757a7adee 100644
--- a/mythtv/libs/libmythtv/recorders/dvbchannel.cpp
+++ b/mythtv/libs/libmythtv/recorders/dvbchannel.cpp
@@ -277,57 +277,14 @@ bool DVBChannel::Open(DVBChannel *who)
     m_symbol_rate_minimum = info.symbol_rate_min;
     m_symbol_rate_maximum = info.symbol_rate_max;
 
-#if DVB_API_VERSION >=5
-    unsigned int i;
-    struct dtv_property prop;
-    struct dtv_properties cmd;
-
-    memset(&prop, 0, sizeof(prop));
-    prop.cmd = DTV_API_VERSION;
-    cmd.num = 1;
-    cmd.props = &prop;
-    if (ioctl(m_fd_frontend, FE_GET_PROPERTY, &cmd) == 0)
-    {
-        LOG(VB_RECORD, LOG_INFO, LOC +
-            QString("dvb api version %1.%2").arg((prop.u.data>>8)&0xff).arg((prop.u.data)&0xff));
-    }
-
-    memset(&prop, 0, sizeof(prop));
-    prop.cmd = DTV_ENUM_DELSYS;
-    cmd.num = 1;
-    cmd.props = &prop;
-
-    if (ioctl(m_fd_frontend, FE_GET_PROPERTY, &cmd) == 0)
-    {
-        LOG(VB_RECORD, LOG_DEBUG, LOC +
-            QString("num props %1").arg(prop.u.buffer.len));
-        for (i = 0; i < prop.u.buffer.len; i++)
-        {
-            LOG(VB_RECORD, LOG_INFO, LOC +
-                QString("delsys %1: %2 %3")
-                    .arg(i).arg(prop.u.buffer.data[i])
-                    .arg(DTVModulationSystem::toString(prop.u.buffer.data[i])));
-            switch (prop.u.buffer.data[i])
-            {
-                // TODO: not supported. you can have DVBC and DVBT on the same card
-                // The following are backwards compatible so its ok
-                case SYS_DVBS2:
-                    m_tunerType = DTVTunerType::kTunerTypeDVBS2;
-                    break;
-                case SYS_DVBT2:
-                    m_tunerType = DTVTunerType::kTunerTypeDVBT2;
-                    break;
-                default:
-                    break;
-            }
-        }
-    }
-#endif
-
     LOG(VB_RECORD, LOG_INFO, LOC +
         QString("Using DVB card %1, with frontend '%2'.")
             .arg(m_device).arg(m_frontend_name));
 
+#if DVB_API_VERSION >=5
+    CardUtil::SetDeliverySystem(m_inputid, m_fd_frontend);
+#endif
+
     // Turn on the power to the LNB
     if (m_tunerType.IsDiSEqCSupported())
     {
diff --git a/mythtv/libs/libmythtv/videosource.cpp b/mythtv/libs/libmythtv/videosource.cpp
index 826bd657cf..209f032343 100644
--- a/mythtv/libs/libmythtv/videosource.cpp
+++ b/mythtv/libs/libmythtv/videosource.cpp
@@ -1031,13 +1031,24 @@ class DVBCardNum : public CaptureCardComboBoxSetting
     }
 };
 
-class DVBCardType : public GroupSetting
+// KdW change DVBCardType from subtype to delivery system
+//
+// NOTE: use field capturecard/displayname to store the delivery system selection in the database
+// TODO replace displayname with deliverysystem when that field has been added to table capturecard
+// Changed GroupSetting into CaptureCardComboBoxSetting
+//
+class DVBCardType : public CaptureCardComboBoxSetting                   // KdW was: public GroupSetting
 {
   public:
-    DVBCardType()
+    explicit DVBCardType(const CaptureCard &parent) :
+        CaptureCardComboBoxSetting(parent, false, "displayname")        // KdW false means no "New entry"
     {
-        setLabel(QObject::tr("Subtype"));
-        setEnabled(false);
+        setLabel(QObject::tr("Delivery system"));                       // KdW was: Subtype
+        setHelpText(
+            QObject::tr("If your card supports more than one delivery system "
+                        "then you can select here the one that you want to use."));
+
+        // setEnabled(false);
     };
 };
 
@@ -3710,6 +3721,34 @@ void DVBConfigurationGroup::probeCard(const QString &videodevice)
         default:
             break;
     }
+
+    // Create selection list of all delivery systems
+    switch (CardUtil::toInputType(subtype))
+    {
+        case CardUtil::QAM:
+        case CardUtil::DVBT2:
+        case CardUtil::OFDM:
+            {
+                QStringList delsys = CardUtil::ProbeDeliverySystems(videodevice);
+                QStringList::iterator it = delsys.begin();
+                m_cardType->clearSelections();
+                if (it != delsys.end())
+                {
+                    m_cardType->setValue(*it);
+                }
+                for (; it != delsys.end(); it++)
+                {
+                    LOG(VB_GENERAL, LOG_INFO, QString("DVBCardType::%1: add deliverysystem:%2")
+                            .arg(__FUNCTION__).arg(*it));
+
+                    m_cardType->addSelection(*it, *it);
+                }
+            }
+        break;
+            default:
+        break;
+    }
+#
 #else
     m_cardType->setValue(QString("Recompile with DVB-Support!"));
 #endif
@@ -3759,7 +3798,7 @@ DVBConfigurationGroup::DVBConfigurationGroup(CaptureCard& a_parent,
 
     m_cardNum  = new DVBCardNum(m_parent);
     m_cardName = new DVBCardName();
-    m_cardType = new DVBCardType();
+    m_cardType = new DVBCardType(m_parent);
 
     m_signalTimeout = new SignalTimeout(m_parent, 500, 250);
     m_channelTimeout = new ChannelTimeout(m_parent, 3000, 1750);
