diff --git a/includes/file.inc b/includes/file.inc
index ead32264c1327db0ed32f5d946c17bfd95dd72a4..5478e874869be549450df7a75fab095ad7e65591 100644
--- a/includes/file.inc
+++ b/includes/file.inc
@@ -1544,10 +1544,14 @@ function file_upload_max_size() {
  *   An optional map of extensions to their mimetypes, in the form:
  *    - 'mimetypes': a list of mimetypes, keyed by an identifier,
  *    - 'extensions': the mapping itself, an associative array in which
- *      the key is the extension and the value is the mimetype identifier.
+ *      the key is the extension (lowercase) and the value is the mimetype identifier.
+ *    If $mapping is omitted, the drupal variable mime_extension_mapping is checked
+ *    for a value and if that fails then file_default_mimetype_mapping() is called
  *
  * @return
  *   The internet media type registered for the extension or application/octet-stream for unknown extensions.
+ * @see
+ *   file_default_mimetype_mapping()
  */
 function file_get_mimetype($filename, $mapping = NULL) {
   if (!isset($mapping)) {
@@ -1571,7 +1575,7 @@ function file_get_mimetype($filename, $mapping = NULL) {
   //   - image.jpeg, and
   //   - awesome.image.jpeg
   while ($additional_part = array_pop($file_parts)) {
-    $extension = $additional_part . ($extension ? '.' . $extension : '');
+    $extension = strtolower($additional_part . ($extension ? '.' . $extension : ''));
     if (isset($mapping['extensions'][$extension])) {
       return $mapping['mimetypes'][$mapping['extensions'][$extension]];
     }
diff --git a/includes/file.mimetypes.inc b/includes/file.mimetypes.inc
index 501e1a4cf075ac31f8ea054a27fa25332b66d8d9..f0586f2fb74d9a048ecc43388f9d1f6bb79097a2 100644
--- a/includes/file.mimetypes.inc
+++ b/includes/file.mimetypes.inc
@@ -1,7 +1,18 @@
 <?php
+// $Id$
+
+/**
+ * @file
+ * Provides mimetype mappings.
+ */
+
 
 /**
  * Default MIME extension mapping.
+ *
+ * @return
+ *   Array of mimetypes correlated to the extensions that relate to them.
+ * @see file_get_mimetype()
  */
 function file_default_mimetype_mapping() {
   return array(
@@ -355,6 +366,8 @@ function file_default_mimetype_mapping() {
       344 => 'x-epoc/x-sisx-app',
       345 => 'x-world/x-vrml',
     ),
+
+    // Extensions added to this list MUST be lower-case.
     'extensions' => array(
       'ez' => 0,
       'atom' => 1,
@@ -484,7 +497,7 @@ function file_default_mimetype_mapping() {
       'pfb' => 113,
       'pcf' => 113,
       'gsf' => 113,
-      'pcf.Z' => 113,
+      'pcf.z' => 113,
       'mm' => 114,
       'spl' => 115,
       'gnumeric' => 116,
diff --git a/modules/simpletest/tests/file.test b/modules/simpletest/tests/file.test
index 6c1dcdd423733b4b0740e2d3522c62130b12db86..54dfa0d61ca56033a3646ac4de80eb2428f132e4 100644
--- a/modules/simpletest/tests/file.test
+++ b/modules/simpletest/tests/file.test
@@ -30,7 +30,7 @@ function file_test_file_scan_callback($filepath = NULL) {
   $files = &drupal_static(__FUNCTION__, array());
   if (isset($filepath)) {
     $files[] = $filepath;
-  } 
+  }
   else {
     return $files;
   }
@@ -2016,23 +2016,64 @@ class FileMimeTypeTest extends DrupalWebTestCase {
   }
 
   /**
-   * Test basic extraction of mimetypes from the filename.
+   * Test mapping of mimetypes from filenames.
    */
   public function testFileMimeTypeDetection() {
     $test_case = array(
       'test.jar' => 'application/java-archive',
       'test.jpeg' => 'image/jpeg',
+      'test.JPEG' => 'image/jpeg',
       'test.jpg' => 'image/jpeg',
       'test.jar.jpg' => 'image/jpeg',
       'test.jpg.jar' => 'application/java-archive',
       'test.pcf.Z' => 'application/x-font',
-      'pcf.Z' => 'application/octet-stream',
+      'pcf.z' => 'application/octet-stream',
+      'jar' => 'application/octet-stream',
+      'some.junk' => 'application/octet-stream',
+    );
+
+    // Test using default mappings (not using 'mime_extension_mapping').
+    variable_del('mime_extension_mapping');
+    foreach ($test_case as $input => $expected) {
+      $output = file_get_mimetype($input);
+      $this->assertIdentical($output, $expected, t('Mimetype (using default mappings) for %input is %output (expected: %expected).', array('%input' => $input, '%output' => $output, '%expected' => $expected)));
+    }
+
+    // Now test using mappings from the mime_extension_mapping variable.
+    $mapping = array(
+      'mimetypes' => array(
+        0 => 'application/java-archive',
+        1 => 'image/jpeg',
+      ),
+      'extensions' => array(
+         'jar' => 0,
+         'jpg' => 1,
+      )
+    );
+
+    $test_case = array(
+      'test.jar' => 'application/java-archive',
+      'test.jpeg' => 'application/octet-stream',
+      'test.jpg' => 'image/jpeg',
+      'test.jar.jpg' => 'image/jpeg',
+      'test.jpg.jar' => 'application/java-archive',
+      'test.pcf.z' => 'application/octet-stream',
+      'pcf.z' => 'application/octet-stream',
       'jar' => 'application/octet-stream',
+      'some.junk' => 'application/octet-stream',
     );
 
+    variable_set('mime_extension_mapping', $mapping);
     foreach ($test_case as $input => $expected) {
       $output = file_get_mimetype($input);
-      $this->assertIdentical($output, $expected, t('Mimetype for %input is %output (expected: %expected).', array('%input' => $input, '%output' => $output, '%expected' => $expected)));
+      $this->assertIdentical($output, $expected, t('Mimetype (using mappings from variable) for %input is %output (expected: %expected).', array('%input' => $input, '%output' => $output, '%expected' => $expected)));
+    }
+
+    // Now test the same when passing in the map.
+    variable_del('mime_extension_mapping');
+    foreach ($test_case as $input => $expected) {
+      $output = file_get_mimetype($input, $mapping);
+      $this->assertIdentical($output, $expected, t('Mimetype (using passed-in mappings) for %input is %output (expected: %expected).', array('%input' => $input, '%output' => $output, '%expected' => $expected)));
     }
   }
 }