diff --git a/commerce_pos.routing.yml b/commerce_pos.routing.yml
index 6f9ac26..42573fe 100644
--- a/commerce_pos.routing.yml
+++ b/commerce_pos.routing.yml
@@ -32,10 +32,15 @@ commerce_pos.base:
     _permission: 'access commerce pos pages'
 
 commerce_pos.main:
-  path: '/admin/commerce/pos/main'
+  path: '/admin/commerce/pos/main/{commerce_order}'
   defaults:
-    _controller: '\Drupal\commerce_pos\POS::content'
+    _controller: '\Drupal\commerce_pos\Controller\POS::content'
     _title: 'Point of Sale Interface'
+    commerce_order: null
+  options:
+    parameters:
+      commerce_order:
+        type: 'entity:commerce_order'
   requirements:
     _permission: 'access commerce pos pages'
 
@@ -90,19 +95,6 @@ commerce_pos.close_register:
   requirements:
     _permission: 'access commerce pos pages'
 
-commerce_pos.edit:
-  path: '/admin/commerce/pos/order/{commerce_order}/edit'
-  defaults:
-    _controller: '\Drupal\commerce_pos\POS::content'
-    _title: 'Point of Sale Edit Order'
-  options:
-    parameters:
-      commerce_order:
-        type: 'entity:commerce_order'
-  requirements:
-    _permission: 'access commerce pos pages'
-
-
 commerce_pos.pos_customer_widget_autocomplete:
   path: '/commerce_pos/customerAutoCompleteHandler/{count}'
   defaults:
diff --git a/commerce_pos.services.yml b/commerce_pos.services.yml
index 0938846..3cfecdc 100755
--- a/commerce_pos.services.yml
+++ b/commerce_pos.services.yml
@@ -10,10 +10,6 @@ services:
     class: Drupal\commerce_pos\UPC
     arguments: ['@entity_type.manager']
 
-  commerce_pos.current_order:
-    class: Drupal\commerce_pos\CurrentOrder
-    arguments: ['@user.private_tempstore']
-
   commerce_pos.current_register:
     class: Drupal\commerce_pos\CurrentRegister
 
