diff --git a/app/views/journals/new.js.erb b/app/views/journals/new.js.erb
index 0f832f37f..653b6e0e2 100644
--- a/app/views/journals/new.js.erb
+++ b/app/views/journals/new.js.erb
@@ -11,3 +11,4 @@ $('#issue_notes').blur().focus().val(notes + "<%= raw escape_javascript(@content
 $('#issue_private_notes').prop('checked', true);
 <% end %>
 
+addCopyButtonToPreTag();
diff --git a/app/views/journals/update.js.erb b/app/views/journals/update.js.erb
index 47dfdebec..f6386bb1d 100644
--- a/app/views/journals/update.js.erb
+++ b/app/views/journals/update.js.erb
@@ -7,6 +7,7 @@
   $("#journal-<%= @journal.id %>-notes").replaceWith('<%= escape_javascript(render_notes(@journal.issue, @journal, :reply_links => authorize_for('issues', 'edit'))) %>');
   $("#journal-<%= @journal.id %>-notes").show();
   $("#journal-<%= @journal.id %>-form").remove();
+  addCopyButtonToPreTag();
 <% end %>
 
 <%= call_hook(:view_journals_update_js_bottom, { :journal => @journal }) %>
diff --git a/public/javascripts/application.js b/public/javascripts/application.js
index f33c9caf8..7069a4fc9 100644
--- a/public/javascripts/application.js
+++ b/public/javascripts/application.js
@@ -1023,6 +1023,53 @@ $(function () {
     });
 });
 
+function addCopyButtonToPreTag() {
+  $('.wiki .copy-contents').remove();
+  var copyContents =
+    $("<div class='copy-contents'>").append(
+      $("<button class='code-copy-button' title='Copy' onclick='copyText($(this).parent().next(\"pre\"), $(this).parent());'>")
+      .append("<span class='icon-only icon-copy'>")
+    );
+  $('.wiki pre').before(copyContents);
+  $('.code-copy-button[title]').tooltip({
+      show: {
+        delay: 400
+      },
+      position: {
+        my: "center bottom-5",
+        at: "center top"
+      }
+  });
+}
+
+function copyText(target, copyEl) {
+  // Selecting strings in 2 ways for cross-browser support
+  // 1. Use select();
+  copyEl.append("<textarea class='tmp'>");
+  var tmp = copyEl.find('.tmp');
+  tmp.val(target.text());
+  tmp.select();
+
+  // 2. Use createRange();
+  var range = document.createRange();
+  range.selectNode(target[0]);
+  window.getSelection().removeAllRanges();
+  window.getSelection().addRange(range);
+
+  // Copy and Cleanup
+  var copied = document.execCommand('copy');
+  window.getSelection().removeAllRanges();
+  tmp.remove();
+
+  // Show copied messages
+  if (copied){
+    copyEl.append("<div class='copied-message'>Copied.</div>");
+    var copiedMessage = copyEl.find('.copied-message');
+    copiedMessage.show();
+    copiedMessage.fadeOut('slow', function() { $(this).remove(); });
+  }
+}
+
 function inlineAutoComplete(element) {
     'use strict';
     // do not attach if Tribute is already initialized
@@ -1077,6 +1124,7 @@ $(document).ready(defaultFocus);
 $(document).ready(setupAttachmentDetail);
 $(document).ready(setupTabs);
 $(document).ready(setupFilePreviewNavigation);
+$(document).ready(addCopyButtonToPreTag);
 $(document).on('focus', '[data-auto-complete=true]', function(event) {
   inlineAutoComplete(event.target);
 });
diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css
index 8f92c8e98..05404e7a4 100644
--- a/public/stylesheets/application.css
+++ b/public/stylesheets/application.css
@@ -1271,6 +1271,33 @@ h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor, h4:hover
 
 div.wiki img {vertical-align:middle; max-width:100%;}
 
+.copy-contents {
+  position: relative;
+}
+
+.copy-contents .code-copy-button {
+  position: absolute;
+  display: flex;
+  right: -13px;
+  top: 0px;
+  border: none;
+  background-color: transparent;
+}
+
+.copy-contents .copied-message {
+  position: absolute;
+  display: flex;
+  right: -13px;
+  top: 20px;
+  display: none;
+  color:#505050;
+}
+
+.copy-contents .tmp {
+  position: fixed;
+  left: 200%;
+}
+
 /***** My page layout *****/
 .block-receiver {
   border:1px dashed #fff;
