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..06afcde 100644
--- a/payment/lib/Drupal/payment/Plugin/payment/method/Base.php
+++ b/payment/lib/Drupal/payment/Plugin/payment/method/Base.php
@@ -151,14 +151,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 +167,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 +195,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;
       }
diff --git a/payment/lib/Drupal/payment/Plugin/payment/method/Basic.php b/payment/lib/Drupal/payment/Plugin/payment/method/Basic.php
index 32c1629..c73ea5c 100644
--- a/payment/lib/Drupal/payment/Plugin/payment/method/Basic.php
+++ b/payment/lib/Drupal/payment/Plugin/payment/method/Basic.php
@@ -34,6 +34,7 @@ class Basic extends Base {
    */
   public function __construct(array $configuration, $plugin_id, array $plugin_definition) {
     $configuration += array(
+      'brandOption' => '',
       'status' => '',
     );
     parent::__construct($configuration, $plugin_id, $plugin_definition);
@@ -75,8 +76,15 @@ class Basic extends Base {
    */
   public function paymentMethodFormElements(array $form, array &$form_state) {
     $elements = parent::paymentMethodFormElements($form, $form_state);
+    $elements['#element_validate'][] = array($this, 'paymentMethodFormElementsValidateBasic');
+
+    $elements['brand'] = array(
+      '#default_value' => $this->configuration['brandOption'],
+      '#description' => t('The label that payers will see when choosing a payment method. Defaults to the payment method label.'),
+      '#title' => t('Brand label'),
+      '#type' => 'textfield',
+    );
     $elements['status'] = array(
-      '#element_validate' => array(array($this, 'paymentMethodFormElementsValidateStatus')),
       '#type' => 'select',
       '#title' => t('Final payment status'),
       '#description' => t('The status to give a payment after being processed by this payment method.'),
@@ -90,23 +98,24 @@ class Basic extends Base {
   /**
    * Implements form validate callback for self::paymentMethodFormElements().
    */
-  public function paymentMethodFormElementsValidateStatus(array $element, array &$form_state, array $form) {
-    $status = NestedArray::getValue($form_state['values'], $element['#parents']);
-    $this->setStatus($status);
+  public function paymentMethodFormElementsValidateBasic(array $element, array &$form_state, array $form) {
+    $values = NestedArray::getValue($form_state['values'], $element['#parents']);
+    $this->setStatus($values['status'])
+      ->setBrandOption($values['brand']);
   }
 
   /**
    * {@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,11 +123,33 @@ 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()));
       }
     }
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function brandOptions() {
+    return array(
+      'default' => $this->configuration['brandOption'] ? $this->configuration['brandOption'] : $this->getPaymentMethod()->label(),
+    );
+  }
+
+  /**
+   * Sets the brand option label.
+   *
+   * @param string $label
+   *
+   * @return \Drupal\payment\Plugin\payment\method\PaymentMethodInterface
+   */
+  public function setBrandOption($label) {
+    $this->configuration['brandOption'] = $label;
+
+    return $this;
+  }
 }
diff --git a/payment/lib/Drupal/payment/Plugin/payment/method/Unavailable.php b/payment/lib/Drupal/payment/Plugin/payment/method/Unavailable.php
index d7ca7ad..658636c 100644
--- a/payment/lib/Drupal/payment/Plugin/payment/method/Unavailable.php
+++ b/payment/lib/Drupal/payment/Plugin/payment/method/Unavailable.php
@@ -61,14 +61,14 @@ class Unavailable extends PluginBase implements PaymentMethodInterface {
   /**
    * {@inheritdoc}
    */
-  function paymentOperationAccess(PaymentInterface $payment, $operation) {
+  function paymentOperationAccess(PaymentInterface $payment, $operation, $payment_method_brand) {
     return FALSE;
   }
 
   /**
    * {@inheritdoc}
    */
-  function executePaymentOperation(PaymentInterface $payment, $operation) {
+  function executePaymentOperation(PaymentInterface $payment, $operation, $payment_method_brand) {
   }
 
   /**
@@ -91,4 +91,11 @@ class Unavailable extends PluginBase implements PaymentMethodInterface {
   public function paymentMethodFormElements(array $form, array &$form_state) {
     return array();
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function brandOptions() {
+    return array();
+  }
 }
diff --git a/payment/lib/Drupal/payment/Tests/PaymentMethodUI.php b/payment/lib/Drupal/payment/Tests/PaymentMethodUI.php
index 1a62c42..1bf2b53 100644
--- a/payment/lib/Drupal/payment/Tests/PaymentMethodUI.php
+++ b/payment/lib/Drupal/payment/Tests/PaymentMethodUI.php
@@ -137,17 +137,22 @@ class PaymentMethodUI extends WebTestBase {
     $this->assertFieldByXPath('//input[@id="edit-owner" and contains(@class, "error")]');
 
     // Test form submission and payment method creation.
-    $label = 'foo';
-    $id = 'bar';
+    $label = $this->randomString();;
+    $brand_option = $this->randomString();
+    $id = strtolower($this->randomName());
     $this->drupalPost(NULL, array(
       'label' => $label,
       'id' => $id,
       'owner' => $user->label(),
+      'plugin_form[brand]' => $brand_option,
     ), t('Save'));
     $payment_method = entity_load('payment_method', $id);
     $this->assertTrue((bool) $payment_method);
     $this->assertEqual($payment_method->label(), $label);
     $this->assertEqual($payment_method->id(), $id);
     $this->assertEqual($payment_method->getOwnerId(), $user->id());
+    $this->assertEqual($payment_method->brandOptions(), array(
+      'default' => $brand_option,
+    ));
   }
 }
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..7f580e9 100644
--- a/payment/lib/Drupal/payment/Tests/Plugin/payment/method/BasicTest.php
+++ b/payment/lib/Drupal/payment/Tests/Plugin/payment/method/BasicTest.php
@@ -32,7 +32,7 @@ class BasicTest extends WebtestBase {
    */
   function setUp() {
     parent::setUp();
-    $this->methodEntity= entity_create('payment_method', array());
+    $this->methodEntity = entity_create('payment_method', array());
     $this->method = \Drupal::service('plugin.manager.payment.payment_method')->createInstance('payment_basic');
     $this->method->setPaymentMethod($this->methodEntity);
   }
@@ -41,10 +41,12 @@ 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')
+      ->setBrandOption('Foo');
     $this->assertEqual($this->method->getConfiguration(), array(
+      'brandOption' => 'Foo',
       'messageText' => 'foo',
       'messageTextFormat' => 'bar',
       'status' => 'baz',
@@ -88,6 +90,20 @@ class BasicTest extends WebtestBase {
   }
 
   /**
+   * Tests setBrandOption() and brandOptions().
+   */
+  function testBrandOptions() {
+    $this->assertIdentical($this->method->brandOptions(), array(
+      'default' => $this->methodEntity->label(),
+    ));
+    $label = $this->randomName();
+    $this->assertTrue($this->method->setbrandOption($label) instanceof PaymentMethodInterface);
+    $this->assertIdentical($this->method->brandOptions(), array(
+      'default' => $label,
+    ));
+  }
+
+  /**
    * Tests paymentFormElements().
    */
   function testPaymentFormElements() {
@@ -115,8 +131,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 +142,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/lib/Drupal/payment/Tests/UpgradePathWithContent.php b/payment/lib/Drupal/payment/Tests/UpgradePathWithContent.php
index bbf9d80..49e6051 100644
--- a/payment/lib/Drupal/payment/Tests/UpgradePathWithContent.php
+++ b/payment/lib/Drupal/payment/Tests/UpgradePathWithContent.php
@@ -59,6 +59,10 @@ class UpgradePathWithContent extends UpgradePathTestBase {
       $this->assertTrue(is_string($payment_method->label()));
       $this->assertTrue(is_int($payment_method->getOwnerId()));
       $this->assertTrue($payment_method->getPlugin() instanceof PluginPaymentMethodInterface);
+      if ($payment_method->getPlugin()->getPluginId() == 'payment_basic') {
+        $brand_options = $payment_method->brandOptions();
+        $this->assertTrue(strlen(reset($brand_options)));
+      }
     }
   }
 }
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) {}
diff --git a/payment/payment.install b/payment/payment.install
index 5b79495..3def1f3 100644
--- a/payment/payment.install
+++ b/payment/payment.install
@@ -519,15 +519,20 @@ function payment_update_8203(array &$sandbox) {
   $uuid = new Uuid();
   foreach ($payment_methods_data as $payment_method_data) {
     $plugin_id = isset($map[$payment_method_data->controller_class_name]) ? $map[$payment_method_data->controller_class_name] : '';
-    \Drupal::config('payment.payment_method.' . $payment_method_data->name)
-      ->set('id', $payment_method_data->name)
+    $config = \Drupal::config('payment.payment_method.' . $payment_method_data->name);
+    $config->set('id', $payment_method_data->name)
       ->set('label', $payment_method_data->title_specific)
       ->set('ownerId', $payment_method_data->uid)
       ->set('pluginConfiguration', array())
       ->set('pluginId', $plugin_id)
       ->set('status', $payment_method_data->enabled)
-      ->set('uuid', $uuid->generate())
-      ->save();
+      ->set('uuid', $uuid->generate());
+    if ($plugin_id == 'payment_basic') {
+      $config->set('pluginConfiguration', array(
+        'brandOption' => $payment_method_data->title_generic,
+      ));
+    }
+    $config->save();
   }
   db_drop_table('payment_method');
 }
