diff --git a/uc_addresses.css b/uc_addresses.css
index 1af82a3..a836aa3 100644
--- a/uc_addresses.css
+++ b/uc_addresses.css
@@ -95,3 +95,20 @@
   display: inline;
 }
 /* @end */
+
+/* @group Order admin */
+form input.uc-addresses-button {
+  width : 20px;
+  height :16px;
+  border : none;
+  color : transparent;
+  font-size : 0;
+  padding: 5px;
+}
+form input.uc-addresses-select-address-button {
+  background : url("images/address_book.gif") no-repeat center center;
+}
+form input.uc-addresses-copy-button {
+  background : url("images/copy.gif") no-repeat center center;
+}
+/* @end */
diff --git a/uc_addresses.module b/uc_addresses.module
index 9818d7d..180747a 100644
--- a/uc_addresses.module
+++ b/uc_addresses.module
@@ -376,6 +376,19 @@ function uc_addresses_element_info() {
     '#hidden' => FALSE,
   );
 
+  $types['uc_addresses_select'] = array(
+    '#input' => TRUE,
+    '#multiple' => FALSE,
+    '#tree' => TRUE,
+    '#process' => array('uc_addresses_form_process_select_address', 'form_process_select', 'ajax_process_form'),
+    '#uc_addresses_select_addresses' => array(),
+    '#uc_addresses_address_element' => array(),
+    '#uc_addresses_address_input' => array(),
+    '#theme' => 'select',
+    '#theme_wrappers' => array('form_element'),
+    '#default_value' => NULL,
+  );
+
   return $types;
 }
 
@@ -632,6 +645,99 @@ function uc_addresses_address_field_weights() {
   return variable_get('uc_address_fields_weight', array('first_name' => 0, 'last_name' => 1, 'company' => 2, 'street1' => 3, 'street2' => 4, 'city' => 5, 'zone' => 6, 'country' => 7, 'postal_code' => 8, 'phone' => 9, 'address_name' => 10, 'default_shipping' => 11, 'default_billing' => 12));
 }
 
+/**
+ * Element process hook for an selectable address field.
+ *
+ * @param array $element
+ * @param array $form_state
+ *
+ * @return array
+ */
+function uc_addresses_form_process_select_address(&$element, &$form_state) {
+  if (count($element['#uc_addresses_select_addresses']) < 1) {
+    // Return NULL if there are no addresses.
+    return NULL;
+  }
+
+  // Initialize default value, we don't know yet which address in the list is
+  // equal to the given default value.
+  $address_book_default_value = NULL;
+
+  $options = array(
+    '' => t('Select one...'),
+  );
+  $addresses = array_values($element['#uc_addresses_select_addresses']);
+  foreach ($addresses as $key => $address) {
+    if ($address_name = $address->getName()) {
+      $options[$key] = $address_name;
+    }
+    else {
+      $options[$key] = preg_replace('/<.*?>/', ', ', trim(uc_addresses_format_address($address)));
+    }
+
+    // Check if this address is equal to given default value
+    if ($element['#default_value'] instanceof UcAddressesSchemaAddress && !$address_book_default_value) {
+      if ($address->compareAddress($element['#default_value'])) {
+        // Default value found! Save it for later.
+        $address_book_default_value = $key;
+      }
+    }
+  }
+
+  $element['#options'] = $options;
+
+  // Add default value if found.
+  if ($address_book_default_value) {
+    $element['#default_value'] = $address_book_default_value;
+  }
+  else {
+    unset($element['#default_value']);
+  }
+
+  // Replace address in form.
+  if (isset($form_state['triggering_element']) && $form_state['triggering_element']['#id'] === $element['#id']) {
+    // Hey, we need to update an address.
+    if (empty($element['#uc_addresses_address_input']) || empty($element['#uc_addresses_address_element'])) {
+      // Hm, it's not specified where the address is in the form.
+      // Abort.
+    }
+    elseif (isset($addresses[$element['#value']])) {
+      $address = $addresses[$element['#value']];
+      // Find address field to replace.
+      $address_field = &$form_state['complete form'];
+      foreach ($element['#uc_addresses_address_element'] as $key) {
+        if (isset($address_field[$key])) {
+          $address_field = &$address_field[$key];
+        }
+      }
+      $address_field['#value'] = $address->getRawFieldData();
+
+      // Find input array to replace.
+      $input = &$form_state['input'];
+      foreach ($element['#uc_addresses_address_element'] as $key) {
+        if (isset($input[$key])) {
+          $input = &$input[$key];
+        }
+      }
+      $input = $address_field['#value'];
+    }
+  }
+  return $element;
+}
+
+/**
+ * Ajax callback to re-render the full address element.
+ */
+function uc_addresses_address_render($form, &$form_state) {
+  $element = &$form;
+  foreach ($form_state['triggering_element']['#uc_addresses_address_element'] as $key) {
+    if (isset($element[$key])) {
+      $element = &$element[$key];
+    }
+  }
+  return $element;
+}
+
 // ---------------------------------------------------------------------------
 // UBERCART HOOKS
 // ---------------------------------------------------------------------------
