diff --git a/src/Plugin/Commerce/PaymentGateway/Vipps.php b/src/Plugin/Commerce/PaymentGateway/Vipps.php
index 4e0b15c..2655565 100644
--- a/src/Plugin/Commerce/PaymentGateway/Vipps.php
+++ b/src/Plugin/Commerce/PaymentGateway/Vipps.php
@@ -274,6 +274,12 @@ class Vipps extends OffsitePaymentGatewayBase implements SupportsAuthorizationsI
     // If not specified, capture the entire amount.
     $amount = $amount ?: $payment->getAmount();
 
+    if ($amount->lessThan($payment->getAmount())) {
+      /** @var \Drupal\commerce_payment\Entity\PaymentInterface $parent_payment */
+      $parent_payment = $payment;
+      $payment = $parent_payment->createDuplicate();
+    }
+
     $remote_id = $payment->getRemoteId();
     $number = $amount->multiply(100)->getNumber();
     try {
@@ -308,6 +314,15 @@ class Vipps extends OffsitePaymentGatewayBase implements SupportsAuthorizationsI
     $payment->setState('completed');
     $payment->setAmount($amount);
     $payment->save();
+
+    // Update parent payment if one exists.
+    if (isset($parent_payment)) {
+      $parent_payment->setAmount($parent_payment->getAmount()->subtract($amount));
+      if ($parent_payment->getAmount()->isZero()) {
+        $parent_payment->setState('authorization_voided');
+      }
+      $parent_payment->save();
+    }
   }
 
   /**
