diff --git a/commerce_pos.links.task.yml b/commerce_pos.links.task.yml
index 004278b..0000d1a 100644
--- a/commerce_pos.links.task.yml
+++ b/commerce_pos.links.task.yml
@@ -7,4 +7,9 @@ commerce_pos.order_lookup:
   title: 'Order Lookup'
   route_name: 'commerce_pos.order_lookup'
   base_route: 'commerce_pos.main'
-  description: 'Point of Sale Order Lookup'
\ No newline at end of file
+  description: 'Point of Sale Order Lookup'
+commerce_pos.parked_order_lookup:
+  title: 'Parked Orders'
+  route_name: 'commerce_pos.parked_order_lookup'
+  base_route: 'commerce_pos.main'
+  description: 'Point of Sale Parked Order Lookup'
\ No newline at end of file
diff --git a/commerce_pos.routing.yml b/commerce_pos.routing.yml
index a638319..357df94 100644
--- a/commerce_pos.routing.yml
+++ b/commerce_pos.routing.yml
@@ -55,3 +55,29 @@ commerce_pos.order_lookup:
     _title: 'Point of Sale Order Lookup'
   requirements:
     _permission: 'access commerce pos order lookup'
+
+commerce_pos.parked_order_lookup:
+  path: '/admin/commerce/pos/orders/parked'
+  defaults:
+    _controller: '\Drupal\commerce_pos\Controller\ParkedOrders::content'
+    _title: 'Point of Sale Parked Order Lookup'
+  requirements:
+    # Parked orders are less dangerous than all orders, and likely to be used by all cashiers.
+    # So we just use the standard permission, we can change this if the need ever arises but I don't
+    # want to spam permissions
+    _permission: 'access commerce pos pages'
+
+commerce_pos.parked_order_retrieve:
+  path: '/admin/commerce/pos/order/{commerce_order}/retrieve'
+  defaults:
+    _controller: '\Drupal\commerce_pos\Controller\ParkedOrders::parkedOrderRetrieve'
+    _title: 'Point of Sale Parked Order Retrieve'
+  options:
+    parameters:
+      commerce_order:
+        type: 'entity:commerce_order'
+  requirements:
+    # Parked orders are less dangerous than all orders, and likely to be used by all cashiers.
+    # So we just use the standard permission, we can change this if the need ever arises but I don't
+    # want to spam permissions
+    _permission: 'access commerce pos pages'
diff --git a/modules/receipt/tests/src/FunctionalJavascript/PosReceiptTest.php b/modules/receipt/tests/src/FunctionalJavascript/PosReceiptTest.php
index 18ffade..170f78d 100644
--- a/modules/receipt/tests/src/FunctionalJavascript/PosReceiptTest.php
+++ b/modules/receipt/tests/src/FunctionalJavascript/PosReceiptTest.php
@@ -62,10 +62,11 @@ class PosReceiptTest extends JavascriptTestBase {
     // Go back to the order.
     $this->drupalGet('admin/commerce/pos/main');
     // Go to the payment page.
-    $this->click('.commerce-pos input[name="op"]');
+    $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->waitForAjaxToFinish();
+
     // We now have a complete order and new draft order.
     $this->drupalGet('admin/commerce/orders');
     // The first row has a Show receipt action and the second does not.
diff --git a/src/Controller/ParkedOrders.php b/src/Controller/ParkedOrders.php
new file mode 100644
index 0000000..94bebc3
--- /dev/null
+++ b/src/Controller/ParkedOrders.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Drupal\commerce_pos\Controller;
+
+use Drupal\commerce_order\Entity\Order;
+use Drupal\Core\Url;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
+
+/**
+ * Builds the parked order listing page.
+ */
+class ParkedOrders extends OrderLookup {
+
+  /**
+   * Builds the Order Lookup form.
+   *
+   * @return array
+   *   A renderable array containing the Order Lookup form.
+   */
+  public function content() {
+    return \Drupal::formBuilder()->getForm('\Drupal\commerce_pos\Form\ParkedOrdersForm');
+  }
+
+  /**
+   * Retrieves a parked order.
+   *
+   * @param \Drupal\commerce_order\Entity\Order $commerce_order
+   *   The parked order to retrieve.
+   */
+  public function parkedOrderRetrieve(Order $commerce_order) {
+    if ($commerce_order->getState()->value !== 'parked') {
+      throw new AccessDeniedHttpException('Only parked orders can be retrieved');
+    }
+    $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');
+
+    $response = new RedirectResponse($pos_url->toString());
+    $response->send();
+  }
+
+}
diff --git a/src/Form/OrderLookupForm.php b/src/Form/OrderLookupForm.php
index e12021e..be5b2a2 100644
--- a/src/Form/OrderLookupForm.php
+++ b/src/Form/OrderLookupForm.php
@@ -6,10 +6,13 @@ use Drupal\commerce_order\Entity\Order;
 use Drupal\commerce_price\Entity\Currency;
 use Drupal\Core\Ajax\AjaxResponse;
 use Drupal\Core\Ajax\HtmlCommand;
+use Drupal\Core\Datetime\DrupalDateTime;
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Link;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\Core\Url;
+use Drupal\user\Entity\User;
 
 /**
  * Provides an order lookup form to search orders.
@@ -58,14 +61,7 @@ class OrderLookupForm extends FormBase {
 
     $triggering_element = $form_state->getTriggeringElement();
     if (empty($triggering_element)) {
-      $lookup_results = $this->recentPosOrders();
-
-      $form['order_lookup']['results']['result'] = [
-        '#type' => 'item',
-        '#markup' => $lookup_results,
-        '#prefix' => '<div id="order-lookup-results">',
-        '#suffix' => '</div>',
-      ];
+      $form['order_lookup']['results']['result'] = $this->searchOrderResults();
     }
 
     return $form;
@@ -97,82 +93,63 @@ class OrderLookupForm extends FormBase {
    *
    * @param string $search_text
    *   The search criteria. Could be an order ID, customer name, or email.
+   * @param string $state
+   *   (optional) The order state to match. Defaults to 'draft'.
+   * @param string $operator
+   *   (optional) The operator to use when matching on state. Defaults to '!='.
+   * @param \Drupal\Core\StringTranslation\TranslatableMarkup $empty_message
+   *   (optional) A translated search string to display if no results are
+   *   returned.
    *
-   * @return mixed
-   *   Returns the markup for a themed table with the order results.
+   * @return \Drupal\Core\StringTranslation\TranslatableMarkup|array
+   *   The render array or a translatable string.
    */
-  public function searchOrderResults($search_text) {
-    if ($search_text == '') {
-      return $this->recentPosOrders();
-    }
-
+  public function searchOrderResults($search_text = '', $state = 'draft', $operator = '!=', TranslatableMarkup $empty_message = NULL) {
     $result_limit = \Drupal::config('commerce_pos.settings')->get('order_lookup_limit');
 
     // Create the query now.
     $query = \Drupal::entityQuery('commerce_order');
-    $query = $query->condition('state', 'draft', '!=');
+    $query = $query->condition('state', $state, $operator);
     $query = $query->condition('type', 'pos');
     $query = $query->sort('order_id', 'DESC')
       ->range(0, !empty($result_limit) ? $result_limit : 10);
 
-    if (is_numeric($search_text)) {
-      $query->condition('order_id', $search_text);
-    }
-    else {
-      $conditions = $query->orConditionGroup();
-      // First check if we can find a user by this name.
-      $user = user_load_by_name($search_text);
-      if ($user) {
-        $conditions = $conditions->condition('uid', $user->id());
+    if ($search_text) {
+      if (is_numeric($search_text)) {
+        $query->condition('order_id', $search_text);
+      }
+      else {
+        $conditions = $query->orConditionGroup();
+        // First check if we can find a user by this name.
+        $user = user_load_by_name($search_text);
+        if ($user) {
+          $conditions = $conditions->condition('uid', $user->id());
+        }
+        $conditions = $conditions->condition('mail', $search_text);
+
+        $query->condition($conditions);
       }
-      $conditions = $conditions->condition('mail', $search_text);
-
-      $query->condition($conditions);
-    }
-
-    $result = $query->execute();
-    if (!empty($result)) {
-      $orders = Order::loadMultiple($result);
-    }
-
-    // If we've got an order, let's output the details in a table.
-    if ($orders) {
-      $order_markup = $this->buildOrderTable($orders);
-    }
-    else {
-      $order_markup = $this->t('The order could not be found or does not exist.');
     }
 
-    return $order_markup;
-  }
-
-  /**
-   * Fetches and returns a themed table with the most recent POS orders.
-   *
-   * @return string
-   *   The html markup for the themed table.
-   */
-  public function recentPosOrders() {
-    $result_limit = \Drupal::config('commerce_pos.settings')->get('order_lookup_limit');
-
-    // Let's query the db for the most recent orders.
-    $query = \Drupal::entityQuery('commerce_order')
-      ->condition('type', 'pos')
-      ->condition('state', 'draft', '!=')
-      ->range(0, !empty($result_limit) ? $result_limit : 10)
-      ->sort('order_id', 'DESC');
     $result = $query->execute();
-
     if (!empty($result)) {
       $orders = Order::loadMultiple($result);
     }
 
     // If we've got an order, let's output the details in a table.
-    if (isset($orders)) {
+    if (!empty($orders)) {
       $order_markup = $this->buildOrderTable($orders);
     }
     else {
-      $order_markup = $this->t('There are currently no POS orders.');
+      if ($search_text) {
+        $order_markup = $this->t('The order could not be found or does not exist.');
+      }
+      elseif ($empty_message) {
+        $order_markup = $empty_message;
+      }
+      else {
+        $order_markup = $this->t('There are currently no POS orders.');
+      }
     }
 
     return $order_markup;
@@ -193,7 +170,9 @@ class OrderLookupForm extends FormBase {
 
     $header = [
       t('Order ID'),
+      t('Date'),
       t('Status'),
+      t('Cashier'),
       t('Customer'),
       t('Total'),
     ];
@@ -208,6 +187,17 @@ class OrderLookupForm extends FormBase {
           'target' => '_blank',
         ],
       ]);
+
+      $cashier = User::load($order->get('field_cashier')->getValue()[0]['target_id']);
+
+      $cashier_url = Url::fromRoute('entity.user.canonical', [
+        'user' => $cashier->id(),
+      ], [
+        'attributes' => [
+          'target' => '_blank',
+        ],
+      ]);
+
       $customer_url = Url::fromRoute('entity.user.canonical', [
         'user' => $order->getCustomer()
           ->id(),
@@ -232,9 +222,10 @@ class OrderLookupForm extends FormBase {
       // Add each row to the rows array.
       $rows[] = [
         Link::fromTextAndUrl($order->id(), $order_url),
+        DrupalDateTime::createFromTimestamp($order->getChangedTime())->format('Y-m-d H:i'),
         $order->getState()->getLabel(),
-        Link::fromTextAndUrl($order->getCustomer()
-          ->getDisplayName(), $customer_url),
+        Link::fromTextAndUrl($cashier->getDisplayName(), $cashier_url),
+        Link::fromTextAndUrl($order->getCustomer()->getDisplayName(), $customer_url),
         $formatted_amount,
       ];
     }
@@ -248,7 +239,7 @@ class OrderLookupForm extends FormBase {
       '#type' => 'pager',
     ];
 
-    return \Drupal::service('renderer')->render($output);
+    return $output;
   }
 
 }
diff --git a/src/Form/POSForm.php b/src/Form/POSForm.php
index d044e95..a054b90 100644
--- a/src/Form/POSForm.php
+++ b/src/Form/POSForm.php
@@ -11,7 +11,6 @@ use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Url;
 use Drupal\commerce_price\Entity\Currency;
-use Drupal\commerce_order\Entity\Order;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -53,7 +52,8 @@ class POSForm extends ContentEntityForm {
       $container->get('entity.manager'),
       $container->get('entity_type.bundle.info'),
       $container->get('datetime.time'),
-      $container->get('commerce_store.current_store')
+      $container->get('commerce_store.current_store'),
+      $container->get('commerce_pos.current_order')
     );
   }
 
@@ -122,6 +122,15 @@ class POSForm extends ContentEntityForm {
       ]);
     }
 
+    $form['actions']['park_order'] = [
+      '#type' => 'submit',
+      '#value' => $this->t('Park Order'),
+      '#weight' => 6,
+      '#submit' => ['::parkOrder'],
+      '#validate' => ['::validateParkOrder'],
+      '#disabled' => empty($this->entity->getItems()),
+    ];
+
     return $form;
   }
 
@@ -271,6 +280,12 @@ class POSForm extends ContentEntityForm {
       '#button_type' => 'primary',
     ];
 
+    $form['actions']['park_order'] = [
+      '#type' => 'submit',
+      '#value' => $this->t('Park Order'),
+      '#submit' => ['::parkOrder'],
+    ];
+
     $form['actions']['back'] = [
       '#type' => 'submit',
       '#value' => t('Back To Order'),
@@ -295,12 +310,12 @@ class POSForm extends ContentEntityForm {
 
     $triggering_element = $form_state->getTriggeringElement();
     // Add note submit was clicked.
-    if ($triggering_element['#element_key'] == 'add-note-submit') {
+    if (!empty($triggering_element['#element_key']) && $triggering_element['#element_key'] == 'add-note-submit') {
       $this->saveOrderComment($this->entity, $form_state->getValue('add_note')['note_text']);
     }
 
     // 'Add Note' was clicked.
-    if (!empty($triggering_element) && $triggering_element['#element_key'] == 'add-note') {
+    if (!empty($triggering_element['#element_key']) && $triggering_element['#element_key'] == 'add-note') {
       $form['add_note']['note_text'] = [
         '#type' => 'textarea',
         '#title' => t('Add Note'),
@@ -542,6 +557,7 @@ class POSForm extends ContentEntityForm {
     $store = $order->getStore();
     $default_currency = $store->getDefaultCurrency();
     $totals = [];
+
     // Collecting the Subtotal.
     $form['totals'] = [
       '#type' => 'container',
@@ -730,7 +746,35 @@ class POSForm extends ContentEntityForm {
    */
   protected function clearOrder() {
     \Drupal::service('commerce_pos.current_order')->clear();
+  }
+
+  /**
+   * Parks current order.
+   */
+  public function parkOrder(array &$form, FormStateInterface $form_state) {
+    /** @var \Drupal\commerce_order\Entity\OrderInterface $order */
+    $order = $this->entity;
 
+    $order->set('state', 'parked')
+      ->save();
+
+    $this->clearOrder();
+
+    drupal_set_message($this->t('Order @order_id has been parked', ['@order_id' => $order->id()]));
+  }
+
+  /**
+   * Validation callback called before parking an order.
+   *
+   * @param array $form
+   *   Form element.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   Form state object.
+   */
+  public function validateParkOrder(array &$form, FormStateInterface $form_state) {
+    if (empty($this->entity->getItems())) {
+      $form_state->setError($form, $this->t('Cannot park an empty order'));
+    }
   }
 
 }
diff --git a/src/Form/OrderLookupForm.php b/src/Form/ParkedOrdersForm.php
similarity index 51%
copy from src/Form/OrderLookupForm.php
copy to src/Form/ParkedOrdersForm.php
index e12021e..550a504 100644
--- a/src/Form/OrderLookupForm.php
+++ b/src/Form/ParkedOrdersForm.php
@@ -2,25 +2,25 @@
 
 namespace Drupal\commerce_pos\Form;
 
-use Drupal\commerce_order\Entity\Order;
 use Drupal\commerce_price\Entity\Currency;
 use Drupal\Core\Ajax\AjaxResponse;
 use Drupal\Core\Ajax\HtmlCommand;
-use Drupal\Core\Form\FormBase;
+use Drupal\Core\Datetime\DrupalDateTime;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Link;
 use Drupal\Core\Url;
+use Drupal\user\Entity\User;
 
 /**
  * Provides an order lookup form to search orders.
  */
-class OrderLookupForm extends FormBase {
+class ParkedOrdersForm extends OrderLookupForm {
 
   /**
    * {@inheritdoc}
    */
   public function getFormId() {
-    return 'commerce_pos_order_lookup';
+    return 'commerce_pos_parked_order_lookup';
   }
 
   /**
@@ -30,7 +30,7 @@ class OrderLookupForm extends FormBase {
     // The order search elements.
     $form['order_lookup'] = [
       '#type' => 'fieldset',
-      '#title' => $this->t('Order Lookup'),
+      '#title' => $this->t('Parked Order Lookup'),
     ];
 
     // The search box to look up by order number, customer name or email.
@@ -38,13 +38,13 @@ class OrderLookupForm extends FormBase {
       '#type' => 'textfield',
       '#maxlength' => 50,
       '#size' => 25,
-      '#description' => $this->t('Search by order number, customer name or customer email.'),
+      '#description' => $this->t('Filter by order number, customer name or customer email.'),
       '#ajax' => [
         'callback' => '::orderLookupAjaxRefresh',
         'event' => 'input',
         'progress' => [
           'type' => 'throbber',
-          'message' => t('Searching orders...'),
+          'message' => t('Searching parked orders...'),
         ],
       ],
     ];
@@ -58,7 +58,7 @@ class OrderLookupForm extends FormBase {
 
     $triggering_element = $form_state->getTriggeringElement();
     if (empty($triggering_element)) {
-      $lookup_results = $this->recentPosOrders();
+      $lookup_results = $this->searchOrderResults('', 'parked', '=', $this->t('There are currently no parked orders'));
 
       $form['order_lookup']['results']['result'] = [
         '#type' => 'item',
@@ -72,120 +72,7 @@ class OrderLookupForm extends FormBase {
   }
 
   /**
-   * Submit callback for the order lookup form.
-   */
-  public function submitForm(array &$form, FormStateInterface $form_state) {
-    // No submit actually needed as this form is ajax refresh only.
-  }
-
-  /**
-   * Ajax callback for the order lookup submit button.
-   */
-  public function orderLookupAjaxRefresh(array $form, FormStateInterface &$form_state) {
-    $search_text = $form_state->getValue('search_box');
-
-    $results = $this->searchOrderResults($search_text);
-
-    $response = new AjaxResponse();
-    $response->addCommand(new HtmlCommand('#order-lookup-results', $results));
-
-    return $response;
-  }
-
-  /**
-   * Looks up an order based on a search criteria and returns the results.
-   *
-   * @param string $search_text
-   *   The search criteria. Could be an order ID, customer name, or email.
-   *
-   * @return mixed
-   *   Returns the markup for a themed table with the order results.
-   */
-  public function searchOrderResults($search_text) {
-    if ($search_text == '') {
-      return $this->recentPosOrders();
-    }
-
-    $result_limit = \Drupal::config('commerce_pos.settings')->get('order_lookup_limit');
-
-    // Create the query now.
-    $query = \Drupal::entityQuery('commerce_order');
-    $query = $query->condition('state', 'draft', '!=');
-    $query = $query->condition('type', 'pos');
-    $query = $query->sort('order_id', 'DESC')
-      ->range(0, !empty($result_limit) ? $result_limit : 10);
-
-    if (is_numeric($search_text)) {
-      $query->condition('order_id', $search_text);
-    }
-    else {
-      $conditions = $query->orConditionGroup();
-      // First check if we can find a user by this name.
-      $user = user_load_by_name($search_text);
-      if ($user) {
-        $conditions = $conditions->condition('uid', $user->id());
-      }
-      $conditions = $conditions->condition('mail', $search_text);
-
-      $query->condition($conditions);
-    }
-
-    $result = $query->execute();
-    if (!empty($result)) {
-      $orders = Order::loadMultiple($result);
-    }
-
-    // If we've got an order, let's output the details in a table.
-    if ($orders) {
-      $order_markup = $this->buildOrderTable($orders);
-    }
-    else {
-      $order_markup = $this->t('The order could not be found or does not exist.');
-    }
-
-    return $order_markup;
-  }
-
-  /**
-   * Fetches and returns a themed table with the most recent POS orders.
-   *
-   * @return string
-   *   The html markup for the themed table.
-   */
-  public function recentPosOrders() {
-    $result_limit = \Drupal::config('commerce_pos.settings')->get('order_lookup_limit');
-
-    // Let's query the db for the most recent orders.
-    $query = \Drupal::entityQuery('commerce_order')
-      ->condition('type', 'pos')
-      ->condition('state', 'draft', '!=')
-      ->range(0, !empty($result_limit) ? $result_limit : 10)
-      ->sort('order_id', 'DESC');
-    $result = $query->execute();
-
-    if (!empty($result)) {
-      $orders = Order::loadMultiple($result);
-    }
-
-    // If we've got an order, let's output the details in a table.
-    if (isset($orders)) {
-      $order_markup = $this->buildOrderTable($orders);
-    }
-    else {
-      $order_markup = $this->t('There are currently no POS orders.');
-    }
-
-    return $order_markup;
-  }
-
-  /**
-   * Return a themed table with the order details.
-   *
-   * @param array $orders
-   *   An array of order entities.
-   *
-   * @return string
-   *   The markup for the themed table.
+   * {@inheritdoc}
    */
   public function buildOrderTable(array $orders) {
     $number_formatter_factory = \Drupal::service('commerce_price.number_formatter_factory');
@@ -193,14 +80,19 @@ class OrderLookupForm extends FormBase {
 
     $header = [
       t('Order ID'),
+      t('Date'),
       t('Status'),
+      t('Cashier'),
       t('Customer'),
       t('Total'),
+      t('Operations'),
     ];
 
     $rows = [];
     foreach ($orders as $order) {
 
+      $retrieve_url = Url::fromRoute('commerce_pos.parked_order_retrieve', ['commerce_order' => $order->id()]);
+
       /* @var \Drupal\commerce_order\Entity\Order $order */
       // The link to the order.
       $order_url = Url::fromRoute('entity.commerce_order.canonical', ['commerce_order' => $order->id()], [
@@ -208,6 +100,17 @@ class OrderLookupForm extends FormBase {
           'target' => '_blank',
         ],
       ]);
+
+      $cashier = User::load($order->get('field_cashier')->getValue()[0]['target_id']);
+
+      $cashier_url = Url::fromRoute('entity.user.canonical', [
+        'user' => $cashier->id(),
+      ], [
+        'attributes' => [
+          'target' => '_blank',
+        ],
+      ]);
+
       $customer_url = Url::fromRoute('entity.user.canonical', [
         'user' => $order->getCustomer()
           ->id(),
@@ -232,10 +135,12 @@ class OrderLookupForm extends FormBase {
       // Add each row to the rows array.
       $rows[] = [
         Link::fromTextAndUrl($order->id(), $order_url),
+        DrupalDateTime::createFromTimestamp($order->getChangedTime())->format('Y-m-d H:i'),
         $order->getState()->getLabel(),
-        Link::fromTextAndUrl($order->getCustomer()
-          ->getDisplayName(), $customer_url),
+        Link::fromTextAndUrl($cashier->getDisplayName(), $cashier_url),
+        Link::fromTextAndUrl($order->getCustomer()->getDisplayName(), $customer_url),
         $formatted_amount,
+        Link::fromTextAndUrl('Retrieve', $retrieve_url),
       ];
     }
 
@@ -251,4 +156,18 @@ class OrderLookupForm extends FormBase {
     return \Drupal::service('renderer')->render($output);
   }
 
+  /**
+   * Ajax callback for the order lookup submit button.
+   */
+  public function orderLookupAjaxRefresh(array $form, FormStateInterface &$form_state) {
+    $search_text = $form_state->getValue('search_box');
+
+    $results = $this->searchOrderResults($search_text, 'parked', '=');
+
+    $response = new AjaxResponse();
+    $response->addCommand(new HtmlCommand('#order-lookup-results', $results));
+
+    return $response;
+  }
+
 }
diff --git a/tests/src/Functional/CommercePosCreateStoreTrait.php b/tests/src/Functional/CommercePosCreateStoreTrait.php
index ca53817..6084ec1 100644
--- a/tests/src/Functional/CommercePosCreateStoreTrait.php
+++ b/tests/src/Functional/CommercePosCreateStoreTrait.php
@@ -57,6 +57,9 @@ trait CommercePosCreateStoreTrait {
 
   /**
    * Creates a store with some products.
+   *
+   * @return \Drupal\commerce_store\Entity\StoreInterface
+   *   The store.
    */
   protected function setUpStore() {
     // Initial store set up.
@@ -98,6 +101,8 @@ trait CommercePosCreateStoreTrait {
       'title' => 'Jumper',
       'stores' => [$test_store],
     ]);
+
+    return $test_store;
   }
 
 }
diff --git a/tests/src/Functional/CurrentOrderTest.php b/tests/src/Functional/CurrentOrderTest.php
index f5a0ec2..84c3601 100644
--- a/tests/src/Functional/CurrentOrderTest.php
+++ b/tests/src/Functional/CurrentOrderTest.php
@@ -4,6 +4,9 @@ namespace Drupal\Tests\commerce_pos\Functional;
 
 use Drupal\Tests\commerce\Functional\CommerceBrowserTestBase;
 use Drupal\commerce_order\Entity\Order;
+use Drupal\commerce_product\Entity\Product;
+use Drupal\commerce_product\Entity\ProductVariation;
+use Drupal\commerce_price\Price;
 
 /**
  * Tests the CurrentOrder get and set.
@@ -39,7 +42,7 @@ class CurrentOrderTest extends CommerceBrowserTestBase {
 
     $retrieved_order = $this->container->get('commerce_pos.current_order')->get();
 
-    $this->assertEqual($order->id(), $retrieved_order->id());
+    $this->assertEquals($order->id(), $retrieved_order->id());
   }
 
 }
diff --git a/tests/src/FunctionalJavascript/OrderLookupTest.php b/tests/src/FunctionalJavascript/OrderLookupTest.php
index 7803a72..b96d86a 100644
--- a/tests/src/FunctionalJavascript/OrderLookupTest.php
+++ b/tests/src/FunctionalJavascript/OrderLookupTest.php
@@ -23,6 +23,13 @@ class OrderLookupTest extends JavascriptTestBase {
     'commerce_pos',
   ];
 
+  /**
+   * The commerce store.
+   *
+   * @var \Drupal\commerce_store\Entity\StoreInterface
+   */
+  protected $store;
+
   /**
    * {@inheritdoc}
    */
@@ -30,8 +37,7 @@ class OrderLookupTest extends JavascriptTestBase {
     parent::setUp();
 
     // Initial store set up.
-    $test_store = $this->createStore('POS test store', 'pos_test_store@example.com', 'physical');
-    $this->store = $test_store;
+    $this->store = $this->setUpStore();
 
     $this->adminUser = $this->drupalCreateUser(['access commerce pos order lookup', 'access commerce pos pages']);
     $this->drupalLogin($this->adminUser);
@@ -57,6 +63,8 @@ class OrderLookupTest extends JavascriptTestBase {
       'type' => 'pos',
       'state' => 'completed',
       'store_id' => $this->store->id(),
+      'field_cashier' => $this->adminUser->id(),
+      'field_register' => 1,
     ]);
     $order->save();
 
@@ -66,8 +74,9 @@ class OrderLookupTest extends JavascriptTestBase {
     // Lookup the order ID.
     $this->getSession()->getPage()->fillField('search_box', $order->id());
     $this->waitForAjaxToFinish();
+
     $web_assert->elementContains('css', '#order-lookup-results > div > table > tbody > tr > td:nth-child(1) > a', $order->id());
-    $web_assert->elementContains('css', '#order-lookup-results > div > table > tbody > tr > td:nth-child(2)', 'Completed');
+    $web_assert->elementContains('css', '#order-lookup-results > div > table > tbody > tr > td:nth-child(3)', 'Completed');
   }
 
   /**
diff --git a/tests/src/FunctionalJavascript/ParkOrderTest.php b/tests/src/FunctionalJavascript/ParkOrderTest.php
new file mode 100644
index 0000000..257540d
--- /dev/null
+++ b/tests/src/FunctionalJavascript/ParkOrderTest.php
@@ -0,0 +1,141 @@
+<?php
+
+namespace Drupal\Tests\commerce_pos\FunctionalJavascript;
+
+use Drupal\Core\Url;
+use Drupal\FunctionalJavascriptTests\JavascriptTestBase;
+use Drupal\Tests\commerce_pos\Functional\CommercePosCreateStoreTrait;
+use Drupal\commerce_order\Entity\Order;
+
+/**
+ * Tests the Commerce POS form.
+ *
+ * @group commerce_pos
+ */
+class ParkOrderTest extends JavascriptTestBase {
+  use CommercePosCreateStoreTrait;
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = [
+    'commerce_pos',
+    'block'
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->setUpStore();
+    // @todo work out the expected permissions to view products etc...
+    $this->drupalLogin($this->rootUser);
+    $this->drupalPlaceBlock('local_tasks_block');
+  }
+
+  /**
+   * Tests park/un-park of order.
+   */
+  public function testParkOrder() {
+    $web_assert = $this->assertSession();
+    $this->drupalGet('admin/commerce/pos/main');
+    // There is only one register.
+    $web_assert->fieldValueEquals('register', 1);
+    $web_assert->pageTextContains('Test register');
+    $this->drupalPostForm(NULL, [], 'Select Register');
+
+    // 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');
+
+    // Check if order can be parked.
+    $this->getSession()->getPage()->findButton('Park Order')->click();
+    $this->assertSession()->pageTextContains('Order 1 has been parked');
+
+    // Ensure the 'Park Order' button is disabled.
+    $button = $this->getSession()->getPage()->findButton('Park Order');
+    $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');
+    $web_assert->waitOnAutocomplete();
+    $results = $this->getSession()->getPage()->findAll('css', '.ui-autocomplete li');
+    $this->assertCount(3, $results);
+    $results[0]->click();
+    $web_assert->assertWaitOnAjaxRequest();
+
+    // Our current order shouldn't be order 1 anymore.
+    $this->getSession()->getPage()->findButton('Park Order')->click();
+    $this->assertSession()->pageTextContains('Order 2 has been parked');
+
+    // Now check if we can see the orders in the list.
+    $this->clickLink('Parked Orders');
+
+    $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);
+
+    $web_assert->elementContains('xpath', '//*[@id="edit-result"]/table/tbody/tr[2]/td[1]/a', 1);
+    $web_assert->elementContains('xpath', '//*[@id="edit-result"]/table/tbody/tr[2]/td[3]', 'Parked');
+    $web_assert->elementContains('xpath', '//*[@id="edit-result"]/table/tbody/tr[2]/td[7]/a', 'Retrieve');
+    $web_assert->elementContains('xpath', '//*[@id="edit-result"]/table/tbody/tr[1]/td[1]/a', 2);
+
+    // Retrieve order 1.
+    $retrieve_link = $web_assert->elementExists('xpath', '//*[@id="edit-result"]/table/tbody/tr[2]/td[7]/a');
+    $retrieve_link_href = $retrieve_link->getAttribute('href');
+    $retrieve_link->click();
+
+    // Confirm we are redirected back to the POS.
+    $url = Url::fromRoute('commerce_pos.main');
+    $this->assertEquals($this->getAbsoluteUrl($url->toString()), $this->getUrl());
+
+    // Now check if order 2 is still parked
+    $this->clickLink('Parked Orders');
+    $web_assert->elementContains('xpath', '//*[@id="edit-result"]/table/tbody/tr[1]/td[1]/a', 2);
+
+    // Ensure that trying to retrieve an order that is not parked fails. Note we
+    // can not assert on status code because this is a javascript test.
+    $this->drupalGet($retrieve_link_href);
+    $web_assert->pageTextContains('Access denied');
+
+    // 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);
+
+  }
+
+  /**
+   * Waits for jQuery to become active and animations to complete.
+   */
+  protected function waitForAjaxToFinish() {
+    $condition = "(0 === jQuery.active && 0 === jQuery(':animated').length)";
+    $this->assertJsCondition($condition, 10000);
+  }
+
+}
diff --git a/tests/src/FunctionalJavascript/PosFormTest.php b/tests/src/FunctionalJavascript/PosFormTest.php
index 33f426e..27f2a78 100644
--- a/tests/src/FunctionalJavascript/PosFormTest.php
+++ b/tests/src/FunctionalJavascript/PosFormTest.php
@@ -164,7 +164,7 @@ class PosFormTest extends JavascriptTestBase {
     $web_assert->pageTextContains('To Pay $96.40');
 
     // Go to the payment page.
-    $this->click('.commerce-pos input[name="op"]');
+    $this->getSession()->getPage()->findButton('Payments and Completion')->click();
 
     $this->getSession()->getPage()->fillField('keypad[amount]', '50');
     $this->click('input[name="commerce-pos-pay-keypad-add"]');
@@ -206,7 +206,7 @@ class PosFormTest extends JavascriptTestBase {
     $web_assert->pageTextContains('Change $0.00');
 
     // Go to the payment page.
-    $this->click('.commerce-pos input[name="op"]');
+    $this->getSession()->getPage()->findButton('Payments and Completion')->click();
 
     $web_assert->pageTextContains('Total $119.60');
     $web_assert->pageTextContains('Cash $50.00');
