diff --git a/uc_po.info b/uc_po.info
index 8c7b914..efc366c 100644
--- a/uc_po.info
+++ b/uc_po.info
@@ -1,7 +1,10 @@
 name = Purchase Order
-description = Grant customers permission to pay by purchase order.
+description = Give customers the ability to pay by purchase order.
+core = 7.x
+package = Ubercart - payment
+
 dependencies[] = uc_order
 dependencies[] = uc_payment
-package = Ubercart - payment
-core = 6.x
 
+files[] = uc_po.install
+files[] = uc_po.module
diff --git a/uc_po.install b/uc_po.install
index 795dd2b..4db5173 100644
--- a/uc_po.install
+++ b/uc_po.install
@@ -44,15 +44,14 @@ function uc_po_schema() {
  * Implementation of hook_install().
  */
 function uc_po_install() {
-  drupal_install_schema('uc_po');
+  //Function is needed to ensure the database schema is loaded.
+  return;
 }
 
 /**
  * Implementation of hook_uninstall().
  */
 function uc_po_uninstall() {
-  drupal_uninstall_schema('uc_po');
-
   variable_del('uc_po_instructions');
   variable_del('uc_po_roles');
 }
@@ -61,11 +60,9 @@ function uc_po_uninstall() {
  * Implementations of hook_update_N().
  */
 function uc_po_update_6000() {
-  $ret = array();
 
-  db_drop_primary_key($ret, 'uc_payment_po');
-  db_change_field($ret, 'uc_payment_po', 'po_id', 'po_id', array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE), array('primary key' => array('po_id')));
+  db_drop_primary_key('uc_payment_po');
+  db_change_field('uc_payment_po', 'po_id', 'po_id', array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE), array('primary key' => array('po_id')));
 
-  return $ret;
 }
 
