diff --git a/includes/unicode.inc b/includes/unicode.inc
index 511179adf3e01e7a305b6cd7f79d0dc93d3dee73..04751ed79988bc49c941f41ec616ec6670f57737 100644
--- a/includes/unicode.inc
+++ b/includes/unicode.inc
@@ -233,6 +233,31 @@ function mime_header_encode($string) {
   return $string;
 }
 
+/**
+ * Complement to mime_header_encode
+ */
+function mime_header_decode($header) {
+  // First step: encoded chunks followed by other encoded chunks (need to collapse whitespace)
+  $header = preg_replace_callback('/=\?([^?]+)\?(Q|B)\?([^?]+|\?(?!=))\?=\s+(?==\?)/', '_mime_header_decode', $header);
+  // Second step: remaining chunks (do not collapse whitespace)
+  return preg_replace_callback('/=\?([^?]+)\?(Q|B)\?([^?]+|\?(?!=))\?=/', '_mime_header_decode', $header);
+}
+
+/**
+ * Helper function to mime_header_decode
+ */
+function _mime_header_decode($matches) {
+  // Regexp groups:
+  // 1: Character set name
+  // 2: Escaping method (Q or B)
+  // 3: Encoded data
+  $data = ($matches[2] == 'B') ? base64_decode($matches[3]) : str_replace('_', ' ', quoted_printable_decode($matches[3]));
+  if (strtolower($matches[1]) != 'utf-8') {
+    $data = drupal_convert_to_utf8($data, $matches[1]);
+  }
+  return $data;
+}
+
 /**
  * Decode all HTML entities (including numerical ones) to regular UTF-8 bytes.
  * Double-escaped entities will only be decoded once ("&amp;lt;" becomes "&lt;", not "<").