diff --git a/admin_toolbar_tools/admin_toolbar_tools.links.menu.yml b/admin_toolbar_tools/admin_toolbar_tools.links.menu.yml
index cb8cc25..69df35f 100644
--- a/admin_toolbar_tools/admin_toolbar_tools.links.menu.yml
+++ b/admin_toolbar_tools/admin_toolbar_tools.links.menu.yml
@@ -12,13 +12,6 @@ system.admin_index:
   parent: admin_toolbar_tools.help
   weight: -100
 
-system.run_cron:
-  title: 'Run cron'
-  route_name: admin_toolbar.run.cron
-  menu_name: admin
-  parent: admin_toolbar_tools.help
-  weight: -8
-
 system.db_update:
   title: 'Run updates'
   route_name: system.db_update
@@ -32,43 +25,6 @@ system.modules_uninstall:
   menu_name: admin
   parent: system.modules_list
 
-admin_toolbar_tools.flush:
-  title: 'Flush all caches'
-  route_name: admin_toolbar_tools.flush
-  weight: -9
-  parent: admin_toolbar_tools.help
-  menu_name: admin
-
-admin_toolbar_tools.cssjs:
-  title: 'Flush CSS and Javascript'
-  route_name: admin_toolbar_tools.cssjs
-  parent: admin_toolbar_tools.flush
-  menu_name: admin
-
-admin_toolbar_tools.plugin:
-  title: 'Flush plugins cache'
-  route_name: admin_toolbar_tools.plugin
-  parent: admin_toolbar_tools.flush
-  menu_name: admin
-
-admin_toolbar_tools.flush_static:
-  title: 'Flush static cache'
-  route_name: admin_toolbar_tools.flush_static
-  parent: admin_toolbar_tools.flush
-  menu_name: admin
-
-admin_toolbar_tools.flush_menu:
-  title: 'Flush routing and links cache'
-  route_name: admin_toolbar_tools.flush_menu
-  parent: admin_toolbar_tools.flush
-  menu_name: admin
-
-admin_toolbar_tools.flush_rendercache:
-  title: 'Flush render cache'
-  route_name: admin_toolbar_tools.flush_rendercache
-  parent: admin_toolbar_tools.flush
-  menu_name: admin
-
 admin_toolbar_tools.drupalorg:
   title: 'Drupal.org'
   weight: -5
diff --git a/admin_toolbar_tools/admin_toolbar_tools.module b/admin_toolbar_tools/admin_toolbar_tools.module
index 644fa6d..3a946a5 100644
--- a/admin_toolbar_tools/admin_toolbar_tools.module
+++ b/admin_toolbar_tools/admin_toolbar_tools.module
@@ -29,6 +29,17 @@ function admin_toolbar_tools_toolbar() {
 }
 
 /**
+ * Implements hook_toolbar_alter().
+ */
+function admin_toolbar_tools_toolbar_alter(&$items) {
+  // Use lazybuilder for links so the page is cacheable.
+  $items['administration']['tray']['toolbar_administration'] = [
+    '#lazy_builder' => ['admin_toolbar_tools.toolbar_handler:lazyBuilder', []],
+    '#create_placeholder' => TRUE,
+  ];
+}
+
+/**
  * Implements hook_help().
  */
 function admin_toolbar_tools_help($route_name, RouteMatchInterface $route_match) {
@@ -77,16 +88,6 @@ function admin_toolbar_tools_menu_links_discovered_alter(&$links) {
     }
   }
 