diff --git a/uc_po.module b/uc_po.module
index 915b85d..19448ad 100644
--- a/uc_po.module
+++ b/uc_po.module
@@ -35,32 +35,52 @@ function uc_po_menu() {
 /**
  * Implementation of hook_perm().
  */
-function uc_po_perm() {
-  return array('pay by purchase order');
+function uc_po_permission() {
+  $perm = array();
+
+  $perm['pay by purchase order'] = array(
+      'title' => t('Pay by Purchase Order'),
+      'description' => t('Give customers the ability to pay by purchase order'),
+  );
+
+  return $perm;
 }
 
 /**
- * Implementation of hook_token_values().
+ * Implementation of hook_tokens().
  */
-function uc_po_token_values($type, $object = NULL) {
-  // Declare to the token module the value for the [po-number] token.
-  switch ($type) {
-    case 'order':
-      $values['po-number'] = $object->payment_details['po_number'];
-      break;
+function uc_po_tokens($type, $tokens, array $data = array(), array $options = array()) {
+
+  //Taken straight from uc_bank_transfer.
+
+  $replacements = array();
+
+  if ($type == 'uc_order' && !empty($data['uc_order'])) {
+    $order = $data['uc_order'];
+
+    foreach ($tokens as $name => $original) {
+      switch ($name) {
+        case 'po-number':
+          $replacements[$original] = $order->payment_details['po_number'];
+          break;
+      }
+    }
   }
 
-  return $values;
+  return $replacements;
 }
 
 /**
- * Implementation of hook_token_list().
+ * Implementation of hook_token_info_alter(). We're not declaring a
+ * new token type, only a new token. Hence why this isn't the
+ * implementation of hook_token_info.
  */
-function uc_po_token_list($type = 'all') {
+function uc_po_token_info() {
   // When listing the available values for order tokens, include [po-number].
-  if ($type == 'uc_order') {
-    $tokens['uc_order']['po-number'] = t('The PO number for the order if one exists.');
-  }
+  $tokens['tokens']['uc_order']['po-number'] = array(
+    "name" => t("Purchase Order Number"),
+    "description" => t('The Purchase Order number for the order if one exists.'),
+  );
 
   return $tokens;
 }
@@ -79,39 +99,45 @@ function uc_po_uc_message() {
 }
 
 /**
- * Implementation of hook_order().
+ * Implementation of hook_uc_order().
  */
-function uc_po_order($op, &$arg1, $arg2) {
+function uc_po_uc_order($op, &$arg1, $arg2) {
   switch ($op) {
     // Save the PO number to the database.
     case 'save':
-      if ($arg1->payment_method == 'po') {
-        // First attempt to update an existing PO number.
-        db_query("UPDATE {uc_payment_po} SET po_number = '%s' WHERE order_id = %d", $arg1->payment_details['po_number'], $arg1->order_id);
 
-        // Otherwise insert a new row.
-        if (!db_affected_rows()) {
-          db_query("INSERT INTO {uc_payment_po} (order_id, po_number) VALUES (%d, '%s')", $arg1->order_id, $arg1->payment_details['po_number']);
-        }
+      if ($arg1->payment_method == 'po') {
+        //Use a merge query to update the purchase order record if it
+        //exists or create a new purchase order record if it does not.
+        db_merge('uc_payment_po')
+          ->key(array('order_id' => $arg1->order_id))
+          ->fields(array(
+            'po_number' => $arg1->payment_details['po_number'],
+          ))
+          ->execute();
       }
       break;
 
     // Load the PO number from the database.
     case 'load':
-      $arg1->payment_details['po_number'] = db_result(db_query("SELECT po_number FROM {uc_payment_po} WHERE order_id = %d", $arg1->order_id));
+      $result = db_query("SELECT po_number FROM {uc_payment_po} WHERE order_id = :order_id", array('order_id' => $arg1->order_id));
+      $arg1->payment_details['po_number'] = $result->fetchField(0);
       break;
 
     // Delete the PO number from the database.
     case 'delete':
-      db_query("DELETE FROM {uc_payment_po} WHERE order_id = %d", $arg1->order_id);
+      $num_deleted = db_delete('uc_payment_po')
+        ->condition('order_id', $arg1->order_id)
+        ->execute();
       break;
   }
 }
 
 /**
- * Implementation of hook_payment_method().
+ * Implementation of hook_uc_payment_method().
  */
-function uc_po_payment_method() {
+function uc_po_uc_payment_method() {
+  $methods = array();
   // The if statement checks to see if the user has permission to pay by
   // purchase order or if the user is browsing admin pages before telling
   // Ubercart that the purchase order payment method exists.
@@ -124,7 +150,7 @@ function uc_po_payment_method() {
       'callback' => 'uc_payment_method_po',
       'weight' => 4,
       'checkout' => TRUE,
-      'backend' => TRUE,
+      'no_gateway' => TRUE,
     );
   }
 
@@ -147,20 +173,30 @@ function uc_po_theme($existing, $type, $theme, $path) {
  * Callback Functions, Forms, and Tables
  ******************************************************************************/
 
-function uc_payment_method_po($op, &$arg1) {
+/*TODO: Convert this function to be an implementation of
+hook_uc_payment_method. */
+
+function uc_payment_method_po($op, &$arg1, $form = NULL, &$form_state = NULL) {
   switch ($op) {
     // Displayed during checkout for the customer to enter a PO number.
+    // The calling function expects a raw form array therefore we don't
+    // just return the form array without rendering it.
+    // copied from the COD module.
     case 'cart-details':
-      $details = drupal_get_form('uc_payment_method_po_form', $arg1);
-      return uc_strip_form($details);
+      $details = uc_payment_method_po_form(array(), $form_state, $arg1);
+      return $details;
 
     // Handles receiving the data entered by the customer.
     case 'cart-process':
-      if (empty($_POST['po_number'])) {
-        drupal_set_message(t('You must specify a PO number to pay by purchase order.'), 'error');
+      if (!isset($form_state['values']['panes']['payment']['details']['po_number'])) {
+        return;
+      }
+
+      if (empty($form_state['values']['panes']['payment']['details']['po_number'])) {
+        form_set_error( 'panes][payment][details][po_number',t('You must specify a PO number to pay by purchase order.'));
         return FALSE;
       }
-      $arg1->payment_details['po_number'] = $_POST['po_number'];
+      $arg1->payment_details['po_number'] = $form_state['values']['panes']['payment']['details']['po_number'];
       return TRUE;
 
     // Display the PO number on the order review page prior to submission.
@@ -170,11 +206,15 @@ function uc_payment_method_po($op, &$arg1) {
     // Display the PO number in the payment order pane.
     case 'customer-view':
     case 'order-view':
-      return t('PO number: @po_number', array('@po_number' => $arg1->payment_details['po_number']));
+      $render = array(
+        '#markup' => t('PO number: @po_number', array('@po_number' => $arg1->payment_details['po_number'])),
+      );
+      return $render;
 
     // Displayed on the order edit screen so admin can update the PO number.
     case 'order-details':
-      return uc_strip_form(drupal_get_form('uc_payment_method_po_form', $arg1));
+      $build = uc_payment_method_po_form(array(), $form_state, $arg1);
+      return $build;
 
     // Update the PO number when the order form is submitted.
     case 'edit-process':
@@ -185,8 +225,8 @@ function uc_payment_method_po($op, &$arg1) {
     // Add a few PO related fields to the payment methods settings form.
     case 'settings':
       $form['uc_po_permission'] = array(
-        '#value' => '<div>'. t('To checkout using the purchase order payment method, users must have the permission setting to pay by purchase order.')
-                   .'<br />'. t('You can use account roles and permissions to give customers access to this payment method.') .'</div>',
+        '#markup' => '<div>' . t('To checkout using the purchase order payment method, users must have the permission setting to pay by purchase order.')
+                   . '<br />' . t('You can use account roles and permissions to give customers access to this payment method.') . '</div>',
       );
       $form['uc_po_instructions'] = array(
         '#type' => 'textarea',
@@ -199,11 +239,13 @@ function uc_payment_method_po($op, &$arg1) {
 }
 
 // Returns the form for users to enter or adjust a PO number.
-function uc_payment_method_po_form($form_state, $order) {
+function uc_payment_method_po_form($form, $form_state, $order) {
+  $instructions = variable_get('uc_po_instructions', uc_get_message('po_instructions'));
+
   $form['po_instructions'] = array(
+    '#type' => 'markup',
     '#value' => '<div class="payment-instructions">'
-              . variable_get('uc_po_instructions', uc_get_message('po_instructions'))
-               .'</div>',
+              . filter_xss($instructions) . '</div>',
   );
   $form['po_number'] = array(
     '#type' => 'textfield',
@@ -227,9 +269,9 @@ function theme_uc_payment_method_po_form($form) {
     $table = 'inline-pane-table';
     $label = 'field-label';
   }
-  $output .= '<table class="'. $table .'"><tr><td class="'. $label .'">'
-           . t('PO number') .':</td><td>'. drupal_render($form['po_number'])
-            .'</td></tr></table>';
+  $output .= '<table class="' . $table . '"><tr><td class="' . $label . '">'
+           . t('PO number') . ':</td><td>' . drupal_render($form['po_number'])
+            . '</td></tr></table>';
 
   return $output;
 }
@@ -246,7 +288,7 @@ function uc_po_search_form($form_state, $po_number = '') {
 
     // Add a link to each order as a table row.
     while ($order = db_fetch_object($result)) {
-      $rows[] = array(l($order->order_id, 'admin/store/orders/'. $order->order_id), $order->po_number);
+      $rows[] = array(l($order->order_id, 'admin/store/orders/' . $order->order_id), $order->po_number);
     }
 
     // Alert the user if no orders were found.
@@ -254,13 +296,16 @@ function uc_po_search_form($form_state, $po_number = '') {
       $rows[] = array(array('data' => t('No orders matched that PO number.'), 'colspan' => 2));
     }
 
+    $table = theme('table', $header, $rows);
+
     $form['results'] = array(
       '#type' => 'fieldset',
       '#title' => t('Search returned the following results'),
       '#collapsible' => TRUE,
     );
     $form['results']['table'] = array(
-      '#value' => theme('table', $header, $rows),
+      '#type' => 'markup',
+      '#value' => $table,
     );
   }
 
@@ -279,6 +324,6 @@ function uc_po_search_form($form_state, $po_number = '') {
 }
 
 function uc_po_search_form_submit($form, &$form_state) {
-  $form_state['redirect'] = 'admin/store/orders/po/'. drupal_urlencode($form_state['values']['po_number']);
+  $form_state['redirect'] = 'admin/store/orders/po/' . drupal_encode_path($form_state['values']['po_number']);
 }
