Index: TvEngine3/TVLibrary/TVLibrary/Implementations/DVB/ConditionalAccess/DigitalDevices/DigitalDevices.cs
===================================================================
--- TvEngine3/TVLibrary/TVLibrary/Implementations/DVB/ConditionalAccess/DigitalDevices/DigitalDevices.cs	(revision 26817)
+++ TvEngine3/TVLibrary/TVLibrary/Implementations/DVB/ConditionalAccess/DigitalDevices/DigitalDevices.cs	(working copy)
@@ -19,17 +19,12 @@
 #endregion
 
 using System;
-using System.Reflection;
+using System.Collections.Generic;
 using System.Runtime.InteropServices;
-using DirectShowLib;
-using DirectShowLib.BDA;
-using TvLibrary.Channels;
-using TvLibrary.Interfaces;
 using System.Security;
-using System.Text;
 using System.Threading;
-using System.Collections.Generic;
-using TvLibrary.Hardware;
+using DirectShowLib;
+using TvLibrary.Interfaces;
 
 namespace TvLibrary.Implementations.DVB
 {
@@ -41,7 +36,8 @@
   {
     #region constants
 
-    public static List<String> CIFilterNames = new List<String>() { "Digital Devices Common Interface", "Mystique SaTiX-S2 Dual Common Interface" };
+    private Guid PINNAME_BDA_TRANSPORT = new Guid("{78216a81-cfa8-493e-9711-36a61c08bd9d}");
+
     public static List<String> VendorNames = new List<String>() { "Digital Devices", "Mystique SaTiX-S2 Dual" };
 
     [ComImport, SuppressUnmanagedCodeSecurity,
@@ -176,6 +172,12 @@
       FilterInfo fInfo;
       tunerFilter.QueryFilterInfo(out fInfo);
 
+      // remarks: the better way of detection would be to check the DevicePath for matching parts
+      // but I didn't find a way to access IMoniker interface for query DevicePath from its property bag from a IFilterGraph only.
+      // see also TvCardDvdBase:
+      // //DD components have a common device path part. 
+      //   if (!(capDevices[capIndex].DevicePath.ToLowerInvariant().Contains("fbca-11de-b16f-000000004d56") 
+
       // check for all vendors names to support this hardware
       foreach (String vendor in VendorNames)
       {
@@ -189,23 +191,20 @@
       if (_CardName == String.Empty)
         return;
 
-      try
+      IEnumerable<IBaseFilter> nextFilters = FilterGraphTools.GetAllNextFilters(tunerFilter, PINNAME_BDA_TRANSPORT, PinDirection.Output);
+      foreach (IBaseFilter nextFilter in nextFilters)
       {
-        foreach (String CIFilterName in CIFilterNames)
+        FilterInfo filterInfo;
+        nextFilter.QueryFilterInfo(out filterInfo);
+
+        if (filterInfo.achName.ToLowerInvariant().Contains("common interface") && nextFilter is IKsControl)
         {
-          if (fInfo.pGraph.FindFilterByName(CIFilterName, out CiFilter) == 0)
-          {
-            _isDigitalDevices = true;
-            Log.Log.Debug(FormatMessage(" Common Interface found!"));
-            break; // found
-          }
-          else
-          {
-            Log.Log.Info(FormatMessage(" Common Interface NOT found!"));
-          }
+          CiFilter = nextFilter;
+          _isDigitalDevices = true;
+          Log.Log.Debug(FormatMessage(" Common Interface found!"));
+          break;
         }
       }
-      catch { }
     }
 
     #endregion
Index: TvEngine3/TVLibrary/TVLibrary/Implementations/Helper/FilterGraphTools.cs
===================================================================
--- TvEngine3/TVLibrary/TVLibrary/Implementations/Helper/FilterGraphTools.cs	(revision 26817)
+++ TvEngine3/TVLibrary/TVLibrary/Implementations/Helper/FilterGraphTools.cs	(working copy)
@@ -19,6 +19,7 @@
 #endregion
 
 using System;
+using System.Collections.Generic;
 using System.IO;
 using System.Runtime.InteropServices;
 using System.Security.Permissions;
@@ -615,6 +616,74 @@
       return pRet;
     }
 
+    ///<summary>
+    /// Enumerates and DirectShow graph starting with vSource into specific direction. It takes only Pins into account,
+    /// that match a given PinCategory.
+    ///</summary>
+    ///<param name="vSource">Starting IBaseFilter</param>
+    ///<param name="pinCategory">PinCategory</param>
+    ///<param name="vDir">Direction</param>
+    ///<returns>List of next IBaseFilters</returns>
+    public static IList<IBaseFilter> GetAllNextFilters(IBaseFilter vSource, Guid pinCategory, PinDirection vDir)
+    {
+      IList<IBaseFilter> nextFilters = new List<IBaseFilter>();
+      IEnumPins ppEnum;
+      PinInfo ppinfo;
+      IPin[] pPins = new IPin[1];
+      if (vSource == null)
+        return null;
+
+      // Get the pin enumerator
+      int hr = vSource.EnumPins(out ppEnum);
+      DsError.ThrowExceptionForHR(hr);
+
+      try
+      {
+        int lFetched;
+        // Walk the pins looking for a match
+        while ((ppEnum.Next(1, pPins, out lFetched) >= 0) && (lFetched == 1))
+        {
+          PinDirection ppindir;
+
+          hr = pPins[0].QueryDirection(out ppindir);
+          DsError.ThrowExceptionForHR(hr);
+
+          // Is it the right direction?
+          if (ppindir == vDir)
+          {
+            // Is it the right category?
+            if (DsUtils.GetPinCategory(pPins[0]) == pinCategory)
+            {
+
+              // Read the info
+              IPin connectedPin;
+              hr = pPins[0].ConnectedTo(out connectedPin);
+              DsError.ThrowExceptionForHR(hr);
+
+              connectedPin.QueryPinInfo(out ppinfo);
+              DsError.ThrowExceptionForHR(hr);
+
+              // This is a filter we're looking for.
+              nextFilters.Add(ppinfo.filter);
+
+              // recursive return all other filter of this type
+              foreach (IBaseFilter subfilter in GetAllNextFilters(ppinfo.filter, pinCategory, vDir))
+                nextFilters.Add(subfilter);
+
+              DsUtils.FreePinInfo(ppinfo);
+              Marshal.ReleaseComObject(connectedPin);
+            }
+          }
+          Marshal.ReleaseComObject(pPins[0]);
+        }
+      }
+      finally
+      {
+        Marshal.ReleaseComObject(ppEnum);
+      }
+      return nextFilters;
+    }
+
     /// <summary>
     /// Scan's a filter's pins looking for a pin with the specified category and direction
     /// </summary>
