diff --git a/docs/html/config_esfilter.html b/docs/html/config_esfilter.html
index 75a03de4..f1a7a40b 100644
--- a/docs/html/config_esfilter.html
+++ b/docs/html/config_esfilter.html
@@ -83,7 +83,8 @@ The columns have the following functions:
Use this elementary stream.
ONCE
- Use this elementary stream only once per selected language.
+ Use this elementary stream only once per service type.
+ The language is distinguished, too.
The first successfully compared rule wins.
EXCLUSIVE
diff --git a/src/service.c b/src/service.c
index 2fac4b32..88e11244 100644
--- a/src/service.c
+++ b/src/service.c
@@ -475,26 +475,23 @@ filter:
case ESFA_IGNORE:
st->es_filter |= ESFM_IGNORE;
break;
+ case ESFA_ONCE:
+ TAILQ_FOREACH(st2, &t->s_components, es_link) {
+ if (st == st2)
+ continue;
+ if ((st2->es_filter & ESFM_USED) == 0)
+ continue;
+ if (st2->es_type != st->es_type)
+ continue;
+ if (esf->esf_language[0] != '\0' && strcmp(st2->es_lang, st->es_lang))
+ continue;
+ }
+ if (st2 != NULL) break;
+ /* fall through */
+ break;
case ESFA_USE:
service_build_filter_add(t, st, sta, &p);
break;
- case ESFA_ONCE:
- if (esf->esf_language[0] == '\0') {
- service_build_filter_add(t, st, sta, &p);
- } else {
- int present = 0;
- TAILQ_FOREACH(st2, &t->s_components, es_link) {
- if ((st2->es_filter & ESFM_USED) == 0)
- continue;
- if (strcmp(st2->es_lang, st->es_lang) == 0) {
- present = 1;
- break;
- }
- }
- if (!present)
- service_build_filter_add(t, st, sta, &p);
- }
- break;
case ESFA_EXCLUSIVE:
break;
case ESFA_EMPTY: