diff --git includes/form.inc includes/form.inc
index 4013f14..da358ad 100644
--- includes/form.inc
+++ includes/form.inc
@@ -2002,10 +2002,10 @@ function theme_radio($variables) {
   $element = $variables['element'];
   _form_set_class($element, array('form-radio'));
   $output = '<input type="radio" ';
-  $output .= 'id="' . $element['#id'] . '" ';
-  $output .= 'name="' . $element['#name'] . '" ';
-  $output .= 'value="' . $element['#return_value'] . '" ';
-  $output .= (check_plain($element['#value']) == $element['#return_value']) ? ' checked="checked" ' : ' ';
+  $output .= empty($element['#id']) ? '' : 'id="' . $element['#id'] . '" ';
+  $output .= empty($element['#name']) ? '' : 'name="' . $element['#name'] . '" ';
+  $output .= empty($element['#return_value']) ? '' : 'value="' . $element['#return_value'] . '" ';
+  $output .= (isset($element['#return_value']) && isset($element['#value']) && check_plain($element['#value']) == $element['#return_value']) ? ' checked="checked" ' : ' ';
   $output .= drupal_attributes($element['#attributes']) . ' />';
 
   return $output;
@@ -2245,11 +2245,11 @@ function theme_checkbox($variables) {
   _form_set_class($element, array('form-checkbox'));
   $checkbox = '<input ';
   $checkbox .= 'type="checkbox" ';
-  $checkbox .= 'name="' . $element['#name'] . '" ';
-  $checkbox .= 'id="' . $element['#id'] . '" ' ;
-  $checkbox .= 'value="' . $element['#return_value'] . '" ';
+  $checkbox .= empty($element['#name']) ? '' : 'name="' . $element['#name'] . '" ';
+  $checkbox .= empty($element['#id']) ? '' : 'id="' . $element['#id'] . '" ' ;
+  $checkbox .= empty($element['#return_value']) ? '' : 'value="' . $element['#return_value'] . '" ';
   // Unchecked checkbox has #value of numeric 0.
-  if ($element['#value'] !== 0 && $element['#value'] == $element['#return_value']) {
+  if (isset($element['#return_value']) && isset($element['#value']) && $element['#value'] !== 0 && $element['#value'] == $element['#return_value']) {
     $checkbox .= 'checked="checked" ';
   }
   $checkbox .= drupal_attributes($element['#attributes']) . ' />';
@@ -2693,7 +2693,7 @@ function theme_button($variables) {
   $element = $variables['element'];
   $element['#attributes']['class'][] = 'form-' . $element['#button_type'];
 
-  return '<input type="submit" ' . (empty($element['#name']) ? '' : 'name="' . $element['#name'] . '" ') . 'id="' . $element['#id'] . '" value="' . check_plain($element['#value']) . '" ' . drupal_attributes($element['#attributes']) . " />\n";
+  return '<input type="submit" ' . (empty($element['#name']) ? '' : 'name="' . $element['#name'] . '" ') . (empty($element['#id']) ? '' : 'id="' . $element['#id'] . '" ') . 'value="' . check_plain($element['#value']) . '" ' . drupal_attributes($element['#attributes']) . " />\n";
 }
 
 /**
@@ -2736,7 +2736,7 @@ function theme_image_button($variables) {
  */
 function theme_hidden($variables) {
   $element = $variables['element'];
-  return '<input type="hidden" name="' . $element['#name'] . '" id="' . $element['#id'] . '" value="' . check_plain($element['#value']) . "\" " . drupal_attributes($element['#attributes']) . " />\n";
+  return '<input type="hidden" ' . (empty($element['#name']) ? '' : 'name="' . $element['#name'] . '" ') . (empty($element['#id']) ? '' : 'id="' . $element['#id'] . '" ') . 'value="' . check_plain($element['#value']) . "\" " . drupal_attributes($element['#attributes']) . " />\n";
 }
 
 /**
@@ -2768,7 +2768,7 @@ function theme_textfield($variables) {
   }
   _form_set_class($element, $class);
 
-  $output .= '<input type="text"' . $maxlength . ' name="' . $element['#name'] . '" id="' . $element['#id'] . '"' . $size . ' value="' . check_plain($element['#value']) . '"' . drupal_attributes($element['#attributes']) . ' />';
+  $output .= '<input type="text"' . $maxlength . (empty($element['#name']) ? '' : 'name="' . $element['#name'] . '" ') . (empty($element['#id']) ? '' : 'id="' . $element['#id'] . '"') . $size . ' value="' . check_plain($element['#value']) . '"' . drupal_attributes($element['#attributes']) . ' />';
 
   return $output . $extra;
 }
@@ -2823,7 +2823,7 @@ function theme_textarea($variables) {
   $output = '<div' . drupal_attributes($wrapper_attributes) . '>';
 
   _form_set_class($element, $class);
-  $output .= '<textarea cols="' . $element['#cols'] . '" rows="' . $element['#rows'] . '" name="' . $element['#name'] . '" id="' . $element['#id'] . '" ' . drupal_attributes($element['#attributes']) . '>' . check_plain($element['#value']) . '</textarea>';
+  $output .= '<textarea cols="' . $element['#cols'] . '" rows="' . $element['#rows'] . '" ' . (empty($element['#name']) ? '' : 'name="' . $element['#name'] . '" ') . (empty($element['#id']) ? '' : 'id="' . $element['#id'] . '" ') . drupal_attributes($element['#attributes']) . '>' . check_plain($element['#value']) . '</textarea>';
 
   $output .= '</div>';
   return $output;
@@ -2849,7 +2849,7 @@ function theme_password($variables) {
   $maxlength = $element['#maxlength'] ? ' maxlength="' . $element['#maxlength'] . '" ' : '';
 
   _form_set_class($element, array('form-text'));
-  $output = '<input type="password" name="' . $element['#name'] . '" id="' . $element['#id'] . '" ' . $maxlength . $size . drupal_attributes($element['#attributes']) . ' />';
+  $output = '<input type="password" ' . (empty($element['#name']) ? '' : 'name="' . $element['#name'] . '" ') . (empty($element['#id']) ? '' : 'id="' . $element['#id'] . '" ') . $maxlength . $size . drupal_attributes($element['#attributes']) . ' />';
   return $output;
 }
 
@@ -2887,7 +2887,7 @@ function form_process_weight($element) {
 function theme_file($variables) {
   $element = $variables['element'];
   _form_set_class($element, array('form-file'));
-  return '<input type="file" name="' . $element['#name'] . '"' . ($element['#attributes'] ? ' ' . drupal_attributes($element['#attributes']) : '') . ' id="' . $element['#id'] . '" size="' . $element['#size'] . "\" />\n";
+  return '<input type="file" ' . (empty($element['#name']) ? '' : 'name="' . $element['#name'] . '" ') . (empty($element['#id']) ? '' : 'id="' . $element['#id'] . '" ') . ($element['#attributes'] ? ' ' . drupal_attributes($element['#attributes']) : '') . ' size="' . $element['#size'] . "\" />\n";
 }
 
 /**
diff --git modules/simpletest/tests/common.test modules/simpletest/tests/common.test
index f5ca489..455a2d5 100644
--- modules/simpletest/tests/common.test
+++ modules/simpletest/tests/common.test
@@ -1361,6 +1361,90 @@ class DrupalRenderUnitTestCase extends DrupalWebTestCase {
     // Test that passing arguments to the theme function works.
     $this->assertEqual(drupal_render($element), $element['#foo'] . $element['#bar'], 'Passing arguments to theme functions works');
   }
+  
+  /**
+   * Test rendering form elements without passing through form_builder().
+   */
+  function testDrupalRenderFormElements() {
+    // Define a series of form elements.
+    $elements['button_test'] = array(
+      '#type' => 'button',
+      '#value' => $this->randomName(8),
+    );
+    $elements['textfield_test'] = array(
+      '#type' => 'textfield',
+      '#title' => $this->randomName(8),
+      '#value' => $this->randomName(8),
+    );
+    $elements['password_test'] = array(
+      '#type' => 'password',
+      '#title' => $this->randomName(8),
+    );
+    $elements['textarea_test'] = array(
+      '#type' => 'textarea',
+      '#title' => $this->randomName(8),
+      '#value' => $this->randomName(8),
+    );
+    $elements['radio_test'] = array(
+      '#type' => 'radio',
+      '#title' => $this->randomName(8),
+      '#value' => FALSE,
+    );
+    $elements['checkbox_test'] = array(
+      '#type' => 'checkbox',
+      '#title' => $this->randomName(8),
+    );
+    $elements['select_test'] = array(
+      '#type' => 'select',
+      '#title' => $this->randomName(8),
+      '#options' => array(0 => $this->randomName(8), 1 => $this->randomName(8)),
+    );
+    $elements['file_test'] = array(
+      '#type' => 'file',
+      '#title' => $this->randomName(8),
+    );
+    $elements['item_test'] = array(
+      '#type' => 'item',
+      '#title' => $this->randomName(8),
+      '#markup' => $this->randomName(8),
+    );
+    $elements['hidden_test'] = array(
+      '#type' => 'hidden',
+      '#value' => $this->randomName(8),
+    );
+    $elements['link_test'] = array(
+      '#type' => 'link',
+      '#title' => $this->randomName(8),
+      '#href' => $this->randomName(8),
+      '#options' => array('alias' => TRUE),
+    );
+    $elements['fieldset_test'] = array(
+      '#type' => 'fieldset',
+      '#title' => $this->randomName(8),
+    );
+    $elements['fieldset_test']['test_fieldset_item'] = array(
+      '#type' => 'item',
+      '#title' => $this->randomName(8),
+      '#markup' => $this->randomName(8),
+    );
+    // Render form elements into page content in order to use the assertField functions.
+    $this->drupalSetContent(drupal_render($elements));
+    
+    // Verify existence of all created form elements.
+    $this->assertFieldByXPath('//input[@type="submit"]', $elements['button_test']['#value'], 'Button was rendered properly.');
+    $this->assertFieldByXPath('//input[@type="text"]', $elements['textfield_test']['#value'], 'Textfield was rendered properly.');
+    $this->assertFieldByXPath('//input[@type="password"]', NULL, 'Password was rendered properly.');
+    $this->assertFieldByXPath('//textarea', $elements['textarea_test']['#value'], 'Textarea was rendered properly.');
+    $this->assertFieldByXPath('//input[@type="radio"]', 0, 'Radio button was rendered properly.');
+    $this->assertFieldByXPath('//input[@type="checkbox"]', 1, 'Checkbox was rendered properly.');
+    $this->assertFieldByXPath('//select', 0, 'Select box was rendered properly.');
+    $this->assertFieldByXPath('//input[@type="file"]', NULL, 'File field was rendered properly.');
+    $this->assertRaw('<label>' . $elements['item_test']['#title'] . " </label>\n " . $elements['item_test']['#markup'], 'Item was rendered properly.');
+    $this->assertFieldByXPath('//input[@type="hidden"]', $elements['hidden_test']['#value'], 'Hidden field was rendered properly.');
+    $this->assertRaw('<a href="'. url($elements['link_test']['#href']) .'">', 'Link was rendered properly.');
+    $this->assertRaw('<fieldset>', 'Fieldset was rendered properly.');
+    $this->assertRaw('<label>' . $elements['fieldset_test']['test_fieldset_item']['#title'] . " </label>\n " . $elements['fieldset_test']['test_fieldset_item']['#markup'], 'Item inside of fieldset was rendered properly.');
+  }
 }
 
 /**
diff --git modules/system/system.module modules/system/system.module
index 7f796a4..1673f92 100644
--- modules/system/system.module
+++ modules/system/system.module
@@ -285,6 +285,7 @@ function system_element_info() {
     '#list_type' => 'ul',
     '#attributes' => array(),
     '#items' => array(),
+    '#title_display' => 'before',
   );
   // By default, we don't want AJAX commands being rendered in the context of an
   // HTML page, so we don't provide defaults for #theme or #theme_wrappers.
@@ -343,6 +344,8 @@ function system_element_info() {
     '#process' => array('ajax_process_form'),
     '#theme' => 'textfield',
     '#theme_wrappers' => array('form_element'),
+    '#title_display' => 'before',
+    '#required' => FALSE,
   );
   $types['password'] = array(
     '#input' => TRUE,
@@ -351,6 +354,8 @@ function system_element_info() {
     '#process' => array('ajax_process_form'),
     '#theme' => 'password',
     '#theme_wrappers' => array('form_element'),
+    '#title_display' => 'before',
+    '#required' => FALSE,
   );
   $types['password_confirm'] = array(
     '#input' => TRUE,
@@ -365,6 +370,8 @@ function system_element_info() {
     '#process' => array('ajax_process_form'),
     '#theme' => 'textarea',
     '#theme_wrappers' => array('form_element'),
+    '#title_display' => 'before',
+    '#required' => FALSE,
   );
   $types['radios'] = array(
     '#input' => TRUE,
@@ -379,6 +386,7 @@ function system_element_info() {
     '#theme' => 'radio',
     '#theme_wrappers' => array('form_element'),
     '#title_display' => 'after',
+    '#required' => FALSE,
   );
   $types['checkboxes'] = array(
     '#input' => TRUE,
@@ -394,6 +402,7 @@ function system_element_info() {
     '#theme' => 'checkbox',
     '#theme_wrappers' => array('form_element'),
     '#title_display' => 'after',
+    '#required' => FALSE,
   );
   $types['select'] = array(
     '#input' => TRUE,
@@ -402,12 +411,16 @@ function system_element_info() {
     '#process' => array('ajax_process_form'),
     '#theme' => 'select',
     '#theme_wrappers' => array('form_element'),
+    '#title_display' => 'before',
+    '#required' => FALSE,
   );
   $types['weight'] = array(
     '#input' => TRUE,
     '#delta' => 10,
     '#default_value' => 0,
     '#process' => array('form_process_weight', 'ajax_process_form'),
+    '#title_display' => 'before',
+    '#required' => FALSE,
   );
   $types['date'] = array(
     '#input' => TRUE,
@@ -415,12 +428,16 @@ function system_element_info() {
     '#process' => array('form_process_date'),
     '#theme' => 'date',
     '#theme_wrappers' => array('form_element'),
+    '#title_display' => 'before',
+    '#required' => FALSE,
   );
   $types['file'] = array(
     '#input' => TRUE,
     '#size' => 60,
     '#theme' => 'file',
     '#theme_wrappers' => array('form_element'),
+    '#title_display' => 'before',
+    '#required' => FALSE,
   );
   $types['tableselect'] = array(
     '#input' => TRUE,
@@ -437,11 +454,13 @@ function system_element_info() {
     '#markup' => '',
     '#pre_render' => array('drupal_pre_render_markup'),
     '#theme_wrappers' => array('form_element'),
+    '#title_display' => 'before',
   );
   $types['hidden'] = array(
     '#input' => TRUE,
     '#process' => array('ajax_process_form'),
     '#theme' => 'hidden',
+    '#attributes' => array(),
   );
   $types['value'] = array(
     '#input' => TRUE,
@@ -460,6 +479,7 @@ function system_element_info() {
     '#process' => array('form_process_fieldset', 'ajax_process_form'),
     '#pre_render' => array('form_pre_render_fieldset'),
     '#theme_wrappers' => array('fieldset'),
+    '#attributes' => array(),
   );
   $types['vertical_tabs'] = array(
     '#theme_wrappers' => array('vertical_tabs'),
