diff --git a/payment/lib/Drupal/payment/PaymentProcessingInterface.php b/payment/lib/Drupal/payment/PaymentProcessingInterface.php
index 63c89dc..bc0a70b 100644
--- a/payment/lib/Drupal/payment/PaymentProcessingInterface.php
+++ b/payment/lib/Drupal/payment/PaymentProcessingInterface.php
@@ -25,6 +25,19 @@ interface PaymentProcessingInterface {
   public function currencies();
 
   /**
+   * Returns the available brand names.
+   *
+   * Payment method plugins may represent payment processing services that
+   * provide more than one 'brand' of payment method through which a payment can
+   * be processed, such as a combination of different credit or debit card
+   * brands and direct debit.
+   *
+   * @return array
+   *  Keys are machine names. Values are human-readable brand names.
+   */
+  public function brandOptions();
+
+  /**
    * Returns the form elements to configure payments.
    *
    * $form_state['payment'] contains the payment that is added or edited. All
@@ -48,10 +61,12 @@ interface PaymentProcessingInterface {
    * @param string $operation
    *   See \Drupal\payment\Annotations\PaymentMethod::operations for the
    *   definition of available operations.
+   * @param string $payment_method_brand
+   *   See self::brandOptions for the available brands.
    *
    * @return bool
    */
-  function paymentOperationAccess(PaymentInterface $payment, $operation);
+  function paymentOperationAccess(PaymentInterface $payment, $operation, $payment_method_brand);
 
   /**
    * Executes a payment operation.
@@ -63,5 +78,5 @@ interface PaymentProcessingInterface {
    *   See \Drupal\payment\Annotations\PaymentMethod::operations for the
    *   definition of available operations.
    */
-  function executePaymentOperation(PaymentInterface $payment, $operation);
+  function executePaymentOperation(PaymentInterface $payment, $operation, $payment_method_brand);
 }
