diff --git a/modules/payment_form/src/Entity/Payment/PaymentForm.php b/modules/payment_form/src/Entity/Payment/PaymentForm.php
index e314e6f..dd070be 100644
--- a/modules/payment_form/src/Entity/Payment/PaymentForm.php
+++ b/modules/payment_form/src/Entity/Payment/PaymentForm.php
@@ -107,7 +107,7 @@ class PaymentForm extends ContentEntityForm {
     $payment->setPaymentMethod($plugin_selector->getSelectedPlugin());
     $payment->save();
     $result = $payment->execute();
-    if (!$result->hasCompleted()) {
+    if (!$result->isCompleted()) {
       $form_state->setRedirectUrl($result->getCompletionResponse()->getRedirectUrl());
     }
   }
diff --git a/modules/payment_form/tests/src/Unit/Entity/Payment/PaymentFormTest.php b/modules/payment_form/tests/src/Unit/Entity/Payment/PaymentFormTest.php
index 4a4531e..7830146 100644
--- a/modules/payment_form/tests/src/Unit/Entity/Payment/PaymentFormTest.php
+++ b/modules/payment_form/tests/src/Unit/Entity/Payment/PaymentFormTest.php
@@ -16,7 +16,7 @@ use Drupal\Core\Form\FormState;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Url;
 use Drupal\payment\Entity\PaymentInterface;
-use Drupal\payment\PaymentExecutionResultInterface;
+use Drupal\payment\OperationResultInterface;
 use Drupal\payment\Plugin\Payment\Method\PaymentMethodInterface;
 use Drupal\payment\Plugin\Payment\Method\PaymentMethodManagerInterface;
 use Drupal\payment\Plugin\Payment\Type\PaymentTypeInterface;
@@ -271,7 +271,7 @@ class PaymentFormTest extends UnitTestCase {
     $redirect_url = new Url($this->randomMachineName());
     $response = new Response($redirect_url);
 
-    $result = $this->getMock(PaymentExecutionResultInterface::class);
+    $result = $this->getMock(OperationResultInterface::class);
     $result->expects($this->atLeastOnce())
       ->method('getCompletionResponse')
       ->willReturn($response);
diff --git a/modules/payment_test/src/Plugin/Payment/Method/PaymentTestResponse.php b/modules/payment_test/src/Plugin/Payment/Method/PaymentTestResponse.php
index 7ed756f..a2860a1 100644
--- a/modules/payment_test/src/Plugin/Payment/Method/PaymentTestResponse.php
+++ b/modules/payment_test/src/Plugin/Payment/Method/PaymentTestResponse.php
@@ -7,7 +7,7 @@
 namespace Drupal\payment_test\Plugin\Payment\Method;
 
 use Drupal\Core\Url;
-use Drupal\payment\PaymentExecutionResult;
+use Drupal\payment\OperationResult;
 use Drupal\payment\Response\Response;
 
 /**
@@ -26,7 +26,7 @@ class PaymentTestResponse extends PaymentTestNoResponse {
    * {@inheritdoc}
    */
   public function getPaymentExecutionResult() {
-    return new PaymentExecutionResult(new Response(Url::fromUri('http://example.com')));
+    return new OperationResult(new Response(Url::fromUri('http://example.com')));
   }
 
 }
diff --git a/src/Element/PaymentReferenceBase.php b/src/Element/PaymentReferenceBase.php
index e87c621..52b362d 100644
--- a/src/Element/PaymentReferenceBase.php
+++ b/src/Element/PaymentReferenceBase.php
@@ -276,12 +276,12 @@ abstract class PaymentReferenceBase extends FormElement implements FormElementIn
       '#type' => 'payment_line_items_display',
     );
     $build['payment_method'] = $plugin_selector->buildSelectorForm([], $form_state);
