diff --git sites/all/modules/filefield_sources/filefield_sources.module sites/all/modules/filefield_sources/filefield_sources.module
index 79550a0..1613c56 100644
--- sites/all/modules/filefield_sources/filefield_sources.module
+++ sites/all/modules/filefield_sources/filefield_sources.module
@@ -29,6 +29,7 @@
 
   foreach (module_invoke_all('filefield_sources_widgets') as $widget) {
     $elements[$widget]['#process'] = array('filefield_sources_field_process');
+    $elements[$widget]['#pre_render'] = array('filefield_sources_field_pre_render');
     $elements[$widget]['#element_validate'] = array('filefield_sources_field_validate');
     $elements[$widget]['#filefield_value_callback'] = array('filefield_sources_field_value');
   }
@@ -178,6 +179,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;
 }
 
 /**
diff --git sites/all/modules/filefield_sources/sources/attach.inc sites/all/modules/filefield_sources/sources/attach.inc
index 38fe5d6..f1ada0b 100644
--- sites/all/modules/filefield_sources/sources/attach.inc
+++ sites/all/modules/filefield_sources/sources/attach.inc
@@ -116,9 +116,9 @@
   $settings = $instance;
 
   $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($field['widget']);
@@ -156,8 +156,10 @@
   }
 
   $element['filefield_attach']['attach'] = array(
+    '#name' => implode('_', $element['#array_parents']) . '_attach',
     '#type' => 'submit',
     '#value' => isset($attach_message) ? t('Refresh') : t('Attach'),
+    '#validate' => array(),
     '#submit' => array('node_form_submit_build_node'),
     '#ahah' => array(
       'path' => 'filefield/ahah/' . $element['#type_name'] . '/' . $element['#field_name'] . '/' . $element['#delta'],
@@ -225,9 +227,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 aeb2884..cf02e9c 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,8 +102,10 @@
   );
 
   $element['filefield_imce']['select'] = array(
+    '#name' => implode('_', $element['#array_parents']) . '_imce_select',
     '#type' => 'submit',
     '#value' => t('Select'),
+    '#validate' => array(),
     '#submit' => array('node_form_submit_build_node'),
     '#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 f1f09d5..0ed6a92 100644
--- sites/all/modules/filefield_sources/sources/reference.inc
+++ sites/all/modules/filefield_sources/sources/reference.inc
@@ -97,9 +97,9 @@
 function filefield_source_reference_process($element, $edit, &$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,
   );
 
@@ -110,8 +110,10 @@
   );
 
   $element['filefield_reference']['select'] = array(
+    '#name' => implode('_', $element['#array_parents']) . '_autocomplete_select',
     '#type' => 'submit',
     '#value' => t('Select'),
+    '#validate' => array(),
     '#submit' => array('node_form_submit_build_node'),
     '#name' => $element['#name'] . '[filefield_reference][button]',
     '#ahah' => array(
diff --git sites/all/modules/filefield_sources/sources/remote.inc sites/all/modules/filefield_sources/sources/remote.inc
index 6978eff..f85e157 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, $edit, &$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,8 +85,10 @@
   );
 
   $element['filefield_remote']['transfer'] = array(
+    '#name' => implode('_', $element['#array_parents']) . '_transfer',
     '#type' => 'submit',
     '#value' => t('Transfer'),
+    '#validate' => array(),
     '#submit' => array('node_form_submit_build_node'),
     '#ahah' => array(
       'path' => 'filefield/ahah/' . $element['#type_name'] . '/' . $element['#field_name'] . '/' . $element['#delta'],
