diff U3wB config.c config.c
--- config.c	Thu Jan 15 09:14:12 1970
+++ config.c	Thu Jan 15 09:14:12 1970
@@ -28,8 +28,11 @@
 static struct sap_s	*sap;
 
 static int cf_adapter_start(struct lc_centry *ce, struct lc_value *val) {
+	char 	*sp;
+
 	adapter=calloc(1, sizeof(struct adapter_s));
-	adapter->no=val->num;
+	adapter->no=atoi(strtok_r(val->string, ":", &sp));
+	adapter->feno=atoi(strtok_r(NULL, ":", &sp));
 	adapter->budgetmode=1;
 	adapter->dvr.stuckinterval=DVR_DEFAULT_STUCKINT;
 	adapter->dvr.buffer.size=DVR_BUFFER_DEFAULT*TS_PACKET_SIZE;
@@ -425,7 +428,7 @@
 };
 
 static struct lc_ventry conf_main[] = {
-	{ "adapter", 1, 0, LCV_NUM, LCO_UNIQ, conf_adapter, cf_adapter_start },
+	{ "adapter", 1, 0, LCV_ADAPTER, LCO_UNIQ, conf_adapter, cf_adapter_start },
 	{ "http", 1, 1, LCV_NONE, 0, conf_http, NULL },
 	{ NULL, 0, 0, 0, 0, NULL },
 };
diff U3wB dmx.c dmx.c
--- dmx.c	Thu Jan 15 09:14:12 1970
+++ dmx.c	Thu Jan 15 09:14:12 1970
@@ -19,10 +19,10 @@
 #include "getstream.h"
 #include "psi.h"
 
-static inline char *dmxname(int adapter) {
+static inline char *dmxname(int adapter, int feno) {
 	static char	dmxname[128];
 
-	sprintf(dmxname, "/dev/dvb/adapter%d/demux0", adapter);
+	sprintf(dmxname, "/dev/dvb/adapter%d/demux%d", adapter, feno);
 
 	return dmxname;
 }
@@ -75,7 +75,7 @@
 		return 1;
 	}
 
-	fd=open(dmxname(a->no), O_RDWR);
+	fd=open(dmxname(a->no, a->feno), O_RDWR);
 
 	if (fd < 0) {
 		logwrite(LOG_ERROR,"dmx: failed opening dmx device for joining pid %d", pid);
diff U3wB dvr.c dvr.c
--- dvr.c	Thu Jan 15 09:14:12 1970
+++ dvr.c	Thu Jan 15 09:14:12 1970
@@ -30,10 +30,10 @@
 	unsigned int	pidt;
 };
 