@@ -1130,7 +1236,6 @@ function uc_addresses_get_select_addresses($uid, $context = 'default', $type = '
   return $addresses;
 }
 
-// TODO: replace with logics in new uc_select_addresses function.
 /**
  * Widget for selecting an address.
  *
@@ -1142,14 +1247,11 @@ function uc_addresses_get_select_addresses($uid, $context = 'default', $type = '
  *   - order_form
  * @param string $type
  *   The type of address to select addresses for (shipping or billing)
- * @param UcAddressesAddress $default_value
- *   (optional) The option that should be selected.
  *
  * @return array
  *   A select form element for selecting addresses
- * @todo make an 'element' of it?
  */
-function uc_addresses_select_addresses($uid, $context = 'default', $type = 'billing', UcAddressesAddress $default_value = NULL) {
+function uc_addresses_select_addresses($uid, $context = 'default', $type = 'billing') {
   // Get addresses for select.
   $addresses = uc_addresses_get_select_addresses($uid, $context, $type);
 
@@ -1158,42 +1260,11 @@ function uc_addresses_select_addresses($uid, $context = 'default', $type = 'bill
     return NULL;
   }
 
-  // Initialize default value, we don't know yet which address in the list is
-  // equal to the given default value.
-  $address_book_default_value = NULL;
-
-  $options = array(
-    '' => t('Select one...'),
-  );
-  foreach ($addresses as $address) {
-    $key = $address->getId();
-    if ($address_name = $address->getName()) {
-      $options[$key] = $address_name;
-    }
-    else {
-      $options[$key] = preg_replace('/<.*?>/', ', ', trim(uc_addresses_format_address($address)));
-    }
-
-    // Check if this address is equal to given default value
-    if ($default_value && !$address_book_default_value) {
-      if ($address->compareAddress($default_value)) {
-        // Default value found! Save it for later.
-        $address_book_default_value = $key;
-      }
-    }
-  }
-
-  $select = array(
-    '#type' => 'select',
+  return array(
+    '#type' => 'uc_addresses_select',
     '#title' => t('Address book'),
-    '#options' => $options,
+    '#uc_addresses_select_addresses' => $addresses,
   );
-  // Add default value if found
-  if ($address_book_default_value) {
-    $select['#default_value'] = $address_book_default_value;
-  }
-
-  return $select;
 }
 
 // -----------------------------------------------------------------------------
diff --git a/uc_addresses.ubercart.inc b/uc_addresses.ubercart.inc
index af3508b..355bdc8 100644
--- a/uc_addresses.ubercart.inc
+++ b/uc_addresses.ubercart.inc
@@ -126,7 +126,7 @@ function uc_addresses_checkout_pane_address($type, $op, $order, $form, &$form_st
         );
       }
 
-      if ($user->uid && $select = uc_addresses_select_addresses($user->uid, 'checkout_form', $pane, $address)) {
+      if ($user->uid && $select = uc_addresses_select_addresses($user->uid, 'checkout_form', $pane)) {
         $contents['select_address'] = $select + array(
           '#type' => 'select',
           '#title' => t('Saved addresses'),
@@ -136,12 +136,16 @@ function uc_addresses_checkout_pane_address($type, $op, $order, $form, &$form_st
             'progress' => array(
               'type' => 'throbber',
             ),
+            'event' => 'change',
           ),
           '#states' => array(
             'invisible' => array(
               'input[name="panes[' . $pane . '][copy_address]"]' => array('checked' => TRUE),
             ),
           ),
+          '#uc_addresses_address_element' => array('panes', $pane, 'address'),
+          '#uc_addresses_address_input' => array('panes', $pane, 'address'),
+          '#default_value' => $address,
         );
       }
 
@@ -163,19 +167,6 @@ function uc_addresses_checkout_pane_address($type, $op, $order, $form, &$form_st
           }
         }
 
-        if ($element['#name'] == "panes[$pane][select_address]") {
-          $address_id = $element['#value'];
-          $address_source = UcAddressesAddressBook::get($user->uid)->getAddressById($address_id);
-          if ($address_source instanceof UcAddressesAddress) {
-            $address = $address_source->copyAddress(UcAddressesAddressBook::get(0));
-            $address_data = $address->getRawFieldData();
-            foreach ($address_data as $field => $value) {
-              $form_state['input']['panes'][$pane]['address'][$pane . '_' . $field] = $value;
-              $order->{$pane . '_' . $field} = $value;
-            }
-          }
-        }
-
         // Forget any previous Ajax submissions, as we send new default values.
         unset($form_state['uc_addresses_address']);
       }
