diff --git a/uc_product_quote/README.txt b/uc_product_quote/README.txt
index efddf17..b28f3d7 100644
--- a/uc_product_quote/README.txt
+++ b/uc_product_quote/README.txt
@@ -31,6 +31,20 @@ None.
 
     Users in roles with the "administer product quotes" permission will see the
     "Shipping Quotes" tab added to the product edit page.
+    
+* To add a per-class shipping option go to the class management ui at Store
+  Administration >> Products >> Manage Classes and hit the edit button on the
+  class you wish to change. Look for the Shipping Quotes tab and you'll find options
+  for the shippers that you've defined globally.
+  
+* To add a per-product shipping option go to the product ui at Store Administration >>
+  Products and hit the edit button on the product you wish to change. Look for the
+  Shipping Quotes tab and you'll find options for the shippers that you've defined
+  globally. 
+  
+NOTE: Ubercart Product Quote only applies the most restrictive set of shipping
+  options possible. If you add a restricted item to your cart the entire cart will
+  assume the most restrictive option. 
 
 
 -- TROUBLESHOOTING --
diff --git a/uc_product_quote/uc_product_quote.admin.inc b/uc_product_quote/uc_product_quote.admin.inc
index 7f55e7b..a90e2e8 100644
--- a/uc_product_quote/uc_product_quote.admin.inc
+++ b/uc_product_quote/uc_product_quote.admin.inc
@@ -52,7 +52,7 @@ function uc_product_quote_form($form_state, $object, $type) {
         '#type'         => 'fieldset',
         '#title'        => $method['title'],
         '#collapsible'  => TRUE,
-        '#collapsed'    => TRUE,
+        '#collapsed'    => FALSE,
       );
 
       // Retrieve an array of services already selected for this method
@@ -62,13 +62,20 @@ function uc_product_quote_form($form_state, $object, $type) {
       if (!$services) {
         $services = array();
       }
-
+      
+      // Only show the available services from the global settings
+      $default_services = array_filter(variable_get('uc_ups_services', _uc_ups_service_list()));
+      foreach ($default_services as $key => $service) {
+        $default_services[$key] = $method['quote']['accessorials'][$key];
+      }
+      
       // List of methods services to restrict for the product
       $form[$mid][$mid] = array(
         '#type'          => 'checkboxes',
         '#title'         => t('Services'),
+        '#description'   => t('Globally available services from UC. Click <a href="/admin/store/settings/quotes/methods/' . $method['id'] . '">here</a> to change your settings.'),
         '#default_value' => $services,
-        '#options'       => $method['quote']['accessorials'],
+        '#options'       => $default_services,
       );
     }
   }
diff --git a/uc_product_quote/uc_product_quote.module b/uc_product_quote/uc_product_quote.module
index 35b646e..f08e3cd 100644
--- a/uc_product_quote/uc_product_quote.module
+++ b/uc_product_quote/uc_product_quote.module
@@ -103,37 +103,76 @@ function uc_product_quote_product_class($type, $op) {
 }
 
 /******************************************************************************
- * FedEx Hooks                                                                *
+ * Shipper specific Hooks                                                     *
  ******************************************************************************/
 
 /**
  * Return an array containing only the services allowed for the particular
  */
 function uc_product_quote_fedex_filter($products, $details) {
-  // Loop through the products
-  foreach ($products as $product) {
-    $args[] = $product->nid;
-  }
+  // Get a list of the default allowed UPS services
+  $default_services = array_filter(variable_get('uc_fedex_services', _uc_fedex_service_list()));
+  return uc_product_quote_services('fedex', $default_services, $products);
+}
 
-  // Filter out duplicate products
-  $args = array_unique($args);
+/**
+ * Return an array containing only the services allowed for the particular
+ */
+function uc_product_quote_ups_filter($products, $details) {
+  // Get a list of the default allowed UPS services
+  $default_services = array_filter(variable_get('uc_ups_services', _uc_ups_service_list()));
+  return uc_product_quote_services('ups', $default_services, $products);
+}
 
-  // Build conditions based on unique products
-  foreach ($args as $arg) {
-    $conditions .= 'nid = %d OR ';
+/**
+ * Generic function that intersects the available shipment methods
+ */
+function uc_product_quote_services($method, $services, $products) {
+  // Loop through the producs looking for their class and nid
+  foreach ($products as $product) {
+    $classes[] = $product->type;
+    $nids[] = $product->nid;
   }
-  // Truncate last 'OR'
-  $conditions = substr($conditions, 0, strlen($conditions) - 4);
-
-  // Get a list of the default allowed FedEx services
-  $services = array_filter(variable_get('uc_fedex_services', _uc_fedex_services()));
 
+  $query = "";
+  // If there are per-class shipping options on these products apply them here
+  if (!empty($classes)) {
+    // Build conditions based on unique products and classes
+    $classes = array_unique($classes);
+    $class_args = $class_conditions = array();
+    foreach ($classes as $class) {
+      $class_conditions[] = 'pcid = "%s"';
+      $class_args[] = $class;
+    }
+    // Join all the conditions with an OR
+    $class_conditions = implode(' OR ', $class_conditions);
+    $query = "SELECT services FROM {uc_class_quotes} WHERE ($class_conditions) AND method = 'ups'";
+  }
+  // If there are per-product shipping options on these products apply them here
+  if (!empty($nids)) {
+    // Build conditions based on unique products and classes
+    $nids = array_unique($nids);
+    $nid_args = $nid_conditions = array();
+    foreach ($nids as $nid) {
+      $nid_conditions[] = 'nid = %d';
+      $nid_args[] = $nid;
+    }
+    // Join all the conditions with an OR
+    $nid_conditions = implode(' OR ', $nid_conditions);
+    
+    // If we found per-class options we need to union these options together
+    if (!empty($query)) {
+      $query .= " UNION ";
+    }
+    $query .= "SELECT services FROM {uc_product_quotes} WHERE ($nid_conditions) AND method = 'ups'";
+  }
+  
   // Get a list of allowed services for each product
-  $result = db_query("SELECT services FROM {uc_product_quotes} WHERE ($conditions) AND method = 'fedex'", $args);
+  $result = db_query($query, $class_args, $nid_args);
   while ($product_services = unserialize(db_result($result))) {
     $services = array_intersect($services, $product_services);
   }
-
+  
   return array('uc_product_quote' => $services);
 }
 