diff --git a/modules/receipt/src/Controller/PrintController.php b/modules/receipt/src/Controller/PrintController.php
index 8cad115..972bdb8 100644
--- a/modules/receipt/src/Controller/PrintController.php
+++ b/modules/receipt/src/Controller/PrintController.php
@@ -21,10 +21,10 @@ class PrintController extends ControllerBase {
   /**
    * A controller callback.
    */
-  public function ajaxReceipt(OrderInterface $commerce_order, $print_or_email) {
+  public function ajaxReceipt(OrderInterface $order, $print_or_email) {
     $renderer = \Drupal::service('renderer');
 
-    $build = $this->showReceipt($commerce_order);
+    $build = $this->showReceipt($order);
     unset($build['#receipt']['print']);
     $build = $renderer->render($build);
 
@@ -32,7 +32,7 @@ class PrintController extends ControllerBase {
 
     // If the user opted to get an email with the receipt.
     if ($print_or_email == 'email' || $print_or_email == 'print_and_email') {
-      $this->sendEmailReceipt($commerce_order, $build);
+      $this->sendEmailReceipt($order, $build);
 
       // Finally, if the user only wants an email to be sent, we just call the
       // complete order command which submits the form as usual.
@@ -63,18 +63,18 @@ class PrintController extends ControllerBase {
   /**
    * A controller callback.
    */
-  public function showReceipt(OrderInterface $commerce_order) {
+  public function showReceipt(OrderInterface $order) {
 
     $number_formatter_factory = \Drupal::service('commerce_price.number_formatter_factory');
     $number_formatter = $number_formatter_factory->createInstance();
 
-    $sub_total_price = $commerce_order->getSubtotalPrice();
+    $sub_total_price = $order->getSubtotalPrice();
     $currency = Currency::load($sub_total_price->getCurrencyCode());
     $formatted_amount = $number_formatter->formatCurrency($sub_total_price->getNumber(), $currency);
 
     // In the future add a setting to display group or individual for same skus.
     $has_return_items = FALSE;
-    $items = $commerce_order->getItems();
+    $items = $order->getItems();
     foreach ($items as $item) {
       $totals[] = [
         $item->getTitle() . ' (' . $item->getQuantity() . ')',
@@ -91,7 +91,7 @@ class PrintController extends ControllerBase {
 
     // Commerce appears to have a bug where if no adjustments exist, it will
     // return a 0 => null array, which will still trigger a foreach loop.
-    foreach ($commerce_order->collectAdjustments() as $key => $adjustment) {
+    foreach ($order->collectAdjustments() as $key => $adjustment) {
       if (!empty($adjustment)) {
         $amount = $adjustment->getAmount();
         $currency = Currency::load($amount->getCurrencyCode());
@@ -105,16 +105,16 @@ class PrintController extends ControllerBase {
     }
 
     // Collecting the total price on the cart.
-    $total_price = $commerce_order->getTotalPrice();
+    $total_price = $order->getTotalPrice();
     $formatted_amount = $number_formatter->formatCurrency($total_price->getNumber(), $currency);
     $totals[] = ['Total', $formatted_amount];
 
     $payment_storage = \Drupal::entityTypeManager()->getStorage('commerce_payment');
-    $payments = $payment_storage->loadMultipleByOrder($commerce_order);
+    $payments = $payment_storage->loadMultipleByOrder($order);
     foreach ($payments as $payment) {
       $totals[] = ['Payment', $payment->getState()->getLabel()];
     }
-    $ajax_url = URL::fromRoute('commerce_pos_receipt.ajax', ['commerce_order' => $commerce_order->id()], [
+    $ajax_url = URL::fromRoute('commerce_pos_receipt.ajax', ['commerce_order' => $order->id()], [
       'attributes' => [
         'class' => ['use-ajax', 'button'],
       ],
@@ -123,7 +123,7 @@ class PrintController extends ControllerBase {
     $config = \Drupal::config('commerce_pos_receipt.settings');
     $build = ['#theme' => 'commerce_pos_receipt'];
     $build['#receipt'] = [
-      'title' => $has_return_items ? t('Return Receipt for Order #@order_id', ['@order_id' => $commerce_order->id()]) : t('Receipt for Order #@order_id', ['@order_id' => $commerce_order->id()]),
+      'title' => $has_return_items ? t('Return Receipt for Order #@order_id', ['@order_id' => $order->id()]) : t('Receipt for Order #@order_id', ['@order_id' => $order->id()]),
       'header' => [
         '#markup' => check_markup($config->get('header'), $config->get('header_format')),
       ],
@@ -147,29 +147,29 @@ class PrintController extends ControllerBase {
   /**
    * Sends an email with the order receipt.
    *
-   * @param object $commerce_order
+   * @param object $order
    *   The order entity.
    * @param string $build
    *   The receipt markup.
    */
-  public function sendEmailReceipt($commerce_order, $build) {
+  public function sendEmailReceipt($order, $build) {
     $renderer = \Drupal::service('renderer');
 
     // Send an email with the receipt.
     $mail_manager = \Drupal::service('plugin.manager.mail');
     $module = 'commerce_pos_receipt';
     $key = 'commerce_pos_order_receipt';
-    $to = $commerce_order->getEmail();
-    $customer = $commerce_order->getCustomer();
+    $to = $order->getEmail();
+    $customer = $order->getCustomer();
     $themed_email_message = [
       '#theme' => 'commerce-pos-receipt-email',
       '#customer_name' => $customer->getAccountName(),
-      '#order_id' => $commerce_order->id(),
+      '#order_id' => $order->id(),
       '#receipt_markup' => $build,
       '#site_name' => \Drupal::config('system.site')->get('name'),
     ];
     $params['message'] = $renderer->render($themed_email_message);
-    $params['order_id'] = $commerce_order->id();
+    $params['order_id'] = $order->id();
     $langcode = \Drupal::currentUser()->getPreferredLangcode();
     $send = TRUE;
 
@@ -180,14 +180,14 @@ class PrintController extends ControllerBase {
     // If there was a problem sending the email.
     if ($result['result'] !== TRUE) {
       $message = t('There was a problem sending the email to @mail.', [
-        '@mail' => $commerce_order->getEmail(),
+        '@mail' => $order->getEmail(),
       ]);
       $message_type = 'error';
     }
     // Else, if it was successful.
     else {
       $message = $this->t('An email with the receipt has been successfully sent to @mail.', [
-        '@mail' => $commerce_order->getEmail(),
+        '@mail' => $order->getEmail(),
       ]);
     }
 
@@ -205,14 +205,14 @@ class PrintController extends ControllerBase {
   /**
    * Checks if the receipt should be printable. The order needs to be placed.
    *
-   * @param \Drupal\commerce_order\Entity\OrderInterface $commerce_order
+   * @param \Drupal\commerce_order\Entity\OrderInterface $order
    *   The commerce order.
    *
    * @return \Drupal\Core\Access\AccessResultInterface
    *   The access result.
    */
-  public function checkAccess(OrderInterface $commerce_order) {
-    return AccessResult::allowedIf($this->currentUser()->hasPermission('administer commerce_order') && $commerce_order->getPlacedTime())->cachePerPermissions()->cacheUntilEntityChanges($commerce_order);
+  public function checkAccess(OrderInterface $order) {
+    return AccessResult::allowedIf($this->currentUser()->hasPermission('administer commerce_order') && $order->getPlacedTime())->cachePerPermissions()->cacheUntilEntityChanges($order);
   }
 
 }
diff --git a/src/POS.php b/src/Controller/POS.php
similarity index 68%
rename from src/POS.php
rename to src/Controller/POS.php
index 1f144ce..4625241 100644
--- a/src/POS.php
+++ b/src/Controller/POS.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Drupal\commerce_pos;
+namespace Drupal\commerce_pos\Controller;
 
 use Drupal\commerce_pos\Form\POSForm;
 use Drupal\Core\Controller\ControllerBase;
@@ -15,6 +15,11 @@ use Drupal\user\PrivateTempStoreFactory;
  */
 class POS extends ControllerBase {
 
+  /**
+   * The commerce_pos private temp store key for the current order ID.
+   */
+  const CURRENT_ORDER_KEY = 'current_order_id';
+
   /**
    * The container object.
    *
@@ -25,17 +30,10 @@ class POS extends ControllerBase {
   /**
    * The tempstore object.
    *
-   * @var \Drupal\user\SharedTempStore
+   * @var \Drupal\user\PrivateTempStore
    */
   protected $tempStore;
 
-  /**
-   * The currentOrder object.
-   *
-   * @var \Drupal\commerce_pos\CurrentOrder
-   */
-  protected $currentOrder;
-
   /**
    * Constructs a new POS object.
    *
@@ -43,13 +41,10 @@ class POS extends ControllerBase {
    *   The service container.
    * @param \Drupal\user\PrivateTempStoreFactory $temp_store_factory
    *   The tempstore factory.
-   * @param \Drupal\commerce_pos\CurrentOrder $current_order
-   *   The current order service.
    */
-  public function __construct(ContainerInterface $container, PrivateTempStoreFactory $temp_store_factory, CurrentOrder $current_order) {
+  public function __construct(ContainerInterface $container, PrivateTempStoreFactory $temp_store_factory) {
     $this->container = $container;
     $this->tempStore = $temp_store_factory->get('commerce_pos');
-    $this->currentOrder = $current_order;
   }
 
   /**
@@ -58,40 +53,42 @@ class POS extends ControllerBase {
   public static function create(ContainerInterface $container) {
     return new static(
       $container,
-      $container->get('user.private_tempstore'),
-      $container->get('commerce_pos.current_order')
+      $container->get('user.private_tempstore')
     );
   }
 
   /**
    * Builds the POS form.
    *
-   * @param \Drupal\commerce_order\Entity\Order $commerce_order
+   * @param \Drupal\commerce_order\Entity\Order $order
    *   The order to edit.
    *
    * @return array
    *   A renderable array containing the POS form.
    */
-  public function content(Order $commerce_order = NULL) {
+  public function content(Order $order = NULL) {
     $register = \Drupal::service('commerce_pos.current_register')->get();
 
     if (empty($register) || !$register->isOpen()) {
+      // If we're opening a new register, clear our current order. If it exists
+      // we don't want to pick up an older order at this point.
+      $this->tempStore->set('current_order_id', FALSE);
+
       return \Drupal::formBuilder()->getForm('\Drupal\commerce_pos\Form\RegisterSelectForm');
     }
 
     $store_id = $register->getStoreId();
 
-    // If an order has been passed through, set that as the current order.
-    if ($commerce_order) {
-      $order = $commerce_order;
-      $this->currentOrder->set($commerce_order);
-    }
-    // If we don't have an order, try to load the current order.
-    else {
-      $order = $this->currentOrder->get();
+    // If no order has been passed through and we have a current order ID. Check
+    // the validity of the current order.
+    $current_order_id = $this->tempStore->get('current_order_id');
+    if (!$order && $current_order_id) {
+      $order = Order::load($current_order_id);
+      // Order may not have started on this register, so always set the register.
+      $order->set('field_register', $register->id());
     }
 
-    // If we still don't have an order.
+    // Create a new draft order if we still don't have an order.
     if (!$order) {
       $order = Order::create([
         'type' => 'pos',
@@ -100,12 +97,14 @@ class POS extends ControllerBase {
         'field_cashier' => \Drupal::currentUser()->id(),
         'field_register' => $register->id(),
       ]);
-
+      // Immediately create a new draft order.
       $order->save();
-
-      $this->currentOrder->set($order);
     }
 
+    // Store the current order ID in the private store so that a cashier can
+    // easily return to the same order.
+    $this->tempStore->set('current_order_id', $order->id());
+
     $form_object = POSForm::create($this->container);
     $form_object->setEntity($order);
 
@@ -127,7 +126,7 @@ class POS extends ControllerBase {
     $form_state->set('initial_items_on_order', $initial_items_on_order);
 
     // Set the step to edit order, if we're editing a completed order.
-    if ($commerce_order || $order->getState()->getValue()['value'] == 'completed') {
+    if ($order->getState()->getValue()['value'] == 'completed') {
       $form_state->set('is_edit_order', TRUE);
     }
 
diff --git a/src/Controller/ParkedOrders.php b/src/Controller/ParkedOrders.php
index 94bebc3..46f2f24 100644
--- a/src/Controller/ParkedOrders.php
+++ b/src/Controller/ParkedOrders.php
@@ -25,20 +25,17 @@ class ParkedOrders extends OrderLookup {
   /**
    * Retrieves a parked order.
    *
-   * @param \Drupal\commerce_order\Entity\Order $commerce_order
+   * @param \Drupal\commerce_order\Entity\Order $order
    *   The parked order to retrieve.
    */
-  public function parkedOrderRetrieve(Order $commerce_order) {
-    if ($commerce_order->getState()->value !== 'parked') {
+  public function parkedOrderRetrieve(Order $order) {
+    if ($order->getState()->value !== 'parked') {
       throw new AccessDeniedHttpException('Only parked orders can be retrieved');
     }
-    $commerce_order->set('state', 'draft');
-    $commerce_order->save();
+    $order->set('state', 'draft');
+    $order->save();
 
-    \Drupal::service('commerce_pos.current_order')->clear();
-    \Drupal::service('commerce_pos.current_order')->set($commerce_order);
-
-    $pos_url = Url::fromRoute('commerce_pos.main');
+    $pos_url = Url::fromRoute('commerce_pos.main', ['commerce_order' => $order->id()]);
 
     $response = new RedirectResponse($pos_url->toString());
     $response->send();
diff --git a/src/CurrentOrder.php b/src/CurrentOrder.php
deleted file mode 100644
index e1cc750..0000000
--- a/src/CurrentOrder.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-namespace Drupal\commerce_pos;
-
-use Drupal\commerce_order\Entity\Order;
-use Drupal\user\PrivateTempStoreFactory;
-
-/**
- * Get the current order for the POS.
- */
-class CurrentOrder {
-
-  /**
-   * The tempstore object.
-   *
-   * @var \Drupal\user\SharedTempStore
-   */
-  protected $tempStore;
-
-  /**
-   * Constructs a new CurrentOrder object.
-   *
-   * @param \Drupal\user\PrivateTempStoreFactory $temp_store_factory
-   *   The tempstore factory.
-   */
-  public function __construct(PrivateTempStoreFactory $temp_store_factory) {
-    $this->tempStore = $temp_store_factory->get('commerce_pos');
-  }
-
-  /**
-   * Takes a provided order and sets its ID as the current one.
-   *
-   * @param \Drupal\commerce_order\Entity\Order $order
-   *   The order object you wish to save the ID from.
-   */
-  public function set(Order $order) {
-    $this->tempStore->set('order', $order->id());
-  }
-
-  /**
-   * Clear out the current order, like if we want to switch registers.
-   */
-  public function clear() {
-    $this->tempStore->delete('order');
-  }
-
-  /**
-   * Gets the active order_id stored in the session and loads it.
-   *
-   * @return \Drupal\commerce_order\Entity\Order|null
-   *   An entity object. NULL if no matching entity is found.
-   */
-  public function get() {
-    $order_id = $this->tempStore->get('order');
-
-    return $order_id ? Order::load($order_id) : NULL;
-  }
-
-}
diff --git a/src/Form/OrderLookupForm.php b/src/Form/OrderLookupForm.php
index 05bc8d9..21d32cb 100644
--- a/src/Form/OrderLookupForm.php
+++ b/src/Form/OrderLookupForm.php
@@ -223,7 +223,7 @@ class OrderLookupForm extends FormBase {
           'target' => '_blank',
         ],
       ]);
-      $edit_url = Url::fromRoute('commerce_pos.edit', ['commerce_order' => $order->id()]);
+      $edit_url = Url::fromRoute('commerce_pos.main', ['commerce_order' => $order->id()]);
 
       $cashier = User::load($order->get('field_cashier')->getValue()[0]['target_id']);
 
diff --git a/src/Form/POSForm.php b/src/Form/POSForm.php
index 6038c4a..d355528 100644
--- a/src/Form/POSForm.php
+++ b/src/Form/POSForm.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\commerce_pos\Form;
 
+use Drupal\commerce_order\Entity\OrderInterface;
+use Drupal\commerce_pos\POS;
 use Drupal\commerce_price\Price;
 use Drupal\commerce_store\CurrentStore;
 use Drupal\Component\Datetime\TimeInterface;
@@ -11,6 +13,7 @@ use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Url;
 use Drupal\commerce_price\Entity\Currency;
+use Drupal\user\PrivateTempStoreFactory;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -25,6 +28,13 @@ class POSForm extends ContentEntityForm {
    */
   protected $currentStore;
 
+  /**
+   * The private temp store.
+   *
+   * @var \Drupal\user\PrivateTempStore
+   */
+  protected $tempStore;
+
   /**
    * Constructs a new POSForm object.
    *
@@ -37,11 +47,12 @@ class POSForm extends ContentEntityForm {
    * @param \Drupal\commerce_store\CurrentStore $current_store
    *   The current store object.
    */
-  public function __construct(EntityManagerInterface $entity_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info, TimeInterface $time, CurrentStore $current_store) {
+  public function __construct(EntityManagerInterface $entity_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info, TimeInterface $time, CurrentStore $current_store, PrivateTempStoreFactory $temp_store_factory) {
     parent::__construct($entity_manager, $entity_type_bundle_info, $time);
 
     $this->currentStore = $current_store;
     $this->logStorage = $entity_manager->getStorage('commerce_log');
+    $this->tempStore = $temp_store_factory->get('commerce_pos');
   }
 
   /**
@@ -53,7 +64,7 @@ class POSForm extends ContentEntityForm {
       $container->get('entity_type.bundle.info'),
       $container->get('datetime.time'),
       $container->get('commerce_store.current_store'),
-      $container->get('commerce_pos.current_order')
+      $container->get('user.private_tempstore')
     );
   }
 
@@ -378,12 +389,17 @@ class POSForm extends ContentEntityForm {
   /**
    * Adds a commerce log to an order.
    *
-   * @param object $order
+   * @param \Drupal\commerce_order\Entity\OrderInterface $order
    *   The order entity.
    * @param string $comment
    *   The order comment.
    */
-  public function saveOrderComment($order, $comment) {
+  public function saveOrderComment(OrderInterface $order, $comment) {
+    // In order to add a comment to an order it needs to be saved. This should
+    // never be the case but this is defensive code.
+    if ($order->isNew()) {
+      $order->save();
+    }
     $this->logStorage->generate($order, 'order_comment', [
       'comment' => $comment,
     ])->save();
@@ -564,7 +580,7 @@ class POSForm extends ContentEntityForm {
     $order->getState()->applyTransition($transition);
     $order->save();
 
-    $this->clearOrder();
+    $this->clearOrder($form_state);
   }
 
   /**
@@ -760,13 +776,24 @@ class POSForm extends ContentEntityForm {
 
   /**
    * Clear the existing order, so a new one can be created.
+   *
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   Form state object.
    */
-  protected function clearOrder() {
-    \Drupal::service('commerce_pos.current_order')->clear();
+  protected function clearOrder(FormStateInterface $form_state) {
+    $this->tempStore->delete(POS::CURRENT_ORDER_KEY);
+    // Redirecting back to the main route will create a new draft order.
+    $pos_url = Url::fromRoute('commerce_pos.main');
+    $form_state->setRedirectUrl($pos_url);
   }
 
   /**
    * Parks current order.
+   *
+   * @param array $form
+   *   Form element.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   Form state object.
    */
   public function parkOrder(array &$form, FormStateInterface $form_state) {
     /** @var \Drupal\commerce_order\Entity\OrderInterface $order */
@@ -781,7 +808,7 @@ class POSForm extends ContentEntityForm {
     $order->set('state', 'parked')
       ->save();
 
-    $this->clearOrder();
+    $this->clearOrder($form_state);
 
     drupal_set_message($this->t('Order @order_id has been parked', ['@order_id' => $order->id()]));
   }
diff --git a/src/Plugin/Field/FieldWidget/PosOrderItemWidget.php b/src/Plugin/Field/FieldWidget/PosOrderItemWidget.php
index 96634d4..3e5d25b 100644
--- a/src/Plugin/Field/FieldWidget/PosOrderItemWidget.php
+++ b/src/Plugin/Field/FieldWidget/PosOrderItemWidget.php
@@ -391,6 +391,8 @@ class PosOrderItemWidget extends WidgetBase implements WidgetInterface, Containe
       $order = $this->updateQuantity($items, $form, $form_state);
     }
     if ($order) {
+      // Update the draft order with the changes.
+      $order->recalculateTotalPrice()->save();
       // Update the order on the form.
       $form_object = $form_state->getFormObject();
       $form_object->setEntity($order);
@@ -422,7 +424,7 @@ class PosOrderItemWidget extends WidgetBase implements WidgetInterface, Containe
     $new_quantity = $form_state->getValue($value_key);
 
     /** @var \Drupal\commerce_order\Entity\Order $order */
-    $order = $order_item->getOrder();
+    $order = $form_state->getFormObject()->getEntity();
     if ($new_quantity > 0) {
       $order_item->setQuantity($new_quantity);
       $order_item->save();
@@ -431,8 +433,6 @@ class PosOrderItemWidget extends WidgetBase implements WidgetInterface, Containe
       $order->removeItem($order_item);
       $order_item->delete();
     }
-    $order->recalculateTotalPrice()->save();
-
     return $order;
   }
 
@@ -454,11 +454,9 @@ class PosOrderItemWidget extends WidgetBase implements WidgetInterface, Containe
     $order_item = OrderItem::load($trigger_element['#order_item_id']);
 
     /** @var \Drupal\commerce_order\Entity\Order $order */
-    $order = $order_item->getOrder();
+    $order = $form_state->getFormObject()->getEntity();
     $order->removeItem($order_item);
     $order_item->delete();
-    $order->recalculateTotalPrice()->save();
-
     return $order;
   }
 
@@ -482,7 +480,7 @@ class PosOrderItemWidget extends WidgetBase implements WidgetInterface, Containe
     $order_item = OrderItem::load($trigger_element['#order_item_id']);
 
     /** @var \Drupal\commerce_order\Entity\Order $order */
-    $order = $order_item->getOrder();
+    $order = $form_state->getFormObject()->getEntity();
 
     // Loading the product variation object.
     $product_variation = ProductVariation::load($order_item->getPurchasedEntityId());
@@ -499,20 +497,15 @@ class PosOrderItemWidget extends WidgetBase implements WidgetInterface, Containe
       'title' => $product_variation->label(),
       'purchased_entity' => $product_variation,
       'quantity' => 1,
-      'unit_price' => [
-        'number' => '-' . $product_variation->get('price')->number,
-        'currency_code' => $order_item->getUnitPrice()->getCurrencyCode(),
-      ],
       'data' => [
         'return_for_order_item' => $order_item->id(),
       ],
     ]);
-    $new_order_item->save();
+    $price = new Price('-' . $product_variation->get('price')->number, $order_item->getUnitPrice()->getCurrencyCode());
+    $new_order_item->setUnitPrice($price, TRUE)->save();
 
     // Add the new item into the order.
-    $order->addItem($new_order_item)->recalculateTotalPrice()->save();
-    $items->appendItem($new_order_item);
-
+    $order->addItem($new_order_item);
     return $order;
   }
 
@@ -536,7 +529,7 @@ class PosOrderItemWidget extends WidgetBase implements WidgetInterface, Containe
     $order_item = OrderItem::load($trigger_element['#order_item_id']);
 
     /** @var \Drupal\commerce_order\Entity\Order $order */
-    $order = $order_item->getOrder();
+    $order = $form_state->getFormObject()->getEntity();
 
     // Toggles the order item as a return item and change the unit price to a
     // negative price.
@@ -554,10 +547,6 @@ class PosOrderItemWidget extends WidgetBase implements WidgetInterface, Containe
         ->getNumber(), $order_item->getUnitPrice()->getCurrencyCode()), TRUE)
         ->save();
     }
-
-    // Recalculate the order total price and save.
-    $order->recalculateTotalPrice()->save();
-
     return $order;
   }
 
@@ -583,11 +572,11 @@ class PosOrderItemWidget extends WidgetBase implements WidgetInterface, Containe
     $order_item = OrderItem::load($items->get($value_key[3])
       ->getValue()['target_id']);
     /** @var \Drupal\commerce_order\Entity\Order $order */
-    $order = $order_item->getOrder();
+    $order = $form_state->getFormObject()->getEntity();
 
-    $order_item->setUnitPrice(new Price($value['number'], $value['currency_code']), TRUE)
+    $order_item
+      ->setUnitPrice(new Price($value['number'], $value['currency_code']), TRUE)
       ->save();
-    $order->recalculateTotalPrice()->save();
 
     return $order;
   }
@@ -620,10 +609,7 @@ class PosOrderItemWidget extends WidgetBase implements WidgetInterface, Containe
 
     // If there is already an order item for this variation add to the quantity.
     $create_new_order_item = TRUE;
-    // @todo For some reason the following doesn't work.
-    // $order = $form_state->getFormObject()->getEntity();
-    // $order = Order::load($order->id());
-    $order = \Drupal::getContainer()->get('commerce_pos.current_order')->get();
+    $order = $form_state->getFormObject()->getEntity();
     /** @var \Drupal\commerce_order\Entity\OrderItem $order_item */
     foreach ($order->getItems() as $order_item) {
       if ($order_item->getPurchasedEntity()
@@ -633,8 +619,6 @@ class PosOrderItemWidget extends WidgetBase implements WidgetInterface, Containe
         $order_item
           ->setQuantity($order_item->getQuantity() + 1)
           ->save();
-        $order->recalculateTotalPrice();
-        $order->save();
         break;
       }
     }
@@ -650,8 +634,7 @@ class PosOrderItemWidget extends WidgetBase implements WidgetInterface, Containe
       $order_item->save();
 
       // Adding the item into the Order.
-      $order->addItem($order_item)->recalculateTotalPrice()->save();
-      $items->appendItem($order_item);
+      $order->addItem($order_item);
     }
 
     return $order;
diff --git a/tests/src/Functional/CommercePosCreateStoreTrait.php b/tests/src/Functional/CommercePosCreateStoreTrait.php
index c296570..3421608 100644
--- a/tests/src/Functional/CommercePosCreateStoreTrait.php
+++ b/tests/src/Functional/CommercePosCreateStoreTrait.php
@@ -18,7 +18,15 @@ trait CommercePosCreateStoreTrait {
   use RandomGeneratorTrait;
   use StoreCreationTrait;
 
-  public $register;
+  /**
+   * @var \Drupal\commerce_store\Entity\StoreInterface
+   */
+  protected $store;
+
+  /**
+   * @var \Drupal\commerce_pos\Entity\RegisterInterface
+   */
+  protected $register;
 
   /**
    * Creates a ProductVariation entity.
diff --git a/tests/src/Functional/CurrentOrderTest.php b/tests/src/Functional/CurrentOrderTest.php
deleted file mode 100644
index 185e479..0000000
--- a/tests/src/Functional/CurrentOrderTest.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-namespace Drupal\Tests\commerce_pos\Functional;
-
-use Drupal\Tests\commerce\Functional\CommerceBrowserTestBase;
-use Drupal\commerce_order\Entity\Order;
-
-/**
- * Tests the CurrentOrder get and set.
- *
- * @coversDefaultClass \Drupal\commerce_pos\CurrentOrder
- * @group commerce_pos
- */
-class CurrentOrderTest extends CommerceBrowserTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = [
-    'commerce_pos',
-  ];
-
-  /**
-   * Test an order can get set and retrieved correctly.
-   */
-  public function testSetGet() {
-    // Ensure that before an order is set the current order is null.
-    $this->assertNull($this->container->get('commerce_pos.current_order')->get());
-
-    $order = Order::create([
-      'type' => 'pos',
-    ]);
-
-    $order->save();
-
-    $this->container->get('commerce_pos.current_order')->set($order);
-
-    $retrieved_order = $this->container->get('commerce_pos.current_order')->get();
-
-    $this->assertEquals($order->id(), $retrieved_order->id());
-  }
-
-}
diff --git a/tests/src/FunctionalJavascript/ParkOrderTest.php b/tests/src/FunctionalJavascript/ParkOrderTest.php
index 816a216..253a8b4 100644
--- a/tests/src/FunctionalJavascript/ParkOrderTest.php
+++ b/tests/src/FunctionalJavascript/ParkOrderTest.php
@@ -77,12 +77,13 @@ class ParkOrderTest extends JavascriptTestBase {
     $this->assertEquals('disabled', $button->getAttribute('disabled'));
 
     // Check whether an order cannot be retrieved if current order is not empty.
-    $autocomplete_field = $this->getSession()->getPage()->findField('order_items[target_id][product_selector]');
-    $autocomplete_field->setValue('Jum');
-    $this->getSession()->getDriver()->keyDown($autocomplete_field->getXpath(), 'p');
+    // Add a T-Shirt.
+    $autocomplete_field->setValue('T');
+    $this->getSession()->getDriver()->keyDown($autocomplete_field->getXpath(), '-');
     $web_assert->waitOnAutocomplete();
     $results = $this->getSession()->getPage()->findAll('css', '.ui-autocomplete li');
     $this->assertCount(3, $results);
+    // Click on of the auto-complete.
     $results[0]->click();
     $web_assert->assertWaitOnAjaxRequest();
 
@@ -108,25 +109,33 @@ class ParkOrderTest extends JavascriptTestBase {
     $retrieve_link_href = $retrieve_link->getAttribute('href');
     $retrieve_link->click();
 
+    $out = $this->getSession()->getPage()->getContent();
+    $html_output = 'GET request to: ' . $this->getSession()->getCurrentUrl();
+    $html_output .= '<hr />' . $out;
+    $html_output .= $this->getHtmlOutputHeaders();
+    $this->htmlOutput($html_output);
+
     // Confirm we are redirected back to the POS.
-    $url = Url::fromRoute('commerce_pos.main');
+    $url = Url::fromRoute('commerce_pos.main', ['commerce_order' => 1]);
     $this->assertEquals($this->getAbsoluteUrl($url->toString()), $this->getUrl());
+    // Assert that the product is listed as expected.
+    $web_assert->pageTextContains('Jumper');
+    $web_assert->fieldValueEquals('order_items[target_id][order_items][0][quantity]', '1.00');
+    $web_assert->fieldValueEquals('order_items[target_id][order_items][0][unit_price][number]', '50.00');
+    $web_assert->pageTextContains('Total $50.00');
+    $web_assert->pageTextContains('To Pay $50.00');
 
     // Order 1 has indeed been set back to 'draft'.
     $order = Order::load(1);
     $this->assertEquals($order->getState()->value, 'draft');
 
-    // And confirm our current order is Order 1 again.
-    $order = \Drupal::service('commerce_pos.current_order')->get();
-    $this->assertEquals($order->id(), 1);
-
     // Complete the order and edit it to ensure we can not park completed
     // orders.
     $this->getSession()->getPage()->findButton('Payments and Completion')->click();
     $this->click('#edit-keypad-add');
     $web_assert->waitForButton('commerce-pos-finish');
     $this->click('input[name="commerce-pos-finish"]');
-    $this->drupalGet(Url::fromRoute('commerce_pos.edit', ['commerce_order' => 1]));
+    $this->drupalGet(Url::fromRoute('commerce_pos.main', ['commerce_order' => 1]));
     $web_assert->buttonNotExists('Park Order');
     \Drupal::entityTypeManager()->getStorage('commerce_order')->resetCache([1]);
     $order = Order::load(1);
diff --git a/tests/src/FunctionalJavascript/PosFormTest.php b/tests/src/FunctionalJavascript/PosFormTest.php
index cd93349..1ef9664 100644
--- a/tests/src/FunctionalJavascript/PosFormTest.php
+++ b/tests/src/FunctionalJavascript/PosFormTest.php
@@ -3,6 +3,8 @@
 namespace Drupal\Tests\commerce_pos\FunctionalJavascript;
 
 use Drupal\commerce_order\Entity\Order;
+use Drupal\commerce_pos\Entity\Register;
+use Drupal\commerce_price\Price;
 use Drupal\commerce_tax\Entity\TaxType;
 use Drupal\Component\Utility\Html;
 use Drupal\Core\Entity\Entity\EntityFormDisplay;
@@ -23,6 +25,7 @@ class PosFormTest extends JavascriptTestBase {
    * @var array
    */
   public static $modules = [
+    'block',
     'commerce_pos',
   ];
 
@@ -231,7 +234,6 @@ class PosFormTest extends JavascriptTestBase {
     // Clicking finish will bring us back to the order item screen - processing
     // a new order.
     $this->click('input[name="commerce-pos-finish"]');
-    $this->waitForAjaxToFinish();
     $web_assert->pageTextContains('Total $0.00');
     $web_assert->pageTextNotContains('Cash');
     $web_assert->pageTextContains('To Pay $0.00');
@@ -381,6 +383,89 @@ class PosFormTest extends JavascriptTestBase {
     $this->assertCount(1, $results);
   }
 
+  /**
+   * Tests the current order logic on the POS form.
+   */
+  public function testCommercePosFormCurrentOrder() {
+    $this->drupalPlaceBlock('local_tasks_block');
+    $web_assert = $this->assertSession();
+    $this->drupalGet('admin/commerce/pos/main');
+
+    $this->getSession()->getPage()->fillField('register', '1');
+    $this->getSession()->getPage()->fillField('float[number]', '10.00');
+    $this->getSession()->getPage()->findButton('Open Register')->click();
+
+    // Now we should be able to select order items.
+    $autocomplete_field = $this->getSession()
+      ->getPage()
+      ->findField('order_items[target_id][product_selector]');
+    $autocomplete_field->setValue('Jum');
+    $this->getSession()
+      ->getDriver()
+      ->keyDown($autocomplete_field->getXpath(), 'p');
+    $web_assert->waitOnAutocomplete();
+    $results = $this->getSession()
+      ->getPage()
+      ->findAll('css', '.ui-autocomplete li');
+    $this->assertCount(3, $results);
+    // Click on of the auto-complete.
+    $results[0]->click();
+    $web_assert->assertWaitOnAjaxRequest();
+
+    // Assert that the product is listed as expected.
+    $web_assert->pageTextContains('Jumper');
+    $web_assert->fieldValueEquals('order_items[target_id][order_items][0][quantity]', '1.00');
+    $web_assert->fieldValueEquals('order_items[target_id][order_items][0][unit_price][number]', '50.00');
+    $web_assert->pageTextContains('Total $50.00');
+    $web_assert->pageTextContains('To Pay $50.00');
+
+    // After selecting something from the autocomplete list the value should be
+    // blank again.
+    $web_assert->fieldValueEquals('order_items[target_id][product_selector]', '');
+
+    // Test the current order persistence. We should be able to navigate away
+    // from the page and return to it.
+    $this->drupalGet('');
+    $this->drupalGet('admin/commerce/pos/main');
+
+    // Assert that the product is listed as expected.
+    $web_assert->pageTextContains('Jumper');
+    $web_assert->fieldValueEquals('order_items[target_id][order_items][0][quantity]', '1.00');
+    $web_assert->fieldValueEquals('order_items[target_id][order_items][0][unit_price][number]', '50.00');
+    $web_assert->pageTextContains('Total $50.00');
+    $web_assert->pageTextContains('To Pay $50.00');
+
+    // Close the register and re-open it.
+    $this->clickLink('Close Register');
+    $web_assert->pageTextContains('Register Test register has been closed.');
+    $this->getSession()->getPage()->findButton('Open Register')->click();
+
+    // We've opened the register, we should not have the previous order.
+    $web_assert->pageTextNotContains('Jumper');
+    $web_assert->pageTextContains('Total $0.00');
+    $web_assert->pageTextContains('To Pay $0.00');
+
+    // Create a new register and close the current one.
+    $register = Register::create([
+      'store_id' => $this->store->id(),
+      'name' => 'Another register',
+      'default_float' => new Price('100.00', 'USD'),
+    ]);
+    $register->save();
+    $this->clickLink('Close Register');
+
+    $web_assert->pageTextContains('Register Test register has been closed.');
+
+    // Open the new register. The current order will be reset.
+    $this->getSession()->getPage()->fillField('register', $register->id());
+    $this->getSession()->getPage()->findButton('Open Register')->click();
+    $web_assert->pageTextContains('Total $0.00');
+    $web_assert->pageTextNotContains('Cash');
+    $web_assert->pageTextContains('To Pay $0.00');
+    $web_assert->pageTextContains('Change $0.00');
+    $web_assert->pageTextNotContains('Jumper');
+  }
+
   /**
    * Waits for jQuery to become active and animations to complete.
    */
diff --git a/tests/src/FunctionalJavascript/PosReturnFormTest.php b/tests/src/FunctionalJavascript/PosReturnFormTest.php
index 1e389ab..fabf166 100644
--- a/tests/src/FunctionalJavascript/PosReturnFormTest.php
+++ b/tests/src/FunctionalJavascript/PosReturnFormTest.php
@@ -4,6 +4,7 @@ namespace Drupal\Tests\commerce_pos\FunctionalJavascript;
 
 use Drupal\commerce_tax\Entity\TaxType;
 use Drupal\Core\Entity\Entity\EntityFormDisplay;
+use Drupal\Core\Url;
 use Drupal\FunctionalJavascriptTests\JavascriptTestBase;
 use Drupal\Tests\commerce_pos\Functional\CommercePosCreateStoreTrait;
 
@@ -116,7 +117,8 @@ class PosReturnFormTest extends JavascriptTestBase {
     // Click on our newly created order's edit button so we can do a return.
     $web_assert->pageTextContains('edit');
     $this->getSession()->getPage()->clickLink('edit');
-    $web_assert->addressEquals('admin/commerce/pos/order/1/edit');
+    $url = Url::fromRoute('commerce_pos.main', ['commerce_order' => 1]);
+    $this->assertEquals($this->getAbsoluteUrl($url->toString()), $this->getUrl());
 
     // Ensure the totals are correct.
     $web_assert->pageTextContains('Total $100.00');
diff --git a/tests/src/FunctionalJavascript/SetOrderCustomerTest.php b/tests/src/FunctionalJavascript/SetOrderCustomerTest.php
index 5a5543e..12f2531 100644
--- a/tests/src/FunctionalJavascript/SetOrderCustomerTest.php
+++ b/tests/src/FunctionalJavascript/SetOrderCustomerTest.php
@@ -45,8 +45,6 @@ class SetOrderCustomerTest extends JavascriptTestBase {
     $this->getSession()->getPage()->fillField('float[number]', '10.00');
     $this->getSession()->getPage()->findButton('Open Register')->click();
 
-    $this->createScreenshot(\Drupal::root() . '/sites/default/files/simpletest/screen.jpg');
-
     // Confirm we have a customer fieldset with radio buttons.
     $web_assert->fieldExists('uid[0][target_id][order_customer][customer_type]');
     $web_assert->pageTextContains('Existing Customer');
@@ -54,7 +52,7 @@ class SetOrderCustomerTest extends JavascriptTestBase {
     // Confirm we see a textfield to enter the username, name, or email.
     $web_assert->fieldExists('uid[0][target_id][order_customer][user]');
 
-    // ---CONFIRM 'ANON' USER BY COMPLETING ORDER WITHOUT SETTING A CUSTOMER---.
+    // Confirm 'Anon' user by completing order without setting a customer.
     // Add an order item to the POS order.
     $autocomplete_field = $this->getSession()->getPage()->findField('order_items[target_id][product_selector]');
     $autocomplete_field->setValue('Jum');
@@ -78,7 +76,7 @@ class SetOrderCustomerTest extends JavascriptTestBase {
     $this->drupalGet('admin/commerce/pos/orders');
     $web_assert->pageTextContains('Anonymous');
 
-    // ---CONFIRM COMPLETING ORDER BY SETTING A NEW CUSTOMER---.
+    // Confirm completing order by setting a new customer.
     $this->drupalGet('admin/commerce/pos/main');
 
     // Click the 'New Customer' radio button and confirm the different fields.
@@ -116,7 +114,7 @@ class SetOrderCustomerTest extends JavascriptTestBase {
     $this->drupalGet('admin/commerce/pos/orders');
     $web_assert->elementTextContains('xpath', '//*[@id="edit-results"]/table/tbody/tr[1]/td[5]/a', 'test@test.com');
 
-    // ---CONFIRM COMPLETING ORDER BY SETTING AN EXISTING CUSTOMER---.
+    // Confirm completing order by setting an existing customer.
     $this->drupalGet('admin/commerce/pos/main');
 
     // Now select an existing user and set that user as the order customer.
