diff --git a/src/channels.c b/src/channels.c
index f13e0ed..a745517 100644
--- a/src/channels.c
+++ b/src/channels.c
@@ -285,6 +285,9 @@ channel_load_one(htsmsg_t *c, int id)
       }
     }
   }
+
+  tvh_str_update(&ch->ch_epg_default_charset, htsmsg_get_str(c, "epg_default_charset"));
+
 }
 
 
@@ -338,6 +341,9 @@ channel_save(channel_t *ch)
   htsmsg_add_u32(m, "dvr_extra_time_post", ch->ch_dvr_extra_time_post);
   htsmsg_add_s32(m, "channel_number", ch->ch_number);
 
+  if(ch->ch_epg_default_charset != NULL)
+    htsmsg_add_str(m, "epg_default_charset", ch->ch_epg_default_charset);
+
   hts_settings_save(m, "channels/%d", ch->ch_id);
   htsmsg_destroy(m);
 }
@@ -413,6 +419,7 @@ channel_delete(channel_t *ch)
   free(ch->ch_name);
   free(ch->ch_sname);
   free(ch->ch_icon);
+  free(ch->ch_epg_default_charset);
 
   channel_list_changed();
   
@@ -587,6 +594,22 @@ channel_set_tags_from_list(channel_t *ch, const char *maplist)
     channel_save(ch);
 }
 
+/**
+ *
+ */
+void
+channel_set_epg_default_charset(channel_t *ch, const char *epg_default_charset)
+{
+  lock_assert(&global_lock);
+
+  if(ch->ch_epg_default_charset != NULL && !strcmp(ch->ch_epg_default_charset, epg_default_charset))
+    return;
+
+  free(ch->ch_epg_default_charset);
+  ch->ch_epg_default_charset = strdup(epg_default_charset);
+  channel_save(ch);
+  htsp_channel_update(ch);
+}
 
 
 
diff --git a/src/channels.h b/src/channels.h
index 6dfbc73..6771920 100644
--- a/src/channels.h
+++ b/src/channels.h
@@ -63,6 +63,11 @@ typedef struct channel {
 
   struct channel_tag_mapping_list ch_ctms;
 
+  /**
+   * EPG default charset
+   */
+  char *ch_epg_default_charset;
+
 } channel_t;
 
 
@@ -127,6 +132,8 @@ void channel_set_xmltv_source(channel_t *ch, struct xmltv_channel *xc);
 
 void channel_set_tags_from_list(channel_t *ch, const char *maplist);
 
+void channel_set_epg_default_charset(channel_t *ch, const char *epg_default_charset);
+
 channel_tag_t *channel_tag_find_by_name(const char *name, int create);
 
 channel_tag_t *channel_tag_find_by_identifier(uint32_t id);
diff --git a/src/dvb/dvb_support.c b/src/dvb/dvb_support.c
index b7098a5..94304ac 100644
--- a/src/dvb/dvb_support.c
+++ b/src/dvb/dvb_support.c
@@ -74,7 +74,7 @@ dvb_conversion_init(void)
  */
 
 int
-dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen)
+dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char *epg_default_charset)
 {
   iconv_t ic;
   int len;
@@ -121,7 +121,15 @@ dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen)
     return -1;
 
   default:
-    ic = convert_latin1;
+    if (epg_default_charset != NULL && sscanf(epg_default_charset, "ISO8859-%d", &i) > 0) {
+      if (i > 0 && i < 16) {
+        ic = convert_iso_8859[i];
+      } else {
+        ic = convert_latin1;
+      }
+    } else {
+      ic = convert_latin1;
+    }
     break;
   }
 
