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..cf43d61
--- /dev/null
+++ b/core/lib/Drupal/Core/Page/CommandElement.php
@@ -0,0 +1,38 @@
+<?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 $href
+   * The base URL used throughout the document for relative URL addresses.
+   * @param string $target
+   *   The target of the command element.
+   */
+  public function __construct($href, $target = NULL) {
+    $this->attributes = array(
+      'type' => $type,
+      'label' => $label,
+      'icon' => $icon,
+      'onclick' => $onclick,
+    );
+  }
+
+}
+
diff --git a/core/lib/Drupal/Core/Page/HeadElement.php b/core/lib/Drupal/Core/Page/HeadElement.php
index 49c421d..b8078e1 100644
--- a/core/lib/Drupal/Core/Page/HeadElement.php
+++ b/core/lib/Drupal/Core/Page/HeadElement.php
@@ -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..a119dd4 100644
--- a/core/lib/Drupal/Core/Page/HtmlFragment.php
+++ b/core/lib/Drupal/Core/Page/HtmlFragment.php
@@ -20,18 +20,25 @@ class HtmlFragment implements CacheableInterface, HtmlFragmentInterface {
   /**
    * An array of Link elements.
    *
-   * @var array
+   * @var \Drupal\Core\Page\LinkElement[]
    */
   protected $links = array();
 
   /**
    * An array of Meta elements.
    *
-   * @var array
+   * @var \Drupal\Core\Page\MetaElement[]
    */
   protected $metatags = array();
 
   /**
+   * An array of other HEAD elements.
+   *
+   * @var \Drupal\Core\Page\HeadElement[]
+   */
+  protected $elements;
+
+  /**
    * HTML content string.
    *
    * @var string
@@ -68,6 +75,10 @@ public function __construct($content = '', array $cache_info = array()) {
       'max_age' => 0,
       'is_cacheable' => TRUE,
     );
+    $this->elements = [
+      'links' => [],
+      'metatags' => [],
+    ];
   }
 
   /**
@@ -79,7 +90,7 @@ public function __construct($content = '', array $cache_info = array()) {
    * @return $this
    */
   public function addLinkElement(LinkElement $link) {
-    $this->links[] = $link;
+    $this->elements['links'][] = $link;
     return $this;
   }
 
@@ -87,7 +98,7 @@ public function addLinkElement(LinkElement $link) {
    * {@inheritdoc}
    */
   public function &getLinkElements() {
-    return $this->links;
+    return $this->elements['links'];
   }
 
   /**
@@ -112,7 +123,7 @@ public function getFeedLinkElements() {
    * @return $this
    */
   public function addMetaElement(MetaElement $meta) {
-    $this->metatags[] = $meta;
+    $this->elements['metatags'][] = $meta;
     return $this;
   }
 
@@ -120,7 +131,30 @@ public function addMetaElement(MetaElement $meta) {
    * {@inheritdoc}
    */
   public function &getMetaElements() {
-    return $this->metatags;
+    return $this->elements['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->elements['other'] = $element;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function &getElements() {
+    $elements = array();
+    foreach ($this->elements 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()));
   }
 
   /**
