diff -aur gst-plugins-base-0.10.7/gst-libs/gst/tag/gstvorbistag.c gst-plugins-base-0.10.7-new/gst-libs/gst/tag/gstvorbistag.c
--- gst-plugins-base-0.10.7/gst-libs/gst/tag/gstvorbistag.c	2006-02-08 20:53:33.000000000 +1100
+++ gst-plugins-base-0.10.7-new/gst-libs/gst/tag/gstvorbistag.c	2006-07-10 20:58:46.000000000 +1000
@@ -36,6 +36,7 @@
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
+#include <gst/gst-i18n-plugin.h>
 #include <gst/gsttagsetter.h>
 #include "gsttageditingprivate.h"
 #include <stdlib.h>
@@ -74,6 +75,24 @@
   {NULL, NULL}
 };
 
+const char *GST_TAG_VORBIS_UNKNOWN="VORBIS_UNKNOWN_COMMENT";
+
+static gpointer
+gst_tag_register_vorbis_tags_internal (gpointer unused)
+{
+  gst_tag_register (GST_TAG_VORBIS_UNKNOWN, GST_TAG_FLAG_META,
+       G_TYPE_STRING, _("vorbis unknown"), _("Unknown Vorbis comment"), NULL);
+	return NULL;
+}
+
+static void
+gst_tag_register_vorbis_tags (void)
+{
+  static GOnce vorbis_once = G_ONCE_INIT;
+
+  g_once (&vorbis_once, gst_tag_register_vorbis_tags_internal, NULL);
+}
+
 /**
  * gst_tag_from_vorbis_tag:
  * @vorbis_tag: vorbiscomment tag to convert to GStreamer tag
@@ -91,6 +110,7 @@
   g_return_val_if_fail (vorbis_tag != NULL, NULL);
 
   gst_tag_register_musicbrainz_tags ();
+  gst_tag_register_vorbis_tags ();
 
   real_vorbis_tag = g_ascii_strup (vorbis_tag, -1);
   while (tag_matches[i].gstreamer_tag != NULL) {
@@ -119,6 +139,7 @@
   g_return_val_if_fail (gst_tag != NULL, NULL);
 
   gst_tag_register_musicbrainz_tags ();
+  gst_tag_register_vorbis_tags ();
 
   while (tag_matches[i].gstreamer_tag != NULL) {
     if (strcmp (gst_tag, tag_matches[i].gstreamer_tag) == 0) {
@@ -136,8 +157,18 @@
   const gchar *gst_tag = gst_tag_from_vorbis_tag (tag);
   GType tag_type;
 
-  if (gst_tag == NULL)
+  if (gst_tag == NULL) {
+    /* convert to "unknown vorbis comment" tag */
+    if (g_utf8_validate (tag, -1, NULL) && !g_utf8_strchr (tag, -1, '=') &&
+        g_utf8_validate (value, -1, NULL)) {
+      char *str;
+
+      str = g_strdup_printf ("%s=%s", tag, value);
+      gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VORBIS_UNKNOWN, str, NULL);
+      g_free (str);
+    }
     return;
+  }
 
   tag_type = gst_tag_get_type (gst_tag);
   switch (tag_type) {
@@ -329,7 +360,7 @@
   guint i;
   const gchar *vorbis_tag = gst_tag_to_vorbis_tag (tag);
 
-  if (!vorbis_tag)
+  if (!vorbis_tag && (strcmp (tag, GST_TAG_VORBIS_UNKNOWN) != 0))
     return NULL;
 
   for (i = 0; i < gst_tag_list_get_tag_size (list, tag); i++) {
@@ -350,8 +381,12 @@
 
         if (!gst_tag_list_get_string_index (list, tag, i, &str))
           g_return_val_if_reached (NULL);
-        result = g_strdup_printf ("%s=%s", vorbis_tag, str);
-        g_free (str);
+        if (strcmp (tag, GST_TAG_VORBIS_UNKNOWN) == 0) {
+          result = str;
+        } else {
+          result = g_strdup_printf ("%s=%s", vorbis_tag, str);
+          g_free (str);
+        }
         break;
       }
       case G_TYPE_DOUBLE:{
