diff --git a/commerce_bank_transfer.module b/commerce_bank_transfer.module
index fd319cc..69e5c84 100644
--- a/commerce_bank_transfer.module
+++ b/commerce_bank_transfer.module
@@ -5,6 +5,28 @@
  * Provides the Bank Transfer payment method for use in Drupal Commerce.
  */
 
+/**
+ * Implements hook_menu().
+ */
+function commerce_bank_transfer_menu() {
+  $items = array();
+
+  // Add a menu item for capturing authorizations.
+  $items['admin/commerce/orders/%commerce_order/payment/%commerce_payment_transaction/bank-transfer-confirm'] = array(
+    'title' => 'Confirm payment',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('commerce_bank_transfer_confirm_form', 3, 5),
+    'access callback' => 'commerce_payment_transaction_access',
+    'access arguments' => array(3, 5),
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'context' => MENU_CONTEXT_INLINE,
+    'weight' => 2,
+    'file' => 'includes/commerce_bank_transfer.admin.inc',
+  );
+
+  return $items;
+}
+
 
 /**
  * Implements hook_commerce_payment_method_info().
@@ -138,19 +160,35 @@ function commerce_bank_transfer_submit_form($payment_method, $pane_values, $chec
 }
 
 /**
- * Payment method callback: checkout form validation.
+ * Payment method callback: checkout form submission.
  */
