diff --git a/payment/lib/Drupal/payment/Plugin/Core/Entity/PaymentMethod.php b/payment/lib/Drupal/payment/Plugin/Core/Entity/PaymentMethod.php
index 344424c..9855c1a 100644
--- a/payment/lib/Drupal/payment/Plugin/Core/Entity/PaymentMethod.php
+++ b/payment/lib/Drupal/payment/Plugin/Core/Entity/PaymentMethod.php
@@ -31,6 +31,7 @@ use Drupal\payment\Plugin\Core\Entity\PaymentMethodInterface;
  *   },
  *   entity_keys = {
  *     "id" = "id",
+ *     "bundle" = "pluginId",
  *     "label" = "label",
  *     "uuid" = "uuid",
  *     "status" = "status"
@@ -84,6 +85,24 @@ class PaymentMethod extends ConfigEntityBase implements PaymentMethodInterface {
   public $uuid;
 
   /**
+   * Implements __get().
+   */
+  public function __get($name) {
+    if ($name == 'pluginId' && $this->getPlugin()) {
+      return $this->getPlugin()->getPluginId();
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function bundle() {
+    if ($this->getPlugin()) {
+      return $this->getPlugin()->getPluginId();
+    }
+  }
+
+  /**
    * {@inheritdoc}
    *
    * @see \Drupal\payment\PaymentMethodStorageController
@@ -104,6 +123,7 @@ class PaymentMethod extends ConfigEntityBase implements PaymentMethodInterface {
    */
   public function setPlugin(PluginPaymentMethodInterface $plugin) {
     $this->plugin = $plugin;
+    $this->pluginId = $plugin->getPluginId();
 
     return $this;
   }
diff --git a/payment/lib/Drupal/payment/Plugin/Core/Entity/PaymentMethodAccessController.php b/payment/lib/Drupal/payment/Plugin/Core/Entity/PaymentMethodAccessController.php
index c640824..730582f 100644
--- a/payment/lib/Drupal/payment/Plugin/Core/Entity/PaymentMethodAccessController.php
+++ b/payment/lib/Drupal/payment/Plugin/Core/Entity/PaymentMethodAccessController.php
@@ -20,10 +20,7 @@ class PaymentMethodAccessController extends EntityAccessController {
    * {@inheritdoc}
    */
   protected function checkAccess(EntityInterface $entity, $operation, $langcode, AccountInterface $account) {
-    if ($operation == 'create') {
-      return $entity->getPlugin() && user_access('payment.payment_method.create.' . $entity->getPlugin()->getPluginId(), $account);
-    }
-    elseif ($operation == 'enable') {
+    if ($operation == 'enable') {
       return !$entity->status() && $entity->access('update', $account);
     }
     elseif ($operation == 'disable') {
@@ -37,4 +34,26 @@ class PaymentMethodAccessController extends EntityAccessController {
       return user_access($permission . '.any', $account) || user_access($permission . '.own', $account) && $entity->getOwnerId() == $account->id();
     }
   }
+
+  /**
+   * Performs create access checks.
+   *
+   * This method is supposed to be overwritten by extending classes that
+   * do their own custom access checking.
+   *
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   The user for which to check access.
+   * @param array $context
+   *   An array of key-value pairs to pass additional context when needed.
+   * @param string|null $entity_bundle
+   *   (optional) The bundle of the entity. Required if the entity supports
+   *   bundles, defaults to NULL otherwise.
+   *
+   * @return bool|null
+   *   TRUE if access was granted, FALSE if access was denied and NULL if access
+   *   could not be determined.
+   */
+  protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) {
+    return user_access('payment.payment_method.create.' . $entity_bundle, $account);
+  }
 }
diff --git a/payment/lib/Drupal/payment/Tests/PaymentMethodUI.php b/payment/lib/Drupal/payment/Tests/PaymentMethodUI.php
index 1bf2b53..827a132 100644
--- a/payment/lib/Drupal/payment/Tests/PaymentMethodUI.php
+++ b/payment/lib/Drupal/payment/Tests/PaymentMethodUI.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\payment\Tests;
 
+use Drupal\payment\Plugin\Core\Entity\PaymentMethodInterface;
 use Drupal\simpletest\WebTestBase ;
 
 /**
@@ -79,7 +80,7 @@ class PaymentMethodUI extends WebTestBase {
     $this->drupalGet('admin/config/services/payment/method');
     $this->clickLink(t('Duplicate'));
     $this->assertResponse(200);
-    $this->assertFieldByXPath('//form[@id="payment-method-form"]');
+    $this->assertFieldByXPath('//form[@id="payment-basic-payment-method-form"]');
   }
 
   /**
@@ -126,7 +127,7 @@ class PaymentMethodUI extends WebTestBase {
     $this->drupalLogin($user);
     $this->drupalGet('admin/config/services/payment/method-add/' . $plugin_id);
     $this->assertResponse(200);
-    $this->assertFieldByXPath('//form[@id="payment-method-form"]');
+    $this->assertFieldByXPath('//form[@id="payment-basic-payment-method-form"]');
 
     // Test form validation.
     $this->drupalPost(NULL, array(
@@ -147,12 +148,13 @@ class PaymentMethodUI extends WebTestBase {
       '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,
-    ));
+    if ($this->assertTrue($payment_method instanceof PaymentMethodInterface)) {
+      $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,
+      ));
+    }
   }
 }
