Index: libavformat/matroskadec.c
===================================================================
--- libavformat/matroskadec.c	(revision 19123)
+++ libavformat/matroskadec.c	(working copy)
@@ -991,12 +991,19 @@
     char key[1024];
     int i;
 
+//     if(list->nb_elem > 0)
+//      	printf("\nmatroska_convert_tag() # of elements: %u\n", list->nb_elem);
+
     for (i=0; i < list->nb_elem; i++) {
         const char *lang = strcmp(tags[i].lang, "und") ? tags[i].lang : NULL;
-        if (prefix)  snprintf(key, sizeof(key), "%s/%s", prefix, tags[i].name);
-        else         av_strlcpy(key, tags[i].name, sizeof(key));
+        if (prefix) {
+            snprintf(key, sizeof(key), "%s/%s", prefix, tags[i].name);
+        } else {
+            av_strlcpy(key, tags[i].name, sizeof(key));
+        }
+        
         if (tags[i].def || !lang) {
-        av_metadata_set(metadata, key, tags[i].string);
+            av_metadata_set(metadata, key, tags[i].string);
         if (tags[i].sub.nb_elem)
             matroska_convert_tag(s, &tags[i].sub, metadata, key);
         }
@@ -1016,6 +1023,7 @@
     MatroskaTags *tags = matroska->tags.elem;
     int i, j;
 
+//     printf("matroska_convert_tags() total num. elements: %i\n", matroska->tags.nb_elem);
     for (i=0; i < matroska->tags.nb_elem; i++) {
         if (tags[i].target.attachuid) {
             MatroskaAttachement *attachment = matroska->attachments.elem;
@@ -1037,6 +1045,9 @@
                                          &track[j].stream->metadata, NULL);
         } else {
             matroska_convert_tag(s, &tags[i].tag, &s->metadata, NULL);
+            if(tags[i].target.typevalue) {
+                matroska_convert_tag(s, &tags[i].tag, &s->metadata, tags[i].target.type);
+    		}
         }
     }
 }
Index: libavformat/metadata.c
===================================================================
--- libavformat/metadata.c	(revision 19123)
+++ libavformat/metadata.c	(working copy)
@@ -26,6 +26,8 @@
 av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags)
 {
     unsigned int i, j;
+    
+//     printf("av_metadata_get()\n");
 
     if(!m)
         return NULL;
@@ -50,6 +52,9 @@
 {
     AVMetadata *m= *pm;
     AVMetadataTag *tag= av_metadata_get(m, key, NULL, AV_METADATA_MATCH_CASE);
+    
+//     printf("av_metadata_set()\n");
+//      printf("key: %s  value: %s\n", key, value);
 
     if(!m)
         m=*pm= av_mallocz(sizeof(*m));
@@ -74,6 +79,8 @@
         av_free(m->elems);
         av_freep(pm);
     }
+    
+// 	printf("num flags %i\n", m->count);
 
     return 0;
 }
@@ -102,19 +109,26 @@
     AVMetadata *dst = NULL;
     const char *key;
 
+//     printf("metadata_conv()\n");
+
     while((mtag=av_metadata_get(*pm, "", mtag, AV_METADATA_IGNORE_SUFFIX))) {
         key = mtag->key;
+
+//         printf("metadata_conv() key: %s\n", key);
+
         if (s_conv != d_conv) {
             if (s_conv)
                 for (sc=s_conv; sc->native; sc++)
                 if (!strcasecmp(key, sc->native)) {
                     key = sc->generic;
+//                     printf("generic key: %s\n", key);
                     break;
                 }
             if (d_conv)
                 for (dc=d_conv; dc->native; dc++)
                     if (!strcasecmp(key, dc->generic)) {
                     key = dc->native;
+//                     printf("native key: %s\n", key);
                     break;
                 }
         }
@@ -127,6 +141,9 @@
 void av_metadata_conv(AVFormatContext *ctx, const AVMetadataConv *d_conv,
                                             const AVMetadataConv *s_conv)
 {
+
+// 	printf("av_metadata_conv()\n");
+
     int i;
     metadata_conv(&ctx->metadata, d_conv, s_conv);
     for (i=0; i<ctx->nb_streams ; i++)
Index: libmpdemux/demux_lavf.c
===================================================================
--- libmpdemux/demux_lavf.c	(revision 29351)
+++ libmpdemux/demux_lavf.c	(working copy)
@@ -421,6 +421,7 @@
 static demuxer_t* demux_open_lavf(demuxer_t *demuxer){
     AVFormatContext *avfc;
     AVFormatParameters ap;
+    AVMetadataTag *tag;
     const AVOption *opt;
     lavf_priv_t *priv= demuxer->priv;
     int i;
@@ -486,6 +487,34 @@
 //    if(avfc->track       ) demux_info_add(demuxer, "track"    , avfc->track    );
     if(avfc->genre    [0]) demux_info_add(demuxer, "genre"    , avfc->genre    );
 
+    tag = av_metadata_get(avfc->metadata, "collection/title"    , NULL, 0);
+    if(tag && tag->value)
+    	demux_info_add(demuxer, "collection/title"    ,  tag->value );
+    	
+    tag = av_metadata_get(avfc->metadata, "collection/production_studio"    , NULL, 0);
+    if(tag && tag->value)
+    	demux_info_add(demuxer, "collection/production_studio"    ,  tag->value );
+    
+    tag = av_metadata_get(avfc->metadata, "collection/date_release"    , NULL, 0);
+    if(tag && tag->value)
+    	demux_info_add(demuxer, "collection/date_release"    ,  tag->value );
+    
+    tag = av_metadata_get(avfc->metadata, "season/date_release"    , NULL, 0);
+    if(tag && tag->value)
+    	demux_info_add(demuxer, "season/date_release"    ,  tag->value );
+    
+    tag = av_metadata_get(avfc->metadata, "season/part_number"    , NULL, 0);
+    if(tag && tag->value)
+    	demux_info_add(demuxer, "season/part_number"    ,  tag->value );
+    
+    tag = av_metadata_get(avfc->metadata, "episode/title"    , NULL, 0);
+    if(tag && tag->value)
+    	demux_info_add(demuxer, "episode/title"    ,  tag->value );
+    	
+    tag = av_metadata_get(avfc->metadata, "episode/part_number"    , NULL, 0);
+    if(tag && tag->value)
+    	demux_info_add(demuxer, "episode/part_number"    ,  tag->value );
+    
     for(i=0; i < avfc->nb_chapters; i++) {
         AVChapter *c = avfc->chapters[i];
         uint64_t start = av_rescale_q(c->start, c->time_base, (AVRational){1,1000});

