diff --git a/core/misc/collapse.js b/core/misc/collapse.js
index 80f5939..8144642 100644
--- a/core/misc/collapse.js
+++ b/core/misc/collapse.js
@@ -67,7 +67,8 @@ $.extend(CollapsibleFieldset.prototype, {
       .after(' ');
 
     // .wrapInner() does not retain bound events.
-    var $link = $('<a class="fieldset-title" href="#"></a>')
+    var $link = $('<a class="fieldset-title"></a>')
+      .attr('href', '#' + this.$node.attr('id'))
       .prepend($legend.contents())
       .appendTo($legend)
       .click($.proxy(this.onLegendClick, this));
diff --git a/core/misc/machine-name.js b/core/misc/machine-name.js
index 9ef6e47..4464e02 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 = $('<span class="admin-link"><button type="button" role="link">' + Drupal.t('Edit') + '</button></span>').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/misc/tableresponsive.js b/core/misc/tableresponsive.js
index 4a03be3..f7fc281 100644
--- a/core/misc/tableresponsive.js
+++ b/core/misc/tableresponsive.js
@@ -35,7 +35,7 @@ function TableResponsive (table) {
   // traversed only once to find them.
   this.$headers = this.$table.find('th');
   // Add a link before the table for users to show or hide weight columns.
-  this.$link = $('<a href="#" class="tableresponsive-toggle"></a>')
+  this.$link = $('<button role="link" class="tableresponsive-toggle"></button>')
     .attr({
       'title': Drupal.t('Show table cells that were hidden to make the table fit within a small screen.')
     })
diff --git a/core/misc/vertical-tabs.js b/core/misc/vertical-tabs.js
index 303840a..ca80108 100644
--- a/core/misc/vertical-tabs.js
+++ b/core/misc/vertical-tabs.js
@@ -85,6 +85,8 @@ Drupal.verticalTab = function (settings) {
   var self = this;
   $.extend(this, settings, Drupal.theme('verticalTab', settings));
 
+  this.link.attr('href', '#' + settings.fieldset.attr('id'));
+
   this.link.click(function (e) {
     e.preventDefault();
     self.focus();
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 6f4cb14..9d0bc86 100644
--- a/core/themes/bartik/css/style.css
+++ b/core/themes/bartik/css/style.css
@@ -128,7 +128,7 @@ table,
 input,
 textarea,
 select,
-a.button {
+button {
   font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif;
 }
 
@@ -1085,8 +1085,7 @@ div.password-confirm {
 
 /* ---------------- Buttons    ---------------- */
 
-input.form-submit,
-a.button {
+input.form-submit {
   background: #fff url(../images/buttons.png) 0 0 repeat-x;
   border: 1px solid #e4e4e4;
   border-bottom: 1px solid #b4b4b4;
@@ -1102,14 +1101,6 @@ a.button {
   padding: 4px 17px;
   border-radius: 15px;
 }
-a.button:link,
-a.button:visited,
-a.button:hover,
-a.button:focus,
-a.button:active {
-  text-decoration: none;
-  color: #5a5a5a;
-}
 
 /* -------------- Form Elements   ------------- */
 
diff --git a/core/themes/seven/style.css b/core/themes/seven/style.css
index 7b8ae1b..33f3593 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]:hover {
   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;
@@ -644,16 +645,8 @@ a.button {
   background: url(images/buttons.png) 0 0 repeat-x;
   border-radius: 20px;
 }
-a.button:link,
-a.button:visited,
-a.button:hover,
-a.button:active {
-  text-decoration: none;
-}
 input.form-submit:hover,
-input.form-submit:focus,
-a.button:hover,
-a.button:focus {
+input.form-submit:focus {
   background-position: 0 -40px;
   border: 1px solid #bebebe;
   border-left-color: #afafaf;
@@ -661,8 +654,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;
