diff --git a/includes/project_issue_node_type.inc b/includes/project_issue_node_type.inc
index 2cc7674..bc4d65c 100644
--- a/includes/project_issue_node_type.inc
+++ b/includes/project_issue_node_type.inc
@@ -575,10 +575,16 @@ function _project_issue_create_issue_node_type() {
     'display' => array(
       'default' => array(
         'label' => 'above',
-        'type' => 'file_default',
+        'type' => 'file_metadata_table',
         'settings' => array(
+          'filetypes' => 'all',
+          'extensions' => 'patch,diff',
+          'columns' => array('cid', 'filename', 'filesize', 'uid'),
+          'showhidden' => 'fieldset',
+          'sortby' => 'cid',
+          'sortorder' => 'desc',
         ),
-        'module' => 'file',
+        'module' => 'file_metadata_table',
         'weight' => 4,
       ),
       'teaser' => array(
diff --git a/project_issue.info b/project_issue.info
index c99d6f0..1e59cd1 100644
--- a/project_issue.info
+++ b/project_issue.info
@@ -10,6 +10,7 @@ dependencies[] = conflict
 dependencies[] = entityreference
 dependencies[] = dereference_list
 dependencies[] = nodechanges
+dependencies[] = file_metadata_table
 
 ; @see http://drupal.org/project/module_supports
 recommends[] = flag_tracker
diff --git a/project_issue.install b/project_issue.install
index 2238eaa..447734d 100644
--- a/project_issue.install
+++ b/project_issue.install
@@ -790,4 +790,53 @@ function project_issue_update_7007() {
     // If the user has already updated things by hand, we can just skip
     // the update anyway, so we don't need to do anything....
   }
-}
\ No newline at end of file
+}
+
+/**
+ * Enable and begin using the 'File Metadata Table' field formatter
+ */
+function project_issue_update_7008() {
+  $t = get_t();
+
+  // Enable new dependency.
+  module_enable(array('file_metadata_table'));
+
+  // Enable the field formatter on project_issue nodes
+  // The code below should worr for updating
+  $bundles = project_issue_issue_node_types();
+  // Set up formatter settings
+  $display = array(
+    'label' => 'above',
+    'type' => 'file_metadata_table',
+    'settings' => array(
+      'filetypes' => 'all',
+      'extensions' => 'patch,diff',
+      'columns' => array('cid', 'filename', 'filesize', 'uid'),
+      'showhidden' => 'fieldset',
+      'sortby' => 'cid',
+      'sortorder' => 'desc',
+    ),
+    'module' => 'file_metadata_table',
+    'weight' => 4,
+  );
+
+  // Cycle through each project_issue node type, and set the field_issue_files
+  // field to use the file metadata table field formatter.
+  foreach ($bundles as $bundle) {
+    // Update the display formatter for each bundle
+    if (field_info_instance('node', 'field_issue_files', $bundle)) {
+      $instance = array(
+        'entity_type' => 'node',
+        'bundle' => $bundle,
+        'field_name' => 'field_issue_files',
+        'display' => array(
+          'default' => $display,
+        ),
+      );
+      field_update_instance($instance);
+    }
+  }
+
+  // Clear caches
+  drupal_flush_all_caches();
+}
diff --git a/project_issue.module b/project_issue.module
index 95898ed..ec0fef1 100644
--- a/project_issue.module
+++ b/project_issue.module
@@ -1813,6 +1813,191 @@ function project_issue_field_formatter_view($entity_type, $entity, $field, $inst
 }
 
 /**
+ * Implements hook_file_metadata_table_metadata_types().
+ *
+ * Defines an additional 'Comment ID' metadata property for the "file metadata
+ * table" field formatter.
+ */
+function project_issue_file_metadata_table_metadata_types() {
+  return array(
+    'cid' => array(
+      'title' => t('Comment ID'),
+      'sort' => 'numeric',
+      'formatter' => 'project_issue_generate_cid_jumplink',
+    ),
+  );
+}
+
+/**
+ * Implements hook_file_metadata_table_items_alter().
+ *
+ * Adds our 'Comment Id' metadata to the file $items array within fields using
+ * the file_metadata_table field formatter on issue nodes.
+ *
+ * @param array $items
+ *   The array of file items from the field, keyed by file ID (fid).
+ * @param array $context
+ *   Associative array of context for the table of files being altered, with
+ *   the following keys:
+ *   - field: The field definition array.
+ *   - instance: The field instance definition array.
+ *   - entity: An object representing the entity the file field is attachted to.
+ *   - entity_type: String with the type of entity the field is attached to.
+ *   - langcode: The language associated with $items.
+ *   - display: The display settings to use, as found in the 'display' entry of
+ *     the instance definition. Notable keys include the name of the formatter
+ *     (in 'type') and the array of formatter settings (in 'settings').
+ *
+ *  @see drupal_alter()
+ */
+function project_issue_file_metadata_table_items_alter(&$items, &$context) {
+  // Only add the Comment_ID property on project_issue nodes.
+  if (project_issue_node_type_is_issue($context['entity']->type) && (!empty($items))) {
+    // Add a 'Comment ID' property to each item in the $items array.
+    $file_cids = project_issue_get_file_cids($context['entity'], $context['field']['field_name']);
+    foreach ($items as $key => $value) {
+      // Add the comment id associated with each file to the $items array.
+      // If no comment id is found for a given file, set it to '0'.
+      $items[$key]['cid'] = isset($file_cids[$value['fid']]) ? $file_cids[$value['fid']] : 0;
+    }
+  }
+}
+
+/**
+ * Implements hook_field_formatter_settings_form_alter().
+ *
+ * We want to ensure our Comment ID jumplinks are rendered as the first table
+ * column.  We could have invoked the alter() hook on the full table structure,
+ * but this can conveniently be avoided by re-arranging the formatter's
+ * $settings_form['columns']['#options'] array, which defines the default
+ * column order.
+ *
+ * @param $settings_form
+ *   Form array as returned by hook_field_formatter_settings_form().
+ * @param $form_state
+ *   The form state of the (entire) configuration form.
+ * @param $context
+ *   An associative array with the following elements:
+ *   - 'module': The module that contains the definition of this formatter.
+ *   - 'formatter': The formatter type description array.
+ *   - 'field': The field structure being configured.
+ *   - 'instance': The instance structure being configured.
+ *   - 'view_mode': The view mode being configured.
+ *   - 'form': The (entire) configuration form array.
+ */
+function project_issue_field_formatter_settings_form_alter(&$settings_form, &$form_state, $context) {
+  if ($context['module'] == 'file_metadata_table') {
+    $settings_form['columns']['#options'] = array_merge(array('cid' => t('Comment ID')), $settings_form['columns']['#options']);
+  }
+}
+
+/**
+ * Assemble an array of 'file' => 'cid' relationships for the given node.
+ *
+ * @param integer $node
+ *   The node ID to inspect for files.
+ *
+ * @return array
+ *   An array of files found in the node's field_issue_files field, keyed by
+ *   the file ID (fid), where the value is the associated comment generated
+ *   when that file was added to the node.
+ */
+function project_issue_get_file_cids($node, $field_name) {
+  $nid = $node->nid;
+  // Obtain list of cids for this node.
+  $query = db_select('comment', 'c');
+  $query->addField('c', 'cid');
+  $query->condition('c.nid', $node->nid)
+        ->addTag('node_access')
+        ->addTag('comment_filter')
+        ->orderBy('c.cid', 'ASC');
+  $cids = $query->execute()->fetchCol();
+
+  // Load each comment which contains a change to the field_issue_files field.
+  $query = new EntityFieldQuery();
+  $query->entityCondition('entity_type', 'comment')
+    ->entityCondition('bundle', 'comment_node_' . $node->type)
+    ->entityCondition('entity_id', $cids, 'IN')
+    ->propertyCondition('nid', $node->nid)
+    ->propertyCondition('status', 1)
+    ->fieldCondition('field_issue_changes', 'field_name', $field_name, '=')
+    ->propertyOrderBy('cid', 'ASC');
+  $result = $query->execute();
+
+  $comments = array();
+  if (isset($result['comment'])) {
+    $cids = array_keys($result['comment']);
+    $comments = entity_load('comment', $cids);
+  }
+
+  // Initialize an array for the results.
+  $cids = array();
+  // Iterate over the comments
+  foreach ($comments as $comment) {
+    $language = !empty($comment->language) ? $comment->language : 'und';
+    // Iterate over the changes, isolating those related to field_issue_files.
+    foreach ($comment->field_issue_changes[$language] as $change) {
+      if ($change['field_name'] == $field_name) {
+        // Create array of 'fid' => 'cid' for all file values which existed
+        // after this particular change.
+        $added = array();
+        if (!empty($change['new_value'])) {
+          foreach ($change['new_value'] as $file) {
+            $added[$file['fid']] = $comment->cid;
+          }
+        }
+        // Remove any array values for file entries which existed before this
+        // particular change.
+        if (!empty($change['old_value'])) {
+          foreach ($change['old_value'] as $file) {
+            unset($added[$file['fid']]);
+          }
+        }
+        $cids = $cids + $added;
+      }
+    }
+  }
+  return $cids;
+}
+
+/**
+ * Generates a comment jumplink for a file item's 'cid' property.
+ *
+ * @param $file
+ *   The file properties array, as provided by the file_metadata_table module,
+ *   containing all default and external metadata (i.e. after all invocations
+ *   of hook_file_metadata_table_items_alter().
+ * @param $context
+ *   Associative array of context for the table of files being altered, with
+ *   the following keys:
+ *   - field: The field definition array.
+ *   - instance: The field instance definition array.
+ *   - entity: An object representing the entity the file field is attached to.
+ *   - entity_type: String with the type of entity the field is attached to.
+ *   - langcode: The language associated with $items.
+ *   - display: The display settings to use, as found in the 'display' entry of
+ *     the instance definition. Notable keys include the name of the formatter
+ *     (in 'type') and the array of formatter settings (in 'settings').
+ *
+ * @return array or string
+ *   A render array defining the table cell contents for this file/metadata
+ *   combination, or alternatively an html string defining the actual rendered
+ *   output.
+ */
+function project_issue_generate_cid_jumplink($item, $context) {
+  // Generate formatted 'Comment ID' jumplinks for a file, based on the 'cid'
+  // metadata property.
+  $entity = $context['entity'];
+  if (empty($item['cid'])) {
+    $data = l('none', 'node/' . $entity->nid, array('fragment' => 'content'));
+  }
+  else {
+    $data = l('#' . comment_get_display_ordinal($item['cid'], $entity->type), 'node/' . $entity->nid, array('fragment' => 'comment-' . $item['cid']));
+  }
+  return $data;
+}
+
+/**
  * Find the flag name for following issues for this issue type (if any).
  *
  * If the flag tracker module (http://drupal.org/project/flag_tracker) is enabled,
