diff --git a/commerce_shipping.libraries.yml b/commerce_shipping.libraries.yml
new file mode 100644
index 0000000..23c7b3c
--- /dev/null
+++ b/commerce_shipping.libraries.yml
@@ -0,0 +1,8 @@
+copy_from_shipping:
+  version: VERSION
+  js:
+    js/commerce_shipping.copy_from_shipping.js: {}
+  dependencies:
+    - core/jquery
+    - core/drupal
+    - core/jquery.once
\ No newline at end of file
diff --git a/commerce_shipping.module b/commerce_shipping.module
index ebb2f4b..8d8231c 100644
--- a/commerce_shipping.module
+++ b/commerce_shipping.module
@@ -56,6 +56,58 @@ function commerce_shipping_commerce_order_delete(OrderInterface $order) {
   }
 }
 
+function commerce_shipping_form_commerce_checkout_flow_alter(array &$form, FormStateInterface $form_state) {
+  if (isset($form['payment_information']['add_payment_method'])) {
+    $form['payment_information']['copy_from_shipping'] = [
+      '#type' => 'checkbox',
+      '#title' => t('My billing address is the same as my shipping address'),
+      '#default_value' => TRUE,
+      '#weight' => 0,
+      '#attached' => [
+        'library' => [
+          'commerce_shipping/copy_from_shipping'
+        ]
+      ]
+    ];
+    $form['payment_information']['add_payment_method']['#weight'] = 5;
+    $form['payment_information']['add_payment_method']['#after_build'][] = 'commerce_shipping_process_payment_method_element';
+
+    array_unshift($form['actions']['next']['#submit'], 'commerce_shipping_submit_payment_method');
+  }
+}
+
+function commerce_shipping_process_payment_method_element(array $element, FormStateInterface $form_state) {
+  $trigger_element = ':input[name="payment_information[copy_from_shipping]"]';
+
+  if (isset($element['billing_information'])) {
+    $element['billing_information']['#states']['visible'] = [
+      $trigger_element => ['checked' => FALSE,],
+    ];
+  }
+
+  /** @var \Drupal\profile\Entity\ProfileInterface $profile */
+  $profile = $element['billing_information']['#profile'];
+
+  foreach ($profile->getFieldDefinitions() as $field_definition) {
+    if ($field_definition->isRequired() && isset($element['billing_information'][$field_definition->getName()])) {
+      $element['billing_information'][$field_definition->getName()]['#states']['required'] = [
+        $trigger_element => ['checked' => FALSE,],
+      ];
+    }
+  }
+
+  return $element;
+}
+
+function commerce_shipping_submit_payment_method(array &$form, FormStateInterface $form_state) {
+  $values = $form_state->getValue('payment_information');
+
+  if (!empty($values['copy_from_shipping']) && isset($form['shipping_information']['shipping_profile']['#profile'])) {
+    $profile = $form['shipping_information']['shipping_profile']['#profile'];
+    $form['payment_information']['add_payment_method']['billing_information']['#profile'] = $profile;
+  }
+}
+
 /**
  * Implements hook_form_FORM_ID_alter() for 'commerce_order_type_form'.
  */
diff --git a/js/commerce_shipping.copy_from_shipping.js b/js/commerce_shipping.copy_from_shipping.js
new file mode 100644
index 0000000..a5ee2e9
--- /dev/null
+++ b/js/commerce_shipping.copy_from_shipping.js
@@ -0,0 +1,58 @@
+/**
+ * @file
+ * Defines behaviors for the Braintree payment method form.
+ */
+
+(function ($, Drupal, drupalSettings) {
+
+  var $copyFromShipping = $('input[name="payment_information[copy_from_shipping]"]');
+  var $shippingProfileWrapper = $('#edit-shipping-information-shipping-profile');
+  var $submitButton = $('#edit-actions-next');
+
+  'use strict';
+
+  /**
+   * Attaches the commerceShippingCopyFromShipping behavior.
+   *
+   * @type {Drupal~behavior}
+   *
+   * @prop {Drupal~behaviorAttach} attach
+   *   Attaches the commerceShippingCopyFromShipping behavior.
+   */
+  Drupal.behaviors.commerceShippingCopyFromShipping = {
+    attach: (context, settings) => {
+      init(context);
+    }
+  };
+
+  function init(context) {
+    if($copyFromShipping.length) {
+      $copyFromShipping.bind('change', handleCopyChange);
+      $submitButton.bind('click', handleCopyChange);
+      handleCopyChange();
+    }
+  }
+
+  function handleCopyChange() {
+    if($copyFromShipping.is(':checked')) {
+      var $shippingInputs = $shippingProfileWrapper.find('input, select');
+      $shippingInputs.each((index, value) => {
+        copyShippingInputValue($(value))
+      });
+    }
+  }
+
+  function copyShippingInputValue($shippingInput) {
+    var shippingName = $shippingInput.attr('name');
+    if(shippingName) {
+      var billingName = shippingName.replace('shipping_information[shipping_profile][address][0][address]', 'payment_information[add_payment_method][billing_information][address][0][address]');
+      var $billingInput = $('[name="' + billingName + '"]');
+      if($billingInput.length) {
+        var value = $shippingInput.val();
+        console.log(value);
+        $billingInput.val(value);
+      }
+    }
+  }
+
+})(jQuery, Drupal, drupalSettings);
