diff --git a/shipping/uc_quote/uc_quote.admin.inc b/shipping/uc_quote/uc_quote.admin.inc
index 42e65fa..6a73432 100644
--- a/shipping/uc_quote/uc_quote.admin.inc
+++ b/shipping/uc_quote/uc_quote.admin.inc
@@ -136,2 +136,9 @@
 
+      // Calculation rules link
+      $operations += array('calculations' => array(
+        'title' => t('calculations rules'),
+        'href' => 'admin/store/settings/quotes/manage/calculate_quote_from_' . $id,
+        'weight' => 6,
+      ));
+
       // Ensure "delete" comes towards the end of the list.
diff --git a/shipping/uc_quote/uc_quote.info b/shipping/uc_quote/uc_quote.info
index a22e3ba..9f3b6c5 100644
--- a/shipping/uc_quote/uc_quote.info
+++ b/shipping/uc_quote/uc_quote.info
@@ -10 +10,4 @@
 files[] = tests/uc_quote.test
+
+;Wrapper class and helppers
+files[] = uc_quote.wrapper.inc
diff --git a/shipping/uc_quote/uc_quote.pages.inc b/shipping/uc_quote/uc_quote.pages.inc
index 873a613..e6a246b 100644
--- a/shipping/uc_quote/uc_quote.pages.inc
+++ b/shipping/uc_quote/uc_quote.pages.inc
@@ -48,2 +48,10 @@
 
+  // We cannot convert products weight in rules, at least for now, because
+  // we can't access $product->weight_units so we calculate the order total
+  // weight here and we pass it to the method for use in rules.
+  $order_weight = 0;
+  foreach ($order->products as $product) {
+    $order_weight += $product->qty * $product->weight * uc_weight_conversion($product->weight_units, variable_get('uc_weight_unit', 'lb'));
+  }
+
   $quote_data = array();
