diff --git a/.jshintrc b/.jshintrc
index 3460a97..385705e 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -12,6 +12,7 @@
   "predef"    : [
     "Drupal",
     "drupalSettings",
+    "Modernizr",
     "jQuery",
     "_",
     "matchMedia",
diff --git a/core/misc/collapse.js b/core/misc/collapse.js
index 0765412..a408c51 100644
--- a/core/misc/collapse.js
+++ b/core/misc/collapse.js
@@ -1,43 +1,8 @@
-(function ($, Drupal) {
+(function ($, Modernizr, Drupal) {
 
 "use strict";
 
 /**
- * Details feature detection.
- *
- * @todo This is a stop-gap fix only. collapse.js needs to be replaced with a
- *   proper HTML5 details polyfill.
- *
- * @author Mathias Bynens
- * @see http://mathiasbynens.be/notes/html5-details-jquery
- */
-var isDetailsSupported = (function (doc) {
-  var el = doc.createElement('details'),
-      fake,
-      root,
-      diff;
-  if (!('open' in el)) {
-    return false;
-  }
-  root = doc.body || (function () {
-    var de = doc.documentElement;
-    fake = true;
-    return de.insertBefore(doc.createElement('body'), de.firstElementChild || de.firstChild);
-  }());
-  el.innerHTML = '<summary>a</summary>b';
-  el.style.display = 'block';
-  root.appendChild(el);
-  diff = el.offsetHeight;
-  el.open = true;
-  diff = diff !== el.offsetHeight;
-  root.removeChild(el);
-  if (fake) {
-    root.parentNode.removeChild(root);
-  }
-  return diff;
-}(document));
-
-/**
  * The collapsible details object represents a single collapsible details element.
  */
 function CollapsibleDetails(node, settings) {
@@ -130,7 +95,7 @@ $.extend(CollapsibleDetails.prototype, {
     if (this.animating) {
       return;
     }
-    if (!this.$node.prop('open')) {
+    if (!this.$node.attr('open')) {
       var $content = this.$node.find('> .details-wrapper').hide();
       this.$node
         .trigger({ type:'collapsed', value:false })
@@ -154,7 +119,7 @@ $.extend(CollapsibleDetails.prototype, {
    * Completed opening details element.
    */
   onCompleteSlideDown: function () {
-    this.$node.prop('open', true);
+    this.$node.attr('open', true);
     this.$node.trigger('completeSlideDown');
     this.animating = false;
   },
@@ -162,7 +127,7 @@ $.extend(CollapsibleDetails.prototype, {
    * Completed closing details element.
    */
   onCompleteSlideUp: function () {
-    this.$node.prop('open', false);
+    this.$node.attr('open', false);
     this.$node
       .find('> summary span.details-summary-prefix').html(Drupal.t('Show'));
     this.$node.trigger('completeSlideUp');
@@ -172,7 +137,7 @@ $.extend(CollapsibleDetails.prototype, {
 
 Drupal.behaviors.collapse = {
   attach: function (context, settings) {
-    if (isDetailsSupported) {
+    if (Modernizr.details) {
       return;
     }
     var $collapsibleDetails = $(context).find('details').once('collapse');
@@ -187,4 +152,4 @@ Drupal.behaviors.collapse = {
 // Expose constructor in the public space.
 Drupal.CollapsibleDetails = CollapsibleDetails;
 
-})(jQuery, Drupal);
+})(jQuery, Modernizr, Drupal);
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index eee53b1..db4ae16 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -1395,10 +1395,11 @@ function system_library_info() {
     ),
     'dependencies' => array(
       array('system', 'jquery'),
+      array('system', 'modernizr'),
       array('system', 'drupal'),
-      array('system', 'drupalSettings'),
       // collapse.js relies on drupalGetSummary in form.js
       array('system', 'drupal.form'),
+      array('system', 'jquery.once'),
     ),
   );
 
