diff --git a/commerce_addressbook.module b/commerce_addressbook.module
index d1ff952..4fada88 100644
--- a/commerce_addressbook.module
+++ b/commerce_addressbook.module
@@ -31,6 +31,19 @@ function commerce_addressbook_hook_info() {
 }
 
 /**
+ * Implementation of hook_permission().
+ */
+function commerce_addressbook_permission() {
+  return array(
+    'use any address' => array(
+      'title' => t('Use any addressbook address'),
+      'description' => t('Allows the user to use any saved address from any user within the site.'),
+      'restrict access' => TRUE,
+    ),
+  );
+}
+
+/**
  * Implements hook_menu().
  */
 function commerce_addressbook_menu() {
@@ -270,7 +283,6 @@ function commerce_addressbook_forms() {
  */
 function commerce_addressbook_form_alter(&$form, &$form_state, $form_id) {
   global $user;
-
   // If we're dealing with a commerce checkout form.
   if (strpos($form_id, 'commerce_checkout_form_') === 0 && $user->uid > 0) {
     $checkout_page_id = substr($form_id, 23);
@@ -280,8 +292,36 @@ function commerce_addressbook_form_alter(&$form, &$form_state, $form_id) {
       // profiles from which to pick that are of the same bundle.
       if ($checkout_pane['base'] == 'commerce_customer_profile_pane' && isset($form[$pane_id]) && variable_get('commerce_' . $pane_id . '_addressbook', FALSE)) {
         $field = field_info_field(variable_get('commerce_' . $pane_id . '_field', ''));
-        $profiles = commerce_customer_profile_load_multiple(array(), array('type' => $field['settings']['profile_type'], 'uid' => $user->uid, 'status' => TRUE));
 
+        $form[$pane_id]['#prefix'] = '<div id="' . strtr($pane_id, '_', '-') . '-ajax-wrapper">';
+        $form[$pane_id]['#suffix'] = '</div>';
+
+        // Check if the user can access all addresses
+        if (user_access('use any address')) {
+          $form[$pane_id]['addressbook_user'] = array(
+            '#type' => 'textfield',
+            '#autocomplete_path' => 'user/autocomplete',
+            '#title' => t('User address lookup'),
+            '#description' => t('You can search for a user to select an address to use'),
+            '#ajax' => array(
+              'callback' => 'commerce_addressbook_checkout_form_callback',
+              'wrapper' => strtr($pane_id, '_', '-') . '-ajax-wrapper',
+            ),
+            '#weight' => -101,
+            '#default_value' => isset($form_state['values']['customer_profile_billing']['addressbook_user']) ? $form_state['values']['customer_profile_billing']['addressbook_user'] : '', // TODO: Check for form state value
+          );
+        }
+        $profiles = FALSE;
+        if (user_access('use any address') && isset($form_state['values']['customer_profile_billing']['addressbook_user'])) {
+          $account = user_load_by_name(check_plain($form_state['values']['customer_profile_billing']['addressbook_user']));
+          $profiles = commerce_customer_profile_load_multiple(array(), array('type' => $field['settings']['profile_type'], 'uid' => $account->uid, 'status' => TRUE));
+          if (empty($profiles)) {
+            $form[$pane_id]['addressbook_user']['#suffix'] = '<p>' . t('The user chosen does not have any stored addresses.') . '</p>';
+          }
+        }
+        elseif (!user_access('use any address')) {
+          $profiles = commerce_customer_profile_load_multiple(array(), array('type' => $field['settings']['profile_type'], 'uid' => $user->uid, 'status' => TRUE));
+        }
         if ($profiles) {
           // Prepare the options.
           $options = array();
@@ -326,8 +366,6 @@ function commerce_addressbook_form_alter(&$form, &$form_state, $form_id) {
             }
           }
 
-          $form[$pane_id]['#prefix'] = '<div id="' . strtr($pane_id, '_', '-') . '-ajax-wrapper">';
-          $form[$pane_id]['#suffix'] = '</div>';
           $form[$pane_id]['addressbook_entries'] = array(
             '#type' => 'value',
             '#value' => $profiles,
@@ -415,8 +453,8 @@ function commerce_addressbook_saved_addresses_validate($element, &$form_state, $
     if (is_numeric($element['#value'])) {
       global $user;
       $profile = commerce_customer_profile_load($element['#value']);
-      // Validate that the profile being selected is owned by this user.
-      if ($profile->uid != $user->uid) {
+      // Validate that the profile being selected is owned by this user, or the user has permission to use it.
+      if ($profile->uid != $user->uid && !user_access('use any address')) {
         drupal_set_message(t('You must own the profile you are choosing.'), 'error');
         return;
       }
