diff --git a/payment/payment.api.php b/payment/payment.api.php
index 4460502..f96d36a 100644
--- a/payment/payment.api.php
+++ b/payment/payment.api.php
@@ -107,13 +107,13 @@ function hook_payment_line_item_info_alter(array &$line_items_info) {
 }
 
 /**
- * Executes when a payment status has been changed.
+ * Executes when a payment status is being set.
  *
  * @see Payment::setStatus()
  *
  * @param Payment $payment
  * @param PaymentStatusItem $previous_status_item
- *   The status the payment had before it was changed.
+ *   The status the payment had before it was set.
  *
  * @return NULL
  */
diff --git a/payment/payment.classes.inc b/payment/payment.classes.inc
index 99b5fc7..8952990 100644
--- a/payment/payment.classes.inc
+++ b/payment/payment.classes.inc
@@ -261,15 +261,12 @@ class Payment extends PaymentCommon {
    * @return Payment
    */
   function setStatus(PaymentStatusItem $status_item) {
-    // A fail-safe to ensure hook implementations are only called if the status
-    // has really changed.
-    if ($this->getStatus()->status == $status_item->status) {
-      return;
-    }
-
     $previous_status_item = $this->getStatus();
     $status_item->pid = $this->pid;
-    $this->statuses[] = $status_item;
+    // Prevent duplicate status items.
+    if ($this->getStatus()->status != $status_item->status) {
+      $this->statuses[] = $status_item;
+    }
     foreach (module_implements('payment_status_change') as $module_name) {
       call_user_func($module_name . '_payment_status_change', $this, $previous_status_item);
       // If a hook invocation has added another log item, a new loop with
