diff --git a/rocketship.install b/rocketship.install
index b2c6b9c..2185a78 100644
--- a/rocketship.install
+++ b/rocketship.install
@@ -118,6 +118,58 @@ function rocketship_install() {
   );
   field_create_instance($instance);
 
+  // Create a vocabulary named "Initiative issue tags".
+  $description = st('Use tags for projects.');
+  $project_tag_vocabulary = (object) array(
+    'name' => st('Project'),
+    'description' => $description,
+    'machine_name' => 'initiative_project',
+
+  );
+  taxonomy_vocabulary_save($project_tag_vocabulary);
+
+  // Save the vocabulary id.
+  variable_set('rocketship_issue_project_vid', $project_tag_vocabulary->vid);
+
+  $field = array(
+    'field_name' => 'field_initiative_issue_project',
+    'type' => 'taxonomy_term_reference',
+    // Set cardinality to unlimited for tagging.
+    'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+    'settings' => array(
+      'allowed_values' => array(
+        array(
+          'vocabulary' => $project_tag_vocabulary->machine_name,
+          'parent' => 0,
+        ),
+      ),
+    ),
+  );
+  field_create_field($field);
+
+  $instance = array(
+    'field_name' => 'field_initiative_issue_project',
+    'entity_type' => 'node',
+    'label' => 'Initiative project tag',
+    'bundle' => 'initiative_issue',
+    'description' => $project_tag_vocabulary->help,
+    'widget' => array(
+      'type' => 'taxonomy_autocomplete',
+      'weight' => -4,
+    ),
+    'display' => array(
+      'default' => array(
+        'type' => 'taxonomy_term_reference_link',
+        'weight' => 10,
+      ),
+      'teaser' => array(
+        'type' => 'taxonomy_term_reference_link',
+        'weight' => 10,
+      ),
+    ),
+  );
+  field_create_instance($instance);
+  
   // Create the initiative page content type.
   $initiative_page_type = array(
     'type' => 'initiative_page',
@@ -231,6 +283,45 @@ function rocketship_install() {
   );
   field_create_instance($instance);
 
+  // Issue project tag, on initiative page.
+  $field = array(
+    'field_name' => 'field_initiative_display_project',
+    'type' => 'taxonomy_term_reference',
+    'cardinality' => 1,
+    'settings' => array(
+      'allowed_values' => array(
+        array(
+          'vocabulary' => $project_tag_vocabulary->machine_name,
+          'parent' => 0,
+        ),
+      ),
+    ),
+  );
+  field_create_field($field);
+
+  $instance = array(
+    'field_name' => 'field_initiative_display_project',
+    'entity_type' => 'node',
+    'label' => 'Initiative project tag',
+    'bundle' => 'initiative_page',
+    'description' => st('Select one project to display issues from.'),
+    'widget' => array(
+      'type' => 'taxonomy_autocomplete',
+      'weight' => -3,
+    ),
+    'display' => array(
+      'default' => array(
+        'type' => 'taxonomy_term_reference_link',
+        'weight' => 10,
+      ),
+      'teaser' => array(
+        'type' => 'taxonomy_term_reference_link',
+        'weight' => 10,
+      ),
+    ),
+  );
+  field_create_instance($instance);
+  
   // Create initiative page body field. We do this here, so it
   // appears at the bottom of the node form.
   node_add_body_field($initiative_page_type);
diff --git a/rocketship.module b/rocketship.module
index 7a73938..69a1b7f 100644
--- a/rocketship.module
+++ b/rocketship.module
@@ -63,7 +63,12 @@ function rocketship_menu() {
 function rocketship_cron() {
   // An hour should pass at least inbetween local cache refreshes.
   if (variable_get('rocketship_parse_time', 0) < time()-60*60) {
-    rocketship_parse_all();
+    $issue_page = "http://drupal.org/project/issues/flot?version=7.x";
+      rocketship_parse_all($issue_page);
+    $issue_page = "http://drupal.org/project/user/829198";
+      rocketship_parse_all($issue_page);
+    $issue_page = "http://drupal.org/project/issues/user/105002";
+      rocketship_parse_all($issue_page);
     variable_set('rocketship_parse_time', time());
   }
 }
@@ -86,6 +91,13 @@ function rocketship_settings_form() {
     '#options' => $vocabulary_options,
     '#required' => TRUE,
   );
+  $form['rocketship_issue_project_vid'] = array(
+    '#type' => 'select',
+    '#title' => t('Project vocabulary ID'),
+    '#default_value' => variable_get('rocketship_issue_project_vid'),
+    '#options' => $vocabulary_options,
+    '#required' => TRUE,
+  );
   $form['rocketship_master_tags_vid'] = array(
     '#type' => 'select',
     '#title' => t('Master tags vocabulary ID'),
@@ -119,16 +131,19 @@ function rocketship_launch_form_submit() {
 /**
  * Crawler for drupal.org issue listings.
  */
-function rocketship_parse_all() {
+function rocketship_parse_all($issue_page = '') {
+  if (empty($issue_page)) {
+    $issue_page = 'http://drupal.org/project/issues/search/drupal?issue_tags=' . ROCKETSHIP_MASTER_TAG;
+  }
   // Grab the first page of the listings of issues for this tag.
-  $issue_page = 'http://drupal.org/project/issues/search/drupal?issue_tags=' . ROCKETSHIP_MASTER_TAG;
   $page_output = drupal_http_request($issue_page);
   if ($page_output->code == 200 && !empty($page_output->data)) {
 
     // Figure out the index number of the last issue list page by scraping.
     $last_page_num = 0;
     if (preg_match('!href="([^"]+)" title="Go to last page"!', $page_output->data, $last_page)) {
-  	  if (preg_match('!\?page=(\d+)&!', $last_page[1], $last_page_find)) {
+
+  	  if (preg_match('!\?page=(\d+)!', $last_page[1], $last_page_find)) {
         $last_page_num = $last_page_find[1];
       }
     }
@@ -139,10 +154,18 @@ function rocketship_parse_all() {
     // If we have more pages, go on to the rest of the pages as well.
     if (!empty($last_page_num)) {
       for ($page_num = 1; $page_num <= $last_page_num; $page_num++) {
-        $page_output = drupal_http_request($issue_page . '&page='. $page_num);
+        if (strpos($issue_page, '?')) {
+          $page_output = drupal_http_request($issue_page . '&page='. $page_num);
+        }
+        else {
+          $page_output = drupal_http_request($issue_page . '?page='. $page_num);
+        }
         if ($page_output->code == 200 && !empty($page_output->data)) {
           rocketship_parse_issue_page($page_output->data);
         }
+        else {
+          watchdog('attiks', 'paging failed for page ' . $page_num . ' (' . $issue_page . '?page='. $page_num . ')');
+        }
       }
     }
   }
@@ -236,6 +259,28 @@ function rocketship_parse_issue_page(&$issue_page_content) {
           $node->field_initiative_issue_assigned['und'][0]['value'] = strip_tags($assigned[1]);
         }
 
+        if (preg_match('!<td>Project:</td><td>(.*)</td>!', $issue_node->data, $project)) {
+          $project = $project[1];
+          $node->field_initiative_issue_project['und'] = array();
+          $matching_terms = taxonomy_get_term_by_name($project, variable_get('rocketship_issue_project_vid'));
+          if (!empty($matching_terms)) {
+            foreach ($matching_terms as $term) {
+              if ($term->vid == variable_get('rocketship_issue_project_vid')) {
+                $node->field_initiative_issue_project['und'][] = array('tid' => $term->tid);
+              }
+            }
+          }
+          else {
+            // Not found, so create a new tag and assign.
+            $term = (object) array(
+              'vid' => variable_get('rocketship_issue_project_vid'),
+              'name' => $project,
+            );
+            taxonomy_term_save($term);
+            $node->field_initiative_issue_project['und'][] = array('tid' => $term->tid);
+          }
+        }
+
         // Store all kinds of metadata as plain tags on this node. We can then
         // do listings based on the presence of these tags "easily".
         $tags = array();
@@ -305,7 +350,7 @@ function rocketship_parse_issue_page(&$issue_page_content) {
  * display them by their group to help produce a visual overview.
  */
 function rocketship_node_view($node, $view_mode, $langcode) {
-  if (!empty($node->field_initiative_display_tag) && $view_mode == 'full') {
+  if ((!empty($node->field_initiative_display_tag) || !empty($node->field_initiative_display_project)) && $view_mode == 'full') {
 
     // Javascript and CSS.
     $attached = array(
@@ -314,8 +359,14 @@ function rocketship_node_view($node, $view_mode, $langcode) {
     );
 
     // Get more info on the term we are presenting this list for.
-    $tid_for_list = $node->field_initiative_display_tag['und'][0]['tid'];
-    $term_for_list = taxonomy_term_load($tid_for_list);
+    if (!empty($node->field_initiative_display_tag)) {
+      $tid_for_list = $node->field_initiative_display_tag['und'][0]['tid'];
+      $term_for_list = taxonomy_term_load($tid_for_list);
+    }
+    elseif (!empty($node->field_initiative_display_project)) {
+      $tid_for_list = $node->field_initiative_display_project['und'][0]['tid'];
+      $term_for_list = taxonomy_term_load($tid_for_list);
+    }
 
     // Get all the issue nodes that have the tag we need.
     $nids = db_query('SELECT nid FROM {taxonomy_index} WHERE tid = :tid', array(':tid' => $tid_for_list))->fetchAll();
@@ -506,7 +557,7 @@ function rocketship_node_view($node, $view_mode, $langcode) {
 
     // Include username cloud if the master tag is displayed.
     $participant_stats = variable_get('rocketship_participant_stats', array());
-    if ($term_for_list->name == ROCKETSHIP_MASTER_TAG && !empty($participant_stats)) {
+    if (!empty($participant_stats)) {
       $participant_uids = variable_get('rocketship_participant_uids', array());
       $participant_recent = variable_get('rocketship_participant_recent', array());
 
