diff --git a/salsa_commerce.module b/salsa_commerce.module
index 1ecb708..c7a786a 100644
--- a/salsa_commerce.module
+++ b/salsa_commerce.module
@@ -13,13 +13,13 @@ function salsa_commerce_alter_donate_form(&$form, $form_state) {
   $form['flash_message_js']['#access'] = FALSE;
 
   // Add ajax handling to frequency selection.
- if (isset($form['Donation']['recurring'])) {
+  if (isset($form['Donation']['recurring'])) {
     $form['Donation']['recurring']['#ajax'] = array(
       'callback' => 'salsa_commerce_ajax_payment_selection',
       'wrapper' => 'salsa-commerce-payment-form',
     );
     $form['Donation']['payperiod']['#ajax'] = $form['Donation']['recurring']['#ajax'];
- }
+  }
 
   // Change amount options, append currency.
   $currency_code = commerce_currency_get_code();
@@ -189,14 +189,21 @@ function salsa_commerce_donate_order_create_validate($form, &$form_state) {
  * Creates an order object based on a form.
  */
 function salsa_commerce_create_order($form, &$form_state) {
-  // Create a new order.
-  if (!isset($form_state['order'])) {
+  if (isset($form_state['salsa_object']->donate_page_KEY)) {
+    $order_key = 'donate_page:' . $form_state['salsa_object']->donate_page_KEY;
+  }
+  else {
+    $order_key = 'my_donate_page:' . $form_state['salsa_object']->supporter_my_donate_page_KEY;
+  }
+
+  // Create a new order or get the existing one from the session.
+  if (!isset($_SESSION['salsa_commerce'][$order_key])) {
     $order = commerce_order_new($GLOBALS['user']->uid);
     commerce_order_save($order);
-    $form_state['order'] = $order;
+    $_SESSION['salsa_commerce'][$order_key] = $order->order_id;
   }
   else {
-    $order = $form_state['order'];
+    $order = commerce_order_load($_SESSION['salsa_commerce'][$order_key]);
   }
 
   // Add redirect link of the donate page.
@@ -252,12 +259,87 @@ function salsa_commerce_create_order($form, &$form_state) {
     return $order;
   }
 
+  // Update an existing line item or create a new one.
+  $order = salsa_commerce_add_line_item(
+    $form_state,
+    $values,
+    $order,
+    $other_amount_key
+  );
+
+  // Add a billing profile based on supporter values.
+  salsa_commerce_supporter_billing_profile($form_state['supporter'], $order);
+
+  drupal_alter('salsa_commerce_order', $order, $form_state, $values);
+  return $order;
+}
+
+/**
+ * Creates a new line item and deletes an existing one from the order.
+ *
+ * Without this, multiple line items would be added to the same order upon AJAX
+ * requests, for example during editing of recurring options.
+ *
+ * @param array $form_state
+ *   Form state array as available in form functions.
+ * @param array $values
+ *   Possibly altered values that are used to create an order/line item.
+ * @param object $order
+ *   The commerce order object the line item gets added to.
+ * @param string $other_amount_key
+ *   The key of the amount field that is relevant for the line item's price.
+ *
+ * @return array
+ *   The created line item.
+ */
+function salsa_commerce_add_line_item(&$form_state, $values, $order, $other_amount_key) {
+  $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
+  // Fetch existing line item and delete it in order to add a new one later on.
+  if ($line_items = $order_wrapper->commerce_line_items->value()) {
+    commerce_line_item_delete($line_items[0]->line_item_id);
+    $order_wrapper->commerce_line_items->set(array());
+  }
+
+  // Create new line item and add it to the order.
+  $line_item = salsa_commerce_create_line_item(
+    $form_state,
+    $values,
+    $order,
+    $other_amount_key
+  );
+
+  commerce_line_item_save($line_item);
+  // Add the line item to the cart order of the user.
+  $order_wrapper->commerce_line_items[] = $line_item->line_item_id;
+  $order = $order_wrapper->value();
+  commerce_order_save($order);
+  return $order;
+}
+
+/**
+ * Creates a new donation line item.
+ *
+ * Type of the line item is determined by the passed values.
+ *
+ * @param array $form_state
+ *   Form state array as available in form functions.
+ * @param array $values
+ *   Possibly altered values that are used to create an order/line item.
+ * @param object $order
+ *   The commerce order object the line item gets added to.
+ * @param string $other_amount_key
+ *   The key of the amount field that is relevant for the line item's price.
+ *
+ * @return mixed
+ *   The created line item.
+ */
+function salsa_commerce_create_line_item(&$form_state, $values, $order, $other_amount_key) {
   // Create a line item.
-  $line_item_type = !empty($values['recurring']) ? "recurring_donation" : "donation";
+  $line_item_type = !empty($values['recurring']) ? 'recurring_donation' : 'donation';
   $line_item = commerce_line_item_new($line_item_type, $order->order_id);
   if (isset($form_state['salsa_object']->donate_page_KEY)) {
     $line_item->salsa_donate_page[LANGUAGE_NONE][0]['target_id'] = $form_state['salsa_object']->donate_page_KEY;
-    // @todo: Why is this necessary.
+    // @todo: Why is this necessary?
     $line_item->salsa_supporter_my_donate_page[LANGUAGE_NONE][0]['target_id'] = 0;
   }
   else {
@@ -288,18 +370,7 @@ function salsa_commerce_create_order($form, &$form_state) {
       $wrapper->commerce_unit_price->data = commerce_price_component_add($value, 'base_price', $value, TRUE);
     }
   }
-
-  commerce_line_item_save($line_item);
-
-  // Add the line item to the cart order of the user.
-  $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
-  $order_wrapper->commerce_line_items[] = $line_item;
-
-  // Add a billing profile based on supporter values.
-  salsa_commerce_supporter_billing_profile($form_state['supporter'], $order);
-
-  drupal_alter('salsa_commerce_order', $order, $form_state, $values);
-  return $order;
+  return $line_item;
 }
 
 /**
@@ -332,7 +403,7 @@ function salsa_commerce_donate_order_create($form, &$form_state) {
  * Process the payment selection of a donation.
  */
 function salsa_commerce_process_payment($order, $form, &$form_state) {
-    // Make sure the order is in the correct state, set and call the selected
+  // Make sure the order is in the correct state, set and call the selected
   // payment method.
   $order->status = 'checkout_payment';
   $order->data['payment_method'] = $form_state['values']['commerce_payment']['payment_method'];
@@ -467,7 +538,6 @@ function salsa_commerce_supporter_profile_map() {
  *   The commerce order object.
  */
 function salsa_commerce_commerce_checkout_complete($order) {
-
   // Collect the donation line items.
   $commerce_line_items = field_get_items('commerce_order', $order, 'commerce_line_items');
   $donation_line_items = array();
@@ -483,6 +553,20 @@ function salsa_commerce_commerce_checkout_complete($order) {
 
   foreach ($donation_line_items as $donation_line_item) {
     salsa_commerce_save_donation($order, $donation_line_item);
+    $line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $donation_line_item);
+    // Order was completed so user is allowed to begin a new order now.
+    if (!empty($line_item_wrapper->salsa_donate_page->value())) {
+      $order_key = 'donate_page:' . $line_item_wrapper->salsa_donate_page->value()->donate_page_KEY;
+    }
+    else {
+      $order_key = 'my_donate_page:' . $line_item_wrapper->salsa_supporter_my_donate_page->value()->supporter_my_donate_page_KEY;
+    }
+    unset($_SESSION['salsa_commerce'][$order_key]);
+  }
+
+  // If there's nothing left in the session get rid of it.
+  if (empty($_SESSION['salsa_commerce'])) {
+    unset($_SESSION['salsa_commerce']);
   }
 }
 
@@ -811,7 +895,7 @@ function salsa_commerce_add_salsa_donate_fields($line_item_type) {
     $field = field_create_field($field);
   }
   if (!field_info_instance('commerce_line_item', 'salsa_donate_page', $type)) {
-      $instance = array(
+    $instance = array(
       'label' => t('Salsa Donate Page'),
       'field_name' => 'salsa_donate_page',
       'bundle' => $type,
@@ -852,7 +936,7 @@ function salsa_commerce_add_salsa_donate_fields($line_item_type) {
     $field = field_create_field($field);
   }
   if (!field_info_instance('commerce_line_item', 'salsa_supporter_my_donate_page', $type)) {
-      $instance = array(
+    $instance = array(
       'label' => t('Salsa Supporter My Donate Page'),
       'field_name' => 'salsa_supporter_my_donate_page',
       'bundle' => $type,
