diff --git sites/all/modules/filefield_sources/filefield_sources.module sites/all/modules/filefield_sources/filefield_sources.module
index a18f134..745838f 100644
--- sites/all/modules/filefield_sources/filefield_sources.module
+++ sites/all/modules/filefield_sources/filefield_sources.module
@@ -124,7 +124,7 @@
 
   // If not a recognized field instance, do not process.
   if (!isset($element['#field_name']) || !($instance = field_widget_instance($element, $form_state))) {
-    return;
+    return $element;
   }
 
   // Do all processing as needed by each source.
diff --git sites/all/modules/filefield_sources/sources/attach.inc sites/all/modules/filefield_sources/sources/attach.inc
index c71cf6e..5c95ae3 100644
--- sites/all/modules/filefield_sources/sources/attach.inc
+++ sites/all/modules/filefield_sources/sources/attach.inc
@@ -151,8 +151,8 @@
   }
   else {
     $validators = $element['#upload_validators'];
-    if (isset($validators['filefield_validate_size'])) {
-      unset($validators['filefield_validate_size']);
+    if (isset($validators['file_validate_size'])) {
+      unset($validators['file_validate_size']);
     }
     $description .= '<br />' . filefield_sources_element_validation_help($validators);
     $element['filefield_attach']['filename'] = array(
@@ -208,25 +208,33 @@
   if (!empty($item['filefield_attach']['filename'])) {
     $instance = field_info_instance($element['#entity_type'], $element['#field_name'], $element['#bundle']);
     $filepath = $item['filefield_attach']['filename'];
+
+    // Check that the destination is writable.
+    $directory = $element['#upload_location'];
+    if (!file_prepare_directory($directory, FILE_CREATE_DIRECTORY)) {
+      watchdog('file', 'File %file could not be copied, because the destination directory %destination is not configured correctly.', array('%file' => $filepath, '%destination' => drupal_realpath($directory)));
+      drupal_set_message(t('The specified file %file could not be copied, because the destination directory is not properly configured. This may be caused by a problem with file or directory permissions. More information is available in the system log.', array('%file' => $filepath)), 'error');
+      return;
+    }
 
     // Clean up the file name extensions and transliterate.
     $original_filepath = $filepath;
-    $new_filepath = filefield_sources_clean_filename($filepath, $instance['widget']['settings']['file_extensions']);
+    $new_filepath = filefield_sources_clean_filename($filepath, $instance['settings']['file_extensions']);
     rename($filepath, $new_filepath);
     $filepath = $new_filepath;
 
     // Run all the normal validations, minus file size restrictions.
     $validators = $element['#upload_validators'];
-    if (isset($validators['filefield_validate_size'])) {
-      unset($validators['filefield_validate_size']);
+    if (isset($validators['file_validate_size'])) {
+      unset($validators['file_validate_size']);
     }
 
     // Save the file to the new location.
-    if ($file = filefield_sources_save_file($filepath, $element['#upload_validators'], $element['#upload_location'])) {
+    if ($file = filefield_sources_save_file($filepath, $validators, $directory)) {
       $item = array_merge($item, (array) $file);
 
       // Delete the original file if "moving" the file instead of copying.
-      if (empty($instance['widget']['settings']['filefield_sources']['source_attach']['attach_mode']) || $instance['settings']['filefield_sources']['source_attach']['attach_mode'] !== 'copy') {
+      if ($instance['widget']['settings']['filefield_sources']['source_attach']['attach_mode'] !== 'copy') {
         // TODO: Figure out a way to re-introduce this feature. By unlinking the
         // file it causes the option to be removed from the select list on the
         // form rebuild, thus throwing an illegal option error.
diff --git sites/all/modules/filefield_sources/sources/imce.inc sites/all/modules/filefield_sources/sources/imce.inc
index bbd6dd7..3cb5b6a 100644
--- sites/all/modules/filefield_sources/sources/imce.inc
+++ sites/all/modules/filefield_sources/sources/imce.inc
@@ -129,7 +129,7 @@
   if (isset($item['filefield_imce']['file_path']) && $item['filefield_imce']['file_path'] != '') {
     $field = field_info_field($element['#field_name']);
 
-    $scheme = $field['widget']['settings']['uri_scheme'];
+    $scheme = $field['settings']['uri_scheme'];
     $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
     $file_directory_prefix = $wrapper->getDirectoryPath();
     $uri = preg_replace('/^' . preg_quote('/' . $file_directory_prefix . '/', '/') . '/', $scheme . '://', $item['filefield_imce']['file_path']);
diff --git sites/all/modules/filefield_sources/sources/reference.inc sites/all/modules/filefield_sources/sources/reference.inc
index 78b66c1..2665166 100644
--- sites/all/modules/filefield_sources/sources/reference.inc
+++ sites/all/modules/filefield_sources/sources/reference.inc
@@ -138,6 +138,12 @@
     if (preg_match('/\[fid:(\d+)\]/', $item['filefield_reference']['autocomplete'], $matches)) {
       $fid = $matches[1];
       if ($file = file_load($fid)) {
+
+        // Run all the normal validations, minus file size restrictions.
+        if (isset($element['#upload_validators']['file_validate_size'])) {
+          unset($element['#upload_validators']['file_validate_size']);
+        }
+
         if (filefield_sources_element_validate($element, (object) $file)) {
           $item = array_merge($item, (array) $file);
         }
diff --git sites/all/modules/filefield_sources/sources/remote.inc sites/all/modules/filefield_sources/sources/remote.inc
index f0a8774..5ba92ca 100644
--- sites/all/modules/filefield_sources/sources/remote.inc
+++ sites/all/modules/filefield_sources/sources/remote.inc
@@ -80,7 +80,7 @@
 
   $element['filefield_remote']['url'] = array(
     '#type' => 'textfield',
-    '#description' => filefield_sources_element_validation_help($element),
+    '#description' => filefield_sources_element_validation_help($element['#upload_validators']),
     '#maxlength' => NULL,
   );
 
@@ -113,6 +113,22 @@
   if (isset($item['filefield_remote']['url']) && strlen($item['filefield_remote']['url']) > 0 && valid_url($item['filefield_remote']['url']) && $item['filefield_remote']['url'] != FILEFIELD_SOURCE_REMOTE_HINT_TEXT) {
     $field = field_info_instance($element['#entity_type'], $element['#field_name'], $element['#bundle']);
     $url = $item['filefield_remote']['url'];
+
+    // Check that the destination is writable.
+    $temporary_directory = 'temporary://';
+    if (!file_prepare_directory($temporary_directory, FILE_MODIFY_PERMISSIONS)) {
+      watchdog('file', 'The directory %directory is not writable, because it does not have the correct permissions set.', array('%directory' => drupal_realpath($temporary_directory)));
+      drupal_set_message(t('The file could not be transferred because the temporary directory is not writable.'), 'error');
+      return;
+    }
+
+    // Check that the destination is writable.
+    $directory = $element['#upload_location'];
+    if (!file_prepare_directory($directory, FILE_CREATE_DIRECTORY)) {
+      watchdog('file', 'File %file could not be copied, because the destination directory %destination is not configured correctly.', array('%file' => $url, '%destination' => drupal_realpath($directory)));
+      drupal_set_message(t('The specified file %file could not be copied, because the destination directory is not properly configured. This may be caused by a problem with file or directory permissions. More information is available in the system log.', array('%file' => $url)), 'error');
+      return;
+    }
 
     // Check the headers to make sure it exists and is within the allowed size.
     $ch = curl_init();
@@ -159,7 +175,7 @@
 
     $pathinfo = pathinfo($filename);
     $filename = filefield_sources_clean_filename($filename, $field['settings']['file_extensions']);
-    $filepath = file_create_filename($filename, 'temporary://');
+    $filepath = file_create_filename($filename, $temporary_directory);
 
     if (empty($pathinfo['extension'])) {
       form_error($element, t('The remote URL must be a file and have an extension.'));
