diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h
index 9c14e23..d929b44 100644
--- a/src/dvb/dvb.h
+++ b/src/dvb/dvb.h
@@ -205,6 +205,8 @@ typedef struct th_dvb_adapter {
   int tda_unc_is_delta;  /* 1 if we believe FE_READ_UNCORRECTED_BLOCKS
 			  * return dela values */
 
+  uint32_t tda_extrapriority; // extra priority for choosing the best adapter/service
+
 } th_dvb_adapter_t;
 
 
@@ -247,6 +249,8 @@ htsmsg_t *dvb_adapter_build_msg(th_dvb_adapter_t *tda);
 
 htsmsg_t *dvb_fe_opts(th_dvb_adapter_t *tda, const char *which);
 
+void dvb_adapter_set_extrapriority(th_dvb_adapter_t *tda, int extrapriority);
+
 /**
  * DVB Multiplex
  */
diff --git a/src/dvb/dvb_adapter.c b/src/dvb/dvb_adapter.c
index 9f6afd5..df3665b 100644
--- a/src/dvb/dvb_adapter.c
+++ b/src/dvb/dvb_adapter.c
@@ -86,6 +86,7 @@ tda_save(th_dvb_adapter_t *tda)
   htsmsg_add_u32(m, "dump_muxes", tda->tda_dump_muxes);
   htsmsg_add_u32(m, "nitoid", tda->tda_nitoid);
   htsmsg_add_u32(m, "diseqc_version", tda->tda_diseqc_version);
+  htsmsg_add_u32(m, "extrapriority", tda->tda_extrapriority);
   hts_settings_save(m, "dvbadapters/%s", tda->tda_identifier);
   htsmsg_destroy(m);
 }
@@ -232,6 +233,23 @@ dvb_adapter_set_diseqc_version(th_dvb_adapter_t *tda, unsigned int v)
   tda_save(tda);
 }
 
+/**
+ *
+ */
+void
+dvb_adapter_set_extrapriority(th_dvb_adapter_t *tda, int extrapriority)
+{
+  lock_assert(&global_lock);
+
+  if(tda->tda_extrapriority == extrapriority)
+    return;
+
+  tvhlog(LOG_NOTICE, "dvb", "Adapter \"%s\" extra priority \"%d\" changed to \"%d\"",
+         tda->tda_displayname, tda->tda_extrapriority, extrapriority);
+
+  tda->tda_extrapriority = extrapriority;
+  tda_save(tda);
+}
 
 /**
  *
@@ -383,6 +401,7 @@ dvb_adapter_init(uint32_t adapter_mask)
       htsmsg_get_u32(c, "dump_muxes", &tda->tda_dump_muxes);
       htsmsg_get_u32(c, "nitoid", &tda->tda_nitoid);
       htsmsg_get_u32(c, "diseqc_version", &tda->tda_diseqc_version);
+      htsmsg_get_u32(c, "extrapriority", &tda->tda_extrapriority);
     }
     htsmsg_destroy(l);
   }
diff --git a/src/service.c b/src/service.c
index 49e04bd..e6666ea 100644
--- a/src/service.c
+++ b/src/service.c
@@ -231,7 +231,7 @@ service_start(service_t *t, unsigned int weight, int force_start)
 static int
 dvb_extra_prio(th_dvb_adapter_t *tda)
 {
-  return tda->tda_hostconnection * 10;
+  return tda->tda_extrapriority + tda->tda_hostconnection * 10;
 }
 
 /**
@@ -285,10 +285,19 @@ servicecmp(const void *A, const void *B)
   service_t *a = *(service_t **)A;
   service_t *b = *(service_t **)B;
 
-  int q = service_get_quality(a) - service_get_quality(b);
+  /* only check quality if both adapters have the same prio
+   *
+   * there needs to be a much more sophisticated algorithm to take priority and quality into account
+   * additional, it may be problematic, since a higher priority value lowers the ranking
+   *
+   */
+  if (dvb_extra_prio(a->s_dvb_mux_instance->tdmi_adapter) == dvb_extra_prio(b->s_dvb_mux_instance->tdmi_adapter)) {
+
+    int q = service_get_quality(a) - service_get_quality(b);
 
-  if(q != 0)
-    return q; /* Quality precedes priority */
+    if(q != 0)
+      return q; /* Quality precedes priority */
+  }
 
   return service_get_prio(a) - service_get_prio(b);
 }
