diff --git a/remote_file_source.module b/remote_file_source.module
index 5b68085..8698b69 100644
--- a/remote_file_source.module
+++ b/remote_file_source.module
@@ -6,6 +6,8 @@
  */
 
 define('REMOTE_FILE_SOURCE_HINT_TEXT', 'http://example.com/files/file.zip');
+define('REMOTE_FILE_TIMEOUT', 30.0);
+define('REMOTE_FILE_MAX_REDIRECTS', 3);
 
 /**
  * Implements hook_filefield_sources_info().
@@ -85,8 +87,13 @@ function filefield_source_remotefile_process($element, &$form_state, $form) {
  * A #filefield_value_callback function.
  */
 function filefield_source_remotefile_value($element, &$item) {
-  if (isset($item['filefield_remotefile']['url']) && drupal_strlen($item['filefield_remotefile']['url']) > 0 && $item['filefield_remotefile']['url'] != REMOTE_FILE_SOURCE_HINT_TEXT) {    
+  // A remote url has been entered.
+  if (isset($item['filefield_remotefile']['url'])
+    && drupal_strlen($item['filefield_remotefile']['url']) > 0
+    && $item['filefield_remotefile']['url'] != REMOTE_FILE_SOURCE_HINT_TEXT) {
+
     $value = $item['filefield_remotefile']['url'];
+
     if (!valid_url($value, TRUE)) {
       form_error($element, t('Invalid Remote File URL.'));
       return;
@@ -98,31 +105,54 @@ function filefield_source_remotefile_value($element, &$item) {
     }
     else {
       // Check that the file exists.
-      $request = drupal_http_request($value, array('method' => 'HEAD'));
+      $headers = remote_file_source_headers($value);
       if (!empty($request->error)) {
         form_error($element, t('Unable to fetch file from Remote File URL %url (error @code: %error).', array('%url' => $value, '@code' => $request->code, '%error' => $request->error)));
         return;
       }
     }
-    
+
     try {
       $file = remote_stream_wrapper_file_load_by_uri($value);
       if (!$file) {
+        // Check if it has a Location and treat that as the location.
         $file = remote_stream_wrapper_file_create_by_uri($value);
+        $headers = remote_file_source_headers($value);
+
+        foreach ($headers as $header) {
+          if (preg_match('/Location: (.+)/', $header, $matches)) {
+            $exploded = explode('/', $matches[1]);
+            if ($exploded && count($exploded) > 1) {
+              $file->filename = $exploded[count($exploded) - 1];
+            }
+          }
+          // Content-Disposition: attachment; filename="FILE NAME HERE"
+          elseif (preg_match('/Content-Disposition:.*?filename="(.+?)"/', $header, $matches)) {
+            $file->filename = trim($matches[1]);
+          }
+          // Content-Disposition: attachment; filename=file.ext
+          elseif (preg_match('/Content-Disposition:.*?filename=([^; ]+)/', $header, $matches)) {
+            $file->filename = trim($matches[1]);
+          }
+          elseif (preg_match('/Content-Type:[ ]*([a-z0-9_\-]+\/[a-z0-9_\-]+)/i', $header, $matches)) {
+            $mime_type = $matches[1];
+            $file->filemime = $mime_type;
+          }
+        }
         $file->status = FALSE;
-        file_save($file);
+        $file = file_save($file);
       }
     }
     catch (Exception $e) {
       form_set_error('url', $e->getMessage());
       return;
     }
-  
+
     if (empty($file->fid)) {
       form_set_error($element, t('Unable to add file from URL %file.', array('%file' => $value)));
       return;
     }
-    
+
     // Run all the normal validations, minus file size restrictions.
     if (isset($element['#upload_validators']['file_validate_size'])) {
       unset($element['#upload_validators']['file_validate_size']);
@@ -130,6 +160,90 @@ function filefield_source_remotefile_value($element, &$item) {
 
     if (filefield_sources_element_validate($element, (object) $file)) {
       $item = array_merge($item, (array) $file);
-    }    
+    }
+  }
+}
+
+function remote_file_source_http_code($url) {
+  if ($headers = remote_file_source_headers($url)) {
+    return $headers['http_code'];
+  }
+}
+
+function remote_file_source_mime($url) {
+  if ($headers = remote_file_source_headers($url)) {
+    $mime = explode(';', $headers['content_type'])[0];
+    return strtolower($mime);
+  }
+}
+
+function remote_file_source_headers($url, $max_redirects = REMOTE_FILE_MAX_REDIRECTS) {
+  $curl = curl_init($url);
+  curl_setopt_array($curl, array(
+    CURLOPT_NOBODY => true,
+    CURLOPT_RETURNTRANSFER => 0,
+    CURLOPT_CUSTOMREQUEST => 'GET',
+    CURLOPT_FOLLOWLOCATION => true,
+    CURLOPT_CONNECTTIMEOUT => 2,
+    CURLOPT_TIMEOUT => 5,
+  ));
+  $result = curl_exec($curl);
+  $headers = curl_getinfo($curl);
+  // Stolen from core Drupal drupal_http_request()
+  switch ($headers['http_code']) {
+      case 200: // OK
+      case 201: // Created
+      case 202: // Accepted
+      case 203: // Non-Authoritative Information
+      case 204: // No Content
+      case 205: // Reset Content
+      case 206: // Partial Content
+      case 304: // Not modified
+        break;
+      case 301: // Moved permanently
+      case 302: // Moved temporarily
+      case 307: // Moved temporarily
+        $location = $headers['location'];
+        $timeout = REMOTE_FILE_TIMEOUT;
+        $timeout -= timer_read(__FUNCTION__) / 1000;
+        if ($timeout <= 0) {
+          return FALSE;
+        }
+        elseif($max_redirects) {
+          // Redirect to the new location.
+          $max_redirects--;
+          $headers = remote_file_source_headers($location, $max_redirects);
+        }
+        else {
+          return FALSE;
+        }
+        break;
+      default:
+        return FALSE;
+  }
+  curl_close($curl);
+  return $headers;
+}
+
+/**
+ * Get/set the remote file extension in a static variable.
+ */
+function remote_file_source_mime_extension($curl_mime_type = NULL) {
+  static $extension = NULL;
+  if (isset($curl_mime_type)) {
+    include_once DRUPAL_ROOT . '/includes/file.mimetypes.inc';
+    $curl_mime_type = drupal_strtolower($curl_mime_type);
+    $mapping = file_mimetype_mapping();
+    // See if this matches a known MIME type.
+    $map_id = array_search($curl_mime_type, $mapping['mimetypes']);
+    if ($map_id !== FALSE) {
+      // If we have a match, get this list of likely extensions. For some reason
+      // Drupal lists the "most common" extension last for most file types
+      // including php, jpg, and doc.
+      if ($extensions = array_keys($mapping['extensions'], $map_id)) {
+        $extension = end($extensions);
+      }
+    }
   }
-}
\ No newline at end of file
+  return $extension;
+}
