diff --git a/src/Form/POSForm.php b/src/Form/POSForm.php
index 445d745..7f298b9 100644
--- a/src/Form/POSForm.php
+++ b/src/Form/POSForm.php
@@ -40,7 +40,7 @@ class POSForm extends ContentEntityForm {
       $form = $this->buildPaymentForm($form, $form_state);
     }
 
-    $this->addTotalsDisplay($form);
+    $this->addTotalsDisplay($form, $form_state);
 
     return $form;
   }
@@ -223,15 +223,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'));
-      }
     }
   }
 
@@ -276,12 +270,14 @@ class POSForm extends ContentEntityForm {
     $store = $this->entity->getStore();
     $default_currency = $store->getDefaultCurrency();
     $payment_gateway = $triggering_element['#payment_gateway_id'];
+
+    $order_balance = $this->getOrderBalance()->getNumber();
     $values = [
       'payment_gateway' => $payment_gateway,
       'order_id' => $this->entity->id(),
       'state' => 'pending',
       'amount' => [
-        'number' => $form_state->getValue('keypad')['amount'],
+        'number' => $order_balance,
         'currency_code' => $default_currency->getCurrencyCode(),
       ],
     ];
@@ -314,7 +310,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();
@@ -325,6 +321,7 @@ class POSForm extends ContentEntityForm {
       '#type' => 'container',
     ];
 
+    $keypad_amount = $form_state->getValue('keypad')['amount'];
     $number_formatter_factory = \Drupal::service('commerce_price.number_formatter_factory');
     $number_formatter = $number_formatter_factory->createInstance();
 
@@ -339,8 +336,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();
@@ -376,10 +374,10 @@ 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())),
+        $number_formatter->formatCurrency($keypad_amount, Currency::load($amount->getCurrencyCode())),
       ];
       if (!isset($payment_totals[$amount->getCurrencyCode()])) {
         // Initialise the payment total.
@@ -395,13 +393,27 @@ 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($keypad_amount, Currency::load($currency_code)),
+      ];
+      if ($amount > 0 && $keypad_amount > $amount) {
+        $currency = Currency::load($currency_code);
+        $formatted_change_amount = $number_formatter->formatCurrency($keypad_amount - $amount, $currency);
+        $balances[] = [
+          'class' => 'commerce-pos--totals--to-pay',
+          'data' => [$this->t('Change'), $formatted_change_amount],
+        ];
+      }
     }
     $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],
+      ];
     }
 
     $form['totals']['balance'] = [
