diff --git sites/all/modules/filefield_sources/filefield_sources.module sites/all/modules/filefield_sources/filefield_sources.module
index 87a16b5..25795fc 100644
--- sites/all/modules/filefield_sources/filefield_sources.module
+++ sites/all/modules/filefield_sources/filefield_sources.module
@@ -28,6 +28,7 @@
   $elements = array();
 
   $elements['managed_file']['#process'] = array('filefield_sources_field_process');
+  $elements['managed_file']['#pre_render'] = array('filefield_sources_field_pre_render');
   $elements['managed_file']['#element_validate'] = array('filefield_sources_field_validate');
   $elements['managed_file']['#file_value_callbacks'] = array('filefield_sources_field_value');
 
@@ -155,6 +156,26 @@
       $type = str_replace('filefield_', '', $key);
       drupal_add_js(array('fileFieldSources' => array($type => array('hintText' => $element[$key]['#filefield_sources_hint_text']))), 'setting');
       $js_added[$key] = TRUE;
+    }
+  }
+
+  // Adjust the AJAX settings so that on upload and remove of any individual
+  // file, the entire group of file fields is updated together.
+  // Copied directly from file_field_widget_process().
+  $field = field_widget_field($element, $form_state);
+  if ($field['cardinality'] != 1) {
+    $parents = array_slice($element['#array_parents'], 0, -1);
+    $new_path = 'file/ajax/' . implode('/', $parents) . '/' . $form['form_build_id']['#value'];
+    $field_element = drupal_array_get_nested_value($form, $parents);
+    $new_wrapper = $field_element['#id'] . '-ajax-wrapper';
+    foreach (element_children($element) as $key) {
+      foreach (element_children($element[$key]) as $subkey) {
+        if (isset($element[$key][$subkey]['#ajax'])) {
+          $element[$key][$subkey]['#ajax']['path'] = $new_path;
+          $element[$key][$subkey]['#ajax']['wrapper'] = $new_wrapper;
+          $element[$key][$subkey]['#limit_validation_errors'] = array($parents);
+        }
+      }
     }
   }
 
@@ -167,6 +188,21 @@
     );
   }
 
+  return $element;
+}
+
+/**
+ * A #pre_render function to hide sources if a file is currently uploaded.
+ */
+function filefield_sources_field_pre_render($element) {
+  // If we already have a file, we don't want to show the upload controls.
+  if (!empty($element['#value']['fid'])) {
+    foreach (element_children($element) as $key) {
+      if (!empty($element[$key]['#filefield_source'])) {
+        $element['upload']['#access'] = FALSE;
+      }
+    }
+  }
   return $element;
 }
 
@@ -182,12 +218,21 @@
       $function($element, $form_state, $form);
     }
   }
+}
+
+/**
+ * A #submit handler added to all FileField Source buttons.
+ */
+function filefield_sources_field_submit(&$form, &$form_state) {
+  $parents = array_slice($form_state['triggering_element']['#parents'], 0, -3);
+  drupal_array_set_nested_value($form_state['input'], $parents, NULL);
+  $form_state['rebuild'] = TRUE;
 }
 
 /**
  * A #filefield_value_callback to run source value callbacks.
  */
