diff --git a/filehash.admin.inc b/filehash.admin.inc
index 8b365d2..90a9048 100644
--- a/filehash.admin.inc
+++ b/filehash.admin.inc
@@ -24,3 +24,31 @@ function filehash_settings() {
   );
   return system_settings_form($form);
 }
+
+/**
+ * Trigger bulk update
+ */
+function filehash_bulk_update_hashes() {
+  $form['explanation'] = array(
+    '#markup' => t('Use the button below to add any missing file hash values to managed files by Drupal. Existing hashes will be left untouched.'),
+    '#prefix' => '<p>',
+    '#suffix' => '</p>',
+  );
+
+  $form['bulk_update_file_hashes'] = array(
+    '#type' => 'submit',
+    '#value' => t('Bulk Update File Hashes'),
+  );
+
+  $form['#submit'][] = '_filehash_bulk_update_hashes_submit';
+
+  return $form;
+}
+
+/**
+ * Submit callback for bulk updates
+ */
+function _filehash_bulk_update_hashes_submit(&$form, &$form_state) {
+  $batch = filehash_bulk_update_hash_batch();
+  batch_set($batch);
+}
\ No newline at end of file
diff --git a/filehash.module b/filehash.module
index 95f091c..697b17c 100644
--- a/filehash.module
+++ b/filehash.module
@@ -17,6 +17,20 @@ function filehash_menu() {
     'access arguments' => array('administer site configuration'),
     'file' => 'filehash.admin.inc',
   );
+  $items['admin/config/media/filehash/settings'] = array(
+    'title' => 'Settings',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['admin/config/media/filehash/bulk'] = array(
+    'title' => 'Bulk Update',
+    'description' => 'Add hash values to existing files.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('filehash_bulk_update_hashes'),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'filehash.admin.inc',
+    'type' => MENU_LOCAL_TASK,
+  );
   return $items;
 }
 
@@ -178,3 +192,71 @@ function filehash_views_api() {
     'api' => 3,
   );
 }
+
+/**
+ * Batch update file hashes
+ */
+function filehash_bulk_update_hash_batch() {
+  $query = new EntityFieldQuery();
+  $query->entityCondition('entity_type', 'file')
+    ->addMetaData('account', user_load(1)); // Run the query as user 1 to avoid permission issues.
+  $files = $query->execute();
+
+  $fids = array();
+  if (!empty($files['file'])) {
+    $fids = array_keys($files['file']);
+  }
+
+  $num_operations = count($fids);
+  $operations = array();
+
+  for ($i = 0; $i < $num_operations; $i++) {
+    $operations[] = array(
+      'filehash_bulk_update_hash_batch_op',
+      array(
+        $fids[$i],
+        t('Checking file @fid', array('@fid' => $fids[$i])),
+      ),
+    );
+  }
+
+  $batch = array(
+    'operations' => $operations,
+    'finished' => 'filehash_bulk_update_hash_batch_finished',
+  );
+
+  return $batch;
+}
+
+/**
+ * Batch update operation
+ */
+function filehash_bulk_update_hash_batch_op($fid, $operation_details, &$context) {
+  // All we have to do is load the file. Filehash will generate the hashes as required.
+  $file = file_load($fid);
+
+  // Store some results for post-processing in the 'finished' callback.
+  // The contents of 'results' will be available as $results in the
+  // 'finished' function (in this example, batch_example_finished()).
+  $context['results'][] = $file->fid;
+
+  // Optional message displayed under the progressbar.
+  $context['message'] = t('Loading file "@fid"', array('@fid' => $file->fid)) . ' ' . $operation_details;
+}
+
+function filehash_bulk_update_hash_batch_finished($success, $results, $operations) {
+  if ($success) {
+    // Here we could do something meaningful with the results.
+    // We just display the number of nodes we processed...
+    drupal_set_message(t('File hashes have been udpated.'));
+  }
+  else {
+    // An error occurred.
+    // $operations contains the operations that remained unprocessed.
+    $error_operation = reset($operations);
+    drupal_set_message(t('Some files failed to update their hash values. Please check the logs for details.', array(
+      '@operation' => $error_operation[0],
+      '@args' => print_r($error_operation[0], TRUE),
+    )));
+  }
+}
\ No newline at end of file