@@ -175,14 +183,14 @@ dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen)
 
 int
 dvb_get_string_with_len(char *dst, size_t dstlen, 
-			const uint8_t *buf, size_t buflen)
+			const uint8_t *buf, size_t buflen, char *epg_default_charset)
 {
   int l = buf[0];
 
   if(l + 1 > buflen)
     return -1;
 
-  if(dvb_get_string(dst, dstlen, buf + 1, l))
+  if(dvb_get_string(dst, dstlen, buf + 1, l, epg_default_charset))
     return -1;
 
   return l + 1;
diff --git a/src/dvb/dvb_support.h b/src/dvb/dvb_support.h
index 2cdf474..3e697ae 100644
--- a/src/dvb/dvb_support.h
+++ b/src/dvb/dvb_support.h
@@ -51,10 +51,10 @@
 #define DVB_DESC_LOCAL_CHAN   0x83
 
 int dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, 
-		   const size_t srclen);
+		   const size_t srclen, char *epg_default_charset);
 
 int dvb_get_string_with_len(char *dst, size_t dstlen, 
-			    const uint8_t *buf, size_t buflen);
+			    const uint8_t *buf, size_t buflen, char *epg_default_charset);
 
 #define bcdtoint(i) ((((i & 0xf0) >> 4) * 10) + (i & 0x0f))
 
diff --git a/src/dvb/dvb_tables.c b/src/dvb/dvb_tables.c
index de18cd0..340de01 100644
--- a/src/dvb/dvb_tables.c
+++ b/src/dvb/dvb_tables.c
@@ -369,7 +369,8 @@ tdt_add(th_dvb_mux_instance_t *tdmi, struct dmx_sct_filter_params *fparams,
 static int
 dvb_desc_short_event(uint8_t *ptr, int len, 
 		     char *title, size_t titlelen,
-		     char *desc,  size_t desclen)
+		     char *desc,  size_t desclen,
+                     char *epg_default_charset)
 {
   int r;
 
@@ -377,11 +378,11 @@ dvb_desc_short_event(uint8_t *ptr, int len,
     return -1;
   ptr += 3; len -= 3;
 
-  if((r = dvb_get_string_with_len(title, titlelen, ptr, len)) < 0)
+  if((r = dvb_get_string_with_len(title, titlelen, ptr, len, epg_default_charset)) < 0)
     return -1;
   ptr += r; len -= r;
 
-  if((r = dvb_get_string_with_len(desc, desclen, ptr, len)) < 0)
+  if((r = dvb_get_string_with_len(desc, desclen, ptr, len, epg_default_charset)) < 0)
     return -1;
 
   return 0;
@@ -394,7 +395,8 @@ static int
 dvb_desc_extended_event(uint8_t *ptr, int len, 
 		     char *desc, size_t desclen,
 		     char *item, size_t itemlen,
-                     char *text, size_t textlen)
+                     char *text, size_t textlen,
+                     char *epg_default_charset)
 {
   int count = ptr[4], r;
   uint8_t *localptr = ptr + 5, *items = localptr; 
@@ -434,7 +436,7 @@ dvb_desc_extended_event(uint8_t *ptr, int len,
   count = localptr[0];
 
   /* get text */
-  if((r = dvb_get_string_with_len(text, textlen, localptr, locallen)) < 0)
+  if((r = dvb_get_string_with_len(text, textlen, localptr, locallen, epg_default_charset)) < 0)
     return -1;
 
   return 0;
@@ -459,11 +461,11 @@ dvb_desc_service(uint8_t *ptr, int len, uint8_t *typep,
   ptr++;
   len--;
 
-  if((r = dvb_get_string_with_len(provider, providerlen, ptr, len)) < 0)
+  if((r = dvb_get_string_with_len(provider, providerlen, ptr, len, NULL)) < 0)
     return -1;
   ptr += r; len -= r;
 
-  if((r = dvb_get_string_with_len(name, namelen, ptr, len)) < 0)
+  if((r = dvb_get_string_with_len(name, namelen, ptr, len, NULL)) < 0)
     return -1;
   ptr += r; len -= r;
   return 0;
@@ -586,7 +588,8 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
       case DVB_DESC_SHORT_EVENT:
 	if(!dvb_desc_short_event(ptr, dlen,
 				 title, sizeof(title),
-				 desc,  sizeof(desc))) {
+				 desc,  sizeof(desc),
+                                 e->e_channel->ch_epg_default_charset)) {
 	  changed |= epg_event_set_title(e, title);
 	  changed |= epg_event_set_desc(e, desc);
 	}
@@ -602,7 +605,8 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
         if(!dvb_desc_extended_event(ptr, dlen,
               extdesc, sizeof(extdesc),
               extitem, sizeof(extitem),
-              exttext, sizeof(exttext))) {
+              exttext, sizeof(exttext),
+              e->e_channel->ch_epg_default_charset)) {
           
           char language[4];
           memcpy(language, &ptr[1], 3);
@@ -1122,7 +1126,7 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
 
     switch(tag) {
     case DVB_DESC_NETWORK_NAME:
-      if(dvb_get_string(networkname, sizeof(networkname), ptr, tlen))
+      if(dvb_get_string(networkname, sizeof(networkname), ptr, tlen, NULL))
 	return -1;
 
       if(strcmp(tdmi->tdmi_network ?: "", networkname))
diff --git a/src/webui/extjs.c b/src/webui/extjs.c
index 7468dea..6666e5a 100644
--- a/src/webui/extjs.c
+++ b/src/webui/extjs.c
@@ -342,6 +342,10 @@ extjs_channels_update(htsmsg_t *in)
 
     if((s = htsmsg_get_str(c, "number")) != NULL)
       channel_set_number(ch, atoi(s));
+
+    if((s = htsmsg_get_str(c, "epg_default_charset")) != NULL)
+      channel_set_epg_default_charset(ch, s);
+
   }
 }
 
@@ -395,6 +399,9 @@ extjs_channels(http_connection_t *hc, const char *remain, void *opaque)
       htsmsg_add_s32(c, "epg_post_end",  ch->ch_dvr_extra_time_post);
       htsmsg_add_s32(c, "number",        ch->ch_number);
 
+      if(ch->ch_epg_default_charset != NULL)
+        htsmsg_add_str(c, "epg_default_charset", ch->ch_epg_default_charset);
+
       htsmsg_add_msg(array, NULL, c);
     }
     
diff --git a/src/webui/static/app/chconf.js b/src/webui/static/app/chconf.js
index 6bbc35b..b79f22c 100644
--- a/src/webui/static/app/chconf.js
+++ b/src/webui/static/app/chconf.js
@@ -28,7 +28,7 @@ tvheadend.channels = new Ext.data.JsonStore({
     autoLoad: true,
     root:'entries',
     fields: ['name', 'chid', 'xmltvsrc', 'tags', 'ch_icon',
-	     'epg_pre_start', 'epg_post_end', 'number'],
+	     'epg_pre_start', 'epg_post_end', 'number', 'epg_default_charset'],
     id: 'chid',
     url: "channels",
     baseParams: {
@@ -112,6 +112,28 @@ tvheadend.chconf = function()
 	}
     });
 
