diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 011db8d..2d0bdf1 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -1684,6 +1684,30 @@ function theme_link($variables) {
 }
 
 /**
+ * Converts rendered sub-elements of #type 'links' into #items.
+ */
+function drupal_pre_render_links_real($elements) {
+  // Children need to be sorted, since this #pre_render runs before
+  // drupal_render() sorts the children.
+  foreach (element_children($elements, TRUE) as $key) {
+    // Pre-emptively check whether children will be rendered.
+    // Note that later adjustments to #printed or #access via #pre_render
+    // callbacks of children or other means are not taken into account and such
+    // elements will appear.
+    if (empty($elements[$key]['#printed']) && (!isset($elements[$key]['#access']) || $elements[$key]['#access'])) {
+      // Initialize rendered result property on each child.
+      $elements[$key]['#children'] = '';
+      // Store a pointer to rendered result in #items.
+      $elements['#items'][$key] = &$elements[$key]['#children'];
+    }
+  }
+  // @todo Remove this when https://drupal.org/node/1828536 is committed.
+  $elements['#type'] = $elements['#list_type'];
+
+  return $elements;
+}
+
+/**
  * Returns HTML for a set of links.
  *
  * @param $variables
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 54ae84b..0b3a042 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -545,6 +545,13 @@ function system_element_info() {
   $types['markup'] = array(
     '#markup' => '',
   );
+  $types['links'] = array(
+    '#pre_render' => array('drupal_pre_render_links_real'),
+    // Using a key to allow for easy access to add a theme sub-pattern.
+    '#theme_wrappers' => array('links' => 'item_list'),
+    '#list_type' => 'ul',
+    '#attributes' => array('class' => array('links', 'inline')),
+  );
   $types['link'] = array(
     '#pre_render' => array('drupal_pre_render_link'),
   );
