diff --git a/package.json b/package.json
index 33a181ff51fbfcbe046ca853739050a376ccc49a..6d5a45238e16269d48a0e76210ef801536a47d59 100644
--- a/package.json
+++ b/package.json
@@ -56,7 +56,7 @@
     "js-minify-main": "npm-run-all js-minify-standalone js-minify-bundle",
     "js-minify-standalone": "uglifyjs --compress typeofs=false --mangle --comments \"/^!/\" --source-map \"content=dist/js/bootstrap.js.map,includeSources,url=bootstrap.min.js.map\" --output dist/js/bootstrap.min.js dist/js/bootstrap.js",
     "js-minify-bundle": "uglifyjs --compress typeofs=false --mangle --comments \"/^!/\" --source-map \"content=dist/js/bootstrap.bundle.js.map,includeSources,url=bootstrap.bundle.min.js.map\" --output dist/js/bootstrap.bundle.min.js dist/js/bootstrap.bundle.js",
-    "js-minify-docs": "cross-env-shell uglifyjs --mangle --comments \\\"/^!/\\\" --output site/docs/$npm_package_version_short/assets/js/docs.min.js site/docs/$npm_package_version_short/assets/js/vendor/clipboard.min.js site/docs/$npm_package_version_short/assets/js/vendor/bs-custom-file-input.min.js \"site/docs/$npm_package_version_short/assets/js/src/*.js\"",
+    "js-minify-docs": "cross-env-shell uglifyjs --mangle --comments \\\"/^!/\\\" --output site/docs/$npm_package_version_short/assets/js/docs.min.js site/docs/$npm_package_version_short/assets/js/vendor/anchor.min.js site/docs/$npm_package_version_short/assets/js/vendor/clipboard.min.js site/docs/$npm_package_version_short/assets/js/vendor/bs-custom-file-input.min.js \"site/docs/$npm_package_version_short/assets/js/src/*.js\"",
     "js-test": "npm-run-all js-test-karma*",
     "js-test-karma": "karma start js/tests/karma.conf.js",
     "js-test-karma-old": "cross-env USE_OLD_JQUERY=true npm run js-test-karma",
diff --git a/site/_includes/scripts.html b/site/_includes/scripts.html
index 79b400bbe23eb7428cf3488239e5a138a2045340..044dd336848744d5018a5b202d9128b4afdfe476 100644
--- a/site/_includes/scripts.html
+++ b/site/_includes/scripts.html
@@ -14,6 +14,7 @@
 {%- if jekyll.environment == "production" -%}
   <script src="{{ site.baseurl }}/docs/{{ site.docs_version }}/assets/js/docs.min.js"></script>
 {%- else -%}
+  <script src="{{ site.baseurl }}/docs/{{ site.docs_version }}/assets/js/vendor/anchor.min.js"></script>
   <script src="{{ site.baseurl }}/docs/{{ site.docs_version }}/assets/js/vendor/clipboard.min.js"></script>
   <script src="{{ site.baseurl }}/docs/{{ site.docs_version }}/assets/js/vendor/bs-custom-file-input.min.js"></script>
   <script src="{{ site.baseurl }}/docs/{{ site.docs_version }}/assets/js/src/application.js"></script>
