diff --git a/project_issue.field_group.inc b/project_issue.field_group.inc
index bb02c01..32341e0 100644
--- a/project_issue.field_group.inc
+++ b/project_issue.field_group.inc
@@ -26,6 +26,7 @@ function project_issue_field_group_info() {
     'children' => array(
       0 => 'field_project_has_issue_queue',
       1 => 'field_project_components',
+      2 => 'field_project_default_component',
     ),
     'format_type' => 'tab',
     'format_settings' => array(
diff --git a/project_issue.install b/project_issue.install
index cb5f91d..6765f88 100644
--- a/project_issue.install
+++ b/project_issue.install
@@ -1032,3 +1032,125 @@ function project_issue_update_7010() {
 
   db_query("UPDATE {field_data_body} fdb INNER JOIN {node} n ON n.nid = fdb.entity_id AND n.type = 'project_issue' SET fdb.body_summary = NULL");
 }
+
+/**
+ * Set up project issue 'default component' field.
+ */
+function project_issue_update_7011() {
+  $t = get_t();
+
+  // Set up project-issue specific field for 'default component'.
+  $default_component = array(
+    'type' => 'list_text',
+    'field_name' => 'field_project_default_component',
+    'label' => $t('Default component'),
+    'cardinality' => 1,
+    'settings' => array(
+      'allowed_values_function' => 'project_issue_default_component_allowed_values',
+    ),
+  );
+  if (!field_info_field('field_project_default_component')) {
+    field_create_field($default_component);
+  }
+
+  // Add field to our known 'project' node types
+  $bundles = project_project_node_types();
+
+  foreach ($bundles as $bundle) {
+  $default_component_instance = array(
+      'bundle' => $bundle,
+      'description' => $t('Used to set the initial default component for new project issues.'),
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'type' => 'hidden',
+          'settings' => array(),
+          'weight' => 6,
+        ),
+        'teaser' => array(
+          'type' => 'hidden',
+          'label' => 'above',
+          'settings' => array(),
+          'weight' => 0,
+        ),
+      ),
+      'entity_type' => 'node',
+      'field_name' => 'field_project_default_component',
+      'label' => $t('Default component'),
+      'widget' => array(
+        'weight' => '0',
+        'settings' => array(
+          'display_label' => TRUE,
+        ),
+      ),
+      'required' => FALSE,
+      'default_value' => array(0),
+    );
+    if (!field_info_instance('node', 'field_project_default_component', $bundle)) {
+      field_create_instance($default_component_instance);
+    }
+  }
+}
+
+/**
+ * Migrate D6 project issue 'default component' values to the new project_issue_default_component field.
+ */
+function project_issue_update_7012(&$sandbox) {
+  $t = get_t();
+  if (!isset($sandbox['progress'])) {
+    // Check if we need to run at all.
+    if (!db_table_exists('project_issue_projects')) {
+      return $t('No legacy data detected, skipping this update.');
+    }
+    $sandbox['progress'] = 0;
+    $sandbox['current_nid'] = 0;
+    $sandbox['max'] = db_query("SELECT COUNT(DISTINCT p.nid) FROM {project_issue_projects} p WHERE p.default_component != ''")->fetchField();
+  }
+
+  // Retrieve all projects which have a default component set
+  $query = db_select('project_issue_projects', 'p');
+  $result = $query
+    ->fields('p', array('nid', 'default_component'))
+    ->condition('p.default_component', '', '!=')
+    ->condition('p.nid', $sandbox['current_nid'], '>')
+    ->orderBy('p.nid', 'ASC')
+    ->range(0, 100)
+    ->execute();
+
+  // Set up queries for bulk inserting data into the field.
+  $insertQueryData = db_insert('field_data_field_project_default_component')
+    ->fields(array('entity_type', 'bundle', 'deleted', 'entity_id', 'revision_id', 'language', 'delta', 'field_project_default_component_value'));
+  $insertQueryRevision = db_insert('field_revision_field_project_default_component')
+    ->fields(array('entity_type', 'bundle', 'deleted', 'entity_id', 'revision_id', 'language', 'delta', 'field_project_default_component_value'));
+
+  // Loop over projects, populating our bulk insert data.
+  foreach ($result as $record) {
+    $project = node_load($record->nid);
+    if (!empty($project) && empty($project->field_project_default_component)) {
+      $record = array(
+        'node',
+        $project->type,
+        0,
+        $project->nid,
+        $project->vid,
+        LANGUAGE_NONE,
+        0,
+        $record->default_component,
+      );
+      $insertQueryData->values($record);
+
+      $revisions = db_query('SELECT vid FROM {node_revision} WHERE nid = :nid', array(':nid' => $project->nid));
+      foreach ($revisions as $revision) {
+        // Swap out the vid for each revision.
+        $record[4] = $revision->vid;
+        $insertQueryRevision->values($record);
+      }
+    }
+    $sandbox['progress']++;
+    $sandbox['current_nid'] = $project->nid;
+  }
+  $insertQueryData->execute();
+  $insertQueryRevision->execute();
+
+  $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
+}
diff --git a/project_issue.module b/project_issue.module
index 97e6f35..027e1a9 100644
--- a/project_issue.module
+++ b/project_issue.module
@@ -1862,7 +1862,7 @@ function project_issue_field_extra_fields() {
     );
     if (module_exists('flag_tracker')) {
       $follow_flag = flag_tracker_get_tracker_flag($bundle_name);
-      if (!empty($follow_flag)) {      
+      if (!empty($follow_flag)) {
         $extra['node'][$bundle_name]['display']['follow_link'] = array(
           'label' => t('Issue follow link'),
           'description' => t('A link to follow the issue.'),
@@ -2221,8 +2221,13 @@ function project_issue_project_issue_assignees($issue, $project, $current) {
 /**
  * Implements hook_field_widget_form_alter().
  *
- * We use this to swap the label for the uid 0 choice to be 'Unassigned'
- * instead of the username (e.g. 'Anonymous').
+ * We use this to:
+ * 1. swap the label for the uid 0 choice to be 'Unassigned' instead of the
+ *    username (e.g. 'Anonymous'),
+ * 2. swap the label for the default component 0 choice to be '- None (user
+ *    must select) -' instead of 'None', and
+ * 3. update the project_issue 'component' field to set the default value to
+ *    the project's default component if one has been set.
  */
 function project_issue_field_widget_form_alter(&$element, &$form_state, $context) {
   if ($context['field']['field_name'] == 'field_issue_assigned') {
@@ -2230,6 +2235,21 @@ function project_issue_field_widget_form_alter(&$element, &$form_state, $context
       $element['#options'][0] = t('Unassigned');
     }
   }
+  elseif ($context['field']['field_name'] == 'field_project_default_component') {
+    if (isset($element['#options']['_none'])) {
+      $element['#options']['_none'] = t('- None (user must select) -');
+    }
+  }
+  elseif ($context['field']['field_name'] == 'field_issue_component' && empty($element['#default_value'])) {
+    $pid = $element['#entity']->field_project[LANGUAGE_NONE][0]['target_id'];
+    $project = node_load($pid);
+    if (!empty($project->field_project_default_component[LANGUAGE_NONE][0]['value'])) {
+      $default_component = $project->field_project_default_component[LANGUAGE_NONE][0]['value'];
+      $element['#default_value'] = array(
+        $default_component => $default_component,
+      );
+    }
+  }
 }
 
 /**
@@ -2409,5 +2429,20 @@ function project_issue_preprocess_project_issue_auto_close_message(&$variables)
  *   Message to be added as a comment to an issue when auto-closing that issue.
  */
 function theme_project_issue_auto_close_message($variables) {
-  return t('Automatically closed — issue fixed for !interval with no activity.', array('!interval' => $variables['auto_close_interval']));
+  return t('Automatically closed - issue fixed for !interval with no activity.', array('!interval' => $variables['auto_close_interval']));
+}
+
+/**
+ * Allowed values callback for a project's 'default component' select box.
+ */
+function project_issue_default_component_allowed_values($field, $instance, $entity_type, $entity) {
+  $return = array();
+  if ($entity) {
+    if (!empty($entity->field_project_components[$entity->language])) {
+      foreach ($entity->field_project_components[$entity->language] as $component) {
+        $return[$component['value']] = $component['value'];
+      }
+    }
+  }
+  return $return;
 }
