=== modified file 'modules/poll.module'
--- modules/poll.module	
+++ modules/poll.module	
@@ -137,22 +137,16 @@ function poll_form(&$node) {
     $node->choices = max(2, count($node->choice) ? count($node->choice) : 5);
   }
 
-  // User ticked 'need more choices'.
-  if ($_POST['edit']['morechoices']) {
-    $node->choices *= 2;
-  }
-
   // Poll choices
-  $opts = drupal_map_assoc(range(2, $node->choices * 2 + 5));
-  $form['choice'] = array('#type' => 'fieldset', '#title' => t('Choices'), '#prefix' => '<div class="poll-form">', '#suffix' => '</div>', '#tree' => TRUE);
-  for ($a = 0; $a < $node->choices; $a++) {
-    $form['choice'][$a]['chtext'] = array('#type' => 'textfield', '#title' => t('Choice %n', array('%n' => ($a + 1))), '#default_value' => $node->choice[$a]['chtext']);
-    if ($admin) {
-      $form['choice'][$a]['chvotes'] = array('#type' => 'textfield', '#title' => t('Votes for choice %n', array('%n' => ($a + 1))), '#default_value' => (int)$node->choice[$a]['chvotes'], '#size' => 5, '#maxlength' => 7);
-    }
+  $form['choices'] = array('#type' => 'hidden', '#default_value' => $node->choices);
+  // we use references because the value is not yet set
+  $num_choices = &$form['choices']['#value'];
+  $form['choice'] = array('#type' => 'fieldset', '#title' => t('Choices'), '#prefix' => '<div class="poll-form">', '#suffix' => '</div>');
+  $form['choice']['morechoices'] = array('#type' => 'checkbox', '#title' => t('Need more choices'), '#default_value' => 0, '#description' => t("If the amount of boxes above isn't enough, check this box and click the Preview button below to add some more."), '#process' => array('poll_node_form_morechoices' => array(&$num_choices)), '#weight' => 1);
+  $form['choice']['choice'] = array('#tree' => TRUE, '#weight' => 0, '#process' => array('poll_node_form_inject' => array($node->choice, &$num_choices)));
+  if ($admin) {
+    $form['choice']['choice']['#process']['poll_node_form_inject_admin'] = array($node->choice, &$num_choices);
   }
-  $form['choices'] = array('#type' => 'hidden', '#value' => $node->choices);
-  $form['morechoices'] = array('#type' => 'checkbox', '#title' => t('Need more choices'), '#default_value' => 0, '#description' => t("If the amount of boxes above isn't enough, check this box and click the Preview button below to add some more."));
 
   // Poll attributes
   $_duration = array(0 => t('Unlimited')) + drupal_map_assoc(array(86400, 172800, 345600, 604800, 1209600, 2419200, 4838400, 9676800, 31536000), "format_interval");
@@ -167,6 +161,29 @@ function poll_form(&$node) {
   return $form;
 }
 
+function poll_node_form_morechoices($form, $num_choices) {
+  // User ticked 'need more choices'.
+  if ($form['#value']) {
+    $num_choices *= 2;
+    $form['#value'] = 0;
+  }
+  return $form;
+}
+
+function poll_node_form_inject($form, $default_values, $num_choices) {
+  for ($a = 0; $a < $num_choices; $a++) {
+    $form[$a]['chtext'] = array('#type' => 'textfield', '#title' => t('Choice %n', array('%n' => ($a + 1))), '#default_value' => $default_values[$a]['chtext']);
+  }
+  return $form;
+}
+
+function poll_node_form_inject_admin($form, $default_values, $num_choices) {
+  for ($a = 0; $a < $num_choices; $a++) {
+    $form[$a]['chvotes'] = array('#type' => 'textfield', '#title' => t('Votes for choice %n', array('%n' => ($a + 1))), '#default_value' => $default_values[$a]['chvotes'], '#size' => 5, '#maxlength' => 7);
+  }
+  return $form;
+}
+
 function poll_insert($node) {
   if (!user_access('administer nodes')) {
     // Make sure all votes are 0 initially