@@ -335,6 +344,9 @@ service_find(channel_t *ch, unsigned int weight, const char *loginfo,
       continue;
     }
     vec[cnt++] = t;
+    tvhlog(LOG_DEBUG, "Service",
+    		"%s: Adding adapter \"%s\" for service \"%s\"",
+    		 loginfo, t->s_dvb_mux_instance->tdmi_identifier, service_nicename(t));
   }
 
   /* Sort services, lower priority should come come earlier in the vector
@@ -358,6 +370,9 @@ service_find(channel_t *ch, unsigned int weight, const char *loginfo,
   /* First, try all services without stealing */
   for(i = off; i < cnt; i++) {
     t = vec[i];
+    tvhlog(LOG_DEBUG, "Service", "%s: Probing adapter \"%s\" without stealing for service \"%s\"",
+	     loginfo, t->s_dvb_mux_instance->tdmi_identifier, service_nicename(t));
+
     if(t->s_status == SERVICE_RUNNING) 
       return t;
     if((r = service_start(t, 0, 0)) == 0)
@@ -372,6 +387,9 @@ service_find(channel_t *ch, unsigned int weight, const char *loginfo,
 
   for(i = off; i < cnt; i++) {
     t = vec[i];
+    tvhlog(LOG_DEBUG, "Service", "%s: Probing adapter \"%s\" with weight %d for service \"%s\"",
+	     loginfo, t->s_dvb_mux_instance->tdmi_identifier, weight, service_nicename(t));
+
     if((r = service_start(t, weight, 0)) == 0)
       return t;
     *errorp = r;
diff --git a/src/webui/extjs_dvb.c b/src/webui/extjs_dvb.c
index c0d9c7f..45d025e 100644
--- a/src/webui/extjs_dvb.c
+++ b/src/webui/extjs_dvb.c
@@ -156,6 +156,7 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque)
 		   ((const char *[]){"DiSEqC 1.0 / 2.0",
 				       "DiSEqC 1.1 / 2.1"})
 		   [tda->tda_diseqc_version % 2]);
+    htsmsg_add_u32(r, "extrapriority", tda->tda_extrapriority);
  
     out = json_single_record(r, "dvbadapters");
   } else if(!strcmp(op, "save")) {
@@ -185,6 +186,9 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque)
 	dvb_adapter_set_diseqc_version(tda, 1);
     }
 
+    if((s = http_arg_get(&hc->hc_req_args, "extrapriority")) != NULL)
+      dvb_adapter_set_extrapriority(tda, atoi(s));
+
     out = htsmsg_create_map();
     htsmsg_add_u32(out, "success", 1);
   } else if(!strcmp(op, "addnetwork")) {
diff --git a/src/webui/static/app/dvb.js b/src/webui/static/app/dvb.js
index 9063cdb..6f49f75 100644
--- a/src/webui/static/app/dvb.js
+++ b/src/webui/static/app/dvb.js
@@ -1048,7 +1048,7 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) {
     var confreader = new Ext.data.JsonReader({
 	root: 'dvbadapters'
     }, ['name', 'automux', 'idlescan', 'diseqcversion', 'qmon',
-	'dumpmux', 'nitoid']);
+	'dumpmux', 'nitoid','extrapriority']);
 
     
     function saveConfForm () {
@@ -1092,6 +1092,11 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) {
 	    fieldLabel: 'NIT-o Network ID',
 	    name: 'nitoid',
 	    width: 50
+	},
+	{
+	    fieldLabel: 'Extra priority',
+	    name: 'extrapriority',
+	    width: 50
 	}
     ];
 
