diff --git a/js/toolbar_menu.js b/js/toolbar_menu.js
new file mode 100644
index 0000000..e8bac33
--- /dev/null
+++ b/js/toolbar_menu.js
@@ -0,0 +1,14 @@
+/**
+ * @file
+ * Defines the behavior of the toolbar_menu module.
+ */
+
+(function ($, Drupal, drupalSettings) {
+
+    Drupal.behaviors.toolbar_menu = {
+        attach: function (context) {
+            $('.toolbar-menu').drupalToolbarMenu();
+        }
+    };
+
+}(jQuery, Drupal, drupalSettings));
diff --git a/src/ToolbarMenuManager.php b/src/ToolbarMenuManager.php
index 2bfb501..c7e4eb1 100644
--- a/src/ToolbarMenuManager.php
+++ b/src/ToolbarMenuManager.php
@@ -169,6 +169,19 @@ class ToolbarMenuManager {
   }
 
   /**
+   * Helper to clean an ID.
+   *
+   * @param string $id
+   *   The ID to clean.
+   *
+   * @return string
+   *   The cleaned ID.
+   */
+  public function cleanId($id) {
+    return preg_replace('/[^\p{L}\p{N}]/u', '-', $id);
+  }
+
+  /**
    * Load a menu tree.
    *
    * @param string $menu_name
diff --git a/src/ToolbarMenuMenuLinkTreeManipulators.php b/src/ToolbarMenuMenuLinkTreeManipulators.php
new file mode 100644
index 0000000..eee11c8
--- /dev/null
+++ b/src/ToolbarMenuMenuLinkTreeManipulators.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\toolbar_menu\ToolbarMenuMenuLinkTreeManipulators.
+ */
+
+namespace Drupal\toolbar_menu;
+
+/**
+ * Provides a couple of menu link tree manipulators.
+ *
+ * This class provides menu link tree manipulators to:
+ * - add icons on each toolbar menu entries
+ */
+class ToolbarMenuMenuLinkTreeManipulators {
+
+  protected $toolbarMenuManager;
+
+  /**
+   * Construct a new ToolbarMenuMenuLinkTreeManipulators.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_manager
+   *   The entity manager.
+   */
+  public function __construct(ToolbarMenuManager $toolbar_menu_manager) {
+    $this->toolbarMenuManager = $toolbar_menu_manager;
+  }
+
+  /**
+   * Add icons on each toolbar menu items.
+   *
+   * @param \Drupal\Core\Menu\MenuLinkTreeElement[] $tree
+   *   The menu link tree to manipulate.
+   *
+   * @return \Drupal\Core\Menu\MenuLinkTreeElement[]
+   *   The manipulated menu link tree.
+   */
+  function addIcons(array $tree) {
+    foreach ($tree as $element) {
+      $element->options['attributes']['class'][] = 'toolbar-icon';
+      $element->options['attributes']['class'][] = 'toolbar-icon-link-toolbar-menu';
+      $element->options['attributes']['class'][] = 'toolbar-icon-link-toolbar-menu-' . $this->toolbarMenuManager->cleanId($element->link->getPluginId());
+      $element->options['attributes']['title'] = $element->link->getTitle();
+    }
+    return $tree;
+  }
+}
\ No newline at end of file
diff --git a/toolbar_menu.libraries.yml b/toolbar_menu.libraries.yml
index 7e4dd70..848e2c4 100644
--- a/toolbar_menu.libraries.yml
+++ b/toolbar_menu.libraries.yml
@@ -1,4 +1,7 @@
 icons:
+  version: 1.3
+  js:
+    js/toolbar_menu.js: {}
   css:
     base:
       css/toolbar_menu.module.css: {}
diff --git a/toolbar_menu.module b/toolbar_menu.module
index 07c1908..f8fe038 100644
--- a/toolbar_menu.module
+++ b/toolbar_menu.module
@@ -5,6 +5,7 @@
  * Add menu entries in the Drupal Toolbar.
  */
 