-function commerce_bank_transfer_submit_form_validate($payment_method, $pane_form, $pane_values, $order, $form_parents = array()) {
-  // nothing to validate
+function commerce_bank_transfer_submit_form_submit($payment_method, $pane_form, $pane_values, $order, $charge) {
+
+  commerce_bank_transfer_transaction($payment_method, $order, $charge);
 }
 
 /**
- * Payment method callback: checkout form submission.
+ * Creates the payment transaction for the specified charge amount,
+ * but puts the status on pending for "offline" payment
+ *
+ * @param $payment_method
+ *   The payment method instance object used to charge this payment.
+ * @param $order
+ *   The order object the payment applies to.
+ * @param $charge
+ *   An array indicating the amount and currency code to charge.
  */
-function commerce_bank_transfer_submit_form_submit($payment_method, $pane_form, $pane_values, $order, $charge) {
-//  transfer will be completed manually on reception of transfer
+function commerce_bank_transfer_transaction($payment_method, $order, $charge) {
+  $transaction = commerce_payment_transaction_new('commerce_bank_transfer', $order->order_id);
+  $transaction->instance_id = $payment_method['instance_id'];
+  $transaction->amount = $charge['amount'];
+  $transaction->currency_code = $charge['currency_code'];
+  $transaction->status = COMMERCE_PAYMENT_STATUS_PENDING;
+
+  commerce_payment_transaction_save($transaction);
 }
 
+
 /**
  * Implementation of commerce_bank_transfer_bank_details($oid).
  *
diff --git a/includes/commerce_bank_transfer.admin.inc b/includes/commerce_bank_transfer.admin.inc
new file mode 100644
index 0000000..ac73290
--- /dev/null
+++ b/includes/commerce_bank_transfer.admin.inc
@@ -0,0 +1,95 @@
+<?php
+
+/**
+ * @file
+ * Administrative forms for the Commerce Bank Transfer module.
+ */
+
+
+/**
+ * Form callback: allows the user to confirm an "offline" bank transfer
+ */
+function commerce_bank_transfer_confirm_form($form, &$form_state, $order, $transaction) {
+  $form_state['order'] = $order;
+  $form_state['transaction'] = $transaction;
+
+  // Load and store the payment method instance for this transaction.
+  $payment_method = commerce_payment_method_instance_load($transaction->instance_id);
+  $form_state['payment_method'] = $payment_method;
+
+  $balance = commerce_payment_order_balance($order);
+
+  if ($balance['amount'] > 0 && $balance['amount'] < $transaction->amount) {
+    $default_amount = $balance['amount'];
+  }
+  else {
+    $default_amount = $transaction->amount;
+  }
+
+  // Convert the price amount to a user friendly decimal value.
+  $default_amount = commerce_currency_amount_to_decimal($default_amount, $transaction->currency_code);
+
+  $description = implode('<br />', array(
+    t('Order balance: @balance', array('@balance' => commerce_currency_format($balance['amount'], $balance['currency_code']))),
+  ));
+
+  $form['amount'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Confirm bank transfer amount'),
+    '#description' => $description,
+    '#default_value' => $default_amount,
+    '#field_suffix' => check_plain($transaction->currency_code),
+    '#size' => 16,
+  );
+
+  $form = confirm_form($form,
+    t('What amount do you want to confirm?'),
+    'admin/commerce/orders/' . $order->order_id . '/payment',
+    '',
+    t('Confirm'),
+    t('Cancel'),
+    'confirm'
+  );
+
+  return $form;
+}
+
+/**
+ * Validate handler: ensure a valid amount is given.
+ */
+function commerce_bank_transfer_confirm_form_validate($form, &$form_state) {
+  $transaction = $form_state['transaction'];
+  $amount = $form_state['values']['amount'];
+
+  // Ensure a positive numeric amount has been entered for capture.
+  if (!is_numeric($amount) || $amount <= 0) {
+    form_set_error('amount', t('You must specify a positive numeric amount to capture.'));
+  }
+
+  // Ensure the amount is less than or equal to the transaction amount.
+  if ($amount > commerce_currency_amount_to_decimal($transaction->amount, $transaction->currency_code)) {
+    form_set_error('amount', t('You cannot confirm more than transaction amount.'));
+  }
+}
+
+/**
+ * Submit handler: confirm the "offline" payment
+ */
+function commerce_bank_transfer_confirm_form_submit($form, &$form_state) {
+  $transaction = $form_state['transaction'];
+  $amount = $form_state['values']['amount'];
+
+
+  // Update the transaction amount to the actual confirmed amount.
+  $transaction->amount = commerce_currency_decimal_to_amount($amount, $transaction->currency_code);
+
+  $transaction->status = COMMERCE_PAYMENT_STATUS_SUCCESS;
+
+  // Append a confirmed indication to the result message.
+  $transaction->message .= '<br />' . t('Confirmed: @date', array('@date' => format_date(REQUEST_TIME, 'short')));
+
+  commerce_payment_transaction_save($transaction);
+  drupal_set_message(t('Payment confirmed successfully.'));
+
+  $form_state['redirect'] = 'admin/commerce/orders/' . $form_state['order']->order_id . '/payment';
+}
diff --git a/commerce_bank_transfer.install b/commerce_bank_transfer.install
index 92a0c98..ba08f2e 100644
--- a/commerce_bank_transfer.install
+++ b/commerce_bank_transfer.install
@@ -1,46 +1,6 @@
 <?php
 
 /**
- * @file
- * Installing commerce_bank_transfer schema
- */
-
-/**
- * bank transfer install schema
- */
-function commerce_bank_transfer_schema() {
-  $schema = array();
-
-  $schema['commerce_payment_bank_transfer'] = array(
-    'description' => 'Stores bank transfer payment information.',
-    'fields' => array(
-      'bank_transfer_id' => array(
-        'type' => 'serial',
-        'unsigned' => TRUE,
-        'not null' => TRUE,
-      ),
-      'order_id' => array(
-        'type' => 'int',
-        'unsigned' => TRUE,
-        'not null' => TRUE,
-        'default' => 0,
-      ),
-      'clear_date' => array(
-        'type' => 'int',
-        'not null' => TRUE,
-        'default' => 0,
-      ),
-    ),
-    'indexes' => array(
-      'order_id' => array('order_id'),
-    ),
-    'primary key' => array('bank_transfer_id'),
-  );
-
-  return $schema;
-}
-
-/**
  * bank transfer cleanup database on uninstall
  */
 function commerce_bank_transfer_uninstall() {
