diff --git a/modules/customer/commerce_customer.module b/modules/customer/commerce_customer.module
index b52c256..d4a47f3 100644
--- a/modules/customer/commerce_customer.module
+++ b/modules/customer/commerce_customer.module
@@ -588,6 +588,38 @@ function commerce_customer_profile_query_commerce_customer_profile_access_alter(
 }
 
 /**
+ * After build callback for fields that can be synced with other fields.
+ * After the form is submitted, the #element_validate callback hasn't yet
+ * had the chance to sync the values, which is why validation fails.
+ */
+function commerce_customer_profile_pane_after_build($element, &$form_state) {
+  // @todo Is there a better way of knowing if the form was submitted?
+  if (!empty($form_state['input'])) {
+    _commerce_customer_profile_pane_strip_validation($element);
+  }
+  return $element;
+}
+
+/**
+ * Recursively strips validation from the passed element.
+ */
+function _commerce_customer_profile_pane_strip_validation(&$element) {
+  $element['#required'] = FALSE;
+
+  foreach (element_children($element) as $child_key) {
+    _commerce_customer_profile_pane_strip_validation($element[$child_key]);
+  }
+}
+
+/**
+ * #element_validate callback. Syncs field values with a field from another pane.
+ */
+function commerce_customer_profile_pane_element_validate($element, &$form_state) {
+  $field_name = end($element['#parents']);
+  form_set_value($element, $form_state['values'][$element['#source_pane']][$field_name], $form_state);
+}
+
+/**
  * Ensures the address field is present on the specified customer profile bundle.
  */
 function commerce_customer_configure_customer_profile_type($profile_type) {
diff --git a/modules/customer/includes/commerce_customer.checkout_pane.inc b/modules/customer/includes/commerce_customer.checkout_pane.inc
index 20cca56..8a9a508 100644
--- a/modules/customer/includes/commerce_customer.checkout_pane.inc
+++ b/modules/customer/includes/commerce_customer.checkout_pane.inc
@@ -34,6 +34,33 @@ function commerce_customer_profile_pane_settings_form($checkout_pane) {
     '#default_value' => variable_get('commerce_' . $checkout_pane['pane_id'] . '_field', ''),
   );
 
+  // Build a list of other checkout panes present on the same page.
+  $panes = array();
+  foreach (commerce_checkout_panes(array('enabled' => TRUE, 'page' => $checkout_pane['page'])) as $pane_id => $pane) {
+    if (strpos($pane['pane_id'], 'customer_profile_') !== FALSE && $checkout_pane['pane_id'] != $pane_id) {
+      $panes[$pane_id] = $pane['title'];
+    }
+  }
+
+  $form['commerce_' . $checkout_pane['pane_id'] . '_enable_sync'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Provide a way to get values from another checkout pane'),
+    '#description' => t('Allows the user to specify that the values in this checkout pane should be the same as the values in another checkout pane.'),
+    '#default_value' => variable_get('commerce_' . $checkout_pane['pane_id'] . '_enable_sync', FALSE),
+  );
+  $form['commerce_' . $checkout_pane['pane_id'] . '_sync'] = array(
+    '#type' => 'select',
+    '#title' => t('The checkout pane used as the source of values'),
+    '#options' => $panes,
+    '#default_value' => variable_get('commerce_' . $checkout_pane['pane_id'] . '_sync', ''),
+    '#states' => array(
+      'visible' => array(
+        ':input[name="commerce_' . $checkout_pane['pane_id'] . '_enable_sync"]' => array('checked' => TRUE),
+      ),
+    ),
+  );
+
+
   return $form;
 }
 
@@ -80,6 +107,34 @@ function commerce_customer_profile_pane_checkout_form($form, &$form_state, $chec
   // Add the field widgets for the profile.
   field_attach_form('commerce_customer_profile', $profile, $pane_form, $form_state);
 
+  // Provide a way for the user to reuse values from another checkout pane,
+  // for common fields such as the addressfield.
+  $enable_sync = variable_get('commerce_' . $checkout_pane['pane_id'] . '_enable_sync', '');
+  if ($enable_sync) {
+    $sync = variable_get('commerce_' . $checkout_pane['pane_id'] . '_sync', '');
+    $source_pane = commerce_checkout_panes(array('pane_id' => $sync));
+    $source_pane = $source_pane[$sync];
+    $source_type = substr($source_pane['pane_id'], 17);
+
+    // @todo Find a way of knowing if this was checked. $order->data perhaps?
+    $pane_form['sync'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Use %pane', array('%pane' => $source_pane['title'])),
+      '#weight' => -100,
+    );
+
+    $source_fields = field_info_instances('commerce_customer_profile', $source_type);
+    $target_fields = field_info_instances('commerce_customer_profile', $type);
+    $common_fields = array_intersect($source_fields, $target_fields);
+
+    foreach ($common_fields as $field_name => $field) {
+      $name = $checkout_pane['pane_id'] . '[sync]';
+      $pane_form[$field_name]['#states']['visible'] = array(':input[name="' . $name . '"]' => array('checked' => FALSE));
+      $pane_form[$field_name]['#after_build'] = array('commerce_customer_profile_pane_after_build');
+      $pane_form[$field_name]['#element_validate'] = array('commerce_customer_profile_pane_element_validate');
+    }
+  }
+
   // Tweak the form to remove the fieldset from the address field if there
   // is only one on this profile.
   $addressfields = array();
