diff --git a/commerce_pos.routing.yml b/commerce_pos.routing.yml
index 5e0515b..bd50cc1 100644
--- a/commerce_pos.routing.yml
+++ b/commerce_pos.routing.yml
@@ -31,10 +31,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'
 
@@ -89,18 +94,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/src/POS.php b/src/Controller/POS.php
similarity index 63%
rename from src/POS.php
rename to src/Controller/POS.php
index 20c8e2f..710457f 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,8 +53,7 @@ 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')
     );
   }
 
@@ -76,38 +70,46 @@ class POS extends ControllerBase {
     $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 $this->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 (!$commerce_order && $current_order_id) {
+      $commerce_order = Order::load($current_order_id);
     }
 
-    // If we still don't have an order.
-    if (!$order) {
-      $order = Order::create([
+    // Create a new draft order if we still don't have an order.
+    if (!$commerce_order) {
+      $commerce_order = Order::create([
         'type' => 'pos',
         'store_id' => $store_id,
         'uid' => User::getAnonymousUser()->id(),
         'field_cashier' => $this->currentUser()->id(),
         'field_register' => $register->id(),
       ]);
-
-      $order->save();
-
-      $this->currentOrder->set($order);
+      // Immediately create a new draft order.
+      $commerce_order->save();
+    }
+    elseif ($commerce_order->field_register->entity->id() != $register->id() && $commerce_order->getState()->value != 'completed') {
+      // The order is not on this register so it needs to be updated.
+      $commerce_order->set('field_register', $register->id());
+      $commerce_order->save();
     }
 
+    // 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', $commerce_order->id());
+
     $form_object = POSForm::create($this->container);
-    $form_object->setEntity($order);
+    $form_object->setEntity($commerce_order);
 
     $form_object
       ->setModuleHandler($this->moduleHandler())
@@ -120,14 +122,14 @@ class POS extends ControllerBase {
     // Save the existing order items in the order to the form state so we could
     // keep track of what changed during this particular transaction.
     $initial_items_on_order = [];
-    foreach ($order->getItems() as $order_item) {
+    foreach ($commerce_order->getItems() as $order_item) {
       /** @var \Drupal\commerce_order\Entity\OrderItem $order_item */
       $initial_items_on_order[$order_item->id()] = $order_item->getPurchasedEntityId();
     }
     $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 ($commerce_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 b2e60a7..68a5e9e 100644
--- a/src/Controller/ParkedOrders.php
+++ b/src/Controller/ParkedOrders.php
@@ -26,10 +26,7 @@ class ParkedOrders extends ControllerBase {
     $commerce_order->set('state', 'draft');
     $commerce_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' => $commerce_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 cc75602..9e0948e 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 fa3e394..5cc2e1b 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\Controller\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')
     );
   }
 
@@ -379,12 +390,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();
@@ -565,7 +581,7 @@ class POSForm extends ContentEntityForm {
     $order->getState()->applyTransition($transition);
     $order->save();
 
-    $this->clearOrder();
+    $this->clearOrder($form_state);
   }
 
   /**
@@ -762,13 +778,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 */
@@ -783,7 +810,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 0877729..cc403f8 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..b834847 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();
 
@@ -109,24 +110,26 @@ class ParkOrderTest extends JavascriptTestBase {
     $retrieve_link->click();
 
     // 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 a87e1c3..53aeb13 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;
@@ -24,6 +26,7 @@ class PosFormTest extends JavascriptTestBase {
    * @var array
    */
   public static $modules = [
+    'block',
     'commerce_pos',
   ];
 
@@ -232,7 +235,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');
@@ -241,7 +243,7 @@ class PosFormTest extends JavascriptTestBase {
 
     // Ensure the order is completed and that payments can no longer be voided.
     $this->assertEquals('completed', Order::load(1)->getState()->value);
-    $this->drupalGet(Url::fromRoute('commerce_pos.edit', ['commerce_order' => 1]));
+    $this->drupalGet(Url::fromRoute('commerce_pos.main', ['commerce_order' => 1]));
     $web_assert->pageTextContains('Total Paid $130.00');
     $void_buttons = $this->getSession()->getPage()->findAll('css', 'input[name="commerce-pos-pay-keypad-remove"]');
     $this->assertCount(0, $void_buttons);
@@ -390,6 +392,131 @@ 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');
+
+    // 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->pageTextContains('Total $50.00');
+
+    // Park the order and force the register to change. This should change the
+    // register on the order.
+    $this->getSession()->getPage()->findButton('Park Order')->click();
+    $this->assertEquals(2, Order::load(3)->field_register->entity->id());
+    $this->clickLink('Close Register');
+    $this->clickLink('Parked Orders');
+    $this->clickLink('Retrieve');
+    $this->getSession()->getPage()->selectFieldOption('register', '1');
+    $this->getSession()->getPage()->findButton('Open Register')->click();
+
+    // Assert that the product is listed as expected and the order has moved to
+    // the correct register.
+    $web_assert->pageTextContains('Jumper');
+    $web_assert->pageTextContains('Total $50.00');
+    \Drupal::entityTypeManager()->getStorage('commerce_order')->resetCache();
+    $this->assertEquals(1, Order::load(3)->field_register->entity->id());
+
+    // Complete the order, open the other register and ensure that editing the
+    // completed order does not change the register.
+    $this->getSession()->getPage()->findButton('Payments and Completion')->click();
+    $this->click('input[name="commerce-pos-pay-keypad-add"]');
+    $this->click('input[name="commerce-pos-finish"]');
+    $this->clickLink('Close Register');
+    // Edit the completed order.
+    $this->drupalGet(Url::fromRoute('commerce_pos.main', ['commerce_order' => 3]));
+    $this->getSession()->getPage()->selectFieldOption('register', '2');
+    $this->getSession()->getPage()->findButton('Open Register')->click();
+    $web_assert->pageTextContains('Jumper');
+    $web_assert->pageTextContains('Total $50.00');
+    \Drupal::entityTypeManager()->getStorage('commerce_order')->resetCache();
+    // The register should not have changed for a completed order.
+    $this->assertEquals(1, Order::load(3)->field_register->entity->id());
+  }
+
   /**
    * 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 cf8467a..5ad1e2e 100644
--- a/tests/src/FunctionalJavascript/PosReturnFormTest.php
+++ b/tests/src/FunctionalJavascript/PosReturnFormTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\commerce_pos\FunctionalJavascript;
 
+use Drupal\Core\Url;
 use Drupal\FunctionalJavascriptTests\JavascriptTestBase;
 use Drupal\Tests\commerce_pos\Functional\CommercePosCreateStoreTrait;
 
@@ -114,7 +115,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.