diff --git a/site/_includes/vendor/anchor_headings.html b/site/_includes/vendor/anchor_headings.html
deleted file mode 100644
index 65c0eed846cba65d2edf500b639e095c2592709b..0000000000000000000000000000000000000000
--- a/site/_includes/vendor/anchor_headings.html
+++ /dev/null
@@ -1,86 +0,0 @@
-{% capture headingsWorkspace %}
-  {% comment %}
-    Version 1.0.0
-      https://github.com/allejo/jekyll-anchor-headings
-
-    "Be the pull request you wish to see in the world." ~Ben Balter
-
-    Usage:
-      {% include anchor_headings.html html=content %}
-
-    Parameters:
-      * html          (string) - the HTML of compiled markdown generated by kramdown in Jekyll
-
-    Optional Parameters:
-      * beforeHeading (bool)   : false  - Set to true if the anchor should be placed _before_ the heading's content
-      * anchorBody    (string) :  ''    - The content that will be placed inside the anchor; the `%heading%` placeholder is available
-      * anchorClass   (string) :  ''    - The class(es) that will be used for each anchor. Separate multiple classes with a space
-      * anchorTitle   (string) :  ''    - The `title` attribute that will be used for anchors
-      * h_min         (int)    :  1     - The minimum header level to build an anchor for; any header lower than this value will be ignored
-      * h_max         (int)    :  6     - The maximum header level to build an anchor for; any header greater than this value will be ignored
-
-    Output:
-      The original HTML with the addition of anchors inside of all of the h1-h6 headings.
-  {% endcomment %}
-
-  {% assign minHeader = include.h_min | default: 1 %}
-  {% assign maxHeader = include.h_max | default: 6 %}
-  {% assign beforeHeading = include.beforeHeading %}
-  {% assign nodes = include.html | split: '<h' %}
-
-  {% capture edited_headings %}{% endcapture %}
-
-  {% for node in nodes %}
-    {% if node == "" %}
-      {% continue %}
-    {% endif %}
-
-    {% assign headerLevel = node | replace: '"', '' | slice: 0, 1 | times: 1 %}
-
-    <!-- If the node doesn't have a header, then it's content before the first heading; don't discard it -->
-    {% if headerLevel < 1 or headerLevel > 6 %}
-      {% capture edited_headings %}{{ edited_headings }}{{ node }}{% endcapture %}
-      {% continue %}
-    {% endif %}
-
-    {% assign _workspace = node | split: '</h' %}
-    {% assign _idWorkspace = _workspace[0] | split: 'id="' %}
-    {% assign _idWorkspace = _idWorkspace[1] | split: '"' %}
-    {% assign html_id = _idWorkspace[0] %}
-
-    {% capture _hAttrToStrip %}{{ _workspace[0] | split: '>' | first }}>{% endcapture %}
-    {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %}
-
-    <!-- Build the anchor to inject for our heading -->
-    {% capture anchor %}{% endcapture %}
-
-    {% if html_id and headerLevel >= minHeader and headerLevel <= maxHeader %}
-      {% capture anchor %}href="#{{ html_id}}"{% endcapture %}
-
-      {% if include.anchorClass %}
-        {% capture anchor %}{{ anchor }} class="{{ include.anchorClass }}"{% endcapture %}
-      {% endif %}
-
-      {% if include.anchorTitle %}
-        {% capture anchor %}{{ anchor }} title="{{ include.anchorTitle | replace: '%heading%', header }}"{% endcapture %}
-      {% endif %}
-
-      {% capture anchor %}<a {{ anchor }}>{{ include.anchorBody | replace: '%heading%', header | default: '' | raw }}</a>{% endcapture %}
-
-      {% if beforeHeading %}
-        {% capture anchor %}{{ anchor }} {% endcapture %}
-      {% else %}
-        {% capture anchor %} {{ anchor }}{% endcapture %}
-      {% endif %}
-    {% endif %}
-
-    <!-- The placement of our anchor, before the heading content or after -->
-    {% if beforeHeading %}
-      {% capture _current %}<h{{ _hAttrToStrip | raw }}{{ anchor }}{% endcapture %}
-      {% capture edited_headings %}{{ edited_headings }}{{ node | replace: _hAttrToStrip, _current | raw }}{% endcapture %}
-    {% else %}
-      {% capture _current %}<h{{ _workspace | first }}{{ anchor }}</h{{ _workspace | last }}{% endcapture %}
-      {% capture edited_headings %}{{ edited_headings }}{{ _current }}{% endcapture %}
-    {% endif %}
-  {% endfor %}
-{% endcapture %}{% assign headingsWorkspace = '' %}{{ edited_headings | strip }}
\ No newline at end of file
diff --git a/site/_layouts/docs.html b/site/_layouts/docs.html
index cb52439b5a288ecc85ab60b96f610adbe16d9b7d..1d2125508e4cd8e72ae4574c0aa1cc1febf320c3 100644
--- a/site/_layouts/docs.html
+++ b/site/_layouts/docs.html
@@ -24,7 +24,7 @@
           <h1 class="bd-title" id="content">{{ page.title | smartify }}</h1>
           <p class="bd-lead">{{ page.description | smartify }}</p>
           {% include ads.html %}
-          {% include vendor/anchor_headings.html html=content h_min=2 h_max=5 anchorBody="#" anchorTitle="Permalink" anchorClass="bd-anchor" %}
+          {{ content }}
         </main>
       </div>
     </div>
diff --git a/site/docs/4.1/assets/js/src/application.js b/site/docs/4.1/assets/js/src/application.js
index 5474d361466f92bf335ba68b133284e28cbe8292..8bd9e78771f025172c55fb4739057f37e034788a 100644
--- a/site/docs/4.1/assets/js/src/application.js
+++ b/site/docs/4.1/assets/js/src/application.js
@@ -10,7 +10,7 @@
  * details, see https://creativecommons.org/licenses/by/3.0/.
  */
 
-/* global ClipboardJS: false, bsCustomFileInput: false */
+/* global ClipboardJS: false, anchors: false, bsCustomFileInput: false */
 
 (function ($) {
   'use strict'
@@ -101,6 +101,10 @@
         .tooltip('_fixTitle')
     })
 
+    anchors.options = {
+      icon: '#'
+    }
+    anchors.add('.bd-content > h2, .bd-content > h3, .bd-content > h4, .bd-content > h5')
     $('.bd-content').children('h2, h3, h4, h5').wrapInner('<span class="bd-content-title"></span>')
 
     bsCustomFileInput.init()