+use Drupal\Core\Menu\MenuTreeParameters;
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Url;
 
@@ -49,23 +50,6 @@ function toolbar_menu_toolbar() {
   $toolbar_manager = \Drupal::service('toolbar_menu.manager');
 
   foreach ($toolbar_manager->getMenus() as $weight => $menu) {
-    $links = [];
-
-    foreach ($toolbar_manager->loadTree($menu->id()) as $tree) {
-      $links[$tree->link->getPluginId()] = array(
-        'title' => t('@link_title', ['@link_title' => $tree->link->getTitle()]),
-        'url' => Url::fromRoute($tree->link->getRouteName(), $tree->link->getRouteParameters()),
-        'attributes' => array(
-          'title' => t('@link_title', ['@link_title' => $tree->link->getTitle()]),
-          'class' => array(
-            'toolbar-icon',
-            'toolbar-icon-link-toolbar-menu',
-            'toolbar-icon-link-toolbar-menu-' . preg_replace('/[^\p{L}\p{N}]/u', '-', $tree->link->getPluginId()),
-          ),
-        ),
-      );
-    }
-
     $items['toolbar_menu_' . $menu->id()] = array(
       '#type' => 'toolbar_item',
       'tab' => array(
@@ -84,10 +68,11 @@ function toolbar_menu_toolbar() {
       'tray' => array(
         '#heading' => t('@menu_label actions', ['@menu_label' => $menu->label()]),
         'toolbar_menu_' . $menu->id() . '_links' => array(
-          '#theme' => 'links__toolbar_menu_' . $menu->id(),
-          '#links' => $links,
+          '#type' => 'container',
+          '#id' => $menu->id(),
+          '#pre_render' => ['toolbar_menu_prerender_toolbar_tray'],
           '#attributes' => array(
-            'class' => array('toolbar-menu'),
+            'class' => array('toolbar-menu-administration'),
           ),
         ),
       ),
@@ -104,3 +89,33 @@ function toolbar_menu_toolbar() {
   }
   return $items;
 }
+
+/**
+ * Pre-render the toolbar_menu tray element.
+ *
+ * @param array $element
+ *   The tray element to pre-render.
+ *
+ * @return array
+ *   The pre-rendered tray element.
+ */
+function toolbar_menu_prerender_toolbar_tray(array $element) {
+  /** @var \Drupal\toolbar\Menu\ToolbarMenuLinkTree $menu_tree */
+  $menu_tree = \Drupal::service('toolbar.menu_tree');
+
+  $parameters = new MenuTreeParameters();
+  $parameters->excludeRoot()->onlyEnabledLinks();
+
+  $tree = $menu_tree->load($element['#id'], $parameters);
+
+  $manipulators = array(
+    array('callable' => 'menu.default_tree_manipulators:checkAccess'),
+    array('callable' => 'menu.default_tree_manipulators:generateIndexAndSort'),
+    array('callable' => 'toolbar_menu.menu_link_tree_manipulators:addIcons'),
+  );
+  $tree = $menu_tree->transform($tree, $manipulators);
+
+  $element['toolbar_menu_' . $element['#id']] = $menu_tree->build($tree);
+
+  return $element;
+}
diff --git a/toolbar_menu.services.yml b/toolbar_menu.services.yml
index b7dea62..8656ce4 100644
--- a/toolbar_menu.services.yml
+++ b/toolbar_menu.services.yml
@@ -2,3 +2,7 @@ services:
   toolbar_menu.manager:
     class: Drupal\toolbar_menu\ToolbarMenuManager
     arguments: ['@entity.manager', '@menu.link_tree', '@config.factory', '@cache_tags.invalidator', '@current_user']
+
+  toolbar_menu.menu_link_tree_manipulators:
+    class: Drupal\toolbar_menu\ToolbarMenuMenuLinkTreeManipulators
+    arguments: ['@toolbar_menu.manager']
\ No newline at end of file