-  // Adding a menu link to clean the Views cache.
-  if ($moduleHandler->moduleExists('views')) {
-    $links['admin_toolbar_tools.flush_views'] = [
-      'title' => t('Flush views cache'),
-      'route_name' => 'admin_toolbar_tools.flush_views',
-      'menu_name' => 'admin',
-      'parent' => 'admin_toolbar_tools.flush',
-    ];
-  }
-
   // Adds common links to entities.
   foreach ($content_entities as $module_name => $entities) {
     $content_entity_bundle = $entities['content_entity_bundle'];
diff --git a/admin_toolbar_tools/admin_toolbar_tools.services.yml b/admin_toolbar_tools/admin_toolbar_tools.services.yml
new file mode 100644
index 0000000..1343ef7
--- /dev/null
+++ b/admin_toolbar_tools/admin_toolbar_tools.services.yml
@@ -0,0 +1,4 @@
+services:
+  admin_toolbar_tools.toolbar_handler:
+    class: Drupal\admin_toolbar_tools\ToolbarHandler
+    arguments: ['@module_handler']
diff --git a/admin_toolbar_tools/src/Tests/AdminToolbarToolsAlterTest.php b/admin_toolbar_tools/src/Tests/AdminToolbarToolsAlterTest.php
index 73035ef..6c46491 100644
--- a/admin_toolbar_tools/src/Tests/AdminToolbarToolsAlterTest.php
+++ b/admin_toolbar_tools/src/Tests/AdminToolbarToolsAlterTest.php
@@ -44,7 +44,7 @@ class AdminToolbarToolsAlterTest extends WebTestBase {
    */
   public function testAdminToolbarTools() {
     // Assert that special menu items are present in the HTML.
-    $this->assertRaw('class="toolbar-icon toolbar-icon-admin-toolbar-tools-flush"');
+    $this->assertRaw('class="toolbar-icon toolbar-icon-admin-toolbar-tools-help"');
   }
 
 }
diff --git a/admin_toolbar_tools/src/ToolbarHandler.php b/admin_toolbar_tools/src/ToolbarHandler.php
new file mode 100644
index 0000000..6f513af
--- /dev/null
+++ b/admin_toolbar_tools/src/ToolbarHandler.php
@@ -0,0 +1,133 @@
+<?php
+
+namespace Drupal\admin_toolbar_tools;
+
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\Core\Extension\ModuleHandler;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\Core\Template\Attribute;
+use Drupal\Core\Url;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Toolbar integration handler.
+ */
+class ToolbarHandler implements ContainerInjectionInterface {
+
+  use StringTranslationTrait;
+
+  /**
+   * The module service.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandler
+   */
+  protected $moduleHandler;
+
+  /**
+   * ToolbarHandler constructor.
+   *
+   * @param \Drupal\Core\Extension\ModuleHandler $module_handler
+   *   The module service.
+   */
+  public function __construct(ModuleHandler $module_handler) {
+    $this->moduleHandler = $module_handler;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('module_handler')
+    );
+  }
+
+  /**
+   * Lazy builder callback for the admin_toolbar_tool items.
+   *
+   * @return array
+   *   A renderable array as expected by the renderer service.
+   */
+  public function lazyBuilder() {
+    // Render the pre_render callback we disabled earlier.
+    $build = admin_toolbar_prerender_toolbar_administration_tray([]);
+
+    // Add links that are uncacheable.
+    // Core toolbar module calculates cachability in advance so we have to build
+    // a fake menu tree here, including access checks.
+    $tools_menu = &$build['administration_menu']['#items']['admin_toolbar_tools.help']['below'];
+
+    // Adding the 'Flush all caches' menu in the correct place.
+    $menu_render_array = $this->createMenuRenderArray('admin_toolbar_tools.flush', $this->t('Flush all caches'), TRUE);
+    $this->arrayInsert($tools_menu, 1, $menu_render_array);
+
+    // Adding the submenus to 'Flush all caches' menu.
+    $tools_sub_menu = &$tools_menu['admin_toolbar_tools.flush']['below'];
+    $tools_sub_menu += $this->createMenuRenderArray('admin_toolbar_tools.cssjs', $this->t('Flush CSS and Javascript'));
+    $tools_sub_menu += $this->createMenuRenderArray('admin_toolbar_tools.plugin', $this->t('Flush plugins cache'));
+    $tools_sub_menu += $this->createMenuRenderArray('admin_toolbar_tools.flush_static', $this->t('Flush static cache'));
+    $tools_sub_menu += $this->createMenuRenderArray('admin_toolbar_tools.flush_menu', $this->t('Flush routing and links  cache'));
+    $tools_sub_menu += $this->createMenuRenderArray('admin_toolbar_tools.flush_rendercache', $this->t('Flush render cache'));
+
+    // Adding a menu link to clean the Views cache.
+    if ($this->moduleHandler->moduleExists('views')) {
+      $tools_sub_menu += $this->createMenuRenderArray('admin_toolbar_tools.flush_views', $this->t('Flush views cache'));
+    }
+
+    // Adding the 'Run Cron' menu in the correct place.
+    $menu_render_array = $this->createMenuRenderArray('system.run_cron', $this->t('Run cron'));
+    $this->arrayInsert($tools_menu, 3, $menu_render_array);
+
+    return $build;
+  }
+
+  /**
+   * Create the menu render array.
+   *
+   * @param string $route
+   *    The route.
+   * @param string $title
+   *    The menu title.
+   * @param bool $submenu
+   *    Specify if the current menu element have a submenu.
+   *
+   * @return array
+   *   A renderable array as expected by the renderer service.
+   */
+  private function createMenuRenderArray($route, $title, $submenu = FALSE) {
+    $data = [];
+    $url = Url::fromRoute($route);
+    if ($url->access()) {
+      $data[$route] = [
+        'title' => $title,
+        'url' => $url,
+        'attributes' => new Attribute(['class' => ['menu-item'] + ($submenu ? ['menu-item--expanded'] : [])]),
+      ];
+      if ($submenu) {
+        $data[$route]['below'] = [];
+        $data[$route]['is_expanded'] = TRUE;
+      }
+    }
+    return $data;
+  }
+
+  /**
+   * Insert an array in a given position of another array.
+   *
+   * @param array $array
+   *    The array where we need to insert new elements.
+   * @param int $position
+   *    The position where we will add the new array.
+   * @param array $insert_array
+   *    The array that will be inserted.
+   *
+   * @see http://php.net/manual/en/function.array-splice.php#56794
+   */
+  private function arrayInsert(array &$array, $position, array $insert_array) {
+    // Getting the first part of the array.
+    $first_array = array_splice($array, 0, $position);
+    // Inserting the new part in the desired position.
+    $array = array_merge($first_array, $insert_array, $array);
+  }
+
+}
