diff --git filefield_private.module filefield_private.module
index 7378794..852466b 100644
--- filefield_private.module
+++ filefield_private.module
@@ -23,15 +23,6 @@ function filefield_private_field_settings_alter(&$settings, $op, $field) {
       '#default_value' => (bool) $field['filefield_private_downloads'],
       '#description' => t('Enables private downloads.'),
     );
-    $content_disposition = empty($field['filefield_private_content_disposition'])
-        ? 'attachment' : $field['filefield_private_content_disposition'];
-    $settings['filefield_private_content_disposition'] = array(
-      '#type' => 'radios',
-      '#options' => array('attachment' => t('attachment'),'inline' => t('inline')),
-      '#title' => t('Private downloads content disposition'),
-      '#default_value' => $content_disposition,
-      '#description' => t('Try to force downloads to be rendered by the browser (inline) or downloaded (attachment).'),
-    );
   }
 }
 
@@ -71,70 +62,32 @@ function filefield_private_filefield_private_file_fields() {
 }
 
 /**
-* Implementation of hook_theme().
-*/
-function filefield_private_theme($existing, $type, $theme, $path) {
-  return array(
-    'filefield_private_file' => array('arguments' => array('element' => NULL))
+ * Implementation of hook_menu().
+ */
+function filefield_private_menu() {
+  $items = array();
+
+  $items[file_directory_path() . '/filefield_private_download'] = array(
+    'title' => 'File download', 
+    'page callback' => '_filefield_private_file_download', 
+    'access callback' => TRUE, 
+    'type' => MENU_CALLBACK,
   );
+
+  return $items;
 }
 
 /**
-* Theme function for overriden field formatter theme callback.
+ * Wrapper around file_download that sets the download directory as the private.
  */
-function theme_filefield_private_file($element) {
+function _filefield_private_file_download() {
   global $conf;
-  $system_directory_path = $conf['file_directory_path'];
-  $system_file_downloads = $conf['file_downloads'];
-  $filefield_private_directory_path = variable_get('filefield_private_directory_path', $system_directory_path);
-  $filefield_private_file_downloads = FILE_DOWNLOADS_PRIVATE;
-
-  $conf['file_directory_path'] = $filefield_private_directory_path;
-  $conf['file_downloads'] = $filefield_private_file_downloads;
-
-  if (isset($element['#old-theme']) && isset($element['#old-formatter'])) {
-    $element['#theme'] = $element['#old-theme'];
-    $element['#formatter'] = $element['#old-formatter'];
-  }
-  // Stop recursion
-  if ($element['#formatter'] == 'private_file_download') {
-    $element['#formatter'] = 'default';
-    $element['#theme'] = 'filefield_formatter_default';
-  }
-  $output = theme($element['#theme'], $element);
-  if (preg_match_all('/(href|src)="([^"]*)'. preg_quote(basename($element['#item']['filepath'])) .'"/', $output, $matches)) {
-    foreach ($matches[0] as $index => $link) {
-      $private_link = $matches[1][$index] .'="'. url('filefield-private/files/'.
-          $element['#node']->nid .'/'.
-          $element['#field_name'] .'/'.
-          $element['#item']['fid'], array('absolute' => TRUE)) .'"';
-      $output = str_replace($matches[0][$index], $private_link, $output);
-    }
-  }
-  else {
-    // No match, possible error
-    $output = '';
-  }
-  $conf['file_directory_path'] = $system_directory_path;
-  $conf['file_downloads'] = $system_file_downloads;
-
-  return $output;
-}
 
-
-/**
-* Implementation of hook_menu().
-*/
-function filefield_private_menu() {
-  $items = array();
-  $items['filefield-private/files/%node/%/%'] = array(
-    'title' => 'File download',
-    'page callback' => 'filefield_private_download',
-    'page arguments' => array(2, 3, 4),
-    'access callback' => TRUE,
-    'type' => MENU_CALLBACK,
-  );
-  return $items;
+  $public = $conf['file_directory_path'];
+  $conf['file_directory_path'] = variable_get('filefield_private_directory_path',  $public);
+  $args = func_get_args();
+  return file_download(implode('/', $args));
+  $conf['file_directory_path'] = $public;
 }
 
 /**
@@ -161,24 +114,7 @@ function filefield_private_form_alter(&$form, $from_state, $form_id) {
  * Implements hook_nodeapi().
  */
 function filefield_private_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
-  if ($op == 'view') {
-    $content_type = content_types($node->type);
-    $file_fields = filefield_private_file_fields();
-    foreach ($content_type['fields'] as $field) {
-      if (!empty($field['filefield_private_downloads']) && in_array($field['type'], $file_fields) && isset($node->content[$field['field_name']])
-        && is_array($node->content[$field['field_name']])) {
-        $instance = $node->content[$field['field_name']];
-        foreach ($node->content[$field['field_name']]['field']['items'] as $delta => $item) {
-          $item['#old-theme'] = $item['#theme'];
-          $item['#old-formatter'] = $item['#formatter'];
-          $item['#theme'] = 'filefield_private_file';
-          $item['#formatter'] = NULL;
-          $node->content[$field['field_name']]['field']['items'][$delta] = $item;
-        }
-      }
-    }
-  }
-  elseif ($op == 'insert' || $op == 'update') {
+  if ($op == 'insert' || $op == 'update') {
     filefield_private_move_files($node);
   }
 }
@@ -228,6 +164,7 @@ function filefield_private_move_files(&$node) {
       if (file_move($src, $dest, FILE_EXISTS_RENAME)) {
         // update db
         db_query("UPDATE {files} SET filepath = '%s' WHERE filepath = '%s'", $src, $file['filepath']);
+        _field_file_cache(NULL, TRUE);
       }
       else {
         // Error - TODO Find a better way
@@ -246,55 +183,21 @@ function filefield_private_move_files(&$node) {
 }
 
 /**
- * Call modules that implement hook_file_download() to find out if a file is
- * accessible and what headers it should be transferred with. If a module
- * returns -1 drupal_access_denied() will be returned. If one or more modules
- * returned headers the download will start with the returned headers. If no
- * modules respond drupal_not_found() will be returned.
+ * Implementation of hook_file_load().
  */
-function filefield_private_download($node, $field_name, $fid) {
-  global $conf;
-  if (!node_access('view', $node)) {
-    return drupal_access_denied();
-  }
-  $field = content_fields($field_name, $node->type);
-
-  $filepath = '';
-  $content_disposition = empty($field['filefield_private_content_disposition'])
-       ? 'attachment' : $field['filefield_private_content_disposition'];
-
-  if (!empty($node->$field_name)) {
-    foreach ($node->$field_name as $file) {
-      if ($file['fid'] == $fid && file_exists($file['filepath'])) {
-        $filepath = $file['filepath'];
-        break;
-      }
-    }
-  }
-  if (file_exists($filepath)) {
-    $filefield_private_directory_path = variable_get('filefield_private_directory_path', $system_directory_path);
-    $system_directory_path = $conf['file_directory_path'];
-    $conf['file_directory_path'] = $filefield_private_directory_path;
-
-    $headers = module_invoke_all('file_download', $filepath);
-    $headers = array_merge($headers, module_invoke_all('file_private_download', $filepath, $content_disposition));
-    // FileField returns -1 when the file cannot be downloaded
-    if (in_array(-1, $headers)) {
-      $conf['file_directory_path'] = $system_directory_path;
-      return drupal_access_denied();
-    }
-    if (count($headers)) {
-      file_transfer($filepath, $headers);
-    }
+function filefield_private_file_load(&$file) {
+  static $real_filefield_private_directory_path, $directory_path;
+  if (!isset($real_filefield_private_directory_path)) {
+    $directory_path = file_directory_path();
+    $filefield_private_directory_path = variable_get('filefield_private_directory_path', file_directory_path());
+    $real_filefield_private_directory_path = realpath($filefield_private_directory_path);
   }
-  $conf['file_directory_path'] = $system_directory_path;
-  return drupal_not_found();
-}
 
-function filefield_private_file_private_download ($filepath, $content_disposition) {
-  if (in_array($content_disposition, array('inline', 'attachment'))) {
-    return array(
-      'Content-Disposition: '. $content_disposition .'; filename="'. basename($filepath) .'"'
-    );
+  if (file_exists($file->filepath)) {
+    $file->realpath = realpath($file->filepath);
+    // If within the private path, ignore the file
+    if (strpos($file->realpath, $real_filefield_private_directory_path) === 0) {
+      $file->filepath = $directory_path . '/filefield_private_download' . substr($file->filepath, strlen($filefield_private_directory_path));
+    } 
   }
 }
