diff --git a/commerce_authnet.module b/commerce_authnet.module
index 0b8fb87..16ba2c6 100644
--- a/commerce_authnet.module
+++ b/commerce_authnet.module
@@ -76,6 +76,7 @@ function commerce_authnet_commerce_payment_method_info() {
     'cardonfile' => array(
       'update callback' => 'commerce_authnet_cim_cardonfile_update',
       'delete callback' => 'commerce_authnet_cim_cardonfile_delete',
+      'charge callback' => 'commerce_authnet_cim_cardonfile_charge',
     ),
   );
 
@@ -1240,3 +1241,35 @@ function commerce_authnet_cvv_response($code) {
 
   return '-';
 }
+
+/*
+ * Implements commerce_cardonfile charge callback
+ *
+ * @param $order object
+ *    The order being charged
+ * @param $parent_order object
+ *    The parent order from which the recurring order was derived
+ */
+function commerce_authnet_cim_cardonfile_charge($order, $parent_order) {
+  // Retrieve the card on file
+  $wrapper = entity_metadata_wrapper('commerce_order', $order);
+  $instance_id = $parent_order->data['payment_method'];
+  $payment_method = commerce_payment_method_instance_load($instance_id);
+  $settings = $payment_method['settings'];
+  $cards_on_file = commerce_cardonfile_data_load_multiple($order->uid, $payment_method['instance_id']);
+  // do something with our $cards_on_file
+  
+  // @todo We have no way of knowing which card to use
+  $card_keys = array_keys($cards_on_file); 
+  $card = $cards_on_file[$card_keys[0]];
+  
+  // Shoehorn these value into a form submit function which should be an API call.
+  $payment_method = $payment_method;
+  $pane_form      = NULL;
+  $pane_values    = array("cardonfile" => $card['card_id']);
+  $order          = $order;
+  $charge         = $order->commerce_order_total['und'][0];
+  // Because we don't get any feedback from this function, the returned result will always result in a 
+  // message saying our payment failed, even if it didn't.
+  return commerce_authnet_cim_submit_form_submit($payment_method, $pane_form, $pane_values, $order, $charge);
+}
