diff --git a/core/includes/common.inc b/core/includes/common.inc
index e4c9505..bb597f2 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -325,7 +325,7 @@ function drupal_get_breadcrumb() {
  * @return
  *   An array of all stored HEAD elements.
  *
- * @see theme_html_tag()
+ * @see drupal_pre_render_html_tag()
  */
 function drupal_add_html_head($data = NULL, $key = NULL) {
   $stored_head = &drupal_static(__FUNCTION__);
@@ -4649,6 +4649,44 @@ function drupal_pre_render_conditional_comments($elements) {
 }
 
 /**
+ * Pre-render callback: Renders a generic HTML tag with attributes into #markup.
+ *
+ * @param array $element
+ *   An associative array containing:
+ *   - #tag: The tag name to output. Typical tags added to the HTML HEAD:
+ *     - meta: To provide meta information, such as a page refresh.
+ *     - link: To refer to stylesheets and other contextual information.
+ *     - script: To load JavaScript.
+ *   - #attributes: (optional) An array of HTML attributes to apply to the
+ *     tag.
+ *   - #value: (optional) A string containing tag content, such as inline
+ *     CSS.
+ *   - #value_prefix: (optional) A string to prepend to #value, e.g. a CDATA
+ *     wrapper prefix.
+ *   - #value_suffix: (optional) A string to append to #value, e.g. a CDATA
+ *     wrapper suffix.
+ */
+function drupal_pre_render_html_tag($element) {
+  $attributes = isset($element['#attributes']) ? new Attribute($element['#attributes']) : '';
+  if (!isset($element['#value'])) {
+    $markup = '<' . $element['#tag'] . $attributes . " />\n";
+  }
+  else {
+    $markup = '<' . $element['#tag'] . $attributes . '>';
+    if (isset($element['#value_prefix'])) {
+      $markup .= $element['#value_prefix'];
+    }
+    $markup .= $element['#value'];
+    if (isset($element['#value_suffix'])) {
+      $markup .= $element['#value_suffix'];
+    }
+    $markup .= '</' . $element['#tag'] . ">\n";
+  }
+  $element['#markup'] = $markup;
+  return $element;
+}
+
+/**
  * Pre-render callback: Renders a link into #markup.
  *
  * Doing so during pre_render gives modules a chance to alter the link parts.
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 70cce1e..a9dce6d 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -2412,45 +2412,6 @@ function theme_feed_icon($variables) {
 }
 
 /**
- * Returns HTML for a generic HTML tag with attributes.
- *
- * @param $variables
- *   An associative array containing:
- *   - element: An associative array describing the tag:
- *     - #tag: The tag name to output. Typical tags added to the HTML HEAD:
- *       - meta: To provide meta information, such as a page refresh.
- *       - link: To refer to stylesheets and other contextual information.
- *       - script: To load JavaScript.
- *     - #attributes: (optional) An array of HTML attributes to apply to the
- *       tag.
- *     - #value: (optional) A string containing tag content, such as inline
- *       CSS.
- *     - #value_prefix: (optional) A string to prepend to #value, e.g. a CDATA
- *       wrapper prefix.
- *     - #value_suffix: (optional) A string to append to #value, e.g. a CDATA
- *       wrapper suffix.
- */
-function theme_html_tag($variables) {
-  $element = $variables['element'];
-  $attributes = isset($element['#attributes']) ? new Attribute($element['#attributes']) : '';
-  if (!isset($element['#value'])) {
-    return '<' . $element['#tag'] . $attributes . " />\n";
-  }
-  else {
-    $output = '<' . $element['#tag'] . $attributes . '>';
-    if (isset($element['#value_prefix'])) {
-      $output .= $element['#value_prefix'];
-    }
-    $output .= $element['#value'];
-    if (isset($element['#value_suffix'])) {
-      $output .= $element['#value_suffix'];
-    }
-    $output .= '</' . $element['#tag'] . ">\n";
-    return $output;
-  }
-}
-
-/**
  * Returns HTML for a "more" link, like those used in blocks.
  *
  * @param $variables
@@ -3223,9 +3184,6 @@ function drupal_common_theme() {
     'indentation' => array(
       'variables' => array('size' => 1),
     ),
-    'html_tag' => array(
-      'render element' => 'element',
-    ),
     // From theme.maintenance.inc.
     'maintenance_page' => array(
       'variables' => array('content' => NULL, 'show_messages' => TRUE),
diff --git a/core/modules/config/config.admin.inc b/core/modules/config/config.admin.inc
index a961286..11033ec 100644
--- a/core/modules/config/config.admin.inc
+++ b/core/modules/config/config.admin.inc
@@ -59,7 +59,7 @@ function config_admin_sync_form(array &$form, array &$form_state, StorageInterfa
     // @todo A table caption would be more appropriate, but does not have the
     //   visual importance of a heading.
     $form[$config_change_type]['heading'] = array(
-      '#theme' => 'html_tag__h3',
+      '#type' => 'html_tag',
       '#tag' => 'h3',
     );
     switch ($config_change_type) {
diff --git a/core/modules/system/lib/Drupal/system/Tests/Common/HtmlTagTest.php b/core/modules/system/lib/Drupal/system/Tests/Common/HtmlTagTest.php
new file mode 100644
index 0000000..a08e87d
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Common/HtmlTagTest.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Tests\Common\HtmlTagTest.
+ */
+
+namespace Drupal\system\Tests\Common;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests for #type 'html_tag'.
+ */
+class HtmlTagTest extends WebTestBase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Render HTML tags',
+      'description' => 'Tests rendering of html_tag type renderable arrays.',
+      'group' => 'Common',
+    );
+  }
+
+  /**
+   * Tests #type 'html_tag'.
+   */
+  function testHtmlTag() {
+    // Test auto-closure meta tag generation.
+    $tag = array(
+      '#type' => 'html_tag',
+      '#tag' => 'meta',
+      '#attributes' => array(
+        'name' => 'description',
+        'content' => 'Drupal test',
+      ),
+    );
+    $this->assertEqual('<meta name="description" content="Drupal test" />' . "\n", drupal_render($tag), 'Test auto-closure meta tag generation.');
+
+    // Test title tag generation.
+    $tag = array(
+      '#type' => 'html_tag',
+      '#tag' => 'title',
+      '#value' => 'title test',
+    );
+    $this->assertEqual('<title>title test</title>' . "\n", drupal_render($tag), 'Test title tag generation.');
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/HtmlTagUnitTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/HtmlTagUnitTest.php
deleted file mode 100644
index b8c6ffb..0000000
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/HtmlTagUnitTest.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\system\Tests\Theme\HtmlTagUnitTest.
- */
-
-namespace Drupal\system\Tests\Theme;
-
-use Drupal\simpletest\UnitTestBase;
-
-/**
- * Unit tests for theme_html_tag().
- */
-class HtmlTagUnitTest extends UnitTestBase {
-  public static function getInfo() {
-    return array(
-      'name' => 'Theme HTML Tag',
-      'description' => 'Tests theme_html_tag() built-in theme functions.',
-      'group' => 'Theme',
-    );
-  }
-
-  /**
-   * Test function theme_html_tag()
-   */
-  function testThemeHtmlTag() {
-    // Test auto-closure meta tag generation
-    $tag['element'] = array('#tag' => 'meta', '#attributes' => array('name' => 'description', 'content' => 'Drupal test'));
-    $this->assertEqual('<meta name="description" content="Drupal test" />'."\n", theme_html_tag($tag), 'Test auto-closure meta tag generation.');
-
-    // Test title tag generation
-    $tag['element'] = array('#tag' => 'title', '#value' => 'title test');
-    $this->assertEqual('<title>title test</title>'."\n", theme_html_tag($tag), 'Test title tag generation.');
-  }
-}
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 54ae84b..6a41ea2 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -277,8 +277,7 @@ function system_element_info() {
     '#error' => NULL,
   );
   $types['html_tag'] = array(
-    '#theme' => 'html_tag',
-    '#pre_render' => array('drupal_pre_render_conditional_comments'),
+    '#pre_render' => array('drupal_pre_render_conditional_comments', 'drupal_pre_render_html_tag'),
     '#attributes' => array(),
     '#value' => NULL,
   );
