diff --git a/file_entity.admin.inc b/file_entity.admin.inc
index aa81e20..b6ea25f 100644
--- a/file_entity.admin.inc
+++ b/file_entity.admin.inc
@@ -26,9 +26,11 @@ function file_entity_admin_files($form, &$form_state) {
 
   $options = array();
   $form['#operations'] = file_entity_get_file_operation_info();
+
   foreach ($form['#operations'] as $operation => $array) {
     $options[$operation] = $array['label'];
   }
+
   $form['options'] = array(
     '#type' => 'fieldset',
     '#title' => t('Update options'),
@@ -91,6 +93,17 @@ function file_entity_admin_files($form, &$form_state) {
       'timestamp' => format_date($file->timestamp, 'short'),
     );
 
+    // Show a warning for files that do not exist.
+    if (@!file_exists($file->uri)) {
+      $options[$file->fid]['#attributes']['class'][] = 'error';
+      if (!file_stream_wrapper_get_instance_by_uri($file->uri)) {
+        $options[$file->fid]['#attributes']['title'] = t('The stream wrapper for @scheme files is missing.', array('@scheme' => file_uri_scheme($file->uri)));
+      }
+      else {
+        $options[$file->fid]['#attributes']['title'] = t('The file does not exist.');
+      }
+    }
+
     $options[$file->fid]['operations'] = array(
       'data' => array(
         '#theme' => 'links__file_operations',
@@ -98,18 +111,20 @@ function file_entity_admin_files($form, &$form_state) {
         '#attributes' => array('class' => array('links', 'inline')),
       ),
     );
-
-    $options[$file->fid]['operations']['data']['#links']['edit'] = array(
-      'title' => t('Edit'),
-      'href' => 'file/' . $file->fid . '/edit',
-      'query' => $destination,
-    );
-
-    $options[$file->fid]['operations']['data']['#links']['delete'] = array(
-      'title' => t('Delete'),
-      'href' => 'file/' . $file->fid . '/delete',
-      'query' => $destination,
-    );
+    if (file_access('edit', $file)) {
+      $options[$file->fid]['operations']['data']['#links']['edit'] = array(
+        'title' => t('Edit'),
+        'href' => 'file/' . $file->fid . '/edit',
+        'query' => $destination,
+      );
+    }
+    if (file_access('delete', $file)) {
+      $options[$file->fid]['operations']['data']['#links']['delete'] = array(
+        'title' => t('Delete'),
+        'href' => 'file/' . $file->fid . '/delete',
+        'query' => $destination,
+      );
+    }
   }
 
   $form['files'] = array(
diff --git a/file_entity.api.php b/file_entity.api.php
index 99aa893..3f2a417 100644
--- a/file_entity.api.php
+++ b/file_entity.api.php
@@ -128,46 +128,64 @@ function hook_file_view_alter($build, $type) {
 }
 
 /**
- * Defines bulk file operations.
+ * Control access to a file.
  *
- * This hook enables modules to inject custom operations into the mass
- * operations dropdown found at admin/content/file, by associating a callback
- * function with the operation, which is called when the form is submitted.
- * The callback function receives one initial argument, which is an array of
- * the checked files.
+ * Modules may implement this hook if they want to have a say in whether or not
+ * a given user has access to perform a given operation on a file.
+ *
+ * The administrative account (user ID #1) always passes any access check,
+ * so this hook is not called in that case. Users with the "bypass file access"
+ * permission may always view and edit files through the administrative
+ * interface.
+ *
+ * Note that not all modules will want to influence access on all
+ * file types. If your module does not want to actively grant or
+ * block access, return FILE_ACCESS_IGNORE or simply return nothing.
+ * Blindly returning FALSE will break other file access modules.
+ *
+ * @param $op
+ *   The operation to be performed. Possible values:
+ *   - "create"
+ *   - "delete"
+ *   - "update"
+ *   - "view"
+ * @param $file
+ *   The file on which the operation is to be performed, or, if it does
+ *   not yet exist, the type of file to be created.
+ * @param $account
+ *   A user object representing the user for whom the operation is to be
+ *   performed.
  *
  * @return
- *  An associave array of operations keyed by machine name.
- *    - label: A string to show in the operations dropdown.
- *    - callback (string): A callback function to call for the operation. This
- *        function will be passed an array of file_ids which were selected.
- *    - confirm (boolean): Whether or not this operation requires a confirm form
- *        In the case where confirm is set to true, callback should be a function
- *        which can return a confirm form.
- *
- * @see hook_file_operation_info_alter()
- * @see file_entity_get_file_operation_info()
+ *   FILE_ACCESS_ALLOW if the operation is to be allowed;
+ *   FILE_ACCESS_DENY if the operation is to be denied;
+ *   FILE_ACCESS_IGNORE to not affect this operation at all.
+ *
+ * @ingroup file_access
  */
-function hook_file_operation_info() {
-  $info['fluff'] = array(
-    'label' => t('Fluff selected files'),
-    'callback' => 'file_fluff_files',
-  );
+function hook_file_access($op, $file, $account) {
+  $type = is_string($file) ? $file : $file->type;
+
+  if ($op !== 'create' && (REQUEST_TIME - $file->timestamp) < 3600) {
+    // If the file was uploaded in the last hour, deny access to it.
+    return FILE_ACCESS_DENY;
+  }
 
-  return $info;
+  // Returning nothing from this function would have the same effect.
+  return FILE_ACCESS_IGNORE;
 }
 
 /**
- * Perform alterations on bulk file operations.
+ * Control access to listings of files.
  *
- * @param $info
- *   Array of information on bulk file operations exposed by
- *   hook_file_operation_info() implementations.
+ * @param $query
+ *   A query object describing the composite parts of a SQL query related to
+ *   listing files.
  *
- * @see hook_file_operation_info()
- * @see file_entity_get_file_operation_info()
+ * @see hook_query_TAG_alter()
+ * @ingroup file_access
  */
-function hook_file_operation_info_alter(&$info) {
-  // Remove the 'Fluff selected files' operation.
-  unset($info['fluff']);
+function hook_query_file_access_alter(QueryAlterableInterface $query) {
+  // Only show files that have been uploaded more than an hour ago.
+  $query->condition('timestamp', REQUEST_TIME - 3600, '<=');
 }
diff --git a/file_entity.info b/file_entity.info
index e2bb69b..2ebc993 100644
--- a/file_entity.info
+++ b/file_entity.info
@@ -6,6 +6,7 @@ dependencies[] = field
 dependencies[] = file
 dependencies[] = ctools
 files[] = views/views_handler_argument_file_type.inc
+files[] = views/views_handler_field_file_rendered.inc
 files[] = views/views_handler_field_file_type.inc
 files[] = views/views_handler_filter_file_type.inc
 files[] = views/views_plugin_row_file_view.inc
@@ -14,3 +15,10 @@ configure = admin/structure/file-types
 
 ; We have to add a fake version so Git checkouts do not fail Media dependencies
 version = 7.x-2.x-dev
+
+
+; Information added by drush on 2012-09-13
+version = "70204d5"
+project = "file_entity"
+datestamp = "1347560215"
+
diff --git a/file_entity.install b/file_entity.install
index 305b80b..1075eea 100644
--- a/file_entity.install
+++ b/file_entity.install
@@ -149,7 +149,7 @@ function file_entity_install() {
   // Set permissions.
   $roles = user_roles();
   foreach ($roles as $rid => $role) {
-    user_role_grant_permissions($rid, array('view file'));
+    user_role_grant_permissions($rid, array('view files'));
   }
 }
 
@@ -280,6 +280,22 @@ function file_entity_update_7104() {
 }
 
 /**
+ * Update permission names.
+ */
+function file_entity_update_7105() {
+  $permissions = array(
+    'view file' => 'view files',
+    'edit file' => 'edit any files',
+  );
+  foreach ($permissions as $old => $new) {
+    db_update('role_permission')
+      ->fields(array('permission' => $new))
+      ->condition('permission', $old)
+      ->execute();
+  }
+}
+
+/**
  * Create the {image_dimensions} database table.
  */
 function file_entity_update_7200() {
diff --git a/file_entity.module b/file_entity.module
index d3ea3fe..e0cf66e 100644
--- a/file_entity.module
+++ b/file_entity.module
@@ -13,6 +13,24 @@
 define('FILE_DEFAULT_ALLOWED_EXTENSIONS', 'jpg jpeg gif png txt doc docx xls xlsx pdf ppt pptx pps ppsx odt ods odp');
 
 /**
+ * Modules should return this value from hook_file_access() to allow access to
+ * a file.
+ */
+define('FILE_ACCESS_ALLOW', 'allow');
+
+/**
+ * Modules should return this value from hook_file_access() to deny access to a
+ * file.
+ */
+define('FILE_ACCESS_DENY', 'deny');
+
+/**
+ * Modules should return this value from hook_file_access() to not affect file
+ * access.
+ */
+define('FILE_ACCESS_IGNORE', NULL);
+
+/**
  * As part of extending Drupal core's file entity API, this module adds some
  * functions to the 'file' namespace. For organization, those are kept in the
  * 'file_entity.file_api.inc' file.
@@ -81,13 +99,6 @@ function file_entity_help($path, $arg) {
 }
 
 /**
- * Access callback for files.
- */
-function file_entity_access($op) {
-  return (user_access('administer files') || user_access($op . ' file'));
-}
-
-/**
  * Implements hook_menu().
  */
 function file_entity_menu() {
@@ -98,7 +109,7 @@ function file_entity_menu() {
     'title' => 'File types',
     'description' => 'Manage settings for the type of files used on your site.',
     'page callback' => 'file_entity_list_types_page',
-    'access arguments' => array('administer site configuration'),
+    'access arguments' => array('administer file types'),
     'file' => 'file_entity.admin.inc',
   );
   $items['admin/structure/file-types/manage/%'] = array(
@@ -123,7 +134,8 @@ function file_entity_menu() {
     'title' => 'Add file',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('file_entity_add_upload', array()),
-    'access arguments' => array('administer files'),
+    'access callback' => 'file_access',
+    'access arguments' => array('create', 1),
     'file' => 'file_entity.pages.inc',
   );
   if (module_exists('plupload') && module_exists('multiform')) {
@@ -141,8 +153,8 @@ function file_entity_menu() {
     // the menu router's title is overridden by a menu link.
     'page callback' => 'file_entity_view_page',
     'page arguments' => array(1),
-    'access callback' => 'file_entity_access',
-    'access arguments' => array('view'),
+    'access callback' => 'file_access',
+    'access arguments' => array('view', 1),
     'file' => 'file_entity.pages.inc',
   );
   $items['file/%file/view'] = array(
@@ -154,8 +166,8 @@ function file_entity_menu() {
     'title' => 'Edit',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('file_entity_edit', 1),
-    'access callback' => 'file_entity_access',
-    'access arguments' => array('edit'),
+    'access callback' => 'file_access',
+    'access arguments' => array('update', 1),
     'weight' => 0,
     'type' => MENU_LOCAL_TASK,
     'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
@@ -165,8 +177,8 @@ function file_entity_menu() {
     'title' => 'Delete',
     'page callback' => 'drupal_get_form',
     'page arguments'  => array('file_delete_form', 1),
-    'access callback' => 'file_entity_access',
-    'access arguments' => array('edit'),
+    'access callback' => 'file_access',
+    'access arguments' => array('delete', 1),
     'weight' => 1,
     'type' => MENU_LOCAL_TASK,
     'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
@@ -185,7 +197,7 @@ function file_entity_menu() {
       $access = array_intersect_key($bundle_info['admin'], drupal_map_assoc(array('access callback', 'access arguments')));
       $access += array(
         'access callback' => 'user_access',
-        'access arguments' => array('administer site configuration'),
+        'access arguments' => array('administer file types'),
       );
 
       // The file type must be passed to the page callbacks. It might be
@@ -287,21 +299,65 @@ function file_entity_menu_local_tasks_alter(&$data, $router_item, $root_path) {
  * Implement hook_permission().
  */
 function file_entity_permission() {
-  return array(
+  $permissions = array(
+    'bypass file access' => array(
+      'title' => t('Bypass file access control'),
+      'description' => t('View, edit and delete all files regardless of permission restrictions.'),
+      'restrict access' => TRUE,
+    ),
     'administer files' => array(
       'title' => t('Administer files'),
       'description' => t('Add, edit or delete files and administer settings.'),
+      'restrict access' => TRUE,
+    ),
+    'administer file types' => array(
+      'title' => t('Administer file types'),
+      'restrict access' => TRUE,
+    ),
+    'view files' => array(
+      'title' => t('View file details'),
+      'description' => t('For viewing file details, not for downloading files.'),
+    ),
+    'delete own files' => array(
+      'title' => t('Delete own files'),
+    ),
+    'view own private files' => array(
+      'title' => t('View own private file details'),
+      'description' => t('For viewing file details, not for downloading files.'),
+    ),
+    'create files' => array(
+      'title' => t('Add and upload files'),
     ),
-    'view file' => array(
-      'title' => t('View file'),
-      'description' => t('View all files.'),
+    'edit own files' => array(
+      'title' => t('Edit own files'),
     ),
-    'edit file' => array(
-      'title' => t('Edit file'),
-      'description' => t('Edit all files.'),
+    'edit any files' => array(
+      'title' => t('Edit any files'),
+    ),
+    'delete any files' => array(
+      'title' => t('Delete any files'),
     ),
   );
+
+  // Add description for the 'View file details' and 'View own private file
+  // details' permissions to show which stream wrappers they apply to.
+  $wrappers = array();
+  foreach (file_get_stream_wrappers(STREAM_WRAPPERS_VISIBLE) as $key => $wrapper) {
+    if (empty($wrapper['private'])) {
+      $wrappers['public'][$key] = $wrapper['name'];
+    }
+    else {
+      $wrappers['private'][$key] = $wrapper['name'];
+    }
+  }
+  $wrappers = array('public' => array(t('None')), 'private' => array(t('None')));
+
+  $permissions['view files']['description'] .= ' ' . t('Includes the following types of files: %wrappers.', array('%wrappers' => implode(', ', $wrappers['public'])));
+  $permissions['view own private files']['description'] .= ' ' . t('Includes the following types of files: %wrappers.', array('%wrappers' => implode(', ', $wrappers['private'])));
+
+  return $permissions;
 }
+
 /**
  * Implements hook_admin_paths().
  */
@@ -448,19 +504,17 @@ function file_entity_file_formatter_info() {
 
   // Allow file field formatters to be reused for displaying the file entity's
   // file pseudo-field.
-  if (module_exists('file')) {
-    foreach (field_info_formatter_types() as $field_formatter_type => $field_formatter_info) {
-      if (in_array('file', $field_formatter_info['field types'])) {
-        $formatters['file_field_' . $field_formatter_type] = array(
-          'label' => $field_formatter_info['label'],
-          'view callback' => 'file_entity_file_formatter_file_field_view',
+  foreach (field_info_formatter_types() as $field_formatter_type => $field_formatter_info) {
+    if (in_array('file', $field_formatter_info['field types'])) {
+      $formatters['file_field_' . $field_formatter_type] = array(
+        'label' => $field_formatter_info['label'],
+        'view callback' => 'file_entity_file_formatter_file_field_view',
+      );
+      if (!empty($field_formatter_info['settings'])) {
+        $formatters['file_field_' . $field_formatter_type] += array(
+          'default settings' => $field_formatter_info['settings'],
+          'settings callback' => 'file_entity_file_formatter_file_field_settings',
         );
-        if (isset($field_formatter_info['settings'])) {
-          $formatters['file_field_' . $field_formatter_type] += array(
-            'default settings' => $field_formatter_info['settings'],
-            'settings callback' => 'file_entity_file_formatter_file_field_settings',
-          );
-        }
       }
     }
   }
@@ -863,7 +917,212 @@ function file_entity_get_hidden_stream_wrappers() {
   return array_diff_key(file_get_stream_wrappers(STREAM_WRAPPERS_ALL), file_get_stream_wrappers(STREAM_WRAPPERS_VISIBLE));
 }
 
+ /**
+ * Return a specific stream wrapper's registry information.
+ *
+ * @param $scheme
+ *   A URI scheme, a stream is referenced as "scheme://target".
+ *
+ * @see file_get_stream_wrappers()
+ */
+function file_get_stream_wrapper($scheme) {
+  $wrappers = file_get_stream_wrappers();
+  return isset($wrappers[$scheme]) ? $wrappers[$scheme] : FALSE;
+}
+
+/**
+ * Implements hook_stream_wrappers_alter().
+ */
+function file_entity_stream_wrappers_alter(&$wrappers) {
+  if (isset($wrappers['private'])) {
+    $wrappers['private']['private'] = TRUE;
+  }
+  if (isset($wrappers['temporary'])) {
+    $wrappers['temporary']['private'] = TRUE;
+  }
+}
+
+/**
+ * @defgroup file_access File access rights
+ * @{
+ * The file access system determines who can do what to which files.
+ *
+ * In determining access rights for a file, file_access() first checks
+ * whether the user has the "bypass file access" permission. Such users have
+ * unrestricted access to all files. user 1 will always pass this check.
+ *
+ * Next, all implementations of hook_file_access() will be called. Each
+ * implementation may explicitly allow, explicitly deny, or ignore the access
+ * request. If at least one module says to deny the request, it will be rejected.
+ * If no modules deny the request and at least one says to allow it, the request
+ * will be permitted.
+ *
+ * There is no access grant system for files.
+ *
+ * In file listings, the process above is followed except that
+ * hook_file_access() is not called on each file for performance reasons and for
+ * proper functioning of the pager system. When adding a filelisting to your
+ * module, be sure to use a dynamic query created by db_select() and add a tag
+ * of "file_access". This will allow modules dealing with file access to ensure
+ * only files to which the user has access are retrieved, through the use of
+ * hook_query_TAG_alter().
+ *
+ * Note: Even a single module returning FILE_ACCESS_DENY from hook_file_access()
+ * will block access to the file. Therefore, implementers should take care to
+ * not deny access unless they really intend to. Unless a module wishes to
+ * actively deny access it should return FILE_ACCESS_IGNORE (or simply return
+ * nothing) to allow other modules to control access.
+ *
+ * Stream wrappers that are considered private should implement a 'private'
+ * flag equal to TRUE in hook_stream_wrappers().
+ *
+ * @todo Unify core's hook_file_download() as a 'download' op of file_access().
+ */
+
 /**
+ * Determine if a user may perform the given operation on the specified file.
+ *
+ * @param $op
+ *   The operation to be performed on the file. Possible values are:
+ *   - "view"
+ *   - "update"
+ *   - "delete"
+ *   - "create"
+ * @param $file
+ *   The file object on which the operation is to be performed, or file type
+ *   (e.g. 'image') for "create" operation.
+ * @param $account
+ *   Optional, a user object representing the user for whom the operation is to
+ *   be performed. Determines access for a user other than the current user.
+ *
+ * @return
+ *   TRUE if the operation may be performed, FALSE otherwise.
+ */
+function file_access($op, $file = NULL, $account = NULL) {
+  $rights = &drupal_static(__FUNCTION__, array());
+
+  if (!$file && !in_array($op, array('view', 'update', 'delete', 'create'), TRUE)) {
+    // If there was no file to check against, or the $op was not one of the
+    // supported ones, we return access denied.
+    return FALSE;
+  }
+
+  // If no user object is supplied, the access check is for the current user.
+  if (empty($account)) {
+    $account = $GLOBALS['user'];
+  }
+
+  if (!$file && $op == 'create') {
+    return user_access('create files', $account);
+  }
+
+  // $file may be either an object or a file type. Since file types cannot be
+  // an integer, use either fid or type as the static cache id.
+  $cid = is_object($file) ? $file->fid : $file;
+
+  // If we've already checked access for this file, user and op, return from
+  // cache.
+  if (isset($rights[$account->uid][$cid][$op])) {
+    return $rights[$account->uid][$cid][$op];
+  }
+
+  if (user_access('bypass file access', $account)) {
+    return $rights[$account->uid][$cid][$op] = TRUE;
+  }
+
+  // We grant access to the file if both of the following conditions are met:
+  // - No modules say to deny access.
+  // - At least one module says to grant access.
+  $access = module_invoke_all('file_access', $op, $file, $account);
+  if (in_array(FILE_ACCESS_DENY, $access, TRUE)) {
+    return $rights[$account->uid][$cid][$op] = FALSE;
+  }
+  elseif (in_array(FILE_ACCESS_ALLOW, $access, TRUE)) {
+    return $rights[$account->uid][$cid][$op] = TRUE;
+  }
+
+
+  // Fall back to default behaviors on view.
+  if ($op == 'view' && is_object($file)) {
+    $scheme = file_uri_scheme($file->uri);
+    $wrapper = file_get_stream_wrapper($scheme);
+
+    if (!empty($wrapper['private'])) {
+      // For private files, users can view their own private files if the
+      // user is not anonymous, and has the 'view own private files' permission.
+      if (!empty($account->uid) && $file->uid == $account->uid && user_access('view own private files', $account)) {
+        return $rights[$account->uid][$cid][$op] = TRUE;
+      }
+    }
+    elseif ($file->status == FILE_STATUS_PERMANENT && user_access('view files')) {
+      // For non-private files, users can view if they have the 'view files'
+      // permission.
+      return $rights[$account->uid][$cid][$op] = TRUE;
+    }
+  }
+
+  return FALSE;
+}
+
+/**
+ * Implements hook_file_access().
+ */
+function file_entity_file_access($op, $file, $account) {
+  $type = is_string($file) ? $file : $file->type;
+
+  // If the file URI is invalid, deny access.
+  if (is_object($file) && !file_valid_uri($file->uri)) {
+    return FILE_ACCESS_DENY;
+  }
+
+  if ($op == 'create') {
+    if (user_access('create files')) {
+      return FILE_ACCESS_ALLOW;
+    }
+  }
+
+  if ($op == 'update') {
+    if (user_access('edit any files', $account) || (user_access('edit own files', $account) && ($account->uid == $file->uid))) {
+      return FILE_ACCESS_ALLOW;
+    }
+  }
+
+  if ($op == 'delete') {
+    if (user_access('delete any files', $account) || (user_access('delete own files', $account) && ($account->uid == $file->uid))) {
+      return FILE_ACCESS_ALLOW;
+    }
+  }
+
+  return FILE_ACCESS_IGNORE;
+}
+
+/**
+ * Implements hook_file_access() on behalf of system.module and private files.
+ */
+function system_file_access($op, $file, $account) {
+  $grants = array();
+  if ($op == 'view' && file_uri_scheme($file->uri) == 'private') {
+    // When viewing private files, we can only invoke hook_file_download()
+    // if the $account user objet matches the current user.
+    if ($GLOBALS['user']->uid == $account->uid) {
+      foreach (module_implements('file_download') as $module) {
+        $access = module_invoke($module, 'file_download', $file->uri);
+        if ($access === -1) {
+          return FILE_ACCESS_DENY;
+        }
+        elseif (!empty($access)) {
+          $grants[] = $access;
+        }
+      }
+    }
+  }
+
+  return !empty($grants) ? FILE_ACCESS_ALLOW : FILE_ACCESS_IGNORE;
+}
+
+/**
+ * @} End of "defgroup file_access".
+ *
  * Clear the field cache for any entities referencing a specific file.
  *
  * @param object $file
diff --git a/file_entity.pages.inc b/file_entity.pages.inc
index ee58c90..3664d6b 100644
--- a/file_entity.pages.inc
+++ b/file_entity.pages.inc
@@ -80,7 +80,7 @@ function file_entity_add_upload_submit($form, &$form_state) {
   }
 
   // Redirect to the file edit page after submission.
-  if (file_entity_access('edit')) {
+  if (file_access('update', $file)) {
     $destination = array('destination' => 'admin/content/file');
     if (isset($_GET['destination'])) {
       $destination = drupal_get_destination();
@@ -161,7 +161,7 @@ function file_entity_add_upload_multiple_submit($form, &$form_state) {
   }
 
   // Redirect to the file edit page.
-  if (file_entity_access('edit') && module_exists('multiform')) {
+  if (file_access('update', $file) && module_exists('multiform')) {
     $destination = array('destination' => 'admin/content/file');
     if (isset($_GET['destination'])) {
       $destination = drupal_get_destination();
diff --git a/file_entity.views.inc b/file_entity.views.inc
index 6129325..905a96d 100644
--- a/file_entity.views.inc
+++ b/file_entity.views.inc
@@ -9,7 +9,7 @@
  * Implements hook_views_data().
  */
 function file_entity_views_data() {
-  // File type
+  // File type.
   $data['file_managed']['type'] = array(
     'title' => t('Type'),
     'help' => t('The type of the file (for example, "audio", "image", "video", etc).'),
@@ -27,6 +27,19 @@ function file_entity_views_data() {
       'handler' => 'views_handler_argument_file_type',
     ),
   );
+  // Rendered file.
+  $data['file_managed']['rendered'] = array(
+    'title' => t('Rendered'),
+    'help' => t('Display the file in a specific view mode.'),
+    'field' => array(
+      'handler' => 'views_handler_field_file_rendered',
+      'click sortable' => TRUE,
+      'real field' => 'fid',
+      'additional fields' => array(
+        'fid',
+      ),
+    ),
+  );
 
   return $data;
 }
diff --git a/tests/file_entity.test b/tests/file_entity.test
index 4355fc6..6dfa707 100644
--- a/tests/file_entity.test
+++ b/tests/file_entity.test
@@ -127,7 +127,7 @@ class FileEntityReplaceTestCase extends FileEntityTestHelper {
     $file = reset($this->files['text']);
 
     // Create a user with file edit permissions.
-    $user = $this->drupalCreateUser(array('edit file'));
+    $user = $this->drupalCreateUser(array('edit any files'));
     $this->drupalLogin($user);
 
     // Test that the Upload widget appears for a local file.
diff --git a/tests/file_entity_test.info b/tests/file_entity_test.info
index 35eaf29..65f849c 100644
--- a/tests/file_entity_test.info
+++ b/tests/file_entity_test.info
@@ -4,3 +4,10 @@ package = Testing
 core = 7.x
 dependencies[] = file_entity
 hidden = TRUE
+
+
+; Information added by drush on 2012-09-13
+version = "70204d5"
+project = "file_entity"
+datestamp = "1347560215"
+