diff --git a/site/docs/4.1/assets/js/vendor/anchor.min.js b/site/docs/4.1/assets/js/vendor/anchor.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..29a64acae6aaff532a29051b0dec76283494d8f2
--- /dev/null
+++ b/site/docs/4.1/assets/js/vendor/anchor.min.js
@@ -0,0 +1,6 @@
+/**
+ * AnchorJS - v4.1.1 - 2018-07-01
+ * https://github.com/bryanbraun/anchorjs
+ * Copyright (c) 2018 Bryan Braun; Licensed MIT
+ */
+!function(A,e){"use strict";"function"==typeof define&&define.amd?define([],e):"object"==typeof module&&module.exports?module.exports=e():(A.AnchorJS=e(),A.anchors=new A.AnchorJS)}(this,function(){"use strict";return function(A){function d(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.hasOwnProperty("visible")?A.visible:"hover",A.placement=A.hasOwnProperty("placement")?A.placement:"right",A.ariaLabel=A.hasOwnProperty("ariaLabel")?A.ariaLabel:"Anchor",A.class=A.hasOwnProperty("class")?A.class:"",A.truncate=A.hasOwnProperty("truncate")?Math.floor(A.truncate):64}function f(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new Error("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}this.options=A||{},this.elements=[],d(this.options),this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)},this.add=function(A){var e,t,i,n,o,s,r,a,c,h,l,u=[];if(d(this.options),"touch"===(l=this.options.visible)&&(l=this.isTouchDevice()?"always":"hover"),A||(A="h2, h3, h4, h5, h6"),0===(e=f(A)).length)return this;for(function(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style");e.className="anchorjs",e.appendChild(document.createTextNode("")),void 0===(A=document.head.querySelector('[rel="stylesheet"], style'))?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(" .anchorjs-link {   opacity: 0;   text-decoration: none;   -webkit-font-smoothing: antialiased;   -moz-osx-font-smoothing: grayscale; }",e.sheet.cssRules.length),e.sheet.insertRule(" *:hover > .anchorjs-link, .anchorjs-link:focus  {   opacity: 1; }",e.sheet.cssRules.length),e.sheet.insertRule(" [data-anchorjs-icon]::after {   content: attr(data-anchorjs-icon); }",e.sheet.cssRules.length),e.sheet.insertRule(' @font-face {   font-family: "anchorjs-icons";   src: url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype"); }',e.sheet.cssRules.length)}}(),t=document.querySelectorAll("[id]"),i=[].map.call(t,function(A){return A.id}),o=0;o<e.length;o++)if(this.hasAnchorJSLink(e[o]))u.push(o);else{if(e[o].hasAttribute("id"))n=e[o].getAttribute("id");else if(e[o].hasAttribute("data-anchor-id"))n=e[o].getAttribute("data-anchor-id");else{for(c=a=this.urlify(e[o].textContent),r=0;void 0!==s&&(c=a+"-"+r),r+=1,-1!==(s=i.indexOf(c)););s=void 0,i.push(c),e[o].setAttribute("id",c),n=c}n.replace(/-/g," "),(h=document.createElement("a")).className="anchorjs-link "+this.options.class,h.href="#"+n,h.setAttribute("aria-label",this.options.ariaLabel),h.setAttribute("data-anchorjs-icon",this.options.icon),"always"===l&&(h.style.opacity="1"),""===this.options.icon&&(h.style.font="1em/1 anchorjs-icons","left"===this.options.placement&&(h.style.lineHeight="inherit")),"left"===this.options.placement?(h.style.position="absolute",h.style.marginLeft="-1em",h.style.paddingRight="0.5em",e[o].insertBefore(h,e[o].firstChild)):(h.style.paddingLeft="0.375em",e[o].appendChild(h))}for(o=0;o<u.length;o++)e.splice(u[o]-o,1);return this.elements=this.elements.concat(e),this},this.remove=function(A){for(var e,t,i=f(A),n=0;n<i.length;n++)(t=i[n].querySelector(".anchorjs-link"))&&(-1!==(e=this.elements.indexOf(i[n]))&&this.elements.splice(e,1),i[n].removeChild(t));return this},this.removeAll=function(){this.remove(this.elements)},this.urlify=function(A){return this.options.truncate||d(this.options),A.trim().replace(/\'/gi,"").replace(/[& +$,:;=?@"#{}|^~[`%!'<>\]\.\/\(\)\*\\\n\t\b\v]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),t=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||t||!1}}});
\ No newline at end of file
diff --git a/site/docs/4.1/assets/scss/_anchor.scss b/site/docs/4.1/assets/scss/_anchor.scss
index 7f407f7c287f2b8268d065b7eb7bcbc652c6fdcf..2f00424dd2b6ed9aefc5fec67aa981ea4aca5577 100644
--- a/site/docs/4.1/assets/scss/_anchor.scss
+++ b/site/docs/4.1/assets/scss/_anchor.scss
@@ -1,15 +1,10 @@
-.bd-anchor {
-  padding-left: .25rem;
+.anchorjs-link {
   font-weight: 400;
-  color: $link-color;
-  opacity: 0;
-  @include transition(opacity .16s linear);
+  color: rgba($link-color, .5);
+  @include transition(color .16s linear);
 
-  :hover > &,
-  &:hover,
-  &:focus {
+  &:hover {
     color: $link-color;
     text-decoration: none;
-    opacity: 1;
   }
 }