\ No newline at end of file
diff --git a/payment/lib/Drupal/payment/Plugin/Core/entity/PaymentMethod.php b/payment/lib/Drupal/payment/Plugin/Core/entity/PaymentMethod.php
index b991320..3189b53 100644
--- a/payment/lib/Drupal/payment/Plugin/Core/entity/PaymentMethod.php
+++ b/payment/lib/Drupal/payment/Plugin/Core/entity/PaymentMethod.php
@@ -175,15 +175,22 @@ class PaymentMethod extends ConfigEntityBase implements PaymentMethodInterface {
   /**
    * {@inheritdoc}
    */
-  function paymentOperationAccess(PaymentInterface $payment, $operation) {
-    return $this->getPlugin()->paymentOperationAccess($payment, $operation);
+  function paymentOperationAccess(PaymentInterface $payment, $operation, $payment_method_brand) {
+    return $this->getPlugin()->paymentOperationAccess($payment, $operation, $payment_method_brand);
   }
 
   /**
    * {@inheritdoc}
    */
-  function executePaymentOperation(PaymentInterface $payment, $operation) {
-    return $this->getPlugin()->executePaymentOperation($payment, $operation);
+  function executePaymentOperation(PaymentInterface $payment, $operation, $payment_method_brand) {
+    return $this->getPlugin()->executePaymentOperation($payment, $operation, $payment_method_brand);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function brandOptions() {
+    return $this->getPlugin()->brandOptions();
   }
 
   /**
diff --git a/payment/lib/Drupal/payment/Plugin/payment/method/Base.php b/payment/lib/Drupal/payment/Plugin/payment/method/Base.php
index 6d758ac..ff7cc43 100644
--- a/payment/lib/Drupal/payment/Plugin/payment/method/Base.php
+++ b/payment/lib/Drupal/payment/Plugin/payment/method/Base.php
@@ -14,6 +14,9 @@ use Drupal\payment\Plugin\Core\entity\PaymentMethodInterface as EntityPaymentMet
 
 /**
  * A base payment method plugin.
+ *
+ * Plugins that represent more than one brand need to override
+ * self::defaultBrandOptions().
  */
 abstract class Base extends PluginBase implements PaymentMethodInterface {
 
@@ -28,10 +31,12 @@ abstract class Base extends PluginBase implements PaymentMethodInterface {
    * {@inheritdoc}
    */
   public function __construct(array $configuration, $plugin_id, array $plugin_definition) {
-    $configuration += array(
+    $defaults = array(
+      'brandOptions' => array(),
       'messageText' => '',
       'messageTextFormat' => 'plain_text',
     );
+    $configuration = NestedArray::mergeDeep($defaults, $configuration);
     parent::__construct($configuration, $plugin_id, $plugin_definition);
   }
 
@@ -126,9 +131,42 @@ abstract class Base extends PluginBase implements PaymentMethodInterface {
    * {@inheritdoc}
    */
   public function paymentMethodFormElements(array $form, array &$form_state) {
-    // @todo Add a token overview, possibly when Token.module has been ported.
     $elements['#element_validate'] = array(array($this, 'paymentMethodFormElementsValidate'));
     $elements['#tree'] = TRUE;
+
+    // Brands.
+    $elements['brands'] = array(
+      '#description' => t('Payers will see these labels when choosing a payment method brand.'),
+      '#title' => t('Brands'),
+      '#type' => 'details',
+    );
+    $default_brand_options = $this->defaultBrandOptions();
+    $brand_options = $this->brandOptions();
+    if (count($brand_options) == 1) {
+      $brand = key($brand_options);
+      $label = reset($brand_options);
+      $elements['brands']['brand_' . $brand] = array(
+        '#default_value' => $label,
+        '#description' => t('Defaults to the payment method label.'),
+        '#title' => t('Label'),
+        '#type' => 'textfield',
+      );
+    }
+    else {
+      foreach ($brand_options as $brand => $label) {
+        $elements['brands']['brand_' . $brand] = array(
+          '#default_value' => $label,
+          '#required' => TRUE,
+          '#title' => t('Label for @brand', array(
+            '@brand' => $default_brand_options[$brand],
+          )),
+          '#type' => 'textfield',
+        );
+      }
+    }
+
+    // The payment form message.
+    // @todo Add a token overview, possibly when Token.module has been ported.
     $elements['message'] = array(
       '#type' => 'text_format',
       '#title' => t('Payment form message'),
@@ -151,14 +189,14 @@ abstract class Base extends PluginBase implements PaymentMethodInterface {
   /**
    * {@inheritdoc}
    */
-  function paymentOperationAccess(PaymentInterface $payment, $operation) {
+  function paymentOperationAccess(PaymentInterface $payment, $operation, $payment_method_brand) {
     if (!$this->getPaymentMethod()->status()) {
       return FALSE;
     }
-    if (!$this->paymentOperationAccessCurrency($payment, $operation)) {
+    if (!$this->paymentOperationAccessCurrency($payment, $operation, $payment_method_brand)) {
       return FALSE;
     }
-    if (!$this->paymentOperationAccessEvent($payment, $operation)) {
+    if (!$this->paymentOperationAccessEvent($payment, $operation, $payment_method_brand)) {
       return FALSE;
     }
     return TRUE;
@@ -167,7 +205,7 @@ abstract class Base extends PluginBase implements PaymentMethodInterface {
   /**
    * Checks a payment's currency against this plugin.
    */
-  protected function paymentOperationAccessCurrency(PaymentInterface $payment, $operation) {
+  protected function paymentOperationAccessCurrency(PaymentInterface $payment, $operation, $payment_method_brand) {
     if (!$payment->getCurrencyCode()) {
       return FALSE;
     }
@@ -195,10 +233,10 @@ abstract class Base extends PluginBase implements PaymentMethodInterface {
    *
    * @return bool
    */
-  protected function paymentOperationAccessEvent(PaymentInterface $payment, $operation) {
+  protected function paymentOperationAccessEvent(PaymentInterface $payment, $operation, $payment_method_brand) {
     $handler = \Drupal::moduleHandler();
     foreach ($handler->getImplementations('payment_operation_access') as $module) {
-      $module_access = $handler->invoke($module, 'payment_operation_access', $payment, $this->getPaymentMethod(), $operation);
+      $module_access = $handler->invoke($module, 'payment_operation_access', $payment, $this->getPaymentMethod(), $operation, $payment_method_brand);
       if ($module_access === FALSE) {
         return FALSE;
       }
@@ -207,4 +245,41 @@ abstract class Base extends PluginBase implements PaymentMethodInterface {
 
     return TRUE;
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function brandOptions() {
+    return $this->configuration['brandOptions'] + $this->defaultBrandOptions();
+  }
+
+  /**
+   * Sets the brand options.
+   *
+   * @param $options
+   *  Keys are machine names. Values are human-readable brand names.
+   *
+   * @return \Drupal\payment\Plugin\payment\method\PaymentMethodInterface
+   */
+  public function setBrandOptions(array $options) {
+    $this->configuration['brandOptions'] = $options;
+
+    return $this;
+  }
+
+  /**
+   * Defines the default (original/official) brand options.
+   *
+   * Plugins that represent more than one brand need to override this method.
+   *
+   * @return array
+   *  Keys are machine names. Values are human-readable brand names.
+   */
+  public function defaultBrandOptions() {
+    $definition = $this->getPluginDefinition();
+
+    return array(
+      'default' => $definition['label'],
+    );
+  }
 }
diff --git a/payment/lib/Drupal/payment/Plugin/payment/method/Basic.php b/payment/lib/Drupal/payment/Plugin/payment/method/Basic.php
index 32c1629..cdf2299 100644
--- a/payment/lib/Drupal/payment/Plugin/payment/method/Basic.php
+++ b/payment/lib/Drupal/payment/Plugin/payment/method/Basic.php
@@ -98,15 +98,15 @@ class Basic extends Base {
   /**
    * {@inheritdoc}
    */
-  function paymentOperationAccess(PaymentInterface $payment, $operation) {
+  function paymentOperationAccess(PaymentInterface $payment, $operation, $payment_method_brand) {
     // This plugin only supports the execute operation.
-    return $operation == 'execute' && parent::paymentOperationAccess($payment, $operation);
+    return $operation == 'execute' && parent::paymentOperationAccess($payment, $operation, $payment_method_brand);
   }
 
   /**
    * {@inheritdoc}
    */
-  protected function paymentOperationAccessCurrency(PaymentInterface $payment, $operation) {
+  protected function paymentOperationAccessCurrency(PaymentInterface $payment, $operation, $payment_method_brand) {
     // This plugin supports any currency.
     return TRUE;
   }
@@ -114,8 +114,8 @@ class Basic extends Base {
   /**
    * {@inheritdoc}
    */
-  function executePaymentOperation(PaymentInterface $payment, $operation) {
-    if ($this->paymentOperationAccess($payment, $operation)) {
+  function executePaymentOperation(PaymentInterface $payment, $operation, $payment_method_brand) {
+    if ($this->paymentOperationAccess($payment, $operation, $payment_method_brand)) {
       if ($operation == 'execute') {
         $payment->setStatus(\Drupal::service('plugin.manager.payment.status')->createInstance($this->getStatus()));
       }
diff --git a/payment/lib/Drupal/payment/Tests/Plugin/payment/method/BasicTest.php b/payment/lib/Drupal/payment/Tests/Plugin/payment/method/BasicTest.php
index a607b99..2b801a6 100644
--- a/payment/lib/Drupal/payment/Tests/Plugin/payment/method/BasicTest.php
+++ b/payment/lib/Drupal/payment/Tests/Plugin/payment/method/BasicTest.php
@@ -41,10 +41,16 @@ class BasicTest extends WebtestBase {
    * Tests setAmount() and getAmount().
    */
   function testGetConfiguration() {
-    $this->method->setMessageText('foo');
-    $this->method->setMessageTextFormat('bar');
-    $this->method->setStatus('baz');
+    $this->method->setMessageText('foo')
+      ->setMessageTextFormat('bar')
+      ->setStatus('baz')
+      ->setBrandOptions(array(
+        'foo' => 'Foo',
+      ));
     $this->assertEqual($this->method->getConfiguration(), array(
+      'brandOptions' => array(
+        'foo' => 'Foo',
+      ),
       'messageText' => 'foo',
       'messageTextFormat' => 'bar',
       'status' => 'baz',
@@ -115,8 +121,8 @@ class BasicTest extends WebtestBase {
    */
   function testPaymentOperationAccess() {
     $payment = entity_create('payment', array());
-    $this->assertTrue($this->method->paymentOperationAccess($payment, 'execute'));
-    $this->assertFalse($this->method->paymentOperationAccess($payment, $this->randomName()));
+    $this->assertTrue($this->method->paymentOperationAccess($payment, 'execute', 'default'));
+    $this->assertFalse($this->method->paymentOperationAccess($payment, $this->randomName(), 'default'));
   }
 
   /**
@@ -126,7 +132,7 @@ class BasicTest extends WebtestBase {
     $plugin_id = 'payment_unknown';
     $payment = entity_create('payment', array());
     $this->method->setStatus($plugin_id);
-    $this->method->executePaymentOperation($payment, 'execute');
+    $this->method->executePaymentOperation($payment, 'execute', 'default');
     $this->assertTrue($payment->getStatus()->getPluginId() == $plugin_id);
   }
 }
diff --git a/payment/payment.api.php b/payment/payment.api.php
index 0b808b7..02acd40 100644
--- a/payment/payment.api.php
+++ b/payment/payment.api.php
@@ -94,11 +94,13 @@ function hook_payment_pre_resume_context(PaymentInterface $payment) {
  *   method that $payment should be tested against, which is $payment_method.
  * @param \Drupal\payment\Plugin\Core\entity\PaymentMethodInterface $payment_method
  * @param string $operation
+ * @param string $payment_method_brand
+ *   See \Drupal\payment\PaymentProcessingInterface for the available brands.
  *
  * @return boolean
  *   Whether the operation can be performed on the payment.
  */
-function hook_payment_operation_access(PaymentInterface $payment, PaymentMethodInterface $payment_method, $operation) {}
+function hook_payment_operation_access(PaymentInterface $payment, PaymentMethodInterface $payment_method, $operation, $payment_method_brand) {}
 
 /**
  * Executes before a payment method operation is performed on a payment.
@@ -107,5 +109,7 @@ function hook_payment_operation_access(PaymentInterface $payment, PaymentMethodI
  *
  * @param \Drupal\payment\Plugin\Core\Entity\PaymentInterface $payment
  * @param string $operation
+ * @param string $payment_method_brand
+ *   See \Drupal\payment\PaymentProcessingInterface for the available brands.
  */
-function hook_payment_pre_operation(PaymentInterface $payment, $operation) {}
+function hook_payment_pre_operation(PaymentInterface $payment, $operation, $payment_method_brand) {}