@@ -55,2 +63,14 @@
       foreach ($data as &$quote) {
+        // Send method to rules for calculations
+        $rules_method = (object) ($method + $quote);
+        $results = rules_invoke_component('calculate_quote_from_' . $method['id'], $order, $rules_method);
+        $result = array_pop($results);
+
+        // Ensure that only original fields are set by rules.
+        // @todo I think there is a better way.
+        foreach ($quote as $key => &$value) {
+          if (isset($result->{$key})) {
+            $value = $result->{$key};
+          }
+        }
         if (isset($quote['rate'])) {
diff --git a/shipping/uc_quote/uc_quote.rules.inc b/shipping/uc_quote/uc_quote.rules.inc
index 83e0d3e..e5028f7 100644
--- a/shipping/uc_quote/uc_quote.rules.inc
+++ b/shipping/uc_quote/uc_quote.rules.inc
@@ -8,2 +8,67 @@
 /**
+ * Implements hook_rules_data_info().
+ */
+function uc_quote_rules_data_info() {
+  $types['uc_quote_method'] = array(
+    'label' => t('Quote Method'),
+    'wrap' => TRUE,
+    'wrapper class' => 'UcQuoteRulesWrapper',
+    'property info' => array(
+      'id' => array(
+        'label' => t("Method ID"),
+        'type' => 'text',
+        'description' => t("The unique quote method ID."),
+        'setter callback' => 'uc_quote_rules_verbatim_set',
+      ),
+      'label' => array(
+        'label' => t("Label"),
+        'type' => 'text',
+        'description' => t("The label displayed in order line item."),
+        'setter callback' => 'uc_quote_rules_verbatim_set',
+      ),
+      'rate' => array(
+        'label' => t("Rate"),
+        'type' => 'decimal',
+        'description' => t("The quote rate so far."),
+        'setter callback' => 'uc_quote_rules_verbatim_set',
+      ),
+      'order_weight' => array(
+        'label' => t("Order weight"),
+        'type' => 'decimal',
+        'description' => t("Order total weight in store default weight unit."),
+        'setter callback' => 'uc_quote_rules_verbatim_set',
+      ),
+      'title' => array(
+        'label' => t("Admin title"),
+        'type' => 'text',
+        'description' => t("The admin title of this quote method."),
+        'setter callback' => 'uc_quote_rules_verbatim_set',
+      ),
+      'description' => array(
+        'label' => t("Description"),
+        'type' => 'text',
+        'description' => t("The description of quote method."),
+        'setter callback' => 'uc_quote_rules_verbatim_set',
+      ),
+      'weight' => array(
+        'label' => t("Weight"),
+        'type' => 'integer',
+        'description' => t("The weight of quote method."),
+        'setter callback' => 'uc_quote_rules_verbatim_set',
+      ),
+      'module' => array(
+        'label' => t("Module"),
+        'type' => 'text',
+        'description' => t("The module that implements this quote method."),
+        'setter callback' => 'uc_quote_rules_verbatim_set',
+      ),
+    ),
+    'group' => t('Ubercart'),
+
+  );
+
+  return $types;
+}
+
+/**
  * Implements hook_rules_condition_info().
diff --git a/shipping/uc_quote/uc_quote.rules_defaults.inc b/shipping/uc_quote/uc_quote.rules_defaults.inc
index 5ca8f0d..316b223 100644
--- a/shipping/uc_quote/uc_quote.rules_defaults.inc
+++ b/shipping/uc_quote/uc_quote.rules_defaults.inc
@@ -15,2 +15,3 @@
   foreach ($methods as $method) {
+    // Method conditions
     $set = rules_and(array(
@@ -21,2 +22,15 @@
     $configs['get_quote_from_' . $method['id']] = $set;
+
+    // Method calculations
+    $set = rules_action_set(
+      // Parameters
+      array(
+        'order' => array('type' => 'uc_order', 'label' => t('Order')),
+        'method' => array('type' => 'uc_quote_method', 'label' => t('Quote Method')),
+      ),
+      // Provides
+      array('method'));
+    $set->label = t('@method calculation', array('@method' => $method['title']));
+
+    $configs['calculate_quote_from_' . $method['id']] = $set;
   }
diff --git a/shipping/uc_quote/uc_quote.wrapper.inc b/shipping/uc_quote/uc_quote.wrapper.inc
new file mode 100644
index 0000000..bb2feb9
--- /dev/null
+++ b/shipping/uc_quote/uc_quote.wrapper.inc
@@ -0,0 +1,64 @@
+<?php
+/**
+ * @file
+ * Wrapper class for rules uc_quote_method type
+ */
+
+/**
+ * Wrapper class for uc_quote_method type
+ */
+class UcQuoteRulesWrapper extends RulesIdentifiableDataWrapper {
+
+  function load($method) {
+    return uc_quote_rules_get_method($method);
+  }
+
+  function extractIdentifier($data) {
+    return $data->id;
+  }
+}
+
+/**
+ * Converts method array to method object
+ *
+ * @param $method
+ *   quote method array
+ */
+function uc_quote_rules_get_method($method) {
+  return _uc_quote_rules_method_wrapper($method);
+}
+
+/**
+ * Helpper function to convert method array to object recursively
+ *
+ * @param array $array
+ */
+function _uc_quote_rules_method_wrapper($array) {
+  $obj = new stdClass();
+  foreach ($array as $k => $v) {
+    if (is_array($v)) {
+      $v = _uc_quote_rules_method_wrapper($v);
+    }
+    $obj->{$k} = $v;
+  }
+
+  return $obj;
+}
+
+/**
+ * Setter callback for uc_quote_method type
+ *
+ * @see entity_property_verbatim_set()
+ * @param $data
+ * @param $name
+ * @param $value
+ * @param $langcode
+ * @param $type
+ * @param $info
+ *
+ * @TODO: Check the source function to see if we can implement arrays structure
+ *        not only objects.
+ */
+function uc_quote_rules_verbatim_set(&$data, $name, $value, $langcode, $type, $info) {
+  $data->$name = $value;
+}
