diff --git a/includes/theme.inc b/includes/theme.inc
index bea87c0..e64200e 100644
--- a/includes/theme.inc
+++ b/includes/theme.inc
@@ -1510,6 +1510,31 @@ 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'];
+    }
+  }
+  // 'type' is most probably the most stupid theme variable ever.
+  // @todo Fix theme_item_list() to use 'tag' instead of 'type'.
+  $elements['#type'] = $elements['#tag'];
+
+  return $elements;
+}
+
+/**
  * Returns HTML for a set of links.
  *
  * @param $variables
diff --git a/modules/node/node.module b/modules/node/node.module
index 0c3cfb7..aff68d6 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -2590,6 +2590,26 @@ function node_page_default() {
       '#prefix' => '<div id="first-time">',
       '#suffix' => '</div>',
     );
+    $build['links'] = array(
+      '#type' => 'links',
+    );
+    $build['links']['foo'] = array(
+      '#type' => 'link',
+      '#title' => t('Foo (last)'),
+      '#href' => 'foo',
+      '#weight' => 10,
+    );
+    $build['links']['denied'] = array(
+      '#type' => 'link',
+      '#title' => t('Access Denied'),
+      '#href' => 'user',
+      '#access' => FALSE,
+    );
+    $build['links']['bar'] = array(
+      '#type' => 'link',
+      '#title' => t('Bar'),
+      '#href' => 'bar',
+    );
   }
   return $build;
 }
diff --git a/modules/system/system.module b/modules/system/system.module
index 0ef688e..8302edd 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -471,6 +471,13 @@ function system_element_info() {
     '#markup' => '',
     '#pre_render' => array('drupal_pre_render_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'),
+    '#tag' => 'ul',
+    '#attributes' => array('class' => array('links', 'inline')),
+  );
   $types['link'] = array(
     '#pre_render' => array('drupal_pre_render_link', 'drupal_pre_render_markup'),
   );