+    var EPGCharsets = new Ext.data.SimpleStore({
+	fields: ['key','value'],
+	data: [
+		['ISO6937','default'],
+		['ISO6937','ISO6937'],
+		['ISO8859-1','ISO8859-1'],
+		['ISO8859-2','ISO8859-2'],
+		['ISO8859-3','ISO8859-3'],
+		['ISO8859-4','ISO8859-4'],
+		['ISO8859-5','ISO8859-5'],
+		['ISO8859-6','ISO8859-6'],
+		['ISO8859-7','ISO8859-7'],
+		['ISO8859-8','ISO8859-8'],
+		['ISO8859-9','ISO8859-9'],
+		['ISO8859-10','ISO8859-10'],
+		['ISO8859-11','ISO8859-11'],
+		['ISO8859-12','ISO8859-12'],
+		['ISO8859-13','ISO8859-13'],
+		['ISO8859-14','ISO8859-14'],
+		['ISO8859-15','ISO8859-15']
+	]
+    });
 
     var fm = Ext.form;
 
@@ -250,7 +272,29 @@ tvheadend.chconf = function()
 	    minValue: 0,
 	    maxValue: 1440
 	})
-    }, actions
+    },
+	{
+		header: "EPG Default Charset",
+		dataIndex: 'epg_default_charset',
+		width: 200,
+		renderer: function(value, metadata, record, row, col, store) {
+			if (!value) {
+				return '<span class="tvh-grid-unset">ISO6937</span>';
+			} else {
+				return value;
+			}
+		},
+		editor: new fm.ComboBox({
+			mode: 'local',
+                	store: EPGCharsets,
+			typeAhead: true,
+			lazyRender: true,
+			triggerAction: 'all',
+			displayField:'value',
+			valueField:'key'
+		})
+	},
+	actions
     ]);
 
 
