diff --git a/commerce_ups.api.php b/commerce_ups.api.php
new file mode 100644
index 0000000..a1bdbf4
--- /dev/null
+++ b/commerce_ups.api.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Allows modules to alter the Commerce UPS ship to address.
+ *
+ * @param array $ship_to_address
+ *   The array of address elements.
+ *
+ * @param object $order_wrapper
+ *   The entity_metadata_wrapper object for the Commerce Order.
+ *
+ * @see commerce_ups_ship_to_address_from_order()
+ */
+function hook_commerce_ups_ship_to_address_from_order_alter(&$ship_to_address, $order_wrapper) {
+  $ship_to_address['organisation_name']   = 'Commerce Guys';
+  $ship_to_address['thoroughfare']        = '950 Victors Way';
+  $ship_to_address['premise']             = 'Ste 10';
+  $ship_to_address['locality']            = 'Ann Arbor';
+  $ship_to_address['administrative_area'] = 'MI';
+  $ship_to_address['postal_code']         = '48108';
+  $ship_to_address['country']             = 'US';
+}
+
+/**
+ * Allows modules to alter the Commerce UPS ship from address.
+ *
+ * @param array $ship_from_address
+ *   The array of address elements.
+ *
+ * @param object $order_wrapper
+ *   The entity_metadata_wrapper object for the Commerce Order.
+ *
+ * @see commerce_ups_ship_to_address_from_order()
+ */
+function hook_commerce_ups_ship_from_address_alter(&$ship_from_address, $order_wrapper) {
+  $ship_from_address['organisation_name']   = 'Commerce Guys';
+  $ship_from_address['thoroughfare']        = '950 Victors Way';
+  $ship_from_address['premise']             = 'Ste 10';
+  $ship_from_address['locality']            = 'Ann Arbor';
+  $ship_from_address['administrative_area'] = 'MI';
+  $ship_from_address['postal_code']         = '48108';
+  $ship_from_address['country']             = 'US';
+}
diff --git a/commerce_ups.xml.inc b/commerce_ups.xml.inc
index dfdd8a4..cc213d4 100644
--- a/commerce_ups.xml.inc
+++ b/commerce_ups.xml.inc
@@ -17,12 +17,15 @@ function commerce_ups_build_rate_request($order) {
   $field_name = commerce_physical_order_shipping_field_name($order);
   $shipping_profile = $order_wrapper->{$field_name}->value();
 
+  // Get the ship from address.
+  $ship_from_address = _commerce_ups_ship_from_address($order_wrapper);
+
   // Prepare the shipping address for use in the request.
   if (!empty($order_wrapper->{$field_name}->commerce_customer_address)) {
-    $shipping_address = $order_wrapper->{$field_name}->commerce_customer_address->value();
+    $ship_to_address = $order_wrapper->{$field_name}->commerce_customer_address->value();
   }
   else {
-    $shipping_address = addressfield_default_values();
+    $ship_to_address = _commerce_ups_shipping_address_from_order($order_wrapper);
   }
 
   $ups_pickupschedule = variable_get('commerce_ups_pick_up_schedule');
@@ -49,11 +52,9 @@ function commerce_ups_build_rate_request($order) {
   /* Pickup Schedule */
   $schedule_code = variable_get('commerce_ups_pick_up_schedule');
 
-  /* Ship To - Customer Shipping Address */
-  $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
   // Prepare the shipping address for use in the request.
-  if (!empty($order_wrapper->commerce_customer_shipping->commerce_customer_address)) {
-    $shipping_address = $order_wrapper->commerce_customer_shipping->commerce_customer_address->value();
+  if (empty($ship_to_address) && !empty($order_wrapper->commerce_customer_shipping->commerce_customer_address)) {
+    $ship_to_address = $order_wrapper->commerce_customer_shipping->commerce_customer_address->value();
   }
 
   $api_vars = commerce_ups_decrypt_vars(TRUE);
@@ -83,18 +84,18 @@ function commerce_ups_build_rate_request($order) {
 
   $shipto = $shipment->addChild('ShipTo');
   $shipto_address = $shipto->addChild('Address');
-  $shipto_address->addChild('StateProvinceCode', $shipping_address['administrative_area']);
-  $shipto_address->addChild('PostalCode', $shipping_address['postal_code']);
-  $shipto_address->addChild('CountryCode', $shipping_address['country']);
+  $shipto_address->addChild('StateProvinceCode', $ship_to_address['administrative_area']);
+  $shipto_address->addChild('PostalCode', $ship_to_address['postal_code']);
+  $shipto_address->addChild('CountryCode', $ship_to_address['country']);
   if (variable_get('commerce_ups_shipto_residential', FALSE)) {
     $shipto_address->addChild('ResidentialAddressIndicator', 'true');
   }
 
   $shipfrom = $shipment->addChild('ShipFrom');
   $shipfrom_address = $shipfrom->addChild('Address');
-  $shipfrom_address->addChild('StateProvinceCode', variable_get('commerce_ups_state', ''));
-  $shipfrom_address->addChild('PostalCode', variable_get('commerce_ups_postal_code', ''));
-  $shipfrom_address->addChild('CountryCode', variable_get('commerce_ups_country_code', ''));
+  $shipfrom_address->addChild('StateProvinceCode', $ship_from_address['administrative_area']);
+  $shipfrom_address->addChild('PostalCode', $ship_from_address['postal_code']);
+  $shipfrom_address->addChild('CountryCode', $ship_from_address['country']);
   $shipfrom->addChild('ResidentialAddressIndicator', '');
 
   $package_number = 1;
@@ -109,7 +110,7 @@ function commerce_ups_build_rate_request($order) {
     $package_weight = $package->addChild('PackageWeight');
     $package_weight->addChild('UnitOfMeasurement')->addChild('Code', 'LBS');
     /* If the weight is less than 0.1, set it to 0.1. I tried to find some "official" documentation
-     *   for this on the UPS site, but could not. I did find that other ecommerce platforms are 
+     *   for this on the UPS site, but could not. I did find that other ecommerce platforms are
      *   using this same logic though, I think it is safe for now. mta
      */
     $package_weight->addChild('Weight', max(array(0.1, $weight['weight'] / $number_of_packages)));
@@ -171,3 +172,48 @@ function commerce_ups_api_request($xml, $message = '') {
     return FALSE;
   }
 }
+
+/**
+ * Helper function. Abstracts getting the ship to address from customer information for UPS rate quotes.
+ *
+ * @param $order_wrapper
+ *
+ * @return array
+ */
+function _commerce_ups_ship_to_address_from_order($order_wrapper) {
+  $ship_to_address = array();
+
+  if (property_exists($order_wrapper->commerce_customer_shipping, 'commerce_customer_address')) {
+    $ship_to_address = $order_wrapper->commerce_customer_shipping->commerce_customer_address->value();
+  }
+
+  // Allow other modules to alter the Commerce UPS ship to address.
+  drupal_alter('commerce_ups_ship_to_address_from_order', $ship_to_address, $order_wrapper);
+
+  return $ship_to_address;
+}
+
+/**
+* Helper function. Abstracts getting the ship from address from admin settings.
+*
+* @param $order_wrapper
+*
+* @return array
+*/
+function _commerce_ups_ship_from_address($order_wrapper) {
+  $ship_from_address = array();
+
+  // Set the address from the admin settings.
+  $ship_from_address['organisation_name']   = variable_get('commerce_ups_company_name', '');
+  $ship_from_address['thoroughfare']        = variable_get('commerce_ups_address_line_1', '');
+  $ship_from_address['premise']             = variable_get('commerce_ups_address_line_2', '');
+  $ship_from_address['locality']            = variable_get('commerce_ups_city', '');
+  $ship_from_address['administrative_area'] = variable_get('commerce_ups_state', '');
+  $ship_from_address['postal_code']         = variable_get('commerce_ups_postal_code', '');
+  $ship_from_address['country']             = variable_get('commerce_ups_country_code', '');
+
+  // Allow other modules to alter the Commerce UPS ship from address.
+  drupal_alter('commerce_ups_ship_from_address', $ship_from_address, $order_wrapper);
+
+  return $ship_from_address;
+}
