I am trying to insert the languageswitcher block and login block into the menu. So basically I am after inserting custom html into menu or change the html of a menu link. Looks like the best place to do this is `hook_preprocess_menu()`. A dirty workaround is adding it under a desired menu item by finding that item with a condition check. But there should be a more "Drupal way" of doing it. In Drupal 7, AFAIR, I could set the whole html of a menu item. But as you can see in the following `kint()` output, I couldn't find room to do that. [![enter image description here][1]][1] Here is my workaround: function mytheme_preprocess_menu(&$variables) { if (isset($variables['menu_name']) && $variables['menu_name'] == 'main') { foreach ($variables['items'] as &$item) { $attributes = $item['url']->getOption('attributes'); if (isset($attributes['class']) && in_array('locale', $attributes['class'])) { if ($block = \Drupal\block\Entity\Block::load('languageswitcher')) { $copy = $item; $item['is_expanded'] = true; $copy['locale'] = \Drupal::entityTypeManager() ->getViewBuilder('block') ->view($block); $item['below'][] = $copy; } } } } } The condition I check here is a class I added with the [menu_link_attributes][2] module. Then I print it in `menu--main.html.twig`. I am using a Bootsrap submenu and putting here the whole code for reference: {% import _self as menus %} {# We call a macro which calls itself to render the full tree. @see http://twig.sensiolabs.org/doc/tags/macro.html #} {{ menus.menu_links(items, attributes, 0) }} {% macro menu_links(items, attributes, menu_level) %} {% import _self as menus %} {% if items %} {% if menu_level == 0 %} <ul{{ attributes.addClass('menu', 'nav', 'navbar-nav') }}> {% else %} <ul{{ attributes.addClass('dropdown-menu') }}> {% endif %} {% for item in items %} {% set item_classes = [ item.is_expanded? 'expanded', item.is_expanded and menu_level == 0 ? 'dropdown', item.in_active_trail ? 'active', ] %} {% if menu_level == 0 and item.is_expanded %} <li{{ item.attributes.addClass(item_classes) }}> <a href="{{ item.url }}" class="dropdown-toggle" data-target="#" data-toggle="dropdown">{{ item.title }} <span class="caret"></span></a> {% elseif item.locale %} {{ item.locale }} {% else %} <li{{ item.attributes.addClass(item_classes) }}> {{ link(item.title, item.url) }} {% endif %} {% if item.below %} {{ menus.menu_links(item.below, attributes.removeClass('nav', 'navbar-nav'), menu_level + 1) }} {% endif %} </li> {% endfor %} </ul> {% endif %} {% endmacro %} So the actual question is, what is the Drupal way of doing this? [1]: https://i.sstatic.net/VYfJF.png [2]: http://drupal.org/project/menu_link_attributes