diff --git a/devel.module b/devel.module
index 6e635573b344736219fd2e163aff97aa53f25c10..fe853489fd94f9e52e49a69bdfd342943c83f55f 100644
--- a/devel.module
+++ b/devel.module
@@ -327,12 +327,24 @@ function devel_set_message($msg, $type = NULL) {
 }
 
 /**
+ * Implements hook_library_info().
+ */
+function devel_library_info() {
+  $libraries['krumo_path'] = array(
+    'js' => array(
+      drupal_get_path('module', 'devel') . '/js/devel_krumo_path.js',
+    ),
+  );
+
+  return $libraries;
+}
+
+/**
  * Returns boolean. No need for cache here.
  */
 function has_krumo() {
   @include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'devel') . '/krumo/class.krumo.php';
   if (function_exists('krumo') && !drupal_is_cli()) {
-    drupal_add_js(drupal_get_path('module', 'devel') . '/js/devel_krumo_path.js');
     return TRUE;
   }
   return FALSE;
@@ -822,8 +834,14 @@ function devel_shutdown() {
  * Implements hook_page_alter().
  */
 function devel_page_alter($page) {
-  if (config('devel.settings')->get('page_alter') && user_access('access devel information')) {
-    dpm($page, 'page');
+  if (user_access('access devel information')) {
+    if (config('devel.settings')->get('page_alter')) {
+      dpm($page, 'page');
+    }
+
+    if (!devel_silent()) {
+      $page['#attached']['library'][] = array('devel', 'krumo_path');
+    }
   }
 }
 
diff --git a/devel_node_access/devel_node_access.module b/devel_node_access/devel_node_access.module
index f67e57687b4565f6ca11cf48a2e00881d6e09586..71cdd200a3293fe849c3ec1c2f2a9ea44fd735f9 100644
--- a/devel_node_access/devel_node_access.module
+++ b/devel_node_access/devel_node_access.module
@@ -144,6 +144,21 @@ function devel_node_access_form_alter(&$form, $form_state, $form_id) {
 }
 
 /**
+ * Implements hook_library_info().
+ */
+function devel_node_access_library_info() {
+  $path = drupal_get_path('module', 'devel_node_access');
+
+  $libraries['node_access'] = array(
+    'js' => array(
+      $path . '/devel_node_access.js',
+    ),
+  );
+
+  return $libraries;
+}
+
+/**
  * Builds the DNA Summary page.
  */
 function dna_summary() {
diff --git a/devel_node_access/lib/Drupal/devel_node_access/Plugin/Block/DnaUser.php b/devel_node_access/lib/Drupal/devel_node_access/Plugin/Block/DnaUser.php
index 8c30f2ea4ea54333fe518db2c1486de717d689ca..ef81d901222136aa8dbcfa9b1c5672ebd746e4c5 100644
--- a/devel_node_access/lib/Drupal/devel_node_access/Plugin/Block/DnaUser.php
+++ b/devel_node_access/lib/Drupal/devel_node_access/Plugin/Block/DnaUser.php
@@ -72,7 +72,7 @@ class DnaUser extends DnaBlockBase {
       $rows = array();
       // Determine whether to use Ajax or pre-populate the tables.
       if ($ajax = config('devel_node_access.settings')->get('user_ajax')) {
-        drupal_add_js(drupal_get_path('module', 'devel_node_access') . '/devel_node_access.js');
+        $output['#attached']['library'][] = array('devel_node_access', 'node_access');
       }
       // Find all users. The following operations are very inefficient, so we
       // limit the number of users returned.  It would be better to make a