-function filefield_sources_field_value($element, &$item) {
+function filefield_sources_field_value($element, &$item, &$form_state) {
   // Do all processing as needed by each source.
   $sources = filefield_sources_info();
   foreach ($sources as $source) {
@@ -389,7 +434,7 @@
   // directory. This overcomes open_basedir restrictions for future file
   // operations.
   $file->uri = $file->destination;
-  if (!file_unmanaged_move($filepath, $file->uri)) {
+  if (!file_unmanaged_copy($filepath, $file->uri)) {
     drupal_set_message(t('File upload error. Could not move uploaded file.'), 'error');
     watchdog('file', 'Upload error. Could not move uploaded file %file to destination %destination.', array('%file' => $file->filename, '%destination' => $file->uri));
     return FALSE;
diff --git sites/all/modules/filefield_sources/sources/attach.inc sites/all/modules/filefield_sources/sources/attach.inc
index d3e895d..aeea94f 100644
--- sites/all/modules/filefield_sources/sources/attach.inc
+++ sites/all/modules/filefield_sources/sources/attach.inc
@@ -86,6 +86,13 @@
       '#type' => 'markup',
       '#value' => theme('token_help', 'user'),
     );
+
+    // Temporary placeholder until this feature works again in Drupal 7.
+    // TODO: Figure out how to re-introduce this feature.
+    // See filefield_source_attach_value().
+    $return['source_attach']['attach_mode']['#disabled'] = TRUE;
+    $return['source_attach']['attach_mode']['#default_value'] = 'copy';
+    $return['source_attach']['attach_mode']['#description'] = '<em>' . t('This feature is not yet supported on Drupal 7. All fields will by set to the "copy" mode, leaving the original file unmoved.') . '</em>';
   }
   elseif ($op == 'save') {
     $return['source_attach']['path'] = '';
@@ -116,9 +123,9 @@
   $settings = $instance['settings']['filefield_sources']['source_attach'];
 
   $element['filefield_attach'] = array(
+    '#weight' => 100.5,
     '#theme' => 'filefield_source_attach_element',
-    '#weight' => 100.5,
-    '#access' => empty($element['fid']['#value']),
+    '#filefield_source' => TRUE, // Required for proper theming.
   );
 
   $path = _filefield_source_attach_directory($instance);
@@ -156,9 +163,11 @@
   }
 
   $element['filefield_attach']['attach'] = array(
+    '#name' => implode('_', $element['#array_parents']) . '_attach',
     '#type' => 'submit',
-    '#value' => isset($attach_message) ? t('Refresh') : t('Attach'),
-    '#submit' => array('file_field_widget_submit'),
+    '#value' => t('Attach'),
+    '#validate' => array(),
+    '#submit' => array('filefield_sources_field_submit'),
     '#limit_validation_errors' => array($element['#parents']),
     '#ajax' => array(
       'path' => 'file/ajax/' . implode('/', $element['#array_parents']) . '/' . $form['form_build_id']['#value'],
@@ -218,7 +227,10 @@
 
       // Delete the original file if "moving" the file instead of copying.
       if (empty($instance['settings']['filefield_sources']['source_attach']['attach_mode']) || $instance['settings']['filefield_sources']['source_attach']['attach_mode'] !== 'copy') {
-        @unlink($filepath);
+        // 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.
+        //@unlink($filepath);
       }
     }
 
@@ -226,9 +238,9 @@
     if (file_exists($filepath) && $filepath != $original_filepath) {
       rename($filepath, $original_filepath);
     }
-  }
 
-  $item['filefield_attach']['filename'] = '';
+    $item['filefield_attach']['filename'] = '';
+  }
 }
 
 /**
diff --git sites/all/modules/filefield_sources/sources/imce.inc sites/all/modules/filefield_sources/sources/imce.inc
index fd93e90..3cb5b6a 100644
--- sites/all/modules/filefield_sources/sources/imce.inc
+++ sites/all/modules/filefield_sources/sources/imce.inc
@@ -78,8 +78,8 @@
 
   $element['filefield_imce'] = array(
     '#weight' => 100.5,
-    '#access' => empty($element['fid']['#value']),
     '#theme' => 'filefield_source_imce_element',
+    '#filefield_source' => TRUE, // Required for proper theming.
     '#description' => filefield_sources_element_validation_help($element['#upload_validators']),
   );
 
@@ -102,9 +102,11 @@
   );
 
   $element['filefield_imce']['select'] = array(
+    '#name' => implode('_', $element['#array_parents']) . '_imce_select',
     '#type' => 'submit',
     '#value' => t('Select'),
-    '#submit' => array('file_field_widget_submit'),
+    '#validate' => array(),
+    '#submit' => array('filefield_sources_field_submit'),
     '#limit_validation_errors' => array($element['#parents']),
     '#name' => $element['#name'] . '[filefield_imce][button]',
     '#id' => $select_id,
diff --git sites/all/modules/filefield_sources/sources/reference.inc sites/all/modules/filefield_sources/sources/reference.inc
index 9206bbe..c16b8be 100644
--- sites/all/modules/filefield_sources/sources/reference.inc
+++ sites/all/modules/filefield_sources/sources/reference.inc
@@ -99,9 +99,9 @@
 function filefield_source_reference_process($element, &$form_state, $form) {
 
   $element['filefield_reference'] = array(
+    '#weight' => 100.5,
     '#theme' => 'filefield_source_reference_element',
-    '#weight' => 100.5,
-    '#access' => empty($element['fid']['#value']),
+    '#filefield_source' => TRUE, // Required for proper theming.
     '#filefield_sources_hint_text' => FILEFIELD_SOURCE_REFERENCE_HINT_TEXT,
   );
 
@@ -112,9 +112,11 @@
   );
 
   $element['filefield_reference']['select'] = array(
+    '#name' => implode('_', $element['#array_parents']) . '_autocomplete_select',
     '#type' => 'submit',
     '#value' => t('Select'),
-    '#submit' => array('file_field_widget_submit'),
+    '#validate' => array(),
+    '#submit' => array('filefield_sources_field_submit'),
     '#name' => $element['#name'] . '[filefield_reference][button]',
     '#limit_validation_errors' => array($element['#parents']),
     '#ajax' => array(
diff --git sites/all/modules/filefield_sources/sources/remote.inc sites/all/modules/filefield_sources/sources/remote.inc
index 86f2b97..f0a8774 100644
--- sites/all/modules/filefield_sources/sources/remote.inc
+++ sites/all/modules/filefield_sources/sources/remote.inc
@@ -72,9 +72,9 @@
 function filefield_source_remote_process($element, &$form_state, $form) {
 
   $element['filefield_remote'] = array(
+    '#weight' => 100.5,
     '#theme' => 'filefield_source_remote_element',
-    '#weight' => 100.5,
-    '#access' => empty($element['fid']['#value']),
+    '#filefield_source' => TRUE, // Required for proper theming.
     '#filefield_sources_hint_text' => FILEFIELD_SOURCE_REMOTE_HINT_TEXT,
   );
 
@@ -85,9 +85,11 @@
   );
 
   $element['filefield_remote']['transfer'] = array(
+    '#name' => implode('_', $element['#array_parents']) . '_transfer',
     '#type' => 'submit',
     '#value' => t('Transfer'),
-    '#submit' => array('file_field_widget_submit'),
+    '#validate' => array(),
+    '#submit' => array('filefield_sources_field_submit'),
     '#limit_validation_errors' => array($element['#parents']),
     '#ajax' => array(
       'path' => 'file/ajax/' . implode('/', $element['#array_parents']) . '/' . $form['form_build_id']['#value'],
