diff --git a/core/lib/Drupal/Core/Page/BaseElement.php b/core/lib/Drupal/Core/Page/BaseElement.php
new file mode 100644
index 0000000..005e0bc
--- /dev/null
+++ b/core/lib/Drupal/Core/Page/BaseElement.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Page\BaseElement.
+ */
+
+namespace Drupal\Core\Page;
+
+/**
+ * Defines a base HTML head element.
+ */
+class BaseElement extends HeadElement {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $element = 'base';
+
+  /**
+   * Constructs a new BaseElement.
+   *
+   * @param string $href
+   * The base URL used throughout the document for relative URL addresses.
+   * @param string $target
+   *   The target of the base element.
+   */
+  public function __construct($href, $target = NULL) {
+    $this->attributes = array(
+      'href' => $href,
+      'target' => $target,
+    );
+  }
+
+}
+
diff --git a/core/lib/Drupal/Core/Page/CommandElement.php b/core/lib/Drupal/Core/Page/CommandElement.php
new file mode 100644
index 0000000..b50612d
--- /dev/null
+++ b/core/lib/Drupal/Core/Page/CommandElement.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Page\CommandElement.
+ */
+
+namespace Drupal\Core\Page;
+
+/**
+ * Defines a command HTML head element.
+ */
+class CommandElement extends HeadElement {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $element = 'command';
+
+  /**
+   * Constructs a new CommandElement.
+   *
+   * @param string type
+   *   The command type.
+   * @param string label
+   *   The label of the command element.
+   * @param string icon
+   *   The URI to the icon that represents the command element.
+   */
+  public function __construct($href, $target = NULL) {
+    $this->attributes = array(
+      'type' => 'command',
+      'label' => '',
+      'icon' => '',
+    );
+  }
+
+}
+
diff --git a/core/lib/Drupal/Core/Page/HeadElement.php b/core/lib/Drupal/Core/Page/HeadElement.php
index 49c421d..9192a46 100644
--- a/core/lib/Drupal/Core/Page/HeadElement.php
+++ b/core/lib/Drupal/Core/Page/HeadElement.php
@@ -15,7 +15,7 @@
  *
  * @see template_preprocess_html()
  */
