diff --git a/drupalorg_project/drupalorg_project.module b/drupalorg_project/drupalorg_project.module
index 301723b..fc28b15 100644
--- a/drupalorg_project/drupalorg_project.module
+++ b/drupalorg_project/drupalorg_project.module
@@ -632,6 +632,18 @@ function drupalorg_project_nodeapi(&$node, $op = 'view', $teaser = FALSE, $page
     }
   }
 
+  if ($op == 'update') {
+    if ($node->type == 'project_issue') {
+      global $user;
+      $username = theme('username', $user);
+      $changes = array(
+        'nid' => $node->nid,
+        'comment' => t('Automatic message - !user has updated the issue summary.', array('!user' => $username)),
+       );
+      drupalorg_project_add_followup($changes);
+    }
+  }
+
   // Add a breadcrumb to API Change nodes.
   if ($op == 'alter' && !$teaser && $page && $node->type == 'changenotice') {
     if (isset($node->field_project[0]['nid'])) {
@@ -645,6 +657,125 @@ function drupalorg_project_nodeapi(&$node, $op = 'view', $teaser = FALSE, $page
     }
   }
 }
+/**
+ * Add a comment to the issue queue
+ *
+ * @see project_issue_add_followup
+ *
+ * This function makes four changes to project_issue_add_followup
+ * 1. Removes the call to hook_comment, because it causes an infinite recursion.
+ * 2. Adds the mail notification.
+ * 3. Hardcodes the $account to the system user, to avoid multiple calls to 
+ *    user_load, since we know the system user will always be set on drupal.org.
+ * 4. Adds an entry to the project_issue_comment table.
+ */
+function drupalorg_project_add_followup($changes) {
+  $account = _project_issue_followup_get_user();
+
+  $result = db_query('SELECT pi.nid, pi.rid, pi.component, pi.category, pi.priority, pi.assigned, pi.sid, pi.pid, n.title FROM {project_issues} pi INNER JOIN {node} n ON n.nid = pi.nid WHERE n.nid = %d', $changes['nid']);
+
+  if ($issue = db_fetch_object($result)) {
+    // Build vancode
+    $max = db_result(db_query('SELECT MAX(thread) FROM {comments} WHERE nid = %d', $changes['nid']));
+    // Strip the "/" from the end of the thread.
+    $max = rtrim($max, '/');
+    // Finally, build the thread field for this new comment.
+    $thread = int2vancode(vancode2int($max) + 1) .'/';
+
+    // These two are not allowed to be set in changes.
+    unset($changes['cid'], $changes['pid']);
+    $comment = $changes + array(
+      'pid' => 0,
+      'uid' => $account->uid,
+      // The correct subject (#number) is supplied during the save cycle.
+      'subject' => '--issue summary updated--',
+      'hostname' => ip_address(),
+      'timestamp' => time(),
+      'status' => COMMENT_PUBLISHED,
+      'format' => FILTER_FORMAT_DEFAULT,
+      'thread' => $thread,
+      'name' => $account->name,
+      'mail' => '',
+      'homepage' => '',
+      'category' => $issue->category,
+      'priority' => $issue->priority,
+      'assigned' => $issue->assigned,
+      'sid' => $issue->sid,
+      'title' => $issue->title,
+    );
+
+    if (!isset($comment['project_info'])) {
+      $comment['project_info'] = array();
+    }
+    $comment['project_info'] += array(
+      'pid' => $issue->pid,
+      'rid' => $issue->rid,
+      'component' => $issue->component,
+      'assigned' => $issue->assigned,
+    );
+
+    $result = db_query("INSERT INTO {comments} (pid, nid, uid, subject, comment, hostname, timestamp, status, format, thread, name, mail, homepage) VALUES (%d, %d, %d, '%s', '%s', '%s', %d, %d, %d, '%s', '%s', '%s', '%s')", $comment['pid'], $comment['nid'], $comment['uid'], $comment['subject'], $comment['comment'], $comment['hostname'], $comment['timestamp'], $comment['status'], $comment['format'], $comment['thread'], $comment['name'], $comment['mail'], $comment['homepage']);
+
+    $comment['cid'] = db_last_insert_id('comments', 'cid');
+
+    _comment_update_node_statistics($comment['nid']);
+    project_issue_set_mail_notify($comment['nid']);
+    
+    // Insert record into project_issue_comments table
+    drupalorg_project_issue_comment($comment);
+
+    cache_clear_all();
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
+ * Add an entry to the project_issue_comment table
+ *
+ * @see project_issue_comment
+ * We cannot use project_issue_comment here because it includes a call to
+ * project_issue_update_by_comment, which causes an infinite recursion. This
+ * code is identical to project_issue_comment insert operation, except it 
+ * removes the recursion, and does not maintain old issue data, since it isn't
+ * needed here.
+ */
+function drupalorg_project_issue_comment($arg){
+    // Get a lock on the issue in order to generate the next comment ID.
+    $tries = 20;
+    $sleep_increment = 0;
+    while ($tries) {
+      $lock = db_query("UPDATE {project_issues} SET db_lock = 1 WHERE nid = %d AND db_lock = 0", $arg['nid']);
+      if (db_affected_rows()) {
+        $id = db_result(db_query("SELECT last_comment_id FROM {project_issues} WHERE nid = %d", $arg['nid'])) + 1;
+        db_query("UPDATE {project_issues} SET last_comment_id = %d, db_lock = 0 WHERE nid = %d", $id, $arg['nid']);
+        break;
+      }
+
+      // Wait a random and increasing amount of time before the next attempt.
+      $sleep = rand(10000, 1000000) + $sleep_increment;
+      usleep($sleep);
+      $sleep_increment += 50000;
+      $tries--;
+    }
+
+    if (isset($id)) {
+      $rid = isset($arg['project_info']['rid']) ? $arg['project_info']['rid'] : 0;
+      db_query("INSERT INTO {project_issue_comments} (nid, cid, pid, rid, component, category, priority, assigned, sid, title, timestamp, comment_number) VALUES (%d, %d, %d, %d, '%s', '%s', %d, %d, %d, '%s', %d, %d)", $arg['nid'], $arg['cid'], $arg['project_info']['pid'], $rid, $arg['project_info']['component'], $arg['category'], $arg['priority'], $arg['project_info']['assigned'], $arg['sid'], $arg['title'], $arg['timestamp'], $id);
+      db_query("UPDATE {comments} SET subject = '%s' WHERE cid = %d", "#$id", $arg['cid']);
+    }
+    else {
+      drupal_set_message(t('There was an error submitting your comment -- please try again. If the problem persists, contact the system administrator.'), 'error');
+      watchdog('project_issue', 'Error obtaining lock for project issue %nid', array('%nid' => $arg['nid']), WATCHDOG_ERROR, 'node/'. $arg['nid']);
+      // This is a bit extreme, but we have to clean up the failed comment,
+      // or it will appear on the issue.
+      _comment_delete_thread((object) $arg);
+      _comment_update_node_statistics($arg['nid']);
+      cache_clear_all();
+      // The hard redirect prevents any bogus data from being inserted for the failed comment.
+      drupal_goto('node/'. $arg['nid']);
+    }
+}
 
 /**
  * List projects with commit RSS links.