-    if ($selected_payment_method && !$selected_payment_method->getPaymentExecutionResult()->hasCompleted()) {
+    if ($selected_payment_method && !$selected_payment_method->getPaymentExecutionResult()->isCompleted()) {
       $this->disableChildren($build['payment_method']);
     }
     $this->getEntityFormDisplay($element, $form_state)->buildForm($this->getPayment($element, $form_state), $build, $form_state);
     $build['pay_link'] = $this->buildCompletePaymentLink($element, $form_state);
-    $build['pay_link']['#access'] = !$selected_payment_method || !$selected_payment_method->getPaymentExecutionResult()->hasCompleted();
+    $build['pay_link']['#access'] = !$selected_payment_method || !$selected_payment_method->getPaymentExecutionResult()->isCompleted();
     $build['pay_link']['#process'] = array(array(get_class($this), 'processMaxWeight'));
     $plugin_id = $this->getPluginId();
     $build['pay_button'] = array(
@@ -329,7 +329,7 @@ abstract class PaymentReferenceBase extends FormElement implements FormElementIn
     $selected_payment_method = $plugin_selector->getSelectedPlugin();
     if (!$element['#default_value']
       && $element['#available_payment_id']
-      && (!$selected_payment_method || !$selected_payment_method->getPaymentExecutionResult()->hasCompleted())) {
+      && (!$selected_payment_method || !$selected_payment_method->getPaymentExecutionResult()->isCompleted())) {
       $class[] = 'payment-reference-hidden';
     }
     $plugin_id = $this->getPluginId();
@@ -475,7 +475,7 @@ abstract class PaymentReferenceBase extends FormElement implements FormElementIn
 
     $payment->save();
     $result = $payment->execute();
-    if (!$result->hasCompleted() && !$this->requestStack->getCurrentRequest()->isXmlHttpRequest()) {
+    if (!$result->isCompleted() && !$this->requestStack->getCurrentRequest()->isXmlHttpRequest()) {
       $url = $payment->urlInfo('complete');
       $url->setOption('attributes', [
         'target' => '_blank',
@@ -500,7 +500,7 @@ abstract class PaymentReferenceBase extends FormElement implements FormElementIn
     /** @var \Drupal\payment\Plugin\Payment\Method\PaymentMethodInterface $selected_payment_method */
     $selected_payment_method = $this->getPluginSelector($root_element, $form_state)->getSelectedPlugin();
 
-    if (!$selected_payment_method->getPaymentExecutionResult()->hasCompleted()) {
+    if (!$selected_payment_method->getPaymentExecutionResult()->isCompleted()) {
       $link = $this->buildCompletePaymentLink($root_element, $form_state);
       $response->addCommand(new OpenModalDialogCommand($this->t('Complete payment'), $this->renderer->render($link)));
     }
diff --git a/src/Entity/Payment/PaymentAccessControlHandler.php b/src/Entity/Payment/PaymentAccessControlHandler.php
index 3bf39d9..375d359 100644
--- a/src/Entity/Payment/PaymentAccessControlHandler.php
+++ b/src/Entity/Payment/PaymentAccessControlHandler.php
@@ -53,7 +53,7 @@ class PaymentAccessControlHandler extends EntityAccessControlHandler {
     elseif ($operation == 'complete') {
       if ($payment->getPaymentMethod()) {
         return AccessResult::allowedIf($payment->getOwnerId() == $account->id())
-          ->orIf(AccessResult::forbiddenIf($payment->getPaymentMethod()->getPaymentExecutionResult()->hasCompleted()));
+          ->orIf(AccessResult::forbiddenIf($payment->getPaymentMethod()->getPaymentExecutionResult()->isCompleted()));
       }
       else {
         return AccessResult::forbidden();
diff --git a/src/Entity/Payment/PaymentCaptureForm.php b/src/Entity/Payment/PaymentCaptureForm.php
index 54f1d53..f2263bf 100644
--- a/src/Entity/Payment/PaymentCaptureForm.php
+++ b/src/Entity/Payment/PaymentCaptureForm.php
@@ -69,9 +69,14 @@ class PaymentCaptureForm extends ContentEntityConfirmFormBase {
     $payment = $this->getEntity();
     /** @var \Drupal\payment\Plugin\Payment\Method\PaymentMethodCapturePaymentInterface $payment_method */
     $payment_method = $payment->getPaymentMethod();
-    $payment_method->capturePayment();
+    $result = $payment_method->capturePayment();
 
-    $form_state->setRedirectUrl($payment->urlInfo());
+    if ($result->isCompleted()) {
+      $form_state->setRedirectUrl($payment->urlInfo());
+    }
+    else {
+      $form_state->setResponse($result->getCompletionResponse()->getResponse());
+    }
   }
 
 }
diff --git a/src/Entity/Payment/PaymentRefundForm.php b/src/Entity/Payment/PaymentRefundForm.php
index a1a8052..0174cd3 100644
--- a/src/Entity/Payment/PaymentRefundForm.php
+++ b/src/Entity/Payment/PaymentRefundForm.php
@@ -69,9 +69,14 @@ class PaymentRefundForm extends ContentEntityConfirmFormBase {
     $payment = $this->getEntity();
     /** @var \Drupal\payment\Plugin\Payment\Method\PaymentMethodRefundPaymentInterface $payment_method */
     $payment_method = $payment->getPaymentMethod();
-    $payment_method->refundPayment();
+    $result = $payment_method->refundPayment();
 
-    $form_state->setRedirectUrl($payment->urlInfo());
+    if ($result->isCompleted()) {
+      $form_state->setRedirectUrl($payment->urlInfo());
+    }
+    else {
+      $form_state->setResponse($result->getCompletionResponse()->getResponse());
+    }
   }
 
 }
diff --git a/src/Entity/PaymentInterface.php b/src/Entity/PaymentInterface.php
index b5f9ac7..63338e8 100644
--- a/src/Entity/PaymentInterface.php
+++ b/src/Entity/PaymentInterface.php
@@ -22,7 +22,7 @@ interface PaymentInterface extends ContentEntityInterface, EntityChangedInterfac
   /**
    * Executes the payment.
    *
-   * @return \Drupal\payment\PaymentExecutionResultInterface
+   * @return \Drupal\payment\OperationResultInterface
    */
   public function execute();
 
diff --git a/src/OperationResult.php b/src/OperationResult.php
new file mode 100644
index 0000000..0a9f7b0
--- /dev/null
+++ b/src/OperationResult.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\payment\OperationResult.
+ */
+
+namespace Drupal\payment;
+
+use Drupal\payment\Response\ResponseInterface;
+
+/**
+ * Provides an operation result.
+ */
+class OperationResult implements OperationResultInterface {
+
+  /**
+   * The response.
+   *
+   * @var \Drupal\payment\Response\ResponseInterface|null
+   */
+  protected $response;
+
+  /**
+   * Creates a new instance.
+   *
+   * @param \Drupal\payment\Response\ResponseInterface|null $response
+   *   A response or NULL if the operation is completed.
+   */
+  public function __construct(ResponseInterface $response = NULL) {
+    $this->response = $response;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isCompleted() {
+    return is_null($this->response);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCompletionResponse() {
+    return $this->response;
+  }
+
+}
diff --git a/src/OperationResultInterface.php b/src/OperationResultInterface.php
new file mode 100644
index 0000000..e65c7dc
--- /dev/null
+++ b/src/OperationResultInterface.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\payment\OperationResultInterface.
+ */
+
+namespace Drupal\payment;
+
+/**
+ * Defines an operation result.
+ *
+ * When operations can be initialized programmatically, but may require human
+ * interaction to be completed, this interface provides calling code with
+ * information to continue the human part of the operation.
+ */
+interface OperationResultInterface {
+
+  /**
+   * Gets whether the operation is completed.
+   *
+   * @return bool
+   *   Whether the operation is completed. When FALSE is returned,
+   *   self::getCompletionResponse() MUST return a response.
+   */
+  public function isCompleted();
+
+  /**
+   * Gets the response to complete the operation.
+   *
+   * @return \Drupal\payment\Response\ResponseInterface|null
+   *   A response (only if self::isInProgress() returns TRUE) or NULL if the
+   *   operation cannot be completed (anymore).
+   */
+  public function getCompletionResponse();
+
+}
diff --git a/src/PaymentExecutionResult.php b/src/PaymentExecutionResult.php
deleted file mode 100644
index eb5727e..0000000
--- a/src/PaymentExecutionResult.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\payment\PaymentExecutionResult.
- */
-
-namespace Drupal\payment;
-
-use Drupal\payment\Response\ResponseInterface;
-
-/**
- * Provides a payment execution result.
- */
-class PaymentExecutionResult implements PaymentExecutionResultInterface {
-
-  /**
-   * The response.
-   *
-   * @var \Drupal\payment\Response\ResponseInterface|null
-   */
-  protected $response;
-
-  /**
-   * Creates a new instance.
-   *
-   * @param \Drupal\payment\Response\ResponseInterface|null $response
-   *   A response or NULL if execution has completed.
-   */
-  public function __construct(ResponseInterface $response = NULL) {
-    $this->response = $response;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function hasCompleted() {
-    return is_null($this->response);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getCompletionResponse() {
-    return $this->response;
-  }
-
-}
diff --git a/src/PaymentExecutionResultInterface.php b/src/PaymentExecutionResultInterface.php
deleted file mode 100644
index f6e0c5a..0000000
--- a/src/PaymentExecutionResultInterface.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\payment\PaymentExecutionResultInterface.
- */
-
-namespace Drupal\payment;
-
-/**
- * Defines a payment execution result.
- *
- * This interface has nothing to do with payment statuses. Instead, it provides
- * information about a payment's execution workflow, during which the payment's
- * status can, but does not have to be changed.
- */
-interface PaymentExecutionResultInterface {
-
-  /**
-   * Checks whether the execution process has completed.
-   *
-   * @return bool
-   *   Whether the execution process is has completed. When FALSE is
-   *   returned, self::getCompletionResponse() MUST return a response.
-   */
-  public function hasCompleted();
-
-  /**
-   * Gets the response to complete payment execution.
-   *
-   * @return \Drupal\payment\Response\ResponseInterface|null
-   *   A response (only if self::isInProgress() returns TRUE) or NULL if payment
-   *   execution cannot be completed (anymore).
-   */
-  public function getCompletionResponse();
-
-}
diff --git a/src/Plugin/Payment/Method/PaymentMethodBase.php b/src/Plugin/Payment/Method/PaymentMethodBase.php
index 39cd290..e337d8e 100644
--- a/src/Plugin/Payment/Method/PaymentMethodBase.php
+++ b/src/Plugin/Payment/Method/PaymentMethodBase.php
@@ -19,7 +19,7 @@ use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Utility\Token;
 use Drupal\payment\EventDispatcherInterface;
 use Drupal\payment\PaymentAwareTrait;
-use Drupal\payment\PaymentExecutionResult;
+use Drupal\payment\OperationResult;
 use Drupal\payment\Plugin\Payment\Status\PaymentStatusManagerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -252,7 +252,7 @@ abstract class PaymentMethodBase extends PluginBase implements ContainerFactoryP
    * {@inheritdoc}
    */
   public function getPaymentExecutionResult() {
-    return new PaymentExecutionResult();
+    return new OperationResult();
   }
 
   /**
@@ -287,6 +287,15 @@ abstract class PaymentMethodBase extends PluginBase implements ContainerFactoryP
     }
     $this->eventDispatcher->preCapturePayment($this->getPayment());
     $this->doCapturePayment();
+
+    return $this->getPaymentCaptureResult();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPaymentCaptureResult() {
+    return new OperationResult();
   }
 
   /**
@@ -328,6 +337,15 @@ abstract class PaymentMethodBase extends PluginBase implements ContainerFactoryP
     }
     $this->eventDispatcher->preRefundPayment($this->getPayment());
     $this->doRefundPayment();
+
+    return $this->getPaymentRefundResult();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPaymentRefundResult() {
+    return new OperationResult();
   }
 
   /**
diff --git a/src/Plugin/Payment/Method/PaymentMethodCapturePaymentInterface.php b/src/Plugin/Payment/Method/PaymentMethodCapturePaymentInterface.php
index e389b4a..f07259e 100644
--- a/src/Plugin/Payment/Method/PaymentMethodCapturePaymentInterface.php
+++ b/src/Plugin/Payment/Method/PaymentMethodCapturePaymentInterface.php
@@ -37,8 +37,17 @@ interface PaymentMethodCapturePaymentInterface {
    * \Drupal\payment\Event\PaymentEvents::PAYMENT_PRE_CAPTURE Symfony event
    * before capture.
    *
+   * @return \Drupal\payment\OperationResultInterface
+   *
    * @see self::capturePaymentAccess
    */
   public function capturePayment();
 
+  /**
+   * Gets the payment capture status.
+   *
+   * @return \Drupal\payment\OperationResultInterface
+   */
+  public function getPaymentCaptureResult();
+
 }
diff --git a/src/Plugin/Payment/Method/PaymentMethodInterface.php b/src/Plugin/Payment/Method/PaymentMethodInterface.php
index f6fdcb1..7aa95f8 100644
--- a/src/Plugin/Payment/Method/PaymentMethodInterface.php
+++ b/src/Plugin/Payment/Method/PaymentMethodInterface.php
@@ -51,7 +51,7 @@ interface PaymentMethodInterface extends PluginInspectionInterface, PaymentAware
    * This method MUST set the payment's status to "payment_pending" before it
    * performs any payment-method-specific logic.
    *
-   * @return \Drupal\payment\PaymentExecutionResultInterface
+   * @return \Drupal\payment\OperationResultInterface
    *
    * @see self::executePaymentAccess
    */
@@ -60,7 +60,7 @@ interface PaymentMethodInterface extends PluginInspectionInterface, PaymentAware
   /**
    * Gets the payment execution status.
    *
-   * @return \Drupal\payment\PaymentExecutionResultInterface
+   * @return \Drupal\payment\OperationResultInterface
    */
   public function getPaymentExecutionResult();
 
diff --git a/src/Plugin/Payment/Method/PaymentMethodRefundPaymentInterface.php b/src/Plugin/Payment/Method/PaymentMethodRefundPaymentInterface.php
index 78407c1..04e80cd 100644
--- a/src/Plugin/Payment/Method/PaymentMethodRefundPaymentInterface.php
+++ b/src/Plugin/Payment/Method/PaymentMethodRefundPaymentInterface.php
@@ -37,8 +37,17 @@ interface PaymentMethodRefundPaymentInterface {
    * \Drupal\payment\Event\PaymentEvents::PAYMENT_PRE_REFUND Symfony event
    * before refunding the payment.
    *
+   * @return \Drupal\payment\OperationResultInterface
+   *
    * @see self::refundPaymentAccess
    */
   public function refundPayment();
 
+  /**
+   * Gets the payment refund status.
+   *
+   * @return \Drupal\payment\OperationResultInterface
+   */
+  public function getPaymentRefundResult();
+
 }
diff --git a/src/Plugin/Payment/Method/Unavailable.php b/src/Plugin/Payment/Method/Unavailable.php
index bd60b1e..d8427f9 100644
--- a/src/Plugin/Payment/Method/Unavailable.php
+++ b/src/Plugin/Payment/Method/Unavailable.php
@@ -11,7 +11,7 @@ use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\payment\Entity\PaymentInterface;
-use Drupal\payment\PaymentExecutionResult;
+use Drupal\payment\OperationResult;
 
 /**
  * A payment method controller that essentially disables payment methods.
@@ -75,7 +75,7 @@ class Unavailable extends PluginBase implements PaymentMethodInterface {
    * {@inheritdoc}
    */
   public function getPaymentExecutionResult() {
-    return new PaymentExecutionResult();
+    return new OperationResult();
   }
 
   /**
diff --git a/tests/src/Unit/Controller/CompletePaymentTest.php b/tests/src/Unit/Controller/CompletePaymentTest.php
index 8f4e3ce..2206841 100644
--- a/tests/src/Unit/Controller/CompletePaymentTest.php
+++ b/tests/src/Unit/Controller/CompletePaymentTest.php
@@ -9,7 +9,7 @@ namespace Drupal\Tests\payment\Unit\Controller;
 
 use Drupal\payment\Controller\CompletePayment;
 use Drupal\payment\Entity\PaymentInterface;
-use Drupal\payment\PaymentExecutionResultInterface;
+use Drupal\payment\OperationResultInterface;
 use Drupal\payment\Plugin\Payment\Method\PaymentMethodInterface;
 use Drupal\payment\Response\ResponseInterface;
 use Drupal\Tests\UnitTestCase;
@@ -49,7 +49,7 @@ class CompletePaymentTest extends UnitTestCase {
       ->method('getResponse')
       ->willReturn($response);
 
-    $execution_result = $this->getMock(PaymentExecutionResultInterface::class);
+    $execution_result = $this->getMock(OperationResultInterface::class);
     $execution_result->expects($this->atLeastOnce())
       ->method('getCompletionResponse')
       ->willReturn($completion_response);
diff --git a/tests/src/Unit/Element/PaymentReferenceBaseTest.php b/tests/src/Unit/Element/PaymentReferenceBaseTest.php
index ceb7abc..a0b4efd 100644
--- a/tests/src/Unit/Element/PaymentReferenceBaseTest.php
+++ b/tests/src/Unit/Element/PaymentReferenceBaseTest.php
@@ -25,7 +25,7 @@ namespace Drupal\Tests\payment\Unit\Element {
   use Drupal\currency\Entity\CurrencyInterface;
   use Drupal\payment\Element\PaymentReferenceBase;
   use Drupal\payment\Entity\PaymentInterface;
-  use Drupal\payment\PaymentExecutionResultInterface;
+  use Drupal\payment\OperationResultInterface;
   use Drupal\payment\Plugin\Payment\Method\PaymentMethodInterface;
   use Drupal\payment\Plugin\Payment\Method\PaymentMethodManagerInterface;
   use Drupal\payment\Plugin\Payment\Status\PaymentStatusInterface;
@@ -305,9 +305,9 @@ namespace Drupal\Tests\payment\Unit\Element {
 
       $url = new Url($this->randomMachineName());
 
-      $result = $this->getMock(PaymentExecutionResultInterface::class);
+      $result = $this->getMock(OperationResultInterface::class);
       $result->expects($this->atLeastOnce())
-        ->method('hasCompleted')
+        ->method('isCompleted')
         ->willReturn($has_completed);
 
       $payment = $this->getMock(PaymentInterface::class);
@@ -398,13 +398,13 @@ namespace Drupal\Tests\payment\Unit\Element {
      *
      * @dataProvider providerTestAjaxPay
      */
-    public function testAjaxPay($has_completed, $number_of_commands) {
+    public function testAjaxPay($is_completed, $number_of_commands) {
       $payment = $this->getMock(PaymentInterface::class);
 
-      $result = $this->getMock(PaymentExecutionResultInterface::class);
+      $result = $this->getMock(OperationResultInterface::class);
       $result->expects($this->atLeastOnce())
-        ->method('hasCompleted')
-        ->willReturn($has_completed);
+        ->method('isCompleted')
+        ->willReturn($is_completed);
 
       $payment_method = $this->getMock(PaymentMethodInterface::class);
       $payment_method->expects($this->any())
diff --git a/tests/src/Unit/Entity/Payment/PaymentAccessControlHandlerTest.php b/tests/src/Unit/Entity/Payment/PaymentAccessControlHandlerTest.php
index c1418e7..ac0c30d 100644
--- a/tests/src/Unit/Entity/Payment/PaymentAccessControlHandlerTest.php
+++ b/tests/src/Unit/Entity/Payment/PaymentAccessControlHandlerTest.php
@@ -13,7 +13,7 @@ use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\payment\Entity\Payment\PaymentAccessControlHandler;
 use Drupal\payment\Entity\PaymentInterface;
-use Drupal\payment\PaymentExecutionResultInterface;
+use Drupal\payment\OperationResultInterface;
 use Drupal\payment\Plugin\Payment\Method\PaymentMethodCapturePaymentInterface;
 use Drupal\payment\Plugin\Payment\Method\PaymentMethodInterface;
 use Drupal\payment\Plugin\Payment\Method\PaymentMethodRefundPaymentInterface;
@@ -250,9 +250,9 @@ class PaymentAccessControlHandlerTest extends UnitTestCase {
     $account->expects($this->never())
       ->method('hasPermission');
 
-    $payment_execution_result = $this->getMock(PaymentExecutionResultInterface::class);
+    $payment_execution_result = $this->getMock(OperationResultInterface::class);
     $payment_execution_result->expects($this->any())
-      ->method('hasCompleted')
+      ->method('isCompleted')
       ->willReturn($payment_execution_has_completed);
 
     $payment_method = $this->getMock(PaymentAccessUnitTestDummyPaymentMethodUpdateStatusInterface::class);
diff --git a/tests/src/Unit/Entity/Payment/PaymentCaptureFormTest.php b/tests/src/Unit/Entity/Payment/PaymentCaptureFormTest.php
index 49d690e..5930363 100644
--- a/tests/src/Unit/Entity/Payment/PaymentCaptureFormTest.php
+++ b/tests/src/Unit/Entity/Payment/PaymentCaptureFormTest.php
@@ -12,9 +12,12 @@ use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Url;
 use Drupal\payment\Entity\Payment\PaymentCaptureForm;
 use Drupal\payment\Entity\PaymentInterface;
+use Drupal\payment\OperationResultInterface;
 use Drupal\payment\Plugin\Payment\Method\PaymentMethodCapturePaymentInterface;
+use Drupal\payment\Response\ResponseInterface;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Response;
 
 /**
  * @coversDefaultClass \Drupal\payment\Entity\Payment\PaymentCaptureForm
@@ -114,10 +117,56 @@ class PaymentCaptureFormTest extends UnitTestCase {
   /**
    * @covers ::submitForm
    */
-  function testSubmitForm() {
+  function testSubmitFormWithCompletionResponse() {
+    $response = $this->getMockBuilder(Response::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    $completion_response = $this->getMock(ResponseInterface::class);
+    $completion_response->expects($this->atLeastOnce())
+      ->method('getResponse')
+      ->willReturn($response);
+
+    $operation_result = $this->getMock(OperationResultInterface::class);
+    $operation_result->expects($this->atLeastOnce())
+      ->method('getCompletionResponse')
+      ->willReturn($completion_response);
+    $operation_result->expects($this->atLeastOnce())
+      ->method('isCompleted')
+      ->willReturn(FALSE);
+
+    $payment_method = $this->getMock(PaymentMethodCapturePaymentInterface::class);
+    $payment_method->expects($this->once())
+      ->method('capturePayment')
+      ->willReturn($operation_result);
+
+    $this->payment->expects($this->atLeastOnce())
+      ->method('getPaymentMethod')
+      ->willReturn($payment_method);
+
+    $form = [];
+
+    $form_state = $this->getMock(FormStateInterface::class);
+    $form_state->expects($this->atLeastOnce())
+      ->method('setResponse')
+      ->with($response);
+
+    $this->sut->submitForm($form, $form_state);
+  }
+
+  /**
+   * @covers ::submitForm
+   */
+  function testSubmitFormWithoutCompletionResponse() {
+    $operation_result = $this->getMock(OperationResultInterface::class);
+    $operation_result->expects($this->atLeastOnce())
+      ->method('isCompleted')
+      ->willReturn(TRUE);
+
     $payment_method = $this->getMock(PaymentMethodCapturePaymentInterface::class);
     $payment_method->expects($this->once())
-      ->method('capturePayment');
+      ->method('capturePayment')
+      ->willReturn($operation_result);
 
     $url = new Url($this->randomMachineName());
 
@@ -132,7 +181,7 @@ class PaymentCaptureFormTest extends UnitTestCase {
     $form = [];
 
     $form_state = $this->getMock(FormStateInterface::class);
-    $form_state->expects($this->once())
+    $form_state->expects($this->atLeastOnce())
       ->method('setRedirectUrl')
       ->with($url);
 
diff --git a/tests/src/Unit/Entity/Payment/PaymentRefundFormTest.php b/tests/src/Unit/Entity/Payment/PaymentRefundFormTest.php
index 0d86cf9..bf8f282 100644
--- a/tests/src/Unit/Entity/Payment/PaymentRefundFormTest.php
+++ b/tests/src/Unit/Entity/Payment/PaymentRefundFormTest.php
@@ -12,9 +12,12 @@ use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Url;
 use Drupal\payment\Entity\Payment\PaymentRefundForm;
 use Drupal\payment\Entity\PaymentInterface;
+use Drupal\payment\OperationResultInterface;
 use Drupal\payment\Plugin\Payment\Method\PaymentMethodRefundPaymentInterface;
+use Drupal\payment\Response\ResponseInterface;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Response;
 
 /**
  * @coversDefaultClass \Drupal\payment\Entity\Payment\PaymentRefundForm
@@ -114,10 +117,56 @@ class PaymentRefundFormTest extends UnitTestCase {
   /**
    * @covers ::submitForm
    */
-  function testSubmitForm() {
+  function testSubmitFormWithCompletionResponse() {
+    $response = $this->getMockBuilder(Response::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    $completion_response = $this->getMock(ResponseInterface::class);
+    $completion_response->expects($this->atLeastOnce())
+      ->method('getResponse')
+      ->willReturn($response);
+
+    $operation_result = $this->getMock(OperationResultInterface::class);
+    $operation_result->expects($this->atLeastOnce())
+      ->method('getCompletionResponse')
+      ->willReturn($completion_response);
+    $operation_result->expects($this->atLeastOnce())
+      ->method('isCompleted')
+      ->willReturn(FALSE);
+
+    $payment_method = $this->getMock(PaymentMethodRefundPaymentInterface::class);
+    $payment_method->expects($this->once())
+      ->method('refundPayment')
+      ->willReturn($operation_result);
+
+    $this->payment->expects($this->atLeastOnce())
+      ->method('getPaymentMethod')
+      ->willReturn($payment_method);
+
+    $form = [];
+
+    $form_state = $this->getMock(FormStateInterface::class);
+    $form_state->expects($this->atLeastOnce())
+      ->method('setResponse')
+      ->with($response);
+
+    $this->sut->submitForm($form, $form_state);
+  }
+
+  /**
+   * @covers ::submitForm
+   */
+  function testSubmitFormWithoutCompletionResponse() {
+    $operation_result = $this->getMock(OperationResultInterface::class);
+    $operation_result->expects($this->atLeastOnce())
+      ->method('isCompleted')
+      ->willReturn(TRUE);
+
     $payment_method = $this->getMock(PaymentMethodRefundPaymentInterface::class);
     $payment_method->expects($this->once())
-      ->method('refundPayment');
+      ->method('refundPayment')
+      ->willReturn($operation_result);
 
     $url = new Url($this->randomMachineName());
 
@@ -130,8 +179,9 @@ class PaymentRefundFormTest extends UnitTestCase {
       ->willReturn($url);
 
     $form = [];
+
     $form_state = $this->getMock(FormStateInterface::class);
-    $form_state->expects($this->once())
+    $form_state->expects($this->atLeastOnce())
       ->method('setRedirectUrl')
       ->with($url);
 
diff --git a/tests/src/Unit/OperationResultTest.php b/tests/src/Unit/OperationResultTest.php
new file mode 100644
index 0000000..378a849
--- /dev/null
+++ b/tests/src/Unit/OperationResultTest.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\payment\Unit\OperationResultTest.
+ */
+
+namespace Drupal\Tests\payment\Unit;
+
+use Drupal\payment\OperationResult;
+use Drupal\payment\Response\ResponseInterface;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\payment\OperationResult
+ *
+ * @group Payment
+ */
+class OperationResultTest extends UnitTestCase {
+
+  /**
+   * The response.
+   *
+   * @var \Drupal\payment\Response\ResponseInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $response;
+
+  /**
+   * The class under test.
+   *
+   * @var \Drupal\payment\OperationResult
+   */
+  protected $sut;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    $this->response = $this->getMock(ResponseInterface::class);
+  }
+
+  /**
+   * @covers ::isCompleted
+   * @covers ::__construct
+   */
+  function testIsCompleted() {
+    $this->sut = new OperationResult();
+    $this->assertTrue($this->sut->isCompleted());
+
+    $this->sut = new OperationResult($this->response);
+    $this->assertFalse($this->sut->isCompleted());
+  }
+
+  /**
+   * @covers ::getCompletionResponse
+   * @covers ::__construct
+   */
+  function testGetCompletionResponse() {
+    $this->sut = new OperationResult();
+    $this->assertNULL($this->sut->getCompletionResponse());
+
+    $this->sut = new OperationResult($this->response);
+    $this->assertSame($this->response, $this->sut->getCompletionResponse());
+  }
+
+}
diff --git a/tests/src/Unit/PaymentExecutionResultTest.php b/tests/src/Unit/PaymentExecutionResultTest.php
deleted file mode 100644
index aa668a0..0000000
--- a/tests/src/Unit/PaymentExecutionResultTest.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Tests\payment\Unit\PaymentExecutionResultTest.
- */
-
-namespace Drupal\Tests\payment\Unit;
-
-use Drupal\payment\PaymentExecutionResult;
-use Drupal\payment\Response\ResponseInterface;
-use Drupal\Tests\UnitTestCase;
-
-/**
- * @coversDefaultClass \Drupal\payment\PaymentExecutionResult
- *
- * @group Payment
- */
-class PaymentExecutionResultTest extends UnitTestCase {
-
-  /**
-   * The response.
-   *
-   * @var \Drupal\payment\Response\ResponseInterface|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $response;
-
-  /**
-   * The class under test.
-   *
-   * @var \Drupal\payment\PaymentExecutionResult
-   */
-  protected $sut;
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setUp() {
-    $this->response = $this->getMock(ResponseInterface::class);
-  }
-
-  /**
-   * @covers ::hasCompleted
-   * @covers ::__construct
-   */
-  function testHasCompleted() {
-    $this->sut = new PaymentExecutionResult();
-    $this->assertTrue($this->sut->hasCompleted());
-
-    $this->sut = new PaymentExecutionResult($this->response);
-    $this->assertFalse($this->sut->hasCompleted());
-  }
-
-  /**
-   * @covers ::getCompletionResponse
-   * @covers ::__construct
-   */
-  function testGetCompletionResponse() {
-    $this->sut = new PaymentExecutionResult();
-    $this->assertNULL($this->sut->getCompletionResponse());
-
-    $this->sut = new PaymentExecutionResult($this->response);
-    $this->assertSame($this->response, $this->sut->getCompletionResponse());
-  }
-
-}
diff --git a/tests/src/Unit/Plugin/Payment/Method/PaymentMethodBaseTest.php b/tests/src/Unit/Plugin/Payment/Method/PaymentMethodBaseTest.php
index 7dfd010..4f2cc6b 100644
--- a/tests/src/Unit/Plugin/Payment/Method/PaymentMethodBaseTest.php
+++ b/tests/src/Unit/Plugin/Payment/Method/PaymentMethodBaseTest.php
@@ -16,6 +16,7 @@ use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\payment\Entity\PaymentInterface;
+use Drupal\payment\OperationResultInterface;
 use Drupal\payment\Plugin\Payment\Method\PaymentMethodBase;
 use Drupal\payment\Plugin\Payment\Method\SupportedCurrency;
 use Drupal\payment\Plugin\Payment\Status\PaymentStatusInterface;
@@ -315,7 +316,9 @@ class PaymentMethodBaseTest extends PaymentMethodBaseTestBase {
 
     $this->sut->setPayment($payment);
 
-    $this->sut->capturePayment();
+    $result = $this->sut->capturePayment();
+
+    $this->assertInstanceOf(OperationResultInterface::class, $result);
   }
 
   /**
@@ -365,7 +368,9 @@ class PaymentMethodBaseTest extends PaymentMethodBaseTestBase {
 
     $this->sut->setPayment($payment);
 
-    $this->sut->refundPayment();
+    $result = $this->sut->refundPayment();
+
+    $this->assertInstanceOf(OperationResultInterface::class, $result);
   }
 
   /**
