diff --git a/CHANGELOG b/CHANGELOG
index 104f37003c997bd2ee482b37f9e8d10391cbe47d..4e12f5d4f003c11754f3e6fb5b68ff24fa9cb2c9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -7,6 +7,7 @@ v 8.12.0 (unreleased)
   - Optimistic locking for Issues and Merge Requests (title and description overriding prevention)
   - Add `wiki_page_events` to project hook APIs (Ben Boeckel)
   - Add Sentry logging to API calls
+  - Automatically expand hidden discussions when accessed by a permalink !5585 (Mike Greiling)
   - Added tests for diff notes
   - Added 'only_allow_merge_if_build_succeeds' project setting in the API. !5930 (Duck)
   - Reduce number of database queries on builds tab
diff --git a/app/assets/javascripts/behaviors/toggler_behavior.js b/app/assets/javascripts/behaviors/toggler_behavior.js
index 1b7b63489ea3fc5eb300a90ed84ada71f3af53fb..8ac1ba7665e352fdeb4b3c8067a21aa81895b66a 100644
--- a/app/assets/javascripts/behaviors/toggler_behavior.js
+++ b/app/assets/javascripts/behaviors/toggler_behavior.js
@@ -1,10 +1,26 @@
-(function() {
+(function(w) {
   $(function() {
-    return $("body").on("click", ".js-toggle-button", function(e) {
-      $(this).find('i').toggleClass('fa fa-chevron-down').toggleClass('fa fa-chevron-up');
-      $(this).closest(".js-toggle-container").find(".js-toggle-content").toggle();
-      return e.preventDefault();
+    $('.js-toggle-button').on('click', function(e) {
+      e.preventDefault();
+      $(this)
+        .find('.fa')
+          .toggleClass('fa-chevron-down fa-chevron-up')
+        .end()
+        .closest('.js-toggle-container')
+          .find('.js-toggle-content')
+            .toggle()
+      ;
     });
-  });
 
-}).call(this);
+    // If we're accessing a permalink, ensure it is not inside a
+    // closed js-toggle-container!
+    var hash = w.gl.utils.getLocationHash();
+    var anchor = hash && document.getElementById(hash);
+    var container = anchor && $(anchor).closest('.js-toggle-container');
+
+    if (container && container.find('.js-toggle-content').is(':hidden')) {
+      container.find('.js-toggle-button').trigger('click');
+      anchor.scrollIntoView();
+    }
+  });
+})(window);
diff --git a/app/assets/javascripts/lib/utils/url_utility.js b/app/assets/javascripts/lib/utils/url_utility.js
index fffbfd19745d7887c2533f130ef3ecefb44a886e..533310cc87c22d88a863663d13698f1a64c1ef42 100644
--- a/app/assets/javascripts/lib/utils/url_utility.js
+++ b/app/assets/javascripts/lib/utils/url_utility.js
@@ -43,7 +43,7 @@
       }
       return newUrl;
     };
-    return w.gl.utils.removeParamQueryString = function(url, param) {
+    w.gl.utils.removeParamQueryString = function(url, param) {
       var urlVariables, variables;
       url = decodeURIComponent(url);
       urlVariables = url.split('&');
@@ -59,6 +59,16 @@
         return results;
       })()).join('&');
     };
+    w.gl.utils.getLocationHash = function(url) {
+      var hashIndex;
+      if (typeof url === 'undefined') {
+        // Note: We can't use window.location.hash here because it's
+        // not consistent across browsers - Firefox will pre-decode it
+        url = window.location.href;
+      }
+      hashIndex = url.indexOf('#');
+      return hashIndex === -1 ? null : url.substring(hashIndex + 1);
+    };
   })(window);
 
 }).call(this);