-static inline char *dvrname(int adapter) {
+static inline char *dvrname(int adapter, int feno) {
 	static char	dvrname[128];
 
-	sprintf(dvrname, "/dev/dvb/adapter%d/dvr0", adapter);
+	sprintf(dvrname, "/dev/dvb/adapter%d/dvr%d", adapter, feno);
 
 	return dvrname;
 }
@@ -276,7 +276,7 @@
 
 	a->dvr.buffer.ptr=malloc(a->dvr.buffer.size*TS_PACKET_SIZE);
 
-	dvrfd=open(dvrname(a->no), O_RDONLY|O_NONBLOCK);
+	dvrfd=open(dvrname(a->no,a->feno), O_RDONLY|O_NONBLOCK);
 
 	if (dvrfd < 0)
 		return 0;
diff U3wB fe.c fe.c
--- fe.c	Thu Jan 15 09:14:12 1970
+++ fe.c	Thu Jan 15 09:14:12 1970
@@ -165,18 +165,18 @@
 
 	if (adapter->fe.dvbs.lnbsharing) {
 		int value=SEC_TONE_OFF;
-		logwrite(LOG_DEBUG, "fe: Adapter %d lnb-sharing active - trying to turn off", adapter->no);
+		logwrite(LOG_DEBUG, "fe: Adapter %d:%d lnb-sharing active - trying to turn off", adapter->no, adapter->feno);
 
 		if (ioctl(adapter->fe.fd, FE_SET_TONE, value) < 0) {
-			logwrite(LOG_ERROR, "fe: Adapter %d ioctl FE_SET_TONE failed - %s", adapter->no, strerror(errno));
+			logwrite(LOG_ERROR, "fe: Adapter %d:%d ioctl FE_SET_TONE failed - %s", adapter->no, adapter->feno, strerror(errno));
 		}
 
 		value=SEC_VOLTAGE_OFF;
 		if (ioctl(adapter->fe.fd, FE_SET_VOLTAGE, value) < 0) {
 			if (errno == EINVAL) {
-				logwrite(LOG_DEBUG, "fe: Adapter %d SEC_VOLTAGE_OFF not possible", adapter->no);
+				logwrite(LOG_DEBUG, "fe: Adapter %d:%d SEC_VOLTAGE_OFF not possible", adapter->no, adapter->feno);
 				if (ioctl(adapter->fe.fd, FE_SET_VOLTAGE, voltage) < 0) {
-					logwrite(LOG_ERROR, "fe: Adapter %d ioctl FE_SET_VOLTAGE failed - %s", adapter->no, strerror(errno));
+					logwrite(LOG_ERROR, "fe: Adapter %d:%d ioctl FE_SET_VOLTAGE failed - %s", adapter->no, adapter->feno, strerror(errno));
 				}
 			}
 		}
@@ -383,8 +383,8 @@
 
 	if (res == 0) {
 		if (!(status & FE_HAS_LOCK)) {
-			logwrite(LOG_INFO, "fe: Adapter %d Status: 0x%02x (%s)",
-					adapter->no, status, fe_decode_status(status));
+			logwrite(LOG_INFO, "fe: Adapter %d:%d Status: 0x%02x (%s)",
+					adapter->no, adapter->feno, status, fe_decode_status(status));
 			fe_retune(adapter);
 		}
 	}
@@ -417,8 +417,8 @@
 	res=ioctl(adapter->fe.fd, IOCTL_GET_EVENT, &event);
 
 	if (res < 0 && errno != EOVERFLOW) {
-		logwrite(LOG_ERROR, "fe: Adapter %d Status event overflow %d",
-				adapter->no, errno);
+		logwrite(LOG_ERROR, "fe: Adapter %d:%d Status event overflow %d",
+				adapter->no, adapter->feno, errno);
 		return;
 	}
 
@@ -427,8 +427,8 @@
 	if (res >= 0 && status) {
 		if (!(status & FE_TIMEDOUT)) {
 
-			logwrite(LOG_INFO, "fe: Adapter %d Status: 0x%02x (%s)",
-				adapter->no, status, fe_decode_status(status));
+			logwrite(LOG_INFO, "fe: Adapter %d:%d Status: 0x%02x (%s)",
+				adapter->no, adapter->feno, status, fe_decode_status(status));
 
 			if (!(status & FE_HAS_LOCK)) {
 				fe_retune(adapter);
@@ -454,20 +454,23 @@
 		exit(-1);
 	}
 
-	logwrite(LOG_DEBUG, "fe: adapter %d delivery type %d name \"%s\"",
+	logwrite(LOG_DEBUG, "fe: adapter %d:%d delivery type %d name \"%s\"",
 				adapter->no,
+				adapter->feno,
 				adapter->type,
 				adapter->fe.feinfo.name);
 
-	logwrite(LOG_DEBUG, "fe: adapter %d frequency min %d max %d step %d tolerance %d",
+	logwrite(LOG_DEBUG, "fe: adapter %d:%d frequency min %d max %d step %d tolerance %d",
 				adapter->no,
+				adapter->feno,
 				adapter->fe.feinfo.frequency_min,
 				adapter->fe.feinfo.frequency_max,
 				adapter->fe.feinfo.frequency_step,
 				adapter->fe.feinfo.frequency_tolerance);
 
-	logwrite(LOG_DEBUG, "fe: adapter %d symbol rate min %d max %d tolerance %d",
+	logwrite(LOG_DEBUG, "fe: adapter %d:%d symbol rate min %d max %d tolerance %d",
 				adapter->no,
+				adapter->feno,
 				adapter->fe.feinfo.symbol_rate_min,
 				adapter->fe.feinfo.symbol_rate_max,
 				adapter->fe.feinfo.symbol_rate_tolerance);
@@ -489,43 +492,46 @@
 			type="QPSK";
 			if (adapter->type == AT_DVBS)
 				break;
-			logwrite(LOG_ERROR, "fe: Adapter %d is an DVB-S card - config is not for DVB-S", adapter->no);
+			logwrite(LOG_ERROR, "fe: Adapter %d:%d is an DVB-S card - config is not for DVB-S", adapter->no, adapter->feno);
 			exit(-1);
 		case(FE_OFDM):
 			type="OFDM";
 			if (adapter->type == AT_DVBT)
 				break;
-			logwrite(LOG_ERROR, "fe: Adapter %d is an DVB-T card - config is not for DVB-T", adapter->no);
+			logwrite(LOG_ERROR, "fe: Adapter %d:%d is an DVB-T card - config is not for DVB-T", adapter->no, adapter->feno);
 			exit(-1);
 		case(FE_QAM):
 			type="QAM";
 			if (adapter->type == AT_DVBC)
 				break;
-			logwrite(LOG_ERROR, "fe: Adapter %d is an DVB-C card - config is not for DVB-C", adapter->no);
+			logwrite(LOG_ERROR, "fe: Adapter %d:%d is an DVB-C card - config is not for DVB-C", adapter->no, adapter->feno);
 			exit(-1);
 		default:
-			logwrite(LOG_ERROR, "fe: Adapter %d is an unknown card type %d", adapter->no, adapter->fe.feinfo.type);
+			logwrite(LOG_ERROR, "fe: Adapter %d:%d is an unknown card type %d", adapter->no, adapter->feno, adapter->fe.feinfo.type);
 			break;
 	}
 
 	if (adapter->fe.feinfo.type == FE_QPSK && !(adapter->fe.feinfo.caps & FE_CAN_FEC_AUTO)) {
-		logwrite(LOG_ERROR, "fe: adapter %d is incapable of handling FEC_AUTO - please report to flo@rfc822.org", adapter->no);
+		logwrite(LOG_ERROR, "fe: adapter %d:%d is incapable of handling FEC_AUTO - please report to flo@rfc822.org", adapter->no, adapter->feno);
 	}
 
-	logwrite(LOG_DEBUG, "fe: adapter %d type %s name \"%s\"",
+	logwrite(LOG_DEBUG, "fe: adapter %d:%d type %s name \"%s\"",
 				adapter->no,
+				adapter->feno,
 				type,
 				adapter->fe.feinfo.name);
 
-	logwrite(LOG_DEBUG, "fe: adapter %d frequency min %d max %d step %d tolerance %d",
+	logwrite(LOG_DEBUG, "fe: adapter %d:%d frequency min %d max %d step %d tolerance %d",
 				adapter->no,
+				adapter->feno,
 				adapter->fe.feinfo.frequency_min,
 				adapter->fe.feinfo.frequency_max,
 				adapter->fe.feinfo.frequency_stepsize,
 				adapter->fe.feinfo.frequency_tolerance);
 
-	logwrite(LOG_DEBUG, "fe: adapter %d symbol rate min %d max %d tolerance %d",
+	logwrite(LOG_DEBUG, "fe: adapter %d.%d symbol rate min %d max %d tolerance %d",
 				adapter->no,
+				adapter->feno,
 				adapter->fe.feinfo.symbol_rate_min,
 				adapter->fe.feinfo.symbol_rate_max,
 				adapter->fe.feinfo.symbol_rate_tolerance);
@@ -535,7 +541,7 @@
 int fe_tune_init(struct adapter_s *adapter) {
 	char		fename[128];
 
-	sprintf(fename, "/dev/dvb/adapter%d/frontend0", adapter->no);
+	sprintf(fename, "/dev/dvb/adapter%d/frontend%d", adapter->no, adapter->feno);
 
 	adapter->fe.fd=open(fename, O_RDWR|O_NONBLOCK);
 
@@ -544,7 +550,7 @@
 		exit(-1);
 	}
 
-	logwrite(LOG_INFO, "fe: Adapter %d Setting up frontend tuner", adapter->no);
+	logwrite(LOG_INFO, "fe: Adapter %d:%d Setting up frontend tuner", adapter->no, adapter->feno);
 
 	fe_checkcap(adapter);
 
diff U3wB getstream.h getstream.h
--- getstream.h	Thu Jan 15 09:14:12 1970
+++ getstream.h	Thu Jan 15 09:14:12 1970
@@ -229,6 +229,7 @@
 
 struct adapter_s {
 	int			no;		/* Adapter Number */
+	int			feno;		/* Frontend Number */
 	int			type;		/* Adapter Type - DVB-S/DVB-T/DVB-C */
 
 	int			budgetmode;
diff U3wB libconf.c libconf.c
--- libconf.c	Thu Jan 15 09:14:12 1970
+++ libconf.c	Thu Jan 15 09:14:12 1970
@@ -279,6 +279,36 @@
 				ce->cbvalue.num=num;
 				break;
 			}
+			case(LCV_ADAPTER): {
+				char 		*endptr;
+				unsigned int	adapter;
+				unsigned int	frontend;
+				char	*tuner;
+				char 	*sp;
+
+				tuner = ce->value;
+
+				if (strpbrk( ":", tuner ) == NULL) {
+					sprintf(tuner, "%s:0", ce->value);
+				}
+				fprintf(stderr, "Value: %s\n", tuner);
+
+				if (*endptr != 0x0) {
+					fprintf(stderr, "Value %s for option %s is not a number in line %d\n", 
+							ce->value, ve->name, ce->vline);
+					return 0;
+				}
+				frontend=strtoul(strtok_r(NULL, ":", &sp), &endptr, 0);
+				if (*endptr != 0x0) {
+					fprintf(stderr, "Value %s for option %s is not a number in line %d\n", 
+							ce->value, ve->name, ce->vline);
+					return 0;
+				}
+				sprintf(tuner, "%u:%u", adapter,frontend);
+
+				ce->cbvalue.string=tuner;
+				break;
+			}
 			case(LCV_HEX): {
 				char 		*endptr;
 				unsigned long	num;
diff U3wB libconf.h libconf.h
--- libconf.h	Thu Jan 15 09:14:12 1970
+++ libconf.h	Thu Jan 15 09:14:12 1970
@@ -3,6 +3,7 @@
 enum {
 	LCV_NONE,
 	LCV_NUM,
+	LCV_ADAPTER,
 	LCV_BOOL,
 	LCV_HEX,
 	LCV_STRING,
