diff --git modules/simpletest/tests/form.test modules/simpletest/tests/form.test
index 7b00e8a..8388786 100644
--- modules/simpletest/tests/form.test
+++ modules/simpletest/tests/form.test
@@ -784,3 +784,69 @@ class FormsRebuildTestCase extends DrupalWebTestCase {
     $this->assertFieldById('edit-text-2', 'DEFAULT 2', t('A newly added textfield was initialized with its default value.'));
   }
 }
+
+
+/**
+ * Tests rebuilding of arbitrary forms by altering them.
+ */
+class FormsArbitraryRebuildTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Rebuild arbitrary forms',
+      'description' => 'Tests altering forms to be rebuilt so there are multiple steps.',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+    // Auto-create a field for testing.
+    $field = array(
+      'field_name' => 'test_multiple',
+      'type' => 'text',
+      'cardinality' => -1,
+      'translatable' => FALSE,
+    );
+    field_create_field($field);
+
+    $instance = array(
+      'object_type' => 'node',
+      'field_name' => 'test_multiple',
+      'bundle' => 'page',
+      'label' => 'Test a multiple valued field',
+      'widget' => array(
+        'type' => 'text_textfield',
+        'weight' => 0,
+      ),
+    );
+    field_create_instance($instance);
+  }
+
+  /**
+   * Tests a basic rebuild with the user registration form.
+   */
+  function testUserRegistrationRebuild() {
+    $edit = array(
+      'name' => 'foo',
+      'mail' => 'bar@example.com',
+    );
+    $this->drupalPost('user/register', $edit, 'Rebuild');
+    $this->assertText('Form rebuilt.');
+    $this->assertFieldByName('name', 'foo', 'Entered user name has been kept.');
+    $this->assertFieldByName('mail', 'bar@example.com', 'Entered mail address has been kept.');
+  }
+
+  /**
+   * Tests a rebuild caused by a multiple value field.
+   */
+  function testUserRegistrationMultipleField() {
+    $edit = array(
+      'name' => 'foo',
+      'mail' => 'bar@example.com',
+    );
+    $this->drupalPost('user/register', $edit, t('Add another item'), array('query' => array('field' => TRUE)));
+    $this->assertText('Test a multiple valued field', 'Form has been rebuilt.');
+    $this->assertFieldByName('name', 'foo', 'Entered user name has been kept.');
+    $this->assertFieldByName('mail', 'bar@example.com', 'Entered mail address has been kept.');
+  }
+}
diff --git modules/simpletest/tests/form_test.module modules/simpletest/tests/form_test.module
index 9b40232..4ae8b63 100644
--- modules/simpletest/tests/form_test.module
+++ modules/simpletest/tests/form_test.module
@@ -889,3 +889,30 @@ function form_test_form_form_test_state_persist_alter(&$form, &$form_state) {
     $form_state['cache'] = TRUE;
   }
 }
+
+
+/**
+ * Implements hook_form_FORM_ID_alter() for the registration form.
+ */
+function form_test_form_user_register_form_alter(&$form, &$form_state) {
+  $form['test_rebuild'] = array(
+    '#type' => 'submit',
+    '#value' => t('Rebuild'),
+    '#submit' => array('form_test_user_register_form_rebuild'),
+  );
+  // If requested, add the test field by attaching the node page form.
+  if (!empty($_REQUEST['field'])) {
+    $node = (object)array('type' => 'page');
+    field_attach_form('node', $node, $form, $form_state);
+    // The form API requires the builder function to set rebuilding, so do so.
+    $form['#builder_function'] = 'form_test_user_register_form_rebuild';
+  }
+}
+
+/**
+ * Submit callback that just lets the form rebuild.
+ */
+function form_test_user_register_form_rebuild($form, &$form_state) {
+  drupal_set_message('Form rebuilt.');
+  $form_state['rebuild'] = TRUE;
+}
