diff --git a/uc_product_quote.admin.inc b/uc_product_quote.admin.inc
index 810d284..e1df0d9 100644
--- a/uc_product_quote.admin.inc
+++ b/uc_product_quote.admin.inc
@@ -16,9 +16,9 @@ function uc_product_quote_form($form_state, $object, $type) {
   switch ($type) {
     case 'class':
       $class = $object;
-      $table = '{uc_class_quotes}';
-      $primary_key = 'pcid';
-      $primary_key_type = "'%s'";
+      $table = '{uc_pq_class}';
+      $filtered_id = 'pcid';
+      $filtered_type = "'%s'";
       $id = $class->pcid;
       if (empty($class->name)) {
         drupal_goto('admin/store/products/classes/'. $id);
@@ -28,9 +28,9 @@ function uc_product_quote_form($form_state, $object, $type) {
     case 'product':
     default:
       $product = $object;
-      $table = '{uc_product_quotes}';
-      $primary_key = 'nid';
-      $primary_key_type = '%d';
+      $table = '{uc_pq_product}';
+      $filtered_id = 'nid';
+      $filtered_type = '%d';
       $id = $product->nid;
       if (empty($product->title)) {
         drupal_goto('node/'. $id);
@@ -40,6 +40,35 @@ function uc_product_quote_form($form_state, $object, $type) {
 
   // Retrieve modules that impliment shipping methods.
   $methods = module_invoke_all('shipping_method');
+  
+  // Check if the method is disabled for this product/class
+  $disabled = unserialize(db_result(db_query("SELECT services FROM $table WHERE $filtered_id = $filtered_type AND method='disabled'", $id)));
+  if (!$disabled){
+    $disabled = array();
+  }
+  
+  // Start the mids array, 
+  $mids = array('disabled');
+  
+  $form['disable'] = array(
+    '#type'           => 'fieldset',
+    '#title'          => t('Disable Shipping Methods'),
+    '#collapsible'    => FALSE,
+  );
+  
+  // Create the options for the checkboxes
+  $disable_options = array();
+  foreach ($methods as $mid => $method){
+    $disable_options[$mid] = $method['title'];
+  }
+  
+  $form['disable']['disabled'] = array(
+    '#type'           => 'checkboxes',
+    '#description'    => t('Use these options to completely disable a shipping method'),
+    '#default_value'  => $disabled,
+    '#options'        => $disable_options,
+  );
+  
   foreach ($methods as $mid => $method) {
     // If the method is enabled
     if ($method['enabled']) {
@@ -51,23 +80,29 @@ function uc_product_quote_form($form_state, $object, $type) {
         '#type'         => 'fieldset',
         '#title'        => $method['title'],
         '#collapsible'  => TRUE,
-        '#collapsed'    => TRUE,
+        '#collapsed'    => in_array($mid, $disabled),
       );
 
       // Retrieve an array of services already selected for this method
-      $services = unserialize(db_result(db_query("SELECT services FROM $table WHERE $primary_key = $primary_key_type AND method = '%s'", $id, $mid)));
+      $services = unserialize(db_result(db_query("SELECT services FROM $table WHERE $filtered_id = $filtered_type AND method = '%s'", $id, $mid)));
 
       // If no services have previously been selected
       if (!$services) {
         $services = array();
       }
+      
+      // Only show the available services from the global settings
+      $default_services = array_filter(variable_get('uc_'.$mid.'_services', $method['quote']['accessorials']));
+      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'),
         '#default_value' => $services,
-        '#options'       => $method['quote']['accessorials'],
+        '#options'       => $default_services,
       );
     }
   }
@@ -97,14 +132,14 @@ function uc_product_quote_form($form_state, $object, $type) {
  */
 function uc_product_quote_form_submit($form, &$form_state) {
   if ($form_state['values']['type'] == 'product') {
-    $table = '{uc_product_quotes}';
-    $primary_key = 'nid';
-    $primary_key_type = '%d';
+    $table = '{uc_pq_product}';
+    $filtered_id = 'nid';
+    $filtered_type = '%d';
   }
   elseif ($form_state['values']['type'] == 'class') {
-    $table = '{uc_class_quotes}';
-    $primary_key = 'pcid';
-    $primary_key_type = "'%s'";
+    $table = '{uc_pq_class}';
+    $filtered_id = "pcid";
+    $filtered_type = "'%s'";
   }
 
   // Loop through form values
@@ -117,18 +152,18 @@ function uc_product_quote_form_submit($form, &$form_state) {
       $serialized_services = serialize($services);
     
       // Try to update an existing record
-      db_query("UPDATE $table SET services = '%s' WHERE $primary_key = $primary_key_type and method = '%s'", $serialized_services, $form_state['values']['id'], $method);
-    
+      db_query("UPDATE $table SET services = '%s' WHERE $filtered_id = $filtered_type and method = '%s'", $serialized_services, $form_state['values']['id'], $method);
+
       // If the update failed
       if (!db_affected_rows()) {
         // Create a new record
-        @db_query("INSERT INTO $table ($primary_key, method, services) VALUES ($primary_key_type, '%s', '%s')", $form_state['values']['id'], $method, $serialized_services);
+        @db_query("INSERT INTO $table ($filtered_id, method, services) VALUES ($filtered_type, '%s', '%s')", $form_state['values']['id'], $method, $serialized_services);
       }
     }
     // If no services were selected for this product
     else {
       // Delete the existing record
-      db_query("DELETE FROM $table WHERE $primary_key = $primary_key_type AND method = '%s'", $form_state['values']['id'], $method);
+      db_query("DELETE FROM $table WHERE $filtered_id = $filtered_type AND method = '%s'", $form_state['values']['id'], $method);
     }
   }
 
diff --git a/uc_product_quote.install b/uc_product_quote.install
index 5dde6c2..772923b 100644
--- a/uc_product_quote.install
+++ b/uc_product_quote.install
@@ -11,9 +11,15 @@
 function uc_product_quote_schema() {
   $schema = array();
 
-  $schema['uc_product_quotes'] = array(
+  $schema['uc_pq_product'] = array(
     'description' => t('Product Quotes: shipping quote methods/services enabled on a per product basis.'),
     'fields' => array(
+      'fid' => array(
+        'description' => t('The id for this filter.'),
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE
+      ),
       'nid' => array(
         'description' => t('The product node id that the product quotes are associated with.'),
         'type' => 'int',
@@ -35,15 +41,21 @@ function uc_product_quote_schema() {
         'size' => 'big'
       ),
     ),
-    'primary key' => array('nid'),
+    'primary key' => array('fid'),
     'unique keys' => array(
       'nid_method' => array('nid', 'method'),
     ),
   );
 
-  $schema['uc_class_quotes'] = array(
+  $schema['uc_pq_class'] = array(
     'description' => t('Class Quotes: shipping quote methods/services enabled on a per product class basis.'),
     'fields' => array(
+      'fid' => array(
+        'description' => t('The id for this filter.'),
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE
+      ),
       'pcid' => array(
         'description' => t('The product class identifier.'),
         'type' => 'varchar',
@@ -65,7 +77,7 @@ function uc_product_quote_schema() {
         'size' => 'big'
       ),
     ),
-    'primary key' => array('pcid'),
+    'primary key' => array('fid'),
     'unique keys' => array(
       'pcid_method' => array('pcid', 'method'),
     ),
diff --git a/uc_product_quote.module b/uc_product_quote.module
index 2616001..a22b38e 100644
--- a/uc_product_quote.module
+++ b/uc_product_quote.module
@@ -37,8 +37,8 @@ function uc_product_quote_perm() {
  */
 function uc_product_quote_menu() {
   // Menu items for default product class quotes.
-  $items['admin/store/products/classes/%uc_product_class/quotes'] = array(
-    'title' => 'Shipping Quotes',
+  $items['admin/store/products/classes/%uc_product_class/shipping_methods'] = array(
+    'title' => 'Shipping Methods',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('uc_product_quote_form', 4, 'class'),
     'access callback' => 'uc_product_quote_class_access',
@@ -48,8 +48,8 @@ function uc_product_quote_menu() {
   );
 
   // Insert subitems into the edit node page for product types.
-  $items['node/%node/edit/quotes'] = array(
-    'title' => 'Shipping Quotes',
+  $items['node/%node/edit/shipping_methods'] = array(
+    'title' => 'Shipping Methods',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('uc_product_quote_form', 1, 'product'),
     'access callback' => 'uc_product_quote_access',
@@ -72,15 +72,15 @@ function uc_product_quote_nodeapi(&$node, $op, $arg3 = NULL, $arg4 = NULL) {
         switch ($GLOBALS['db_type']) {
           case 'mysqli':
           case 'mysql':
-            db_query("INSERT IGNORE INTO {uc_product_quotes} (nid, method, services) SELECT %d, method, services FROM {uc_class_quotes} WHERE pcid = '%s'", $node->nid, $node->type);
+            db_query("INSERT IGNORE INTO {uc_pq_product} (nid, method, services) SELECT %d, method, services FROM {uc_pq_class} WHERE pcid = '%s'", $node->nid, $node->type);
             break;
           case 'pgsql':
-            db_query("INSERT INTO {uc_product_quotes} (nid, method, services) SELECT %d, method, services FROM {uc_class_quotes} WHERE pcid = '%s'", $node->nid, $node->type);
+            db_query("INSERT INTO {uc_pq_product} (nid, method, services) SELECT %d, method, services FROM {uc_pq_class} WHERE pcid = '%s'", $node->nid, $node->type);
             break;
         }
         break;
       case 'delete':
-        db_query("DELETE FROM {uc_product_quotes} WHERE nid = %d", $node->nid);
+        db_query("DELETE FROM {uc_pq_product} WHERE nid = %d", $node->nid);
         break;
     }
   }
@@ -96,41 +96,68 @@ function uc_product_quote_nodeapi(&$node, $op, $arg3 = NULL, $arg4 = NULL) {
 function uc_product_quote_product_class($type, $op) {
   switch ($op) {
     case 'delete':
-      db_query("DELETE FROM {uc_class_quotes} WHERE pcid = '%s'", $type);
+      db_query("DELETE FROM {uc_pq_class} WHERE pcid = '%s'", $type);
       break;
   }
 }
 
-/******************************************************************************
- * FedEx Hooks                                                                *
- ******************************************************************************/
-
 /**
- * Return an array containing only the services allowed for the particular
+ * Implementation of hook_shipping_method_filter
  */
-function uc_product_quote_fedex_filter($products, $details) {
-  // Loop through the products
+function uc_product_quote_shipping_method_filter($method, $products, $services) {
+ 
+  // Loop through the producs looking for their class and nid
   foreach ($products as $product) {
-    $args[] = $product->nid;
+    $classes[] = $product->type;
+    $nids[] = $product->nid;
   }
-
-  // Filter out duplicate products
-  $args = array_unique($args);
-
-  // Build conditions based on unique products
-  foreach ($args as $arg) {
-    $conditions .= 'nid = %d OR ';
+  
+  $query = "";
+  // If there are per-class shipping options on these products apply them here
+  $qArgs = array(); 
+  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'";
+      $qArgs[] = $class;
+    }
+    
+    // Join all the conditions with an OR
+    $class_conditions = implode(' OR ', $class_conditions);
+    $query = "SELECT method, services FROM {uc_pq_class} WHERE ($class_conditions) AND (method = '$method' OR method = 'disabled')";
+  }
+  // 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';
+      $qArgs[] = $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 method, services FROM {uc_pq_product} WHERE ($nid_conditions) AND (method = '$method' OR method = 'disabled')";
   }
-  // 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()));
 
   // Get a list of allowed services for each product
-  $result = db_query("SELECT services FROM {uc_product_quotes} WHERE ($conditions) AND method = 'fedex'", $args);
-  while ($product_services = unserialize(db_result($result))) {
-    $services = array_intersect($services, $product_services);
+  $result = db_query($query, $qArgs);
+  while ($product_services = db_fetch_array($result)) {
+    if($product_services['method'] == 'disabled' && in_array($method, array_keys(unserialize($product_services['services'])))){
+        return array('uc_product_shipping_filter' => array('disabled' => 'disabled'));
+    }else{
+        if ($product_services['method'] != 'disabled'){
+            $services = array_intersect($services, unserialize($product_services['services']));
+        }
+    }
   }
 
   return array('uc_product_quote' => $services);
