diff --git a/dopl.css b/dopl.css
new file mode 100644
index 0000000..1b35e5c
--- /dev/null
+++ b/dopl.css
@@ -0,0 +1,33 @@
+
+.project-issue-status-info a, .project-issue-status-info .project-issue-assigned-user {
+  background-color: #CDCDCD;
+  border-radius: 4px 4px 4px 4px;
+  padding: 2px 4px;
+}
+.project-issue-status-info .project-issue-assigned-user {
+  white-space: nowrap;
+}
+.project-issue-status-1 a {
+  background-color: #FFFFFF;
+}
+.project-issue-status-2 a {
+  background-color: #C0FFC0;
+}
+.project-issue-status-3 a, .project-issue-status-4 a, .project-issue-status-5 a, .project-issue-status-6 a {
+  background-color: #DDDDFF;
+}
+.project-issue-status-7 a {
+  background-color: #FFC9C9;
+}
+.project-issue-status-8 a {
+    background-color: #FFFFDD;
+}
+.project-issue-status-13 a {
+  background-color: #FFE7DD;
+}
+.project-issue-status-14 a {
+  background-color: #E7FFDD;
+}
+.project-issue-status-2, .project-issue-status-3, .project-issue-status-5, .project-issue-status-6, .project-issue-status-7 {
+  text-decoration: line-through;
+}
diff --git a/dopl.module b/dopl.module
index 2307efa..dfc529e 100644
--- a/dopl.module
+++ b/dopl.module
@@ -6,6 +6,13 @@
  */
 
 /**
+ * Implementation of hook_init()
+ */
+function dopl_init() {
+  drupal_add_css(drupal_get_path('module', 'dopl') . '/dopl.css');
+}
+
+/**
  * Implementation of hook_filter().
  */
 function dopl_filter($op, $delta = 0, $format = -1, $text = '') {
@@ -27,7 +34,7 @@ function dopl_filter($op, $delta = 0, $format = -1, $text = '') {
  * Implementation of hook_filter_tips().
  */
 function dopl_filter_tips($delta, $format, $long = false) {
-  return t('Use one of the forms <em>name.module</em>, <em>name.theme</em>, <em>name.translation</em>, <em>name.installprofile</em> or <em>name.project</em>, in order to link to <em>http://drupal.org/project/name</em> - Note that a link will be generated even if the project or node does not exist.<br />Use <em>[nid].do</em> to link to <em>http://drupal.org/node/[nid]</em>, and <em>[nid].gdo</em> to link to <em>http://groups.drupal.org/node/[nid]</em> - Links will only be generated for valid node IDs using this format.');
+  return t('Use one of the forms <em>name.module</em>, <em>name.theme</em>, <em>name.translation</em>, <em>name.installprofile</em> or <em>name.project</em>, in order to link to <em>http://drupal.org/project/name</em> - Note that a link will be generated even if the project or node does not exist.<br />Use <em>[nid].do</em> or <em>[nid].issue</em> to link to <em>http://drupal.org/node/[nid]</em>, and <em>[nid].gdo</em> to link to <em>http://groups.drupal.org/node/[nid]</em> - Links will only be generated for valid node IDs using this format.');
 }
 
 
@@ -42,6 +49,10 @@ function dopl_process($text) {
   $pattern = '/(\b)([a-z0-9#\-]*)(\.(do))(\b)/';
   $text = preg_replace_callback($pattern, 'dopl_get_dotitle', $text);
 
+  // Link drupal.org issue nodes by nid
+  $pattern = '/(\b)([a-z0-9#\-]*)(\.(issue))(\b)(\|"([^"]*)")?/';
+  $text = preg_replace_callback($pattern, 'dopl_get_issue', $text);
+
   // Link groups.drupal.org nodes by nid
   //$pattern = '/(\b)(\w+)(\.(node))(\b)/';
   $pattern = '/(\b)([a-z0-9#\-]*)(\.(gdo))(\b)/';
@@ -133,4 +144,53 @@ function dopl_get_page_title($url){
 	} else {
 		return false;
 	}
-}
\ No newline at end of file
+}
+
+/**
+ *
+ */
+function dopl_get_issue($matches = array()) {
+  $nid = $matches[2];
+  $url = 'http://drupal.org/node/' . $nid;
+  $link = '';
+  // using a different cache identifier in case the nid gets used in a do link as well
+  if ($data = cache_get('dopli:' . $matches[2])) {
+    $link = (array_key_exists(7, $matches)) ? l($url, $matches[7]) : $data->data;
+  }
+  else {
+    $filename = $url . "/project-issue/json";
+    $result = @drupal_http_request($filename);
+    if($result->code != 200) {
+      return FALSE;
+      dpm('boom!');
+    }
+    else {
+      $issue_info = json_decode($result->data, TRUE);
+      $page_title = trim($issue_info['title']);
+      if ($issue_info['assigned-name'] && $issue_info['assigned-name'] != 'Anonymous') {
+        $username = trim($issue_info['assigned-name']);
+      }
+      $status = trim($issue_info['status']);
+      $sid = trim($issue_info['status-id']);
+      if (!empty($username)) {
+        // We have an assigned user, so include it in title.
+        // l() runs $attributes through drupal_attributes() which escapes the value.
+        $attributes = array('title' => t('Status: !status, Assigned to: !username', array('!status' => $status, '!username' => $username)));
+      }
+      else {
+        // Just the status.
+        $attributes = array('title' => t('Status: !status', array('!status' => $status)));
+      }
+
+      $title = "#$nid: $page_title";
+      $issue_url = l($title, $url, array('attributes' => $attributes));
+      $issue_link = '<span class="project-issue-status-'. $sid .' project-issue-status-info">'. $issue_url . '</span>';
+      cache_set('dopli:' . $matches[2], $issue_link);
+      $link = (array_key_exists(7, $matches)) ? $matches[7] : $issue_link;
+    }
+  }
+  if ($link) {
+    return $link;
+  }
+  return $matches[0];
+}
