diff --git a/core/misc/machine-name.js b/core/misc/machine-name.js
index 9ef6e47..b6acbcb 100644
--- a/core/misc/machine-name.js
+++ b/core/misc/machine-name.js
@@ -109,7 +109,7 @@ Drupal.behaviors.machineName = {
           options: options
         };
         // If it is editable, append an edit link.
-        var $link = $('<span class="admin-link"><a href="#">' + Drupal.t('Edit') + '</a></span>').bind('click', eventData, clickEditHandler);
+        var $link = $('<button type="button" role="link" class="admin-link">' + Drupal.t('Edit') + '</button>').bind('click', eventData, clickEditHandler);
         $suffix.append(' ').append($link);
 
         // Preview the machine name in realtime when the human-readable name
diff --git a/core/misc/tabledrag.js b/core/misc/tabledrag.js
index 230f588..25b60d9 100644
--- a/core/misc/tabledrag.js
+++ b/core/misc/tabledrag.js
@@ -104,7 +104,7 @@ Drupal.tableDrag = function (table, tableSettings) {
   $table.find('> tr.draggable, > tbody > tr.draggable').each(function () { self.makeDraggable(this); });
 
   // Add a link before the table for users to show or hide weight columns.
-  $table.before($('<a href="#" class="tabledrag-toggle-weight"></a>')
+  $table.before($('<button role="link" class="tabledrag-toggle-weight"></button>')
     .attr('title', Drupal.t('Re-order rows by numerical weight instead of dragging.'))
     .click($.proxy(function (e) {
       e.preventDefault();
diff --git a/core/modules/contextual/contextual.js b/core/modules/contextual/contextual.js
index 8534ce1..1ee0b32 100644
--- a/core/modules/contextual/contextual.js
+++ b/core/modules/contextual/contextual.js
@@ -18,7 +18,7 @@ Drupal.behaviors.contextualLinks = {
       var $wrapper = $(this);
       var $region = $wrapper.closest('.contextual-region');
       var $links = $wrapper.find('ul');
-      var $trigger = $('<a class="trigger" href="#" />').text(Drupal.t('Configure')).click(
+      var $trigger = $('<button type="button" role="link" class="trigger" />').text(Drupal.t('Configure')).click(
         function (e) {
           e.preventDefault();
           e.stopPropagation();
diff --git a/core/modules/field/modules/text/text.js b/core/modules/field/modules/text/text.js
index efc5579..1c68792 100644
--- a/core/modules/field/modules/text/text.js
+++ b/core/modules/field/modules/text/text.js
@@ -22,19 +22,19 @@ Drupal.behaviors.textSummary = {
       }
 
       // Set up the edit/hide summary link.
-      var $link = $('<span class="field-edit-link">(<a class="link-edit-summary" href="#nogo">' + Drupal.t('Hide summary') + '</a>)</span>');
-      var $a = $link.find('a');
+      var $link = $('<span class="field-edit-link">(<button type="button" role="link" class="link-edit-summary">' + Drupal.t('Hide summary') + '</button>)</span>');
+      var $button = $link.find('button');
       $link.toggle(
         function (e) {
           e.preventDefault();
           $summary.hide();
-          $a.html(Drupal.t('Edit summary'));
+          $button.html(Drupal.t('Edit summary'));
           $link.appendTo($fullLabel);
         },
         function (e) {
           e.preventDefault();
           $summary.show();
-          $a.html(Drupal.t('Hide summary'));
+          $button.html(Drupal.t('Hide summary'));
           $link.appendTo($summaryLabel);
         }
       ).appendTo($summaryLabel);
diff --git a/core/modules/system/system.theme.css b/core/modules/system/system.theme.css
index 343a4f8..ebe9bd9 100644
--- a/core/modules/system/system.theme.css
+++ b/core/modules/system/system.theme.css
@@ -1,4 +1,3 @@
-
 /**
  * @file
  * Basic styling for common markup.
@@ -15,6 +14,9 @@ form {
   margin: 0;
   padding: 0;
 }
+button {
+  font-size: 1em;
+}
 hr {
   border: 1px solid gray;
   height: 1px;
@@ -179,6 +181,21 @@ abbr.form-required, abbr.tabledrag-changed, abbr.ajax-changed {
 }
 
 /**
+ * Show buttons as links
+ */
+button[role=link] {
+  background: transparent;
+  border: 0;
+  cursor: pointer;
+  margin: 0;
+  padding: 0;
+}
+
+label button[role=link] {
+  font-weight: bold;
+}
+
+/**
  * Collapsible fieldsets.
  *
  * @see collapse.js
diff --git a/core/themes/bartik/css/style.css b/core/themes/bartik/css/style.css
index e4b2f12..fed6872 100644
--- a/core/themes/bartik/css/style.css
+++ b/core/themes/bartik/css/style.css
@@ -128,7 +128,8 @@ table,
 input,
 textarea,
 select,
-a.button {
+a.button,
+button {
   font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif;
 }
 
@@ -1086,7 +1087,7 @@ div.password-confirm {
 /* ---------------- Buttons    ---------------- */
 
 input.form-submit,
-a.button {
+button {
   background: #fff url(../images/buttons.png) 0 0 repeat-x;
   border: 1px solid #e4e4e4;
   border-bottom: 1px solid #b4b4b4;
@@ -1106,7 +1107,10 @@ a.button:link,
 a.button:visited,
 a.button:hover,
 a.button:focus,
-a.button:active {
+a.button:active,
+button:hover,
+button:focus,
+button:active {
   text-decoration: none;
   color: #5a5a5a;
 }
diff --git a/core/themes/seven/style.css b/core/themes/seven/style.css
index 24b0035..347c6ea 100644
--- a/core/themes/seven/style.css
+++ b/core/themes/seven/style.css
@@ -6,11 +6,13 @@ body {
   background: #fff;
   font: normal 81.3%/1.538em "Lucida Grande", "Lucida Sans Unicode", sans-serif;
 }
-a {
+a,
+button[role=link] {
   color: #0074bd;
   text-decoration: none;
 }
-a:hover {
+a:hover,
+button[role=link] {
   text-decoration: underline;
 }
 hr {
@@ -626,8 +628,7 @@ body div.form-type-radio div.description,
 body div.form-type-checkbox div.description {
   margin-left: 1.5em; /* LTR */
 }
-input.form-submit,
-a.button {
+input.form-submit {
   cursor: pointer;
   padding: 4px 17px;
   margin-bottom: 1em;
@@ -661,8 +662,7 @@ a.button:focus {
   border-bottom-color: #9b9b9b;
   color: #2e2e2e;
 }
-input.form-submit:active,
-a.button:active {
+input.form-submit:active {
   background-position: 0 -80px;
   border: 1px solid #333;
   border-left-color: #222;
