diff --git a/modules/payment/commerce_payment.api.php b/modules/payment/commerce_payment.api.php
index a8ae3b4..b5b2365 100644
--- a/modules/payment/commerce_payment.api.php
+++ b/modules/payment/commerce_payment.api.php
@@ -312,6 +312,43 @@ function CALLBACK_commerce_payment_method_redirect_form_submit($order, $payment_
 }
 
 /**
+ * Payment method callback; generation callback for the transaction delete form.
+ *
+ * Returns form elements that should be embeded in the transaction delete form.
+ */
+function CALLBACK_commerce_payment_method_pre_delete_form($payment_method, $form, $form_state, $order, $transaction) {
+  // No example.
+}
+
+/**
+ * Payment method callback; validation callback for deleting transaction.
+ *
+ * @param $order
+ *   The order object.
+ * @param $payment_method
+ *   The payment method array.
+ * @param $transaction
+ *   The transaction object.
+ */
+function CALLBACK_commerce_payment_method_pre_delete_form_validate($form, $form_state, $order, $payment_method, $transaction) {
+  // No example.
+}
+
+/**
+ * Payment method callback; submission callback for deleting transactions.
+ *
+ * @param $order
+ *   The order object.
+ * @param $payment_method
+ *   The payment method array.
+ * @param $transaction
+ *   The transaction object.
+ */
+function CALLBACK_commerce_payment_method_pre_delete_form_submit($form, $form_state, $order, $payment_method, $transaction) {
+  // No example.
+}
+
+/**
  * @} End of "ingroup commerce_payment_method"
  */
 
diff --git a/modules/payment/commerce_payment.module b/modules/payment/commerce_payment.module
index 12e8262..0d23c82 100644
--- a/modules/payment/commerce_payment.module
+++ b/modules/payment/commerce_payment.module
@@ -550,14 +550,13 @@ function commerce_payment_methods() {
       }
 
       // Merge in default callbacks.
-      foreach (array('settings_form', 'submit_form', 'submit_form_validate', 'submit_form_submit', 'redirect_form', 'redirect_form_back', 'redirect_form_validate', 'redirect_form_submit') as $callback) {
+      foreach (array('settings_form', 'submit_form', 'submit_form_validate', 'submit_form_submit', 'redirect_form', 'redirect_form_back', 'redirect_form_validate', 'redirect_form_submit', 'pre_delete_form', 'pre_delete_form_validate', 'pre_delete_form_submit') as $callback) {
         if (!isset($payment_method['callbacks'][$callback])) {
           $payment_method['callbacks'][$callback] = $payment_method['base'] . '_' . $callback;
         }
       }
     }
   }
-
   return $payment_methods;
 }
 
diff --git a/modules/payment/includes/commerce_payment.forms.inc b/modules/payment/includes/commerce_payment.forms.inc
index d0cd71a..c02fea2 100644
--- a/modules/payment/includes/commerce_payment.forms.inc
+++ b/modules/payment/includes/commerce_payment.forms.inc
@@ -262,8 +262,14 @@ function commerce_payment_payment_transaction_delete_form($form, &$form_state, $
   // Ensure this include file is loaded when the form is rebuilt from the cache.
   $form_state['build_info']['files']['form'] = drupal_get_path('module', 'commerce_payment') . '/includes/commerce_payment.forms.inc';
 
+  $form['#validate'][] = 'commerce_payment_payment_transaction_delete_form_validate';
   $form['#submit'][] = 'commerce_payment_payment_transaction_delete_form_submit';
 
+  $payment_method = commerce_payment_method_load($transaction->payment_method);
+  if ($payment_method && $callback = commerce_payment_method_callback($payment_method, 'pre_delete_form')) {
+    $form = $callback($payment_method, $form, $form_state, $order, $transaction);
+  }
+
   $form = confirm_form($form,
     t('Are you sure you want to delete this transaction?'),
     '',
@@ -277,16 +283,37 @@ function commerce_payment_payment_transaction_delete_form($form, &$form_state, $
 }
 
 /**
+ * Validation callback for commerce_payment_transaction_delete_form().
+ */
+function commerce_payment_payment_transaction_delete_form_validate($form, &$form_state) {
+  $order = $form_state['order'];
+  $transaction = $form_state['transaction'];
+  $payment_method = commerce_payment_method_load($transaction->payment_method);
+
+  if ($callback = commerce_payment_method_callback($payment_method, 'pre_delete_form_validate')) {
+    $callback($form, $form_state, $order, $payment_method, $transaction);
+  }
+}
+
+/**
  * Submit callback for commerce_payment_transaction_delete_form().
  */
 function commerce_payment_payment_transaction_delete_form_submit($form, &$form_state) {
+  $order = $form_state['order'];
   $transaction = $form_state['transaction'];
+  $payment_method = commerce_payment_method_load($transaction->payment_method);
+
+  $form_state['rebuild'];
+
+  if ($callback = commerce_payment_method_callback($payment_method, 'pre_delete_form_submit')) {
+    $result = $callback($form, $form_state, $order, $payment_method, $transaction);
+  }
 
-  if (commerce_payment_transaction_delete($transaction->transaction_id)) {
+  if ($result === FALSE) {
+    $form_state['rebuild'] = TRUE;
+  }
+  elseif (commerce_payment_transaction_delete($transaction->transaction_id)) {
     drupal_set_message(t('Payment transaction deleted.'));
     watchdog('commerce_payment', 'Deleted payment transaction @transaction.', array('@transaction' => $transaction->transaction_id), WATCHDOG_NOTICE);
   }
-  else {
-    drupal_set_message(t('The payment transaction could not be deleted.'), 'error');
-  }
-}
+}
\ No newline at end of file