@@ -248,7 +239,6 @@ function uc_addresses_checkout_pane_address($type, $op, $order, $form, &$form_st
 // ---------------------------------------------------------------------------
 // UBERCART CALLBACKS
 // order panes
-// @todo Implement!
 // ---------------------------------------------------------------------------
 
 /**
@@ -293,10 +283,12 @@ function uc_addresses_order_pane_address($type, $op, $order, &$form = NULL, &$fo
   if ($type == 'shipping') {
     $other_pane = 'billing';
     $pane = 'delivery';
+    $copy_text = t('Copy billing information');
   }
   else {
     $other_pane = 'delivery';
     $pane = 'billing';
+    $copy_text = t('Copy shipping information');
   }
 
   switch ($op) {
@@ -317,9 +309,6 @@ function uc_addresses_order_pane_address($type, $op, $order, &$form = NULL, &$fo
       return $build;
 
     case 'edit-form':
-      // Tell address book we want to get multiple addresses.
-      UcAddressesAddressBook::get($order->uid)->setPerformanceHint(UcAddressesAddressBook::PERF_HINT_LOAD_ALL);
-
       $form[$pane] = array(
         '#tree' => TRUE,
       );
@@ -332,34 +321,93 @@ function uc_addresses_order_pane_address($type, $op, $order, &$form = NULL, &$fo
         $address = UcAddressesAddress::newAddress();
       }
 
-      if ($select = uc_addresses_select_addresses($order->uid, 'order_form', $pane, $address)) {
-        $form[$pane]['select_address'] = $select + array(
-          '#type' => 'select',
-          '#ajax' => array(
-            'callback' => 'uc_addresses_order_pane_address_render',
-            'wrapper' => $pane . '-address-pane',
-            'progress' => array(
-              'type' => 'throbber',
-            ),
+      // Hide the address book selector by default.
+      $select_address = !empty($form_state['values'][$pane]['select']['shown']);
+
+      // Order pane icons
+      $form[$pane]['buttons_prefix'] = array(
+        '#type' => 'markup',
+        '#markup' => '<div class="order-pane-icons">',
+      );
+      $form[$pane]['select_address_button'] = array(
+        '#type' => 'button',
+        '#name' => $pane . '_select_address_button',
+        '#value' => t('Select from address book.'),
+        '#ajax' => array(
+          'callback' => 'uc_addresses_order_pane_select_address_render',
+          'wrapper' => $pane . '-select-address',
+          'progress' => array(
+            'type' => 'throbber',
           ),
-        );
-      }
+        ),
+        '#uc_addresses_info' => array(
+          'pane' => $pane,
+          'button' => 'select_address_button',
+        ),
+        '#attributes' => array(
+          'class' => array('uc-addresses-button', 'uc-addresses-select-address-button'),
+          'title' => t('Select from address book.'),
+        ),
+      );
+      $form[$pane]['copy'] = array(
+        '#type' => 'button',
+        '#name' => $pane . '_copy',
+        '#value' => $copy_text,
+        '#ajax' => array(
+          'callback' => 'uc_addresses_order_pane_address_render',
+          'wrapper' => $pane . '-address-pane',
+          'progress' => array(
+            'type' => 'throbber',
+          ),
+        ),
+        '#uc_addresses_info' => array(
+          'pane' => $pane,
+          'button' => 'copy',
+        ),
+        '#attributes' => array(
+          'class' => array('uc-addresses-button', 'uc-addresses-copy-button'),
+          'title' => $copy_text,
+        ),
+      );
+      $form[$pane]['buttons_suffix'] = array(
+        '#type' => 'markup',
+        '#markup' => '</div>',
+      );
 
       if (isset($form_state['triggering_element'])) {
         $element = &$form_state['triggering_element'];
-
-        if ($element['#name'] == $pane . '[select_address]') {
-          $address_id = $element['#value'];
-          $address_source = UcAddressesAddressBook::get($order->uid)->getAddressById($address_id);
-          if ($address_source instanceof UcAddressesAddress) {
-            $address = $address_source->copyAddress(UcAddressesAddressBook::get(0));
-            $address_data = $address->getRawFieldData();
-            foreach ($address_data as $field => $value) {
-              if (isset($order->{$pane . '_' . $field})) {
-                $form_state['input'][$pane]['address'][$pane . '_' . $field] = $value;
-                $order->{$pane . '_' . $field} = $value;
+        if (isset($element['#uc_addresses_info']) && $element['#uc_addresses_info']['pane'] == $pane) {
+          // On one of the order pane icons is clicked.
+          switch ($element['#uc_addresses_info']['button']) {
+            case 'select_address_button':
+              // The address book selector may be shown.
+              $select_address = TRUE;
+              break;
+            case 'select_address_close_button':
+              // The address book selector may NOT be shown.
+              $select_address = FALSE;
+              break;
+            case 'copy':
+              // Copy over address information from the other address pane
+              // if the other address pane exists.
+              if (isset($form_state['input'][$other_pane])) {
+                foreach ($form_state['input'][$other_pane]['address'] as $source_fieldname => $value) {
+                  // Substract prefix from fieldname.
+                  $fieldname = substr($source_fieldname, strlen($other_pane) + 1);
+                  $target_fieldname = $pane . '_' . $fieldname;
+                  // Copy over value to current address pane if the fieldname is not 'aid'.
+                  if ($fieldname != 'aid' && isset($order->$target_fieldname)) {
+                    // Copy.
+                    $value = $form_state['input'][$other_pane]['address'][$source_fieldname];
+                    if ($address->fieldExists($fieldname)) {
+                      $address->setField($fieldname, $value);
+                    }
+                    $order->$target_fieldname = $value;
+                    $form_state['input'][$pane]['address'][$target_fieldname] = $value;
+                  }
+                }
               }
-            }
+              break;
           }
         }
 
@@ -367,6 +415,59 @@ function uc_addresses_order_pane_address($type, $op, $order, &$form = NULL, &$fo
         unset($form_state['uc_addresses_address']);
       }
 
+      // Address book selector.
+      $form[$pane]['select'] = array(
+        '#type' => 'container',
+        '#prefix' => '<div id="' . $pane . '-select-address">',
+        '#suffix' => '</div>',
+        '#tree' => TRUE,
+      );
+      if ($select_address && $select = uc_addresses_select_addresses($order->uid, 'order_form', $pane)) {
+        $form[$pane]['select']['#prefix'] = '<div id="' . $pane . '-select-address" class="address-select-box">';
+        $form[$pane]['select']['select_address'] = $select + array(
+          '#ajax' => array(
+            'callback' => 'uc_addresses_address_render',
+            'wrapper' => $pane . '-address-pane',
+            'progress' => array(
+              'type' => 'throbber',
+            ),
+            'event' => 'change',
+          ),
+          '#uc_addresses_address_element' => array($pane, 'address'),
+          '#uc_addresses_address_input' => array($pane, 'address'),
+          '#default_value' => $address,
+        );
+        $form[$pane]['select']['shown'] = array(
+          '#type' => 'hidden',
+          '#value' => 1,
+        );
+        $form[$pane]['select']['close'] = array(
+          '#type' => 'button',
+          '#value' => t('Close'),
+          '#name' => $pane . '_select_address_close_button',
+          '#ajax' => array(
+            'callback' => 'uc_addresses_order_pane_select_address_render',
+            'wrapper' => $pane . '-select-address',
+            'progress' => array(
+              'type' => 'throbber',
+            ),
+          ),
+          '#uc_addresses_info' => array(
+            'pane' => $pane,
+            'button' => 'select_address_close_button',
+          ),
+        );
+      }
+      else {
+        $form[$pane]['select']['select_address'] = array(
+          '#markup' => '',
+        );
+        $form[$pane]['select']['shown'] = array(
+          '#type' => 'hidden',
+          '#value' => 0,
+        );
+      }
+
       // View the address form
       $form[$pane]['address'] = array(
         '#type' => 'uc_addresses_address',
@@ -416,12 +517,9 @@ function uc_addresses_order_pane_address($type, $op, $order, &$form = NULL, &$fo
 }
 
 /**
- * Ajax callback to re-render the full address element.
+ * Ajax callback to re-render the select address field.
  */
-function uc_addresses_order_pane_address_render($form, &$form_state) {
-  $element = &$form;
-  foreach (array_slice($form_state['triggering_element']['#array_parents'], 0, -1) as $field) {
-    $element = &$element[$field];
-  }
-  return $element['address'];
+function uc_addresses_order_pane_select_address_render($form, &$form_state) {
+  $pane = $form_state['triggering_element']['#uc_addresses_info']['pane'];
+  return $form[$pane]['select'];
 }
