diff -r 79e1feefb8cf src/input/input_dvb.c
--- a/src/input/input_dvb.c	Tue Nov 13 14:44:56 2007 +0000
+++ b/src/input/input_dvb.c	Tue Nov 13 14:49:09 2007 +0000
@@ -232,7 +232,7 @@ typedef struct {
 
   struct dvb_frontend_info       feinfo;
   
-  int				 adapter_num;
+  int				 adapter_num, frontend_num;
 
   char				 frontend_device[100];
   char 				 dvr_device[100];
@@ -578,7 +578,7 @@ static void tuner_dispose(tuner_t * this
 }
 
 
-static tuner_t *tuner_init(xine_t * xine, int adapter)
+static tuner_t *tuner_init(xine_t * xine, int adapter, int frontend)
 {
 
     tuner_t *this;
@@ -599,16 +599,23 @@ static tuner_t *tuner_init(xine_t * xine
 
     this->xine = xine;
     this->adapter_num = adapter;
-    
-    snprintf(this->frontend_device,100,"/dev/dvb/adapter%i/frontend0",this->adapter_num);
-    snprintf(this->demux_device,100,"/dev/dvb/adapter%i/demux0",this->adapter_num);
-    snprintf(this->dvr_device,100,"/dev/dvb/adapter%i/dvr0",this->adapter_num);
-    snprintf(video_device,100,"/dev/dvb/adapter%i/video0",this->adapter_num);
-    
-    if ((this->fd_frontend = open(this->frontend_device, O_RDWR)) < 0) {
+    this->frontend_num = frontend < 0 ? 0 : frontend;
+
+    for (;;) {
+      snprintf(this->frontend_device,100,"/dev/dvb/adapter%i/frontend%i",this->adapter_num,this->frontend_num);
+      snprintf(this->demux_device,100,"/dev/dvb/adapter%i/demux%i",this->adapter_num,this->frontend_num);
+      snprintf(this->dvr_device,100,"/dev/dvb/adapter%i/dvr%i",this->adapter_num,this->frontend_num);
+      snprintf(video_device,100,"/dev/dvb/adapter%i/video%i",this->adapter_num,this->frontend_num);
+
+      if ((this->fd_frontend = open(this->frontend_device, O_RDWR)) >= 0)
+        break; /* successfully opened */
+
       xprintf(this->xine, XINE_VERBOSITY_DEBUG, "FRONTEND DEVICE: %s\n", strerror(errno));
-      tuner_dispose(this);
-      return NULL;
+      /* abort if a specific front end was requested or 16 have been tried */
+      if (frontend >= 0 || ++this->fd_frontend >= 16) {
+        tuner_dispose(this);
+        return NULL;
+      }
     }
 
     if ((ioctl(this->fd_frontend, FE_GET_INFO, &this->feinfo)) < 0) {
@@ -2772,7 +2779,7 @@ static int dvb_plugin_open(input_plugin_
     int x;
     char dummy=0;
     xine_cfg_entry_t zoomdvb;
-    xine_cfg_entry_t adapter;
+    xine_cfg_entry_t adapter, frontend;
     xine_cfg_entry_t lastchannel;
     xine_cfg_entry_t gui_enabled;
 
@@ -2781,8 +2788,9 @@ static int dvb_plugin_open(input_plugin_
     xprintf(this->class->xine, XINE_VERBOSITY_LOG, _("input_dvb: DVB GUI %s\n"), this->dvb_gui_enabled ? "enabled" : "disabled");
     
     xine_config_lookup_entry(this->stream->xine, "media.dvb.adapter", &adapter);
+    xine_config_lookup_entry(this->stream->xine, "media.dvb.adapter_frontend", &frontend);
 
-    if (!(tuner = tuner_init(this->class->xine,adapter.num_value))) {
+    if (!(tuner = tuner_init(this->class->xine, adapter.num_value, frontend.num_value))) {
       xprintf(this->class->xine, XINE_VERBOSITY_LOG, _("input_dvb: cannot open dvb device\n"));
       return 0;
     }
@@ -3205,11 +3213,12 @@ static char **dvb_class_get_autoplay_lis
 
     /* need to probe card here to get fe_type to read in channels.conf */
     tuner_t *tuner;
-    xine_cfg_entry_t adapter;
+    xine_cfg_entry_t adapter, frontend;
 
     xine_config_lookup_entry(class->xine, "media.dvb.adapter", &adapter);
+    xine_config_lookup_entry(class->xine, "media.dvb.adapter_frontend", &frontend);
 
-    if (!(tuner = tuner_init(class->xine,adapter.num_value))) {
+    if (!(tuner = tuner_init(class->xine, adapter.num_value, frontend.num_value))) {
        xprintf(class->xine, XINE_VERBOSITY_LOG, _("input_dvb: cannot open dvb device\n"));
        class->mrls[0]="Sorry, No DVB input device found.";
        *num_files=1;
@@ -3331,6 +3340,11 @@ static void *init_class (xine_t *xine, v
 			 "in your system."),
 		       0, NULL, (void *) this);
     
+  config->register_num(config, "media.dvb.adapter_frontend",
+		       -1,
+		       _("Number of front end to use."),
+		       _("This should normally be left at -1 (auto-detect)."),
+		       0, NULL, (void *) this);
 
   return this;
 }
