diff --git a/commerce_braintree.install b/commerce_braintree.install
index cdb61fa..da5c074 100644
--- a/commerce_braintree.install
+++ b/commerce_braintree.install
@@ -5,6 +5,8 @@
  * Contains install and update functions for Commerce Braintree.
  */
 
+use Drupal\Core\Field\BaseFieldDefinition;
+
 /**
  * Implements hook_requirements().
  */
@@ -36,3 +38,16 @@ function commerce_braintree_update_8001() {
     $gateway->save();
   }
 }
+
+/**
+ * Add payment_method_reusable field to commerce_order entity.
+ */
+function commerce_braintree_update_8002() {
+  $storage_definition = BaseFieldDefinition::create('entity_reference')
+    ->setLabel(t('Reusable payment method'))
+    ->setDescription(t('The payment method that should be used if payment ever needs to be made again.'))
+    ->setSetting('target_type', 'commerce_payment_method');
+
+  \Drupal::entityDefinitionUpdateManager()
+    ->installFieldStorageDefinition('payment_method_reusable', 'commerce_order', 'commerce_order', $storage_definition);
+}
diff --git a/commerce_braintree.module b/commerce_braintree.module
new file mode 100644
index 0000000..ddaba19
--- /dev/null
+++ b/commerce_braintree.module
@@ -0,0 +1,18 @@
+<?php
+
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Field\BaseFieldDefinition;
+
+/**
+ * Implements hook_entity_base_field_info().
+ */
+function commerce_braintree_entity_base_field_info(EntityTypeInterface $entity_type) {
+  if ($entity_type->id() === 'commerce_order') {
+    $fields['payment_method_reusable'] = BaseFieldDefinition::create('entity_reference')
+      ->setLabel(t('Reusable payment method'))
+      ->setDescription(t('The payment method that should be used if payment ever needs to be made again.'))
+      ->setSetting('target_type', 'commerce_payment_method');
+
+    return $fields;
+  }
+}
diff --git a/src/Plugin/Commerce/CheckoutPane/Braintree3DSReview.php b/src/Plugin/Commerce/CheckoutPane/Braintree3DSReview.php
index c6cddc3..902bde8 100644
--- a/src/Plugin/Commerce/CheckoutPane/Braintree3DSReview.php
+++ b/src/Plugin/Commerce/CheckoutPane/Braintree3DSReview.php
@@ -99,10 +99,11 @@ class Braintree3DSReview extends CheckoutPaneBase {
     try {
       $result = $braintree_plugin->createPaymentMethodNonce($payment_method->getRemoteId());
 
+      $balance = $this->order->getBalance();
       $pane_form['#attached']['library'][] = 'commerce_braintree/checkout-review';
-      $amount = Calculator::trim($this->order->getBalance()->getNumber());
+      $amount = Calculator::trim($balance->getNumber());
       $pane_form['#attached']['drupalSettings']['commerceBraintree'] = [
-        'clientToken' => $braintree_plugin->generateClientToken(),
+        'clientToken' => $braintree_plugin->generateClientToken($balance->getCurrencyCode()),
         'formId' => 'braintree-form',
         'amount' => $amount,
         'nonce' => $result->paymentMethodNonce->nonce,
@@ -187,7 +188,10 @@ class Braintree3DSReview extends CheckoutPaneBase {
     $three_d_payment_method->setRemoteId($values['payment_method_nonce']);
     $three_d_payment_method->setReusable(FALSE);
     $three_d_payment_method->save();
-    $this->order->set('payment_method', $payment_method);
+    $this->order->set('payment_method', $three_d_payment_method);
+    // We will need to change the payment method back after payment so that
+    // recurring orders or failed payments won't use the nonce.
+    $this->order->set('payment_method_reusable', $payment_method);
   }
 
   /**
diff --git a/src/Plugin/Commerce/PaymentGateway/HostedFields.php b/src/Plugin/Commerce/PaymentGateway/HostedFields.php
index 9f00420..bf5fdb2 100644
--- a/src/Plugin/Commerce/PaymentGateway/HostedFields.php
+++ b/src/Plugin/Commerce/PaymentGateway/HostedFields.php
@@ -197,8 +197,12 @@ class HostedFields extends OnsitePaymentGatewayBase implements HostedFieldsInter
   /**
    * {@inheritdoc}
    */
-  public function generateClientToken() {
-    return $this->api->clientToken()->generate();
+  public function generateClientToken($currency_code = '') {
+    $params = [];
+    if ($currency_code) {
+      $params['merchantAccountId'] = $this->configuration['merchant_account_id'][$currency_code];
+    }
+    return $this->api->clientToken()->generate($params);
   }
 
   /**
@@ -229,6 +233,12 @@ class HostedFields extends OnsitePaymentGatewayBase implements HostedFieldsInter
     }
     else {
       $transaction_data['paymentMethodNonce'] = $payment_method->getRemoteId();
+      $order = $payment->getOrder();
+      $reusable_payment_method = $order->get('payment_method_reusable')->entity;
+      if ($reusable_payment_method instanceof PaymentMethodInterface) {
+        $order->set('payment_method', $reusable_payment_method);
+        $order->save();
+      }
     }
 
     // Add metadata and extra transaction data where required.
diff --git a/src/Plugin/Commerce/PaymentGateway/HostedFieldsInterface.php b/src/Plugin/Commerce/PaymentGateway/HostedFieldsInterface.php
index 71fc834..45a6f26 100644
--- a/src/Plugin/Commerce/PaymentGateway/HostedFieldsInterface.php
+++ b/src/Plugin/Commerce/PaymentGateway/HostedFieldsInterface.php
@@ -36,9 +36,12 @@ interface HostedFieldsInterface extends OnsitePaymentGatewayInterface, SupportsA
    *
    * Used by the add-payment-method plugin form and review checkout pane.
    *
+   * @param string $currency_code
+   *   Currency code e.g. 'USD'.
+   *
    * @return string
    *   The client token.
    */
-  public function generateClientToken();
+  public function generateClientToken($currency_code);
 
 }
