--- id3v2frames.c	2009-01-22 00:58:39.000000000 +0100
+++ id3v2frames.c.new	2009-07-10 17:47:59.000000000 +0200
@@ -63,6 +63,34 @@ static gboolean parse_picture_frame (ID3
 #define ID3V2_ENCODING_UTF16BE 0x02
 #define ID3V2_ENCODING_UTF8    0x03
 
+static guint8 *
+id3demux_ununsync_data (const guint8 * unsync_data, guint32 * size)
+{
+  const guint8 *end;
+  guint8 *out, *uu;
+  guint out_size;
+
+  uu = out = g_malloc (*size);
+
+  for (end = unsync_data + *size; unsync_data < end - 1; ++unsync_data, ++uu) {
+    *uu = *unsync_data;
+    if (G_UNLIKELY (*unsync_data == 0xff && *(unsync_data + 1) == 0x00))
+      ++unsync_data;
+  }
+
+  /* take care of last byte (if last two bytes weren't 0xff 0x00) */
+  if (unsync_data < end) {
+    *uu = *unsync_data;
+    ++uu;
+  }
+
+  out_size = uu - out;
+  GST_DEBUG ("size after un-unsyncing: %u (before: %u)", out_size, *size);
+
+  *size = out_size;
+  return out;
+}
+
 gboolean
 id3demux_id3v2_parse_frame (ID3TagsWorking * work)
 {
@@ -558,11 +593,21 @@ parse_picture_frame (ID3TagsWorking * wo
   if (work->parse_size <= 0)
     goto not_enough_data;
 
+  if (work->frame_flags & ID3V2_FRAME_FORMAT_UNSYNCHRONISATION) {
+    guint8 *uu_data = NULL;
+	guint32 size =  work->parse_size;
+	uu_data = id3demux_ununsync_data((guint8 *) work->parse_data, &size);
+	GST_LOG("unsynch frame");
+	if(uu_data) {
+		gst_tag_list_add_id3_image(work->tags, uu_data, size, pic_type);
+		g_free(uu_data);
+	}
+  } else {
   if (!gst_tag_list_add_id3_image (work->tags, (guint8 *) work->parse_data,
           work->parse_size, pic_type)) {
     goto error;
   }
-
+  }
   g_free (mime_str);
   return TRUE;
 
--- id3tags.c	2009-05-12 02:00:06.000000000 +0200
+++ id3tags.c.new	2009-07-10 17:51:02.000000000 +0200
@@ -97,33 +97,6 @@ id3demux_calc_id3v2_tag_size (GstBuffer 
   return size;
 }
 
-static guint8 *
-id3demux_ununsync_data (const guint8 * unsync_data, guint32 * size)
-{
-  const guint8 *end;
-  guint8 *out, *uu;
-  guint out_size;
-
-  uu = out = g_malloc (*size);
-
-  for (end = unsync_data + *size; unsync_data < end - 1; ++unsync_data, ++uu) {
-    *uu = *unsync_data;
-    if (G_UNLIKELY (*unsync_data == 0xff && *(unsync_data + 1) == 0x00))
-      ++unsync_data;
-  }
-
-  /* take care of last byte (if last two bytes weren't 0xff 0x00) */
-  if (unsync_data < end) {
-    *uu = *unsync_data;
-    ++uu;
-  }
-
-  out_size = uu - out;
-  GST_DEBUG ("size after un-unsyncing: %u (before: %u)", out_size, *size);
-
-  *size = out_size;
-  return out;
-}
 
 /* caller must pass buffer with full ID3 tag */
 ID3TagsResult
@@ -194,15 +167,7 @@ id3demux_read_id3v2_tag (GstBuffer * buf
     work.hdr.frame_data_size = read_size - ID3V2_HDR_SIZE - 10;
   else
     work.hdr.frame_data_size = read_size - ID3V2_HDR_SIZE;
-
-  if ((flags & ID3V2_HDR_FLAG_UNSYNC)) {
-    GST_DEBUG ("Un-unsyncing entire tag");
-    uu_data = id3demux_ununsync_data (work.hdr.frame_data,
-        &work.hdr.frame_data_size);
-    work.hdr.frame_data = uu_data;
-    GST_MEMDUMP ("ID3v2 tag (un-unsyced)", uu_data, work.hdr.frame_data_size);
-  }
-
+ 
   result = id3demux_id3v2_frames_to_tag_list (&work, work.hdr.frame_data_size);
 
   *tags = work.tags;
