diff --git a/src/Form/POSForm.php b/src/Form/POSForm.php
index a1af2a5..7c49e89 100644
--- a/src/Form/POSForm.php
+++ b/src/Form/POSForm.php
@@ -82,7 +82,7 @@ class POSForm extends ContentEntityForm {
       $form = $this->buildPaymentForm($form, $form_state);
     }
 
-    $this->addTotalsDisplay($form);
+    $this->addTotalsDisplay($form, $form_state);
 
     return $form;
   }
@@ -138,7 +138,7 @@ class POSForm extends ContentEntityForm {
     $payment_gateway_storage = $this->entityTypeManager->getStorage('commerce_payment_gateway');
     $payment_gateways = $payment_gateway_storage->loadMultipleForOrder($order);
     $order_balance = $this->getOrderBalance();
-    $balance_paid = $order_balance->getNumber() == 0;
+    $balance_paid = $order_balance->getNumber() <= 0;
 
     $payment_ajax = [
       'wrapper' => 'commerce-pos-sale-keypad-wrapper',
@@ -262,15 +262,9 @@ class POSForm extends ContentEntityForm {
     if ($triggering_element['#name'] == 'commerce-pos-pay-keypad-add') {
       $keypad_amount = $form_state->getValue('keypad')['amount'];
 
-      $order_balance = $this->getOrderBalance()->getNumber();
-
       if (!is_numeric($keypad_amount)) {
         $form_state->setError($form['keypad']['amount'], t('Payment amount must be a number.'));
       }
-      // TODO: remove this when we support change.
-      elseif ($keypad_amount > $order_balance) {
-        $form_state->setError($form['keypad']['amount'], t('Paid amount must not exceed remaining balance'));
-      }
     }
   }
 
@@ -353,7 +347,7 @@ class POSForm extends ContentEntityForm {
   /**
    * Build the totals display for the sidebar.
    */
-  protected function addTotalsDisplay(array &$form) {
+  protected function addTotalsDisplay(array &$form, FormStateInterface $form_state) {
     /* @var \Drupal\commerce_order\Entity\Order $order */
     $order = $this->entity;
     $store = $order->getStore();
@@ -364,6 +358,12 @@ class POSForm extends ContentEntityForm {
       '#type' => 'container',
     ];
 
+    if (isset($form_state->getUserInput()['keypad'])) {
+      $keypad_amount = $form_state->getUserInput()['keypad']['amount'];
+    }
+    else {
+      $keypad_amount = 0;
+    }
     $number_formatter_factory = \Drupal::service('commerce_price.number_formatter_factory');
     $number_formatter = $number_formatter_factory->createInstance();
 
@@ -378,8 +378,9 @@ class POSForm extends ContentEntityForm {
 
     $totals[] = [$this->t('Subtotal'), $formatted_amount];
 
-    // Commerce appears to have a bug where if not adjustments exist, it will return a
-    // 0 => null array, which will still trigger a foreach loop.
+    // Commerce appears to have a bug where if not adjustments exist,
+    // it will return a 0 => null array, which will still trigger
+    // a foreach loop.
     foreach ($order->collectAdjustments() as $key => $adjustment) {
       if (!empty($adjustment)) {
         $amount = $adjustment->getAmount();
@@ -415,7 +416,7 @@ class POSForm extends ContentEntityForm {
     $payment_totals = [];
     foreach ($this->getOrderPayments() as $payment) {
       $amount = $payment->getAmount();
-      $voided = $payment->getState()->value == 'voided' ? $this->t(' (Void)') : '';
+      $voided = $payment->getState()->value == 'voided' ? $this->t('(Void)') : '';
       $payments[] = [
         $payment->getPaymentGateway()->label() . $voided,
         $number_formatter->formatCurrency($amount->getNumber(), Currency::load($amount->getCurrencyCode())),
@@ -434,13 +435,29 @@ class POSForm extends ContentEntityForm {
     // Collect the balances.
     $balances = [];
     foreach ($payment_totals as $currency_code => $amount) {
-      $balances[] = [$this->t('Total Paid'), $number_formatter->formatCurrency($amount, Currency::load($currency_code))];
+      $balances[] = [
+        $this->t('Total Paid'),
+        $number_formatter->formatCurrency($amount, Currency::load($currency_code)),
+      ];
     }
     $remaining_balance = $this->getOrderBalance();
+
     if ($remaining_balance->getNumber() > 0) {
       $currency = Currency::load($remaining_balance->getCurrencyCode());
       $formatted_amount = $number_formatter->formatCurrency($remaining_balance->getNumber(), $currency);
-      $balances[] = ['class' => 'commerce-pos--totals--to-pay', 'data' => [$this->t('To Pay'), $formatted_amount]];
+      $balances[] = [
+        'class' => 'commerce-pos--totals--to-pay',
+        'data' => [$this->t('To Pay'), $formatted_amount],
+      ];
+    }
+
+    if ($remaining_balance->getNumber() < 0) {
+      $currency = Currency::load($currency_code);
+      $formatted_change_amount = $number_formatter->formatCurrency(-$remaining_balance->getNumber(), $currency);
+      $balances[] = [
+        'class' => 'commerce-pos--totals--to-pay',
+        'data' => [$this->t('Change'), $formatted_change_amount],
+      ];
     }
 
     $form['totals']['balance'] = [
diff --git a/tests/src/FunctionalJavascript/PosFormTest.php b/tests/src/FunctionalJavascript/PosFormTest.php
index ff8315a..162f9ff 100644
--- a/tests/src/FunctionalJavascript/PosFormTest.php
+++ b/tests/src/FunctionalJavascript/PosFormTest.php
@@ -42,20 +42,34 @@ class PosFormTest extends JavascriptTestBase {
     $register->save();
 
     $variations = [
-      $this->createProductionVariation(['title' => 'T-shirt XL', 'price' => new Price("23.20", 'USD')]),
+      $this->createProductionVariation([
+        'title' => 'T-shirt XL',
+        'price' => new Price("23.20", 'USD'),
+      ]),
       $this->createProductionVariation(['title' => 'T-shirt L']),
       $this->createProductionVariation(['title' => 'T-shirt M']),
     ];
 
-    $this->createProduct(['variations' => $variations, 'title' => 'T-shirt', 'stores' => [$test_store]]);
+    $this->createProduct([
+      'variations' => $variations,
+      'title' => 'T-shirt',
+      'stores' => [$test_store],
+    ]);
 
     $variations = [
-      $this->createProductionVariation(['title' => 'Jumper XL', 'price' => new Price("50", 'USD')]),
+      $this->createProductionVariation([
+        'title' => 'Jumper XL',
+        'price' => new Price("50", 'USD'),
+      ]),
       $this->createProductionVariation(['title' => 'Jumper L']),
       $this->createProductionVariation(['title' => 'Jumper M']),
     ];
 
-    $this->createProduct(['variations' => $variations, 'title' => 'Jumper', 'stores' => [$test_store]]);
+    $this->createProduct([
+      'variations' => $variations,
+      'title' => 'Jumper',
+      'stores' => [$test_store],
+    ]);
 
     // @todo work out the expected permissions to view products etc...
     $this->drupalLogin($this->rootUser);
@@ -209,6 +223,37 @@ class PosFormTest extends JavascriptTestBase {
     $button = $this->getSession()->getPage()->find('css', 'input[name="commerce-pos-finish"]');
     $this->assertFalse($button->hasAttribute('disabled'), 'Finish button is enabled');
 
+    // Clicking back to order will take us to order page.
+    $this->click('input[name="commerce-pos-back-to-order"]');
+    // Add one more T-shirt.
+    $this->getSession()->getPage()->fillField('order_items[target_id][order_items][1][quantity]', '3');
+    $web_assert->assertWaitOnAjaxRequest();
+
+    $web_assert->pageTextContains('Total $119.60');
+    $web_assert->pageTextContains('Cash $50.00');
+    $web_assert->pageTextContains('Cash $46.40');
+    $web_assert->pageTextContains('Total Paid $96.40');
+    $web_assert->pageTextContains('To Pay $23.20');
+
+    // Go to the payment page.
+    $this->click('.commerce-pos input[name="op"]');
+
+    $web_assert->pageTextContains('Total $119.60');
+    $web_assert->pageTextContains('Cash $50.00');
+    $web_assert->pageTextContains('Cash $46.40');
+    $web_assert->pageTextContains('Total Paid $96.40');
+    $web_assert->pageTextContains('To Pay $23.20');
+
+    $this->getSession()->getPage()->fillField('keypad[amount]', '30');
+    $this->click('input[name="commerce-pos-pay-keypad-add"]');
+    $web_assert->pageTextContains('Total $119.60');
+    $web_assert->pageTextContains('Cash $50.00');
+    $web_assert->pageTextContains('Cash $46.40');
+    $web_assert->pageTextContains('Cash $30.00');
+    $web_assert->pageTextContains('Total Paid $126.40');
+    $web_assert->pageTextContains('Change $6.80');
+    $web_assert->pageTextNotContains('To Pay');
+
     // Clicking finish will bring us back to the order item screen - processing
     // a new order.
     $this->click('input[name="commerce-pos-finish"]');
