diff --git a/includes/file.inc b/includes/file.inc
index ba3da06..56955e6 100644
--- a/includes/file.inc
+++ b/includes/file.inc
@@ -2456,13 +2456,14 @@ function drupal_rmdir($uri, $context = NULL) {
  *
  * Compatibility: normal paths and stream wrappers.
  *
- * @param $directory
- *   The directory where the temporary filename will be created.
- * @param $prefix
+ * @param string $directory
+ *   The directory where the temporary filename will be created. This should
+ *   already exist and be writeable by PHP.
+ * @param string $prefix
  *   The prefix of the generated temporary filename.
  *   Note: Windows uses only the first three characters of prefix.
  *
- * @return
+ * @return string
  *   The new temporary filename, or FALSE on failure.
  *
  * @see tempnam()
@@ -2473,9 +2474,9 @@ function drupal_tempnam($directory, $prefix) {
   $scheme = file_uri_scheme($directory);
 
   if ($scheme && file_stream_wrapper_valid_scheme($scheme)) {
-    $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
+    $local_directory = drupal_realpath($directory);
 
-    if ($filename = tempnam($wrapper->getDirectoryPath(), $prefix)) {
+    if (is_writable($local_directory) && ($filename = tempnam($local_directory, $prefix))) {
       return $scheme . '://' . drupal_basename($filename);
     }
     else {
diff --git a/modules/simpletest/tests/file.test b/modules/simpletest/tests/file.test
index 89ecac7..5781ae18 100644
--- a/modules/simpletest/tests/file.test
+++ b/modules/simpletest/tests/file.test
@@ -2691,7 +2691,7 @@ class FileMimeTypeTest extends DrupalWebTestCase {
 /**
  * Tests stream wrapper functions.
  */
-class StreamWrapperTest extends DrupalWebTestCase {
+class FileStreamWrapperTest extends FileTestCase {
 
   protected $scheme = 'dummy';
   protected $classname = 'DrupalDummyStreamWrapper';
@@ -2766,4 +2766,23 @@ class StreamWrapperTest extends DrupalWebTestCase {
     $this->assertTrue(file_stream_wrapper_valid_scheme(file_uri_scheme('public://asdf')), 'Got a valid stream scheme from public://asdf');
     $this->assertFalse(file_stream_wrapper_valid_scheme(file_uri_scheme('foo://asdf')), 'Did not get a valid stream scheme from foo://asdf');
   }
+
+  /**
+   * Test the drupal_tempnam() function.
+   *
+   * Ensure that drupal_tempnam can create files in a folder when using a stream
+   * wrapper.
+   */
+  function testDrupalTempnam() {
+    // Create a tmp file at the root of the default stream wrapper.
+    $tempnam = drupal_tempnam(file_default_scheme() . '://', 'tmp');
+    $this->assertTrue($tempnam, t('Default stream wrapper can create temporary files'));
+    $this->assertEqual(file_default_scheme() . '://tmp', substr($tempnam, 0, strlen(file_default_scheme() . '://tmp')), t('Temporary file created at root of stream wrapper with correct URI'));
+
+    // Create a tmp file in a subfolder of the default stream wrapper.
+    $folder = $this->createDirectory();
+    $tempnam = drupal_tempnam($folder, 'tmp');
+    $this->assertTrue($tempnam, t('Default stream wrapper can create temporary files'));
+    $this->assertEqual($folder, drupal_dirname($tempnam), t('Temporary file in subdirectory of stream wrapper was created'));
+  }
 }