-class HeadElement {
+abstract class HeadElement {
 
   /**
    * An array of attributes for this element.
@@ -34,6 +34,11 @@ class HeadElement {
   protected $element = '';
 
   /**
+   * The value of the HTML element.
+   */
+  protected $value;
+
+  /**
    * If this element should be wrapped in <noscript>.
    *
    * @var bool
@@ -51,7 +56,12 @@ public function __toString() {
     $attributes = new Attribute($this->attributes);
     $rendered = (string) $attributes;
 
-    $string = "<{$this->element}{$rendered} />";
+    if (empty($this->value)) {
+      $string = "<{$this->element}{$rendered} />";
+    }
+    else {
+      $string = "<{$this->element}{$rendered}>{$this->value}</{$this->element}>";
+    }
     if ($this->noScript) {
       $string = "<noscript>$string</noscript>";
     }
diff --git a/core/lib/Drupal/Core/Page/HtmlFragment.php b/core/lib/Drupal/Core/Page/HtmlFragment.php
index a4e0e29..f98e1dd 100644
--- a/core/lib/Drupal/Core/Page/HtmlFragment.php
+++ b/core/lib/Drupal/Core/Page/HtmlFragment.php
@@ -18,18 +18,11 @@
 class HtmlFragment implements CacheableInterface, HtmlFragmentInterface {
 
   /**
-   * An array of Link elements.
+   * An array of the HEAD elements.
    *
-   * @var array
-   */
-  protected $links = array();
-
-  /**
-   * An array of Meta elements.
-   *
-   * @var array
+   * @var \Drupal\Core\Page\HeadElement[][]
    */
-  protected $metatags = array();
+  protected $headElements;
 
   /**
    * HTML content string.
@@ -68,6 +61,10 @@ public function __construct($content = '', array $cache_info = array()) {
       'max_age' => 0,
       'is_cacheable' => TRUE,
     );
+    $this->headElements = [
+      'links' => [],
+      'metatags' => [],
+    ];
   }
 
   /**
@@ -79,7 +76,7 @@ public function __construct($content = '', array $cache_info = array()) {
    * @return $this
    */
   public function addLinkElement(LinkElement $link) {
-    $this->links[] = $link;
+    $this->headElements['links'][] = $link;
     return $this;
   }
 
@@ -87,7 +84,7 @@ public function addLinkElement(LinkElement $link) {
    * {@inheritdoc}
    */
   public function &getLinkElements() {
-    return $this->links;
+    return $this->headElements['links'];
   }
 
   /**
@@ -95,10 +92,12 @@ public function &getLinkElements() {
    */
   public function getFeedLinkElements() {
     $feed_links = array();
-    foreach ($this->links as $link) {
-      if ($link instanceof FeedLinkElement) {
+    if (isset($this->headElements['links'])) {
+      foreach ((array) $this->headElements['links'] as $link) {
+        if ($link instanceof FeedLinkElement) {
         $feed_links[] = $link;
       }
+     }
     }
     return $feed_links;
   }
@@ -112,7 +111,7 @@ public function getFeedLinkElements() {
    * @return $this
    */
   public function addMetaElement(MetaElement $meta) {
-    $this->metatags[] = $meta;
+    $this->headElements['metatags'][] = $meta;
     return $this;
   }
 
@@ -120,7 +119,30 @@ public function addMetaElement(MetaElement $meta) {
    * {@inheritdoc}
    */
   public function &getMetaElements() {
-    return $this->metatags;
+    return $this->headElements['metatags'];
+  }
+
+  /**
+   * Adds a new HEAD element to the page.
+   *
+   * @param \Drupal\Core\Page\HeadElement $element
+   *   A head element to add.
+   *
+   * @return $this
+   */
+  public function addElement(HeadElement $element) {
+    $this->headElements['other'] = $element;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function &getElements() {
+    $elements = array();
+    foreach ($this->headElements as $type_elements) {
+      $elements = array_merge($elements, $type_elements);
+    }
+    return $elements;
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Page/HtmlFragmentInterface.php b/core/lib/Drupal/Core/Page/HtmlFragmentInterface.php
index f9c481b..5ca94b5 100644
--- a/core/lib/Drupal/Core/Page/HtmlFragmentInterface.php
+++ b/core/lib/Drupal/Core/Page/HtmlFragmentInterface.php
@@ -63,4 +63,11 @@ public function getFeedLinkElements();
    */
   public function getMetaElements();
 
+  /**
+   * Returns an array of all HEAD elements.
+   *
+   * @return \Drupal\Core\Page\HeadElement[]
+   */
+  public function getElements();
+
 }
diff --git a/core/lib/Drupal/Core/Page/HtmlPage.php b/core/lib/Drupal/Core/Page/HtmlPage.php
index e6c75f2..557e71c 100644
--- a/core/lib/Drupal/Core/Page/HtmlPage.php
+++ b/core/lib/Drupal/Core/Page/HtmlPage.php
@@ -85,10 +85,9 @@ public function getHtmlAttributes() {
    *   A string of meta and link tags.
    */
   public function getHead() {
-    // Each MetaElement or LinkElement is a subclass of
-    // \Drupal\Core\Page\HeadElement and generates safe output when __toString()
+    // Each \Drupal\Core\Page\HeadElement generates safe output when __toString()
     // is called on it. Thus, the whole concatenation is also safe.
-    return SafeMarkup::set(implode("\n", $this->getMetaElements()) . implode("\n", $this->getLinkElements()));
+    return SafeMarkup::set(implode("\n", $this->getElements()));
   }
 
   /**
