diff --git a/dreditor.user.js b/dreditor.user.js
index 631d996..14398b8 100644
--- a/dreditor.user.js
+++ b/dreditor.user.js
@@ -1360,6 +1360,107 @@ Drupal.behaviors.dreditorIssueSummary = function (context) {
 };
 
 /**
+ * Adds a button to insert the issue summary template.
+ */
+Drupal.behaviors.dreditorIssueAddEdit = function(context) {
+
+  /**
+   * Fetches the node to retrieve the original poster's name and profile link.
+   */
+  var getPoster = function() {
+    // Load the issue's view page.
+    $.get($('#tabs a:contains("View")').attr('href'), function(data) {
+        // Find the link to the original poster's profile.
+        var link = $(data).find('div.node > div.submitted a');
+
+        // Assemble markup for a link and insert it in the summary template.
+        var new_link = '<a href="' + link.attr('href') + '">' + link.text() + '</a>';
+        $('#edit-body').val($('#edit-body').val().replace(/\[username\]/, new_link));
+      });
+  };
+
+  /**
+   * Fetches and inserts the issue summary template from the handbook.
+   *
+   * @param edit_form
+   *   TRUE if we are on a node edit form; FALSE if it is a node add form.
+   */
+  var injectTemplate = function(edit_form) {
+    // Load the issue summary instructions.
+    $.get('http://drupal.org/node/1155816', function(data) {
+      // We need the first codeblock to extract the template.
+      var template = $(data).find('div.codeblock:first > code');
+      var text = template.text();
+
+      // Insert blank lines and strip parenthetical comments.
+      text = text.replace(/<\/h3>/g, "</h3>\n\n\n").replace(/\(.*\)/g, "").replace(/\/\/.*\./,"");
+
+      // Prepend text to current body.
+      $('#edit-body').val(text + $('#edit-body').val());
+
+      // If we are on the node edit form, append the poster link.
+      if (edit_form) {
+        getPoster();
+      }
+      // Otherwise, we are editing a new issue, so remove the "original report"
+      // header.  This is the original report.
+      else {
+        $('#edit-body').val($('#edit-body').val().replace(/<h3 id=\"summary-original-report\">.*<\/h3>/, ''));
+      }
+    });
+  };
+
+  /**
+   * Adds the 'insert template' button above the issue summary field.
+   *
+   * @param edit_form
+   *   TRUE if we are on a node edit form; FALSE if it is a node add form.
+   */
+  var addTemplateButton = function(edit_form) {
+    // We want to append the button in the label area.
+    var $label = $('label[for="edit-body"]');
+
+    // Create a button to insert the template.
+    var $action = $('<a>')
+      .attr('href', '#')
+      .appendTo($label)
+      .text("Insert template")
+      .attr('class', 'dreditor-button')
+      .click(function() {
+        injectTemplate(edit_form);
+        return false;
+      }
+    );
+    $action.wrap('<span>&nbsp;&nbsp;</span>');
+
+    // Add a link to view the issue summary instructions.
+    var $instructions = $('<a>')
+      .attr('href', 'http://drupal.org/node/1155816')
+      .appendTo($label)
+      .text("Issue summary standards");
+    $instructions.before('(');
+    $instructions.after(')');
+  };
+
+  // This markup appears only on node edit forms.
+  $('body.logged-in.page-node.node-type-project-issue #edit-body').once('dreditorIssueTemplate', function() {
+      // Add the template button and pass a true value (1) for edit_form.
+      // This will ensure the pasted template is appropriate for an existing
+      // issue.
+      addTemplateButton(1);
+  });
+
+  // This markup appears on both node add and edit forms.
+  // However, on node edit forms, the once() for dreditorIssueTemplate has
+  // already run, so it will not run again.
+  $('body.logged-in.page-node div.project-issue #edit-body').once('dreditorIssueTemplate', function() {
+      // Add the template button and pass a false value (0) for edit_form.
+      // This will ensure the pasted template is appropriate for a new issue.
+      addTemplateButton(0);
+  });
+};
+
+/**
  * Streamline issue comment form.
  *
  * Altering of the form makes certain browsers (such as Firefox) no longer find
