diff --git a/uc_cart/lib/Drupal/uc_cart/CheckoutPanePluginBase.php b/uc_cart/lib/Drupal/uc_cart/CheckoutPanePluginBase.php
index d201d9b..c617918 100644
--- a/uc_cart/lib/Drupal/uc_cart/CheckoutPanePluginBase.php
+++ b/uc_cart/lib/Drupal/uc_cart/CheckoutPanePluginBase.php
@@ -8,6 +8,7 @@
 namespace Drupal\uc_cart;
 
 use Drupal\Core\Plugin\PluginBase;
+use Drupal\uc_order\UcOrderInterface;
 
 /**
  * Defines a base checkout pane plugin implementation.
@@ -17,6 +18,19 @@ abstract class CheckoutPanePluginBase extends PluginBase implements CheckoutPane
   /**
    * {@inheritdoc}
    */
+  public function prepare(UcOrderInterface $order, array $form, array &$form_state) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function process(UcOrderInterface $order, array $form, array &$form_state) {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsForm() {
   }
 
diff --git a/uc_cart/lib/Drupal/uc_cart/Controller/CheckoutController.php b/uc_cart/lib/Drupal/uc_cart/Controller/CheckoutController.php
index b0fd505..e9e0216 100644
--- a/uc_cart/lib/Drupal/uc_cart/Controller/CheckoutController.php
+++ b/uc_cart/lib/Drupal/uc_cart/Controller/CheckoutController.php
@@ -192,6 +192,7 @@ class CheckoutController extends ControllerBase implements ContainerInjectionInt
 
     $build['#attached']['library'][] = array('system', 'drupal');
     $build['#attached']['library'][] = array('system', 'jquery.once');
+    $build['#attached']['css'][] = drupal_get_path('module', 'uc_cart') . '/css/uc_cart.css';
     $build['#attached']['js'][] = drupal_get_path('module', 'uc_cart') . '/js/uc_cart.js';
 
     return $build;
diff --git a/uc_cart/lib/Drupal/uc_cart/Plugin/CheckoutPaneManager.php b/uc_cart/lib/Drupal/uc_cart/Plugin/CheckoutPaneManager.php
index af1212b..22b1367 100644
--- a/uc_cart/lib/Drupal/uc_cart/Plugin/CheckoutPaneManager.php
+++ b/uc_cart/lib/Drupal/uc_cart/Plugin/CheckoutPaneManager.php
@@ -26,9 +26,6 @@ class CheckoutPaneManager extends DefaultPluginManager {
   protected $defaults = array(
     'enabled' => TRUE,
     'weight' => 0,
-    'review' => TRUE,
-    'process' => TRUE,
-    'collapsible' => TRUE,
   );
 
   /**
diff --git a/uc_cart/lib/Drupal/uc_cart/Plugin/Ubercart/CheckoutPane/CartPane.php b/uc_cart/lib/Drupal/uc_cart/Plugin/Ubercart/CheckoutPane/CartPane.php
new file mode 100644
index 0000000..fc31042
--- /dev/null
+++ b/uc_cart/lib/Drupal/uc_cart/Plugin/Ubercart/CheckoutPane/CartPane.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\uc_cart\Plugin\Ubercart\CheckoutPane\CartPane.
+ */
+
+namespace Drupal\uc_cart\Plugin\Ubercart\CheckoutPane;
+
+use Drupal\uc_cart\CheckoutPanePluginBase;
+use Drupal\uc_order\UcOrderInterface;
+
+/**
+ * Displays the cart contents for review during checkout.
+ *
+ * @Plugin(
+ *   id = "cart",
+ *   title = @Translation("Cart contents"),
+ *   description = @Translation("Display the contents of a customer's shopping cart."),
+ *   weight = 1,
+ * )
+ */
+class CartPane extends CheckoutPanePluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function view(UcOrderInterface $order, array $form, array &$form_state) {
+    $build = array(
+      '#theme' => 'uc_cart_review_table',
+      '#items' => $order->products,
+    );
+    return $build;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function review(UcOrderInterface $order) {
+    $review[] = theme('uc_cart_review_table', array('items' => $order->products, 'show_subtotal' => FALSE));
+    return $review;
+  }
+
+}
diff --git a/uc_cart/lib/Drupal/uc_cart/Plugin/Ubercart/CheckoutPane/CustomerInfoPane.php b/uc_cart/lib/Drupal/uc_cart/Plugin/Ubercart/CheckoutPane/CustomerInfoPane.php
new file mode 100644
index 0000000..afabbb0
--- /dev/null
+++ b/uc_cart/lib/Drupal/uc_cart/Plugin/Ubercart/CheckoutPane/CustomerInfoPane.php
@@ -0,0 +1,188 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\uc_cart\Plugin\Ubercart\CheckoutPane\CustomerInfoPane.
+ */
+
+namespace Drupal\uc_cart\Plugin\Ubercart\CheckoutPane;
+
+use Drupal\uc_cart\CheckoutPanePluginBase;
+use Drupal\uc_order\UcOrderInterface;
+
+/**
+ * Gets the user's email address for login.
+ *
+ * @Plugin(
+ *   id = "customer",
+ *   title = @Translation("Customer information"),
+ *   description = @Translation("Get the necessary information to create a customer on the site."),
+ *   weight = 2,
+ * )
+ */
+class CustomerInfoPane extends CheckoutPanePluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function view(UcOrderInterface $order, array $form, array &$form_state) {
+    $user = \Drupal::currentUser();
+    $cart_config = \Drupal::config('uc_cart.settings');
+
+    if ($user->isAuthenticated()) {
+      $email = $user->getEmail();
+      $contents['#description'] = t('Order information will be sent to your account e-mail listed below.');
+      $contents['primary_email'] = array('#type' => 'hidden', '#value' => $email);
+      $contents['email_text'] = array(
+        '#markup' => '<div>' . t('<b>E-mail address:</b> @email (<a href="!url">edit</a>)', array('@email' => $email, '!url' => url('user/' . $user->id() . '/edit', array('query' => drupal_get_destination())))) . '</div>',
+      );
+    }
+    else {
+      $email = $order->getEmail();
+      $contents['#description'] = t('Enter a valid email address for this order or <a href="!url">click here</a> to login with an existing account and return to checkout.', array('!url' => url('user/login', array('query' => drupal_get_destination()))));
+      $contents['primary_email'] = array(
+        '#type' => 'email',
+        '#title' => t('E-mail address'),
+        '#default_value' => $email,
+        '#required' => TRUE,
+      );
+    }
+
+    if ($cart_config->get('email_validation') && $user->isAnonymous()) {
+      $contents['primary_email_confirm'] = array(
+        '#type' => 'email',
+        '#title' => t('Confirm e-mail address'),
+        '#default_value' => $email,
+        '#required' => TRUE,
+      );
+    }
+
+    if ($user->isAnonymous()) {
+      $contents['new_account'] = array();
+
+      if ($cart_config->get('new_account_name')) {
+        $contents['new_account']['name'] = array(
+          '#type' => 'textfield',
+          '#title' => t('Username'),
+          '#default_value' => isset($order->data['new_user']['name']) ? $order->data['new_user']['name'] : '',
+          '#maxlength' => 60,
+          '#size' => 32,
+        );
+      }
+      if ($cart_config->get('new_account_password')) {
+        $contents['new_account']['pass'] = array(
+          '#type' => 'password',
+          '#title' => t('Password'),
+          '#maxlength' => 32,
+          '#size' => 32,
+        );
+        $contents['new_account']['pass_confirm'] = array(
+          '#type' => 'password',
+          '#title' => t('Confirm password'),
+          '#description' => t('Passwords must match to proceed.'),
+          '#maxlength' => 32,
+          '#size' => 32,
+        );
+      }
+
+      if (!empty($contents['new_account'])) {
+        $array = array(
+          '#type' => 'details',
+          '#title' => t('New account details'),
+          '#description' => $cart_config->get('new_account_details', t('<b>Optional.</b> New customers may supply custom account details.<br />We will create these for you if no values are entered.')),
+          '#collapsible' => FALSE,
+        );
+        $contents['new_account'] = array_merge($array, $contents['new_account']);
+      }
+    }
+
+    return $contents;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function process(UcOrderInterface $order, array $form, array &$form_state) {
+    $user = \Drupal::currentUser();
+    $cart_config = \Drupal::config('uc_cart.settings');
+
+    $pane = $form_state['values']['panes']['customer'];
+    $order->setEmail($pane['primary_email']);
+
+    if ($cart_config->get('email_validation') && $user->isAnonymous() &&
+      $pane['primary_email'] !== $pane['primary_email_confirm']) {
+      form_set_error('panes][customer][primary_email_confirm', $form_state, t('The e-mail address did not match.'));
+    }
+
+    // Invalidate if an account already exists for this e-mail address, and the user is not logged into that account
+    if (!$cart_config->get('mail_existing') && $user->isAnonymous() && !empty($pane['primary_email'])) {
+      if (db_query("SELECT uid FROM {users} WHERE mail LIKE :mail", array(':mail' => $pane['primary_email']))->fetchField() > 0) {
+        form_set_error('panes][customer][primary_email', $form_state, t('An account already exists for your e-mail address. You will either need to login with this e-mail address or use a different e-mail address.'));
+      }
+    }
+
+    // If new users can specify names or passwords then...
+    if (($cart_config->get('new_account_name') ||
+        $cart_config->get('new_account_password')) &&
+      $user->isAnonymous()) {
+      // Skip if an account already exists for this e-mail address.
+      if ($cart_config->get('mail_existing') && db_query("SELECT uid FROM {users} WHERE mail LIKE :mail", array(':mail' => $pane['primary_email']))->fetchField() > 0) {
+        drupal_set_message(t('An account already exists for your e-mail address. The new account details you entered will be disregarded.'));
+      }
+      else {
+        // Validate the username.
+        if ($cart_config->get('new_account_name') && !empty($pane['new_account']['name'])) {
+          $message = user_validate_name($pane['new_account']['name']);
+          if (!empty($message)) {
+            form_set_error('panes][customer][new_account][name', $form_state, $message);
+          }
+          elseif (db_query("SELECT uid FROM {users} WHERE name LIKE :name", array(':name' => $pane['new_account']['name']))->fetchField()) {
+            form_set_error('panes][customer][new_account][name', $form_state, t('The username %name is already taken. Please enter a different name or leave the field blank for your username to be your e-mail address.', array('%name' => $pane['new_account']['name'])));
+          }
+          else {
+            $order->data['new_user']['name'] = $pane['new_account']['name'];
+          }
+        }
+        // Validate the password.
+        if ($cart_config->get('new_account_password')) {
+          if (strcmp($pane['new_account']['pass'], $pane['new_account']['pass_confirm'])) {
+            form_set_error('panes][customer][new_account][pass_confirm', $form_state, t('The passwords you entered did not match. Please try again.'));
+          }
+          if (!empty($pane['new_account']['pass'])) {
+            $order->data['new_user']['hash'] = Drupal::service('password')->hash(trim($pane['new_account']['pass']));
+          }
+        }
+      }
+    }
+
+    if ($user->isAuthenticated()) {
+      $order->setUserId($user->id());
+    }
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function review(UcOrderInterface $order) {
+    $review[] = array('title' => t('E-mail'), 'data' => check_plain($order->getEmail()));
+    return $review;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm() {
+    $cart_config = \Drupal::config('uc_cart.settings');
+
+    $form['uc_cart_new_account_details'] = array(
+      '#type' => 'textarea',
+      '#title' => t('New account details help message'),
+      '#description' => t('Enter the help message displayed in the new account details fieldset when shown.'),
+      '#default_value' => $cart_config->get('new_account_details', t('<b>Optional.</b> New customers may supply custom account details.<br />We will create these for you if no values are entered.')),
+    );
+
+    return $form;
+  }
+
+}
diff --git a/uc_cart/lib/Drupal/uc_cart/Plugin/Ubercart/CheckoutPane/OrderCommentsPane.php b/uc_cart/lib/Drupal/uc_cart/Plugin/Ubercart/CheckoutPane/OrderCommentsPane.php
new file mode 100644
index 0000000..d30b3ac
--- /dev/null
+++ b/uc_cart/lib/Drupal/uc_cart/Plugin/Ubercart/CheckoutPane/OrderCommentsPane.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\uc_cart\Plugin\Ubercart\CheckoutPane\OrderCommentsPane.
+ */
+
+namespace Drupal\uc_cart\Plugin\Ubercart\CheckoutPane;
+
+use Drupal\uc_cart\CheckoutPanePluginBase;
+use Drupal\uc_order\UcOrderInterface;
+
+/**
+ * Allows a customer to make comments on the order.
+ *
+ * @Plugin(
+ *   id = "comments",
+ *   title = @Translation("Order comments"),
+ *   description = @Translation("Allow a customer to put comments on an order."),
+ *   weight = 7,
+ * )
+ */
+class OrderCommentsPane extends CheckoutPanePluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function view(UcOrderInterface $order, array $form, array &$form_state) {
+    $build['#description'] = t('Use this area for special instructions or questions regarding your order.');
+
+    if ($order->id()) {
+      $default = db_query("SELECT message FROM {uc_order_comments} WHERE order_id = :id", array(':id' => $order->id()))->fetchField();
+    }
+    else {
+      $default = NULL;
+    }
+    $build['comments'] = array(
+      '#type' => 'textarea',
+      '#title' => t('Order comments'),
+      '#default_value' => $default,
+    );
+
+    return $build;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function process(UcOrderInterface $order, array $form, array &$form_state) {
+    db_delete('uc_order_comments')
+      ->condition('order_id', $order->id())
+      ->execute();
+
+    if (strlen($form_state['values']['panes']['comments']['comments']) > 0) {
+      uc_order_comment_save($order->id(), 0, $form_state['values']['panes']['comments']['comments'], 'order', uc_order_state_default('post_checkout'), TRUE);
+    }
+
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function review(UcOrderInterface $order) {
+    $review = NULL;
+    $result = db_query("SELECT message FROM {uc_order_comments} WHERE order_id = :id", array(':id' => $order->id()));
+    if ($comment = $result->fetchObject()) {
+      $review[] = array('title' => t('Comment'), 'data' => check_plain($comment->message));
+    }
+    return $review;
+  }
+
+}
diff --git a/uc_cart/uc_cart.api.php b/uc_cart/uc_cart.api.php
index 7d1fa3d..629b70f 100644
--- a/uc_cart/uc_cart.api.php
+++ b/uc_cart/uc_cart.api.php
@@ -270,14 +270,6 @@ function hook_uc_cart_checkout_start($order) {
  *     - type: boolean
  *     - value: Optional. Whether or not the pane is enabled by default.
  *       Defaults to TRUE.
- *   - process:
- *     - type: boolean
- *     - value: Optional. Whether or not this pane needs to be processed when
- *       the checkout form is submitted. Defaults to TRUE.
- *   - collapsible:
- *     - type: boolean
- *     - value: Optional. Whether or not this pane is displayed as a collapsible
- *       fieldset. Defaults to TRUE.
  *   - shippable:
  *     - type: boolean
  *     - value: Optional. If TRUE, the pane is only shown if the cart is
@@ -291,8 +283,6 @@ function hook_uc_checkout_pane() {
     'title' => t('Cart contents'),
     'desc' => t("Display the contents of a customer's shopping cart."),
     'weight' => 1,
-    'process' => FALSE,
-    'collapsible' => FALSE,
   );
   return $panes;
 }
diff --git a/uc_cart/uc_cart.module b/uc_cart/uc_cart.module
index 3e23011..1a5d814 100644
--- a/uc_cart/uc_cart.module
+++ b/uc_cart/uc_cart.module
@@ -217,20 +217,6 @@ function uc_cart_uc_message() {
  * Implements hook_uc_checkout_pane().
  */
 function uc_cart_uc_checkout_pane() {
-  $panes['cart'] = array(
-    'callback' => 'uc_checkout_pane_cart',
-    'title' => t('Cart contents'),
-    'desc' => t("Display the contents of a customer's shopping cart."),
-    'weight' => 1,
-    'process' => FALSE,
-    'collapsible' => FALSE,
-  );
-  $panes['customer'] = array(
-    'callback' => 'uc_checkout_pane_customer',
-    'title' => t('Customer information'),
-    'desc' => t('Get the necessary information to create a customer on the site.'),
-    'weight' => 2,
-  );
   $panes['delivery'] = array(
     'callback' => 'uc_checkout_pane_delivery',
     'title' => t('Delivery information'),
@@ -244,12 +230,6 @@ function uc_cart_uc_checkout_pane() {
     'desc' => t('Get basic information needed to collect payment.'),
     'weight' => 4,
   );
-  $panes['comments'] = array(
-    'callback' => 'uc_checkout_pane_comments',
-    'title' => t('Order comments'),
-    'desc' => t('Allow a customer to put comments on an order.'),
-    'weight' => 7,
-  );
 
   return $panes;
 }
diff --git a/uc_cart/uc_cart.pages.inc b/uc_cart/uc_cart.pages.inc
index 7d43b62..a0042d8 100644
--- a/uc_cart/uc_cart.pages.inc
+++ b/uc_cart/uc_cart.pages.inc
@@ -26,8 +26,6 @@ function theme_uc_cart_checkout_review($variables) {
   $panes = $variables['panes'];
   $form = $variables['form'];
 
-  drupal_add_css(drupal_get_path('module', 'uc_cart') . '/css/uc_cart.css');
-
   $output = '<p>' . t("Your order is almost complete. Please review the details below and click 'Submit order' if all the information is correct.  You may use the 'Back' button to make changes to your order if necessary.") . '</p>';
 
   $output .= '<table class="order-review-table">';
diff --git a/uc_cart/uc_cart_checkout_pane.inc b/uc_cart/uc_cart_checkout_pane.inc
index c74ad05..7ecff74 100644
--- a/uc_cart/uc_cart_checkout_pane.inc
+++ b/uc_cart/uc_cart_checkout_pane.inc
@@ -13,173 +13,6 @@
 use Drupal\uc_store\Address;
 
 /**
- * Displays the cart contents for review during checkout.
- */
-function uc_checkout_pane_cart($op, $order, $form = NULL, &$form_state = NULL) {
-  switch ($op) {
-    case 'view':
-      $contents['cart_review_table'] = array(
-        '#theme' => 'uc_cart_review_table',
-        '#items' => $order->products,
-      );
-      return array('contents' => $contents);
-
-    case 'review':
-      $review[] = theme('uc_cart_review_table', array('items' => $order->products, 'show_subtotal' => FALSE));
-      return $review;
-  }
-}
-
-/**
- * Gets the user's email address for login.
- */
-function uc_checkout_pane_customer($op, $order, $form = NULL, &$form_state = NULL) {
-  $user = \Drupal::currentUser();
-
-  $cart_config = \Drupal::config('uc_cart.settings');
-  switch ($op) {
-    case 'view':
-      if ($user->isAuthenticated()) {
-        $email = $user->getEmail();
-        $description = t('Order information will be sent to your account e-mail listed below.');// . '<br />'
-        $contents['primary_email'] = array('#type' => 'hidden', '#value' => $email);
-        $contents['email_text'] = array(
-          '#markup' => '<div>' . t('<b>E-mail address:</b> @email (<a href="!url">edit</a>)', array('@email' => $email, '!url' => url('user/' . $user->id() . '/edit', array('query' => drupal_get_destination())))) . '</div>',
-        );
-      }
-      else {
-        $email = $order->getEmail();
-        $description = t('Enter a valid email address for this order or <a href="!url">click here</a> to login with an existing account and return to checkout.', array('!url' => url('user/login', array('query' => drupal_get_destination()))));
-        $contents['primary_email'] = array(
-          '#type' => 'email',
-          '#title' => t('E-mail address'),
-          '#default_value' => $email,
-          '#required' => TRUE,
-        );
-      }
-
-      if ($cart_config->get('email_validation') && $user->isAnonymous()) {
-        $contents['primary_email_confirm'] = array(
-          '#type' => 'email',
-          '#title' => t('Confirm e-mail address'),
-          '#default_value' => $email,
-          '#required' => TRUE,
-        );
-      }
-
-      if ($user->isAnonymous()) {
-        $contents['new_account'] = array();
-
-        if ($cart_config->get('new_account_name')) {
-          $contents['new_account']['name'] = array(
-            '#type' => 'textfield',
-            '#title' => t('Username'),
-            '#default_value' => isset($order->data['new_user']['name']) ? $order->data['new_user']['name'] : '',
-            '#maxlength' => 60,
-            '#size' => 32,
-          );
-        }
-        if ($cart_config->get('new_account_password')) {
-          $contents['new_account']['pass'] = array(
-            '#type' => 'password',
-            '#title' => t('Password'),
-            '#maxlength' => 32,
-            '#size' => 32,
-          );
-          $contents['new_account']['pass_confirm'] = array(
-            '#type' => 'password',
-            '#title' => t('Confirm password'),
-            '#description' => t('Passwords must match to proceed.'),
-            '#maxlength' => 32,
-            '#size' => 32,
-          );
-        }
-
-        if (!empty($contents['new_account'])) {
-          $array = array(
-            '#type' => 'details',
-            '#title' => t('New account details'),
-            '#description' => $cart_config->get('new_account_details', t('<b>Optional.</b> New customers may supply custom account details.<br />We will create these for you if no values are entered.')),
-            '#collapsible' => FALSE,
-          );
-          $contents['new_account'] = array_merge($array, $contents['new_account']);
-        }
-      }
-
-      return array('description' => $description, 'contents' => $contents);
-
-    case 'process':
-      $pane = $form_state['values']['panes']['customer'];
-      $order->setEmail($pane['primary_email']);
-
-      if ($cart_config->get('email_validation') && $user->isAnonymous() &&
-          $pane['primary_email'] !== $pane['primary_email_confirm']) {
-        form_set_error('panes][customer][primary_email_confirm', $form_state, t('The e-mail address did not match.'));
-      }
-
-      // Invalidate if an account already exists for this e-mail address, and the user is not logged into that account
-      if (!$cart_config->get('mail_existing') && $user->isAnonymous() && !empty($pane['primary_email'])) {
-        if (db_query("SELECT uid FROM {users} WHERE mail LIKE :mail", array(':mail' => $pane['primary_email']))->fetchField() > 0) {
-          form_set_error('panes][customer][primary_email', $form_state, t('An account already exists for your e-mail address. You will either need to login with this e-mail address or use a different e-mail address.'));
-        }
-      }
-
-      // If new users can specify names or passwords then...
-      if (($cart_config->get('new_account_name') ||
-          $cart_config->get('new_account_password')) &&
-          $user->isAnonymous()) {
-        // Skip if an account already exists for this e-mail address.
-        if ($cart_config->get('mail_existing') && db_query("SELECT uid FROM {users} WHERE mail LIKE :mail", array(':mail' => $pane['primary_email']))->fetchField() > 0) {
-          drupal_set_message(t('An account already exists for your e-mail address. The new account details you entered will be disregarded.'));
-        }
-        else {
-          // Validate the username.
-          if ($cart_config->get('new_account_name') && !empty($pane['new_account']['name'])) {
-            $message = user_validate_name($pane['new_account']['name']);
-            if (!empty($message)) {
-              form_set_error('panes][customer][new_account][name', $form_state, $message);
-            }
-            elseif (db_query("SELECT uid FROM {users} WHERE name LIKE :name", array(':name' => $pane['new_account']['name']))->fetchField()) {
-              form_set_error('panes][customer][new_account][name', $form_state, t('The username %name is already taken. Please enter a different name or leave the field blank for your username to be your e-mail address.', array('%name' => $pane['new_account']['name'])));
-            }
-            else {
-              $order->data['new_user']['name'] = $pane['new_account']['name'];
-            }
-          }
-          // Validate the password.
-          if ($cart_config->get('new_account_password')) {
-            if (strcmp($pane['new_account']['pass'], $pane['new_account']['pass_confirm'])) {
-              form_set_error('panes][customer][new_account][pass_confirm', $form_state, t('The passwords you entered did not match. Please try again.'));
-            }
-            if (!empty($pane['new_account']['pass'])) {
-              $order->data['new_user']['hash'] = Drupal::service('password')->hash(trim($pane['new_account']['pass']));
-            }
-          }
-        }
-      }
-
-      if ($user->isAuthenticated()) {
-        $order->setUserId($user->id());
-      }
-      return TRUE;
-
-    case 'review':
-      $review[] = array('title' => t('E-mail'), 'data' => check_plain($order->getEmail()));
-      return $review;
-
-    case 'settings':
-      $form['uc_cart_new_account_details'] = array(
-        '#type' => 'textarea',
-        '#title' => t('New account details help message'),
-        '#description' => t('Enter the help message displayed in the new account details fieldset when shown.'),
-        '#default_value' => $cart_config->get('new_account_details', t('<b>Optional.</b> New customers may supply custom account details.<br />We will create these for you if no values are entered.')),
-      );
-
-      return $form;
-  }
-}
-
-/**
  * Gets the delivery information.
  */
 function uc_checkout_pane_delivery($op, $order, $form = NULL, &$form_state = NULL) {
@@ -327,47 +160,6 @@ function uc_checkout_pane_address_render($form, &$form_state) {
 }
 
 /**
- * Allows a customer to make comments on the order.
- */
-function uc_checkout_pane_comments($op, $order, $form = NULL, &$form_state = NULL) {
-  switch ($op) {
-    case 'view':
-      $description = t('Use this area for special instructions or questions regarding your order.');
-
-      if ($order->id()) {
-        $default = db_query("SELECT message FROM {uc_order_comments} WHERE order_id = :id", array(':id' => $order->id()))->fetchField();
-      }
-      else {
-        $default = NULL;
-      }
-      $contents['comments'] = array(
-        '#type' => 'textarea',
-        '#title' => t('Order comments'),
-        '#default_value' => $default,
-      );
-
-      return array('description' => $description, 'contents' => $contents);
-
-    case 'process':
-      db_delete('uc_order_comments')
-        ->condition('order_id', $order->id())
-        ->execute();
-      if (strlen($form_state['values']['panes']['comments']['comments']) > 0) {
-        uc_order_comment_save($order->id(), 0, $form_state['values']['panes']['comments']['comments'], 'order', uc_order_state_default('post_checkout'), TRUE);
-      }
-      return TRUE;
-
-    case 'review':
-      $review = NULL;
-      $result = db_query("SELECT message FROM {uc_order_comments} WHERE order_id = :id", array(':id' => $order->id()));
-      if ($comment = $result->fetchObject()) {
-        $review[] = array('title' => t('Comment'), 'data' => check_plain($comment->message));
-      }
-      return $review;
-  }
-}
-
-/**
  * Formats the cart contents table on the checkout page.
  *
  * @param $variables
