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..fff66c4 100644
--- a/rocketship.module
+++ b/rocketship.module
@@ -5,6 +5,8 @@
  * Issue crawler/scraper and display module built for the Drupal 8 Multilingual Initiative.
  */
 
+define('ROCKETSHIP_VERBOSE_MODE', TRUE);
+
 /**
  * All issues should be tagged with this tag.
  */
@@ -63,7 +65,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 +93,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'),
@@ -112,36 +126,65 @@ function rocketship_launch_form() {
  * Form submission callback for rocketship launch.
  */
 function rocketship_launch_form_submit() {
-  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);
   drupal_set_message(t('Issues have been parsed.'));
 }
 
 /**
  * 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;
+  }
+  if (ROCKETSHIP_VERBOSE_MODE) {
+    watchdog('Rocketship', 'Parsing ' . $issue_page);
+  }
   // 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];
       }
     }
 
     // Parse this page for issue links and grab those issue nodes.
-    rocketship_parse_issue_page($page_output->data);
+    if (!rocketship_parse_issue_page($page_output->data)) {
+      if (ROCKETSHIP_VERBOSE_MODE) {
+        watchdog('Rocketship', 'Bailing out');
+      }
+      return;
+    }
 
     // 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);
+          if (!rocketship_parse_issue_page($page_output->data)) {
+            if (ROCKETSHIP_VERBOSE_MODE) {
+              watchdog('Rocketship', 'Bailing out');
+            }
+            return;
+          }
+        }
+        else {
+          watchdog('attiks', 'paging failed for page ' . $page_num . ' (' . $issue_page . '?page='. $page_num . ')');
         }
       }
     }
@@ -205,6 +248,9 @@ function rocketship_parse_issue_page(&$issue_page_content) {
         $nid = db_query("SELECT nid FROM {node} WHERE type = :type AND title LIKE '#" . (int) $match . ":%'", array(':type' => ROCKETSHIP_NODE_TYPE))->fetchField();
         if ($nid) {
           $node = node_load($nid);
+          if (ROCKETSHIP_VERBOSE_MODE) {
+            watchdog('Rocketship', 'Found node ' . $node->title . ' (' . $node->changed . ')');
+          }
         }
         else {
           // Save nodes as published. Although this would "litter" your tracker
@@ -217,6 +263,7 @@ function rocketship_parse_issue_page(&$issue_page_content) {
         // Grab node title based on drupal.org HTML markup.
         if (preg_match('!<h1 id="page-subtitle">([^<]+)</h1>!', $issue_node->data, $page_title)) {
           $node->title = '#'. (int) $match . ': '. htmlspecialchars_decode($page_title[1], ENT_QUOTES);
+          $node->field_initiative_drupalorg_nid['und'][0]['value'] = (int) $match;
         }
 
         // Grab time created based on the markup.
@@ -225,10 +272,28 @@ function rocketship_parse_issue_page(&$issue_page_content) {
         }
 
         // Find all participats and count their comments.
+        $last_update = '';
         if (preg_match_all('!<div class="submitted">Posted by <a href="/user/(\d+)"[^>]+>([^<]+)</a> on <em>(.+)</em>!', $issue_node->data, $participants)) {
           foreach ($participants[2] as $i => $participant) {
             rocketship_stat_add_username($participant, $participants[1][$i], strtotime(str_replace(' at ', ', ', $participants[3][$i])));
           }
+          $last_update = array_pop($participants[3]);
+          $last_update = strtotime(str_replace(' at ', ', ', $last_update));
+        }
+        
+        // If last_update <= $node->changed, return
+        if (isset($node->nid)) {
+          if (!empty($last_update) && $node->changed == $last_update) {
+            if (ROCKETSHIP_VERBOSE_MODE) {
+              watchdog('Rocketship', 'No updated needed for ' . $node->title);
+            }
+            return FALSE;
+          }
+          else {
+            if (ROCKETSHIP_VERBOSE_MODE) {
+              watchdog('Rocketship', 'Updated needed for ' . $node->title . ': ' . $node->changed . ' - ' . $last_update);
+            }
+          }
         }
 
         // Assumes a "field_assigned" text field is present on this node type.
@@ -236,6 +301,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();
@@ -287,9 +374,18 @@ function rocketship_parse_issue_page(&$issue_page_content) {
 
         // Save our updated / created node.
         node_save($node);
+        if (!empty($last_update)) {
+          db_update('node') // Table name no longer needs {}
+            ->fields(array(
+              'changed' => $last_update,
+            ))
+            ->condition('nid', $node->nid, '=')
+            ->execute();          
+        }
       }
     }
   }
+  return TRUE;
 }
 
 /**
@@ -305,7 +401,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 +410,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 +608,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());
 
